Updates following publication of devel-handle APIs
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / primitive / primitive-visual.cpp
index f3c8125..449deb7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 // EXTERNAL INCLUDES
 #include <dali/integration-api/debug.h>
-#include <dali/public-api/common/stage.h>
+#include <dali/devel-api/common/stage.h>
 #include <dali/public-api/common/constants.h>
 #include <dali/devel-api/scripting/enum-helper.h>
 #include <dali/devel-api/scripting/scripting.h>
 
 // INTERNAL INCLUDES
-#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
+#include <dali-toolkit/public-api/visuals/visual-properties.h>
 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
 
@@ -45,33 +45,19 @@ namespace
 // shapes
 DALI_ENUM_TO_STRING_TABLE_BEGIN( SHAPE_TYPE )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, SPHERE )
-DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, CONICAL_FRUSTRUM )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, CONE )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, CYLINDER )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, CUBE )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, OCTAHEDRON )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, BEVELLED_CUBE )
+DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::PrimitiveVisual::Shape, CONICAL_FRUSTUM )
 DALI_ENUM_TO_STRING_TABLE_END( SHAPE_TYPE )
 
-//Property names
-const char * const PRIMITIVE_SHAPE( "shape" );
-const char * const SHAPE_COLOR( "mixColor" );
-const char * const SLICES( "slices" );
-const char * const STACKS( "stacks" );
-const char * const SCALE_TOP_RADIUS( "scaleTopRadius" );
-const char * const SCALE_BOTTOM_RADIUS( "scaleBottomRadius" );
-const char * const SCALE_HEIGHT( "scaleHeight" );
-const char * const SCALE_RADIUS( "scaleRadius" );
-const char * const SCALE_DIMENSIONS( "scaleDimensions" );
-const char * const BEVEL_PERCENTAGE( "bevelPercentage" );
-const char * const BEVEL_SMOOTHNESS( "bevelSmoothness" );
-const char * const LIGHT_POSITION_UNIFORM_NAME( "lightPosition" );
-
 //Primitive property defaults
 const int     DEFAULT_SLICES =              128; ///< For spheres and conics
 const int     DEFAULT_STACKS =              128; ///< For spheres and conics
-const float   DEFAULT_SCALE_TOP_RADIUS =    1.0; ///< For conical frustrums
-const float   DEFAULT_SCALE_BOTTOM_RADIUS = 1.5; ///< For cones and conical frustrums
+const float   DEFAULT_SCALE_TOP_RADIUS =    1.0; ///< For conical frustums
+const float   DEFAULT_SCALE_BOTTOM_RADIUS = 1.5; ///< For cones and conical frustums
 const float   DEFAULT_SCALE_HEIGHT =        3.0; ///< For all conics
 const float   DEFAULT_SCALE_RADIUS =        1.0; ///< For cylinders
 const float   DEFAULT_BEVEL_PERCENTAGE =    0.0; ///< For bevelled cubes
@@ -90,15 +76,14 @@ const float MAX_SMOOTHNESS =       1.0; ///< Maximum bevel smoothness for bevell
 //Specific shape labels.
 const char * const SPHERE_LABEL( "SPHERE" );
 const char * const CONE_LABEL( "CONE" );
-const char * const CONICAL_FRUSTRUM_LABEL( "CONICAL_FRUSTRUM" );
 const char * const CYLINDER_LABEL( "CYLINDER" );
 const char * const CUBE_LABEL( "CUBE" );
 const char * const OCTAHEDRON_LABEL( "OCTAHEDRON" );
 const char * const BEVELLED_CUBE_LABEL( "BEVELLED_CUBE" );
+const char * const CONICAL_FRUSTUM_LABEL( "CONICAL_FRUSTUM" );
 
 //Shader properties
 const char * const OBJECT_MATRIX_UNIFORM_NAME( "uObjectMatrix" );
-const char * const COLOR_UNIFORM_NAME( "mixColor" );
 const char * const OBJECT_DIMENSIONS_UNIFORM_NAME( "uObjectDimensions" );
 const char * const STAGE_OFFSET_UNIFORM_NAME( "uStageOffset" );
 
@@ -137,6 +122,7 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
     vec3 originFlipY =  vec3(origin.x, -origin.y, 0.0);
     vec3 anchorPointFlipY = vec3( anchorPoint.x, -anchorPoint.y, 0.0);
     vec3 offset = vec3( ( offset / uSize.xy ) * offsetSizeMode.xy + offset * (1.0-offsetSizeMode.xy), 0.0) * vec3(1.0,-1.0,1.0);\n
+
     return vec4( (aPosition + anchorPointFlipY)*scaleFactor + (offset + originFlipY)*uSize, 1.0 );\n
   }\n
 
@@ -146,18 +132,18 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
     vec4 vertexPosition = uObjectMatrix * normalisedVertexPosition;\n
     vertexPosition = uMvpMatrix * vertexPosition;\n
 
-    //Illumination in Model-View space - Transform attributes and uniforms\n
-    vec4 mvVertexPosition = uModelView * normalisedVertexPosition;\n
-    vec3 normal = uNormalMatrix * mat3( uObjectMatrix ) * aNormal;\n
+     //Illumination in Model-View space - Transform attributes and uniforms\n
+     vec4 mvVertexPosition = uModelView * normalisedVertexPosition;\n
+     vec3 normal = uNormalMatrix * mat3( uObjectMatrix ) * aNormal;\n
 
-    vec4 mvLightPosition = vec4( ( lightPosition.xy - uStageOffset ), lightPosition.z, 1.0 );\n
-    mvLightPosition = uViewMatrix * mvLightPosition;\n
-    vec3 vectorToLight = normalize( mvLightPosition.xyz - mvVertexPosition.xyz );\n
+     vec4 mvLightPosition = vec4( ( lightPosition.xy - uStageOffset ), lightPosition.z, 1.0 );\n
+     mvLightPosition = uViewMatrix * mvLightPosition;\n
+     vec3 vectorToLight = normalize( mvLightPosition.xyz - mvVertexPosition.xyz );\n
 
-    float lightDiffuse = max( dot( vectorToLight, normal ), 0.0 );\n
-    vIllumination = vec3( lightDiffuse * 0.5 + 0.5 );\n
+     float lightDiffuse = max( dot( vectorToLight, normal ), 0.0 );\n
+     vIllumination = vec3( lightDiffuse * 0.5 + 0.5 );\n
 
-    gl_Position = vertexPosition;\n
+     gl_Position = vertexPosition;\n
   }\n
 );
 
@@ -166,25 +152,25 @@ const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
   precision mediump float;\n
   varying   mediump vec3  vIllumination;\n
   uniform   lowp    vec4  uColor;\n
-  uniform   lowp    vec4  mixColor;\n
-
+  uniform   lowp    vec3  mixColor;\n
   void main()\n
   {\n
-    vec4 baseColor = mixColor * uColor;\n
+      vec4 baseColor = vec4(mixColor, 1.0) * uColor;\n
     gl_FragColor = vec4( vIllumination.rgb * baseColor.rgb, baseColor.a );\n
   }\n
 );
 
 } // unnamed namespace
 
-PrimitiveVisualPtr PrimitiveVisual::New( VisualFactoryCache& factoryCache )
+PrimitiveVisualPtr PrimitiveVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties )
 {
-  return new PrimitiveVisual( factoryCache );
+  PrimitiveVisualPtr primitiveVisualPtr( new PrimitiveVisual( factoryCache ) );
+  primitiveVisualPtr->SetProperties( properties );
+  return primitiveVisualPtr;
 }
 
 PrimitiveVisual::PrimitiveVisual( VisualFactoryCache& factoryCache )
-: Visual::Base( factoryCache ),
-  mColor( DEFAULT_COLOR ),
+: Visual::Base( factoryCache, Visual::FittingMode::FIT_KEEP_ASPECT_RATIO, Toolkit::Visual::PRIMITIVE ),
   mScaleDimensions( Vector3::ONE ),
   mScaleTopRadius( DEFAULT_SCALE_TOP_RADIUS ),
   mScaleBottomRadius( DEFAULT_SCALE_BOTTOM_RADIUS ),
@@ -196,6 +182,7 @@ PrimitiveVisual::PrimitiveVisual( VisualFactoryCache& factoryCache )
   mStacks( DEFAULT_STACKS ),
   mPrimitiveType( Toolkit::PrimitiveVisual::Shape::SPHERE )
 {
+  mImpl->mMixColor = DEFAULT_COLOR;
 }
 
 PrimitiveVisual::~PrimitiveVisual()
@@ -215,12 +202,25 @@ void PrimitiveVisual::DoSetProperties( const Property::Map& propertyMap )
     DALI_LOG_ERROR( "Fail to provide shape to the PrimitiveVisual object.\n" );
   }
 
-  //Read in other potential properties.
-
-  Property::Value* color = propertyMap.Find( Toolkit::PrimitiveVisual::Property::MIX_COLOR, SHAPE_COLOR );
-  if( color && !color->Get( mColor ) )
+  // By virtue of DoSetProperties being called last, this will override
+  // anything set by Toolkit::Visual::Property::MIX_COLOR
+  Property::Value* colorValue = propertyMap.Find( Toolkit::PrimitiveVisual::Property::MIX_COLOR, MIX_COLOR );
+  if( colorValue )
   {
-    DALI_LOG_ERROR( "Invalid type for color in PrimitiveVisual.\n" );
+    Vector4 color;
+    if( colorValue->Get( color ) )
+    {
+      Property::Type type = colorValue->GetType();
+      if( type == Property::VECTOR4 )
+      {
+        SetMixColor( color );
+      }
+      else if( type == Property::VECTOR3 )
+      {
+        Vector3 color3(color);
+        SetMixColor( color3 );
+      }
+    }
   }
 
   Property::Value* slices = propertyMap.Find( Toolkit::PrimitiveVisual::Property::SLICES, SLICES );
@@ -389,23 +389,31 @@ void PrimitiveVisual::DoSetProperties( const Property::Map& propertyMap )
 
 void PrimitiveVisual::GetNaturalSize( Vector2& naturalSize )
 {
+  if( !mGeometry )
+  {
+    CreateGeometry();
+  }
+
   naturalSize.x = mObjectDimensions.x;
   naturalSize.y = mObjectDimensions.y;
 }
 
-void PrimitiveVisual::DoSetOnStage( Actor& actor )
+void PrimitiveVisual::DoSetOnScene( Actor& actor )
 {
   InitializeRenderer();
 
   actor.AddRenderer( mImpl->mRenderer );
+
+  // Primitive generated and ready to display
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void PrimitiveVisual::DoCreatePropertyMap( Property::Map& map ) const
 {
   map.Clear();
-  map.Insert( Toolkit::DevelVisual::Property::TYPE, Toolkit::Visual::PRIMITIVE );
+  map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::PRIMITIVE );
+  map.Insert( Toolkit::PrimitiveVisual::Property::MIX_COLOR, mImpl->mMixColor );
   map.Insert( Toolkit::PrimitiveVisual::Property::SHAPE, mPrimitiveType );
-  map.Insert( Toolkit::PrimitiveVisual::Property::MIX_COLOR, mColor );
   map.Insert( Toolkit::PrimitiveVisual::Property::SLICES, mSlices );
   map.Insert( Toolkit::PrimitiveVisual::Property::STACKS, mStacks );
   map.Insert( Toolkit::PrimitiveVisual::Property::SCALE_TOP_RADIUS, mScaleTopRadius );
@@ -418,6 +426,11 @@ void PrimitiveVisual::DoCreatePropertyMap( Property::Map& map ) const
   map.Insert( Toolkit::PrimitiveVisual::Property::LIGHT_POSITION, mLightPosition );
 }
 
+void PrimitiveVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
+{
+  // Do nothing
+}
+
 void PrimitiveVisual::OnSetTransform()
 {
   if( mImpl->mRenderer )
@@ -441,8 +454,10 @@ void PrimitiveVisual::InitializeRenderer()
   mImpl->mRenderer = Renderer::New( mGeometry, mShader );
   mImpl->mRenderer.SetProperty( Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::BACK );
 
-  //Register transform properties
+  // Register transform properties
   mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
+
+  mImpl->mMixColorIndex = mImpl->mRenderer.RegisterProperty( Toolkit::PrimitiveVisual::Property::MIX_COLOR, MIX_COLOR, Vector3(mImpl->mMixColor) );
 }
 
 void PrimitiveVisual::UpdateShaderUniforms()
@@ -458,7 +473,6 @@ void PrimitiveVisual::UpdateShaderUniforms()
   mShader.RegisterProperty( STAGE_OFFSET_UNIFORM_NAME, Vector2( width, height ) / 2.0f );
   mShader.RegisterProperty( LIGHT_POSITION_UNIFORM_NAME, mLightPosition );
   mShader.RegisterProperty( OBJECT_MATRIX_UNIFORM_NAME, scaleMatrix );
-  mShader.RegisterProperty( Toolkit::PrimitiveVisual::Property::MIX_COLOR, COLOR_UNIFORM_NAME, mColor );
   mShader.RegisterProperty( OBJECT_DIMENSIONS_UNIFORM_NAME, mObjectDimensions );
 }
 
@@ -486,11 +500,6 @@ void PrimitiveVisual::CreateGeometry()
       CreateConic( vertices, indices, 0, mScaleBottomRadius, mScaleHeight, mSlices );
       break;
     }
-    case Toolkit::PrimitiveVisual::Shape::CONICAL_FRUSTRUM:
-    {
-      CreateConic( vertices, indices, mScaleTopRadius, mScaleBottomRadius, mScaleHeight, mSlices );
-      break;
-    }
     case Toolkit::PrimitiveVisual::Shape::CYLINDER:
     {
       //Create a conic with equal radii on the top and bottom.
@@ -514,6 +523,11 @@ void PrimitiveVisual::CreateGeometry()
       CreateBevelledCube( vertices, indices, mScaleDimensions, mBevelPercentage, mBevelSmoothness );
       break;
     }
+    case Toolkit::PrimitiveVisual::Shape::CONICAL_FRUSTUM:
+    {
+      CreateConic( vertices, indices, mScaleTopRadius, mScaleBottomRadius, mScaleHeight, mSlices );
+      break;
+    }
   }
 
   mGeometry = Geometry::New();
@@ -540,7 +554,7 @@ void PrimitiveVisual::CreateSphere( Vector<Vertex>& vertices, Vector<unsigned sh
 }
 
 void PrimitiveVisual::CreateConic( Vector<Vertex>& vertices, Vector<unsigned short>& indices, float scaleTopRadius,
-                                     float scaleBottomRadius, float scaleHeight, int slices )
+                                   float scaleBottomRadius, float scaleHeight, int slices )
 {
   ComputeConicVertices( vertices, scaleTopRadius, scaleBottomRadius, scaleHeight, slices );
   FormConicTriangles( indices, scaleTopRadius, scaleBottomRadius, slices );
@@ -555,7 +569,7 @@ void PrimitiveVisual::CreateConic( Vector<Vertex>& vertices, Vector<unsigned sho
 }
 
 void PrimitiveVisual::CreateBevelledCube( Vector<Vertex>& vertices, Vector<unsigned short>& indices,
-                                            Vector3 dimensions, float bevelPercentage, float bevelSmoothness )
+                                          Vector3 dimensions, float bevelPercentage, float bevelSmoothness )
 {
   float maxDimension = std::max( std::max( dimensions.x, dimensions.y ), dimensions.z );
   dimensions = dimensions / maxDimension;
@@ -580,7 +594,7 @@ void PrimitiveVisual::CreateBevelledCube( Vector<Vertex>& vertices, Vector<unsig
 }
 
 void PrimitiveVisual::ComputeCircleTables( Vector<float>& sinTable, Vector<float>& cosTable, int divisions,
-                                             bool halfCircle )
+                                           bool halfCircle )
 {
   if( divisions < 0 )
   {
@@ -721,7 +735,7 @@ void PrimitiveVisual::FormSphereTriangles( Vector<unsigned short>& indices, int
 }
 
 void PrimitiveVisual::ComputeConicVertices( Vector<Vertex>& vertices, float scaleTopRadius,
-                                                     float scaleBottomRadius, float scaleHeight, int slices )
+                                            float scaleBottomRadius, float scaleHeight, int slices )
 {
   int vertexIndex = 0;  //Track progress through vertices.
   Vector<float> sinTable;
@@ -808,7 +822,7 @@ void PrimitiveVisual::ComputeConicVertices( Vector<Vertex>& vertices, float scal
 }
 
 void PrimitiveVisual::FormConicTriangles( Vector<unsigned short>& indices, float scaleTopRadius,
-                                                   float scaleBottomRadius, int slices )
+                                          float scaleBottomRadius, int slices )
 {
   int  indiceIndex = 0;  //Track progress through indices.
   int  numTriangles = 0;
@@ -1159,7 +1173,7 @@ void PrimitiveVisual::FormOctahedronTriangles( Vector<unsigned short>& indices )
 }
 
 void PrimitiveVisual::ComputeBevelledCubeVertices( Vector<Vertex>& vertices, Vector3 dimensions,
-                                                     float bevelPercentage, float bevelSmoothness )
+                                                   float bevelPercentage, float bevelSmoothness )
 {
   int numPositions = 24;
   int numFaces = 26;