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