X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fcommon%2Fstage-impl.cpp;h=f1d7b01135710c50d7dd91f8d2cd88047676de87;hb=9697546f6395000a500259997c415d9ff3c2e337;hp=905cfba4b678ce9fd05f73d24f791add9ae7f799;hpb=35ae944cd226dd2594260c4e36b83a06773250da;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/common/stage-impl.cpp b/dali/internal/event/common/stage-impl.cpp index 905cfba..f1d7b01 100644 --- a/dali/internal/event/common/stage-impl.cpp +++ b/dali/internal/event/common/stage-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,13 +32,16 @@ #include #include #include +#include #include +#include #include #include #include #include #include #include +#include using Dali::Internal::SceneGraph::Node; @@ -89,20 +92,22 @@ SignalConnectorType signalConnector9( mType, SIGNAL_TOUCH, & StagePtr Stage::New( AnimationPlaylist& playlist, PropertyNotificationManager& propertyNotificationManager, SceneGraph::UpdateManager& updateManager, - NotificationManager& notificationManager ) + NotificationManager& notificationManager, + Integration::RenderController& renderController ) { - return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager ) ); + return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager, renderController ) ); } -void Stage::Initialize() +void Stage::Initialize( bool renderToFbo ) { + mRenderToFbo = renderToFbo; mObjectRegistry = ObjectRegistry::New(); // Create the ordered list of layers - mLayerList = LayerList::New( mUpdateManager, false/*not system-level*/ ); + mLayerList = LayerList::New( mUpdateManager ); // The stage owns the default layer - mRootLayer = Layer::NewRoot( *mLayerList, mUpdateManager, false/*not system-level*/ ); + mRootLayer = Layer::NewRoot( *mLayerList, mUpdateManager ); mRootLayer->SetName("RootLayer"); // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE). // This stops actors parented to the stage having their relayout requests propagating @@ -113,10 +118,10 @@ void Stage::Initialize() CreateDefaultCameraActor(); // Create the list of render-tasks - mRenderTaskList = RenderTaskList::New( *this, *this, false/*not system-level*/ ); + mRenderTaskList = RenderTaskList::New(); // Create the default render-task - Dali::RenderTask defaultRenderTask = mRenderTaskList->CreateTask(); + Dali::RenderTask defaultRenderTask = mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() ); } void Stage::Uninitialize() @@ -138,6 +143,11 @@ void Stage::Uninitialize() // signals or send messages to update mRootLayer.Reset(); } + + if( mRenderTaskList ) + { + mRenderTaskList.Reset(); + } } StagePtr Stage::GetCurrent() @@ -197,44 +207,56 @@ void Stage::Remove( Actor& actor ) mRootLayer->Remove( actor ); } -void Stage::SurfaceResized(float width, float height) +void Stage::SurfaceResized( float width, float height ) { - mSurfaceSize.width = width; - mSurfaceSize.height = height; + if( ( fabsf( width - mSurfaceSize.width ) > Math::MACHINE_EPSILON_1000 ) || ( fabsf( height - mSurfaceSize.height ) > Math::MACHINE_EPSILON_1000 ) ) + { + mSurfaceSize.width = width; + mSurfaceSize.height = height; - // Internally we want to report the actual size of the stage. - mSize.width = width; - mSize.height = height - mTopMargin; + // Internally we want to report the actual size of the stage. + mSize.width = width; + mSize.height = height - static_cast( mTopMargin ); - // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position. - mDefaultCamera->SetPerspectiveProjection( mSurfaceSize ); + // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position. + mDefaultCamera->SetPerspectiveProjection( mSurfaceSize ); - // Adjust the camera height to allow for top-margin - SetDefaultCameraPosition(); + // Adjust the camera height to allow for top-margin + SetDefaultCameraPosition(); - mRootLayer->SetSize( mSize.width, mSize.height ); + mRootLayer->SetSize( mSize.width, mSize.height ); - // Repeat for SystemOverlay actors - if( mSystemOverlay ) - { - // Note that the SystemOverlay has a separate camera, configured for the full surface-size. - // This will remain unaffected by changes in SetDefaultCameraPosition() - mSystemOverlay->GetImpl()->SetSize( width, height ); - } + // Repeat for SystemOverlay actors + if( mSystemOverlay ) + { + // Note that the SystemOverlay has a separate camera, configured for the full surface-size. + // This will remain unaffected by changes in SetDefaultCameraPosition() + mSystemOverlay->GetImpl()->SetSize( width, height ); + } - SetDefaultSurfaceRectMessage( mUpdateManager, Rect( 0, 0, width, height ) ); + SetDefaultSurfaceRectMessage( mUpdateManager, Rect( 0, 0, static_cast( width ), static_cast( height ) ) ); // truncated - // if single render task to screen then set its viewport parameters - if( 1 == mRenderTaskList->GetTaskCount() ) - { - Dali::RenderTask mDefaultRenderTask = mRenderTaskList->GetTask(0); + // if single render task to screen then set its viewport parameters + if( 1 == mRenderTaskList->GetTaskCount() ) + { + Dali::RenderTask defaultRenderTask = mRenderTaskList->GetTask( 0u ); + + if(!defaultRenderTask.GetTargetFrameBuffer()) + { + defaultRenderTask.SetViewport( Viewport( 0, 0, static_cast( width ), static_cast( height ) ) ); // truncated + } + } - if(!mDefaultRenderTask.GetTargetFrameBuffer()) + if( mRenderToFbo ) { - mDefaultRenderTask.SetViewport( Viewport(0, 0, width, height) ); + Dali::FrameBuffer frameBuffer = Dali::FrameBuffer::New( static_cast( width ), static_cast( height ), Dali::FrameBuffer::Attachment::NONE ); + Dali::Texture texture = Dali::Texture::New( Dali::TextureType::TEXTURE_2D, Dali::Pixel::RGB888, static_cast( width ), static_cast( height ) ); + frameBuffer.AttachColorTexture( texture ); + + Dali::RenderTask defaultRenderTask = mRenderTaskList->GetTask( 0u ); + defaultRenderTask.SetFrameBuffer( frameBuffer ); } } - } Vector2 Stage::GetSize() const @@ -242,7 +264,7 @@ Vector2 Stage::GetSize() const return mSize; } -void Stage::SetTopMargin( unsigned int margin ) +void Stage::SetTopMargin( uint32_t margin ) { if (mTopMargin == margin) { @@ -251,7 +273,7 @@ void Stage::SetTopMargin( unsigned int margin ) mTopMargin = margin; mSize.width = mSurfaceSize.width; - mSize.height = mSurfaceSize.height - mTopMargin; + mSize.height = mSurfaceSize.height - static_cast( mTopMargin ); // Adjust the camera height to allow for top-margin SetDefaultCameraPosition(); @@ -289,12 +311,12 @@ CameraActor& Stage::GetDefaultCameraActor() return *mDefaultCamera; } -unsigned int Stage::GetLayerCount() const +uint32_t Stage::GetLayerCount() const { return mLayerList->GetLayerCount(); } -Dali::Layer Stage::GetLayer( unsigned int depth ) const +Dali::Layer Stage::GetLayer( uint32_t depth ) const { return Dali::Layer(mLayerList->GetLayer( depth )); } @@ -403,13 +425,13 @@ void Stage::SetViewMode( ViewMode viewMode ) mLeftCamera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS ); mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); - mLeftRenderTask.SetViewport( Viewport(0, mSize.height * 0.5f, mSize.width, mSize.height * 0.5f) ); + mLeftRenderTask.SetViewport( Viewport(0, static_cast( mSize.height * 0.5f ), static_cast( mSize.width ), static_cast( mSize.height * 0.5f ) ) ); // truncated - mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase) ); + mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase ) ); mRightCamera->SetAspectRatio( aspect ); mRightCamera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS ); mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) ); - mRightRenderTask.SetViewport( Viewport(0, 0, mSize.width, mSize.height * 0.5f ) ); + mRightRenderTask.SetViewport( Viewport(0, 0, static_cast( mSize.width ), static_cast( mSize.height * 0.5f ) ) ); // truncated break; } @@ -425,13 +447,13 @@ void Stage::SetViewMode( ViewMode viewMode ) mLeftCamera->SetFieldOfView( fov ); mLeftCamera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS ); mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); - mLeftRenderTask.SetViewport( Viewport(0, 0, mSize.width * 0.5f, mSize.height ) ); + mLeftRenderTask.SetViewport( Viewport(0, 0, static_cast( mSize.width * 0.5f ), static_cast( mSize.height ) ) ); // truncated mRightCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(-stereoBase,0.0f) ); mRightCamera->SetFieldOfView( fov ); mRightCamera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS ); mRightCamera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) ); - mRightRenderTask.SetViewport( Viewport(mSize.width * 0.5f, 0, mSize.width * 0.5f, mSize.height ) ); + mRightRenderTask.SetViewport( Viewport( static_cast( mSize.width * 0.5f ), 0, static_cast( mSize.width * 0.5f ), static_cast( mSize.height ) ) ); // truncated break; } @@ -528,6 +550,22 @@ void Stage::KeepRendering( float durationSeconds ) KeepRenderingMessage( mUpdateManager, durationSeconds ); } +void Stage::SetRenderingBehavior( DevelStage::Rendering renderingBehavior ) +{ + if( mRenderingBehavior != renderingBehavior ) + { + // Send message to change the rendering behavior + SetRenderingBehaviorMessage( mUpdateManager, renderingBehavior ); + + mRenderingBehavior = renderingBehavior; + } +} + +DevelStage::Rendering Stage::GetRenderingBehavior() const +{ + return mRenderingBehavior; +} + bool Stage::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) { bool connected( true ); @@ -625,6 +663,22 @@ Dali::DevelStage::KeyEventGeneratedSignalType& Stage::KeyEventGeneratedSignal() return mKeyEventGeneratedSignal; } +void Stage::AddFrameCallback( FrameCallbackInterface& frameCallback, Actor& rootActor ) +{ + DALI_ASSERT_ALWAYS( ( ! FrameCallbackInterface::Impl::Get( frameCallback ).IsConnectedToSceneGraph() ) + && "FrameCallbackInterface implementation already added" ); + + // Create scene-graph object and transfer to UpdateManager + OwnerPointer< SceneGraph::FrameCallback > transferOwnership( SceneGraph::FrameCallback::New( frameCallback ) ); + AddFrameCallbackMessage( mUpdateManager, transferOwnership, rootActor.GetNode() ); +} + +void Stage::RemoveFrameCallback( FrameCallbackInterface& frameCallback ) +{ + FrameCallbackInterface::Impl::Get( frameCallback ).Invalidate(); + RemoveFrameCallbackMessage( mUpdateManager, frameCallback ); +} + Dali::Stage::EventProcessingFinishedSignalType& Stage::EventProcessingFinishedSignal() { return mEventProcessingFinishedSignal; @@ -695,17 +749,36 @@ void Stage::RebuildDepthTree() Stage::Stage( AnimationPlaylist& playlist, PropertyNotificationManager& propertyNotificationManager, SceneGraph::UpdateManager& updateManager, - NotificationManager& notificationManager ) + NotificationManager& notificationManager, + Integration::RenderController& renderController ) : mAnimationPlaylist( playlist ), - mPropertyNotificationManager(propertyNotificationManager), - mUpdateManager(updateManager), - mNotificationManager(notificationManager), - mSize(Vector2::ZERO), - mBackgroundColor(Dali::Stage::DEFAULT_BACKGROUND_COLOR), + mPropertyNotificationManager( propertyNotificationManager ), + mUpdateManager( updateManager ), + mNotificationManager( notificationManager ), + mRenderController( renderController ), + mSize( Vector2::ZERO ), + mSurfaceSize( Vector2::ZERO ), + mBackgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), mViewMode( MONO ), mStereoBase( DEFAULT_STEREO_BASE ), mTopMargin( 0 ), - mSystemOverlay(NULL) + mDpi( Vector2::ZERO ), + mRightRenderTask(), + mLeftRenderTask(), + mSystemOverlay( NULL ), + mKeyEventSignal(), + mKeyEventGeneratedSignal(), + mEventProcessingFinishedSignal(), + mTouchedSignal(), + mTouchSignal(), + mWheelEventSignal(), + mContextLostSignal(), + mContextRegainedSignal(), + mSceneCreatedSignal(), + mRenderingBehavior( DevelStage::Rendering::IF_REQUIRED ), + mDepthTreeDirty( false ), + mForceNextUpdate( false ), + mRenderToFbo( false ) { } @@ -714,7 +787,12 @@ SceneGraph::UpdateManager& Stage::GetUpdateManager() return mUpdateManager; } -unsigned int* Stage::ReserveMessageSlot( std::size_t size, bool updateScene ) +Integration::RenderController& Stage::GetRenderController() +{ + return mRenderController; +} + +uint32_t* Stage::ReserveMessageSlot( uint32_t size, bool updateScene ) { return mUpdateManager.ReserveMessageSlot( size, updateScene ); } @@ -724,6 +802,18 @@ BufferIndex Stage::GetEventBufferIndex() const return mUpdateManager.GetEventBufferIndex(); } +void Stage::ForceNextUpdate() +{ + mForceNextUpdate = true; +} + +bool Stage::IsNextUpdateForced() +{ + bool nextUpdateForced = mForceNextUpdate; + mForceNextUpdate = false; + return nextUpdateForced; +} + Stage::~Stage() { delete mSystemOverlay;