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