using Integration::RenderController;
using Integration::PlatformAbstraction;
using Integration::GlSyncAbstraction;
-using Integration::GestureManager;
using Integration::GlAbstraction;
using Integration::Event;
using Integration::UpdateStatus;
PlatformAbstraction& platform,
GlAbstraction& glAbstraction,
GlSyncAbstraction& glSyncAbstraction,
- GestureManager& gestureManager,
ResourcePolicy::DataRetention dataRetentionPolicy,
Integration::RenderToFrameBuffer renderToFboEnabled,
Integration::DepthBufferAvailable depthBufferAvailable,
// This must be called after stage is created but before stage initialization
mRelayoutController = IntrusivePtr< RelayoutController >( new RelayoutController( mRenderController ) );
- mGestureEventProcessor = new GestureEventProcessor( *mStage, *mUpdateManager, gestureManager, mRenderController );
- mEventProcessor = new EventProcessor( *mStage, *mNotificationManager, *mGestureEventProcessor );
+ mGestureEventProcessor = new GestureEventProcessor( *mUpdateManager, mRenderController );
mShaderFactory = new ShaderFactory();
mUpdateManager->SetShaderSaver( *mShaderFactory );
mRenderManager->ContextDestroyed();
}
-void Core::SurfaceResized( Integration::RenderSurface* surface )
+void Core::SurfaceResized( Integration::RenderSurface* surface, bool forceUpdate )
{
for( auto iter = mScenes.begin(); iter != mScenes.end(); ++iter )
{
if( (*iter)->GetSurface() == surface )
{
- (*iter)->SetSurface( *surface );
+ (*iter)->SurfaceResized( forceUpdate );
+ }
+ }
+}
+
+void Core::SurfaceDeleted( Integration::RenderSurface* surface )
+{
+ for( auto scene : mScenes )
+ {
+ if( scene->GetSurface() == surface )
+ {
+ scene->SurfaceDeleted();
+ break;
}
}
}
void Core::QueueEvent( const Integration::Event& event )
{
- mEventProcessor->QueueEvent( event );
+ if (mScenes.size() != 0)
+ {
+ mScenes.front()->QueueEvent( event );
+ }
}
void Core::ProcessEvents()
// Signal that any messages received will be flushed soon
mUpdateManager->EventProcessingStarted();
- mEventProcessor->ProcessEvents();
+ // Scene could be added or removed while processing the events
+ // Copy the Scene container locally to avoid possibly invalid iterator
+ SceneContainer scenes = mScenes;
+
+ // process events in all scenes
+ for( auto scene : scenes )
+ {
+ scene->ProcessEvents();
+ }
mNotificationManager->ProcessMessages();
// Emit signal here to inform listeners that event processing has finished.
- mStage->EmitEventProcessingFinishedSignal();
+ for( auto scene : scenes )
+ {
+ scene->EmitEventProcessingFinishedSignal();
+ }
// Run any registered processors
RunProcessors();
// Run the size negotiation after event processing finished signal
mRelayoutController->Relayout();
-
// Rebuild depth tree after event processing has finished
- for( auto iter = mScenes.begin(); iter != mScenes.end(); ++iter )
+ for( auto scene : scenes )
{
- (*iter)->RebuildDepthTree();
+ scene->RebuildDepthTree();
}
// Flush any queued messages for the update-thread