Allow sharing RenderGeometries across multiple Renderers
[platform/core/uifw/dali-core.git] / dali / internal / update / node-attachments / scene-graph-renderer-attachment.cpp
index e022fd4..abbe7e1 100644 (file)
@@ -69,6 +69,7 @@ RendererAttachment::RendererAttachment()
   mGeometry(NULL),
   mRegenerateUniformMap(REGENERATE_UNIFORM_MAP),
   mResendDataProviders(false),
+  mResendGeometry(false),
   mDepthIndex(0)
 {
   mUniformMapChanged[0]=false;
@@ -111,7 +112,8 @@ void RendererAttachment::ConnectedToSceneGraph()
 
   RenderDataProvider* dataProvider = NewRenderDataProvider();
 
-  mRenderer = NewRenderer::New( *mParent, dataProvider );
+  RenderGeometry* renderGeometry = mGeometry->GetRenderGeometry(mSceneController);
+  mRenderer = NewRenderer::New( *mParent, dataProvider, renderGeometry );
   mSceneController->GetRenderMessageDispatcher().AddRenderer( *mRenderer );
 }
 
@@ -120,6 +122,8 @@ void RendererAttachment::DisconnectedFromSceneGraph()
   mRegenerateUniformMap = 0;
   mParent->RemoveUniformMapObserver( *this );
 
+  mGeometry->OnRendererDisconnect();
+
   DALI_ASSERT_DEBUG( mSceneController );
   mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mRenderer );
   mRenderer = NULL;
@@ -144,12 +148,20 @@ Material& RendererAttachment::GetMaterial()
 void RendererAttachment::SetGeometry( BufferIndex updateBufferIndex, Geometry* geometry)
 {
   DALI_ASSERT_DEBUG( geometry != NULL && "Geometry pointer is NULL");
+  if( mGeometry)
+  {
+    mGeometry->RemoveConnectionObserver(*this);
+    mGeometry->OnRendererDisconnect();
+  }
 
   mGeometry = geometry;
   mGeometry->AddConnectionObserver( *this ); // Observe geometry connections / uniform mapping changes
   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
 
-  mResendDataProviders = true;
+  if( mRenderer )
+  {
+    mResendGeometry = true;
+  }
 }
 
 Geometry& RendererAttachment::GetGeometry()
@@ -372,27 +384,6 @@ void RendererAttachment::DoPrepareRender( BufferIndex updateBufferIndex )
     mRegenerateUniformMap--;
   }
 
-  bool geometryDataChanged = false;
-  if( PropertyBuffer* indexBuffer = mGeometry->GetIndexBuffer() )
-  {
-    geometryDataChanged = indexBuffer->HasDataChanged(updateBufferIndex);
-  }
-  Vector<PropertyBuffer*>& vertexBuffers = mGeometry->GetVertexBuffers();
-  Vector<PropertyBuffer*>::ConstIterator end = vertexBuffers.End();
-  for( Vector<PropertyBuffer*>::Iterator it = vertexBuffers.Begin();
-       it != end;
-       ++it )
-  {
-    geometryDataChanged = geometryDataChanged || (*it)->HasDataChanged(updateBufferIndex);
-  }
-  if( geometryDataChanged )
-  {
-    //TODO: MESH_REWORK : use buffer data cache and remove all this
-    typedef Message< NewRenderer > DerivedType;
-    unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
-    new (slot) DerivedType( mRenderer, &NewRenderer::SetGeometryUpdated );
-  }
-
   if( mResendDataProviders )
   {
     RenderDataProvider* dataProvider = NewRenderDataProvider();
@@ -405,6 +396,16 @@ void RendererAttachment::DoPrepareRender( BufferIndex updateBufferIndex )
     new (slot) DerivedType( mRenderer, &NewRenderer::SetRenderDataProvider, dataProvider );
     mResendDataProviders = false;
   }
+
+  if( mResendGeometry )
+  {
+    typedef MessageValue1< NewRenderer, RenderGeometry* > DerivedType;
+    unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
+
+    new (slot) DerivedType( mRenderer, &NewRenderer::SetGeometry,mGeometry->GetRenderGeometry(mSceneController) );
+    mResendGeometry = false;
+
+  }
 }
 
 
@@ -489,21 +490,9 @@ RenderDataProvider* RendererAttachment::NewRenderDataProvider()
 {
   RenderDataProvider* dataProvider = new RenderDataProvider();
 
-  dataProvider->mGeometryDataProvider = mGeometry;
   dataProvider->mMaterialDataProvider = mMaterial;
   dataProvider->mUniformMapDataProvider = this;
   dataProvider->mShader = mMaterial->GetShader();
-  dataProvider->mIndexBuffer = mGeometry->GetIndexBuffer();
-
-  Vector<PropertyBuffer*>& vertexBuffers = mGeometry->GetVertexBuffers();
-  dataProvider->mVertexBuffers.Reserve( vertexBuffers.Count() );
-
-  for( Vector<PropertyBuffer*>::Iterator iter = vertexBuffers.Begin() ;
-       iter != vertexBuffers.End();
-       ++iter )
-  {
-    dataProvider->mVertexBuffers.PushBack(*iter); // Convert from derived type to base type
-  }
 
   Vector<Sampler*>& samplers = mMaterial->GetSamplers();
   dataProvider->mSamplers.Reserve( samplers.Count() );