2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 // http://floralicense.org/license/
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 "emboss-filter.h"
37 const float ARBITRARY_FIELD_OF_VIEW = Math::PI / 4.0f;
39 const char* EMBOSS_FRAGMENT_SOURCE1 =
41 "uniform vec2 uTexScale;\n"
46 "# ifdef DEBUG_RENDER\n"
47 " if( vTexCoord.s < 0.495 )\n"
49 "# endif //def DEBUG_RENDER\n"
50 " color = 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
51 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
52 " color += -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
53 "# ifdef DEBUG_RENDER\n"
55 " else if( vTexCoord.s > 0.505 )\n"
57 " color = texture2D( sTexture, vTexCoord );\n"
61 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
63 "# endif //def DEBUG_RENDER\n"
64 " gl_FragColor = uColor * color;\n"
68 const char* EMBOSS_FRAGMENT_SOURCE2 =
70 "uniform vec2 uTexScale;\n"
75 "# ifdef DEBUG_RENDER\n"
76 " if( vTexCoord.s < 0.495 )\n"
78 "# endif //def DEBUG_RENDER\n"
79 " color = -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
80 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
81 " color += 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
82 "# ifdef DEBUG_RENDER\n"
84 " else if( vTexCoord.s > 0.505 )\n"
86 " color = texture2D( sTexture, vTexCoord );\n"
90 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
92 "# endif //def DEBUG_RENDER\n"
93 " gl_FragColor = uColor * color;\n"
97 const char* const COMPOSITE_FRAGMENT_SOURCE =
100 " gl_FragColor = uColor;\n"
101 " gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
106 EmbossFilter::EmbossFilter()
111 EmbossFilter::~EmbossFilter()
115 void EmbossFilter::Enable()
118 mCameraActor = CameraActor::New();
119 mCameraActor.SetParentOrigin(ParentOrigin::CENTER);
121 mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::Unused );
122 mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::Unused );
124 // create actor to render input with applied emboss effect
125 mActorForInput1 = ImageActor::New( mInputImage );
126 mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
127 mActorForInput1.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
128 mActorForInput1.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
129 mActorForInput1.SetColor( Color::WHITE );
131 mActorForInput2 = ImageActor::New( mInputImage );
132 mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
133 mActorForInput2.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
134 mActorForInput2.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
135 mActorForInput2.SetColor( Color::WHITE );
137 mActorForEmboss1 = ImageActor::New( mImageForEmboss1 );
138 mActorForEmboss1.SetParentOrigin( ParentOrigin::CENTER );
139 mActorForEmboss1.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
140 mActorForEmboss1.SetColor( Color::BLACK );
141 mActorForEmboss1.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
143 mActorForEmboss2 = ImageActor::New( mImageForEmboss2 );
144 mActorForEmboss2.SetParentOrigin( ParentOrigin::CENTER );
145 mActorForEmboss2.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
146 mActorForEmboss2.SetColor( Color::WHITE );
147 mActorForEmboss2.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
149 mActorForComposite = Actor::New();
150 mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
151 mActorForComposite.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
152 mActorForComposite.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
154 // create custom shader effect
155 std::ostringstream embossFragmentSource1;
158 embossFragmentSource1 << "#define DEBUG_RENDER\n";
160 embossFragmentSource1 << EMBOSS_FRAGMENT_SOURCE1;
161 ShaderEffect effect1 = ShaderEffect::New( "", embossFragmentSource1.str() );
162 mActorForInput1.SetShaderEffect( effect1 );
163 effect1.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
165 std::ostringstream embossFragmentSource2;
168 embossFragmentSource2 << "#define DEBUG_RENDER\n";
170 embossFragmentSource2 << EMBOSS_FRAGMENT_SOURCE2;
171 ShaderEffect effect2 = ShaderEffect::New( "", embossFragmentSource2.str() );
172 mActorForInput2.SetShaderEffect( effect2 );
173 effect2.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
178 mRootActor.Add( mActorForInput1 );
179 mRootActor.Add( mActorForInput2 );
180 mRootActor.Add( mActorForComposite );
181 mActorForComposite.Add( mActorForEmboss1 );
182 mActorForComposite.Add( mActorForEmboss2 );
183 mRootActor.Add( mCameraActor );
186 void EmbossFilter::Disable()
192 mRootActor.Remove( mCameraActor );
193 mCameraActor.Reset();
196 if( mActorForInput1 )
198 mRootActor.Remove( mActorForInput1 );
199 mActorForInput1.Reset();
202 if( mActorForInput2 )
204 mRootActor.Remove( mActorForInput2 );
205 mActorForInput2.Reset();
208 if( mActorForComposite )
210 mRootActor.Remove( mActorForComposite );
211 mActorForComposite.Reset();
212 mActorForEmboss1.Reset();
213 mActorForEmboss2.Reset();
216 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
217 if( mRenderTaskForEmboss1 )
219 taskList.RemoveTask(mRenderTaskForEmboss1);
222 if( mRenderTaskForEmboss2 )
224 taskList.RemoveTask(mRenderTaskForEmboss2);
231 void EmbossFilter::Refresh()
233 if( mRenderTaskForEmboss1 )
235 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
237 if( mRenderTaskForEmboss2 )
239 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
243 void EmbossFilter::SetupCamera()
245 // Create and place a camera for the embossing render, corresponding to its render target size
246 mCameraActor.SetFieldOfView(ARBITRARY_FIELD_OF_VIEW);
247 mCameraActor.SetNearClippingPlane(1.0f);
248 mCameraActor.SetAspectRatio(mTargetSize.width / mTargetSize.height);
249 mCameraActor.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
250 mCameraActor.SetRotation(Quaternion(M_PI, Vector3::YAXIS));
251 mCameraActor.SetPosition(0.0f, 0.0f, ((mTargetSize.height * 0.5f) / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f)));
254 void EmbossFilter::CreateRenderTasks()
256 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
258 mRenderTaskForEmboss1 = taskList.CreateTask();
259 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
260 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
261 mRenderTaskForEmboss1.SetExclusive(true);
262 mRenderTaskForEmboss1.SetInputEnabled( false );
263 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
264 mRenderTaskForEmboss1.SetClearEnabled( true );
265 mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
266 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
268 mRenderTaskForEmboss2 = taskList.CreateTask();
269 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
270 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
271 mRenderTaskForEmboss2.SetExclusive(true);
272 mRenderTaskForEmboss2.SetInputEnabled( false );
273 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
274 mRenderTaskForEmboss2.SetClearEnabled( true );
275 mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
276 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
278 mRenderTaskForOutput = taskList.CreateTask();
279 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
280 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
281 mRenderTaskForOutput.SetExclusive(true);
282 mRenderTaskForOutput.SetInputEnabled( false );
283 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
284 mRenderTaskForOutput.SetClearEnabled( true );
285 mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
286 mRenderTaskForOutput.SetCameraActor( mCameraActor );
289 } // namespace Internal
291 } // namespace Toolkit