X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fprimitive%2Fprimitive-visual.cpp;h=43c69cc759668fd87a6de557aae9b775aacb79c2;hp=6a02087cd7ed3b60dba899fb5fff854cd7212fb5;hb=ce4bae9bcaabc3b38d016e7ef36cc55357087bc0;hpb=33d3f72e60fc62db3718791f906dc843f1edeeb3 diff --git a/dali-toolkit/internal/visuals/primitive/primitive-visual.cpp b/dali-toolkit/internal/visuals/primitive/primitive-visual.cpp index 6a02087..43c69cc 100644 --- a/dali-toolkit/internal/visuals/primitive/primitive-visual.cpp +++ b/dali-toolkit/internal/visuals/primitive/primitive-visual.cpp @@ -22,11 +22,14 @@ #include #include #include +#include #include #include // INTERNAL INCLUDES +#include #include +#include namespace Dali { @@ -53,7 +56,7 @@ DALI_ENUM_TO_STRING_TABLE_END( SHAPE_TYPE ) //Property names const char * const PRIMITIVE_SHAPE( "shape" ); -const char * const SHAPE_COLOR( "shapeColor" ); +const char * const SHAPE_COLOR( "mixColor" ); const char * const SLICES( "slices" ); const char * const STACKS( "stacks" ); const char * const SCALE_TOP_RADIUS( "scaleTopRadius" ); @@ -74,11 +77,11 @@ 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 const float DEFAULT_BEVEL_SMOOTHNESS = 0.0; ///< For bevelled cubes -const Vector4 DEFAULT_COLOR = Vector4( 0.5, 0.5, 0.5, 0.0 ); ///< Grey, for all. +const Vector4 DEFAULT_COLOR = Vector4( 0.5, 0.5, 0.5, 1.0 ); ///< Grey, for all. //Property limits -const int MIN_SLICES = 1; ///< Minimum number of slices for spheres and conics -const int MIN_STACKS = 1; ///< Minimum number of stacks for spheres and conics +const int MIN_SLICES = 3; ///< Minimum number of slices for spheres and conics +const int MIN_STACKS = 2; ///< Minimum number of stacks for spheres and conics const int MAX_PARTITIONS = 255; ///< Maximum number of slices or stacks for spheres and conics const float MIN_BEVEL_PERCENTAGE = 0.0; ///< Minimum bevel percentage for bevelled cubes const float MAX_BEVEL_PERCENTAGE = 1.0; ///< Maximum bevel percentage for bevelled cubes @@ -96,7 +99,7 @@ const char * const BEVELLED_CUBE_LABEL( "BEVELLED_CUBE" ); //Shader properties const char * const OBJECT_MATRIX_UNIFORM_NAME( "uObjectMatrix" ); -const char * const COLOR_UNIFORM_NAME( "uColor" ); +const char * const COLOR_UNIFORM_NAME( "mixColor" ); const char * const OBJECT_DIMENSIONS_UNIFORM_NAME( "uObjectDimensions" ); const char * const STAGE_OFFSET_UNIFORM_NAME( "uStageOffset" ); @@ -121,13 +124,26 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( uniform mediump vec3 lightPosition;\n uniform mediump vec2 uStageOffset;\n - void main()\n + //Visual size and offset + uniform mediump vec2 offset;\n + uniform mediump vec2 size;\n + uniform mediump vec4 offsetSizeMode;\n + uniform mediump vec2 origin;\n + uniform mediump vec2 anchorPoint;\n + + vec4 ComputeVertexPosition()\n {\n - float xRatio = uSize.x / uObjectDimensions.x;\n - float yRatio = uSize.y / uObjectDimensions.y;\n - float scaleFactor = min( xRatio, yRatio );\n + vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n + float scaleFactor = min( visualSize.x / uObjectDimensions.x, visualSize.y / uObjectDimensions.y );\n + 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 - vec4 normalisedVertexPosition = vec4( aPosition * scaleFactor, 1.0 );\n + void main()\n + {\n + vec4 normalisedVertexPosition = ComputeVertexPosition();\n vec4 vertexPosition = uObjectMatrix * normalisedVertexPosition;\n vertexPosition = uMvpMatrix * vertexPosition;\n @@ -151,14 +167,21 @@ 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 void main()\n {\n - gl_FragColor = vec4( vIllumination.rgb * uColor.rgb, uColor.a );\n + vec4 baseColor = mixColor * uColor;\n + gl_FragColor = vec4( vIllumination.rgb * baseColor.rgb, baseColor.a );\n }\n ); -} // namespace +} // unnamed namespace + +PrimitiveVisualPtr PrimitiveVisual::New( VisualFactoryCache& factoryCache ) +{ + return new PrimitiveVisual( factoryCache ); +} PrimitiveVisual::PrimitiveVisual( VisualFactoryCache& factoryCache ) : Visual::Base( factoryCache ), @@ -180,7 +203,7 @@ PrimitiveVisual::~PrimitiveVisual() { } -void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyMap ) +void PrimitiveVisual::DoSetProperties( const Property::Map& propertyMap ) { //Find out which shape to renderer. Property::Value* primitiveTypeValue = propertyMap.Find( Toolkit::PrimitiveVisual::Property::SHAPE, PRIMITIVE_SHAPE ); @@ -195,7 +218,7 @@ void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyM //Read in other potential properties. - Property::Value* color = propertyMap.Find( Toolkit::PrimitiveVisual::Property::COLOR, SHAPE_COLOR ); + Property::Value* color = propertyMap.Find( Toolkit::PrimitiveVisual::Property::MIX_COLOR, SHAPE_COLOR ); if( color && !color->Get( mColor ) ) { DALI_LOG_ERROR( "Invalid type for color in PrimitiveVisual.\n" ); @@ -210,10 +233,12 @@ void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyM if( mSlices > MAX_PARTITIONS ) { mSlices = MAX_PARTITIONS; + DALI_LOG_WARNING( "Value for slices clamped.\n" ); } else if ( mSlices < MIN_SLICES ) { mSlices = MIN_SLICES; + DALI_LOG_WARNING( "Value for slices clamped.\n" ); } } else @@ -231,10 +256,12 @@ void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyM if( mStacks > MAX_PARTITIONS ) { mStacks = MAX_PARTITIONS; + DALI_LOG_WARNING( "Value for stacks clamped.\n" ); } else if ( mStacks < MIN_STACKS ) { mStacks = MIN_STACKS; + DALI_LOG_WARNING( "Value for stacks clamped.\n" ); } } else @@ -276,14 +303,17 @@ void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyM if( mScaleDimensions.x <= 0.0 ) { mScaleDimensions.x = 1.0; + DALI_LOG_WARNING( "Value for scale dimensions clamped. Must be greater than zero.\n" ); } if( mScaleDimensions.y <= 0.0 ) { mScaleDimensions.y = 1.0; + DALI_LOG_WARNING( "Value for scale dimensions clamped. Must be greater than zero.\n" ); } if( mScaleDimensions.z <= 0.0 ) { mScaleDimensions.z = 1.0; + DALI_LOG_WARNING( "Value for scale dimensions clamped. Must be greater than zero.\n" ); } } else @@ -301,10 +331,12 @@ void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyM if( mBevelPercentage < MIN_BEVEL_PERCENTAGE ) { mBevelPercentage = MIN_BEVEL_PERCENTAGE; + DALI_LOG_WARNING( "Value for bevel percentage clamped.\n" ); } else if( mBevelPercentage > MAX_BEVEL_PERCENTAGE ) { mBevelPercentage = MAX_BEVEL_PERCENTAGE; + DALI_LOG_WARNING( "Value for bevel percentage clamped.\n" ); } } else @@ -322,10 +354,12 @@ void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyM if( mBevelSmoothness < MIN_SMOOTHNESS ) { mBevelSmoothness = MIN_SMOOTHNESS; + DALI_LOG_WARNING( "Value for bevel smoothness clamped.\n" ); } else if( mBevelSmoothness > MAX_SMOOTHNESS ) { mBevelSmoothness = MAX_SMOOTHNESS; + DALI_LOG_WARNING( "Value for bevel smoothness clamped.\n" ); } } else @@ -354,42 +388,25 @@ void PrimitiveVisual::DoInitialize( Actor& actor, const Property::Map& propertyM } } -void PrimitiveVisual::SetSize( const Vector2& size ) -{ - Visual::Base::SetSize( size ); - - // ToDo: renderer responds to the size change -} - -void PrimitiveVisual::GetNaturalSize( Vector2& naturalSize ) const +void PrimitiveVisual::GetNaturalSize( Vector2& naturalSize ) { naturalSize.x = mObjectDimensions.x; naturalSize.y = mObjectDimensions.y; } -void PrimitiveVisual::SetClipRect( const Rect& clipRect ) -{ - Visual::Base::SetClipRect( clipRect ); - - //ToDo: renderer responds to the clipRect change -} - -void PrimitiveVisual::SetOffset( const Vector2& offset ) -{ - //ToDo: renderer applies the offset -} - void PrimitiveVisual::DoSetOnStage( Actor& actor ) { InitializeRenderer(); + + actor.AddRenderer( mImpl->mRenderer ); } void PrimitiveVisual::DoCreatePropertyMap( Property::Map& map ) const { map.Clear(); - map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::PRIMITIVE ); + map.Insert( Toolkit::DevelVisual::Property::TYPE, Toolkit::Visual::PRIMITIVE ); map.Insert( Toolkit::PrimitiveVisual::Property::SHAPE, mPrimitiveType ); - map.Insert( Toolkit::PrimitiveVisual::Property::COLOR, mColor ); + 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 ); @@ -402,6 +419,14 @@ void PrimitiveVisual::DoCreatePropertyMap( Property::Map& map ) const map.Insert( Toolkit::PrimitiveVisual::Property::LIGHT_POSITION, mLightPosition ); } +void PrimitiveVisual::OnSetTransform() +{ + if( mImpl->mRenderer ) + { + mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT ); + } +} + void PrimitiveVisual::InitializeRenderer() { if( !mGeometry ) @@ -416,6 +441,9 @@ void PrimitiveVisual::InitializeRenderer() mImpl->mRenderer = Renderer::New( mGeometry, mShader ); mImpl->mRenderer.SetProperty( Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::BACK ); + + //Register transform properties + mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT ); } void PrimitiveVisual::UpdateShaderUniforms() @@ -431,7 +459,7 @@ 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::COLOR, COLOR_UNIFORM_NAME, mColor ); + DevelHandle::RegisterProperty( mShader, Toolkit::PrimitiveVisual::Property::MIX_COLOR, COLOR_UNIFORM_NAME, mColor ); mShader.RegisterProperty( OBJECT_DIMENSIONS_UNIFORM_NAME, mObjectDimensions ); } @@ -530,7 +558,8 @@ void PrimitiveVisual::CreateConic( Vector& vertices, Vector& vertices, Vector& indices, Vector3 dimensions, float bevelPercentage, float bevelSmoothness ) { - dimensions.Normalize(); + float maxDimension = std::max( std::max( dimensions.x, dimensions.y ), dimensions.z ); + dimensions = dimensions / maxDimension; if( bevelPercentage <= MIN_BEVEL_PERCENTAGE ) //No bevel, form a cube. { @@ -1141,16 +1170,17 @@ void PrimitiveVisual::ComputeBevelledCubeVertices( Vector& vertices, Vec int normalIndex = 0; //Track progress through normals, as vertices are calculated per face. float minDimension = std::min( std::min( dimensions.x, dimensions.y ), dimensions.z ); - float bevelScale = 1.0 - bevelPercentage; - float bevelAmount = 0.5 * bevelScale * minDimension; + float bevelAmount = 0.5 * std::min( bevelPercentage, minDimension ); //Cap bevel amount if necessary. + //Distances from centre to outer edge points. float outerX = 0.5 * dimensions.x; float outerY = 0.5 * dimensions.y; float outerZ = 0.5 * dimensions.z; - float bevelX = outerX - ( 0.5 * minDimension - bevelAmount ); - float bevelY = outerY - ( 0.5 * minDimension - bevelAmount ); - float bevelZ = outerZ - ( 0.5 * minDimension - bevelAmount ); + //Distances from centre to bevelled points. + float bevelX = outerX - bevelAmount; + float bevelY = outerY - bevelAmount; + float bevelZ = outerZ - bevelAmount; Vector positions; //Holds object points, to be shared between vertexes. positions.Resize( numPositions );