2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <dali-toolkit/public-api/shader-effects/displacement-effect.h>
28 const std::string DISPLACEMENT_EFFECT_LIGHT_DIRECTION_PROPERTY_NAME( "uLightDirection" );
29 const std::string DISPLACEMENT_EFFECT_AMBIENT_LIGHT_COLOR_PROPERTY_NAME( "uAmbientLightColor" );
30 const std::string DISPLACEMENT_EFFECT_DIFFUSE_LIGHT_COLOR_PROPERTY_NAME( "uDiffuseLightColor" );
31 const std::string DISPLACEMENT_EFFECT_LIGHT_MULTIPLIER_PROPERTY_NAME( "uLightMultiplier" );
32 const std::string DISPLACEMENT_EFFECT_STATE_PROPERTY_NAME( "uState" );
33 const std::string DISPLACEMENT_EFFECT_HEIGHT_SCALE_PROPERTY_NAME( "uHightScale" );
34 const std::string DISPLACEMENT_EFFECT_FIXED_NORMAL_PROPERTY_NAME( "uFixedNormal" );
36 // factors that scale the look, defaults
37 const Vector3 DISPLACEMENT_EFFECT_LIGHT_DIRECTION_DEFAULT = Vector3(0.0, 0.7070168f, 0.7071068f);
38 const Vector3 DISPLACEMENT_EFFECT_AMBIENT_LIGHT_COLOR_DEFAULT = Vector3(0.15f, 0.15f, 0.15f);
39 const Vector3 DISPLACEMENT_EFFECT_DIFFUSE_LIGHT_COLOR_DEFAULT = Vector3(1.0f, 1.0f, 1.0f);
40 const float DISPLACEMENT_EFFECT_LIGHT_MULTIPLIER_DEFAULT = 1.0f;
41 const float DISPLACEMENT_EFFECT_STATE_DEFAULT = 0.0f;
42 const float DISPLACEMENT_EFFECT_HEIGHT_SCALE_DEFAULT = 0.1f;
43 const Vector3 DISPLACEMENT_EFFECT_FIXED_NORMAL_DEFAULT = Vector3(0.0f, 0.0f, 1.0f);
48 ////////////////////////////////////////////////////
50 // Soft button shader / actor tweaking parameters
54 DisplacementEffect::DisplacementEffect()
58 //Call the Parent copy constructor to add reference to the implementation for this object
59 DisplacementEffect::DisplacementEffect(ShaderEffect handle)
64 DisplacementEffect::~DisplacementEffect()
68 DisplacementEffect DisplacementEffect::New(Type type)
71 std::string fragmentSourceFixed;
72 fragmentSourceFixed = "precision mediump float;\n"
73 "uniform vec3 uLightDirection;\n"
74 "uniform vec3 uAmbientLightColor;\n"
75 "uniform vec3 uDiffuseLightColor;\n"
76 "uniform float uLightMultiplier;\n"
77 "uniform float uState;\n"
78 "uniform float uHightScale;\n"
79 "uniform vec3 uFixedNormal;\n"
83 " vec4 col = texture2D(sTexture, vTexCoord);\n"
85 " float intensity = dot(uLightDirection, uFixedNormal);"
86 " vec3 lighting = (intensity * uDiffuseLightColor) + uAmbientLightColor;\n"
87 " lighting *= uLightMultiplier;\n"
88 // output col = image * light
89 " gl_FragColor = vec4(col.rgb * lighting * uColor.rgb, col.a * uColor.a);\n"
94 std::string fragmentSourceDisplaced(
95 "precision mediump float;\n"
96 "uniform vec3 uLightDirection;\n"
97 "uniform vec3 uAmbientLightColor;\n"
98 "uniform vec3 uDiffuseLightColor;\n"
99 "uniform float uLightMultiplier;\n"
100 "uniform float uState;\n"
101 "uniform float uHightScale;\n"
104 " highp vec4 displacementMap1 = texture2D(sEffect, vec2(vTexCoord.s, vTexCoord.t/2.0));\n"
105 " highp vec4 displacementMap2 = texture2D(sEffect, vec2(vTexCoord.s, 0.5+vTexCoord.t/2.0));\n"
106 " highp vec4 displacementMap = mix(displacementMap1, displacementMap2, uState);\n"
108 " vec3 normalAdjusted = normalize(displacementMap.rgb*2.0-1.0);\n"
109 " float height = uHightScale * (displacementMap.a*2.0 - 1.0);\n"
110 " vec2 displacement = vec2(0.0);\n"
111 " displacement += (vec2(0.5)-vTexCoord.st)*height;\n"
112 " vec2 newCoord = vTexCoord.st + displacement.xy;\n"
114 " vec4 col = texture2D(sTexture, newCoord);\n"
115 // Y-Axis for the normal map is taken as in Y-Down format, So inverting it for GL
116 " float intensity = dot(uLightDirection, vec3(1.0,-1.0, 1.0) * normalAdjusted);"
117 " vec3 lighting = (intensity * uDiffuseLightColor) + uAmbientLightColor;\n"
118 " lighting *= uLightMultiplier;\n"
119 " vec3 color = col.rgb * lighting * uColor.rgb;\n"
120 " gl_FragColor = vec4(color, col.a * uColor.a);\n"
123 //////////////////////////////////////
124 // Create shader effect
132 shader = ShaderEffect::New( "", fragmentSourceDisplaced);
137 shader = ShaderEffect::New( "", fragmentSourceFixed);
140 DisplacementEffect handle( shader );
143 //////////////////////////////////////
144 // Register uniform properties
147 // factors that scale the look, defaults
149 handle.SetLightDirection(DISPLACEMENT_EFFECT_LIGHT_DIRECTION_DEFAULT);
150 handle.SetAmbientLightColorProperty(DISPLACEMENT_EFFECT_AMBIENT_LIGHT_COLOR_DEFAULT);
151 handle.SetDiffuseLightColorProperty(DISPLACEMENT_EFFECT_DIFFUSE_LIGHT_COLOR_DEFAULT);
152 handle.SetLightingMultiplierProperty(DISPLACEMENT_EFFECT_LIGHT_MULTIPLIER_DEFAULT);
153 handle.SetStateProperty(DISPLACEMENT_EFFECT_STATE_DEFAULT);
154 handle.SetHeightScaleProperty(DISPLACEMENT_EFFECT_HEIGHT_SCALE_DEFAULT);
158 handle.SetFixedNormalProperty(DISPLACEMENT_EFFECT_FIXED_NORMAL_DEFAULT);
165 const std::string& DisplacementEffect::GetLightDirectionPropertyName() const
167 return DISPLACEMENT_EFFECT_LIGHT_DIRECTION_PROPERTY_NAME;
170 const std::string& DisplacementEffect::GetAmbientLightColorPropertyName() const
172 return DISPLACEMENT_EFFECT_AMBIENT_LIGHT_COLOR_PROPERTY_NAME;
175 const std::string& DisplacementEffect::GetDiffuseLightColorPropertyName() const
177 return DISPLACEMENT_EFFECT_DIFFUSE_LIGHT_COLOR_PROPERTY_NAME;
180 const std::string& DisplacementEffect::GetLightingMultiplierPropertyName() const
182 return DISPLACEMENT_EFFECT_LIGHT_MULTIPLIER_PROPERTY_NAME;
185 const std::string& DisplacementEffect::GetStatePropertyName() const
187 return DISPLACEMENT_EFFECT_STATE_PROPERTY_NAME;
190 const std::string& DisplacementEffect::GetHeightScalePropertyName() const
192 return DISPLACEMENT_EFFECT_HEIGHT_SCALE_PROPERTY_NAME;
195 const std::string& DisplacementEffect::GetFixedNormalPropertyName() const
197 return DISPLACEMENT_EFFECT_FIXED_NORMAL_PROPERTY_NAME;
200 void DisplacementEffect::SetLightDirection(const Vector3 lightDirection)
202 SetUniform( DISPLACEMENT_EFFECT_LIGHT_DIRECTION_PROPERTY_NAME, lightDirection);
205 void DisplacementEffect::SetAmbientLightColorProperty(const Vector3 ambientLight)
207 SetUniform( DISPLACEMENT_EFFECT_AMBIENT_LIGHT_COLOR_PROPERTY_NAME, ambientLight);
210 void DisplacementEffect::SetDiffuseLightColorProperty(const Vector3 diffuseLight)
212 SetUniform( DISPLACEMENT_EFFECT_DIFFUSE_LIGHT_COLOR_PROPERTY_NAME, diffuseLight);
215 void DisplacementEffect::SetLightingMultiplierProperty(const float lightMultiplier)
217 SetUniform( DISPLACEMENT_EFFECT_LIGHT_MULTIPLIER_PROPERTY_NAME, lightMultiplier);
220 void DisplacementEffect::SetStateProperty(const float state)
222 SetUniform( DISPLACEMENT_EFFECT_STATE_PROPERTY_NAME, state);
225 void DisplacementEffect::SetHeightScaleProperty(const float heightScale)
227 SetUniform( DISPLACEMENT_EFFECT_HEIGHT_SCALE_PROPERTY_NAME, heightScale);
230 void DisplacementEffect::SetFixedNormalProperty(const Vector3 fixedNormal)
232 Vector3 newFixedNormal(fixedNormal);
233 newFixedNormal.Normalize();
235 SetUniform( DISPLACEMENT_EFFECT_FIXED_NORMAL_PROPERTY_NAME, newFixedNormal);