X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Fdevel-api%2Fshader-effects%2Fswirl-effect.h;h=af90eeaabf64c91f9ea6de393234a7e369c48c73;hp=6327fdc17e38723faa2482552c710b78f80b44be;hb=c3f7ea6cb0c0b75c2276193aff88b5c7a679a2d5;hpb=f58b8383147de70affa1e3949cf1c6757d705d3c;ds=sidebyside diff --git a/dali-toolkit/devel-api/shader-effects/swirl-effect.h b/dali-toolkit/devel-api/shader-effects/swirl-effect.h index 6327fdc..af90eea 100644 --- a/dali-toolkit/devel-api/shader-effects/swirl-effect.h +++ b/dali-toolkit/devel-api/shader-effects/swirl-effect.h @@ -28,79 +28,67 @@ namespace Toolkit { /** - * @brief SwirlEffect is a custom shader effect to achieve swirl effects in Image actors. + * @brief Creates a new SwirlEffect + * + * SwirlEffect is a custom shader effect to achieve swirl effects in Image actors. + * + * Animatable/Constrainable uniforms: + * "uAngle" - The angle of the swirl + * "uCenter" - The center of the swirl + * "uRadius" - The radius of the swirl + * + * @param[in] warp True if the effect should warp + * @return A handle to a newly allocated ShaderEffect */ -class DALI_IMPORT_API SwirlEffect : public ShaderEffect +inline ShaderEffect CreateSwirlEffect( bool warp ) { -public: - - /** - * @brief Create an uninitialized SwirlEffect; this can be initialized with SwirlEffect::New(). - * - * Calling member functions with an uninitialized Dali::Object is not allowed. - */ - SwirlEffect(); - - /** - * @brief Destructor - * - * This is non-virtual since derived Handle types must not contain data or virtual methods. - */ - ~SwirlEffect(); - - /** - * @brief Create an initialized SwirlEffect. - * - * @param[in] warp True if the effect should warp. - * @return A handle to a newly allocated Dali resource. - */ - static SwirlEffect New(bool warp); - - /** - * @brief Set the angle of the swirl. - * - * @param[in] angle The angle in float. - */ - void SetAngle(float angle); - - /** - * @brief Set the center of the swirl. - * - * @param[in] center The center in Vector2. - */ - void SetCenter(const Vector2& center); - - /** - * @brief Set the radius of the swirl. - * - * @param[in] radius The radius in float. - */ - void SetRadius(float radius); - - /** - * @brief Get the name for the angle property. - * - * @return A std::string containing the property name - */ - const std::string& GetAnglePropertyName() const; - - /** - * @brief Get the name for the center property. - * - * @return A std::string containing the property name - */ - const std::string& GetCenterPropertyName() const; - - /** - * @brief Get the name for the radius property. - * - * @return A std::string containing the property name - */ - const std::string& GetRadiusPropertyName() const; - -private: // Not intended for application developers - DALI_INTERNAL SwirlEffect(ShaderEffect handle); -}; + // append the default version + std::string fragmentShader( + "uniform mediump vec2 uTextureSize;\n" + "uniform highp float uRadius;\n" + "uniform highp float uAngle;\n" + "uniform mediump vec2 uCenter;\n" + "void main()\n" + "{\n" + " highp vec2 textureCenter = (sTextureRect.xy + sTextureRect.zw) * 0.5;\n" + " textureCenter = vTexCoord.st - textureCenter;\n" + " highp float distance = length(textureCenter);\n" + " if (distance >= uRadius)\n" + " discard;\n" + " highp float percent = (uRadius - distance) / uRadius;\n" + " highp float theta = percent * percent * uAngle * 4.0;\n" + " highp float sinTheta = sin(theta);\n" + " highp float cosTheta = cos(theta);\n" ); + // if warp, loose the sign from sin + if( warp ) + { + fragmentShader.append( + " textureCenter = vec2( dot( textureCenter, vec2(cosTheta, sinTheta) ), " + " dot( textureCenter, vec2(sinTheta, cosTheta) ) );\n" ); + } + else + { + fragmentShader.append( + " textureCenter = vec2( dot( textureCenter, vec2(cosTheta, -sinTheta) ), " + " dot( textureCenter, vec2(sinTheta, cosTheta) ) );\n" ); + } + fragmentShader.append( + " textureCenter += uCenter;\n" + " gl_FragColor = texture2D( sTexture, textureCenter ) * uColor;\n" + "}" ); + + Dali::ShaderEffect shaderEffect = Dali::ShaderEffect::New( + "", + fragmentShader, + Dali::GeometryType( GEOMETRY_TYPE_IMAGE ), + ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING | ShaderEffect::HINT_GRID )); + + shaderEffect.SetUniform( "uAngle", 0.0f ); + shaderEffect.SetUniform( "uCenter", Vector2(0.5f, 0.5f) ); + shaderEffect.SetUniform( "uRadius", 1.0f ); + + return shaderEffect; +} } // namespace Toolkit