From 50b1ae83f190e27350e2a9f012320a8241f1cfdb Mon Sep 17 00:00:00 2001 From: Xiangyin Ma Date: Thu, 1 Oct 2015 19:09:47 +0100 Subject: [PATCH] (GradientRenderer)Respond to actor size change automatically when using ObjectBoundingBox as units Change-Id: Idad68fa70d4dc5edd640ef022071d178172867cb --- .../renderers/gradient/gradient-renderer.cpp | 112 +++++++++++++-------- .../renderers/gradient/gradient-renderer.h | 18 ++-- .../controls/renderers/renderer-factory-cache.h | 6 +- 3 files changed, 82 insertions(+), 54 deletions(-) diff --git a/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp b/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp index 0e502da..71d1a38 100644 --- a/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp +++ b/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.cpp @@ -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 -); +), -const char* FRAGMENT_SHADER_LINEAR = DALI_COMPOSE_SHADER( +// 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[] = +{ +// 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,7 +152,8 @@ 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 ) { @@ -152,30 +196,34 @@ void GradientRenderer::DoInitialize( RendererFactoryCache& factoryCache, const P factoryCache.SaveGeometry( RendererFactoryCache::QUAD_GEOMETRY, mImpl->mGeometry ); } - Type gradientType; + 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 ) + { + gradientUnits = Gradient::USER_SPACE_ON_USE; + } + + Type gradientType = 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 + + RendererFactoryCache::ShaderType shaderType = GetShaderType( gradientType, gradientUnits ); + + mImpl->mShader = factoryCache.GetShader( shaderType ); + if( !(mImpl->mShader) ) { - 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; + mImpl->mShader = Shader::New( VERTEX_SHADER[gradientUnits], FRAGMENT_SHADER[gradientType] ); + factoryCache.SaveShader( shaderType, mImpl->mShader ); } if( NewGradient(gradientType, propertyMap) ) { + mGradient->SetGradientUnits( gradientUnits ); mGradientTransform = mGradient->GetAlignmentTransform(); } else @@ -187,19 +235,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 ) @@ -349,15 +384,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. diff --git a/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.h b/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.h index 1ee3f36..0c087a2 100644 --- a/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.h +++ b/dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.h @@ -72,6 +72,15 @@ class GradientRenderer: public ControlRenderer public: /** + * Types of the gradient + */ + enum Type + { + LINEAR, + RADIAL + }; + + /** * @brief Constructor. */ GradientRenderer(); @@ -117,15 +126,6 @@ protected: private: /** - * Types of the gradient - */ - enum Type - { - LINEAR, - RADIAL - }; - - /** * New a gradient object with the given property map. * * @return True if the property map provides valid properties to create a gradient. Otherwise, returns false. diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h index ab589c2..c905b01 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.h @@ -45,8 +45,10 @@ public: { COLOR_SHADER, BORDER_SHADER, - GRADIENT_SHADER_LINEAR, - GRADIENT_SHADER_RADIAL, + GRADIENT_SHADER_LINEAR_USER_SPACE, + GRADIENT_SHADER_LINEAR_BOUNDING_BOX, + GRADIENT_SHADER_RADIAL_USER_SPACE, + GRADIENT_SHADER_RADIAL_BOUNDING_BOX, IMAGE_SHADER, NINE_PATCH_SHADER, SVG_SHADER, -- 2.7.4