0a065e9e3637ac2c0f4467d7a59807d4b50f1e71
[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   mBackgroundColor( DEFAULT_BACKGROUND_COLOR ),
67   mDepthTreeDirty( false ),
68   mEventProcessor( *this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor() )
69 {
70 }
71
72 Scene::~Scene()
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( mRenderTaskList )
89   {
90     mRenderTaskList.Reset();
91   }
92
93   if( ThreadLocalStorage::Created() )
94   {
95     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
96     tls->RemoveScene( this );
97   }
98 }
99
100 void Scene::Initialize()
101 {
102   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
103
104   DALI_ASSERT_ALWAYS( tls && "Attempt to create scene before core exists!" );
105
106   tls->AddScene( this );
107
108   SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
109
110   // Create the ordered list of layers
111   mLayerList = LayerList::New( updateManager );
112
113   // The scene owns the default layer
114   mRootLayer = Layer::NewRoot( *mLayerList, updateManager );
115   mRootLayer->SetName("RootLayer");
116   mRootLayer->SetScene( *this );
117
118   // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE).
119   // This stops actors parented to the stage having their relayout requests propagating
120   // up to the root layer, and down through other children unnecessarily.
121   mRootLayer->SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
122
123   // Create the default camera actor first; this is needed by the RenderTaskList
124   // The default camera attributes and position is such that children of the default layer,
125   // can be positioned at (0,0) and be at the top-left of the viewport.
126   mDefaultCamera = CameraActor::New( mSize );
127   mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
128   Add(*(mDefaultCamera.Get()));
129
130   // Create the list of render-tasks
131   mRenderTaskList = RenderTaskList::New();
132
133   // Create the default render-task
134   mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() );
135 }
136
137 void Scene::Add(Actor& actor)
138 {
139   mRootLayer->Add( actor );
140 }
141
142 void Scene::Remove(Actor& actor)
143 {
144   mRootLayer->Remove( actor );
145 }
146
147 Size Scene::GetSize() const
148 {
149   return mSize;
150 }
151
152 void Scene::SetDpi(Vector2 dpi)
153 {
154   mDpi = dpi;
155 }
156
157 Vector2 Scene::GetDpi() const
158 {
159   return mDpi;
160 }
161
162 RenderTaskList& Scene::GetRenderTaskList() const
163 {
164   return *mRenderTaskList;
165 }
166
167 Dali::Layer Scene::GetRootLayer() const
168 {
169   return Dali::Layer( mRootLayer.Get() );
170 }
171
172 LayerList& Scene::GetLayerList() const
173 {
174   return *mLayerList;
175 }
176
177 uint32_t Scene::GetLayerCount() const
178 {
179   return mLayerList->GetLayerCount();
180 }
181
182 Dali::Layer Scene::GetLayer( uint32_t depth ) const
183 {
184   return Dali::Layer(mLayerList->GetLayer( depth ));
185 }
186
187 CameraActor& Scene::GetDefaultCameraActor()
188 {
189   return *mDefaultCamera;
190 }
191
192 Actor& Scene::GetDefaultRootActor()
193 {
194   return *mRootLayer;
195 }
196
197 void Scene::SetSurface( Integration::RenderSurface& surface )
198 {
199   mSurface = &surface;
200   if ( mSurface )
201   {
202     RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
203
204     mFrameBuffer = Dali::Internal::FrameBuffer::New( surface, Dali::FrameBuffer::Attachment::NONE );
205     defaultRenderTask->SetFrameBuffer( mFrameBuffer );
206
207     SurfaceResized();
208   }
209 }
210
211 void Scene::SurfaceResized()
212 {
213   if( mSurface )
214   {
215     const float fWidth = static_cast<float>( mSurface->GetPositionSize().width );
216     const float fHeight = static_cast<float>( mSurface->GetPositionSize().height );
217
218     if( ( fabsf( mSurfaceSize.width - fWidth ) > Math::MACHINE_EPSILON_1 ) || ( fabsf( mSurfaceSize.height - fHeight ) > Math::MACHINE_EPSILON_1 ) )
219     {
220       Rect<int32_t> newSize( 0, 0, static_cast<int32_t>( mSurface->GetPositionSize().width ), static_cast<int32_t>( mSurface->GetPositionSize().height ) );
221
222       mSurfaceSize.width = fWidth;
223       mSurfaceSize.height = fHeight;
224
225       mSize.width = mSurfaceSize.width;
226       mSize.height = mSurfaceSize.height;
227
228       // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
229       mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
230
231       mRootLayer->SetSize( mSize.width, mSize.height );
232
233       ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
234       SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
235       SetDefaultSurfaceRectMessage( updateManager, newSize ); // truncated
236
237       RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
238
239       // if single render task to screen then set its viewport parameters
240       if( 1 == mRenderTaskList->GetTaskCount() )
241       {
242         if( !defaultRenderTask->GetTargetFrameBuffer() )
243         {
244           defaultRenderTask->SetViewport( newSize ); // truncated
245         }
246       }
247
248       defaultRenderTask->GetFrameBuffer()->SetSize( static_cast<uint32_t>( newSize.width ), static_cast<uint32_t>( newSize.height ) );
249     }
250   }
251 }
252
253 Integration::RenderSurface* Scene::GetSurface() const
254 {
255   return mSurface;
256 }
257
258 void Scene::RequestRebuildDepthTree()
259 {
260   mDepthTreeDirty = true;
261 }
262
263 void Scene::QueueEvent( const Integration::Event& event )
264 {
265   mEventProcessor.QueueEvent( event );
266 }
267
268 void Scene::ProcessEvents()
269 {
270   mEventProcessor.ProcessEvents();
271 }
272
273 void Scene::RebuildDepthTree()
274 {
275   // If the depth tree needs rebuilding, do it in this frame only.
276   if( mDepthTreeDirty )
277   {
278     ActorPtr actor( mRootLayer.Get() );
279     actor->RebuildDepthTree();
280     mDepthTreeDirty = false;
281   }
282 }
283
284 void Scene::SetBackgroundColor( const Vector4& color )
285 {
286   mBackgroundColor = color;
287
288   if( mSurface )
289   {
290     mRenderTaskList->GetTask( 0u )->GetFrameBuffer()->SetBackgroundColor( color );
291   }
292 }
293
294 Vector4 Scene::GetBackgroundColor() const
295 {
296   return mBackgroundColor;
297 }
298
299 void Scene::EmitKeyEventSignal(const KeyEvent& event)
300 {
301   mKeyEventSignal.Emit( event );
302 }
303
304 bool Scene::EmitKeyEventGeneratedSignal(const KeyEvent& event)
305 {
306   // Emit the KeyEventGenerated signal when KeyEvent is generated
307   return mKeyEventGeneratedSignal.Emit( event );
308 }
309
310 void Scene::EmitEventProcessingFinishedSignal()
311 {
312   mEventProcessingFinishedSignal.Emit();
313 }
314
315 void Scene::EmitTouchedSignal( const TouchEvent& touchEvent, const Dali::TouchData& touch )
316 {
317   mTouchedSignal.Emit( touchEvent );
318   mTouchSignal.Emit( touch );
319 }
320
321 void Scene::EmitWheelEventSignal(const WheelEvent& event)
322 {
323   mWheelEventSignal.Emit( event );
324 }
325
326 Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
327 {
328   return mKeyEventSignal;
329 }
330
331 Integration::Scene::KeyEventGeneratedSignalType& Scene::KeyEventGeneratedSignal()
332 {
333   return mKeyEventGeneratedSignal;
334 }
335
336 Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
337 {
338   return mEventProcessingFinishedSignal;
339 }
340
341 Scene::TouchedSignalType& Scene::TouchedSignal()
342 {
343   return mTouchedSignal;
344 }
345
346 Integration::Scene::TouchSignalType& Scene::TouchSignal()
347 {
348   return mTouchSignal;
349 }
350
351 Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
352 {
353   return mWheelEventSignal;
354 }
355
356 } // Internal
357
358 } // Dali