X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Frenderers%2Fgradient%2Fgradient-renderer.cpp;h=f9b4bcd9ffd3a2e28766a35eb8302d91ad81e819;hp=0e502dacfe6c98ca150e23db6b3bf75c1869cde2;hb=f3da11c2818c6d17706fbb2417f21b602b3190f5;hpb=4c1f4bfb9eb5b956b64a6c9bf077217fc0ca9234 diff --git a/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp b/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp index 0e502da..f9b4bcd 100644 --- a/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp +++ b/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp @@ -43,26 +43,26 @@ namespace Internal namespace { -const char * const RENDERER_TYPE("renderer-type"); -const char * const RENDERER_TYPE_VALUE("gradient-renderer"); +const char * const RENDERER_TYPE("rendererType"); +const char * const RENDERER_TYPE_VALUE("gradientRenderer"); // properties: linear gradient -const char * const GRADIENT_START_POSITION_NAME("gradient-start-position"); // Property::VECTOR2 -const char * const GRADIENT_END_POSITION_NAME("gradient-end-position"); // Property::VECTOR2 +const char * const GRADIENT_START_POSITION_NAME("gradientStartPosition"); // Property::VECTOR2 +const char * const GRADIENT_END_POSITION_NAME("gradientEndPosition"); // Property::VECTOR2 // properties: radial gradient -const char * const GRADIENT_CENTER_NAME("gradient-center"); // Property::VECTOR2 -const char * const GRADIENT_RADIUS_NAME("gradient-radius"); // Property::FLOAT +const char * const GRADIENT_CENTER_NAME("gradientCenter"); // Property::VECTOR2 +const char * const GRADIENT_RADIUS_NAME("gradientRadius"); // Property::FLOAT // properties: linear&radial gradient -const char * const GRADIENT_STOP_OFFSET_NAME("gradient-stop-offset"); // Property::Array FLOAT -const char * const GRADIENT_STOP_COLOR_NAME("gradient-stop-color"); // Property::Array VECTOR4 -const char * const GRADIENT_UNITS_NAME("gradient-units"); // Property::String "userSpaceOnUse | objectBoundingBox" -const char * const GRADIENT_SPREAD_METHOD_NAME("gradient-spread-method"); // Property::String "pad | reflect | repeat" +const char * const GRADIENT_STOP_OFFSET_NAME("gradientStopOffset"); // Property::Array FLOAT +const char * const GRADIENT_STOP_COLOR_NAME("gradientStopColor"); // Property::Array VECTOR4 +const char * const GRADIENT_UNITS_NAME("gradientUnits"); // Property::String "userSpaceOnUse | objectBoundingBox" +const char * const GRADIENT_SPREAD_METHOD_NAME("gradientSpreadMethod"); // Property::String "pad | reflect | repeat" // string values -const char * const UNIT_USER_SPACE("user-space"); -const char * const UNIT_BOUNDING_BOX("object-bounding-box"); +const char * const UNIT_USER_SPACE("userSpace"); +const char * const UNIT_BOUNDING_BOX("objectBoundingBox"); const char * const SPREAD_PAD("pad"); const char * const SPREAD_REFLECT("reflect"); const char * const SPREAD_REPEAT("repeat"); @@ -71,8 +71,28 @@ const char * const SPREAD_REPEAT("repeat"); const char * const UNIFORM_ALIGNMENT_MATRIX_NAME( "uAlignmentMatrix" ); const char * const UNIFORM_TEXTULRE_NAME("sTexture"); +RendererFactoryCache::ShaderType GetShaderType( GradientRenderer::Type type, Gradient::GradientUnits units) +{ + if( type==GradientRenderer::LINEAR ) + { + if( units == Gradient::USER_SPACE_ON_USE ) + { + return RendererFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE; + } + return RendererFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX; + } + else if( units == Gradient::USER_SPACE_ON_USE ) + { + return RendererFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE; + } + + return RendererFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX; +} -const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( +const char* VERTEX_SHADER[] = +{ +// vertex shader for gradient units as USER_SPACE_ON_USE +DALI_COMPOSE_SHADER( attribute mediump vec2 aPosition;\n uniform mediump mat4 uMvpMatrix;\n uniform mediump vec3 uSize;\n @@ -87,9 +107,31 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( \n vTexCoord = (uAlignmentMatrix*vertexPosition.xyw).xy;\n }\n -); +), + +// vertex shader for gradient units as OBJECT_BOUNDING_BOX + DALI_COMPOSE_SHADER( + attribute mediump vec2 aPosition;\n + uniform mediump mat4 uMvpMatrix;\n + uniform mediump vec3 uSize;\n + uniform mediump mat3 uAlignmentMatrix;\n + varying mediump vec2 vTexCoord;\n + \n + void main()\n + {\n + mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n + vTexCoord = (uAlignmentMatrix*vertexPosition.xyw).xy;\n + \n + vertexPosition.xyz *= uSize;\n + gl_Position = uMvpMatrix * vertexPosition;\n + }\n +) +}; -const char* FRAGMENT_SHADER_LINEAR = DALI_COMPOSE_SHADER( +const char* FRAGMENT_SHADER[] = +{ +// fragment shader for linear gradient +DALI_COMPOSE_SHADER( uniform sampler2D sTexture;\n // sampler1D? uniform lowp vec4 uColor;\n varying mediump vec2 vTexCoord;\n @@ -98,9 +140,10 @@ const char* FRAGMENT_SHADER_LINEAR = DALI_COMPOSE_SHADER( {\n gl_FragColor = texture2D( sTexture, vec2( vTexCoord.y, 0.5 ) ) * uColor;\n }\n -); +), -const char* FRAGMENT_SHADER_RADIAL = DALI_COMPOSE_SHADER( +// fragment shader for radial gradient +DALI_COMPOSE_SHADER( uniform sampler2D sTexture;\n // sampler1D? uniform lowp vec4 uColor;\n varying mediump vec2 vTexCoord;\n @@ -109,24 +152,25 @@ const char* FRAGMENT_SHADER_RADIAL = DALI_COMPOSE_SHADER( {\n gl_FragColor = texture2D( sTexture, vec2( length(vTexCoord), 0.5 ) ) * uColor;\n }\n -); +) +}; -Sampler::WrapMode GetWrapMode( Gradient::SpreadMethod spread ) +Dali::WrapMode::Type GetWrapMode( Gradient::SpreadMethod spread ) { switch(spread) { case Gradient::REPEAT: { - return Sampler::REPEAT; + return Dali::WrapMode::REPEAT; } case Gradient::REFLECT: { - return Sampler::MIRRORED_REPEAT; + return Dali::WrapMode::MIRRORED_REPEAT; } case Gradient::PAD: default: { - return Sampler::CLAMP_TO_EDGE; + return Dali::WrapMode::CLAMP_TO_EDGE; } } } @@ -134,8 +178,9 @@ Sampler::WrapMode GetWrapMode( Gradient::SpreadMethod spread ) } -GradientRenderer::GradientRenderer() -:mGradientTransformIndex( Property::INVALID_INDEX ) +GradientRenderer::GradientRenderer( RendererFactoryCache& factoryCache ) +: ControlRenderer( factoryCache ), + mGradientType( LINEAR ) { } @@ -143,39 +188,27 @@ GradientRenderer::~GradientRenderer() { } -void GradientRenderer::DoInitialize( RendererFactoryCache& factoryCache, const Property::Map& propertyMap ) +void GradientRenderer::DoInitialize( Actor& actor, const Property::Map& propertyMap ) { - mImpl->mGeometry = factoryCache.GetGeometry( RendererFactoryCache::QUAD_GEOMETRY ); - if( !(mImpl->mGeometry) ) + Gradient::GradientUnits gradientUnits = Gradient::OBJECT_BOUNDING_BOX; + Property::Value* unitsValue = propertyMap.Find( GRADIENT_UNITS_NAME ); + std::string units; + // The default unit is OBJECT_BOUNDING_BOX. + // Only need to set new units if 'user-space' + if( unitsValue && unitsValue->Get( units ) && units == UNIT_USER_SPACE ) { - mImpl->mGeometry = RendererFactoryCache::CreateQuadGeometry(); - factoryCache.SaveGeometry( RendererFactoryCache::QUAD_GEOMETRY, mImpl->mGeometry ); + gradientUnits = Gradient::USER_SPACE_ON_USE; } - Type gradientType; + mGradientType = LINEAR; if( propertyMap.Find( GRADIENT_RADIUS_NAME )) { - mImpl->mShader = factoryCache.GetShader( RendererFactoryCache::GRADIENT_SHADER_RADIAL ); - if( !(mImpl->mShader) ) - { - mImpl->mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_RADIAL ); - factoryCache.SaveShader( RendererFactoryCache::GRADIENT_SHADER_RADIAL, mImpl->mShader ); - } - gradientType = RADIAL; - } - else - { - mImpl->mShader = factoryCache.GetShader( RendererFactoryCache::GRADIENT_SHADER_LINEAR ); - if( !(mImpl->mShader) ) - { - mImpl->mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_LINEAR ); - factoryCache.SaveShader( RendererFactoryCache::GRADIENT_SHADER_LINEAR, mImpl->mShader ); - } - gradientType = LINEAR; + mGradientType = RADIAL; } - if( NewGradient(gradientType, propertyMap) ) + if( NewGradient( mGradientType, propertyMap ) ) { + mGradient->SetGradientUnits( gradientUnits ); mGradientTransform = mGradient->GetAlignmentTransform(); } else @@ -187,19 +220,6 @@ void GradientRenderer::DoInitialize( RendererFactoryCache& factoryCache, const P void GradientRenderer::SetSize( const Vector2& size ) { ControlRenderer::SetSize( size ); - - if( mGradient->GetGradientUnits() == Gradient::OBJECT_BOUNDING_BOX ) - { - // Apply scaling - Matrix3 scaling( 1.f/(size.x+Math::MACHINE_EPSILON_100), 0.f, 0.f, - 0.f, 1.f/(size.y+Math::MACHINE_EPSILON_100), 0.f, 0.5f, 0.5f, 1.f ); - Matrix3::Multiply( mGradientTransform, scaling, mGradient->GetAlignmentTransform() ); - - if( mImpl->mRenderer ) - { - (mImpl->mRenderer).SetProperty( mGradientTransformIndex, mGradientTransform ); - } - } } void GradientRenderer::SetClipRect( const Rect& clipRect ) @@ -214,6 +234,11 @@ void GradientRenderer::SetOffset( const Vector2& offset ) //ToDo: renderer applies the offset } +void GradientRenderer::DoSetOnStage( Actor& actor ) +{ + InitializeRenderer(); +} + void GradientRenderer::DoCreatePropertyMap( Property::Map& map ) const { map.Clear(); @@ -269,20 +294,36 @@ void GradientRenderer::DoCreatePropertyMap( Property::Map& map ) const } } -void GradientRenderer::DoSetOnStage( Actor& actor ) +void GradientRenderer::InitializeRenderer() { - mGradientTransformIndex = (mImpl->mRenderer).RegisterProperty( UNIFORM_ALIGNMENT_MATRIX_NAME, mGradientTransform ); + Geometry geometry = mFactoryCache.GetGeometry( RendererFactoryCache::QUAD_GEOMETRY ); + if( !geometry ) + { + geometry = RendererFactoryCache::CreateQuadGeometry(); + mFactoryCache.SaveGeometry( RendererFactoryCache::QUAD_GEOMETRY, geometry ); + } + + Gradient::GradientUnits gradientUnits = mGradient->GetGradientUnits(); + RendererFactoryCache::ShaderType shaderType = GetShaderType( mGradientType, gradientUnits ); + Shader shader = mFactoryCache.GetShader( shaderType ); + if( !shader ) + { + shader = Shader::New( VERTEX_SHADER[gradientUnits], FRAGMENT_SHADER[ mGradientType ] ); + mFactoryCache.SaveShader( shaderType, shader ); + } + + Material material; + material = Material::New( shader ); + mImpl->mRenderer = Renderer::New( geometry, material ); Dali::BufferImage lookupTexture = mGradient->GenerateLookupTexture(); - Sampler sampler = Sampler::New( lookupTexture, UNIFORM_TEXTULRE_NAME ); - Sampler::WrapMode wrap = GetWrapMode( mGradient->GetSpreadMethod() ); + Sampler sampler = Sampler::New(); + Dali::WrapMode::Type wrap = GetWrapMode( mGradient->GetSpreadMethod() ); sampler.SetWrapMode( wrap, wrap ); - Material material = (mImpl->mRenderer).GetMaterial(); - if( material ) - { - material.AddSampler( sampler ); - } + material.AddTexture( lookupTexture, UNIFORM_TEXTULRE_NAME, sampler ); + + mImpl->mRenderer.RegisterProperty( UNIFORM_ALIGNMENT_MATRIX_NAME, mGradientTransform ); } bool GradientRenderer::NewGradient(Type gradientType, const Property::Map& propertyMap) @@ -349,15 +390,6 @@ bool GradientRenderer::NewGradient(Type gradientType, const Property::Map& prope return false; } - Property::Value* unitsValue = propertyMap.Find( GRADIENT_UNITS_NAME ); - std::string units; - // The default unit is OBJECT_BOUNDING_BOX. - // Only need to set new units if 'user-space' - if( unitsValue && unitsValue->Get( units ) && units == UNIT_USER_SPACE ) - { - mGradient->SetGradientUnits( Gradient::USER_SPACE_ON_USE ); - } - Property::Value* spread = propertyMap.Find( GRADIENT_SPREAD_METHOD_NAME ); std::string stringValue ; // The default spread method is PAD.