(Visuals) Added visual indices
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / filters / emboss-filter.cpp
1 /*
2  * Copyright (c) 2016 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/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>
28 #include <dali/devel-api/images/texture-set-image.h>
29
30 // INTERNAL INCLUDES
31 #include <dali-toolkit/public-api/visuals/visual-properties.h>
32 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
33
34 namespace Dali
35 {
36
37 namespace Toolkit
38 {
39
40 namespace Internal
41 {
42
43 namespace
44 {
45
46 const char* EMBOSS_FRAGMENT_SOURCE =
47 {
48  "precision highp float;\n"
49  "varying mediump vec2 vTexCoord;\n"
50  "uniform sampler2D sTexture;\n"
51  "uniform vec2 uTexScale;\n"
52  "uniform vec3 uCoefficient;\n"
53  "\n"
54  "void main()\n"
55  "{\n"
56  "  vec4 color  = uCoefficient.x * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
57  "  color += uCoefficient.y * texture2D( sTexture, vTexCoord );\n"
58  "  color += uCoefficient.z * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
59  "  gl_FragColor = color;\n"
60  "}\n"
61 };
62
63 const char* const COMPOSITE_FRAGMENT_SOURCE =
64 {
65   "varying mediump vec2 vTexCoord;\n"
66   "uniform sampler2D sTexture;\n"
67   "uniform lowp vec4 uEffectColor;\n"
68   "void main()\n"
69   "{\n"
70   "  gl_FragColor = uEffectColor;\n"
71   "  gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
72   "}\n"
73 };
74
75 const char* const TEX_SCALE_UNIFORM_NAME( "uTexScale" );
76 const char* const COEFFICIENT_UNIFORM_NAME( "uCoefficient" );
77 const char* const COLOR_UNIFORM_NAME( "uEffectColor" );
78
79 } // namespace
80
81 EmbossFilter::EmbossFilter()
82 : ImageFilter()
83 {
84 }
85
86 EmbossFilter::~EmbossFilter()
87 {
88 }
89
90 void EmbossFilter::Enable()
91 {
92   mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
93   mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
94
95   Property::Map customShader;
96   customShader[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = EMBOSS_FRAGMENT_SOURCE;
97   Property::Map visualMap;
98   visualMap.Insert( Toolkit::Visual::Property::SHADER, customShader );
99
100   // create actor to render input with applied emboss effect
101   mActorForInput1 = Toolkit::ImageView::New(mInputImage);
102   mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
103   mActorForInput1.SetSize(mTargetSize);
104   Vector2 textureScale( 1.5f/mTargetSize.width, 1.5f/mTargetSize.height);
105   mActorForInput1.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
106   mActorForInput1.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( 2.f, -1.f, -1.f ) );
107   // set EMBOSS custom shader
108   mActorForInput1.SetProperty( Toolkit::ImageView::Property::IMAGE, visualMap );
109   mRootActor.Add( mActorForInput1 );
110
111   mActorForInput2 = Toolkit::ImageView::New(mInputImage);
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   mActorForInput2.SetProperty( Toolkit::ImageView::Property::IMAGE, visualMap );
118   mRootActor.Add( mActorForInput2 );
119
120   mActorForComposite = Actor::New();
121   mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
122   mActorForComposite.SetSize(mTargetSize);
123   mActorForComposite.SetColor( Color::BLACK );
124
125   customShader[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = COMPOSITE_FRAGMENT_SOURCE;
126   visualMap[ Toolkit::Visual::Property::SHADER ] = customShader;
127   visualMap[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::IMAGE;
128
129   mRootActor.Add( mActorForComposite );
130
131   InitializeVisual( mActorForComposite, mVisualForEmboss1, visualMap );
132   InitializeVisual( mActorForComposite, mVisualForEmboss2, visualMap );
133
134   TextureSet textureSet1 = TextureSet::New();
135   TextureSetImage( textureSet1, 0, mImageForEmboss1 );
136   mActorForComposite.GetRendererAt(0).SetTextures( textureSet1 );
137   mActorForComposite.GetRendererAt(0).RegisterProperty( COLOR_UNIFORM_NAME, Color::BLACK );
138
139   TextureSet textureSet2 = TextureSet::New();
140   TextureSetImage( textureSet2, 0, mImageForEmboss2 );
141   mActorForComposite.GetRendererAt(1).SetTextures( textureSet2 );
142   mActorForComposite.GetRendererAt(1).RegisterProperty( COLOR_UNIFORM_NAME, Color::WHITE );
143
144   SetupCamera();
145   CreateRenderTasks();
146 }
147
148 void EmbossFilter::Disable()
149 {
150   if( mRootActor )
151   {
152     if( mCameraActor )
153     {
154       mRootActor.Remove( mCameraActor );
155       mCameraActor.Reset();
156     }
157
158     if( mActorForInput1 )
159     {
160       mRootActor.Remove( mActorForInput1 );
161       mActorForInput1.Reset();
162     }
163
164     if( mActorForInput2 )
165     {
166       mRootActor.Remove( mActorForInput2 );
167       mActorForInput2.Reset();
168     }
169
170     if( mActorForComposite )
171     {
172       mVisualForEmboss1.SetOffStage( mActorForComposite );
173       mVisualForEmboss2.SetOffStage( mActorForComposite );
174       mVisualForEmboss1.Reset();
175       mVisualForEmboss2.Reset();
176       mRootActor.Remove( mActorForComposite );
177       mActorForComposite.Reset();
178     }
179
180     RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
181     if( mRenderTaskForEmboss1 )
182     {
183       taskList.RemoveTask(mRenderTaskForEmboss1);
184     }
185
186     if( mRenderTaskForEmboss2 )
187     {
188       taskList.RemoveTask(mRenderTaskForEmboss2);
189     }
190
191     mRootActor.Reset();
192   }
193 }
194
195 void EmbossFilter::Refresh()
196 {
197   if( mRenderTaskForEmboss1 )
198   {
199     mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
200   }
201   if( mRenderTaskForEmboss2 )
202   {
203     mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
204   }
205 }
206
207 void EmbossFilter::SetSize( const Vector2& size )
208 {
209   mTargetSize = size;
210   if( mActorForInput1 )
211   {
212     mActorForInput1.SetSize(mTargetSize);
213   }
214   if( mActorForInput2 )
215   {
216     mActorForInput2.SetSize(mTargetSize);
217   }
218   if( mActorForComposite )
219   {
220     mActorForComposite.SetSize(mTargetSize);
221   }
222 }
223
224 void EmbossFilter::CreateRenderTasks()
225 {
226   RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
227
228   mRenderTaskForEmboss1 = taskList.CreateTask();
229   mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
230   mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
231   mRenderTaskForEmboss1.SetExclusive(true);
232   mRenderTaskForEmboss1.SetInputEnabled( false );
233   mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
234   mRenderTaskForEmboss1.SetClearEnabled( true );
235   mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
236   mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
237
238   mRenderTaskForEmboss2 = taskList.CreateTask();
239   mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
240   mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
241   mRenderTaskForEmboss2.SetExclusive(true);
242   mRenderTaskForEmboss2.SetInputEnabled( false );
243   mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
244   mRenderTaskForEmboss2.SetClearEnabled( true );
245   mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
246   mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
247
248   mRenderTaskForOutput = taskList.CreateTask();
249   mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
250   mRenderTaskForOutput.SetSourceActor( mActorForComposite );
251   mRenderTaskForOutput.SetExclusive(true);
252   mRenderTaskForOutput.SetInputEnabled( false );
253   mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
254   mRenderTaskForOutput.SetClearEnabled( true );
255   mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
256   mRenderTaskForOutput.SetCameraActor( mCameraActor );
257 }
258
259 } // namespace Internal
260
261 } // namespace Toolkit
262
263 } // namespace Dali