From: Chu Hoang Date: Thu, 15 Oct 2015 15:56:20 +0000 (+0100) Subject: Changed Motion Blur and MotionStretch Effect to use new custom shaders. X-Git-Tag: dali_1.1.7~5^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=c727344220d82d216d98f511ee0e9dca33b866a8 Changed Motion Blur and MotionStretch Effect to use new custom shaders. Change-Id: I0b03b593b7b203841f6df51fd4b02e25e6ea0233 --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ShaderEffects.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ShaderEffects.cpp index 28de790..fde3088 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ShaderEffects.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ShaderEffects.cpp @@ -280,12 +280,61 @@ int UtcDaliCreateMotionBlurEffect(void) { ToolkitTestApplication application; - unsigned int sampleCount(4); - ShaderEffect effect = Toolkit::CreateMotionBlurEffect(sampleCount); - DALI_TEST_CHECK( effect ); + Property::Map effect = Toolkit::CreateMotionBlurEffect(); + DALI_TEST_CHECK( !effect.Empty() ); + + Property::Value* customShaderValue = effect.Find( "shader" ); + DALI_TEST_CHECK( customShaderValue ); + + Property::Map customShader; + DALI_TEST_CHECK( customShaderValue->Get( customShader ) ); - Property::Value value = effect.GetProperty( effect.GetPropertyIndex("uNumSamples")); - DALI_TEST_EQUALS( value.Get(), (float)sampleCount, TEST_LOCATION ); + Property::Value* vertexShaderValue = customShader.Find( "vertex-shader" ); + DALI_TEST_CHECK( vertexShaderValue ); + + std::string vertexShader; + DALI_TEST_CHECK( vertexShaderValue->Get( vertexShader ) ); + DALI_TEST_CHECK( !vertexShader.empty() ); + + Property::Value* fragmentShaderValue = customShader.Find( "fragment-shader" ); + DALI_TEST_CHECK( fragmentShaderValue ); + + std::string fragmentShader; + DALI_TEST_CHECK( fragmentShaderValue->Get( fragmentShader ) ); + DALI_TEST_CHECK( !fragmentShader.empty() ); + + Property::Value* gridXValue = customShader.Find( "subdivide-grid-x" ); + DALI_TEST_CHECK( gridXValue ); + + int gridX = 0; + DALI_TEST_CHECK( gridXValue->Get( gridX ) ); + DALI_TEST_CHECK( gridX > 1 ); + + Property::Value* gridYValue = customShader.Find( "subdivide-grid-y" ); + DALI_TEST_CHECK( gridYValue ); + + int gridY = 0; + DALI_TEST_CHECK( gridYValue->Get( gridY ) ); + DALI_TEST_CHECK( gridY > 1 ); + + Property::Value* hintsValue = customShader.Find( "hints" ); + DALI_TEST_CHECK( hintsValue ); + + std::string hints; + DALI_TEST_CHECK( hintsValue->Get( hints ) ); + DALI_TEST_CHECK( hints == "output-is-transparent" ); + + unsigned int sampleCount( 4 ); + Actor actor = Actor::New(); + Toolkit::SetMotionBlurProperties( actor, sampleCount ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uBlurTexCoordScale" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uGeometryStretchFactor" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uSpeedScalingFactor" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uObjectFadeStart" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uObjectFadeEnd" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uAlphaScale" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uNumSamples" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uModelLastFrame" ) != Property::INVALID_INDEX ); END_TEST; } @@ -294,8 +343,58 @@ int UtcDaliCreateMotionStretchEffect(void) { ToolkitTestApplication application; - ShaderEffect effect = Toolkit::CreateMotionStretchEffect(); - DALI_TEST_CHECK( effect ); + Property::Map effect = Toolkit::CreateMotionStretchEffect(); + DALI_TEST_CHECK( !effect.Empty() ); + + Property::Value* customShaderValue = effect.Find( "shader" ); + DALI_TEST_CHECK( customShaderValue ); + + Property::Map customShader; + DALI_TEST_CHECK( customShaderValue->Get( customShader ) ); + + Property::Value* vertexShaderValue = customShader.Find( "vertex-shader" ); + DALI_TEST_CHECK( vertexShaderValue ); + + std::string vertexShader; + DALI_TEST_CHECK( vertexShaderValue->Get( vertexShader ) ); + DALI_TEST_CHECK( !vertexShader.empty() ); + + Property::Value* fragmentShaderValue = customShader.Find( "fragment-shader" ); + DALI_TEST_CHECK( fragmentShaderValue ); + + std::string fragmentShader; + DALI_TEST_CHECK( fragmentShaderValue->Get( fragmentShader ) ); + DALI_TEST_CHECK( !fragmentShader.empty() ); + + Property::Value* gridXValue = customShader.Find( "subdivide-grid-x" ); + DALI_TEST_CHECK( gridXValue ); + + int gridX = 0; + DALI_TEST_CHECK( gridXValue->Get( gridX ) ); + DALI_TEST_CHECK( gridX > 1 ); + + Property::Value* gridYValue = customShader.Find( "subdivide-grid-y" ); + DALI_TEST_CHECK( gridYValue ); + + int gridY = 0; + DALI_TEST_CHECK( gridYValue->Get( gridY ) ); + DALI_TEST_CHECK( gridY > 1 ); + + Property::Value* hintsValue = customShader.Find( "hints" ); + DALI_TEST_CHECK( hintsValue ); + + std::string hints; + DALI_TEST_CHECK( hintsValue->Get( hints ) ); + DALI_TEST_CHECK( hints == "output-is-transparent" ); + + Actor actor = Actor::New(); + Toolkit::SetMotionStretchProperties( actor ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uGeometryStretchFactor" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uSpeedScalingFactor" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uObjectFadeStart" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uObjectFadeEnd" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uAlphaScale" ) != Property::INVALID_INDEX ); + DALI_TEST_CHECK( actor.GetPropertyIndex( "uModelLastFrame" ) != Property::INVALID_INDEX ); END_TEST; } diff --git a/dali-toolkit/devel-api/shader-effects/motion-blur-effect.h b/dali-toolkit/devel-api/shader-effects/motion-blur-effect.h index 17c2f65..aede5f1 100644 --- a/dali-toolkit/devel-api/shader-effects/motion-blur-effect.h +++ b/dali-toolkit/devel-api/shader-effects/motion-blur-effect.h @@ -29,27 +29,33 @@ namespace Toolkit { /** + * @brief Set the properties for the motion blur + * + * @param numBlurSamples Number of samples used by the shader + */ +inline void SetMotionBlurProperties( Actor& actor, unsigned int numBlurSamples = 8 ) +{ + actor.RegisterProperty( "uBlurTexCoordScale", 0.125f ); + actor.RegisterProperty( "uGeometryStretchFactor", 0.05f ); + actor.RegisterProperty( "uSpeedScalingFactor", 0.5f ); + actor.RegisterProperty( "uObjectFadeStart", Vector2( 0.25f, 0.25f ) ); + actor.RegisterProperty( "uObjectFadeEnd", Vector2( 0.5f, 0.5f ) ); + actor.RegisterProperty( "uAlphaScale", 0.75f ); + actor.RegisterProperty( "uNumSamples", static_cast( numBlurSamples ) ); + actor.RegisterProperty( "uRecipNumSamples", 1.0f / static_cast( numBlurSamples ) ); + actor.RegisterProperty( "uRecipNumSamplesMinusOne", 1.0f / static_cast( numBlurSamples - 1.0f ) ); + Property::Index uModelProperty = actor.RegisterProperty( "uModelLastFrame", Matrix::IDENTITY ); + + Constraint constraint = Constraint::New( actor, uModelProperty, EqualToConstraint() ); + constraint.AddSource( Source( actor , Actor::Property::WORLD_MATRIX ) ); + constraint.Apply(); +} + +/** * @brief Create a new MotionBlurEffect * * Motion blur shader works on a per object basis. Objects will - * blur when they move, or if the camera moves. Can be applied to ImageActor or - * TextActor only. - * - * Usage example:- - * - * // Create shader used for doing motion blur\n - * ShaderEffect MotionBlurEffect = CreateMotionBlurEffect(); - * - * // set actor shader to the blur one\n - * Actor actor = Actor::New( ... );\n - * actor.SetShaderEffect( MotionBlurEffect ); - * - * // Constrain "uModelLastFrame" to be the same as the actor's world matrix\n - * Dali::Property::Index uModelProperty = MotionBlurEffect.GetPropertyIndex( "uModelLastFrame" ); - * Constraint constraint = Constraint::New( MotionBlurEffect, uModelProperty, EqualToConstraint() );\n - * constraint.AddSource( Source( actor , Actor::Property::WORLD_MATRIX ) );\n - * constraint.Apply();\n - * + * blur when they move, or if the camera moves. * * Animatable/Constrainable uniforms: * "uBlurTexCoordScale" - This scales the offset for texture samples along the motion velocity vector. @@ -83,24 +89,22 @@ namespace Toolkit * at the cost of performance. * "uModelLastFrame" - The model to world space transformation matrix of the actor in the previous frame. * - * @param numBlurSamples Number of samples used by the shader - * @return A handle to a newly allocated ShaderEffect + * @return The newly created Property::Map with the motion blur effect */ -inline ShaderEffect CreateMotionBlurEffect( unsigned int numBlurSamples = 8 ) +inline Property::Map CreateMotionBlurEffect() { - // Dali vertexSource prefix for reference: - // precision highp float; - // attribute vec3 aPosition; - // attribute vec2 aTexCoord; - // uniform mat4 uMvpMatrix; - // uniform mat4 uModelView; - // uniform mat3 uNormalMatrix; - // uniform mat4 uProjection; - // uniform vec4 uColor; - // varying vec2 vTexCoord; std::string vertexSource; vertexSource = "precision mediump float;\n" + + "attribute vec2 aPosition;\n" + + "uniform mat4 uMvpMatrix;\n" + "uniform mat4 uModelView;\n" + "uniform mat4 uViewMatrix;\n" + "uniform mat4 uProjection;\n" + "uniform vec3 uSize;\n" + "uniform mat4 uModelLastFrame;\n" "float timeDelta = 0.0167;\n" @@ -111,20 +115,23 @@ inline ShaderEffect CreateMotionBlurEffect( unsigned int numBlurSamples = 8 ) "varying vec2 vModelSpaceCenterToPos;\n" "varying vec2 vScreenSpaceVelocityVector;\n" "varying float vSpeed;\n" + "varying vec2 vTexCoord;\n" "void main()\n" "{\n" // get view space position of vertex this frame and last frame - " vec4 vertex = vec4(aPosition, 1.0);\n" - " vec4 viewSpaceVertex = uModelView * vertex;\n" - " vec4 viewSpaceVertexLastFrame = (uViewMatrix * uModelLastFrame) * vertex;\n" + " vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n" + " vertexPosition.xyz *= uSize;\n" + + " vec4 viewSpaceVertex = uModelView * vertexPosition;\n" + " vec4 viewSpaceVertexLastFrame = (uViewMatrix * uModelLastFrame) * vertexPosition;\n" " float reciprocalTimeDelta = 1.0 / timeDelta;\n" // work out vertex's last movement in view space " vec3 viewSpacePosDelta = viewSpaceVertex.xyz - viewSpaceVertexLastFrame.xyz;\n" // get clip space position of vertex this frame and last frame - " vec4 clipSpaceVertex = uMvpMatrix * vertex;\n" + " vec4 clipSpaceVertex = uMvpMatrix * vertexPosition;\n" " vec4 clipSpaceVertexLastFrame = uProjection * viewSpaceVertexLastFrame;\n" // decide how much this vertex is 'trailing', i.e. at the back of the object relative to its direction of motion. We do this @@ -133,7 +140,7 @@ inline ShaderEffect CreateMotionBlurEffect( unsigned int numBlurSamples = 8 ) " float posDeltaLength = length(viewSpacePosDelta);\n" " if(posDeltaLength > 0.001)\n" // avoid div by 0 if object has barely moved " {\n" - " vec4 viewSpaceCenterToPos = uModelView * vec4(aPosition, 0.0);\n" + " vec4 viewSpaceCenterToPos = uModelView * vec4(vertexPosition.xy, 0.0, 0.0);\n" " float centerToVertexDist = length(viewSpaceCenterToPos);\n" " if(centerToVertexDist > 0.001)\n" // avoid div by 0 if object has vertex at model space origin " {\n" @@ -158,21 +165,20 @@ inline ShaderEffect CreateMotionBlurEffect( unsigned int numBlurSamples = 8 ) " vSpeed = clamp(vSpeed, 0.0, 1.0);\n" // provide fragment shader with vector from center of object to pixel (assumes the objects model space origin is at its center and verts have same z) - " vModelSpaceCenterToPos = aPosition.xy;\n" + " vModelSpaceCenterToPos = viewSpaceVertex.xy;\n" - " vTexCoord = aTexCoord;\n" + " vec2 texCoord = aPosition + vec2(0.5);" + " vTexCoord = texCoord;\n" "}\n"; - // Dali fragmentSource prefix for reference: - // precision highp float; - // uniform sampler2D sTexture; - // uniform sampler2D sEffect; - // uniform vec4 uColor; - // varying vec2 vTexCoord; std::string fragmentSource; fragmentSource = "precision mediump float;\n" + + "uniform sampler2D sTexture;\n" + "uniform vec4 uColor;\n" + "uniform vec2 uObjectFadeStart;\n" "uniform vec2 uObjectFadeEnd;\n" "uniform float uAlphaScale;\n" @@ -184,6 +190,7 @@ inline ShaderEffect CreateMotionBlurEffect( unsigned int numBlurSamples = 8 ) "varying vec2 vModelSpaceCenterToPos;\n" "varying vec2 vScreenSpaceVelocityVector;\n" "varying float vSpeed;\n" + "varying vec2 vTexCoord;\n" "void main()\n" "{\n" @@ -208,30 +215,25 @@ inline ShaderEffect CreateMotionBlurEffect( unsigned int numBlurSamples = 8 ) " col += texture2D(sTexture, vTexCoord + (velocity * t)) * uRecipNumSamples;\n" " }\n" " gl_FragColor = mix(colActor, col, vSpeed);\n" // lerp blurred and non-blurred actor based on speed of motion - " gl_FragColor.a = colActor.a * fadeToEdgesScale;\n" // fade blurred actor to its edges based on speed of motion + " gl_FragColor.a = fadeToEdgesScale;//colActor.a * fadeToEdgesScale;\n" // fade blurred actor to its edges based on speed of motion " gl_FragColor *= uColor;\n" "}\n"; + + Property::Map map; + + Property::Map customShader; + customShader[ "vertex-shader" ] = vertexSource; + customShader[ "fragment-shader" ] = fragmentSource; + + customShader[ "subdivide-grid-x" ] = 10; + customShader[ "subdivide-grid-y" ] = 10; + // NOTE: we must turn on alpha blending for the actor (HINT_BLENDING) - ShaderEffect shader = ShaderEffect::New( vertexSource, fragmentSource, - ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING | ShaderEffect::HINT_GRID) ); - - ////////////////////////////////////// - // Register uniform properties - // - // - shader.SetUniform( "uBlurTexCoordScale", 0.125f ); - shader.SetUniform( "uGeometryStretchFactor", 0.05f ); - shader.SetUniform( "uSpeedScalingFactor", 0.5f ); - shader.SetUniform( "uObjectFadeStart", Vector2( 0.25f, 0.25f ) ); - shader.SetUniform( "uObjectFadeEnd", Vector2( 0.5f, 0.5f ) ); - shader.SetUniform( "uAlphaScale", 0.75f ); - shader.SetUniform( "uNumSamples", static_cast( numBlurSamples ) ); - shader.SetUniform( "uRecipNumSamples", 1.0f / static_cast( numBlurSamples ) ); - shader.SetUniform( "uRecipNumSamplesMinusOne", 1.0f / static_cast( numBlurSamples - 1.0f ) ); - shader.SetUniform( "uModelLastFrame", Matrix::IDENTITY ); - - return shader; + customShader[ "hints" ] = "output-is-transparent"; + + map[ "shader" ] = customShader; + return map; } } diff --git a/dali-toolkit/devel-api/shader-effects/motion-stretch-effect.h b/dali-toolkit/devel-api/shader-effects/motion-stretch-effect.h index e16e2ef..5e43953 100644 --- a/dali-toolkit/devel-api/shader-effects/motion-stretch-effect.h +++ b/dali-toolkit/devel-api/shader-effects/motion-stretch-effect.h @@ -29,25 +29,26 @@ namespace Toolkit { /** + * @brief Set the properties for the motion stretch + */ +inline void SetMotionStretchProperties( Actor& actor ) +{ + actor.RegisterProperty( "uGeometryStretchFactor", 0.5f ); + actor.RegisterProperty( "uSpeedScalingFactor", 0.5f ); + actor.RegisterProperty( "uObjectFadeStart", Vector2( 0.25f, 0.25f ) ); + actor.RegisterProperty( "uObjectFadeEnd", Vector2( 0.5f, 0.5f ) ); + actor.RegisterProperty( "uAlphaScale", 0.75f ); + Property::Index uModelProperty = actor.RegisterProperty( "uModelLastFrame", Matrix::IDENTITY ); + + Constraint constraint = Constraint::New( actor, uModelProperty, EqualToConstraint() ); + constraint.AddSource( Source( actor , Actor::Property::WORLD_MATRIX ) ); + constraint.Apply(); +} + +/** * @brief Creates a new MotionStretchEffect * - * Motion stretch shader works on a per object basis. Objects will stretch in the direction of motion when they move, or if the camera moves. Can be applied - * to ImageActor or TextActor only. - * - * Usage example:- - * - * // Create shader used for doing motion stretch\n - * ShaderEffect MotionStretchEffect = CreateMotionStretchEffect(); - * - * // set actor shader to the stretch one\n - * Actor actor = Actor::New( ... );\n - * actor.SetShaderEffect( MotionStretchEffect ); - * - * // Constrain "uModelLastFrame" to be the same as the actor's world matrix\n - * Dali::Property::Index uModelProperty = MotionBlurEffect.GetPropertyIndex( "uModelLastFrame" ); - * Constraint constraint = Constraint::New( MotionBlurEffect, uModelProperty, EqualToConstraint() );\n - * constraint.AddSource( Source( actor , Actor::Property::WORLD_MATRIX ) );\n - * constraint.Apply();\n + * Motion stretch shader works on a per object basis. Objects will stretch in the direction of motion when they move, or if the camera moves. * * Animatable/Constrainable uniforms: * "uGeometryStretchFactor" - This scales the amount the geometry stretches along the motion velocity vector. @@ -68,25 +69,24 @@ namespace Toolkit * applied. Default 0.75. * "uModelLastFrame" - The model to world space transformation matrix of the actor in the previous frame. * - * @return A handle to a newly allocated ShaderEffect + * @return The newly created Property::Map with the motion stretch effect */ -inline ShaderEffect CreateMotionStretchEffect() +inline Property::Map CreateMotionStretchEffect() { - // Dali vertexSource prefix for reference: - // precision highp float; - // attribute vec3 aPosition; - // attribute vec2 aTexCoord; - // uniform mat4 uMvpMatrix; - // uniform mat4 uModelView; - // uniform mat3 uNormalMatrix; - // uniform mat4 uProjection; - // uniform vec4 uColor; - // varying vec2 vTexCoord; std::string vertexSource; vertexSource = "precision mediump float;\n" + + "attribute vec2 aPosition;\n" + + "uniform mat4 uMvpMatrix;\n" + "uniform mat4 uModelView;\n" + "uniform mat4 uViewMatrix;\n" + "uniform mat4 uProjection;\n" + "uniform vec3 uSize;\n" + "uniform mat4 uModelLastFrame;\n" - "uniform float uTimeDelta;\n" + "float timeDelta = 0.0167;\n" "uniform float uGeometryStretchFactor;\n" "uniform float uSpeedScalingFactor;\n" @@ -95,20 +95,23 @@ inline ShaderEffect CreateMotionStretchEffect() "varying vec2 vModelSpaceCenterToPos;\n" "varying vec2 vScreenSpaceVelocityVector;\n" "varying float vSpeed;\n" + "varying vec2 vTexCoord;\n" "void main()\n" "{\n" // get view space position of vertex this frame and last frame - " vec4 vertex = vec4(aPosition, 1.0);\n" - " vec4 viewSpaceVertex = uModelView * vertex;\n" - " vec4 viewSpaceVertexLastFrame = uViewMatrix * uModelLastFrame * vertex;\n" + " vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n" + " vertexPosition.xyz *= uSize;\n" + + " vec4 viewSpaceVertex = uModelView * vertexPosition;\n" + " vec4 viewSpaceVertexLastFrame = uViewMatrix * uModelLastFrame * vertexPosition;\n" // work out vertex's last movement in view space " vec3 viewSpacePosDelta = viewSpaceVertex.xyz - viewSpaceVertexLastFrame.xyz;\n" - " float reciprocalTimeDelta = 1.0 / ((uTimeDelta > 0.0) ? uTimeDelta : 0.01);\n" + " float reciprocalTimeDelta = 1.0 / timeDelta;\n" // get clip space position of vertex this frame and last frame - " vec4 clipSpaceVertex = uMvpMatrix * vertex;\n" + " vec4 clipSpaceVertex = uMvpMatrix * vertexPosition;\n" " vec4 clipSpaceVertexLastFrame = uProjection * viewSpaceVertexLastFrame;\n" // decide how much this vertex is 'trailing', i.e. at the back of the object relative to its direction of motion. We do this @@ -117,7 +120,7 @@ inline ShaderEffect CreateMotionStretchEffect() " float posDeltaLength = length(viewSpacePosDelta);\n" " if(posDeltaLength > 0.001)\n" // avoid div by 0 if object has barely moved " {\n" - " vec4 viewSpaceCenterToPos = uModelView * vec4(aPosition, 0.0);\n" + " vec4 viewSpaceCenterToPos = uModelView * vec4(aPosition, 0.0, 0.0);\n" " float centerToVertexDist = length(viewSpaceCenterToPos);\n" " if(centerToVertexDist > 0.001)\n" // avoid div by 0 if object has vertex at model space origin " {\n" @@ -143,22 +146,19 @@ inline ShaderEffect CreateMotionStretchEffect() " vSpeed = clamp(vSpeed, 0.0, 1.0);\n" // provide fragment shader with vector from center of object to pixel (assumes the objects model space origin is at its center and verts have same z) - " vModelSpaceCenterToPos = aPosition.xy;\n" + " vModelSpaceCenterToPos = viewSpaceVertex.xy;\n" - " vTexCoord = aTexCoord;\n" + " vec2 texCoord = aPosition + vec2(0.5);" + " vTexCoord = texCoord;\n" "}\n"; - - // Dali fragmentSource prefix for reference: - // precision highp float; - // uniform sampler2D sTexture; - // uniform sampler2D sEffect; - // uniform vec4 uColor; - // varying vec2 vTexCoord; std::string fragmentSource; fragmentSource = "precision mediump float;\n" + "uniform sampler2D sTexture;\n" + "uniform vec4 uColor;\n" + "uniform vec2 uObjectFadeStart;\n" "uniform vec2 uObjectFadeEnd;\n" "uniform float uAlphaScale;\n" @@ -167,6 +167,7 @@ inline ShaderEffect CreateMotionStretchEffect() "varying vec2 vModelSpaceCenterToPos;\n" "varying vec2 vScreenSpaceVelocityVector;\n" "varying float vSpeed;\n" + "varying vec2 vTexCoord;\n" "void main()\n" "{\n" @@ -184,24 +185,20 @@ inline ShaderEffect CreateMotionStretchEffect() " gl_FragColor *= uColor;\n" "}"; + Property::Map map; + + Property::Map customShader; + customShader[ "vertex-shader" ] = vertexSource; + customShader[ "fragment-shader" ] = fragmentSource; + + customShader[ "subdivide-grid-x" ] = 10; + customShader[ "subdivide-grid-y" ] = 10; + // NOTE: we must turn on alpha blending for the actor (HINT_BLENDING) - ShaderEffect shaderEffect = ShaderEffect::New( - vertexSource, fragmentSource, - ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING | ShaderEffect::HINT_GRID ) ); - - - ////////////////////////////////////// - // Register uniform properties - // - // - shaderEffect.SetUniform( "uGeometryStretchFactor", 0.5f ); - shaderEffect.SetUniform( "uSpeedScalingFactor", 0.5f ); - shaderEffect.SetUniform( "uObjectFadeStart", Vector2( 0.25f, 0.25f ) ); - shaderEffect.SetUniform( "uObjectFadeEnd", Vector2( 0.5f, 0.5f ) ); - shaderEffect.SetUniform( "uAlphaScale", 0.75f ); - shaderEffect.SetUniform( "uModelLastFrame", Matrix::IDENTITY ); - - return shaderEffect; + customShader[ "hints" ] = "output-is-transparent"; + + map[ "shader" ] = customShader; + return map; } }