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 "uniform vec2 uTexScale;\n"
51 "# ifdef DEBUG_RENDER\n"
52 " if( vTexCoord.s < 0.495 )\n"
54 "# endif //def DEBUG_RENDER\n"
55 " color = 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
56 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
57 " color += -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
58 "# ifdef DEBUG_RENDER\n"
60 " else if( vTexCoord.s > 0.505 )\n"
62 " color = texture2D( sTexture, vTexCoord );\n"
66 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
68 "# endif //def DEBUG_RENDER\n"
69 " gl_FragColor = uColor * color;\n"
73 const char* EMBOSS_FRAGMENT_SOURCE2 =
75 "uniform vec2 uTexScale;\n"
80 "# ifdef DEBUG_RENDER\n"
81 " if( vTexCoord.s < 0.495 )\n"
83 "# endif //def DEBUG_RENDER\n"
84 " color = -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
85 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
86 " color += 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
87 "# ifdef DEBUG_RENDER\n"
89 " else if( vTexCoord.s > 0.505 )\n"
91 " color = texture2D( sTexture, vTexCoord );\n"
95 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
97 "# endif //def DEBUG_RENDER\n"
98 " gl_FragColor = uColor * color;\n"
102 const char* const COMPOSITE_FRAGMENT_SOURCE =
105 " gl_FragColor = uColor;\n"
106 " gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
111 EmbossFilter::EmbossFilter()
116 EmbossFilter::~EmbossFilter()
120 void EmbossFilter::Enable()
123 mCameraActor = CameraActor::New();
124 mCameraActor.SetParentOrigin(ParentOrigin::CENTER);
126 mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::Unused );
127 mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::Unused );
129 // create actor to render input with applied emboss effect
130 mActorForInput1 = ImageActor::New( mInputImage );
131 mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
132 mActorForInput1.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
133 mActorForInput1.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
134 mActorForInput1.SetColor( Color::WHITE );
136 mActorForInput2 = ImageActor::New( mInputImage );
137 mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
138 mActorForInput2.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
139 mActorForInput2.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
140 mActorForInput2.SetColor( Color::WHITE );
142 mActorForEmboss1 = ImageActor::New( mImageForEmboss1 );
143 mActorForEmboss1.SetParentOrigin( ParentOrigin::CENTER );
144 mActorForEmboss1.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
145 mActorForEmboss1.SetColor( Color::BLACK );
146 mActorForEmboss1.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
148 mActorForEmboss2 = ImageActor::New( mImageForEmboss2 );
149 mActorForEmboss2.SetParentOrigin( ParentOrigin::CENTER );
150 mActorForEmboss2.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
151 mActorForEmboss2.SetColor( Color::WHITE );
152 mActorForEmboss2.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
154 mActorForComposite = Actor::New();
155 mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
156 mActorForComposite.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
157 mActorForComposite.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
159 // create custom shader effect
160 std::ostringstream embossFragmentSource1;
163 embossFragmentSource1 << "#define DEBUG_RENDER\n";
165 embossFragmentSource1 << EMBOSS_FRAGMENT_SOURCE1;
166 ShaderEffect effect1 = ShaderEffect::New( "", embossFragmentSource1.str() );
167 mActorForInput1.SetShaderEffect( effect1 );
168 effect1.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
170 std::ostringstream embossFragmentSource2;
173 embossFragmentSource2 << "#define DEBUG_RENDER\n";
175 embossFragmentSource2 << EMBOSS_FRAGMENT_SOURCE2;
176 ShaderEffect effect2 = ShaderEffect::New( "", embossFragmentSource2.str() );
177 mActorForInput2.SetShaderEffect( effect2 );
178 effect2.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
183 mRootActor.Add( mActorForInput1 );
184 mRootActor.Add( mActorForInput2 );
185 mRootActor.Add( mActorForComposite );
186 mActorForComposite.Add( mActorForEmboss1 );
187 mActorForComposite.Add( mActorForEmboss2 );
188 mRootActor.Add( mCameraActor );
191 void EmbossFilter::Disable()
197 mRootActor.Remove( mCameraActor );
198 mCameraActor.Reset();
201 if( mActorForInput1 )
203 mRootActor.Remove( mActorForInput1 );
204 mActorForInput1.Reset();
207 if( mActorForInput2 )
209 mRootActor.Remove( mActorForInput2 );
210 mActorForInput2.Reset();
213 if( mActorForComposite )
215 mRootActor.Remove( mActorForComposite );
216 mActorForComposite.Reset();
217 mActorForEmboss1.Reset();
218 mActorForEmboss2.Reset();
221 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
222 if( mRenderTaskForEmboss1 )
224 taskList.RemoveTask(mRenderTaskForEmboss1);
227 if( mRenderTaskForEmboss2 )
229 taskList.RemoveTask(mRenderTaskForEmboss2);
236 void EmbossFilter::Refresh()
238 if( mRenderTaskForEmboss1 )
240 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
242 if( mRenderTaskForEmboss2 )
244 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
248 void EmbossFilter::SetupCamera()
250 // Create and place a camera for the embossing render, corresponding to its render target size
251 mCameraActor.SetFieldOfView(ARBITRARY_FIELD_OF_VIEW);
252 mCameraActor.SetNearClippingPlane(1.0f);
253 mCameraActor.SetAspectRatio(mTargetSize.width / mTargetSize.height);
254 mCameraActor.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
255 mCameraActor.SetRotation(Quaternion(M_PI, Vector3::YAXIS));
256 mCameraActor.SetPosition(0.0f, 0.0f, ((mTargetSize.height * 0.5f) / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f)));
259 void EmbossFilter::CreateRenderTasks()
261 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
263 mRenderTaskForEmboss1 = taskList.CreateTask();
264 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
265 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
266 mRenderTaskForEmboss1.SetExclusive(true);
267 mRenderTaskForEmboss1.SetInputEnabled( false );
268 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
269 mRenderTaskForEmboss1.SetClearEnabled( true );
270 mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
271 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
273 mRenderTaskForEmboss2 = taskList.CreateTask();
274 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
275 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
276 mRenderTaskForEmboss2.SetExclusive(true);
277 mRenderTaskForEmboss2.SetInputEnabled( false );
278 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
279 mRenderTaskForEmboss2.SetClearEnabled( true );
280 mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
281 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
283 mRenderTaskForOutput = taskList.CreateTask();
284 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
285 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
286 mRenderTaskForOutput.SetExclusive(true);
287 mRenderTaskForOutput.SetInputEnabled( false );
288 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
289 mRenderTaskForOutput.SetClearEnabled( true );
290 mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
291 mRenderTaskForOutput.SetCameraActor( mCameraActor );
294 } // namespace Internal
296 } // namespace Toolkit