Add Overlay Layer in scene
[platform/core/uifw/dali-core.git] / dali / internal / event / common / scene-impl.cpp
1 /*
2  * Copyright (c) 2022 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 <dali/internal/event/common/scene-impl.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/event/actors/camera-actor-impl.h>
23 #include <dali/internal/event/actors/layer-impl.h>
24 #include <dali/internal/event/actors/layer-list.h>
25 #include <dali/internal/event/common/object-registry-impl.h>
26 #include <dali/internal/event/common/thread-local-storage.h>
27 #include <dali/internal/event/render-tasks/render-task-impl.h>
28 #include <dali/internal/event/render-tasks/render-task-list-impl.h>
29 #include <dali/internal/event/rendering/frame-buffer-impl.h>
30 #include <dali/internal/event/size-negotiation/relayout-controller-impl.h>
31 #include <dali/internal/update/common/scene-graph-scene.h>
32 #include <dali/internal/update/manager/update-manager.h>
33 #include <dali/internal/update/nodes/node.h>
34 #include <dali/public-api/common/constants.h>
35 #include <dali/public-api/object/type-registry.h>
36 #include <dali/public-api/render-tasks/render-task-list.h>
37
38 using Dali::Internal::SceneGraph::Node;
39
40 namespace Dali
41 {
42 namespace Internal
43 {
44 ScenePtr Scene::New(Size size, int32_t windowOrientation, int32_t screenOrientation)
45 {
46   ScenePtr scene = new Scene;
47
48   // Second-phase construction
49   scene->Initialize(size, windowOrientation, screenOrientation);
50
51   return scene;
52 }
53
54 Scene::Scene()
55 : mSceneObject(nullptr),
56   mSize(), // Don't set the proper value here, this will be set when the surface is set later
57   mDpi(),
58   mBackgroundColor(DEFAULT_BACKGROUND_COLOR),
59   mDepthTreeDirty(false),
60   mEventProcessor(*this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor()),
61   mSurfaceOrientation(0),
62   mScreenOrientation(0)
63 {
64 }
65
66 Scene::~Scene()
67 {
68   if(EventThreadServices::IsCoreRunning() && mSceneObject)
69   {
70     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
71     RemoveSceneMessage(tls->GetUpdateManager(), *mSceneObject);
72   }
73
74   if(mDefaultCamera)
75   {
76     // its enough to release the handle so the object is released
77     // don't need to remove it from root actor as root actor will delete the object
78     mDefaultCamera.Reset();
79   }
80
81   if(mRootLayer)
82   {
83     // we are closing down so just delete the root, no point emit disconnect
84     // signals or send messages to update
85     mRootLayer.Reset();
86   }
87
88   if(mOverlayLayer)
89   {
90     mOverlayLayer.Reset();
91   }
92
93   if(mRenderTaskList)
94   {
95     mRenderTaskList.Reset();
96   }
97
98   // No need to discard this Scene from Core, as Core stores an intrusive_ptr to this scene
99   // When this destructor is called, the scene has either already been removed from Core or Core has already been destroyed
100 }
101
102 void Scene::Initialize(Size size, int32_t windowOrientation, int32_t screenOrientation)
103 {
104   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
105
106   DALI_ASSERT_ALWAYS(tls && "Attempt to create scene before core exists!");
107
108   tls->AddScene(this);
109
110   SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
111
112   // Create the ordered list of layers
113   mLayerList = LayerList::New(updateManager);
114
115   // The scene owns the default layer
116   mRootLayer = Layer::NewRoot(*mLayerList);
117   mRootLayer->SetName("RootLayer");
118   mRootLayer->SetScene(*this);
119
120   // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE).
121   // This stops actors parented to the stage having their relayout requests propagating
122   // up to the root layer, and down through other children unnecessarily.
123   mRootLayer->SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
124
125   // Create the default camera actor first; this is needed by the RenderTaskList
126   // The default camera attributes and position is such that children of the default layer,
127   // can be positioned at (0,0) and be at the top-left of the viewport.
128   mDefaultCamera = CameraActor::New(size);
129   mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
130   Add(*(mDefaultCamera.Get()));
131
132   // Create the list of render-tasks
133   mRenderTaskList = RenderTaskList::New();
134
135   // Create the default render-task and ensure clear is enabled on it to show the background color
136   RenderTaskPtr renderTask = mRenderTaskList->CreateTask(mRootLayer.Get(), mDefaultCamera.Get());
137   renderTask->SetClearEnabled(true);
138
139   // Create scene graph object
140   mSceneObject = new SceneGraph::Scene();
141   OwnerPointer<SceneGraph::Scene> transferOwnership(const_cast<SceneGraph::Scene*>(mSceneObject));
142   AddSceneMessage(updateManager, transferOwnership);
143
144   SurfaceRotated(size.width, size.height, windowOrientation, screenOrientation);
145 }
146
147 void Scene::Add(Actor& actor)
148 {
149   mRootLayer->Add(actor);
150 }
151
152 void Scene::Remove(Actor& actor)
153 {
154   mRootLayer->Remove(actor);
155 }
156
157 Size Scene::GetSize() const
158 {
159   return mSize;
160 }
161
162 void Scene::SetDpi(Vector2 dpi)
163 {
164   mDpi = dpi;
165 }
166
167 Vector2 Scene::GetDpi() const
168 {
169   return mDpi;
170 }
171
172 RenderTaskList& Scene::GetRenderTaskList() const
173 {
174   return *mRenderTaskList;
175 }
176
177 Dali::Layer Scene::GetRootLayer() const
178 {
179   return Dali::Layer(mRootLayer.Get());
180 }
181
182 Dali::Layer Scene::GetOverlayLayer()
183 {
184   if(!mOverlayLayer)
185   {
186     // Creates overlay layer.
187     mOverlayLayer = Layer::New();
188     mOverlayLayer->SetName("OverlayLayer");
189     mOverlayLayer->SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
190     mOverlayLayer->SetParentOrigin(Dali::ParentOrigin::TOP_LEFT);
191     mOverlayLayer->SetAnchorPoint(Dali::AnchorPoint::TOP_LEFT);
192     mRootLayer->Add(*mOverlayLayer);
193
194     // Create the overlay render-task and set exclusive to true.
195     RenderTaskPtr renderTask = mRenderTaskList->CreateOverlayTask(mOverlayLayer.Get(), mDefaultCamera.Get());
196     renderTask->SetExclusive(true);
197     renderTask->SetInputEnabled(true);
198   }
199   return Dali::Layer(mOverlayLayer.Get());
200 }
201
202 LayerList& Scene::GetLayerList() const
203 {
204   return *mLayerList;
205 }
206
207 uint32_t Scene::GetLayerCount() const
208 {
209   return mLayerList->GetLayerCount();
210 }
211
212 Dali::Layer Scene::GetLayer(uint32_t depth) const
213 {
214   return Dali::Layer(mLayerList->GetLayer(depth));
215 }
216
217 CameraActor& Scene::GetDefaultCameraActor() const
218 {
219   return *mDefaultCamera;
220 }
221
222 Actor& Scene::GetDefaultRootActor()
223 {
224   return *mRootLayer;
225 }
226
227 void Scene::SurfaceResized(float width, float height)
228 {
229   if((fabsf(mSize.width - width) > Math::MACHINE_EPSILON_1) || (fabsf(mSize.height - height) > Math::MACHINE_EPSILON_1))
230   {
231     ChangedSurface(width, height, mSurfaceOrientation, mScreenOrientation);
232   }
233 }
234
235 void Scene::SurfaceReplaced()
236 {
237   if(mSceneObject)
238   {
239     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
240     SurfaceReplacedMessage(tls->GetUpdateManager(), *mSceneObject);
241   }
242 }
243
244 void Scene::Discard()
245 {
246   if(ThreadLocalStorage::Created())
247   {
248     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
249     tls->RemoveScene(this);
250   }
251 }
252
253 void Scene::RequestRebuildDepthTree()
254 {
255   mDepthTreeDirty = true;
256 }
257
258 void Scene::QueueEvent(const Integration::Event& event)
259 {
260   mEventProcessor.QueueEvent(event);
261 }
262
263 void Scene::ProcessEvents()
264 {
265   mEventProcessor.ProcessEvents();
266 }
267
268 void Scene::RebuildDepthTree()
269 {
270   // If the depth tree needs rebuilding, do it in this frame only.
271   if(mDepthTreeDirty)
272   {
273     ActorPtr actor(mRootLayer.Get());
274     actor->RebuildDepthTree();
275     mDepthTreeDirty = false;
276   }
277 }
278
279 void Scene::SetBackgroundColor(const Vector4& color)
280 {
281   mBackgroundColor = color;
282
283   mRenderTaskList->GetTask(0u)->SetClearColor(color);
284   mRenderTaskList->GetTask(0u)->SetClearEnabled(true);
285 }
286
287 Vector4 Scene::GetBackgroundColor() const
288 {
289   return mBackgroundColor;
290 }
291
292 SceneGraph::Scene* Scene::GetSceneObject() const
293 {
294   return mSceneObject;
295 }
296
297 void Scene::EmitKeyEventSignal(const Dali::KeyEvent& event)
298 {
299   if(!mKeyEventSignal.Empty())
300   {
301     Dali::Integration::Scene handle(this);
302     mKeyEventSignal.Emit(event);
303   }
304 }
305
306 void Scene::SurfaceRotated(float width, float height, int32_t windowOrientation, int32_t screenOrientation)
307 {
308   ChangedSurface(width, height, windowOrientation, screenOrientation);
309 }
310
311 int32_t Scene::GetCurrentSurfaceOrientation() const
312 {
313   return mSceneObject->GetSurfaceOrientation();
314 }
315
316 int32_t Scene::GetCurrentScreenOrientation() const
317 {
318   return mSceneObject->GetScreenOrientation();
319 }
320
321 const Rect<int32_t>& Scene::GetCurrentSurfaceRect() const
322 {
323   return mSceneObject->GetSurfaceRect();
324 }
325
326 void Scene::ChangedSurface(float width, float height, int32_t windowOrientation, int32_t screenOrientation)
327 {
328   bool changedOrientation = false;
329   Rect<int32_t> newSize(0, 0, static_cast<int32_t>(width), static_cast<int32_t>(height)); // truncated
330   mSize.width  = width;
331   mSize.height = height;
332
333   if(mSurfaceOrientation != windowOrientation || mScreenOrientation != screenOrientation)
334   {
335     changedOrientation = true;
336   }
337
338   mSurfaceOrientation = windowOrientation;
339   mScreenOrientation = screenOrientation;
340
341   // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
342   mDefaultCamera->SetPerspectiveProjection(mSize);
343   // Set the surface orientation to Default camera for window/screen rotation
344   if(changedOrientation)
345   {
346     int32_t orientation = (windowOrientation + screenOrientation) % 360;
347     mDefaultCamera->RotateProjection(orientation);
348   }
349
350   mRootLayer->SetSize(width, height);
351
352   // Send the surface rectangle/orientation to SceneGraph::Scene for calculating glViewport/Scissor
353   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
354   DALI_LOG_RELEASE_INFO("Send Surface Rect Message, width[%d], height[%d]\n", newSize.width, newSize.height);
355   SetSurfaceRectMessage(tls->GetEventThreadServices(), *mSceneObject, newSize);
356   if(changedOrientation)
357   {
358     DALI_LOG_RELEASE_INFO("Send Surface Orientation Message, surface orientation[%d], screen orientation[%d]\n", mSurfaceOrientation, mScreenOrientation);
359     SetSurfaceOrientationsMessage(tls->GetEventThreadServices(), *mSceneObject, mSurfaceOrientation, mScreenOrientation);
360   }
361
362   // set default render-task viewport parameters
363   RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask(0u);
364   defaultRenderTask->SetViewport(newSize);
365   // set overlay render-task viewport parameters
366   RenderTaskPtr overlayRenderTask = mRenderTaskList->GetOverlayTask();
367   if(overlayRenderTask)
368   {
369     overlayRenderTask->SetViewport(newSize);
370   }
371 }
372
373 bool Scene::IsSurfaceRectChanged() const
374 {
375   return mSceneObject->IsSurfaceRectChanged();
376 }
377
378 bool Scene::IsRotationCompletedAcknowledgementSet() const
379 {
380   return mSceneObject->IsRotationCompletedAcknowledgementSet();
381 }
382
383 void Scene::SetRotationCompletedAcknowledgement()
384 {
385   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
386   SetRotationCompletedAcknowledgementMessage(tls->GetEventThreadServices(), *mSceneObject);
387 }
388
389 void Scene::SetSurfaceRenderTarget(const Graphics::RenderTargetCreateInfo& renderTargetCreateInfo)
390 {
391   // Send the surface render target to SceneGraph::Scene
392   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
393   SetSurfaceRenderTargetCreateInfoMessage(tls->GetEventThreadServices(), *mSceneObject, renderTargetCreateInfo);
394 }
395
396 bool Scene::EmitKeyEventGeneratedSignal(const Dali::KeyEvent& event)
397 {
398   // Emit the KeyEventGenerated signal when KeyEvent is generated
399   Dali::Integration::Scene handle(this);
400   return mKeyEventGeneratedSignal.Emit(event);
401 }
402
403 bool Scene::EmitInterceptKeyEventSignal(const Dali::KeyEvent& event)
404 {
405   // Emit the InterceptKeyEvent signal
406   Dali::Integration::Scene handle(this);
407   return mInterceptKeyEventSignal.Emit(event);
408 }
409
410 void Scene::EmitEventProcessingFinishedSignal()
411 {
412   if(!mEventProcessingFinishedSignal.Empty())
413   {
414     Dali::Integration::Scene handle(this);
415     mEventProcessingFinishedSignal.Emit();
416   }
417 }
418
419 void Scene::EmitTouchedSignal(const Dali::TouchEvent& touch)
420 {
421   Dali::Integration::Scene handle(this);
422   if(!mTouchedSignal.Empty())
423   {
424     mTouchedSignal.Emit(touch);
425   }
426 }
427
428 void Scene::EmitWheelEventSignal(const Dali::WheelEvent& event)
429 {
430   if(!mWheelEventSignal.Empty())
431   {
432     Dali::Integration::Scene handle(this);
433     mWheelEventSignal.Emit(event);
434   }
435 }
436
437 bool Scene::EmitWheelEventGeneratedSignal(const Dali::WheelEvent& event)
438 {
439   // Emit the WheelEventGenerated signal when WheelEvent is generated
440   Dali::Integration::Scene handle(this);
441   return mWheelEventGeneratedSignal.Emit(event);
442 }
443
444 void Scene::AddFrameRenderedCallback(std::unique_ptr<CallbackBase> callback, int32_t frameId)
445 {
446   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
447   AddFrameRenderedCallbackMessage(tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId);
448 }
449
450 void Scene::AddFramePresentedCallback(std::unique_ptr<CallbackBase> callback, int32_t frameId)
451 {
452   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
453   AddFramePresentedCallbackMessage(tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId);
454 }
455
456 void Scene::GetFrameRenderedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
457 {
458   mSceneObject->GetFrameRenderedCallback(callbacks);
459 }
460
461 void Scene::GetFramePresentedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
462 {
463   mSceneObject->GetFramePresentedCallback(callbacks);
464 }
465
466 Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
467 {
468   return mKeyEventSignal;
469 }
470
471 Integration::Scene::KeyEventGeneratedSignalType& Scene::KeyEventGeneratedSignal()
472 {
473   return mKeyEventGeneratedSignal;
474 }
475
476 Integration::Scene::KeyEventGeneratedSignalType& Scene::InterceptKeyEventSignal()
477 {
478   return mInterceptKeyEventSignal;
479 }
480
481 Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
482 {
483   return mEventProcessingFinishedSignal;
484 }
485
486 Integration::Scene::TouchEventSignalType& Scene::TouchedSignal()
487 {
488   return mTouchedSignal;
489 }
490
491 Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
492 {
493   return mWheelEventSignal;
494 }
495
496 Integration::Scene::WheelEventGeneratedSignalType& Scene::WheelEventGeneratedSignal()
497 {
498   return mWheelEventGeneratedSignal;
499 }
500
501 } // namespace Internal
502
503 } // namespace Dali