2 * Copyright (c) 2017 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/object/property-map.h>
26 #include <dali/public-api/render-tasks/render-task-list.h>
27 #include <dali/public-api/rendering/renderer.h>
30 #include <dali-toolkit/internal/controls/control/control-renderers.h>
44 const char* EMBOSS_FRAGMENT_SOURCE =
46 "precision highp float;\n"
47 "varying mediump vec2 vTexCoord;\n"
48 "uniform sampler2D sTexture;\n"
49 "uniform vec2 uTexScale;\n"
50 "uniform vec3 uCoefficient;\n"
54 " vec4 color = uCoefficient.x * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
55 " color += uCoefficient.y * texture2D( sTexture, vTexCoord );\n"
56 " color += uCoefficient.z * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
57 " gl_FragColor = color;\n"
61 const char* const COMPOSITE_FRAGMENT_SOURCE =
63 "varying mediump vec2 vTexCoord;\n"
64 "uniform sampler2D sTexture;\n"
65 "uniform lowp vec4 uEffectColor;\n"
68 " gl_FragColor = uEffectColor;\n"
69 " gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
73 const char* const TEX_SCALE_UNIFORM_NAME( "uTexScale" );
74 const char* const COEFFICIENT_UNIFORM_NAME( "uCoefficient" );
75 const char* const COLOR_UNIFORM_NAME( "uEffectColor" );
79 EmbossFilter::EmbossFilter()
84 EmbossFilter::~EmbossFilter()
88 void EmbossFilter::Enable()
90 mFrameBufferForEmboss1 = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
91 Texture texture1 = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
92 mFrameBufferForEmboss1.AttachColorTexture( texture1 );
94 mFrameBufferForEmboss2 = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
95 Texture texture2 = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
96 mFrameBufferForEmboss2.AttachColorTexture( texture2 );
98 // create actor to render input with applied emboss effect
99 mActorForInput1 = Actor::New();
100 mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
101 mActorForInput1.SetSize(mTargetSize);
102 Vector2 textureScale( 1.5f/mTargetSize.width, 1.5f/mTargetSize.height);
103 mActorForInput1.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
104 mActorForInput1.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( 2.f, -1.f, -1.f ) );
105 // set EMBOSS custom shader
106 Renderer renderer1 = CreateRenderer( BASIC_VERTEX_SOURCE, EMBOSS_FRAGMENT_SOURCE );
107 SetRendererTexture( renderer1, mInputTexture );
108 mActorForInput1.AddRenderer( renderer1 );
109 mRootActor.Add( mActorForInput1 );
111 mActorForInput2 = Actor::New();
112 mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
113 mActorForInput2.SetSize(mTargetSize);
114 mActorForInput2.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
115 mActorForInput2.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( -1.f, -1.f, 2.f ) );
116 // set EMBOSS custom shader
117 Renderer renderer2 = CreateRenderer( BASIC_VERTEX_SOURCE, EMBOSS_FRAGMENT_SOURCE );
118 SetRendererTexture( renderer2, mInputTexture );
119 mActorForInput2.AddRenderer( renderer2 );
120 mRootActor.Add( mActorForInput2 );
122 mActorForComposite = Actor::New();
123 mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
124 mActorForComposite.SetSize(mTargetSize);
125 mActorForComposite.SetColor( Color::BLACK );
127 mRootActor.Add( mActorForComposite );
129 mRendererForEmboss1 = CreateRenderer( BASIC_VERTEX_SOURCE, COMPOSITE_FRAGMENT_SOURCE );
130 SetRendererTexture( mRendererForEmboss1, mFrameBufferForEmboss1 );
131 mRendererForEmboss1.RegisterProperty( COLOR_UNIFORM_NAME, Color::BLACK );
132 mActorForComposite.AddRenderer( mRendererForEmboss1 );
134 mRendererForEmboss2 = CreateRenderer( BASIC_VERTEX_SOURCE, COMPOSITE_FRAGMENT_SOURCE );
135 SetRendererTexture( mRendererForEmboss2, mFrameBufferForEmboss2 );
136 mRendererForEmboss2.RegisterProperty( COLOR_UNIFORM_NAME, Color::WHITE );
137 mActorForComposite.AddRenderer( mRendererForEmboss2 );
143 void EmbossFilter::Disable()
149 mRootActor.Remove( mCameraActor );
150 mCameraActor.Reset();
153 if( mActorForInput1 )
155 mRootActor.Remove( mActorForInput1 );
156 mActorForInput1.Reset();
159 if( mActorForInput2 )
161 mRootActor.Remove( mActorForInput2 );
162 mActorForInput2.Reset();
165 if( mActorForComposite )
167 mActorForComposite.RemoveRenderer( mRendererForEmboss1 );
168 mRendererForEmboss1.Reset();
170 mActorForComposite.RemoveRenderer( mRendererForEmboss2 );
171 mRendererForEmboss2.Reset();
173 mRootActor.Remove( mActorForComposite );
174 mActorForComposite.Reset();
177 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
178 if( mRenderTaskForEmboss1 )
180 taskList.RemoveTask(mRenderTaskForEmboss1);
183 if( mRenderTaskForEmboss2 )
185 taskList.RemoveTask(mRenderTaskForEmboss2);
188 if( mRenderTaskForOutput )
190 taskList.RemoveTask( mRenderTaskForOutput );
197 void EmbossFilter::Refresh()
199 if( mRenderTaskForEmboss1 )
201 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
203 if( mRenderTaskForEmboss2 )
205 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
209 void EmbossFilter::SetSize( const Vector2& size )
212 if( mActorForInput1 )
214 mActorForInput1.SetSize(mTargetSize);
216 if( mActorForInput2 )
218 mActorForInput2.SetSize(mTargetSize);
220 if( mActorForComposite )
222 mActorForComposite.SetSize(mTargetSize);
226 void EmbossFilter::CreateRenderTasks()
228 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
230 mRenderTaskForEmboss1 = taskList.CreateTask();
231 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
232 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
233 mRenderTaskForEmboss1.SetExclusive(true);
234 mRenderTaskForEmboss1.SetInputEnabled( false );
235 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
236 mRenderTaskForEmboss1.SetClearEnabled( true );
237 mRenderTaskForEmboss1.SetFrameBuffer( mFrameBufferForEmboss1 );
238 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
240 mRenderTaskForEmboss2 = taskList.CreateTask();
241 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
242 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
243 mRenderTaskForEmboss2.SetExclusive(true);
244 mRenderTaskForEmboss2.SetInputEnabled( false );
245 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
246 mRenderTaskForEmboss2.SetClearEnabled( true );
247 mRenderTaskForEmboss2.SetFrameBuffer( mFrameBufferForEmboss2 );
248 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
250 mRenderTaskForOutput = taskList.CreateTask();
251 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
252 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
253 mRenderTaskForOutput.SetExclusive(true);
254 mRenderTaskForOutput.SetInputEnabled( false );
255 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
256 mRenderTaskForOutput.SetClearEnabled( true );
257 mRenderTaskForOutput.SetFrameBuffer( mOutputFrameBuffer );
258 mRenderTaskForOutput.SetCameraActor( mCameraActor );
261 } // namespace Internal
263 } // namespace Toolkit