2 * Copyright (c) 2020 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/devel-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>
31 #include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
45 const char* const TEX_SCALE_UNIFORM_NAME( "uTexScale" );
46 const char* const COEFFICIENT_UNIFORM_NAME( "uCoefficient" );
47 const char* const COLOR_UNIFORM_NAME( "uEffectColor" );
51 EmbossFilter::EmbossFilter()
56 EmbossFilter::~EmbossFilter()
60 void EmbossFilter::Enable()
62 mFrameBufferForEmboss1 = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
63 Texture texture1 = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
64 mFrameBufferForEmboss1.AttachColorTexture( texture1 );
66 mFrameBufferForEmboss2 = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
67 Texture texture2 = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
68 mFrameBufferForEmboss2.AttachColorTexture( texture2 );
70 // create actor to render input with applied emboss effect
71 mActorForInput1 = Actor::New();
72 mActorForInput1.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
73 mActorForInput1.SetProperty( Actor::Property::SIZE, mTargetSize);
74 Vector2 textureScale( 1.5f/mTargetSize.width, 1.5f/mTargetSize.height);
75 mActorForInput1.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
76 mActorForInput1.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( 2.f, -1.f, -1.f ) );
77 // set EMBOSS custom shader
78 Renderer renderer1 = CreateRenderer( BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_SHADER_FRAG );
79 SetRendererTexture( renderer1, mInputTexture );
80 mActorForInput1.AddRenderer( renderer1 );
81 mRootActor.Add( mActorForInput1 );
83 mActorForInput2 = Actor::New();
84 mActorForInput2.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
85 mActorForInput2.SetProperty( Actor::Property::SIZE, mTargetSize);
86 mActorForInput2.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
87 mActorForInput2.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( -1.f, -1.f, 2.f ) );
88 // set EMBOSS custom shader
89 Renderer renderer2 = CreateRenderer( BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_SHADER_FRAG );
90 SetRendererTexture( renderer2, mInputTexture );
91 mActorForInput2.AddRenderer( renderer2 );
92 mRootActor.Add( mActorForInput2 );
94 mActorForComposite = Actor::New();
95 mActorForComposite.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
96 mActorForComposite.SetProperty( Actor::Property::SIZE, mTargetSize);
97 mActorForComposite.SetProperty( Actor::Property::COLOR, Color::BLACK );
99 mRootActor.Add( mActorForComposite );
101 mRendererForEmboss1 = CreateRenderer( BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_COMPOSITE_SHADER_FRAG );
102 SetRendererTexture( mRendererForEmboss1, mFrameBufferForEmboss1 );
103 mRendererForEmboss1.RegisterProperty( COLOR_UNIFORM_NAME, Color::BLACK );
104 mActorForComposite.AddRenderer( mRendererForEmboss1 );
106 mRendererForEmboss2 = CreateRenderer( BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_COMPOSITE_SHADER_FRAG );
107 SetRendererTexture( mRendererForEmboss2, mFrameBufferForEmboss2 );
108 mRendererForEmboss2.RegisterProperty( COLOR_UNIFORM_NAME, Color::WHITE );
109 mActorForComposite.AddRenderer( mRendererForEmboss2 );
115 void EmbossFilter::Disable()
121 mRootActor.Remove( mCameraActor );
122 mCameraActor.Reset();
125 if( mActorForInput1 )
127 mRootActor.Remove( mActorForInput1 );
128 mActorForInput1.Reset();
131 if( mActorForInput2 )
133 mRootActor.Remove( mActorForInput2 );
134 mActorForInput2.Reset();
137 if( mActorForComposite )
139 mActorForComposite.RemoveRenderer( mRendererForEmboss1 );
140 mRendererForEmboss1.Reset();
142 mActorForComposite.RemoveRenderer( mRendererForEmboss2 );
143 mRendererForEmboss2.Reset();
145 mRootActor.Remove( mActorForComposite );
146 mActorForComposite.Reset();
149 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
150 if( mRenderTaskForEmboss1 )
152 taskList.RemoveTask(mRenderTaskForEmboss1);
155 if( mRenderTaskForEmboss2 )
157 taskList.RemoveTask(mRenderTaskForEmboss2);
160 if( mRenderTaskForOutput )
162 taskList.RemoveTask( mRenderTaskForOutput );
169 void EmbossFilter::Refresh()
171 if( mRenderTaskForEmboss1 )
173 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
175 if( mRenderTaskForEmboss2 )
177 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
181 void EmbossFilter::SetSize( const Vector2& size )
184 if( mActorForInput1 )
186 mActorForInput1.SetProperty( Actor::Property::SIZE, mTargetSize);
188 if( mActorForInput2 )
190 mActorForInput2.SetProperty( Actor::Property::SIZE, mTargetSize);
192 if( mActorForComposite )
194 mActorForComposite.SetProperty( Actor::Property::SIZE, mTargetSize);
198 void EmbossFilter::CreateRenderTasks()
200 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
202 mRenderTaskForEmboss1 = taskList.CreateTask();
203 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
204 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
205 mRenderTaskForEmboss1.SetExclusive(true);
206 mRenderTaskForEmboss1.SetInputEnabled( false );
207 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
208 mRenderTaskForEmboss1.SetClearEnabled( true );
209 mRenderTaskForEmboss1.SetFrameBuffer( mFrameBufferForEmboss1 );
210 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
212 mRenderTaskForEmboss2 = taskList.CreateTask();
213 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
214 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
215 mRenderTaskForEmboss2.SetExclusive(true);
216 mRenderTaskForEmboss2.SetInputEnabled( false );
217 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
218 mRenderTaskForEmboss2.SetClearEnabled( true );
219 mRenderTaskForEmboss2.SetFrameBuffer( mFrameBufferForEmboss2 );
220 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
222 mRenderTaskForOutput = taskList.CreateTask();
223 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
224 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
225 mRenderTaskForOutput.SetExclusive(true);
226 mRenderTaskForOutput.SetInputEnabled( false );
227 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
228 mRenderTaskForOutput.SetClearEnabled( true );
229 mRenderTaskForOutput.SetFrameBuffer( mOutputFrameBuffer );
230 mRenderTaskForOutput.SetCameraActor( mCameraActor );
233 } // namespace Internal
235 } // namespace Toolkit