2 * Copyright (c) 2021 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"
22 #include <dali/devel-api/common/stage.h>
23 #include <dali/public-api/animation/constraints.h>
24 #include <dali/public-api/object/property-map.h>
25 #include <dali/public-api/render-tasks/render-task-list.h>
26 #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>
41 const char* const TEX_SCALE_UNIFORM_NAME("uTexScale");
42 const char* const COEFFICIENT_UNIFORM_NAME("uCoefficient");
43 const char* const COLOR_UNIFORM_NAME("uEffectColor");
47 EmbossFilter::EmbossFilter()
52 EmbossFilter::~EmbossFilter()
56 void EmbossFilter::Enable()
58 mFrameBufferForEmboss1 = FrameBuffer::New(mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE);
59 Texture texture1 = Texture::New(TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height));
60 mFrameBufferForEmboss1.AttachColorTexture(texture1);
62 mFrameBufferForEmboss2 = FrameBuffer::New(mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE);
63 Texture texture2 = Texture::New(TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height));
64 mFrameBufferForEmboss2.AttachColorTexture(texture2);
66 // create actor to render input with applied emboss effect
67 mActorForInput1 = Actor::New();
68 mActorForInput1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
69 mActorForInput1.SetProperty(Actor::Property::SIZE, mTargetSize);
70 Vector2 textureScale(1.5f / mTargetSize.width, 1.5f / mTargetSize.height);
71 mActorForInput1.RegisterProperty(TEX_SCALE_UNIFORM_NAME, textureScale);
72 mActorForInput1.RegisterProperty(COEFFICIENT_UNIFORM_NAME, Vector3(2.f, -1.f, -1.f));
73 // set EMBOSS custom shader
74 Renderer renderer1 = CreateRenderer(BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_SHADER_FRAG);
75 SetRendererTexture(renderer1, mInputTexture);
76 mActorForInput1.AddRenderer(renderer1);
77 mRootActor.Add(mActorForInput1);
79 mActorForInput2 = Actor::New();
80 mActorForInput2.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
81 mActorForInput2.SetProperty(Actor::Property::SIZE, mTargetSize);
82 mActorForInput2.RegisterProperty(TEX_SCALE_UNIFORM_NAME, textureScale);
83 mActorForInput2.RegisterProperty(COEFFICIENT_UNIFORM_NAME, Vector3(-1.f, -1.f, 2.f));
84 // set EMBOSS custom shader
85 Renderer renderer2 = CreateRenderer(BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_SHADER_FRAG);
86 SetRendererTexture(renderer2, mInputTexture);
87 mActorForInput2.AddRenderer(renderer2);
88 mRootActor.Add(mActorForInput2);
90 mActorForComposite = Actor::New();
91 mActorForComposite.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
92 mActorForComposite.SetProperty(Actor::Property::SIZE, mTargetSize);
93 mActorForComposite.SetProperty(Actor::Property::COLOR, Color::BLACK);
95 mRootActor.Add(mActorForComposite);
97 mRendererForEmboss1 = CreateRenderer(BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_COMPOSITE_SHADER_FRAG);
98 SetRendererTexture(mRendererForEmboss1, mFrameBufferForEmboss1);
99 mRendererForEmboss1.RegisterProperty(COLOR_UNIFORM_NAME, Color::BLACK);
100 mActorForComposite.AddRenderer(mRendererForEmboss1);
102 mRendererForEmboss2 = CreateRenderer(BASIC_VERTEX_SOURCE, SHADER_EMBOSS_FILTER_COMPOSITE_SHADER_FRAG);
103 SetRendererTexture(mRendererForEmboss2, mFrameBufferForEmboss2);
104 mRendererForEmboss2.RegisterProperty(COLOR_UNIFORM_NAME, Color::WHITE);
105 mActorForComposite.AddRenderer(mRendererForEmboss2);
111 void EmbossFilter::Disable()
117 mRootActor.Remove(mCameraActor);
118 mCameraActor.Reset();
123 mRootActor.Remove(mActorForInput1);
124 mActorForInput1.Reset();
129 mRootActor.Remove(mActorForInput2);
130 mActorForInput2.Reset();
133 if(mActorForComposite)
135 mActorForComposite.RemoveRenderer(mRendererForEmboss1);
136 mRendererForEmboss1.Reset();
138 mActorForComposite.RemoveRenderer(mRendererForEmboss2);
139 mRendererForEmboss2.Reset();
141 mRootActor.Remove(mActorForComposite);
142 mActorForComposite.Reset();
145 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
146 if(mRenderTaskForEmboss1)
148 taskList.RemoveTask(mRenderTaskForEmboss1);
151 if(mRenderTaskForEmboss2)
153 taskList.RemoveTask(mRenderTaskForEmboss2);
156 if(mRenderTaskForOutput)
158 taskList.RemoveTask(mRenderTaskForOutput);
165 void EmbossFilter::Refresh()
167 if(mRenderTaskForEmboss1)
169 mRenderTaskForEmboss1.SetRefreshRate(mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS);
171 if(mRenderTaskForEmboss2)
173 mRenderTaskForEmboss2.SetRefreshRate(mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS);
177 void EmbossFilter::SetSize(const Vector2& size)
182 mActorForInput1.SetProperty(Actor::Property::SIZE, mTargetSize);
186 mActorForInput2.SetProperty(Actor::Property::SIZE, mTargetSize);
188 if(mActorForComposite)
190 mActorForComposite.SetProperty(Actor::Property::SIZE, mTargetSize);
194 void EmbossFilter::CreateRenderTasks()
196 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
198 mRenderTaskForEmboss1 = taskList.CreateTask();
199 mRenderTaskForEmboss1.SetRefreshRate(mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS);
200 mRenderTaskForEmboss1.SetSourceActor(mActorForInput1);
201 mRenderTaskForEmboss1.SetExclusive(true);
202 mRenderTaskForEmboss1.SetInputEnabled(false);
203 mRenderTaskForEmboss1.SetClearColor(Vector4(0.0f, 0.0f, 0.0f, 0.0f));
204 mRenderTaskForEmboss1.SetClearEnabled(true);
205 mRenderTaskForEmboss1.SetFrameBuffer(mFrameBufferForEmboss1);
206 mRenderTaskForEmboss1.SetCameraActor(mCameraActor);
208 mRenderTaskForEmboss2 = taskList.CreateTask();
209 mRenderTaskForEmboss2.SetRefreshRate(mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS);
210 mRenderTaskForEmboss2.SetSourceActor(mActorForInput2);
211 mRenderTaskForEmboss2.SetExclusive(true);
212 mRenderTaskForEmboss2.SetInputEnabled(false);
213 mRenderTaskForEmboss2.SetClearColor(Vector4(1.0f, 1.0f, 1.0f, 0.0f));
214 mRenderTaskForEmboss2.SetClearEnabled(true);
215 mRenderTaskForEmboss2.SetFrameBuffer(mFrameBufferForEmboss2);
216 mRenderTaskForEmboss2.SetCameraActor(mCameraActor);
218 mRenderTaskForOutput = taskList.CreateTask();
219 mRenderTaskForOutput.SetRefreshRate(mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS);
220 mRenderTaskForOutput.SetSourceActor(mActorForComposite);
221 mRenderTaskForOutput.SetExclusive(true);
222 mRenderTaskForOutput.SetInputEnabled(false);
223 mRenderTaskForOutput.SetClearColor(Vector4(0.5f, 0.5f, 0.5f, 0.0f));
224 mRenderTaskForOutput.SetClearEnabled(true);
225 mRenderTaskForOutput.SetFrameBuffer(mOutputFrameBuffer);
226 mRenderTaskForOutput.SetCameraActor(mCameraActor);
229 } // namespace Internal
231 } // namespace Toolkit