Merge "Delete the Scene when requested" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / event / common / scene-impl.cpp
1 /*
2  * Copyright (c) 2019 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/layer-impl.h>
23 #include <dali/internal/event/actors/layer-list.h>
24 #include <dali/internal/event/actors/camera-actor-impl.h>
25 #include <dali/internal/event/common/thread-local-storage.h>
26 #include <dali/internal/event/render-tasks/render-task-list-impl.h>
27 #include <dali/internal/event/render-tasks/render-task-impl.h>
28 #include <dali/internal/event/common/object-registry-impl.h>
29 #include <dali/internal/update/nodes/node.h>
30 #include <dali/internal/update/manager/update-manager.h>
31 #include <dali/public-api/object/type-registry.h>
32 #include <dali/public-api/render-tasks/render-task-list.h>
33 #include <dali/internal/event/rendering/frame-buffer-impl.h>
34 #include <dali/internal/event/size-negotiation/relayout-controller-impl.h>
35
36 using Dali::Internal::SceneGraph::Node;
37
38 namespace Dali
39 {
40
41 namespace Internal
42 {
43
44 namespace
45 {
46
47 const Vector4 DEFAULT_BACKGROUND_COLOR(0.0f, 0.0f, 0.0f, 1.0f); // Default background color
48
49 } //Unnamed namespace
50
51 ScenePtr Scene::New( const Size& size )
52 {
53   ScenePtr scene = new Scene( size );
54
55   // Second-phase construction
56   scene->Initialize();
57
58   return scene;
59 }
60
61 Scene::Scene( const Size& size )
62 : mSurface( nullptr ),
63   mSize( size ),
64   mSurfaceSize( Vector2::ZERO ),
65   mDpi( Vector2::ZERO ),
66   mDepthTreeDirty( false ),
67   mEventProcessor( *this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor() )
68 {
69 }
70
71 Scene::~Scene()
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   // Discard this Scene from the Core
93   Discard();
94 }
95
96 void Scene::Initialize()
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( mSize );
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
130   mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() );
131 }
132
133 void Scene::Add(Actor& actor)
134 {
135   mRootLayer->Add( actor );
136 }
137
138 void Scene::Remove(Actor& actor)
139 {
140   mRootLayer->Remove( actor );
141 }
142
143 Size Scene::GetSize() const
144 {
145   return mSize;
146 }
147
148 void Scene::SetDpi(Vector2 dpi)
149 {
150   mDpi = dpi;
151 }
152
153 Vector2 Scene::GetDpi() const
154 {
155   return mDpi;
156 }
157
158 RenderTaskList& Scene::GetRenderTaskList() const
159 {
160   return *mRenderTaskList;
161 }
162
163 Dali::Layer Scene::GetRootLayer() const
164 {
165   return Dali::Layer( mRootLayer.Get() );
166 }
167
168 LayerList& Scene::GetLayerList() const
169 {
170   return *mLayerList;
171 }
172
173 uint32_t Scene::GetLayerCount() const
174 {
175   return mLayerList->GetLayerCount();
176 }
177
178 Dali::Layer Scene::GetLayer( uint32_t depth ) const
179 {
180   return Dali::Layer(mLayerList->GetLayer( depth ));
181 }
182
183 CameraActor& Scene::GetDefaultCameraActor()
184 {
185   return *mDefaultCamera;
186 }
187
188 Actor& Scene::GetDefaultRootActor()
189 {
190   return *mRootLayer;
191 }
192
193 void Scene::SetSurface( Integration::RenderSurface& surface )
194 {
195   mSurface = &surface;
196   if ( mSurface )
197   {
198     mSurfaceSize.width = static_cast<float>( mSurface->GetPositionSize().width );
199     mSurfaceSize.height = static_cast<float>( mSurface->GetPositionSize().height );
200
201     mSize.width = mSurfaceSize.width;
202     mSize.height = mSurfaceSize.height;
203
204     // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
205     mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
206
207     mRootLayer->SetSize( mSize.width, mSize.height );
208
209     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
210     SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
211     SetDefaultSurfaceRectMessage( updateManager, Rect<int32_t>( 0, 0, static_cast<int32_t>( mSurfaceSize.width ), static_cast<int32_t>( mSurfaceSize.height ) ) ); // truncated
212
213     RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
214
215     // if single render task to screen then set its viewport parameters
216     if( 1 == mRenderTaskList->GetTaskCount() )
217     {
218       if( !defaultRenderTask->GetTargetFrameBuffer() )
219       {
220         defaultRenderTask->SetViewport( Viewport( 0, 0, static_cast<int32_t>( mSurfaceSize.width ), static_cast<int32_t>( mSurfaceSize.height ) ) ); // truncated
221       }
222     }
223
224     mFrameBuffer = Dali::Internal::FrameBuffer::New( surface, Dali::FrameBuffer::Attachment::NONE );
225     defaultRenderTask->SetFrameBuffer( mFrameBuffer );
226   }
227 }
228
229 Integration::RenderSurface* Scene::GetSurface() const
230 {
231   return mSurface;
232 }
233
234 void Scene::Discard()
235 {
236   if( ThreadLocalStorage::Created() )
237   {
238     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
239     tls->RemoveScene( this );
240   }
241 }
242
243 void Scene::RequestRebuildDepthTree()
244 {
245   mDepthTreeDirty = true;
246 }
247
248 void Scene::QueueEvent( const Integration::Event& event )
249 {
250   mEventProcessor.QueueEvent( event );
251 }
252
253 void Scene::ProcessEvents()
254 {
255   mEventProcessor.ProcessEvents();
256 }
257
258 void Scene::RebuildDepthTree()
259 {
260   // If the depth tree needs rebuilding, do it in this frame only.
261   if( mDepthTreeDirty )
262   {
263     ActorPtr actor( mRootLayer.Get() );
264     actor->RebuildDepthTree();
265     mDepthTreeDirty = false;
266   }
267 }
268
269 void Scene::SetBackgroundColor(Vector4 color)
270 {
271   if( mSurface )
272   {
273     mSurface->SetBackgroundColor( color );
274   }
275 }
276
277 Vector4 Scene::GetBackgroundColor() const
278 {
279   return mSurface ? mSurface->GetBackgroundColor() : DEFAULT_BACKGROUND_COLOR;
280 }
281
282 void Scene::EmitKeyEventSignal(const KeyEvent& event)
283 {
284   mKeyEventSignal.Emit( event );
285 }
286
287 void Scene::EmitEventProcessingFinishedSignal()
288 {
289   mEventProcessingFinishedSignal.Emit();
290 }
291
292 void Scene::EmitTouchedSignal( const TouchEvent& touchEvent, const Dali::TouchData& touch )
293 {
294   mTouchedSignal.Emit( touchEvent );
295   mTouchSignal.Emit( touch );
296 }
297
298 void Scene::EmitWheelEventSignal(const WheelEvent& event)
299 {
300   mWheelEventSignal.Emit( event );
301 }
302
303 Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
304 {
305   return mKeyEventSignal;
306 }
307
308 Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
309 {
310   return mEventProcessingFinishedSignal;
311 }
312
313 Scene::TouchedSignalType& Scene::TouchedSignal()
314 {
315   return mTouchedSignal;
316 }
317
318 Integration::Scene::TouchSignalType& Scene::TouchSignal()
319 {
320   return mTouchSignal;
321 }
322
323 Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
324 {
325   return mWheelEventSignal;
326 }
327
328 } // Internal
329
330 } // Dali