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=d694235dfc6160bda9e52620f9e92e8c3e5e258c;hp=71bb5388d96b423f7224eea201e323d9d318dadc;hb=fa2cf9a483feaf77e4053f6b31a3046db8627269;hpb=d402b997c5874a73bfec576eff290af235c1c03d diff --git a/dali-toolkit/internal/visuals/arc/arc-visual.cpp b/dali-toolkit/internal/visuals/arc/arc-visual.cpp index 71bb538..d694235 100644 --- a/dali-toolkit/internal/visuals/arc/arc-visual.cpp +++ b/dali-toolkit/internal/visuals/arc/arc-visual.cpp @@ -47,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"; } @@ -233,7 +234,7 @@ void ArcVisual::DoSetProperties( const Property::Map& propertyMap ) } } -void ArcVisual::DoSetOnStage( Actor& actor ) +void ArcVisual::DoSetOnScene( Actor& actor ) { InitializeRenderer(); @@ -243,13 +244,46 @@ void ArcVisual::DoSetOnStage( Actor& actor ) ResourceReady( Toolkit::Visual::ResourceStatus::READY ); } +void ArcVisual::DoSetOffScene(Actor& actor) +{ + if(mImpl->mRenderer) + { + // Update values from Renderer + mThickness = mImpl->mRenderer.GetProperty(mThicknessIndex); + mStartAngle = mImpl->mRenderer.GetProperty(mStartAngleIndex); + mSweepAngle = mImpl->mRenderer.GetProperty(mSweepAngleIndex); + } + + actor.RemoveRenderer(mImpl->mRenderer); + mImpl->mRenderer.Reset(); + + mThicknessIndex = Property::INVALID_INDEX; + mStartAngleIndex = Property::INVALID_INDEX; + mSweepAngleIndex = Property::INVALID_INDEX; +} + void ArcVisual::DoCreatePropertyMap( Property::Map& map ) const { + float thickness, startAngle, sweepAngle; + if(mImpl->mRenderer) + { + // Update values from Renderer + thickness = mImpl->mRenderer.GetProperty(mThicknessIndex); + startAngle = mImpl->mRenderer.GetProperty(mStartAngleIndex); + sweepAngle = mImpl->mRenderer.GetProperty(mSweepAngleIndex); + } + else + { + thickness = mThickness; + startAngle = mStartAngle; + sweepAngle = mSweepAngle; + } + map.Clear(); map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::ARC ); - map.Insert( Toolkit::DevelArcVisual::Property::THICKNESS, mThickness ); - map.Insert( Toolkit::DevelArcVisual::Property::START_ANGLE, mStartAngle ); - map.Insert( Toolkit::DevelArcVisual::Property::SWEEP_ANGLE, mSweepAngle ); + map.Insert(Toolkit::DevelArcVisual::Property::THICKNESS, thickness); + map.Insert(Toolkit::DevelArcVisual::Property::START_ANGLE, startAngle); + map.Insert(Toolkit::DevelArcVisual::Property::SWEEP_ANGLE, sweepAngle); map.Insert( Toolkit::DevelArcVisual::Property::CAP, mCapType ); } @@ -276,7 +310,7 @@ void ArcVisual::OnDoAction( const Property::Index actionId, const Property::Valu { case DevelArcVisual::Action::UPDATE_PROPERTY: { - Property::Map* map = attributes.GetMap(); + const Property::Map* map = attributes.GetMap(); if( map ) { DoSetProperties( *map ); @@ -296,7 +330,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 ); } } @@ -305,16 +339,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 ); - mThicknessIndex = mImpl->mRenderer.RegisterProperty( THICKNESS_NAME, mThickness ); - mStartAngleIndex = mImpl->mRenderer.RegisterProperty( START_ANGLE_NAME, mStartAngle ); - mSweepAngleIndex = mImpl->mRenderer.RegisterProperty( SWEEP_ANGLE_NAME, mSweepAngle ); + mThicknessIndex = mImpl->mRenderer.RegisterProperty(DevelArcVisual::Property::THICKNESS, THICKNESS_NAME, mThickness); + mStartAngleIndex = mImpl->mRenderer.RegisterProperty(DevelArcVisual::Property::START_ANGLE, START_ANGLE_NAME, mStartAngle); + mSweepAngleIndex = mImpl->mRenderer.RegisterProperty(DevelArcVisual::Property::SWEEP_ANGLE, SWEEP_ANGLE_NAME, mSweepAngle); mRadiusIndex = mImpl->mRenderer.RegisterProperty( RADIUS_NAME, mRadius );