Merge "Changes after Custom actor impl extension, cleanup, extension and test cases...
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / shader-effects / swirl-effect.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <dali-toolkit/devel-api/shader-effects/swirl-effect.h>
19
20 namespace Dali
21 {
22
23 namespace Toolkit
24 {
25
26 namespace
27 {
28
29 const std::string ANGLE_PROPERTY_NAME( "uAngle" );
30 const std::string CENTER_PROPERTY_NAME( "uCenter" );
31 const std::string RADIUS_PROPERTY_NAME( "uRadius" );
32
33 } // namespace
34
35 SwirlEffect::SwirlEffect()
36 {
37 }
38
39 //Call the Parent copy constructor to add reference to the implementation for this object
40 SwirlEffect::SwirlEffect(ShaderEffect handle)
41 :ShaderEffect(handle)
42 {
43 }
44
45 SwirlEffect::~SwirlEffect()
46 {
47 }
48
49
50 SwirlEffect SwirlEffect::New(bool warp)
51 {
52   // append the default version
53   std::string fragmentShader(
54       "uniform mediump vec2  uTextureSize;\n"
55       "uniform highp float uRadius;\n"
56       "uniform highp float uAngle;\n"
57       "uniform mediump vec2  uCenter;\n"
58       "void main()\n"
59       "{\n"
60       "  highp vec2 textureCenter = (sTextureRect.xy + sTextureRect.zw) * 0.5;\n"
61       "  textureCenter = vTexCoord.st - textureCenter;\n"
62       "  highp float distance = length(textureCenter);\n"
63       "  if (distance >= uRadius)\n"
64       "     discard;\n"
65       "  highp float percent = (uRadius - distance) / uRadius;\n"
66       "  highp float theta = percent * percent * uAngle * 4.0;\n"
67       "  highp float sinTheta = sin(theta);\n"
68       "  highp float cosTheta = cos(theta);\n" );
69       // if warp, loose the sign from sin
70   if( warp )
71   {
72     fragmentShader.append(
73       "  textureCenter = vec2( dot( textureCenter, vec2(cosTheta, sinTheta) ), "
74       "                        dot( textureCenter, vec2(sinTheta, cosTheta) ) );\n" );
75   }
76   else
77   {
78     fragmentShader.append(
79       "  textureCenter = vec2( dot( textureCenter, vec2(cosTheta, -sinTheta) ), "
80       "                        dot( textureCenter, vec2(sinTheta, cosTheta) ) );\n" );
81   }
82   fragmentShader.append(
83     "  textureCenter += uCenter;\n"
84     "  gl_FragColor = texture2D( sTexture, textureCenter ) * uColor;\n"
85     "}" );
86
87   // Create the implementation, temporarily owned on stack,
88   Dali::ShaderEffect shaderEffectCustom =  Dali::ShaderEffect::New(
89       "",
90       fragmentShader,
91       Dali::GeometryType( GEOMETRY_TYPE_IMAGE ),
92       ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING | ShaderEffect::HINT_GRID ));
93
94   /* Pass ownership to SwirlEffect through overloaded constructor, So that it now has access to the
95      Dali::ShaderEffect implementation */
96   Dali::Toolkit::SwirlEffect handle( shaderEffectCustom );
97
98   handle.SetUniform( ANGLE_PROPERTY_NAME, 0.0f );
99   handle.SetUniform( CENTER_PROPERTY_NAME, Vector2(0.5f, 0.5f) );
100   handle.SetUniform( RADIUS_PROPERTY_NAME, 1.0f );
101
102   return handle;
103 }
104
105 void SwirlEffect::SetAngle(float angle)
106 {
107   SetUniform( ANGLE_PROPERTY_NAME, angle );
108 }
109
110 void SwirlEffect::SetCenter(const Vector2& center)
111 {
112   SetUniform( CENTER_PROPERTY_NAME, center );
113 }
114
115 void SwirlEffect::SetRadius(float radius)
116 {
117   SetUniform( RADIUS_PROPERTY_NAME, radius );
118 }
119
120 const std::string& SwirlEffect::GetAnglePropertyName() const
121 {
122   return ANGLE_PROPERTY_NAME;
123 }
124
125 const std::string& SwirlEffect::GetCenterPropertyName() const
126 {
127   return CENTER_PROPERTY_NAME;
128 }
129
130 const std::string& SwirlEffect::GetRadiusPropertyName() const
131 {
132   return RADIUS_PROPERTY_NAME;
133 }
134
135 } // namespace Toolkit
136
137 } // namespace Dali