X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-core.git;a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fcommon%2Fscene-impl.cpp;h=2cc2cdcd404a3b384903bf4742c0bb418b06ad00;hp=69b07248573d67f8475f072562ad748457173bc7;hb=79881246746f65474b24ea4fe14151ccef8df3f4;hpb=2fa249687dba04074502ee8b22fb738da437f5cd diff --git a/dali/internal/event/common/scene-impl.cpp b/dali/internal/event/common/scene-impl.cpp index 69b0724..2cc2cdc 100644 --- a/dali/internal/event/common/scene-impl.cpp +++ b/dali/internal/event/common/scene-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -48,18 +49,18 @@ const Vector4 DEFAULT_BACKGROUND_COLOR(0.0f, 0.0f, 0.0f, 1.0f); // Default backg } //Unnamed namespace -ScenePtr Scene::New( Integration::RenderSurface& surface ) +ScenePtr Scene::New( Size size ) { ScenePtr scene = new Scene; // Second-phase construction - scene->Initialize( surface ); + scene->Initialize( size ); return scene; } Scene::Scene() -: mSurface( 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 ), @@ -70,6 +71,12 @@ Scene::Scene() Scene::~Scene() { + if( EventThreadServices::IsCoreRunning() && mSceneObject ) + { + ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal(); + RemoveSceneMessage( tls->GetUpdateManager(), *mSceneObject ); + } + if( mDefaultCamera ) { // its enough to release the handle so the object is released @@ -89,16 +96,11 @@ Scene::~Scene() mRenderTaskList.Reset(); } - if ( mFrameBuffer ) - { - mFrameBuffer.Reset(); - } - // No need to discard this Scene from Core, as Core stores an intrusive_ptr to this scene // When this destructor is called, the scene has either already been removed from Core or Core has already been destroyed } -void Scene::Initialize( Integration::RenderSurface& surface ) +void Scene::Initialize( Size size ) { ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal(); @@ -124,9 +126,7 @@ void Scene::Initialize( Integration::RenderSurface& surface ) // 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. - const PositionSize positionSize = surface.GetPositionSize(); - const Vector2 surfaceSize( static_cast< float >( positionSize.width ), static_cast< float >( positionSize.height ) ); - mDefaultCamera = CameraActor::New( surfaceSize ); + mDefaultCamera = CameraActor::New( size ); mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER); Add(*(mDefaultCamera.Get())); @@ -136,8 +136,12 @@ void Scene::Initialize( Integration::RenderSurface& surface ) // Create the default render-task mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() ); - // Set the surface - SetSurface( surface ); + 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 ); } void Scene::Add(Actor& actor) @@ -200,68 +204,39 @@ Actor& Scene::GetDefaultRootActor() return *mRootLayer; } -void Scene::SetSurface( Integration::RenderSurface& surface ) +void Scene::SurfaceResized( float width, float height ) { - if( mSurface != &surface ) + if( ( fabsf( mSize.width - width ) > Math::MACHINE_EPSILON_1 ) || ( fabsf( mSize.height - height ) > Math::MACHINE_EPSILON_1 ) ) { - mSurface = &surface; + Rect< int32_t > newSize( 0, 0, static_cast< int32_t >( width ), static_cast< int32_t >( height ) ); // truncated - RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u ); - - mFrameBuffer = Dali::Internal::FrameBuffer::New( surface, Dali::FrameBuffer::Attachment::NONE ); - defaultRenderTask->SetFrameBuffer( mFrameBuffer ); + mSize.width = width; + mSize.height = height; - SurfaceResized(); - } -} - -void Scene::SurfaceResized() -{ - if( mSurface ) - { - const PositionSize surfacePositionSize = mSurface->GetPositionSize(); - const float fWidth = static_cast< float >( surfacePositionSize.width ); - const float fHeight = static_cast< float >( surfacePositionSize.height ); + // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position. + mDefaultCamera->SetPerspectiveProjection( mSize ); - if( ( fabsf( mSize.width - fWidth ) > Math::MACHINE_EPSILON_1 ) || ( fabsf( mSize.height - fHeight ) > Math::MACHINE_EPSILON_1 ) ) - { - Rect< int32_t > newSize( 0, 0, static_cast< int32_t >( surfacePositionSize.width ), static_cast< int32_t >( surfacePositionSize.height ) ); // truncated + mRootLayer->SetSize( mSize.width, mSize.height ); - mSize.width = fWidth; - mSize.height = fHeight; - - // 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 ); + 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 ); - defaultRenderTask->GetFrameBuffer()->SetSize( static_cast( newSize.width ), static_cast( newSize.height ) ); - } + // set default render-task viewport parameters + RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u ); + defaultRenderTask->SetViewport( newSize ); } } -void Scene::SurfaceDeleted() +void Scene::SurfaceReplaced() { - mSurface = nullptr; - if ( mFrameBuffer ) + if ( mSceneObject ) { - // The frame buffer doesn't have a valid render surface any more. - mFrameBuffer->MarkSurfaceAsInvalid(); + ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal(); + SurfaceReplacedMessage( tls->GetUpdateManager(), *mSceneObject ); } } -Integration::RenderSurface* Scene::GetSurface() const -{ - return mSurface; -} - void Scene::Discard() { if( ThreadLocalStorage::Created() ) @@ -301,11 +276,8 @@ void Scene::SetBackgroundColor( const Vector4& color ) { mBackgroundColor = color; - if( mSurface ) - { - mRenderTaskList->GetTask( 0u )->SetClearColor( color ); - mRenderTaskList->GetTask( 0u )->SetClearEnabled( true ); - } + mRenderTaskList->GetTask( 0u )->SetClearColor( color ); + mRenderTaskList->GetTask( 0u )->SetClearEnabled( true ); } Vector4 Scene::GetBackgroundColor() const @@ -313,6 +285,11 @@ Vector4 Scene::GetBackgroundColor() const return mBackgroundColor; } +SceneGraph::Scene* Scene::GetSceneObject() const +{ + return mSceneObject; +} + void Scene::EmitKeyEventSignal(const KeyEvent& event) { if ( !mKeyEventSignal.Empty() )