Merge "Updated all code to new format" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / event / common / scene-impl.cpp
1 /*
2  * Copyright (c) 2021 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, int orientation)
45 {
46   ScenePtr scene = new Scene;
47
48   // Second-phase construction
49   scene->Initialize(size, orientation);
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 {
63 }
64
65 Scene::~Scene()
66 {
67   if(EventThreadServices::IsCoreRunning() && mSceneObject)
68   {
69     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
70     RemoveSceneMessage(tls->GetUpdateManager(), *mSceneObject);
71   }
72
73   if(mDefaultCamera)
74   {
75     // its enough to release the handle so the object is released
76     // don't need to remove it from root actor as root actor will delete the object
77     mDefaultCamera.Reset();
78   }
79
80   if(mRootLayer)
81   {
82     // we are closing down so just delete the root, no point emit disconnect
83     // signals or send messages to update
84     mRootLayer.Reset();
85   }
86
87   if(mRenderTaskList)
88   {
89     mRenderTaskList.Reset();
90   }
91
92   // No need to discard this Scene from Core, as Core stores an intrusive_ptr to this scene
93   // When this destructor is called, the scene has either already been removed from Core or Core has already been destroyed
94 }
95
96 void Scene::Initialize(Size size, int orientation)
97 {
98   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
99
100   DALI_ASSERT_ALWAYS(tls && "Attempt to create scene before core exists!");
101
102   tls->AddScene(this);
103
104   SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
105
106   // Create the ordered list of layers
107   mLayerList = LayerList::New(updateManager);
108
109   // The scene owns the default layer
110   mRootLayer = Layer::NewRoot(*mLayerList);
111   mRootLayer->SetName("RootLayer");
112   mRootLayer->SetScene(*this);
113
114   // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE).
115   // This stops actors parented to the stage having their relayout requests propagating
116   // up to the root layer, and down through other children unnecessarily.
117   mRootLayer->SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
118
119   // Create the default camera actor first; this is needed by the RenderTaskList
120   // The default camera attributes and position is such that children of the default layer,
121   // can be positioned at (0,0) and be at the top-left of the viewport.
122   mDefaultCamera = CameraActor::New(size);
123   mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
124   Add(*(mDefaultCamera.Get()));
125
126   // Create the list of render-tasks
127   mRenderTaskList = RenderTaskList::New();
128
129   // Create the default render-task and ensure clear is enabled on it to show the background color
130   RenderTaskPtr renderTask = mRenderTaskList->CreateTask(mRootLayer.Get(), mDefaultCamera.Get());
131   renderTask->SetClearEnabled(true);
132
133   // Create scene graph object
134   mSceneObject = new SceneGraph::Scene();
135   OwnerPointer<SceneGraph::Scene> transferOwnership(const_cast<SceneGraph::Scene*>(mSceneObject));
136   AddSceneMessage(updateManager, transferOwnership);
137
138   SurfaceRotated(size.width, size.height, orientation);
139 }
140
141 void Scene::Add(Actor& actor)
142 {
143   mRootLayer->Add(actor);
144 }
145
146 void Scene::Remove(Actor& actor)
147 {
148   mRootLayer->Remove(actor);
149 }
150
151 Size Scene::GetSize() const
152 {
153   return mSize;
154 }
155
156 void Scene::SetDpi(Vector2 dpi)
157 {
158   mDpi = dpi;
159 }
160
161 Vector2 Scene::GetDpi() const
162 {
163   return mDpi;
164 }
165
166 RenderTaskList& Scene::GetRenderTaskList() const
167 {
168   return *mRenderTaskList;
169 }
170
171 Dali::Layer Scene::GetRootLayer() const
172 {
173   return Dali::Layer(mRootLayer.Get());
174 }
175
176 LayerList& Scene::GetLayerList() const
177 {
178   return *mLayerList;
179 }
180
181 uint32_t Scene::GetLayerCount() const
182 {
183   return mLayerList->GetLayerCount();
184 }
185
186 Dali::Layer Scene::GetLayer(uint32_t depth) const
187 {
188   return Dali::Layer(mLayerList->GetLayer(depth));
189 }
190
191 CameraActor& Scene::GetDefaultCameraActor()
192 {
193   return *mDefaultCamera;
194 }
195
196 Actor& Scene::GetDefaultRootActor()
197 {
198   return *mRootLayer;
199 }
200
201 void Scene::SurfaceResized(float width, float height)
202 {
203   if((fabsf(mSize.width - width) > Math::MACHINE_EPSILON_1) || (fabsf(mSize.height - height) > Math::MACHINE_EPSILON_1))
204   {
205     ChangedSurface(width, height, mSurfaceOrientation);
206   }
207 }
208
209 void Scene::SurfaceReplaced()
210 {
211   if(mSceneObject)
212   {
213     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
214     SurfaceReplacedMessage(tls->GetUpdateManager(), *mSceneObject);
215   }
216 }
217
218 void Scene::Discard()
219 {
220   if(ThreadLocalStorage::Created())
221   {
222     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
223     tls->RemoveScene(this);
224   }
225 }
226
227 void Scene::RequestRebuildDepthTree()
228 {
229   mDepthTreeDirty = true;
230 }
231
232 void Scene::QueueEvent(const Integration::Event& event)
233 {
234   mEventProcessor.QueueEvent(event);
235 }
236
237 void Scene::ProcessEvents()
238 {
239   mEventProcessor.ProcessEvents();
240 }
241
242 void Scene::RebuildDepthTree()
243 {
244   // If the depth tree needs rebuilding, do it in this frame only.
245   if(mDepthTreeDirty)
246   {
247     ActorPtr actor(mRootLayer.Get());
248     actor->RebuildDepthTree();
249     mDepthTreeDirty = false;
250   }
251 }
252
253 void Scene::SetBackgroundColor(const Vector4& color)
254 {
255   mBackgroundColor = color;
256
257   mRenderTaskList->GetTask(0u)->SetClearColor(color);
258   mRenderTaskList->GetTask(0u)->SetClearEnabled(true);
259 }
260
261 Vector4 Scene::GetBackgroundColor() const
262 {
263   return mBackgroundColor;
264 }
265
266 SceneGraph::Scene* Scene::GetSceneObject() const
267 {
268   return mSceneObject;
269 }
270
271 void Scene::EmitKeyEventSignal(const Dali::KeyEvent& event)
272 {
273   if(!mKeyEventSignal.Empty())
274   {
275     Dali::Integration::Scene handle(this);
276     mKeyEventSignal.Emit(event);
277   }
278 }
279
280 void Scene::SurfaceRotated(float width, float height, int orientation)
281 {
282   mSurfaceOrientation = orientation;
283   ChangedSurface(width, height, orientation);
284 }
285
286 int Scene::GetSurfaceOrientation()
287 {
288   return mSurfaceOrientation;
289 }
290
291 void Scene::ChangedSurface(float width, float height, int orientation)
292 {
293   Rect<int32_t> newSize(0, 0, static_cast<int32_t>(width), static_cast<int32_t>(height)); // truncated
294   mSize.width  = width;
295   mSize.height = height;
296
297   // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
298   mDefaultCamera->SetPerspectiveProjection(mSize);
299   // Set the surface orientation to Default camera for window/screen rotation
300   mDefaultCamera->RotateProjection(orientation);
301
302   mRootLayer->SetSize(width, height);
303
304   // Send the surface rectangle/orientation to SceneGraph::Scene for calculating glViewport/Scissor
305   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
306   SetSurfaceRectMessage(tls->GetEventThreadServices(), *mSceneObject, newSize);
307   SetSurfaceOrientationMessage(tls->GetEventThreadServices(), *mSceneObject, static_cast<int32_t>(orientation));
308
309   // set default render-task viewport parameters
310   RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask(0u);
311   defaultRenderTask->SetViewport(newSize);
312 }
313
314 bool Scene::IsSurfaceRectChanged() const
315 {
316   return mSceneObject->IsSurfaceRectChanged();
317 }
318
319 bool Scene::EmitKeyEventGeneratedSignal(const Dali::KeyEvent& event)
320 {
321   // Emit the KeyEventGenerated signal when KeyEvent is generated
322   Dali::Integration::Scene handle(this);
323   return mKeyEventGeneratedSignal.Emit(event);
324 }
325
326 void Scene::EmitEventProcessingFinishedSignal()
327 {
328   if(!mEventProcessingFinishedSignal.Empty())
329   {
330     Dali::Integration::Scene handle(this);
331     mEventProcessingFinishedSignal.Emit();
332   }
333 }
334
335 void Scene::EmitTouchedSignal(const Dali::TouchEvent& touch)
336 {
337   Dali::Integration::Scene handle(this);
338   if(!mTouchedSignal.Empty())
339   {
340     mTouchedSignal.Emit(touch);
341   }
342 }
343
344 void Scene::EmitWheelEventSignal(const Dali::WheelEvent& event)
345 {
346   if(!mWheelEventSignal.Empty())
347   {
348     Dali::Integration::Scene handle(this);
349     mWheelEventSignal.Emit(event);
350   }
351 }
352
353 void Scene::AddFrameRenderedCallback(std::unique_ptr<CallbackBase> callback, int32_t frameId)
354 {
355   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
356   AddFrameRenderedCallbackMessage(tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId);
357 }
358
359 void Scene::AddFramePresentedCallback(std::unique_ptr<CallbackBase> callback, int32_t frameId)
360 {
361   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
362   AddFramePresentedCallbackMessage(tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId);
363 }
364
365 void Scene::GetFrameRenderedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
366 {
367   mSceneObject->GetFrameRenderedCallback(callbacks);
368 }
369
370 void Scene::GetFramePresentedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
371 {
372   mSceneObject->GetFramePresentedCallback(callbacks);
373 }
374
375 Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
376 {
377   return mKeyEventSignal;
378 }
379
380 Integration::Scene::KeyEventGeneratedSignalType& Scene::KeyEventGeneratedSignal()
381 {
382   return mKeyEventGeneratedSignal;
383 }
384
385 Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
386 {
387   return mEventProcessingFinishedSignal;
388 }
389
390 Integration::Scene::TouchEventSignalType& Scene::TouchedSignal()
391 {
392   return mTouchedSignal;
393 }
394
395 Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
396 {
397   return mWheelEventSignal;
398 }
399
400 std::vector<Dali::Internal::SceneGraph::DirtyRect>& Scene::GetItemsDirtyRects()
401 {
402   return mItemsDirtyRects;
403 }
404
405 } // namespace Internal
406
407 } // namespace Dali