/*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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.
#include <dali/internal/event/common/scene-impl.h>
// INTERNAL INCLUDES
+#include <dali/internal/event/actors/camera-actor-impl.h>
#include <dali/internal/event/actors/layer-impl.h>
#include <dali/internal/event/actors/layer-list.h>
-#include <dali/internal/event/actors/camera-actor-impl.h>
+#include <dali/internal/event/common/object-registry-impl.h>
#include <dali/internal/event/common/thread-local-storage.h>
-#include <dali/internal/event/render-tasks/render-task-list-impl.h>
#include <dali/internal/event/render-tasks/render-task-impl.h>
-#include <dali/internal/event/common/object-registry-impl.h>
-#include <dali/internal/update/nodes/node.h>
-#include <dali/internal/update/manager/update-manager.h>
+#include <dali/internal/event/render-tasks/render-task-list-impl.h>
+#include <dali/internal/event/rendering/frame-buffer-impl.h>
+#include <dali/internal/event/size-negotiation/relayout-controller-impl.h>
#include <dali/internal/update/common/scene-graph-scene.h>
+#include <dali/internal/update/manager/update-manager.h>
+#include <dali/internal/update/nodes/node.h>
+#include <dali/public-api/common/constants.h>
#include <dali/public-api/object/type-registry.h>
#include <dali/public-api/render-tasks/render-task-list.h>
-#include <dali/internal/event/rendering/frame-buffer-impl.h>
-#include <dali/internal/event/size-negotiation/relayout-controller-impl.h>
using Dali::Internal::SceneGraph::Node;
namespace Dali
{
-
namespace Internal
{
-
-namespace
-{
-
-const Vector4 DEFAULT_BACKGROUND_COLOR(0.0f, 0.0f, 0.0f, 1.0f); // Default background color
-
-} //Unnamed namespace
-
-ScenePtr Scene::New( Size size )
+ScenePtr Scene::New(Size size, int orientation)
{
ScenePtr scene = new Scene;
// Second-phase construction
- scene->Initialize( size );
+ scene->Initialize(size, orientation);
return scene;
}
Scene::Scene()
-: mSceneObject( nullptr ),
+: mSceneObject(nullptr),
mSize(), // Don't set the proper value here, this will be set when the surface is set later
mDpi(),
- mBackgroundColor( DEFAULT_BACKGROUND_COLOR ),
- mDepthTreeDirty( false ),
- mEventProcessor( *this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor() )
+ mBackgroundColor(DEFAULT_BACKGROUND_COLOR),
+ mDepthTreeDirty(false),
+ mEventProcessor(*this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor()),
+ mSurfaceOrientation(0)
{
}
Scene::~Scene()
{
- if( EventThreadServices::IsCoreRunning() && mSceneObject )
+ if(EventThreadServices::IsCoreRunning() && mSceneObject)
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
- RemoveSceneMessage( tls->GetUpdateManager(), *mSceneObject );
+ RemoveSceneMessage(tls->GetUpdateManager(), *mSceneObject);
}
- if( mDefaultCamera )
+ if(mDefaultCamera)
{
// its enough to release the handle so the object is released
// don't need to remove it from root actor as root actor will delete the object
mDefaultCamera.Reset();
}
- if( mRootLayer )
+ if(mRootLayer)
{
// we are closing down so just delete the root, no point emit disconnect
// signals or send messages to update
mRootLayer.Reset();
}
- if( mRenderTaskList )
+ if(mRenderTaskList)
{
mRenderTaskList.Reset();
}
// When this destructor is called, the scene has either already been removed from Core or Core has already been destroyed
}
-void Scene::Initialize( Size size )
+void Scene::Initialize(Size size, int orientation)
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
- DALI_ASSERT_ALWAYS( tls && "Attempt to create scene before core exists!" );
+ DALI_ASSERT_ALWAYS(tls && "Attempt to create scene before core exists!");
- tls->AddScene( this );
+ tls->AddScene(this);
SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
// Create the ordered list of layers
- mLayerList = LayerList::New( updateManager );
+ mLayerList = LayerList::New(updateManager);
// The scene owns the default layer
- mRootLayer = Layer::NewRoot( *mLayerList );
+ mRootLayer = Layer::NewRoot(*mLayerList);
mRootLayer->SetName("RootLayer");
- mRootLayer->SetScene( *this );
+ mRootLayer->SetScene(*this);
// 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
// up to the root layer, and down through other children unnecessarily.
- mRootLayer->SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
+ mRootLayer->SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
// Create the default camera actor first; this is needed by the RenderTaskList
// The default camera attributes and position is such that children of the default layer,
// can be positioned at (0,0) and be at the top-left of the viewport.
- mDefaultCamera = CameraActor::New( size );
+ mDefaultCamera = CameraActor::New(size);
mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
Add(*(mDefaultCamera.Get()));
mRenderTaskList = RenderTaskList::New();
// Create the default render-task and ensure clear is enabled on it to show the background color
- RenderTaskPtr renderTask = mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() );
+ RenderTaskPtr renderTask = mRenderTaskList->CreateTask(mRootLayer.Get(), mDefaultCamera.Get());
renderTask->SetClearEnabled(true);
- SurfaceResized( size.width, size.height );
-
// Create scene graph object
mSceneObject = new SceneGraph::Scene();
- OwnerPointer< SceneGraph::Scene > transferOwnership( const_cast< SceneGraph::Scene* >( mSceneObject ) );
- AddSceneMessage( updateManager, transferOwnership );
+ OwnerPointer<SceneGraph::Scene> transferOwnership(const_cast<SceneGraph::Scene*>(mSceneObject));
+ AddSceneMessage(updateManager, transferOwnership);
+
+ SurfaceRotated(size.width, size.height, orientation);
}
void Scene::Add(Actor& actor)
{
- mRootLayer->Add( actor );
+ mRootLayer->Add(actor);
}
void Scene::Remove(Actor& actor)
{
- mRootLayer->Remove( actor );
+ mRootLayer->Remove(actor);
}
Size Scene::GetSize() const
Dali::Layer Scene::GetRootLayer() const
{
- return Dali::Layer( mRootLayer.Get() );
+ return Dali::Layer(mRootLayer.Get());
}
LayerList& Scene::GetLayerList() const
return mLayerList->GetLayerCount();
}
-Dali::Layer Scene::GetLayer( uint32_t depth ) const
+Dali::Layer Scene::GetLayer(uint32_t depth) const
{
- return Dali::Layer(mLayerList->GetLayer( depth ));
+ return Dali::Layer(mLayerList->GetLayer(depth));
}
CameraActor& Scene::GetDefaultCameraActor()
return *mRootLayer;
}
-void Scene::SurfaceResized( float width, float height )
+void Scene::SurfaceResized(float width, float height)
{
- if( ( fabsf( mSize.width - width ) > Math::MACHINE_EPSILON_1 ) || ( fabsf( mSize.height - height ) > Math::MACHINE_EPSILON_1 ) )
+ if((fabsf(mSize.width - width) > Math::MACHINE_EPSILON_1) || (fabsf(mSize.height - height) > Math::MACHINE_EPSILON_1))
{
- Rect< int32_t > newSize( 0, 0, static_cast< int32_t >( width ), static_cast< int32_t >( height ) ); // truncated
-
- mSize.width = width;
- mSize.height = height;
-
- // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
- mDefaultCamera->SetPerspectiveProjection( mSize );
-
- mRootLayer->SetSize( mSize.width, mSize.height );
-
- ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
- SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
- SetDefaultSurfaceRectMessage( updateManager, newSize );
-
- // set default render-task viewport parameters
- RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
- defaultRenderTask->SetViewport( newSize );
+ ChangedSurface(width, height, mSurfaceOrientation);
}
}
void Scene::SurfaceReplaced()
{
- if ( mSceneObject )
+ if(mSceneObject)
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
- SurfaceReplacedMessage( tls->GetUpdateManager(), *mSceneObject );
+ SurfaceReplacedMessage(tls->GetUpdateManager(), *mSceneObject);
}
}
void Scene::Discard()
{
- if( ThreadLocalStorage::Created() )
+ if(ThreadLocalStorage::Created())
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
- tls->RemoveScene( this );
+ tls->RemoveScene(this);
}
}
mDepthTreeDirty = true;
}
-void Scene::QueueEvent( const Integration::Event& event )
+void Scene::QueueEvent(const Integration::Event& event)
{
- mEventProcessor.QueueEvent( event );
+ mEventProcessor.QueueEvent(event);
}
void Scene::ProcessEvents()
void Scene::RebuildDepthTree()
{
// If the depth tree needs rebuilding, do it in this frame only.
- if( mDepthTreeDirty )
+ if(mDepthTreeDirty)
{
- ActorPtr actor( mRootLayer.Get() );
+ ActorPtr actor(mRootLayer.Get());
actor->RebuildDepthTree();
mDepthTreeDirty = false;
}
}
-void Scene::SetBackgroundColor( const Vector4& color )
+void Scene::SetBackgroundColor(const Vector4& color)
{
mBackgroundColor = color;
- mRenderTaskList->GetTask( 0u )->SetClearColor( color );
- mRenderTaskList->GetTask( 0u )->SetClearEnabled( true );
+ mRenderTaskList->GetTask(0u)->SetClearColor(color);
+ mRenderTaskList->GetTask(0u)->SetClearEnabled(true);
}
Vector4 Scene::GetBackgroundColor() const
return mSceneObject;
}
-void Scene::EmitKeyEventSignal(const KeyEvent& event)
+void Scene::EmitKeyEventSignal(const Dali::KeyEvent& event)
{
- if ( !mKeyEventSignal.Empty() )
+ if(!mKeyEventSignal.Empty())
{
- Dali::Integration::Scene handle( this );
- mKeyEventSignal.Emit( event );
+ Dali::Integration::Scene handle(this);
+ mKeyEventSignal.Emit(event);
}
}
-bool Scene::EmitKeyEventGeneratedSignal(const KeyEvent& event)
+void Scene::SurfaceRotated(float width, float height, int orientation)
+{
+ mSurfaceOrientation = orientation;
+ ChangedSurface(width, height, orientation);
+}
+
+int Scene::GetSurfaceOrientation()
+{
+ return mSurfaceOrientation;
+}
+
+void Scene::ChangedSurface(float width, float height, int orientation)
+{
+ Rect<int32_t> newSize(0, 0, static_cast<int32_t>(width), static_cast<int32_t>(height)); // truncated
+ mSize.width = width;
+ mSize.height = height;
+
+ // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
+ mDefaultCamera->SetPerspectiveProjection(mSize);
+ // Set the surface orientation to Default camera for window/screen rotation
+ mDefaultCamera->RotateProjection(orientation);
+
+ mRootLayer->SetSize(width, height);
+
+ // Send the surface rectangle/orientation to SceneGraph::Scene for calculating glViewport/Scissor
+ ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
+ SetSurfaceRectMessage(tls->GetEventThreadServices(), *mSceneObject, newSize);
+ SetSurfaceOrientationMessage(tls->GetEventThreadServices(), *mSceneObject, static_cast<int32_t>(orientation));
+
+ // set default render-task viewport parameters
+ RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask(0u);
+ defaultRenderTask->SetViewport(newSize);
+}
+
+bool Scene::IsSurfaceRectChanged() const
+{
+ return mSceneObject->IsSurfaceRectChanged();
+}
+
+void Scene::SetSurfaceRenderTarget(Graphics::RenderTarget* renderTarget)
+{
+ // Send the surface render target to SceneGraph::Scene
+ ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
+ SetSurfaceRenderTargetMessage(tls->GetEventThreadServices(), *mSceneObject, renderTarget);
+}
+
+bool Scene::EmitKeyEventGeneratedSignal(const Dali::KeyEvent& event)
{
// Emit the KeyEventGenerated signal when KeyEvent is generated
- return mKeyEventGeneratedSignal.Emit( event );
+ Dali::Integration::Scene handle(this);
+ return mKeyEventGeneratedSignal.Emit(event);
}
void Scene::EmitEventProcessingFinishedSignal()
{
- if ( !mEventProcessingFinishedSignal.Empty() )
+ if(!mEventProcessingFinishedSignal.Empty())
{
- Dali::Integration::Scene handle( this );
+ Dali::Integration::Scene handle(this);
mEventProcessingFinishedSignal.Emit();
}
}
-void Scene::EmitTouchedSignal( const Dali::TouchData& touch )
+void Scene::EmitTouchedSignal(const Dali::TouchEvent& touch)
{
- Dali::Integration::Scene handle( this );
- if ( !mTouchSignal.Empty() )
+ Dali::Integration::Scene handle(this);
+ if(!mTouchedSignal.Empty())
{
- mTouchSignal.Emit( touch );
+ mTouchedSignal.Emit(touch);
}
}
-void Scene::EmitWheelEventSignal(const WheelEvent& event)
+void Scene::EmitWheelEventSignal(const Dali::WheelEvent& event)
{
- if ( !mWheelEventSignal.Empty() )
+ if(!mWheelEventSignal.Empty())
{
- Dali::Integration::Scene handle( this );
- mWheelEventSignal.Emit( event );
+ Dali::Integration::Scene handle(this);
+ mWheelEventSignal.Emit(event);
}
}
-void Scene::AddFrameRenderedCallback( std::unique_ptr< CallbackBase > callback, int32_t frameId )
+void Scene::AddFrameRenderedCallback(std::unique_ptr<CallbackBase> callback, int32_t frameId)
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
- AddFrameRenderedCallbackMessage( tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId );
+ AddFrameRenderedCallbackMessage(tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId);
}
-void Scene::AddFramePresentedCallback( std::unique_ptr< CallbackBase > callback, int32_t frameId )
+void Scene::AddFramePresentedCallback(std::unique_ptr<CallbackBase> callback, int32_t frameId)
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
- AddFramePresentedCallbackMessage( tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId );
+ AddFramePresentedCallbackMessage(tls->GetEventThreadServices(), *mSceneObject, callback.release(), frameId);
}
-void Scene::GetFrameRenderedCallback( Dali::Integration::Scene::FrameCallbackContainer& callbacks )
+void Scene::GetFrameRenderedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
{
- mSceneObject->GetFrameRenderedCallback( callbacks );
+ mSceneObject->GetFrameRenderedCallback(callbacks);
}
-void Scene::GetFramePresentedCallback( Dali::Integration::Scene::FrameCallbackContainer& callbacks )
+void Scene::GetFramePresentedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
{
- mSceneObject->GetFramePresentedCallback( callbacks );
+ mSceneObject->GetFramePresentedCallback(callbacks);
}
Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
return mEventProcessingFinishedSignal;
}
-Integration::Scene::TouchSignalType& Scene::TouchSignal()
+Integration::Scene::TouchEventSignalType& Scene::TouchedSignal()
{
- return mTouchSignal;
+ return mTouchedSignal;
}
Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
return mWheelEventSignal;
}
-} // Internal
+std::vector<Dali::Internal::SceneGraph::DirtyRect>& Scene::GetItemsDirtyRects()
+{
+ return mItemsDirtyRects;
+}
+
+} // namespace Internal
-} // Dali
+} // namespace Dali