X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Farc%2Farc-visual.cpp;h=71e2383bb2661ea559c79bd2ee08f402089f8747;hp=a1eb02a26479869c2be1405600e45f81938e5086;hb=b86fa7f2bedebe580b0e9a20f9b42cf2d628fafa;hpb=d9d91f29650b038915c668a8433a65b01e9d0f2a diff --git a/dali-toolkit/internal/visuals/arc/arc-visual.cpp b/dali-toolkit/internal/visuals/arc/arc-visual.cpp index a1eb02a..71e2383 100644 --- a/dali-toolkit/internal/visuals/arc/arc-visual.cpp +++ b/dali-toolkit/internal/visuals/arc/arc-visual.cpp @@ -23,6 +23,7 @@ //INTERNAL INCLUDES #include +#include #include #include #include @@ -46,102 +47,103 @@ DALI_ENUM_TO_STRING_WITH_SCOPE( DevelArcVisual::Cap, BUTT ) DALI_ENUM_TO_STRING_WITH_SCOPE( DevelArcVisual::Cap, ROUND ) DALI_ENUM_TO_STRING_TABLE_END( CAP ) -const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( - attribute mediump vec2 aPosition;\n - uniform highp mat4 uMvpMatrix;\n - uniform mediump vec3 uSize;\n - \n - varying mediump vec2 vPosition;\n - \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 - vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n - vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n - vPosition = aPosition* visualSize;\n - return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n - }\n - - void main()\n - {\n - gl_Position = uMvpMatrix * ComputeVertexPosition();\n - }\n -); - -const char* FRAGMENT_SHADER_BUTT_CAP = DALI_COMPOSE_SHADER( - varying mediump vec2 vPosition;\n - uniform lowp vec4 uColor;\n - uniform lowp vec3 mixColor;\n - uniform mediump float thickness;\n - uniform mediump float radius;\n - uniform mediump float startAngle;\n - uniform mediump float sweepAngle;\n - \n - const mediump float M_PI_OVER_2 = 1.57079632679;\n - const mediump float M_PI = 3.14159265359;\n - const mediump float M_PI_2 = 6.28318530718;\n - \n - mediump float GetOpacity()\n - {\n - mediump float start = radians( mod( startAngle, 360.0 ) );\n - mediump float angle = mod( atan( vPosition.y, vPosition.x ) + M_PI_OVER_2 - start, M_PI_2 );\n - mediump float dist = length( vPosition );\n - if( angle <= radians( sweepAngle ) )\n - {\n - return smoothstep( -1.0, 1.0, thickness / 2.0 - ( abs( dist - radius ) ) );\n - }\n - mediump float end = radians( mod( startAngle + sweepAngle, 360.0 ) );\n - mediump vec2 q0 = vec2( dist * cos( start - M_PI_OVER_2 ), dist * sin( start - M_PI_OVER_2 ) );\n - mediump vec2 q1 = vec2( dist * cos( end - M_PI_OVER_2 ), dist * sin( end - M_PI_OVER_2 ) );\n - mediump float opacity = 1.0 - smoothstep( 0.0, 2.0, min( length( vPosition - q0 ), length( vPosition - q1 ) ) );\n - opacity *= step( 0.0, thickness / 2.0 - abs( dist - radius ) );\n - return opacity;\n - }\n - void main()\n - {\n - gl_FragColor = vec4( mixColor, 1.0 ) * uColor;\n - gl_FragColor.a *= GetOpacity();\n - }\n -); - -const char* FRAGMENT_SHADER_ROUND_CAP = DALI_COMPOSE_SHADER( - varying mediump vec2 vPosition;\n - uniform lowp vec4 uColor;\n - uniform lowp vec3 mixColor;\n - uniform mediump float thickness;\n - uniform mediump float radius;\n - uniform mediump float startAngle;\n - uniform mediump float sweepAngle;\n - \n - const mediump float M_PI_OVER_2 = 1.57079632679;\n - const mediump float M_PI_2 = 6.28318530718;\n - \n - mediump float GetOpacity()\n - {\n - mediump float start = radians( mod( startAngle, 360.0 ) );\n - mediump float angle = mod( atan( vPosition.y, vPosition.x ) + M_PI_OVER_2 - start, M_PI_2 );\n - mediump float dist = length( vPosition );\n - if( angle <= radians( sweepAngle ) )\n - {\n - return smoothstep( -1.0, 1.0, thickness / 2.0 - ( abs( dist - radius ) ) );\n - }\n - mediump float end = radians( mod( startAngle + sweepAngle, 360.0 ) );\n - mediump vec2 q0 = vec2( radius * cos( start - M_PI_OVER_2 ), radius * sin( start - M_PI_OVER_2 ) );\n - mediump vec2 q1 = vec2( radius * cos( end - M_PI_OVER_2 ), radius * sin( end - M_PI_OVER_2 ) );\n - return smoothstep( -1.0, 1.0, thickness / 2.0 - min( length( vPosition - q0 ), length( vPosition - q1 ) ) );\n - }\n - void main()\n - {\n - gl_FragColor = vec4( mixColor, 1.0 ) * uColor;\n - gl_FragColor.a *= GetOpacity();\n - }\n -); +const char* VERTEX_SHADER = + "INPUT mediump vec2 aPosition;\n" + "OUTPUT mediump vec2 vPosition;\n" + + "uniform highp mat4 uMvpMatrix;\n" + "uniform highp vec3 uSize;\n" + + "//Visual size and offset\n" + "uniform mediump vec2 offset;\n" + "uniform highp vec2 size;\n" + "uniform mediump vec4 offsetSizeMode;\n" + "uniform mediump vec2 origin;\n" + "uniform mediump vec2 anchorPoint;\n" + + "vec4 ComputeVertexPosition()\n" + "{\n" + " vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n" + " vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n" + " vPosition = aPosition* visualSize;\n" + " return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n" + "}\n" + + "void main()\n" + "{\n" + " gl_Position = uMvpMatrix * ComputeVertexPosition();\n" + "}\n"; + +const char* FRAGMENT_SHADER_BUTT_CAP = + "INPUT mediump vec2 vPosition;\n" + + "uniform lowp vec4 uColor;\n" + "uniform lowp vec3 mixColor;\n" + "uniform mediump float thickness;\n" + "uniform mediump float radius;\n" + "uniform mediump float startAngle;\n" + "uniform mediump float sweepAngle;\n" + + "const mediump float M_PI_OVER_2 = 1.57079632679;\n" + "const mediump float M_PI = 3.14159265359;\n" + "const mediump float M_PI_2 = 6.28318530718;\n" + + "mediump float GetOpacity()\n" + "{\n" + " mediump float start = radians( mod( startAngle, 360.0 ) );\n" + " mediump float angle = mod( atan( vPosition.y, vPosition.x ) + M_PI_OVER_2 - start, M_PI_2 );\n" + " mediump float dist = length( vPosition );\n" + " if( angle <= radians( sweepAngle ) )\n" + " {\n" + " return smoothstep( -1.0, 1.0, thickness / 2.0 - ( abs( dist - radius ) ) );\n" + " }\n" + " mediump float end = radians( mod( startAngle + sweepAngle, 360.0 ) );\n" + " mediump vec2 q0 = vec2( dist * cos( start - M_PI_OVER_2 ), dist * sin( start - M_PI_OVER_2 ) );\n" + " mediump vec2 q1 = vec2( dist * cos( end - M_PI_OVER_2 ), dist * sin( end - M_PI_OVER_2 ) );\n" + " mediump float opacity = 1.0 - smoothstep( 0.0, 2.0, min( length( vPosition - q0 ), length( vPosition - q1 ) ) );\n" + " opacity *= step( 0.0, thickness / 2.0 - abs( dist - radius ) );\n" + " return opacity;\n" + "}\n" + + "void main()\n" + "{\n" + " OUT_COLOR = vec4( mixColor, 1.0 ) * uColor;\n" + " OUT_COLOR.a *= GetOpacity();\n" + "}\n"; + +const char* FRAGMENT_SHADER_ROUND_CAP = + "INPUT mediump vec2 vPosition;\n" + + "uniform lowp vec4 uColor;\n" + "uniform lowp vec3 mixColor;\n" + "uniform mediump float thickness;\n" + "uniform mediump float radius;\n" + "uniform mediump float startAngle;\n" + "uniform mediump float sweepAngle;\n" + + "const mediump float M_PI_OVER_2 = 1.57079632679;\n" + "const mediump float M_PI_2 = 6.28318530718;\n" + + "mediump float GetOpacity()\n" + "{\n" + " mediump float start = radians( mod( startAngle, 360.0 ) );\n" + " mediump float angle = mod( atan( vPosition.y, vPosition.x ) + M_PI_OVER_2 - start, M_PI_2 );\n" + " mediump float dist = length( vPosition );\n" + " if( angle <= radians( sweepAngle ) )\n" + " {\n" + " return smoothstep( -1.0, 1.0, thickness / 2.0 - ( abs( dist - radius ) ) );\n" + " }\n" + " mediump float end = radians( mod( startAngle + sweepAngle, 360.0 ) );\n" + " mediump vec2 q0 = vec2( radius * cos( start - M_PI_OVER_2 ), radius * sin( start - M_PI_OVER_2 ) );\n" + " mediump vec2 q1 = vec2( radius * cos( end - M_PI_OVER_2 ), radius * sin( end - M_PI_OVER_2 ) );\n" + " return smoothstep( -1.0, 1.0, thickness / 2.0 - min( length( vPosition - q0 ), length( vPosition - q1 ) ) );\n" + "}\n" + + "void main()\n" + "{\n" + " OUT_COLOR = vec4( mixColor, 1.0 ) * uColor;\n" + " OUT_COLOR.a *= GetOpacity();\n" + "}\n"; } @@ -153,12 +155,15 @@ ArcVisualPtr ArcVisual::New( VisualFactoryCache& factoryCache, const Property::M } ArcVisual::ArcVisual( VisualFactoryCache& factoryCache ) -: Visual::Base( factoryCache, Visual::FittingMode::FILL ), +: Visual::Base( factoryCache, Visual::FittingMode::FILL, static_cast( Toolkit::DevelVisual::ARC ) ), mThickness( 0.0f ), mRadius( 0.0f ), mStartAngle( 0.0f ), mSweepAngle( 360.0f ), mRadiusIndex( Property::INVALID_INDEX ), + mThicknessIndex( Property::INVALID_INDEX ), + mStartAngleIndex( Property::INVALID_INDEX ), + mSweepAngleIndex( Property::INVALID_INDEX ), mCapType( DevelArcVisual::Cap::BUTT ) { } @@ -176,6 +181,16 @@ void ArcVisual::DoSetProperties( const Property::Map& propertyMap ) { DALI_LOG_ERROR( "ArcVisual:DoSetProperties:: THICKNESS property has incorrect type: %d\n", thicknessValue->GetType() ); } + else + { + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( mThicknessIndex, mThickness ); + + // Need to calculate radius again + OnSetTransform(); + } + } } Property::Value* startAngleValue = propertyMap.Find( Toolkit::DevelArcVisual::Property::START_ANGLE, START_ANGLE_NAME ); @@ -185,6 +200,13 @@ void ArcVisual::DoSetProperties( const Property::Map& propertyMap ) { DALI_LOG_ERROR( "ArcVisual:DoSetProperties:: START_ANGLE property has incorrect type: %d\n", startAngleValue->GetType() ); } + else + { + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( mStartAngleIndex, mStartAngle ); + } + } } Property::Value* sweepAngleValue = propertyMap.Find( Toolkit::DevelArcVisual::Property::SWEEP_ANGLE, SWEEP_ANGLE_NAME ); @@ -194,6 +216,13 @@ void ArcVisual::DoSetProperties( const Property::Map& propertyMap ) { DALI_LOG_ERROR( "ArcVisual:DoSetProperties:: SWEEP_ANGLE property has incorrect type: %d\n", sweepAngleValue->GetType() ); } + else + { + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( mSweepAngleIndex, mSweepAngle ); + } + } } Property::Value* capValue = propertyMap.Find( Toolkit::DevelArcVisual::Property::CAP, CAP_NAME ); @@ -205,7 +234,7 @@ void ArcVisual::DoSetProperties( const Property::Map& propertyMap ) } } -void ArcVisual::DoSetOnStage( Actor& actor ) +void ArcVisual::DoSetOnScene( Actor& actor ) { InitializeRenderer(); @@ -241,6 +270,23 @@ void ArcVisual::OnSetTransform() } } +void ArcVisual::OnDoAction( const Property::Index actionId, const Property::Value& attributes ) +{ + // Check if action is valid for this visual type and perform action if possible + switch( actionId ) + { + case DevelArcVisual::Action::UPDATE_PROPERTY: + { + const Property::Map* map = attributes.GetMap(); + if( map ) + { + DoSetProperties( *map ); + } + break; + } + } +} + void ArcVisual::InitializeRenderer() { Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); @@ -251,7 +297,7 @@ void ArcVisual::InitializeRenderer() shader = mFactoryCache.GetShader( VisualFactoryCache::ARC_BUTT_CAP_SHADER ); if( !shader ) { - shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_BUTT_CAP ); + shader = Shader::New( Dali::Shader::GetVertexShaderPrefix() + VERTEX_SHADER, Dali::Shader::GetFragmentShaderPrefix() + FRAGMENT_SHADER_BUTT_CAP ); mFactoryCache.SaveShader( VisualFactoryCache::ARC_BUTT_CAP_SHADER, shader ); } } @@ -260,17 +306,16 @@ void ArcVisual::InitializeRenderer() shader = mFactoryCache.GetShader( VisualFactoryCache::ARC_ROUND_CAP_SHADER ); if( !shader ) { - shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ROUND_CAP ); + shader = Shader::New( Dali::Shader::GetVertexShaderPrefix() + VERTEX_SHADER, Dali::Shader::GetFragmentShaderPrefix() + FRAGMENT_SHADER_ROUND_CAP ); mFactoryCache.SaveShader( VisualFactoryCache::ARC_ROUND_CAP_SHADER, shader ); } } mImpl->mRenderer = Renderer::New( geometry, shader ); - mImpl->mRenderer.RegisterProperty( THICKNESS_NAME, mThickness ); - mImpl->mRenderer.RegisterProperty( START_ANGLE_NAME, mStartAngle ); - mImpl->mRenderer.RegisterProperty( SWEEP_ANGLE_NAME, mSweepAngle ); - mImpl->mRenderer.RegisterProperty( CAP_NAME, 0.0f ); + mThicknessIndex = mImpl->mRenderer.RegisterProperty( THICKNESS_NAME, mThickness ); + mStartAngleIndex = mImpl->mRenderer.RegisterProperty( START_ANGLE_NAME, mStartAngle ); + mSweepAngleIndex = mImpl->mRenderer.RegisterProperty( SWEEP_ANGLE_NAME, mSweepAngle ); mRadiusIndex = mImpl->mRenderer.RegisterProperty( RADIUS_NAME, mRadius );