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"
38 const float ARBITRARY_FIELD_OF_VIEW = Math::PI / 4.0f;
40 const char* EMBOSS_FRAGMENT_SOURCE1 =
42 "uniform vec2 uTexScale;\n"
47 "# ifdef DEBUG_RENDER\n"
48 " if( vTexCoord.s < 0.495 )\n"
50 "# endif //def DEBUG_RENDER\n"
51 " color = 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
52 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
53 " color += -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
54 "# ifdef DEBUG_RENDER\n"
56 " else if( vTexCoord.s > 0.505 )\n"
58 " color = texture2D( sTexture, vTexCoord );\n"
62 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
64 "# endif //def DEBUG_RENDER\n"
65 " gl_FragColor = uColor * color;\n"
69 const char* EMBOSS_FRAGMENT_SOURCE2 =
71 "uniform vec2 uTexScale;\n"
76 "# ifdef DEBUG_RENDER\n"
77 " if( vTexCoord.s < 0.495 )\n"
79 "# endif //def DEBUG_RENDER\n"
80 " color = -1.0 * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
81 " color += -1.0 * texture2D( sTexture, vTexCoord );\n"
82 " color += 2.0 * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
83 "# ifdef DEBUG_RENDER\n"
85 " else if( vTexCoord.s > 0.505 )\n"
87 " color = texture2D( sTexture, vTexCoord );\n"
91 " color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
93 "# endif //def DEBUG_RENDER\n"
94 " gl_FragColor = uColor * color;\n"
98 const char* const COMPOSITE_FRAGMENT_SOURCE =
101 " gl_FragColor = uColor;\n"
102 " gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
107 EmbossFilter::EmbossFilter()
112 EmbossFilter::~EmbossFilter()
116 void EmbossFilter::Enable()
119 mCameraActor = CameraActor::New();
120 mCameraActor.SetParentOrigin(ParentOrigin::CENTER);
122 mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::Unused );
123 mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::Unused );
125 // create actor to render input with applied emboss effect
126 mActorForInput1 = ImageActor::New( mInputImage );
127 mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
128 mActorForInput1.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
129 mActorForInput1.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
130 mActorForInput1.SetColor( Color::WHITE );
132 mActorForInput2 = ImageActor::New( mInputImage );
133 mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
134 mActorForInput2.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
135 mActorForInput2.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
136 mActorForInput2.SetColor( Color::WHITE );
138 mActorForEmboss1 = ImageActor::New( mImageForEmboss1 );
139 mActorForEmboss1.SetParentOrigin( ParentOrigin::CENTER );
140 mActorForEmboss1.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
141 mActorForEmboss1.SetColor( Color::BLACK );
142 mActorForEmboss1.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
144 mActorForEmboss2 = ImageActor::New( mImageForEmboss2 );
145 mActorForEmboss2.SetParentOrigin( ParentOrigin::CENTER );
146 mActorForEmboss2.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
147 mActorForEmboss2.SetColor( Color::WHITE );
148 mActorForEmboss2.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) );
150 mActorForComposite = Actor::New();
151 mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
152 mActorForComposite.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
153 mActorForComposite.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
155 // create custom shader effect
156 std::ostringstream embossFragmentSource1;
159 embossFragmentSource1 << "#define DEBUG_RENDER\n";
161 embossFragmentSource1 << EMBOSS_FRAGMENT_SOURCE1;
162 ShaderEffect effect1 = ShaderEffect::New( "", embossFragmentSource1.str() );
163 mActorForInput1.SetShaderEffect( effect1 );
164 effect1.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
166 std::ostringstream embossFragmentSource2;
169 embossFragmentSource2 << "#define DEBUG_RENDER\n";
171 embossFragmentSource2 << EMBOSS_FRAGMENT_SOURCE2;
172 ShaderEffect effect2 = ShaderEffect::New( "", embossFragmentSource2.str() );
173 mActorForInput2.SetShaderEffect( effect2 );
174 effect2.SetUniform( "uTexScale", Vector2( 1.0f/mTargetSize.width, 1.0f/mTargetSize.height) * 1.5f );
179 mRootActor.Add( mActorForInput1 );
180 mRootActor.Add( mActorForInput2 );
181 mRootActor.Add( mActorForComposite );
182 mActorForComposite.Add( mActorForEmboss1 );
183 mActorForComposite.Add( mActorForEmboss2 );
184 mRootActor.Add( mCameraActor );
187 void EmbossFilter::Disable()
193 mRootActor.Remove( mCameraActor );
194 mCameraActor.Reset();
197 if( mActorForInput1 )
199 mRootActor.Remove( mActorForInput1 );
200 mActorForInput1.Reset();
203 if( mActorForInput2 )
205 mRootActor.Remove( mActorForInput2 );
206 mActorForInput2.Reset();
209 if( mActorForComposite )
211 mRootActor.Remove( mActorForComposite );
212 mActorForComposite.Reset();
213 mActorForEmboss1.Reset();
214 mActorForEmboss2.Reset();
217 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
218 if( mRenderTaskForEmboss1 )
220 taskList.RemoveTask(mRenderTaskForEmboss1);
223 if( mRenderTaskForEmboss2 )
225 taskList.RemoveTask(mRenderTaskForEmboss2);
232 void EmbossFilter::Refresh()
234 if( mRenderTaskForEmboss1 )
236 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
238 if( mRenderTaskForEmboss2 )
240 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
244 void EmbossFilter::SetupCamera()
246 // Create and place a camera for the embossing render, corresponding to its render target size
247 mCameraActor.SetFieldOfView(ARBITRARY_FIELD_OF_VIEW);
248 mCameraActor.SetNearClippingPlane(1.0f);
249 mCameraActor.SetAspectRatio(mTargetSize.width / mTargetSize.height);
250 mCameraActor.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
251 mCameraActor.SetRotation(Quaternion(M_PI, Vector3::YAXIS));
252 mCameraActor.SetPosition(0.0f, 0.0f, ((mTargetSize.height * 0.5f) / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f)));
255 void EmbossFilter::CreateRenderTasks()
257 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
259 mRenderTaskForEmboss1 = taskList.CreateTask();
260 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
261 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
262 mRenderTaskForEmboss1.SetExclusive(true);
263 mRenderTaskForEmboss1.SetInputEnabled( false );
264 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
265 mRenderTaskForEmboss1.SetClearEnabled( true );
266 mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
267 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
269 mRenderTaskForEmboss2 = taskList.CreateTask();
270 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
271 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
272 mRenderTaskForEmboss2.SetExclusive(true);
273 mRenderTaskForEmboss2.SetInputEnabled( false );
274 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
275 mRenderTaskForEmboss2.SetClearEnabled( true );
276 mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
277 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
279 mRenderTaskForOutput = taskList.CreateTask();
280 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
281 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
282 mRenderTaskForOutput.SetExclusive(true);
283 mRenderTaskForOutput.SetInputEnabled( false );
284 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
285 mRenderTaskForOutput.SetClearEnabled( true );
286 mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
287 mRenderTaskForOutput.SetCameraActor( mCameraActor );
290 } // namespace Internal
292 } // namespace Toolkit