}
/**
- * Check if the data has changed
- * @param[in] bufferIndex Index to access double buffered values
- * @return true if the data has changed
- */
- virtual bool HasDataChanged( BufferIndex bufferIndex ) const = 0;
-
- /**
* Get the number of attributes
* @param[in] bufferIndex Index to access double buffered values
* @return the number of attributes
BufferIndex bufferIndex,
const RenderDataProvider* dataProviders )
{
- if( mDataNeedsUploading ) // @todo Or if any of the property buffers are dirty
+ if( mDataNeedsUploading )
{
- DoUpload( context, bufferIndex, dataProviders );
+ SetUpPropertyBuffers( context, bufferIndex, dataProviders );
- mDataNeedsUploading = false;
- }
+ for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
+ {
+ mVertexBuffers[i]->Upload( context, bufferIndex );
+ }
+ if( mIndexBuffer )
+ {
+ mIndexBuffer->Upload( context, bufferIndex );
+ }
- for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
- {
- mVertexBuffers[i]->Upload( context, bufferIndex );
- }
- if( mIndexBuffer )
- {
- mIndexBuffer->Upload( context, bufferIndex );
+ mDataNeedsUploading = false;
}
}
-void RenderGeometry::DoUpload(
+void RenderGeometry::SetUpPropertyBuffers(
Context& context,
BufferIndex bufferIndex,
const RenderDataProvider* dataProvider )
* @param[in] bufferIndex The current buffer index
* @param[in] dataProviders The data providers (to fetch geometry from)
*/
- void DoUpload( Context& context,
- BufferIndex bufferIndex,
- const RenderDataProvider* dataProviders );
+ void SetUpPropertyBuffers( Context& context,
+ BufferIndex bufferIndex,
+ const RenderDataProvider* dataProviders );
/**
* Bind the geometry buffers
}
// Update the GpuBuffer
- if ( mGpuBuffer && mDataProvider.HasDataChanged( bufferIndex ) )
+ if ( mGpuBuffer )
{
std::size_t dataSize = mDataProvider.GetDataSize( bufferIndex );
DALI_ASSERT_DEBUG( dataSize && "No data in the property buffer!" );
mRenderGeometry.GeometryUpdated();
}
+void NewRenderer::SetGeometryUpdated( )
+{
+ mRenderGeometry.GeometryUpdated();
+}
+
// Note - this is currently called from UpdateThread, PrepareRenderInstructions,
// as an optimisation.
// @todo MESH_REWORK Should use Update thread objects only in PrepareRenderInstructions.
*/
void SetRenderDataProvider( RenderDataProvider* dataProviders );
+ /**
+ * Set flag that says that Geometry has been updated.
+ */
+ void SetGeometryUpdated();
+
public: // Implementation of Renderer
/**
* @copydoc SceneGraph::Renderer::RequiresDepthTest()
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();