Convert more shaders in dali-toolkit and dali-scene-loader to use shader compilation...
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / filters / emboss-filter.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include "emboss-filter.h"
20
21 // EXTERNAL INCLUDES
22 #include <sstream>
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>
28
29 // INTERNAL INCLUDES
30 #include <dali-toolkit/internal/controls/control/control-renderers.h>
31 #include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
32
33 namespace Dali
34 {
35
36 namespace Toolkit
37 {
38
39 namespace Internal
40 {
41
42 namespace
43 {
44
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" );
48
49 } // namespace
50
51 EmbossFilter::EmbossFilter()
52 : ImageFilter()
53 {
54 }
55
56 EmbossFilter::~EmbossFilter()
57 {
58 }
59
60 void EmbossFilter::Enable()
61 {
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 );
65
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 );
69
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 );
82
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 );
93
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 );
98
99   mRootActor.Add( mActorForComposite );
100
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 );
105
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 );
110
111   SetupCamera();
112   CreateRenderTasks();
113 }
114
115 void EmbossFilter::Disable()
116 {
117   if( mRootActor )
118   {
119     if( mCameraActor )
120     {
121       mRootActor.Remove( mCameraActor );
122       mCameraActor.Reset();
123     }
124
125     if( mActorForInput1 )
126     {
127       mRootActor.Remove( mActorForInput1 );
128       mActorForInput1.Reset();
129     }
130
131     if( mActorForInput2 )
132     {
133       mRootActor.Remove( mActorForInput2 );
134       mActorForInput2.Reset();
135     }
136
137     if( mActorForComposite )
138     {
139       mActorForComposite.RemoveRenderer( mRendererForEmboss1 );
140       mRendererForEmboss1.Reset();
141
142       mActorForComposite.RemoveRenderer( mRendererForEmboss2 );
143       mRendererForEmboss2.Reset();
144
145       mRootActor.Remove( mActorForComposite );
146       mActorForComposite.Reset();
147     }
148
149     RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
150     if( mRenderTaskForEmboss1 )
151     {
152       taskList.RemoveTask(mRenderTaskForEmboss1);
153     }
154
155     if( mRenderTaskForEmboss2 )
156     {
157       taskList.RemoveTask(mRenderTaskForEmboss2);
158     }
159
160     if( mRenderTaskForOutput )
161     {
162       taskList.RemoveTask( mRenderTaskForOutput );
163     }
164
165     mRootActor.Reset();
166   }
167 }
168
169 void EmbossFilter::Refresh()
170 {
171   if( mRenderTaskForEmboss1 )
172   {
173     mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
174   }
175   if( mRenderTaskForEmboss2 )
176   {
177     mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
178   }
179 }
180
181 void EmbossFilter::SetSize( const Vector2& size )
182 {
183   mTargetSize = size;
184   if( mActorForInput1 )
185   {
186     mActorForInput1.SetProperty( Actor::Property::SIZE, mTargetSize);
187   }
188   if( mActorForInput2 )
189   {
190     mActorForInput2.SetProperty( Actor::Property::SIZE, mTargetSize);
191   }
192   if( mActorForComposite )
193   {
194     mActorForComposite.SetProperty( Actor::Property::SIZE, mTargetSize);
195   }
196 }
197
198 void EmbossFilter::CreateRenderTasks()
199 {
200   RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
201
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 );
211
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 );
221
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 );
231 }
232
233 } // namespace Internal
234
235 } // namespace Toolkit
236
237 } // namespace Dali