* limitations under the License.
*/
+// CLASS HEADER
#include "scene-graph-geometry.h"
+// INTERNAL HEADERS
+#include <dali/internal/update/controllers/scene-controller.h>
+#include <dali/internal/render/renderers/render-geometry.h>
+#include <dali/internal/update/controllers/render-message-dispatcher.h>
+
namespace Dali
{
namespace Internal
Geometry::Geometry()
: mIndexBuffer( NULL ),
+ mRenderGeometry(0),
+ mSceneController(0),
+ mRendererRefCount(0u),
mCenter(),
mHalfExtents(),
mRadius( 0.0f ),
CalculateExtents( vertexBuffer );
vertexBuffer->AddUniformMapObserver(*this);
mConnectionObservers.ConnectionsChanged(*this);
+
+ if( mRenderGeometry )
+ {
+ mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, GpuBuffer::ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ }
}
void Geometry::RemoveVertexBuffer( PropertyBuffer* vertexBuffer )
vertexBuffer->RemoveUniformMapObserver(*this);
mVertexBuffers.Erase( match );
mConnectionObservers.ConnectionsChanged(*this);
+
+ if( mRenderGeometry )
+ {
+ mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer );
+ }
}
}
mIndexBuffer = indexBuffer;
indexBuffer->AddUniformMapObserver(*this);
mConnectionObservers.ConnectionsChanged(*this);
+
+ if( mRenderGeometry )
+ {
+ mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, GpuBuffer::ELEMENT_ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ }
}
}
void Geometry::ClearIndexBuffer()
{
- // @todo Actually delete, or put on Discard Queue and tell Renderer in render thread?
if( mIndexBuffer )
{
mIndexBuffer->RemoveUniformMapObserver(*this);
+
+ if( mRenderGeometry )
+ {
+ mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, mIndexBuffer );
+ }
}
mIndexBuffer = 0;
mConnectionObservers.ConnectionsChanged(*this);
mConnectionObservers.ConnectedUniformMapChanged();
}
+RenderGeometry* Geometry::GetRenderGeometry(SceneController* sceneController)
+{
+ if(!mRenderGeometry)
+ {
+ //Create RenderGeometry
+ mSceneController = sceneController;
+ mRenderGeometry = new RenderGeometry( *this );
+
+ size_t vertexBufferCount( mVertexBuffers.Size() );
+ for( size_t i(0); i<vertexBufferCount; ++i )
+ {
+ mRenderGeometry->AddPropertyBuffer( mVertexBuffers[i], GpuBuffer::ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ }
+
+ if( mIndexBuffer )
+ {
+ mRenderGeometry->AddPropertyBuffer( mIndexBuffer, GpuBuffer::ELEMENT_ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ }
+
+ //Transfer ownership to RenderManager
+ sceneController->GetRenderMessageDispatcher().AddGeometry( *mRenderGeometry );
+ }
+
+ ++mRendererRefCount;
+ return mRenderGeometry;
+}
+
+void Geometry::OnRendererDisconnect()
+{
+ --mRendererRefCount;
+ if( mRendererRefCount == 0 )
+ {
+ //Delete the corresponding RenderGeometry via message to RenderManager
+ mSceneController->GetRenderMessageDispatcher().RemoveGeometry( *mRenderGeometry );
+
+ mRenderGeometry = 0;
+ mSceneController = 0;
+ }
+}
+
+
} // namespace SceneGraph
} // namespace Internal
} // namespace Dali