[4.0] Change to process events when the application is paused
[platform/core/uifw/dali-core.git] / dali / internal / event / common / stage-impl.cpp
1 /*
2  * Copyright (c) 2017 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/stage-impl.h>
20
21 // EXTERNAL INCLUDES
22 #include <algorithm>
23 #include <cmath>
24 #include <cstring> // for strcmp
25
26 // INTERNAL INCLUDES
27 #include <dali/integration-api/system-overlay.h>
28 #include <dali/internal/event/actors/layer-impl.h>
29 #include <dali/internal/event/actors/layer-list.h>
30 #include <dali/internal/event/actors/camera-actor-impl.h>
31 #include <dali/internal/event/common/system-overlay-impl.h>
32 #include <dali/internal/event/common/thread-local-storage.h>
33 #include <dali/internal/event/common/property-notification-manager.h>
34 #include <dali/internal/event/render-tasks/render-task-list-impl.h>
35 #include <dali/internal/update/nodes/node.h>
36 #include <dali/internal/event/common/object-registry-impl.h>
37 #include <dali/integration-api/platform-abstraction.h>
38 #include <dali/public-api/common/constants.h>
39 #include <dali/public-api/events/touch-data.h>
40 #include <dali/public-api/object/type-registry.h>
41 #include <dali/public-api/render-tasks/render-task-list.h>
42
43 using Dali::Internal::SceneGraph::Node;
44
45 namespace
46 {
47 #if defined(DEBUG_ENABLED)
48 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_DEPTH_TIMER" );
49 #endif
50 }
51
52 namespace Dali
53 {
54
55 namespace Internal
56 {
57
58 namespace
59 {
60
61 const float DEFAULT_STEREO_BASE( 65.0f );
62
63 // Signals
64
65 const char* const SIGNAL_KEY_EVENT =                 "keyEvent";
66 const char* const SIGNAL_KEY_EVENT_GENERATED =       "keyEventGenerated";
67 const char* const SIGNAL_EVENT_PROCESSING_FINISHED = "eventProcessingFinished";
68 const char* const SIGNAL_TOUCHED =                   "touched";
69 const char* const SIGNAL_TOUCH =                     "touch";
70 const char* const SIGNAL_WHEEL_EVENT =               "wheelEvent";
71 const char* const SIGNAL_CONTEXT_LOST =              "contextLost";
72 const char* const SIGNAL_CONTEXT_REGAINED =          "contextRegained";
73 const char* const SIGNAL_SCENE_CREATED =             "sceneCreated";
74
75 TypeRegistration mType( typeid(Dali::Stage), typeid(Dali::BaseHandle), NULL );
76
77 SignalConnectorType signalConnector1( mType, SIGNAL_KEY_EVENT,                 &Stage::DoConnectSignal );
78 SignalConnectorType signalConnector2( mType, SIGNAL_EVENT_PROCESSING_FINISHED, &Stage::DoConnectSignal );
79 SignalConnectorType signalConnector3( mType, SIGNAL_TOUCHED,                   &Stage::DoConnectSignal );
80 SignalConnectorType signalConnector4( mType, SIGNAL_WHEEL_EVENT,               &Stage::DoConnectSignal );
81 SignalConnectorType signalConnector5( mType, SIGNAL_CONTEXT_LOST,              &Stage::DoConnectSignal );
82 SignalConnectorType signalConnector6( mType, SIGNAL_CONTEXT_REGAINED,          &Stage::DoConnectSignal );
83 SignalConnectorType signalConnector7( mType, SIGNAL_SCENE_CREATED,             &Stage::DoConnectSignal );
84 SignalConnectorType signalConnector8( mType, SIGNAL_KEY_EVENT_GENERATED,       &Stage::DoConnectSignal );
85 SignalConnectorType signalConnector9( mType, SIGNAL_TOUCH,                     &Stage::DoConnectSignal );
86
87 } // unnamed namespace
88
89 StagePtr Stage::New( AnimationPlaylist& playlist,
90                      PropertyNotificationManager& propertyNotificationManager,
91                      SceneGraph::UpdateManager& updateManager,
92                      NotificationManager& notificationManager,
93                      Integration::RenderController& renderController )
94 {
95   return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager, renderController ) );
96 }
97
98 void Stage::Initialize()
99 {
100   mObjectRegistry = ObjectRegistry::New();
101
102   // Create the ordered list of layers
103   mLayerList = LayerList::New( mUpdateManager, false/*not system-level*/ );
104
105   // The stage owns the default layer
106   mRootLayer = Layer::NewRoot( *mLayerList, mUpdateManager, false/*not system-level*/ );
107   mRootLayer->SetName("RootLayer");
108   // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE).
109   // This stops actors parented to the stage having their relayout requests propagating
110   // up to the root layer, and down through other children unnecessarily.
111   mRootLayer->SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
112
113   // Create the default camera actor first; this is needed by the RenderTaskList
114   CreateDefaultCameraActor();
115
116   // Create the list of render-tasks
117   mRenderTaskList = RenderTaskList::New( *this, *this, false/*not system-level*/ );
118
119   // Create the default render-task
120   Dali::RenderTask defaultRenderTask = mRenderTaskList->CreateTask();
121 }
122
123 void Stage::Uninitialize()
124 {
125   // Remove actors added to SystemOverlay
126   delete mSystemOverlay;
127   mSystemOverlay = NULL;
128
129   if( mDefaultCamera )
130   {
131     // its enough to release the handle so the object is released
132     // don't need to remove it from root actor as root actor will delete the object
133     mDefaultCamera.Reset();
134   }
135
136   if( mRootLayer )
137   {
138     // we are closing down so just delete the root, no point emit disconnect
139     // signals or send messages to update
140     mRootLayer.Reset();
141   }
142 }
143
144 StagePtr Stage::GetCurrent()
145 {
146   StagePtr stage( NULL );
147   // no checking in this version
148   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
149   if( tls )
150   {
151     stage = tls->GetCurrentStage();
152   }
153   return stage;
154 }
155
156 bool Stage::IsInstalled()
157 {
158   return ThreadLocalStorage::Created();
159 }
160
161 ObjectRegistry& Stage::GetObjectRegistry()
162 {
163   return *mObjectRegistry;
164 }
165
166 void Stage::RegisterObject( Dali::BaseObject* object )
167 {
168   mObjectRegistry->RegisterObject( object );
169 }
170
171 void Stage::UnregisterObject( Dali::BaseObject* object )
172 {
173   mObjectRegistry->UnregisterObject( object );
174 }
175
176 Layer& Stage::GetRootActor()
177 {
178   return *mRootLayer;
179 }
180
181 AnimationPlaylist& Stage::GetAnimationPlaylist()
182 {
183   return mAnimationPlaylist;
184 }
185
186 PropertyNotificationManager& Stage::GetPropertyNotificationManager()
187 {
188   return mPropertyNotificationManager;
189 }
190
191 void Stage::Add( Actor& actor )
192 {
193   mRootLayer->Add( actor );
194 }
195
196 void Stage::Remove( Actor& actor )
197 {
198   mRootLayer->Remove( actor );
199 }
200
201 void Stage::SurfaceResized(float width, float height)
202 {
203   mSurfaceSize.width = width;
204   mSurfaceSize.height = height;
205
206   // Internally we want to report the actual size of the stage.
207   mSize.width = width;
208   mSize.height = height - mTopMargin;
209
210   // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
211   mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
212
213   // Adjust the camera height to allow for top-margin
214   SetDefaultCameraPosition();
215
216   mRootLayer->SetSize( mSize.width, mSize.height );
217
218   // Repeat for SystemOverlay actors
219   if( mSystemOverlay )
220   {
221     // Note that the SystemOverlay has a separate camera, configured for the full surface-size.
222     // This will remain unaffected by changes in SetDefaultCameraPosition()
223     mSystemOverlay->GetImpl()->SetSize( width, height );
224   }
225
226   SetDefaultSurfaceRectMessage( mUpdateManager, Rect<int>( 0, 0, width, height ) );
227
228   // if single render task to screen then set its viewport parameters
229   if( 1 == mRenderTaskList->GetTaskCount() )
230   {
231     Dali::RenderTask mDefaultRenderTask = mRenderTaskList->GetTask(0);
232
233     if(!mDefaultRenderTask.GetTargetFrameBuffer())
234     {
235       mDefaultRenderTask.SetViewport( Viewport(0, 0, width, height) );
236     }
237   }
238
239 }
240
241 Vector2 Stage::GetSize() const
242 {
243   return mSize;
244 }
245
246 void Stage::SetTopMargin( unsigned int margin )
247 {
248   if (mTopMargin == margin)
249   {
250     return;
251   }
252   mTopMargin = margin;
253
254   mSize.width = mSurfaceSize.width;
255   mSize.height = mSurfaceSize.height - mTopMargin;
256
257   // Adjust the camera height to allow for top-margin
258   SetDefaultCameraPosition();
259
260   mRootLayer->SetSize( mSize.width, mSize.height );
261 }
262
263 RenderTaskList& Stage::GetRenderTaskList() const
264 {
265   return *mRenderTaskList;
266 }
267
268 void Stage::CreateDefaultCameraActor()
269 {
270   // The default camera attributes and position is such that
271   // children of the default layer, can be positioned at (0,0) and
272   // be at the top-left of the viewport.
273   mDefaultCamera = CameraActor::New( Size::ZERO );
274   mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
275   Add(*(mDefaultCamera.Get()));
276 }
277
278 void Stage::SetDefaultCameraPosition()
279 {
280   mDefaultCamera->SetY( -(static_cast<float>(mTopMargin) * 0.5f) );
281 }
282
283 Actor& Stage::GetDefaultRootActor()
284 {
285   return *mRootLayer;
286 }
287
288 CameraActor& Stage::GetDefaultCameraActor()
289 {
290   return *mDefaultCamera;
291 }
292
293 unsigned int Stage::GetLayerCount() const
294 {
295   return mLayerList->GetLayerCount();
296 }
297
298 Dali::Layer Stage::GetLayer( unsigned int depth ) const
299 {
300   return Dali::Layer(mLayerList->GetLayer( depth ));
301 }
302
303 Dali::Layer Stage::GetRootLayer() const
304 {
305   return Dali::Layer( mRootLayer.Get() );
306 }
307
308 LayerList& Stage::GetLayerList()
309 {
310   return *mLayerList;
311 }
312
313 Integration::SystemOverlay& Stage::GetSystemOverlay()
314 {
315   // Lazily create system-level if requested
316   if( !mSystemOverlay )
317   {
318     mSystemOverlay = new Integration::SystemOverlay( SystemOverlay::New( *this ) );
319     DALI_ASSERT_ALWAYS( NULL != mSystemOverlay && "Failed to create system overlay" );
320
321     mSystemOverlay->GetImpl()->SetSize( mSize.width, mSize.height );
322   }
323
324   return *mSystemOverlay;
325 }
326
327 SystemOverlay* Stage::GetSystemOverlayInternal()
328 {
329   SystemOverlay* overlay( NULL );
330
331   if( mSystemOverlay )
332   {
333     overlay = mSystemOverlay->GetImpl();
334   }
335
336   return overlay;
337 }
338
339 void Stage::SetViewMode( ViewMode viewMode )
340 {
341   if( mViewMode != viewMode )
342   {
343     DALI_LOG_INFO( Debug::Filter::gActor, Debug::Concise, "View mode changed from %d to %d\n", mViewMode, viewMode);
344
345     if( mViewMode == MONO )
346     {
347       mDefaultCamera->SetOrientation( Dali::ANGLE_180, Vector3::YAXIS );
348       mRenderTaskList->GetTask(0).SetSourceActor( Dali::Actor() );
349
350       //Create camera and RenderTask for left eye
351       mLeftCamera = CameraActor::New( Size::ZERO );
352       mLeftCamera->SetParentOrigin( ParentOrigin::CENTER );
353       mDefaultCamera->Add( *mLeftCamera.Get() );
354       mLeftRenderTask = mRenderTaskList->CreateTask();
355       mLeftRenderTask.SetCameraActor( Dali::CameraActor( mLeftCamera.Get() ) );
356       mLeftCamera->SetType( Dali::Camera::FREE_LOOK );
357
358       //Create camera and RenderTask for right eye
359       mRightCamera = CameraActor::New( Size::ZERO );
360       mRightCamera->SetParentOrigin( ParentOrigin::CENTER );
361       mDefaultCamera->Add( *mRightCamera.Get() );
362       mRightRenderTask = mRenderTaskList->CreateTask();
363       mRightRenderTask.SetClearColor( Vector4( 1.0f,0.0f,0.0f,1.0f));
364
365       mRightRenderTask.SetCameraActor( Dali::CameraActor( mRightCamera.Get() ) );
366       mRightCamera->SetType( Dali::Camera::FREE_LOOK );
367     }
368
369     // save new mode
370     mViewMode = viewMode;
371
372     switch( viewMode )
373     {
374       case MONO:
375       {
376         // delete extra stereoscopic render tasks and cameras
377         mRenderTaskList->RemoveTask( mLeftRenderTask );
378         mDefaultCamera->Remove( *mLeftCamera.Get() );
379         mLeftRenderTask.Reset();
380         mLeftCamera.Reset();
381         mRenderTaskList->RemoveTask( mRightRenderTask );
382         mDefaultCamera->Remove( *mRightCamera.Get() );
383         mRightRenderTask.Reset();
384         mRightCamera.Reset();
385         mDefaultCamera->SetOrientation( Dali::ANGLE_0, Vector3::YAXIS );
386         mDefaultCamera->SetType( Dali::Camera::LOOK_AT_TARGET );
387         mRenderTaskList->GetTask(0).SetSourceActor( Dali::Layer(mRootLayer.Get()) );
388
389         break;
390       }
391       case STEREO_HORIZONTAL:
392       {
393         //Stereo mode with horizontal split is for landscape mode. That's the reason for the cameras being rotated
394         //Top camera renders the scene as seen from the right eye and bottom camera as seen from left.
395
396         //Calculate separation in pixels along vertical axis ( mStereoBase is defined in millimetres )
397         const float stereoBase( ( (mStereoBase / 25.4f) * GetDpi().y ) * 0.5f );
398
399         //Calculate aspect ratio
400         float aspect = mSize.width / (mSize.height * 0.5f);
401
402         mLeftCamera->SetPerspectiveProjection( mSize, Vector2( 0.0f,stereoBase) );
403         mLeftCamera->SetAspectRatio( aspect );
404
405         mLeftCamera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS );
406         mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
407         mLeftRenderTask.SetViewport( Viewport(0, mSize.height * 0.5f, mSize.width, mSize.height * 0.5f) );
408
409         mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0,  -stereoBase) );
410         mRightCamera->SetAspectRatio( aspect );
411         mRightCamera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS );
412         mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) );
413         mRightRenderTask.SetViewport( Viewport(0, 0, mSize.width, mSize.height * 0.5f ) );
414
415         break;
416       }
417       case STEREO_VERTICAL:
418       {
419         //Calculate separation in pixels along horizontal axis
420         const float stereoBase( ( (mStereoBase / 25.4f) * GetDpi().x ) * 0.5f );
421
422         //Recalculate fov based on viewport size
423         const float fov = 2.0f * std::atan(  mSize.y / (2.0f * std::max( mSize.x*0.5f, mSize.y )) );
424
425         mLeftCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(stereoBase,0.0f) );
426         mLeftCamera->SetFieldOfView( fov );
427         mLeftCamera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS );
428         mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
429         mLeftRenderTask.SetViewport( Viewport(0, 0, mSize.width * 0.5f, mSize.height ) );
430
431         mRightCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(-stereoBase,0.0f) );
432         mRightCamera->SetFieldOfView( fov );
433         mRightCamera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS );
434         mRightCamera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) );
435         mRightRenderTask.SetViewport( Viewport(mSize.width * 0.5f, 0, mSize.width * 0.5f, mSize.height ) );
436
437         break;
438       }
439       case STEREO_INTERLACED:
440       {
441         break;
442       }
443     }
444   }
445 }
446
447 ViewMode Stage::GetViewMode() const
448 {
449   return mViewMode;
450 }
451
452 void Stage::SetStereoBase( float stereoBase )
453 {
454   if( ! Equals( mStereoBase, stereoBase ) )
455   {
456     DALI_LOG_INFO( Debug::Filter::gActor, Debug::Concise, "old( %.2f) new(%.2f)\n", mStereoBase, stereoBase );
457     mStereoBase = stereoBase;
458
459     switch( mViewMode  )
460     {
461       case STEREO_HORIZONTAL:
462       {
463         stereoBase = mStereoBase / 25.4f * GetDpi().y * 0.5f;
464         float aspect = mSize.width / (mSize.height * 0.5f);
465
466         mLeftCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, stereoBase) );
467         mLeftCamera->SetAspectRatio( aspect );
468         mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
469
470         mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase) );
471         mRightCamera->SetAspectRatio( aspect );
472         mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) );
473
474         break;
475       }
476       case STEREO_VERTICAL:
477       {
478         stereoBase = mStereoBase / 25.4f * GetDpi().x * 0.5f;
479         const float fov = 2.0f * std::atan(  mSize.y / (2.0f * std::max( mSize.x*0.5f, mSize.y )) );
480
481         mLeftCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(stereoBase,0.0f) );
482         mLeftCamera->SetFieldOfView( fov );
483         mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
484
485         mRightCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(-stereoBase,0.0f) );
486         mRightCamera->SetFieldOfView( fov );
487         mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) );
488
489         break;
490       }
491       default:
492         break;
493     }
494   }
495 }
496
497 float Stage::GetStereoBase() const
498 {
499   return mStereoBase;
500 }
501
502 void Stage::SetBackgroundColor(Vector4 color)
503 {
504   // Cache for public GetBackgroundColor()
505   mBackgroundColor = color;
506
507   // Send message to change color in next frame
508   SetBackgroundColorMessage( mUpdateManager, color );
509 }
510
511 Vector4 Stage::GetBackgroundColor() const
512 {
513   return mBackgroundColor;
514 }
515
516 Vector2 Stage::GetDpi() const
517 {
518   return mDpi;
519 }
520
521 void Stage::SetDpi(Vector2 dpi)
522 {
523   mDpi = dpi;
524 }
525
526 void Stage::KeepRendering( float durationSeconds )
527 {
528   // Send message to keep rendering
529   KeepRenderingMessage( mUpdateManager, durationSeconds );
530 }
531
532 bool Stage::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
533 {
534   bool connected( true );
535   Stage* stage = static_cast< Stage* >(object); // TypeRegistry guarantees that this is the correct type.
536
537   if( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_EVENT ) )
538   {
539     stage->KeyEventSignal().Connect( tracker, functor );
540   }
541   else if( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_EVENT_GENERATED ) )
542   {
543     stage->KeyEventGeneratedSignal().Connect( tracker, functor );
544   }
545   else if( 0 == strcmp( signalName.c_str(), SIGNAL_EVENT_PROCESSING_FINISHED ) )
546   {
547     stage->EventProcessingFinishedSignal().Connect( tracker, functor );
548   }
549   else if( 0 == strcmp( signalName.c_str(), SIGNAL_TOUCHED ) )
550   {
551     stage->TouchedSignal().Connect( tracker, functor );
552   }
553   else if( 0 == strcmp( signalName.c_str(), SIGNAL_TOUCH ) )
554   {
555     stage->TouchSignal().Connect( tracker, functor );
556   }
557   else if( 0 == strcmp( signalName.c_str(), SIGNAL_WHEEL_EVENT ) )
558   {
559     stage->WheelEventSignal().Connect( tracker, functor );
560   }
561   else if( 0 == strcmp( signalName.c_str(), SIGNAL_CONTEXT_LOST ) )
562   {
563     stage->ContextLostSignal().Connect( tracker, functor );
564   }
565   else if( 0 == strcmp( signalName.c_str(), SIGNAL_CONTEXT_REGAINED ) )
566   {
567     stage->ContextRegainedSignal().Connect( tracker, functor );
568   }
569   else if( 0 == strcmp( signalName.c_str(), SIGNAL_SCENE_CREATED ) )
570   {
571     stage->SceneCreatedSignal().Connect( tracker, functor );
572   }
573   else
574   {
575     // signalName does not match any signal
576     connected = false;
577   }
578
579   return connected;
580 }
581
582 void Stage::EmitKeyEventSignal(const KeyEvent& event)
583 {
584   // Emit the key event signal when no actor in the stage has gained the key input focus
585
586   mKeyEventSignal.Emit( event );
587 }
588
589 bool Stage::EmitKeyEventGeneratedSignal(const KeyEvent& event)
590 {
591   // Emit the KeyEventGenerated signal when KeyEvent is generated
592
593   return mKeyEventGeneratedSignal.Emit( event );
594 }
595
596 void Stage::EmitEventProcessingFinishedSignal()
597 {
598    mEventProcessingFinishedSignal.Emit();
599 }
600
601 void Stage::EmitTouchedSignal( const TouchEvent& touchEvent, const Dali::TouchData& touch )
602 {
603   mTouchedSignal.Emit( touchEvent );
604   mTouchSignal.Emit( touch );
605 }
606
607 void Stage::EmitWheelEventSignal(const WheelEvent& event)
608 {
609   // Emit the wheel event signal when no actor in the stage has gained the wheel input focus
610
611   mWheelEventSignal.Emit( event );
612 }
613
614 void Stage::EmitSceneCreatedSignal()
615 {
616   mSceneCreatedSignal.Emit();
617 }
618
619 Dali::Stage::KeyEventSignalType& Stage::KeyEventSignal()
620 {
621   return mKeyEventSignal;
622 }
623
624 Dali::DevelStage::KeyEventGeneratedSignalType& Stage::KeyEventGeneratedSignal()
625 {
626   return mKeyEventGeneratedSignal;
627 }
628
629 Dali::Stage::EventProcessingFinishedSignalType& Stage::EventProcessingFinishedSignal()
630 {
631   return mEventProcessingFinishedSignal;
632 }
633
634 Dali::Stage::TouchedSignalType& Stage::TouchedSignal()
635 {
636   DALI_LOG_WARNING( "Deprecated. Use TouchSignal() instead.\n" );
637   return mTouchedSignal;
638 }
639
640 Dali::Stage::TouchSignalType& Stage::TouchSignal()
641 {
642   return mTouchSignal;
643 }
644
645 Dali::Stage::WheelEventSignalType& Stage::WheelEventSignal()
646 {
647   return mWheelEventSignal;
648 }
649
650 Dali::Stage::ContextStatusSignal& Stage::ContextLostSignal()
651 {
652   return mContextLostSignal;
653 }
654
655 Dali::Stage::ContextStatusSignal& Stage::ContextRegainedSignal()
656 {
657   return mContextRegainedSignal;
658 }
659
660 Dali::Stage::SceneCreatedSignalType& Stage::SceneCreatedSignal()
661 {
662   return mSceneCreatedSignal;
663 }
664
665 void Stage::NotifyContextLost()
666 {
667   mContextLostSignal.Emit();
668 }
669
670 void Stage::NotifyContextRegained()
671 {
672   mContextRegainedSignal.Emit();
673 }
674
675
676 void Stage::RequestRebuildDepthTree()
677 {
678   DALI_LOG_INFO(gLogFilter, Debug::General, "RequestRebuildDepthTree()\n");
679   mDepthTreeDirty = true;
680 }
681
682 void Stage::RebuildDepthTree()
683 {
684   // If the depth tree needs rebuilding, do it in this frame only.
685   if( mDepthTreeDirty )
686   {
687     DALI_LOG_INFO(gLogFilter, Debug::Concise, "RebuildDepthTree() dirty:T\n");
688
689     ActorPtr actor( mRootLayer.Get() );
690     actor->RebuildDepthTree();
691     mDepthTreeDirty = false;
692   }
693 }
694
695
696 Stage::Stage( AnimationPlaylist& playlist,
697               PropertyNotificationManager& propertyNotificationManager,
698               SceneGraph::UpdateManager& updateManager,
699               NotificationManager& notificationManager,
700               Integration::RenderController& renderController )
701 : mAnimationPlaylist( playlist ),
702   mPropertyNotificationManager( propertyNotificationManager ),
703   mUpdateManager( updateManager ),
704   mNotificationManager( notificationManager ),
705   mRenderController( renderController ),
706   mSize( Vector2::ZERO ),
707   mBackgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ),
708   mViewMode( MONO ),
709   mStereoBase( DEFAULT_STEREO_BASE ),
710   mTopMargin( 0 ),
711   mSystemOverlay( NULL ),
712   mDepthTreeDirty( false ),
713   mForceNextUpdate( false )
714 {
715 }
716
717 SceneGraph::UpdateManager& Stage::GetUpdateManager()
718 {
719   return mUpdateManager;
720 }
721
722 Integration::RenderController& Stage::GetRenderController()
723 {
724   return mRenderController;
725 }
726
727 unsigned int* Stage::ReserveMessageSlot( std::size_t size, bool updateScene )
728 {
729   return mUpdateManager.ReserveMessageSlot( size, updateScene );
730 }
731
732 BufferIndex Stage::GetEventBufferIndex() const
733 {
734   return mUpdateManager.GetEventBufferIndex();
735 }
736
737 void Stage::ForceNextUpdate()
738 {
739   mForceNextUpdate = true;
740 }
741
742 bool Stage::IsNextUpdateForced()
743 {
744   bool nextUpdateForced = mForceNextUpdate;
745   mForceNextUpdate = false;
746   return nextUpdateForced;
747 }
748
749 Stage::~Stage()
750 {
751   delete mSystemOverlay;
752
753   mObjectRegistry.Reset();
754 }
755
756 } // namespace Internal
757
758 } // namespace Dali