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.
19 #include "emboss-filter.h"
23 #include <dali/public-api/animation/constraints.h>
24 #include <dali/public-api/common/stage.h>
25 #include <dali/public-api/render-tasks/render-task-list.h>
26 #include <dali/public-api/shader-effects/shader-effect.h>
42 const float ARBITRARY_FIELD_OF_VIEW = Math::PI / 4.0f;
44 const char* EMBOSS_FRAGMENT_SOURCE1 =
46 "precision highp float;\n"
47 "uniform vec2 uTexScale;\n"
52 "# ifdef DEBUG_RENDER\n"
53 " if( vTexCoord.s < 0.495 )\n"
55 "# endif //def DEBUG_RENDER\n"
56 " color = 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
57 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
58 " color += -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
59 "# ifdef DEBUG_RENDER\n"
61 " else if( vTexCoord.s > 0.505 )\n"
63 " color = texture2D( sTexture, vTexCoord );\n"
67 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
69 "# endif //def DEBUG_RENDER\n"
70 " gl_FragColor = uColor * color;\n"
74 const char* EMBOSS_FRAGMENT_SOURCE2 =
76 "precision highp float;\n"
77 "uniform vec2 uTexScale;\n"
82 "# ifdef DEBUG_RENDER\n"
83 " if( vTexCoord.s < 0.495 )\n"
85 "# endif //def DEBUG_RENDER\n"
86 " color = -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
87 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
88 " color += 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
89 "# ifdef DEBUG_RENDER\n"
91 " else if( vTexCoord.s > 0.505 )\n"
93 " color = texture2D( sTexture, vTexCoord );\n"
97 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
99 "# endif //def DEBUG_RENDER\n"
100 " gl_FragColor = uColor * color;\n"
104 const char* const COMPOSITE_FRAGMENT_SOURCE =
107 " gl_FragColor = uColor;\n"
108 " gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
113 EmbossFilter::EmbossFilter()
118 EmbossFilter::~EmbossFilter()
122 void EmbossFilter::Enable()
125 mCameraActor = CameraActor::New();
126 mCameraActor.SetParentOrigin(ParentOrigin::CENTER);
128 mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
129 mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
131 // create actor to render input with applied emboss effect
132 mActorForInput1 = ImageActor::New( mInputImage );
133 mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
134 mActorForInput1.SetSize(mTargetSize);
135 mActorForInput1.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
136 mActorForInput1.SetColor( Color::WHITE );
138 mActorForInput2 = ImageActor::New( mInputImage );
139 mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
140 mActorForInput2.SetSize(mTargetSize);
141 mActorForInput2.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
142 mActorForInput2.SetColor( Color::WHITE );
144 mActorForEmboss1 = ImageActor::New( mImageForEmboss1 );
145 mActorForEmboss1.SetParentOrigin( ParentOrigin::CENTER );
146 mActorForEmboss1.SetSize(mTargetSize);
147 mActorForEmboss1.SetColor( Color::BLACK );
148 mActorForEmboss1.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
150 mActorForEmboss2 = ImageActor::New( mImageForEmboss2 );
151 mActorForEmboss2.SetParentOrigin( ParentOrigin::CENTER );
152 mActorForEmboss2.SetSize(mTargetSize);
153 mActorForEmboss2.SetColor( Color::WHITE );
154 mActorForEmboss2.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
156 mActorForComposite = Actor::New();
157 mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
158 mActorForComposite.SetSize(mTargetSize);
159 mActorForComposite.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
161 // create custom shader effect
162 std::ostringstream embossFragmentSource1;
165 embossFragmentSource1 << "#define DEBUG_RENDER\n";
167 embossFragmentSource1 << EMBOSS_FRAGMENT_SOURCE1;
168 ShaderEffect effect1 = ShaderEffect::New( "", embossFragmentSource1.str() );
169 mActorForInput1.SetShaderEffect( effect1 );
170 effect1.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
172 std::ostringstream embossFragmentSource2;
175 embossFragmentSource2 << "#define DEBUG_RENDER\n";
177 embossFragmentSource2 << EMBOSS_FRAGMENT_SOURCE2;
178 ShaderEffect effect2 = ShaderEffect::New( "", embossFragmentSource2.str() );
179 mActorForInput2.SetShaderEffect( effect2 );
180 effect2.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
185 mRootActor.Add( mActorForInput1 );
186 mRootActor.Add( mActorForInput2 );
187 mRootActor.Add( mActorForComposite );
188 mActorForComposite.Add( mActorForEmboss1 );
189 mActorForComposite.Add( mActorForEmboss2 );
190 mRootActor.Add( mCameraActor );
193 void EmbossFilter::Disable()
199 mRootActor.Remove( mCameraActor );
200 mCameraActor.Reset();
203 if( mActorForInput1 )
205 mRootActor.Remove( mActorForInput1 );
206 mActorForInput1.Reset();
209 if( mActorForInput2 )
211 mRootActor.Remove( mActorForInput2 );
212 mActorForInput2.Reset();
215 if( mActorForComposite )
217 mRootActor.Remove( mActorForComposite );
218 mActorForComposite.Reset();
219 mActorForEmboss1.Reset();
220 mActorForEmboss2.Reset();
223 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
224 if( mRenderTaskForEmboss1 )
226 taskList.RemoveTask(mRenderTaskForEmboss1);
229 if( mRenderTaskForEmboss2 )
231 taskList.RemoveTask(mRenderTaskForEmboss2);
238 void EmbossFilter::Refresh()
240 if( mRenderTaskForEmboss1 )
242 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
244 if( mRenderTaskForEmboss2 )
246 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
250 void EmbossFilter::SetSize( const Vector2& size )
253 if( mActorForInput1 )
255 mActorForInput1.SetSize(mTargetSize);
257 if( mActorForInput2 )
259 mActorForInput2.SetSize(mTargetSize);
261 if( mActorForEmboss1 )
263 mActorForEmboss1.SetSize(mTargetSize);
265 if( mActorForEmboss2 )
267 mActorForEmboss2.SetSize(mTargetSize);
269 if( mActorForComposite )
271 mActorForComposite.SetSize(mTargetSize);
275 void EmbossFilter::SetupCamera()
277 // Create and place a camera for the embossing render, corresponding to its render target size
278 mCameraActor.SetFieldOfView(ARBITRARY_FIELD_OF_VIEW);
279 mCameraActor.SetNearClippingPlane(1.0f);
280 mCameraActor.SetAspectRatio(mTargetSize.width / mTargetSize.height);
281 mCameraActor.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
282 mCameraActor.SetRotation(Quaternion(M_PI, Vector3::YAXIS));
283 mCameraActor.SetPosition(0.0f, 0.0f, ((mTargetSize.height * 0.5f) / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f)));
286 void EmbossFilter::CreateRenderTasks()
288 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
290 mRenderTaskForEmboss1 = taskList.CreateTask();
291 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
292 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
293 mRenderTaskForEmboss1.SetExclusive(true);
294 mRenderTaskForEmboss1.SetInputEnabled( false );
295 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
296 mRenderTaskForEmboss1.SetClearEnabled( true );
297 mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
298 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
300 mRenderTaskForEmboss2 = taskList.CreateTask();
301 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
302 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
303 mRenderTaskForEmboss2.SetExclusive(true);
304 mRenderTaskForEmboss2.SetInputEnabled( false );
305 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
306 mRenderTaskForEmboss2.SetClearEnabled( true );
307 mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
308 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
310 mRenderTaskForOutput = taskList.CreateTask();
311 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
312 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
313 mRenderTaskForOutput.SetExclusive(true);
314 mRenderTaskForOutput.SetInputEnabled( false );
315 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
316 mRenderTaskForOutput.SetClearEnabled( true );
317 mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
318 mRenderTaskForOutput.SetCameraActor( mCameraActor );
321 } // namespace Internal
323 } // namespace Toolkit