mSurfaceSize( Vector2::ZERO ),
mDpi( Vector2::ZERO ),
mBackgroundColor( DEFAULT_BACKGROUND_COLOR ),
+ mSurfaceOrientation( 0 ),
mDepthTreeDirty( false ),
mEventProcessor( *this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor() )
{
mRenderTaskList.Reset();
}
+ if ( mFrameBuffer )
+ {
+ mFrameBuffer.Reset();
+ }
+
// Discard this Scene from the Core
Discard();
}
return *mRootLayer;
}
-void Scene::SetSurface( Integration::RenderSurface& surface )
+void Scene::SetSurface( Integration::RenderSurface& surface, bool forceUpdate )
{
mSurface = &surface;
if ( mSurface )
mFrameBuffer = Dali::Internal::FrameBuffer::New( surface, Dali::FrameBuffer::Attachment::NONE );
defaultRenderTask->SetFrameBuffer( mFrameBuffer );
- SurfaceResized();
+ SurfaceResized( forceUpdate );
}
}
-void Scene::SurfaceResized()
+void Scene::SurfaceResized( bool forceUpdate )
{
if( mSurface )
{
const float fWidth = static_cast<float>( mSurface->GetPositionSize().width );
const float fHeight = static_cast<float>( mSurface->GetPositionSize().height );
+ const int orientation = mSurface->GetOrientation();
- if( ( fabsf( mSurfaceSize.width - fWidth ) > Math::MACHINE_EPSILON_1 ) || ( fabsf( mSurfaceSize.height - fHeight ) > Math::MACHINE_EPSILON_1 ) )
+ if( ( fabsf( mSurfaceSize.width - fWidth ) > Math::MACHINE_EPSILON_1 )
+ || ( fabsf( mSurfaceSize.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 ) );
mSize.width = mSurfaceSize.width;
mSize.height = mSurfaceSize.height;
+ mSurfaceOrientation = orientation;
+
// Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
+ mDefaultCamera->RotateProjection( mSurfaceOrientation );
mRootLayer->SetSize( mSize.width, mSize.height );
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
SetDefaultSurfaceRectMessage( updateManager, newSize ); // truncated
+ SetDefaultSurfaceOrientationMessage( updateManager, mSurfaceOrientation );
RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
}
}
+void Scene::SurfaceDeleted()
+{
+ if ( mFrameBuffer )
+ {
+ // The frame buffer doesn't have a valid render surface any more.
+ mFrameBuffer->MarkSurfaceAsInvalid();
+ }
+}
+
Integration::RenderSurface* Scene::GetSurface() const
{
return mSurface;
void Scene::EmitKeyEventSignal(const KeyEvent& event)
{
- mKeyEventSignal.Emit( event );
+ if ( !mKeyEventSignal.Empty() )
+ {
+ Dali::Integration::Scene handle( this );
+ mKeyEventSignal.Emit( event );
+ }
+}
+
+bool Scene::EmitKeyEventGeneratedSignal(const KeyEvent& event)
+{
+ // Emit the KeyEventGenerated signal when KeyEvent is generated
+ return mKeyEventGeneratedSignal.Emit( event );
}
void Scene::EmitEventProcessingFinishedSignal()
{
- mEventProcessingFinishedSignal.Emit();
+ if ( !mEventProcessingFinishedSignal.Empty() )
+ {
+ Dali::Integration::Scene handle( this );
+ mEventProcessingFinishedSignal.Emit();
+ }
}
void Scene::EmitTouchedSignal( const TouchEvent& touchEvent, const Dali::TouchData& touch )
{
- mTouchedSignal.Emit( touchEvent );
- mTouchSignal.Emit( touch );
+ Dali::Integration::Scene handle( this );
+ if ( !mTouchedSignal.Empty() )
+ {
+ mTouchedSignal.Emit( touchEvent );
+ }
+ if ( !mTouchSignal.Empty() )
+ {
+ mTouchSignal.Emit( touch );
+ }
}
void Scene::EmitWheelEventSignal(const WheelEvent& event)
{
- mWheelEventSignal.Emit( event );
+ if ( !mWheelEventSignal.Empty() )
+ {
+ Dali::Integration::Scene handle( this );
+ mWheelEventSignal.Emit( event );
+ }
}
Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
return mKeyEventSignal;
}
+Integration::Scene::KeyEventGeneratedSignalType& Scene::KeyEventGeneratedSignal()
+{
+ return mKeyEventGeneratedSignal;
+}
+
Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
{
return mEventProcessingFinishedSignal;