2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali/internal/event/common/stage-impl.h>
24 #include <cstring> // for strcmp
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/event/update/frame-callback-interface-impl.h>
36 #include <dali/internal/update/nodes/node.h>
37 #include <dali/internal/update/manager/scene-graph-frame-callback.h>
38 #include <dali/internal/event/common/object-registry-impl.h>
39 #include <dali/integration-api/platform-abstraction.h>
40 #include <dali/public-api/common/constants.h>
41 #include <dali/public-api/events/touch-data.h>
42 #include <dali/public-api/object/type-registry.h>
43 #include <dali/public-api/render-tasks/render-task-list.h>
44 #include <dali/public-api/rendering/frame-buffer.h>
46 using Dali::Internal::SceneGraph::Node;
50 #if defined(DEBUG_ENABLED)
51 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_DEPTH_TIMER" );
64 const float DEFAULT_STEREO_BASE( 65.0f );
68 const char* const SIGNAL_KEY_EVENT = "keyEvent";
69 const char* const SIGNAL_KEY_EVENT_GENERATED = "keyEventGenerated";
70 const char* const SIGNAL_EVENT_PROCESSING_FINISHED = "eventProcessingFinished";
71 const char* const SIGNAL_TOUCHED = "touched";
72 const char* const SIGNAL_TOUCH = "touch";
73 const char* const SIGNAL_WHEEL_EVENT = "wheelEvent";
74 const char* const SIGNAL_CONTEXT_LOST = "contextLost";
75 const char* const SIGNAL_CONTEXT_REGAINED = "contextRegained";
76 const char* const SIGNAL_SCENE_CREATED = "sceneCreated";
78 TypeRegistration mType( typeid(Dali::Stage), typeid(Dali::BaseHandle), NULL );
80 SignalConnectorType signalConnector1( mType, SIGNAL_KEY_EVENT, &Stage::DoConnectSignal );
81 SignalConnectorType signalConnector2( mType, SIGNAL_EVENT_PROCESSING_FINISHED, &Stage::DoConnectSignal );
82 SignalConnectorType signalConnector3( mType, SIGNAL_TOUCHED, &Stage::DoConnectSignal );
83 SignalConnectorType signalConnector4( mType, SIGNAL_WHEEL_EVENT, &Stage::DoConnectSignal );
84 SignalConnectorType signalConnector5( mType, SIGNAL_CONTEXT_LOST, &Stage::DoConnectSignal );
85 SignalConnectorType signalConnector6( mType, SIGNAL_CONTEXT_REGAINED, &Stage::DoConnectSignal );
86 SignalConnectorType signalConnector7( mType, SIGNAL_SCENE_CREATED, &Stage::DoConnectSignal );
87 SignalConnectorType signalConnector8( mType, SIGNAL_KEY_EVENT_GENERATED, &Stage::DoConnectSignal );
88 SignalConnectorType signalConnector9( mType, SIGNAL_TOUCH, &Stage::DoConnectSignal );
90 } // unnamed namespace
92 StagePtr Stage::New( AnimationPlaylist& playlist,
93 PropertyNotificationManager& propertyNotificationManager,
94 SceneGraph::UpdateManager& updateManager,
95 NotificationManager& notificationManager,
96 Integration::RenderController& renderController )
98 return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager, renderController ) );
101 void Stage::Initialize( bool renderToFbo )
103 mRenderToFbo = renderToFbo;
104 mObjectRegistry = ObjectRegistry::New();
106 // Create the ordered list of layers
107 mLayerList = LayerList::New( mUpdateManager, false/*not system-level*/ );
109 // The stage owns the default layer
110 mRootLayer = Layer::NewRoot( *mLayerList, mUpdateManager, false/*not system-level*/ );
111 mRootLayer->SetName("RootLayer");
112 // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE).
113 // This stops actors parented to the stage having their relayout requests propagating
114 // up to the root layer, and down through other children unnecessarily.
115 mRootLayer->SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
117 // Create the default camera actor first; this is needed by the RenderTaskList
118 CreateDefaultCameraActor();
120 // Create the list of render-tasks
121 mRenderTaskList = RenderTaskList::New( *this, *this, false/*not system-level*/ );
123 // Create the default render-task
124 Dali::RenderTask defaultRenderTask = mRenderTaskList->CreateTask();
127 void Stage::Uninitialize()
129 // Remove actors added to SystemOverlay
130 delete mSystemOverlay;
131 mSystemOverlay = NULL;
135 // its enough to release the handle so the object is released
136 // don't need to remove it from root actor as root actor will delete the object
137 mDefaultCamera.Reset();
142 // we are closing down so just delete the root, no point emit disconnect
143 // signals or send messages to update
148 StagePtr Stage::GetCurrent()
150 StagePtr stage( NULL );
151 // no checking in this version
152 ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
155 stage = tls->GetCurrentStage();
160 bool Stage::IsInstalled()
162 return ThreadLocalStorage::Created();
165 ObjectRegistry& Stage::GetObjectRegistry()
167 return *mObjectRegistry;
170 void Stage::RegisterObject( Dali::BaseObject* object )
172 mObjectRegistry->RegisterObject( object );
175 void Stage::UnregisterObject( Dali::BaseObject* object )
177 mObjectRegistry->UnregisterObject( object );
180 Layer& Stage::GetRootActor()
185 AnimationPlaylist& Stage::GetAnimationPlaylist()
187 return mAnimationPlaylist;
190 PropertyNotificationManager& Stage::GetPropertyNotificationManager()
192 return mPropertyNotificationManager;
195 void Stage::Add( Actor& actor )
197 mRootLayer->Add( actor );
200 void Stage::Remove( Actor& actor )
202 mRootLayer->Remove( actor );
205 void Stage::SurfaceResized( float width, float height )
207 if( ( fabsf( width - mSurfaceSize.width ) > Math::MACHINE_EPSILON_1000 ) || ( fabsf( height - mSurfaceSize.height ) > Math::MACHINE_EPSILON_1000 ) )
209 mSurfaceSize.width = width;
210 mSurfaceSize.height = height;
212 // Internally we want to report the actual size of the stage.
214 mSize.height = height - static_cast<float>( mTopMargin );
216 // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
217 mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
219 // Adjust the camera height to allow for top-margin
220 SetDefaultCameraPosition();
222 mRootLayer->SetSize( mSize.width, mSize.height );
224 // Repeat for SystemOverlay actors
227 // Note that the SystemOverlay has a separate camera, configured for the full surface-size.
228 // This will remain unaffected by changes in SetDefaultCameraPosition()
229 mSystemOverlay->GetImpl()->SetSize( width, height );
232 SetDefaultSurfaceRectMessage( mUpdateManager, Rect<int32_t>( 0, 0, static_cast<int32_t>( width ), static_cast<int32_t>( height ) ) ); // truncated
234 // if single render task to screen then set its viewport parameters
235 if( 1 == mRenderTaskList->GetTaskCount() )
237 Dali::RenderTask defaultRenderTask = mRenderTaskList->GetTask( 0u );
239 if(!defaultRenderTask.GetTargetFrameBuffer())
241 defaultRenderTask.SetViewport( Viewport( 0, 0, static_cast<int32_t>( width ), static_cast<int32_t>( height ) ) ); // truncated
247 Dali::FrameBuffer frameBuffer = Dali::FrameBuffer::New( static_cast<uint32_t>( width ), static_cast<uint32_t>( height ), Dali::FrameBuffer::Attachment::NONE );
248 Dali::Texture texture = Dali::Texture::New( Dali::TextureType::TEXTURE_2D, Dali::Pixel::RGB888, static_cast<uint32_t>( width ), static_cast<uint32_t>( height ) );
249 frameBuffer.AttachColorTexture( texture );
251 Dali::RenderTask defaultRenderTask = mRenderTaskList->GetTask( 0u );
252 defaultRenderTask.SetFrameBuffer( frameBuffer );
257 Vector2 Stage::GetSize() const
262 void Stage::SetTopMargin( uint32_t margin )
264 if (mTopMargin == margin)
270 mSize.width = mSurfaceSize.width;
271 mSize.height = mSurfaceSize.height - static_cast<float>( mTopMargin );
273 // Adjust the camera height to allow for top-margin
274 SetDefaultCameraPosition();
276 mRootLayer->SetSize( mSize.width, mSize.height );
279 RenderTaskList& Stage::GetRenderTaskList() const
281 return *mRenderTaskList;
284 void Stage::CreateDefaultCameraActor()
286 // The default camera attributes and position is such that
287 // children of the default layer, can be positioned at (0,0) and
288 // be at the top-left of the viewport.
289 mDefaultCamera = CameraActor::New( Size::ZERO );
290 mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
291 Add(*(mDefaultCamera.Get()));
294 void Stage::SetDefaultCameraPosition()
296 mDefaultCamera->SetY( -(static_cast<float>(mTopMargin) * 0.5f) );
299 Actor& Stage::GetDefaultRootActor()
304 CameraActor& Stage::GetDefaultCameraActor()
306 return *mDefaultCamera;
309 uint32_t Stage::GetLayerCount() const
311 return mLayerList->GetLayerCount();
314 Dali::Layer Stage::GetLayer( uint32_t depth ) const
316 return Dali::Layer(mLayerList->GetLayer( depth ));
319 Dali::Layer Stage::GetRootLayer() const
321 return Dali::Layer( mRootLayer.Get() );
324 LayerList& Stage::GetLayerList()
329 Integration::SystemOverlay& Stage::GetSystemOverlay()
331 // Lazily create system-level if requested
332 if( !mSystemOverlay )
334 mSystemOverlay = new Integration::SystemOverlay( SystemOverlay::New( *this ) );
335 DALI_ASSERT_ALWAYS( NULL != mSystemOverlay && "Failed to create system overlay" );
337 mSystemOverlay->GetImpl()->SetSize( mSize.width, mSize.height );
340 return *mSystemOverlay;
343 SystemOverlay* Stage::GetSystemOverlayInternal()
345 SystemOverlay* overlay( NULL );
349 overlay = mSystemOverlay->GetImpl();
355 void Stage::SetViewMode( ViewMode viewMode )
357 if( mViewMode != viewMode )
359 DALI_LOG_INFO( Debug::Filter::gActor, Debug::Concise, "View mode changed from %d to %d\n", mViewMode, viewMode);
361 if( mViewMode == MONO )
363 mDefaultCamera->SetOrientation( Dali::ANGLE_180, Vector3::YAXIS );
364 mRenderTaskList->GetTask(0).SetSourceActor( Dali::Actor() );
366 //Create camera and RenderTask for left eye
367 mLeftCamera = CameraActor::New( Size::ZERO );
368 mLeftCamera->SetParentOrigin( ParentOrigin::CENTER );
369 mDefaultCamera->Add( *mLeftCamera.Get() );
370 mLeftRenderTask = mRenderTaskList->CreateTask();
371 mLeftRenderTask.SetCameraActor( Dali::CameraActor( mLeftCamera.Get() ) );
372 mLeftCamera->SetType( Dali::Camera::FREE_LOOK );
374 //Create camera and RenderTask for right eye
375 mRightCamera = CameraActor::New( Size::ZERO );
376 mRightCamera->SetParentOrigin( ParentOrigin::CENTER );
377 mDefaultCamera->Add( *mRightCamera.Get() );
378 mRightRenderTask = mRenderTaskList->CreateTask();
379 mRightRenderTask.SetClearColor( Vector4( 1.0f,0.0f,0.0f,1.0f));
381 mRightRenderTask.SetCameraActor( Dali::CameraActor( mRightCamera.Get() ) );
382 mRightCamera->SetType( Dali::Camera::FREE_LOOK );
386 mViewMode = viewMode;
392 // delete extra stereoscopic render tasks and cameras
393 mRenderTaskList->RemoveTask( mLeftRenderTask );
394 mDefaultCamera->Remove( *mLeftCamera.Get() );
395 mLeftRenderTask.Reset();
397 mRenderTaskList->RemoveTask( mRightRenderTask );
398 mDefaultCamera->Remove( *mRightCamera.Get() );
399 mRightRenderTask.Reset();
400 mRightCamera.Reset();
401 mDefaultCamera->SetOrientation( Dali::ANGLE_0, Vector3::YAXIS );
402 mDefaultCamera->SetType( Dali::Camera::LOOK_AT_TARGET );
403 mRenderTaskList->GetTask(0).SetSourceActor( Dali::Layer(mRootLayer.Get()) );
407 case STEREO_HORIZONTAL:
409 //Stereo mode with horizontal split is for landscape mode. That's the reason for the cameras being rotated
410 //Top camera renders the scene as seen from the right eye and bottom camera as seen from left.
412 //Calculate separation in pixels along vertical axis ( mStereoBase is defined in millimetres )
413 const float stereoBase( ( (mStereoBase / 25.4f) * GetDpi().y ) * 0.5f );
415 //Calculate aspect ratio
416 float aspect = mSize.width / (mSize.height * 0.5f);
418 mLeftCamera->SetPerspectiveProjection( mSize, Vector2( 0.0f,stereoBase) );
419 mLeftCamera->SetAspectRatio( aspect );
421 mLeftCamera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS );
422 mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
423 mLeftRenderTask.SetViewport( Viewport(0, static_cast<int32_t>( mSize.height * 0.5f ), static_cast<int32_t>( mSize.width ), static_cast<int32_t>( mSize.height * 0.5f ) ) ); // truncated
425 mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase ) );
426 mRightCamera->SetAspectRatio( aspect );
427 mRightCamera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS );
428 mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) );
429 mRightRenderTask.SetViewport( Viewport(0, 0, static_cast<int32_t>( mSize.width ), static_cast<int32_t>( mSize.height * 0.5f ) ) ); // truncated
433 case STEREO_VERTICAL:
435 //Calculate separation in pixels along horizontal axis
436 const float stereoBase( ( (mStereoBase / 25.4f) * GetDpi().x ) * 0.5f );
438 //Recalculate fov based on viewport size
439 const float fov = 2.0f * std::atan( mSize.y / (2.0f * std::max( mSize.x*0.5f, mSize.y )) );
441 mLeftCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(stereoBase,0.0f) );
442 mLeftCamera->SetFieldOfView( fov );
443 mLeftCamera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS );
444 mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
445 mLeftRenderTask.SetViewport( Viewport(0, 0, static_cast<int32_t>( mSize.width * 0.5f ), static_cast<int32_t>( mSize.height ) ) ); // truncated
447 mRightCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(-stereoBase,0.0f) );
448 mRightCamera->SetFieldOfView( fov );
449 mRightCamera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS );
450 mRightCamera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) );
451 mRightRenderTask.SetViewport( Viewport( static_cast<int32_t>( mSize.width * 0.5f ), 0, static_cast<int32_t>( mSize.width * 0.5f ), static_cast<int32_t>( mSize.height ) ) ); // truncated
455 case STEREO_INTERLACED:
463 ViewMode Stage::GetViewMode() const
468 void Stage::SetStereoBase( float stereoBase )
470 if( ! Equals( mStereoBase, stereoBase ) )
472 DALI_LOG_INFO( Debug::Filter::gActor, Debug::Concise, "old( %.2f) new(%.2f)\n", mStereoBase, stereoBase );
473 mStereoBase = stereoBase;
477 case STEREO_HORIZONTAL:
479 stereoBase = mStereoBase / 25.4f * GetDpi().y * 0.5f;
480 float aspect = mSize.width / (mSize.height * 0.5f);
482 mLeftCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, stereoBase) );
483 mLeftCamera->SetAspectRatio( aspect );
484 mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
486 mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase) );
487 mRightCamera->SetAspectRatio( aspect );
488 mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) );
492 case STEREO_VERTICAL:
494 stereoBase = mStereoBase / 25.4f * GetDpi().x * 0.5f;
495 const float fov = 2.0f * std::atan( mSize.y / (2.0f * std::max( mSize.x*0.5f, mSize.y )) );
497 mLeftCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(stereoBase,0.0f) );
498 mLeftCamera->SetFieldOfView( fov );
499 mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) );
501 mRightCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(-stereoBase,0.0f) );
502 mRightCamera->SetFieldOfView( fov );
503 mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) );
513 float Stage::GetStereoBase() const
518 void Stage::SetBackgroundColor(Vector4 color)
520 // Cache for public GetBackgroundColor()
521 mBackgroundColor = color;
523 // Send message to change color in next frame
524 SetBackgroundColorMessage( mUpdateManager, color );
527 Vector4 Stage::GetBackgroundColor() const
529 return mBackgroundColor;
532 Vector2 Stage::GetDpi() const
537 void Stage::SetDpi(Vector2 dpi)
542 void Stage::KeepRendering( float durationSeconds )
544 // Send message to keep rendering
545 KeepRenderingMessage( mUpdateManager, durationSeconds );
548 void Stage::SetRenderingBehavior( DevelStage::Rendering renderingBehavior )
550 if( mRenderingBehavior != renderingBehavior )
552 // Send message to change the rendering behavior
553 SetRenderingBehaviorMessage( mUpdateManager, renderingBehavior );
555 mRenderingBehavior = renderingBehavior;
559 DevelStage::Rendering Stage::GetRenderingBehavior() const
561 return mRenderingBehavior;
564 bool Stage::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
566 bool connected( true );
567 Stage* stage = static_cast< Stage* >(object); // TypeRegistry guarantees that this is the correct type.
569 if( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_EVENT ) )
571 stage->KeyEventSignal().Connect( tracker, functor );
573 else if( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_EVENT_GENERATED ) )
575 stage->KeyEventGeneratedSignal().Connect( tracker, functor );
577 else if( 0 == strcmp( signalName.c_str(), SIGNAL_EVENT_PROCESSING_FINISHED ) )
579 stage->EventProcessingFinishedSignal().Connect( tracker, functor );
581 else if( 0 == strcmp( signalName.c_str(), SIGNAL_TOUCHED ) )
583 stage->TouchedSignal().Connect( tracker, functor );
585 else if( 0 == strcmp( signalName.c_str(), SIGNAL_TOUCH ) )
587 stage->TouchSignal().Connect( tracker, functor );
589 else if( 0 == strcmp( signalName.c_str(), SIGNAL_WHEEL_EVENT ) )
591 stage->WheelEventSignal().Connect( tracker, functor );
593 else if( 0 == strcmp( signalName.c_str(), SIGNAL_CONTEXT_LOST ) )
595 stage->ContextLostSignal().Connect( tracker, functor );
597 else if( 0 == strcmp( signalName.c_str(), SIGNAL_CONTEXT_REGAINED ) )
599 stage->ContextRegainedSignal().Connect( tracker, functor );
601 else if( 0 == strcmp( signalName.c_str(), SIGNAL_SCENE_CREATED ) )
603 stage->SceneCreatedSignal().Connect( tracker, functor );
607 // signalName does not match any signal
614 void Stage::EmitKeyEventSignal(const KeyEvent& event)
616 // Emit the key event signal when no actor in the stage has gained the key input focus
618 mKeyEventSignal.Emit( event );
621 bool Stage::EmitKeyEventGeneratedSignal(const KeyEvent& event)
623 // Emit the KeyEventGenerated signal when KeyEvent is generated
625 return mKeyEventGeneratedSignal.Emit( event );
628 void Stage::EmitEventProcessingFinishedSignal()
630 mEventProcessingFinishedSignal.Emit();
633 void Stage::EmitTouchedSignal( const TouchEvent& touchEvent, const Dali::TouchData& touch )
635 mTouchedSignal.Emit( touchEvent );
636 mTouchSignal.Emit( touch );
639 void Stage::EmitWheelEventSignal(const WheelEvent& event)
641 // Emit the wheel event signal when no actor in the stage has gained the wheel input focus
643 mWheelEventSignal.Emit( event );
646 void Stage::EmitSceneCreatedSignal()
648 mSceneCreatedSignal.Emit();
651 Dali::Stage::KeyEventSignalType& Stage::KeyEventSignal()
653 return mKeyEventSignal;
656 Dali::DevelStage::KeyEventGeneratedSignalType& Stage::KeyEventGeneratedSignal()
658 return mKeyEventGeneratedSignal;
661 void Stage::AddFrameCallback( FrameCallbackInterface& frameCallback, Actor& rootActor )
663 DALI_ASSERT_ALWAYS( ( ! FrameCallbackInterface::Impl::Get( frameCallback ).IsConnectedToSceneGraph() )
664 && "FrameCallbackInterface implementation already added" );
666 // Create scene-graph object and transfer to UpdateManager
667 OwnerPointer< SceneGraph::FrameCallback > transferOwnership( SceneGraph::FrameCallback::New( frameCallback ) );
668 AddFrameCallbackMessage( mUpdateManager, transferOwnership, rootActor.GetNode() );
671 void Stage::RemoveFrameCallback( FrameCallbackInterface& frameCallback )
673 FrameCallbackInterface::Impl::Get( frameCallback ).Invalidate();
674 RemoveFrameCallbackMessage( mUpdateManager, frameCallback );
677 Dali::Stage::EventProcessingFinishedSignalType& Stage::EventProcessingFinishedSignal()
679 return mEventProcessingFinishedSignal;
682 Dali::Stage::TouchedSignalType& Stage::TouchedSignal()
684 DALI_LOG_WARNING( "Deprecated. Use TouchSignal() instead.\n" );
685 return mTouchedSignal;
688 Dali::Stage::TouchSignalType& Stage::TouchSignal()
693 Dali::Stage::WheelEventSignalType& Stage::WheelEventSignal()
695 return mWheelEventSignal;
698 Dali::Stage::ContextStatusSignal& Stage::ContextLostSignal()
700 return mContextLostSignal;
703 Dali::Stage::ContextStatusSignal& Stage::ContextRegainedSignal()
705 return mContextRegainedSignal;
708 Dali::Stage::SceneCreatedSignalType& Stage::SceneCreatedSignal()
710 return mSceneCreatedSignal;
713 void Stage::NotifyContextLost()
715 mContextLostSignal.Emit();
718 void Stage::NotifyContextRegained()
720 mContextRegainedSignal.Emit();
724 void Stage::RequestRebuildDepthTree()
726 DALI_LOG_INFO(gLogFilter, Debug::General, "RequestRebuildDepthTree()\n");
727 mDepthTreeDirty = true;
730 void Stage::RebuildDepthTree()
732 // If the depth tree needs rebuilding, do it in this frame only.
733 if( mDepthTreeDirty )
735 DALI_LOG_INFO(gLogFilter, Debug::Concise, "RebuildDepthTree() dirty:T\n");
737 ActorPtr actor( mRootLayer.Get() );
738 actor->RebuildDepthTree();
739 mDepthTreeDirty = false;
744 Stage::Stage( AnimationPlaylist& playlist,
745 PropertyNotificationManager& propertyNotificationManager,
746 SceneGraph::UpdateManager& updateManager,
747 NotificationManager& notificationManager,
748 Integration::RenderController& renderController )
749 : mAnimationPlaylist( playlist ),
750 mPropertyNotificationManager( propertyNotificationManager ),
751 mUpdateManager( updateManager ),
752 mNotificationManager( notificationManager ),
753 mRenderController( renderController ),
754 mSize( Vector2::ZERO ),
755 mSurfaceSize( Vector2::ZERO ),
756 mBackgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ),
758 mStereoBase( DEFAULT_STEREO_BASE ),
760 mDpi( Vector2::ZERO ),
763 mSystemOverlay( NULL ),
765 mKeyEventGeneratedSignal(),
766 mEventProcessingFinishedSignal(),
770 mContextLostSignal(),
771 mContextRegainedSignal(),
772 mSceneCreatedSignal(),
773 mRenderingBehavior( DevelStage::Rendering::IF_REQUIRED ),
774 mDepthTreeDirty( false ),
775 mForceNextUpdate( false ),
776 mRenderToFbo( false )
780 SceneGraph::UpdateManager& Stage::GetUpdateManager()
782 return mUpdateManager;
785 Integration::RenderController& Stage::GetRenderController()
787 return mRenderController;
790 uint32_t* Stage::ReserveMessageSlot( uint32_t size, bool updateScene )
792 return mUpdateManager.ReserveMessageSlot( size, updateScene );
795 BufferIndex Stage::GetEventBufferIndex() const
797 return mUpdateManager.GetEventBufferIndex();
800 void Stage::ForceNextUpdate()
802 mForceNextUpdate = true;
805 bool Stage::IsNextUpdateForced()
807 bool nextUpdateForced = mForceNextUpdate;
808 mForceNextUpdate = false;
809 return nextUpdateForced;
814 delete mSystemOverlay;
816 mObjectRegistry.Reset();
819 } // namespace Internal