} //Unnamed namespace
-ScenePtr Scene::New( const Size& size )
+ScenePtr Scene::New( Integration::RenderSurface& surface )
{
- ScenePtr scene = new Scene( size );
+ ScenePtr scene = new Scene;
// Second-phase construction
- scene->Initialize();
+ scene->Initialize( surface );
return scene;
}
-Scene::Scene( const Size& size )
+Scene::Scene()
: mSurface( nullptr ),
- mSize( size ),
- mSurfaceSize( Vector2::ZERO ),
- mDpi( Vector2::ZERO ),
+ mSize(), // Don't set the proper value here, this will be set when the surface is set later
+ mDpi(),
mBackgroundColor( DEFAULT_BACKGROUND_COLOR ),
mSurfaceOrientation( 0 ),
mDepthTreeDirty( false ),
mFrameBuffer.Reset();
}
- // Discard this Scene from the Core
- Discard();
+ // 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()
+void Scene::Initialize( Integration::RenderSurface& surface )
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
// 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( mSize );
+ const PositionSize positionSize = surface.GetPositionSize();
+ const Vector2 surfaceSize( static_cast< float >( positionSize.width ), static_cast< float >( positionSize.height ) );
+ mDefaultCamera = CameraActor::New( surfaceSize );
mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
Add(*(mDefaultCamera.Get()));
// Create the default render-task
mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() );
+
+ // Set the surface
+ SetSurface( surface );
}
void Scene::Add(Actor& actor)
void Scene::Remove(Actor& actor)
{
mRootLayer->Remove( actor );
+ if( mSurface )
+ {
+ mRenderTaskList->GetTask( 0u )->GetFrameBuffer()->SetPartialUpdateEnabled( false );
+ }
}
Size Scene::GetSize() const
return *mRootLayer;
}
-void Scene::SetSurface( Integration::RenderSurface& surface, bool forceUpdate )
+void Scene::SetSurface( Integration::RenderSurface& surface )
{
- mSurface = &surface;
- if ( mSurface )
+ if( mSurface != &surface )
{
+ mSurface = &surface;
+
RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
mFrameBuffer = Dali::Internal::FrameBuffer::New( surface, Dali::FrameBuffer::Attachment::NONE );
defaultRenderTask->SetFrameBuffer( mFrameBuffer );
- SurfaceResized( forceUpdate );
+ SurfaceResized( false );
}
}
{
if( mSurface )
{
- const float fWidth = static_cast<float>( mSurface->GetPositionSize().width );
- const float fHeight = static_cast<float>( mSurface->GetPositionSize().height );
+ const PositionSize surfacePositionSize = mSurface->GetPositionSize();
+ const float fWidth = static_cast< float >( surfacePositionSize.width );
+ const float fHeight = static_cast< float >( surfacePositionSize.height );
const int orientation = mSurface->GetOrientation();
- if( ( fabsf( mSurfaceSize.width - fWidth ) > Math::MACHINE_EPSILON_1 )
- || ( fabsf( mSurfaceSize.height - fHeight ) > Math::MACHINE_EPSILON_1 )
- || ( orientation != mSurfaceOrientation )
- || (forceUpdate) )
+ if( ( ( fabsf( mSize.width - fWidth ) > Math::MACHINE_EPSILON_1 ) || ( fabsf( mSize.height - fHeight ) > Math::MACHINE_EPSILON_1 ) )
+ || ( orientation != mSurfaceOrientation )
+ || ( forceUpdate ) )
{
- Rect<int32_t> newSize( 0, 0, static_cast<int32_t>( mSurface->GetPositionSize().width ), static_cast<int32_t>( mSurface->GetPositionSize().height ) );
-
- mSurfaceSize.width = fWidth;
- mSurfaceSize.height = fHeight;
-
- mSize.width = mSurfaceSize.width;
- mSize.height = mSurfaceSize.height;
+ Rect< int32_t > newSize( 0, 0, static_cast< int32_t >( surfacePositionSize.width ), static_cast< int32_t >( surfacePositionSize.height ) ); // truncated
+ mSize.width = fWidth;
+ mSize.height = fHeight;
mSurfaceOrientation = orientation;
// Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
- mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
+ mDefaultCamera->SetPerspectiveProjection( mSize );
mDefaultCamera->RotateProjection( mSurfaceOrientation );
mRootLayer->SetSize( mSize.width, mSize.height );
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
- SetDefaultSurfaceRectMessage( updateManager, newSize ); // truncated
+ SetDefaultSurfaceRectMessage( updateManager, newSize );
SetDefaultSurfaceOrientationMessage( updateManager, mSurfaceOrientation );
+ // set default render-task viewport parameters
RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
-
- // if single render task to screen then set its viewport parameters
- if( 1 == mRenderTaskList->GetTaskCount() )
- {
- if( !defaultRenderTask->GetTargetFrameBuffer() )
- {
- defaultRenderTask->SetViewport( newSize ); // truncated
- }
- }
-
+ defaultRenderTask->SetViewport( newSize );
defaultRenderTask->GetFrameBuffer()->SetSize( static_cast<uint32_t>( newSize.width ), static_cast<uint32_t>( newSize.height ) );
}
}
void Scene::SurfaceDeleted()
{
+ mSurface = nullptr;
if ( mFrameBuffer )
{
// The frame buffer doesn't have a valid render surface any more.