+void UpdateManager::AddRenderTaskList( OwnerPointer<RenderTaskList>& taskList )
+{
+ RenderTaskList* taskListPointer = taskList.Release();
+ taskListPointer->SetRenderMessageDispatcher( &mImpl->renderMessageDispatcher );
+
+ mImpl->scenes.back()->taskList = taskListPointer;
+}
+
+void UpdateManager::RemoveRenderTaskList( RenderTaskList* taskList )
+{
+ for ( auto&& scene : mImpl->scenes )
+ {
+ if ( scene && scene->taskList == taskList )
+ {
+ scene->taskList.Reset();
+ break;
+ }
+ }
+}
+
+void UpdateManager::AddScene( OwnerPointer< Scene >& scene )
+{
+ mImpl->scenes.back()->scene = scene.Release();
+
+ // Initialize the context from render manager
+ typedef MessageValue1< RenderManager, SceneGraph::Scene* > DerivedType;
+
+ // Reserve some memory inside the render queue
+ uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+
+ // Construct message in the render queue memory; note that delete should not be called on the return value
+ SceneGraph::Scene& sceneObject = *mImpl->scenes.back()->scene;
+ new (slot) DerivedType( &mImpl->renderManager, &RenderManager::InitializeScene, &sceneObject );
+}
+
+void UpdateManager::RemoveScene( Scene* scene )
+{
+ // Initialize the context from render manager
+ typedef MessageValue1< RenderManager, SceneGraph::Scene* > DerivedType;
+
+ // Reserve some memory inside the render queue
+ uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+
+ // Construct message in the render queue memory; note that delete should not be called on the return value
+ new (slot) DerivedType( &mImpl->renderManager, &RenderManager::UninitializeScene, scene );
+
+ for ( auto&& sceneInfo : mImpl->scenes )
+ {
+ if ( sceneInfo && sceneInfo->scene && sceneInfo->scene.Get() == scene )
+ {
+ sceneInfo->scene.Reset();
+ break;
+ }
+ }
+}
+