Revert "License conversion from Flora to Apache 2.0"
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / public-api / shader-effects / bouncing-effect.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 #include <dali-toolkit/public-api/shader-effects/bouncing-effect.h>
18
19 namespace Dali
20 {
21
22 namespace Toolkit
23 {
24
25 namespace
26 {
27
28 #define MAKE_STRING(A)#A
29
30 const std::string PROGRESS_RATE_PROPERTY_NAME( "uProgressRate" );
31
32 } // namespace
33
34 BouncingEffect::BouncingEffect()
35 {
36 }
37
38 BouncingEffect::BouncingEffect( ShaderEffect handle )
39 :ShaderEffect( handle )
40 {
41 }
42
43 BouncingEffect::~BouncingEffect()
44 {
45 }
46
47 BouncingEffect BouncingEffect::New( const Vector4& color )
48 {
49   std::string fragmentShader = MAKE_STRING(
50       uniform float uProgressRate;\n
51       uniform vec4 uAssignedColor;\n
52       void main()\n
53       {\n
54         float progressRate = abs(uProgressRate)*0.5;\n
55         float amplitude = 0.15 - progressRate*0.15 ;\n
56         float x1 = 7.5 * (vTexCoord.x - progressRate);\n
57         float x2 = 7.5 * (vTexCoord.x - 1.0 + progressRate);\n
58         float height1 = max(0.00001, 0.3 - amplitude * ( exp(x1) + exp(-x1) ) );\n
59         float height2 = max(0.00001, 0.3 - amplitude * ( exp(x2) + exp(-x2) ) );\n
60         float height3 = max(0.00001, 1.0 - 3.0 * amplitude * ( exp(x1*0.5) + exp(-x1*0.5) ) );\n
61         float height4 = max(0.00001, 1.0 - 3.0 * amplitude * ( exp(x2*0.5) + exp(-x2*0.5) ) );\n
62         vec4 fragColor = vec4(0.0);\n
63         float y = vTexCoord.y/(height1+height2);\n
64         float y2 = vTexCoord.y/max(height3,height4);\n
65         float coef = max(height1,height2)*5.0/( 1.0+exp(y*12.0-6.0) );\n
66         float alpha = pow( max(0.0,(1.0-y2))*(1.0-min(abs(x1),abs(x2))/5.0), 2.0);\n
67         if( vTexCoord.y < 0.075 )\n
68         {\n
69           fragColor= mix(uAssignedColor, vec4(1.0), coef);\n
70           fragColor += (vec4(1.0)-fragColor) * alpha;\n
71         }\n
72         else if (y2<1.0)\n
73         {\n
74           fragColor =vec4(1.0,1.0,1.0, alpha + (1.0-alpha)*coef);\n
75           fragColor.rgb -= ( vec3(1.0)-uAssignedColor.rgb )*min(clamp(y*1.2-0.3, 0.0, 0.3),clamp(0.9-y*1.2,0.0,0.3));\n
76         }\n
77         fragColor.a *= 10.0*min(min(vTexCoord.x, 1.0-vTexCoord.x),0.1)*min(1.0, progressRate/0.2);\n
78         gl_FragColor =  fragColor;\n
79       }
80   );
81
82   ShaderEffect shaderEffect;
83   shaderEffect = ShaderEffect::New( "", fragmentShader, GeometryType( GEOMETRY_TYPE_IMAGE),
84                                     ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING ) );
85   BouncingEffect handle( shaderEffect );
86
87   handle.SetUniform( "uAssignedColor", color );
88   handle.SetProgressRate( 0.f );
89
90   return handle;
91 }
92
93 void BouncingEffect::SetProgressRate( float progress )
94 {
95   SetUniform( PROGRESS_RATE_PROPERTY_NAME, progress );
96 }
97
98 const std::string& BouncingEffect::GetProgressRatePropertyName() const
99 {
100   return PROGRESS_RATE_PROPERTY_NAME;
101 }
102
103 } // namespace Toolkit
104
105 } // namespace Dali