mGeometry(NULL),
mRegenerateUniformMap(REGENERATE_UNIFORM_MAP),
mResendDataProviders(false),
+ mResendGeometry(false),
mDepthIndex(0)
{
mUniformMapChanged[0]=false;
RenderDataProvider* dataProvider = NewRenderDataProvider();
- mRenderer = NewRenderer::New( *mParent, dataProvider );
+ RenderGeometry* renderGeometry = mGeometry->GetRenderGeometry(mSceneController);
+ mRenderer = NewRenderer::New( *mParent, dataProvider, renderGeometry );
mSceneController->GetRenderMessageDispatcher().AddRenderer( *mRenderer );
}
mRegenerateUniformMap = 0;
mParent->RemoveUniformMapObserver( *this );
+ mGeometry->OnRendererDisconnect();
+
DALI_ASSERT_DEBUG( mSceneController );
mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mRenderer );
mRenderer = NULL;
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()
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();
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;
+
+ }
}
{
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() );