END_TEST;
}
-int UtcDaliPropertyBufferConstraint01(void)
-{
- TestApplication application;
-
- tet_infoline("Test that a non-uniform propertyBuffer property can be constrained");
-
- Shader shader = Shader::New("VertexSource", "FragmentSource");
- Material material = Material::New( shader );
- material.SetProperty(Material::Property::COLOR, Color::WHITE);
-
- PropertyBuffer propertyBuffer = CreatePropertyBuffer();
- Geometry geometry = CreateQuadGeometryFromBuffer(propertyBuffer);
- Renderer renderer = Renderer::New( geometry, material );
-
- Actor actor = Actor::New();
- actor.AddRenderer(renderer);
- actor.SetSize(400, 400);
- Stage::GetCurrent().Add(actor);
-
- Vector4 initialColor = Color::WHITE;
- Property::Index colorIndex = propertyBuffer.RegisterProperty( "uFadeColor", initialColor );
-
- application.SendNotification();
- application.Render(0);
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<Vector4>(colorIndex), initialColor, TEST_LOCATION );
-
- // Apply constraint
- Constraint constraint = Constraint::New<Vector4>( propertyBuffer, colorIndex, TestConstraintNoBlue );
- constraint.Apply();
- application.SendNotification();
- application.Render(0);
-
- // Expect no blue component in either buffer - yellow
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<Vector4>(colorIndex), Color::YELLOW, TEST_LOCATION );
- application.Render(0);
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<Vector4>(colorIndex), Color::YELLOW, TEST_LOCATION );
-
- propertyBuffer.RemoveConstraints();
- propertyBuffer.SetProperty(colorIndex, Color::WHITE );
- application.SendNotification();
- application.Render(0);
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<Vector4>(colorIndex), Color::WHITE, TEST_LOCATION );
-
- END_TEST;
-}
-
-int UtcDaliPropertyBufferConstraint02(void)
-{
- TestApplication application;
-
- tet_infoline("Test that a uniform map propertyBuffer property can be constrained");
-
- Shader shader = Shader::New( "VertexSource", "FragmentSource" );
- Material material = Material::New( shader );
- material.SetProperty(Material::Property::COLOR, Color::WHITE);
-
- PropertyBuffer propertyBuffer = CreatePropertyBuffer();
- Geometry geometry = CreateQuadGeometryFromBuffer(propertyBuffer);
- Renderer renderer = Renderer::New( geometry, material );
-
- Actor actor = Actor::New();
- actor.AddRenderer(renderer);
- actor.SetSize(400, 400);
- Stage::GetCurrent().Add(actor);
- application.SendNotification();
- application.Render(0);
-
- Vector4 initialColor = Color::WHITE;
- Property::Index colorIndex = propertyBuffer.RegisterProperty( "uFadeColor", initialColor );
-
- TestGlAbstraction& gl = application.GetGlAbstraction();
-
- application.SendNotification();
- application.Render(0);
-
- Vector4 actualValue(Vector4::ZERO);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, initialColor, TEST_LOCATION );
-
- // Apply constraint
- Constraint constraint = Constraint::New<Vector4>( propertyBuffer, colorIndex, TestConstraintNoBlue );
- constraint.Apply();
- application.SendNotification();
- application.Render(0);
-
- // Expect no blue component in either buffer - yellow
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION );
-
- application.Render(0);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION );
-
- propertyBuffer.RemoveConstraints();
- propertyBuffer.SetProperty(colorIndex, Color::WHITE );
- application.SendNotification();
- application.Render(0);
-
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::WHITE, TEST_LOCATION );
-
- END_TEST;
-}
-
-
-
-int UtcDaliPropertyBufferAnimatedProperty01(void)
-{
- TestApplication application;
-
- tet_infoline("Test that a non-uniform propertyBuffer property can be animated");
-
- Shader shader = Shader::New("VertexSource", "FragmentSource");
- Material material = Material::New( shader );
- material.SetProperty(Material::Property::COLOR, Color::WHITE);
-
- PropertyBuffer propertyBuffer = CreatePropertyBuffer();
- Geometry geometry = CreateQuadGeometryFromBuffer(propertyBuffer);
- Renderer renderer = Renderer::New( geometry, material );
-
- Actor actor = Actor::New();
- actor.AddRenderer(renderer);
- actor.SetSize(400, 400);
- Stage::GetCurrent().Add(actor);
-
- Vector4 initialColor = Color::WHITE;
- Property::Index colorIndex = propertyBuffer.RegisterProperty( "uFadeColor", initialColor );
-
- application.SendNotification();
- application.Render(0);
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<Vector4>(colorIndex), initialColor, TEST_LOCATION );
-
- Animation animation = Animation::New(1.0f);
- KeyFrames keyFrames = KeyFrames::New();
- keyFrames.Add(0.0f, initialColor);
- keyFrames.Add(1.0f, Color::TRANSPARENT);
- animation.AnimateBetween( Property( propertyBuffer, colorIndex ), keyFrames );
- animation.Play();
-
- application.SendNotification();
- application.Render(500);
-
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<Vector4>(colorIndex), Color::WHITE * 0.5f, TEST_LOCATION );
-
- application.Render(500);
-
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<Vector4>(colorIndex), Color::TRANSPARENT, TEST_LOCATION );
-
- END_TEST;
-}
-
-int UtcDaliPropertyBufferAnimatedProperty02(void)
-{
- TestApplication application;
-
- tet_infoline("Test that a uniform map propertyBuffer property can be animated");
-
- Shader shader = Shader::New("VertexSource", "FragmentSource");
- Material material = Material::New( shader );
- material.SetProperty(Material::Property::COLOR, Color::WHITE);
-
- PropertyBuffer propertyBuffer = CreatePropertyBuffer();
- Geometry geometry = CreateQuadGeometryFromBuffer(propertyBuffer);
- Renderer renderer = Renderer::New( geometry, material );
-
- Actor actor = Actor::New();
- actor.AddRenderer(renderer);
- actor.SetSize(400, 400);
- Stage::GetCurrent().Add(actor);
- application.SendNotification();
- application.Render(0);
-
- Vector4 initialColor = Color::WHITE;
- Property::Index colorIndex = propertyBuffer.RegisterProperty( "uFadeColor", initialColor );
-
- TestGlAbstraction& gl = application.GetGlAbstraction();
-
- application.SendNotification();
- application.Render(0);
-
- Vector4 actualValue(Vector4::ZERO);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, initialColor, TEST_LOCATION );
-
- Animation animation = Animation::New(1.0f);
- KeyFrames keyFrames = KeyFrames::New();
- keyFrames.Add(0.0f, initialColor);
- keyFrames.Add(1.0f, Color::TRANSPARENT);
- animation.AnimateBetween( Property( propertyBuffer, colorIndex ), keyFrames );
- animation.Play();
-
- application.SendNotification();
- application.Render(500);
-
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::WHITE * 0.5f, TEST_LOCATION );
-
- application.Render(500);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::TRANSPARENT, TEST_LOCATION );
-
- END_TEST;
-}
-
int UtcDaliPropertyBufferSetData01(void)
{
TestApplication application;
int size = 5u;
PropertyBuffer propertyBuffer = PropertyBuffer::New( texturedQuadVertexFormat, size );
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<int>(PropertyBuffer::Property::SIZE), size, TEST_LOCATION );
+ DALI_TEST_EQUALS( propertyBuffer.GetSize(), size, TEST_LOCATION );
DALI_TEST_EQUALS( propertyBuffer.GetSize(), size, TEST_LOCATION );
size += 3u;
propertyBuffer.SetSize( size );
- DALI_TEST_EQUALS( propertyBuffer.GetProperty<int>(PropertyBuffer::Property::SIZE), size, TEST_LOCATION );
+ DALI_TEST_EQUALS( propertyBuffer.GetSize(), size, TEST_LOCATION );
DALI_TEST_EQUALS( propertyBuffer.GetSize(), size, TEST_LOCATION );
size += 2u;
- propertyBuffer.SetProperty(PropertyBuffer::Property::SIZE, size );
+ propertyBuffer.SetSize( size );
DALI_TEST_EQUALS( propertyBuffer.GetSize(), size, TEST_LOCATION );
END_TEST;
geometry.RegisterProperty( "uFadeColor", Color::YELLOW );
- vertexBuffer.RegisterProperty( "uFadeColor", Color::BLACK );
-
-
TestGlAbstraction& gl = application.GetGlAbstraction();
application.SendNotification();
geometry.RegisterProperty( "uFadeColor", Color::YELLOW );
- vertexBuffer.RegisterProperty( "uFadeColor", Color::BLACK );
-
TestGlAbstraction& gl = application.GetGlAbstraction();
Property::Index geometryFadeColorIndex = geometry.RegisterProperty( "uFadeColor", Color::YELLOW );
- vertexBuffer.RegisterProperty( "uFadeColor", Color::BLACK );
+ geometry.RegisterProperty( "uFadeColor", Color::BLACK );
TestGlAbstraction& gl = application.GetGlAbstraction();
Property::Index geometryFadeColorIndex = geometry.RegisterProperty( "uFadeColor", Color::YELLOW );
- vertexBuffer.RegisterProperty( "uFadeColor", Color::BLACK );
+ geometry.RegisterProperty( "uFadeColor", Color::BLACK );
TestGlAbstraction& gl = application.GetGlAbstraction();
Property::Index geometryFadeColorIndex = geometry.RegisterProperty( "uFadeColor", Color::YELLOW );
- vertexBuffer.RegisterProperty( "uFadeColor", Color::BLACK );
+ geometry.RegisterProperty( "uFadeColor", Color::BLACK );
TestGlAbstraction& gl = application.GetGlAbstraction();
END_TEST;
}
-int UtcDaliRendererUniformMapPrecendence06(void)
-{
- TestApplication application;
-
- tet_infoline("Test the uniform map precedence is applied properly");
-
- Image image = BufferImage::New( 64, 64, Pixel::RGBA8888 );
-
- Shader shader = Shader::New("VertexSource", "FragmentSource");
- Material material = Material::New( shader );
- material.SetProperty(Material::Property::COLOR, Color::WHITE);
-
- PropertyBuffer vertexBuffer = CreatePropertyBuffer();
- Geometry geometry = CreateQuadGeometryFromBuffer(vertexBuffer);
- Renderer renderer = Renderer::New( geometry, material );
-
- Actor actor = Actor::New();
- actor.AddRenderer(renderer);
- actor.SetSize(400, 400);
- Stage::GetCurrent().Add(actor);
- application.SendNotification();
- application.Render(0);
-
- // Don't add property / uniform map to renderer/actor/material/sampler/shader
-
- geometry.RegisterProperty( "uFadeColor", Color::YELLOW );
-
- Property::Index vertexFadeColorIndex = vertexBuffer.RegisterProperty( "uFadeColor", Color::BLACK );
-
-
- TestGlAbstraction& gl = application.GetGlAbstraction();
-
- application.SendNotification();
- application.Render(0);
-
- // Expect that the geometry's fade color property is accessed
- Vector4 actualValue(Vector4::ZERO);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION );
-
- // Animate vertex buffer's fade color property. Should be no change to uniform
- Animation animation = Animation::New(1.0f);
- KeyFrames keyFrames = KeyFrames::New();
- keyFrames.Add(0.0f, Color::WHITE);
- keyFrames.Add(1.0f, Color::TRANSPARENT);
- animation.AnimateBetween( Property( vertexBuffer, vertexFadeColorIndex ), keyFrames );
- animation.Play();
-
- application.SendNotification();
- application.Render(500);
-
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION );
-
- application.Render(500);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION );
-
- END_TEST;
-}
-
-int UtcDaliRendererUniformMapPrecendence07(void)
-{
- TestApplication application;
-
- tet_infoline("Test the uniform map precedence is applied properly");
-
- Image image = BufferImage::New( 64, 64, Pixel::RGBA8888 );
-
- Shader shader = Shader::New("VertexSource", "FragmentSource");
- Material material = Material::New( shader );
- material.SetProperty(Material::Property::COLOR, Color::WHITE);
-
- PropertyBuffer vertexBuffer = CreatePropertyBuffer();
- Geometry geometry = CreateQuadGeometryFromBuffer(vertexBuffer);
- Renderer renderer = Renderer::New( geometry, material );
-
- Actor actor = Actor::New();
- actor.AddRenderer(renderer);
- actor.SetSize(400, 400);
- Stage::GetCurrent().Add(actor);
- application.SendNotification();
- application.Render(0);
-
- // Don't add property / uniform map to renderer/actor/material/sampler/shader/geometry
-
- Property::Index vertexFadeColorIndex = vertexBuffer.RegisterProperty( "uFadeColor", Color::BLACK );
-
- TestGlAbstraction& gl = application.GetGlAbstraction();
-
- application.SendNotification();
- application.Render(0);
-
- // Expect that the vertex buffer's fade color property is accessed
- Vector4 actualValue(Vector4::ZERO);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::BLACK, TEST_LOCATION );
-
- // Animate vertex buffer's fade color property. Should change the uniform
- Animation animation = Animation::New(1.0f);
- KeyFrames keyFrames = KeyFrames::New();
- keyFrames.Add(0.0f, Color::WHITE);
- keyFrames.Add(1.0f, Color::TRANSPARENT);
- animation.AnimateBetween( Property( vertexBuffer, vertexFadeColorIndex ), keyFrames );
- animation.Play();
-
- application.SendNotification();
- application.Render(500);
-
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::WHITE*0.5f, TEST_LOCATION );
-
- application.Render(500);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uFadeColor", actualValue ) );
- DALI_TEST_EQUALS( actualValue, Color::TRANSPARENT, TEST_LOCATION );
-
- END_TEST;
-}
-
-
int UtcDaliRendererUniformMapMultipleUniforms01(void)
{
TestApplication application;
material.RegisterProperty( "uUniform3", Color::BLUE );
shader.RegisterProperty( "uUniform4", Color::MAGENTA );
geometry.RegisterProperty( "uUniform5", Color::YELLOW );
- vertexBuffer.RegisterProperty( "uUniform6", Color::BLACK );
-
TestGlAbstraction& gl = application.GetGlAbstraction();
DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uUniform5", uniform6Value ) );
DALI_TEST_EQUALS( uniform6Value, Color::YELLOW, TEST_LOCATION );
- Vector4 uniform7Value(Vector4::ZERO);
- DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uUniform6", uniform7Value ) );
- DALI_TEST_EQUALS( uniform7Value, Color::BLACK, TEST_LOCATION );
-
-
END_TEST;
}
Property::Value value6(Matrix::IDENTITY);
geometry.RegisterProperty( "uAWorldMatrix", value6 );
- Property::Value value7(7);
- vertexBuffer.RegisterProperty( "uAnotherFadeColor", value7 );
-
-
TestGlAbstraction& gl = application.GetGlAbstraction();
application.SendNotification();
DALI_TEST_CHECK( gl.GetUniformValue<Matrix>( "uAWorldMatrix", uniform6Value ) );
DALI_TEST_EQUALS( uniform6Value, value6.Get<Matrix>(), TEST_LOCATION );
- int uniform7Value = 0;
- DALI_TEST_CHECK( gl.GetUniformValue<int>( "uAnotherFadeColor", uniform7Value ) );
- DALI_TEST_EQUALS( uniform7Value, value7.Get<int>(), TEST_LOCATION );
-
END_TEST;
}
// INTERNAL INCLUDES
#include <dali/public-api/object/property-map.h> // Dali::Property::Map
-#include <dali/internal/event/common/object-impl-helper.h> // Dali::Internal::ObjectHelper
#include <dali/internal/event/common/property-buffer-impl.h> // Dali::Internal::PropertyBuffer
namespace Dali
}
PropertyBuffer::PropertyBuffer( const PropertyBuffer& handle )
-: Handle( handle )
+: BaseHandle( handle )
{
}
}
PropertyBuffer::PropertyBuffer( Internal::PropertyBuffer* pointer )
-: Handle( pointer )
+: BaseHandle( pointer )
{
}
// INTERNAL INCLUDES
#include <dali/public-api/object/handle.h> // Dali::Handle
-#include <dali/public-api/object/property.h> // Dali::Property::Index
-#include <dali/public-api/object/property-index-ranges.h> // DEFAULT_DERIVED_HANDLE_PROPERTY_START_INDEX
#include <dali/public-api/object/property-map.h> // Dali::Property::Map
namespace Dali
* texturedQuadGeometry.SetIndexBuffer( indices );
*
*/
-class DALI_IMPORT_API PropertyBuffer : public Handle
+class DALI_IMPORT_API PropertyBuffer : public BaseHandle
{
public:
/**
- * @brief An enumeration of properties belonging to the PropertyBuffer class.
- */
- struct Property
- {
- enum
- {
- SIZE = DEFAULT_OBJECT_PROPERTY_START_INDEX, ///< name "size", type INTEGER
- BUFFER_FORMAT, ///< name "buffer-format", type MAP
- };
- };
-
- /**
* @brief Create a PropertyBuffer
*
* Static property buffers use less memory.
#include <dali/internal/render/renderers/render-geometry.h>
#include <dali/internal/render/renderers/render-image-renderer.h>
#include <dali/internal/render/renderers/render-new-renderer.h>
+#include <dali/internal/render/renderers/render-property-buffer.h>
#include <dali/internal/render/renderers/render-renderer.h>
#include <dali/internal/render/renderers/render-sampler.h>
sizeof( Internal::SceneGraph::RenderGeometry) );
const int PROPERTY_BUFFER_MEMORY_SIZE(
sizeof( Internal::PropertyBuffer ) +
- sizeof( Internal::SceneGraph::PropertyBuffer ) );
+ sizeof( Internal::Render::PropertyBuffer ) );
const int MATERIAL_MEMORY_SIZE(
sizeof( Internal::Material ) +
sizeof( Internal::SceneGraph::Material ) );
#include <algorithm> // std::sort
// INTERNAL INCLUDES
-#include <dali/public-api/object/type-registry.h>
#include <dali/devel-api/object/property-buffer.h> // Dali::Internal::PropertyBuffer
-
-#include <dali/internal/event/common/object-impl-helper.h> // Dali::Internal::ObjectHelper
-#include <dali/internal/event/common/property-helper.h> // DALI_PROPERTY_TABLE_BEGIN, DALI_PROPERTY, DALI_PROPERTY_TABLE_END
-#include <dali/internal/update/common/scene-graph-property-buffer.h>
+#include <dali/internal/event/common/stage-impl.h>
#include <dali/internal/update/manager/update-manager.h>
namespace Dali
namespace Internal
{
-using SceneGraph::PropertyBufferMetadata::Format;
-using SceneGraph::PropertyBufferMetadata::Component;
-
namespace
{
/**
- * |name |type |writable|animatable|constraint-input|enum for index-checking|
- */
-DALI_PROPERTY_TABLE_BEGIN
-DALI_PROPERTY( "size", INTEGER, true, false, true, Dali::PropertyBuffer::Property::SIZE )
-DALI_PROPERTY( "buffer-format", MAP, false, false, false, Dali::PropertyBuffer::Property::BUFFER_FORMAT )
-DALI_PROPERTY_TABLE_END( DEFAULT_ACTOR_PROPERTY_START_INDEX )
-
-const ObjectImplHelper<DEFAULT_PROPERTY_COUNT> PROPERTY_BUFFER_IMPL = { DEFAULT_PROPERTY_DETAILS };
-
-BaseHandle Create()
-{
- return Dali::BaseHandle();
-}
-
-TypeRegistration mType( typeid( Dali::PropertyBuffer ), typeid( Dali::Handle ), Create );
-
-/**
* Calculate the alignment requirements of a type
*
* This is used to calculate the memory alignment requirements of a type
SizeChanged();
- SceneGraph::SetSizeMessage( GetEventThreadServices(),
- *mSceneObject,
- mSize );
+ SceneGraph::SetPropertyBufferSize(mEventThreadServices.GetUpdateManager(),*mRenderObject, mSize );
}
std::size_t PropertyBuffer::GetSize() const
const char* source = static_cast<const char*>( data );
std::copy( source, source + mBuffer.Size(), &mBuffer[0] );
- SceneGraph::SetDataMessage( GetEventThreadServices(),
- *mSceneObject,
- new SceneGraph::PropertyBuffer::BufferType( mBuffer ) );
-}
-
-const SceneGraph::PropertyBuffer* PropertyBuffer::GetPropertyBufferSceneObject() const
-{
- return mSceneObject;
+ SceneGraph::SetPropertyBufferData(mEventThreadServices.GetUpdateManager(),*mRenderObject,new Dali::Vector<char>( mBuffer ));
}
void PropertyBuffer::SetFormat( Dali::Property::Map& format )
FormatChanged();
}
-unsigned int PropertyBuffer::GetDefaultPropertyCount() const
+const Render::PropertyBuffer* PropertyBuffer::GetRenderObject() const
{
- return PROPERTY_BUFFER_IMPL.GetDefaultPropertyCount();
-}
-
-void PropertyBuffer::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const
-{
- PROPERTY_BUFFER_IMPL.GetDefaultPropertyIndices( indices );
-}
-
-const char* PropertyBuffer::GetDefaultPropertyName(Property::Index index) const
-{
- return PROPERTY_BUFFER_IMPL.GetDefaultPropertyName( index );
-}
-
-Property::Index PropertyBuffer::GetDefaultPropertyIndex( const std::string& name ) const
-{
- return PROPERTY_BUFFER_IMPL.GetDefaultPropertyIndex( name );
-}
-
-bool PropertyBuffer::IsDefaultPropertyWritable( Property::Index index ) const
-{
- return PROPERTY_BUFFER_IMPL.IsDefaultPropertyWritable( index );
-}
-
-bool PropertyBuffer::IsDefaultPropertyAnimatable( Property::Index index ) const
-{
- return PROPERTY_BUFFER_IMPL.IsDefaultPropertyAnimatable( index );
-}
-
-bool PropertyBuffer::IsDefaultPropertyAConstraintInput( Property::Index index ) const
-{
- return PROPERTY_BUFFER_IMPL.IsDefaultPropertyAConstraintInput( index );
-}
-
-Property::Type PropertyBuffer::GetDefaultPropertyType( Property::Index index ) const
-{
- return PROPERTY_BUFFER_IMPL.GetDefaultPropertyType( index );
-}
-
-void PropertyBuffer::SetDefaultProperty( Property::Index index,
- const Property::Value& propertyValue )
-{
- switch( index )
- {
- case Dali::PropertyBuffer::Property::SIZE:
- {
- SetSize( propertyValue.Get<int>() );
- break;
- }
- case Dali::PropertyBuffer::Property::BUFFER_FORMAT:
- {
- DALI_ASSERT_ALWAYS( 0 && "MESH_REWORK" );
- break;
- }
- }
-}
-
-void PropertyBuffer::SetSceneGraphProperty( Property::Index index,
- const PropertyMetadata& entry,
- const Property::Value& value )
-{
- PROPERTY_BUFFER_IMPL.SetSceneGraphProperty( GetEventThreadServices(), this, index, entry, value );
-}
-
-Property::Value PropertyBuffer::GetDefaultProperty( Property::Index index ) const
-{
- Property::Value value;
-
- switch( index )
- {
- case Dali::PropertyBuffer::Property::SIZE:
- {
- value = static_cast<int>( GetSize() );
- break;
- }
- case Dali::PropertyBuffer::Property::BUFFER_FORMAT:
- {
- DALI_ASSERT_ALWAYS( 0 && "MESH_REWORK" );
- break;
- }
- }
- return value;
-}
-
-const SceneGraph::PropertyOwner* PropertyBuffer::GetPropertyOwner() const
-{
- return mSceneObject;
-}
-
-const SceneGraph::PropertyOwner* PropertyBuffer::GetSceneObject() const
-{
- return mSceneObject;
-}
-
-const SceneGraph::PropertyBase* PropertyBuffer::GetSceneObjectAnimatableProperty( Property::Index index ) const
-{
- DALI_ASSERT_ALWAYS( IsPropertyAnimatable(index) && "Property is not animatable" );
- const SceneGraph::PropertyBase* property = NULL;
-
- if( OnStage() )
- {
- property = PROPERTY_BUFFER_IMPL.GetRegisteredSceneGraphProperty(
- this,
- &PropertyBuffer::FindAnimatableProperty,
- &PropertyBuffer::FindCustomProperty,
- index );
-
- if( property == NULL && index < DEFAULT_PROPERTY_MAX_COUNT )
- {
- DALI_ASSERT_ALWAYS( 0 && "Property is not animatable" );
- }
- }
-
- return property;
-}
-
-const PropertyInputImpl* PropertyBuffer::GetSceneObjectInputProperty( Property::Index index ) const
-{
- const PropertyInputImpl* property = NULL;
-
- if( OnStage() )
- {
- const SceneGraph::PropertyBase* baseProperty =
- PROPERTY_BUFFER_IMPL.GetRegisteredSceneGraphProperty( this,
- &PropertyBuffer::FindAnimatableProperty,
- &PropertyBuffer::FindCustomProperty,
- index );
- property = static_cast<const PropertyInputImpl*>( baseProperty );
-
- if( property == NULL && index < DEFAULT_PROPERTY_MAX_COUNT )
- {
- if( index == Dali::PropertyBuffer::Property::SIZE )
- {
- // @todo MESH_REWORK
- DALI_ASSERT_ALWAYS( 0 && "MESH_REWORK" );
- }
- }
- }
-
- return property;
-}
-
-int PropertyBuffer::GetPropertyComponentIndex( Property::Index index ) const
-{
- return Property::INVALID_COMPONENT_INDEX;
-}
-
-bool PropertyBuffer::OnStage() const
-{
- return mOnStage;
-}
-
-void PropertyBuffer::Connect()
-{
- mOnStage = true;
-}
-
-void PropertyBuffer::Disconnect()
-{
- mOnStage = false;
+ return mRenderObject;
}
PropertyBuffer::~PropertyBuffer()
{
- if( EventThreadServices::IsCoreRunning() )
+ if( EventThreadServices::IsCoreRunning() && mRenderObject)
{
- EventThreadServices& eventThreadServices = GetEventThreadServices();
- SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
- RemoveMessage( updateManager, updateManager.GetPropertyBufferOwner(), *mSceneObject );
-
- eventThreadServices.UnregisterObject( this );
+ SceneGraph::RemovePropertyBuffer( mEventThreadServices.GetUpdateManager(), *mRenderObject );
}
}
PropertyBuffer::PropertyBuffer()
-: mSceneObject( NULL ),
- mBufferFormat( NULL ),
- mSize( 0 ),
- mOnStage( false )
+:mEventThreadServices( *Stage::GetCurrent() )
+,mRenderObject(NULL)
+,mBufferFormat( NULL )
+,mSize( 0 )
{
}
void PropertyBuffer::Initialize()
{
- EventThreadServices& eventThreadServices = GetEventThreadServices();
- SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
-
- mSceneObject = new SceneGraph::PropertyBuffer();
- AddMessage( updateManager, updateManager.GetPropertyBufferOwner(), *mSceneObject );
-
- eventThreadServices.RegisterObject( this );
+ mRenderObject = new Render::PropertyBuffer();
+ SceneGraph::AddPropertyBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject );
}
void PropertyBuffer::FormatChanged()
// Create the format
DALI_ASSERT_DEBUG( mBufferFormat == NULL && "PropertyFormat should not be set yet" );
- Format* bufferFormat = new Format();
- bufferFormat->components.resize( numComponents );
+ Render::PropertyBuffer::Format* format = new Render::PropertyBuffer::Format();
+ format->components.resize( numComponents );
unsigned int currentAlignment = 0u;
unsigned int maxAlignmentRequired = 0u;
StringValuePair component = mFormat.GetPair( i );
// Get the name
- bufferFormat->components[i].name = component.first;
+ format->components[i].name = component.first;
// enums are stored in the map as int
Property::Type type = Property::Type( component.second.Get<int>() );
}
// write to the format
- bufferFormat->components[i].size = elementSize;
- bufferFormat->components[i].offset = currentAlignment;
- bufferFormat->components[i].type = type;
+ format->components[i].size = elementSize;
+ format->components[i].offset = currentAlignment;
+ format->components[i].type = type;
// update offset
currentAlignment += elementSize;
}
// Set the format size
- bufferFormat->size = currentAlignment;
-
- mBufferFormat = bufferFormat;
+ format->size = currentAlignment;
- SceneGraph::SetFormatMessage( GetEventThreadServices(),
- *mSceneObject,
- bufferFormat );
+ mBufferFormat = format;
+ SceneGraph::SetPropertyBufferFormat(mEventThreadServices.GetUpdateManager(), *mRenderObject, format );
if( mSize )
{
SizeChanged();
*
*/
-// EXTERNAL INCLUDES
-#include <utility> // std::pair
-
// INTERNAL INCLUDES
#include <dali/public-api/common/dali-common.h> // DALI_ASSERT_ALWAYS
#include <dali/public-api/common/intrusive-ptr.h> // Dali::IntrusivePtr
+#include <dali/public-api/object/base-object.h>
#include <dali/public-api/object/property-map.h> // Dali::Property::Map
#include <dali/devel-api/object/property-buffer.h> // Dali::PropertyBuffer
-#include <dali/internal/event/common/connectable.h> // Dali::Internal::Connectable
-#include <dali/internal/event/common/object-connector.h> // Dali::Internal::ObjectConnector
-#include <dali/internal/event/common/object-impl.h> // Dali::Internal::Object
+#include <dali/internal/event/common/event-thread-services.h>
+#include <dali/internal/render/renderers/render-property-buffer.h>
namespace Dali
{
namespace Internal
{
-namespace SceneGraph
-{
-class PropertyBuffer;
-
-namespace PropertyBufferMetadata
-{
-struct Format;
-} // namespace PropertyBufferMetadata
-
-} // namespace SceneGraph
class PropertyBuffer;
typedef IntrusivePtr<PropertyBuffer> PropertyBufferPtr;
* PropertyBuffer is an object that contains an array of structures of values that
* can be accessed as properties.
*/
-class PropertyBuffer : public Object, public Connectable
+class PropertyBuffer : public BaseObject
{
public:
void SetData( const void* data );
/**
- * @copydoc PropertBuffer::GetPropertyIndex()
- */
- Dali::Property::Index GetPropertyIndex( const std::string name, std::size_t index );
-
- /**
- * @brief Get the propertyBuffer scene object
- *
- * @return the propertyBuffer scene object
- */
- const SceneGraph::PropertyBuffer* GetPropertyBufferSceneObject() const;
-
- /**
* @brief Set the format of the PropertyBuffer
*
* @pre Has not been set yet
public: // Default property extensions from Object
/**
- * @copydoc Dali::Internal::Object::GetDefaultPropertyCount()
- */
- virtual unsigned int GetDefaultPropertyCount() const;
-
- /**
- * @copydoc Dali::Internal::Object::GetDefaultPropertyIndices()
- */
- virtual void GetDefaultPropertyIndices( Property::IndexContainer& indices ) const;
-
- /**
- * @copydoc Dali::Internal::Object::GetDefaultPropertyName()
- */
- virtual const char* GetDefaultPropertyName(Property::Index index) const;
-
- /**
- * @copydoc Dali::Internal::Object::GetDefaultPropertyIndex()
- */
- virtual Property::Index GetDefaultPropertyIndex(const std::string& name) const;
-
- /**
- * @copydoc Dali::Internal::Object::IsDefaultPropertyWritable()
- */
- virtual bool IsDefaultPropertyWritable(Property::Index index) const;
-
- /**
- * @copydoc Dali::Internal::Object::IsDefaultPropertyAnimatable()
- */
- virtual bool IsDefaultPropertyAnimatable(Property::Index index) const;
-
- /**
- * @copydoc Dali::Internal::Object::IsDefaultPropertyAConstraintInput()
- */
- virtual bool IsDefaultPropertyAConstraintInput( Property::Index index ) const;
-
- /**
- * @copydoc Dali::Internal::Object::GetDefaultPropertyType()
- */
- virtual Property::Type GetDefaultPropertyType(Property::Index index) const;
-
- /**
- * @copydoc Dali::Internal::Object::SetDefaultProperty()
- */
- virtual void SetDefaultProperty(Property::Index index, const Property::Value& propertyValue);
-
- /**
- * @copydoc Dali::Internal::Object::SetSceneGraphProperty()
- */
- virtual void SetSceneGraphProperty( Property::Index index, const PropertyMetadata& entry, const Property::Value& value );
-
- /**
- * @copydoc Dali::Internal::Object::GetDefaultProperty()
- */
- virtual Property::Value GetDefaultProperty( Property::Index index ) const;
-
- /**
- * @copydoc Dali::Internal::Object::GetPropertyOwner()
- */
- virtual const SceneGraph::PropertyOwner* GetPropertyOwner() const;
-
- /**
- * @copydoc Dali::Internal::Object::GetSceneObject()
- */
- virtual const SceneGraph::PropertyOwner* GetSceneObject() const;
-
- /**
- * @copydoc Dali::Internal::Object::GetSceneObjectAnimatableProperty()
- */
- virtual const SceneGraph::PropertyBase* GetSceneObjectAnimatableProperty( Property::Index index ) const;
-
- /**
- * @copydoc Dali::Internal::Object::GetSceneObjectInputProperty()
- */
- virtual const PropertyInputImpl* GetSceneObjectInputProperty( Property::Index index ) const;
-
- /**
- * @copydoc Dali::Internal::Object::GetPropertyComponentIndex()
- */
- virtual int GetPropertyComponentIndex( Property::Index index ) const;
-
-public: // Functions from Connectable
- /**
- * @copydoc Dali::Internal::Connectable::OnStage()
- */
- virtual bool OnStage() const;
-
- /**
- * @copydoc Dali::Internal::Connectable::Contnect()
- */
- virtual void Connect();
-
- /**
- * @copydoc Dali::Internal::Connectable::Disconnect()
+ * @brief Get the render thread side of the PropertyBuffer
+ *
+ * @return The render thread side of this PropertyBuffer
*/
- virtual void Disconnect();
+ const Render::PropertyBuffer* GetRenderObject() const;
protected:
/**
PropertyBuffer& operator=( const PropertyBuffer& );
private: // data
- SceneGraph::PropertyBuffer* mSceneObject; ///< Update side object
+ EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
+ Render::PropertyBuffer* mRenderObject; ///<Render side object
Property::Map mFormat; ///< Format of the property buffer
- const SceneGraph::PropertyBufferMetadata::Format* mBufferFormat; ///< Metadata for the format of the property buffer
+ const Render::PropertyBuffer::Format* mBufferFormat; ///< Metadata for the format of the property buffer
unsigned int mSize; ///< Number of elements in the buffer
Dali::Vector< char > mBuffer; // Data of the property-buffer
-
- bool mOnStage; ///< Flag to know if the object is on stage
};
/**
std::size_t Geometry::AddVertexBuffer( PropertyBuffer& vertexBuffer )
{
- PropertyBufferConnector connector;
- connector.Set( vertexBuffer, OnStage() );
- mVertexBufferConnectors.push_back( connector );
-
- const SceneGraph::PropertyBuffer& sceneGraphPropertyBuffer = static_cast<const SceneGraph::PropertyBuffer&>( *vertexBuffer.GetSceneObject() );
-
- SceneGraph::AddVertexBufferMessage( GetEventThreadServices(), *mSceneObject, sceneGraphPropertyBuffer );
-
- return mVertexBufferConnectors.size() - 1u;
+ mVertexBuffers.push_back( &vertexBuffer );
+ SceneGraph::AddVertexBufferMessage( GetEventThreadServices(), *mSceneObject, *vertexBuffer.GetRenderObject() );
+ return mVertexBuffers.size() - 1u;
}
std::size_t Geometry::GetNumberOfVertexBuffers() const
{
- return mVertexBufferConnectors.size();
+ return mVertexBuffers.size();
}
void Geometry::RemoveVertexBuffer( std::size_t index )
{
- const SceneGraph::PropertyBuffer& sceneGraphPropertyBuffer = static_cast<const SceneGraph::PropertyBuffer&>( *(mVertexBufferConnectors[index].Get()->GetSceneObject()) );
- SceneGraph::RemoveVertexBufferMessage( GetEventThreadServices(), *mSceneObject, sceneGraphPropertyBuffer );
+ const Render::PropertyBuffer& renderPropertyBuffer = static_cast<const Render::PropertyBuffer&>( *(mVertexBuffers[index]->GetRenderObject()) );
+ SceneGraph::RemoveVertexBufferMessage( GetEventThreadServices(), *mSceneObject, renderPropertyBuffer );
- mVertexBufferConnectors.erase( mVertexBufferConnectors.begin() + index );
+ mVertexBuffers.erase( mVertexBuffers.begin() + index );
}
void Geometry::SetIndexBuffer( PropertyBuffer& indexBuffer )
{
- mIndexBufferConnector.Set( indexBuffer, OnStage() );
-
- const SceneGraph::PropertyBuffer& sceneGraphPropertyBuffer = dynamic_cast<const SceneGraph::PropertyBuffer&>( *indexBuffer.GetSceneObject() );
-
- SceneGraph::SetIndexBufferMessage( GetEventThreadServices(), *mSceneObject, sceneGraphPropertyBuffer );
+ mIndexBuffer = &indexBuffer;
+ SceneGraph::SetIndexBufferMessage( GetEventThreadServices(), *mSceneObject, *indexBuffer.GetRenderObject() );
}
void Geometry::SetGeometryType( Dali::Geometry::GeometryType geometryType )
void Geometry::Connect()
{
mOnStage = true;
-
- PropertyBufferConnectorContainer::const_iterator end = mVertexBufferConnectors.end();
- for( PropertyBufferConnectorContainer::iterator it = mVertexBufferConnectors.begin();
- it < end;
- ++it )
- {
- it->OnStageConnect();
- }
- mIndexBufferConnector.OnStageConnect();
}
void Geometry::Disconnect()
{
mOnStage = false;
-
- PropertyBufferConnectorContainer::const_iterator end = mVertexBufferConnectors.end();
- for( PropertyBufferConnectorContainer::iterator it = mVertexBufferConnectors.begin();
- it < end;
- ++it )
- {
- it->OnStageDisconnect();
- }
- mIndexBufferConnector.OnStageDisconnect();
}
Geometry::Geometry()
-: mSceneObject( NULL ),
+: mIndexBuffer( NULL ),
+ mSceneObject( NULL ),
mOnStage( false )
{
}
Geometry& operator=( const Geometry& );
private: // data
- typedef ObjectConnector<PropertyBuffer> PropertyBufferConnector;
- typedef std::vector< PropertyBufferConnector > PropertyBufferConnectorContainer;
- PropertyBufferConnectorContainer mVertexBufferConnectors; ///< Vector of connectors that hold the property buffers used by this geometry
- PropertyBufferConnector mIndexBufferConnector; ///< Connector that holds the index buffer used by this geometry
+
+ std::vector<PropertyBufferPtr> mVertexBuffers; ///< Vector of intrusive pointers to vertex buffers
+ PropertyBufferPtr mIndexBuffer; ///< Intrusive pointer to index buffer
SceneGraph::Geometry* mSceneObject;
bool mOnStage;
};
$(internal_src_dir)/render/queue/render-queue.cpp \
$(internal_src_dir)/render/renderers/render-geometry.cpp \
$(internal_src_dir)/render/renderers/render-new-renderer.cpp \
- $(internal_src_dir)/render/renderers/render-renderer-property-buffer.cpp \
+ $(internal_src_dir)/render/renderers/render-property-buffer.cpp \
$(internal_src_dir)/render/renderers/render-image-renderer.cpp \
$(internal_src_dir)/render/renderers/render-renderer.cpp \
$(internal_src_dir)/render/shaders/custom-uniform.cpp \
$(internal_src_dir)/update/common/property-owner.cpp \
$(internal_src_dir)/update/common/scene-graph-buffers.cpp \
$(internal_src_dir)/update/common/scene-graph-connection-change-propagator.cpp \
- $(internal_src_dir)/update/common/scene-graph-property-buffer.cpp \
$(internal_src_dir)/update/common/scene-graph-property-notification.cpp \
$(internal_src_dir)/update/common/uniform-map.cpp \
$(internal_src_dir)/update/controllers/render-message-dispatcher.cpp \
typedef OwnerContainer< Render::Sampler* > SamplerOwnerContainer;
typedef SamplerOwnerContainer::Iterator SamplerOwnerIter;
+typedef OwnerContainer< Render::PropertyBuffer* > PropertyBufferOwnerContainer;
+typedef PropertyBufferOwnerContainer::Iterator PropertyBufferOwnerIter;
+
typedef OwnerContainer< RenderTracker* > RenderTrackerContainer;
typedef RenderTrackerContainer::Iterator RenderTrackerIter;
typedef RenderTrackerContainer::ConstIterator RenderTrackerConstIter;
RendererOwnerContainer rendererContainer; ///< List of owned renderers
SamplerOwnerContainer samplerContainer; ///< List of owned samplers
+ PropertyBufferOwnerContainer propertyBufferContainer; ///< List of owned property buffers
RenderGeometryOwnerContainer renderGeometryContainer; ///< List of owned RenderGeometries
bool renderersAdded;
sampler->SetWrapMode( (Dali::WrapMode::Type)uWrapMode, (Dali::WrapMode::Type)vWrapMode );
}
+void RenderManager::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer )
+{
+ mImpl->propertyBufferContainer.PushBack( propertyBuffer );
+}
+
+void RenderManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer )
+{
+ DALI_ASSERT_DEBUG( NULL != propertyBuffer );
+
+ PropertyBufferOwnerContainer& propertyBuffers = mImpl->propertyBufferContainer;
+
+ // Find the sampler
+ for ( PropertyBufferOwnerIter iter = propertyBuffers.Begin(); iter != propertyBuffers.End(); ++iter )
+ {
+ if ( *iter == propertyBuffer )
+ {
+ propertyBuffers.Erase( iter ); // Property buffer found; now destroy it
+ break;
+ }
+ }
+}
+
+void RenderManager::SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format )
+{
+ propertyBuffer->SetFormat( format );
+}
+
+void RenderManager::SetPropertyBufferData(Render::PropertyBuffer* propertyBuffer, Dali::Vector<char>* data)
+{
+ propertyBuffer->SetData( data );
+}
+
+void RenderManager::SetPropertyBufferSize(Render::PropertyBuffer* propertyBuffer, size_t size )
+{
+ propertyBuffer->SetSize( size );
+}
+
void RenderManager::AddGeometry( RenderGeometry* renderGeometry )
{
mImpl->renderGeometryContainer.PushBack( renderGeometry );
}
}
-void RenderManager::AddPropertyBuffer( RenderGeometry* renderGeometry, PropertyBufferDataProvider* propertyBuffer, const GpuBuffer::Target& target, const GpuBuffer::Usage& usage )
+void RenderManager::AddPropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer )
{
DALI_ASSERT_DEBUG( NULL != renderGeometry );
{
if ( *iter == renderGeometry )
{
- (*iter)->AddPropertyBuffer( propertyBuffer, target, usage );
+ (*iter)->AddPropertyBuffer( propertyBuffer, isIndexBuffer );
break;
}
}
}
-void RenderManager::RemovePropertyBuffer( RenderGeometry* renderGeometry, PropertyBufferDataProvider* propertyBuffer )
+void RenderManager::RemovePropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer )
{
DALI_ASSERT_DEBUG( NULL != renderGeometry );
#include <dali/internal/render/common/post-process-resource-dispatcher.h>
#include <dali/internal/update/resources/resource-manager-declarations.h>
#include <dali/internal/render/gl-resources/gpu-buffer.h>
+#include <dali/internal/render/renderers/render-property-buffer.h>
namespace Dali
{
void SetWrapMode( Render::Sampler* sampler, unsigned int uWrapMode, unsigned int vWrapMode );
/**
+ * Add a property buffer to the render manager.
+ * @param[in] propertyBuffer The property buffer to add.
+ * @post propertBuffer is owned by RenderManager
+ */
+ void AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer );
+
+ /**
+ * Remove a property buffer from the render manager.
+ * @param[in] propertyBuffer The property buffer to remove.
+ * @post propertyBuffer is destroyed.
+ */
+ void RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer );
+
+ /**
* Add a geometry to the render manager.
* @param[in] geometry The geometry to add.
* @post geometry is owned by RenderManager
* Adds a property buffer to a RenderGeometry from the render manager.
* @param[in] geometry The geometry
* @param[in] propertyBuffer The property buffer to remove.
- * @param[in] target Specifies the type of the buffer
- * @param[in] usage Specifies how will the buffer be used
+ * @param[in] isIndexBuffer True if the property buffer is intended to be used as an index buffer
*/
- void AddPropertyBuffer( RenderGeometry* renderGeometry, PropertyBufferDataProvider* propertyBuffer, const GpuBuffer::Target& target, const GpuBuffer::Usage& usage );
+ void AddPropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer );
/**
* Remove a property buffer from a RenderGeometry from the render manager.
* @param[in] propertyBuffer The property buffer to remove.
* @post property buffer is destroyed.
*/
- void RemovePropertyBuffer( RenderGeometry* renderGeometry, PropertyBufferDataProvider* propertyBuffer );
+ void RemovePropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer );
+
+ /**
+ * Sets the format of an existing property buffer
+ * @param[in] propertyBuffer The property buffer.
+ * @param[in] format The new format of the buffer
+ */
+ void SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format );
+
+ /**
+ * Sets the data of an existing property buffer
+ * @param[in] propertyBuffer The property buffer.
+ * @param[in] data The new data of the buffer
+ */
+ void SetPropertyBufferData(Render::PropertyBuffer* propertyBuffer, Dali::Vector<char>* data);
+
+ /**
+ * Sets the size of an existing property buffer
+ * @param[in] propertyBuffer The property buffer.
+ * @param[in] size The new size of the buffer
+ */
+ void SetPropertyBufferSize(Render::PropertyBuffer* propertyBuffer, size_t size );
/**
* Adds a render tracker to the RenderManager. RenderManager takes ownership of the
}
-GpuBuffer::GpuBuffer( Context& context, Target target, Usage usage )
+GpuBuffer::GpuBuffer( Context& context )
: mContext( context ),
mCapacity( 0 ),
mSize( 0 ),
mBufferId( 0 ),
- mTarget( target ),
- mUsage( usage ),
mBufferCreated( false )
{
}
* Creates or updates the buffer data depending on whether it
* already exists or not.
*/
-void GpuBuffer::UpdateDataBuffer(GLsizeiptr size,const GLvoid *data)
+void GpuBuffer::UpdateDataBuffer(GLsizeiptr size,const GLvoid *data, Usage usage)
{
DALI_ASSERT_DEBUG( size > 0 );
mSize = size;
}
// make sure the buffer is bound, don't perform any checks because size may be zero
- BindNoChecks(mBufferId);
+ mContext.BindArrayBuffer( mBufferId );
// if the buffer has already been created, just update the data providing it fits
if (mBufferCreated )
// if the data will fit in the existing buffer, just update it
if (size <= mCapacity )
{
- mContext.BufferSubData( TypeAsGlEnum(mTarget), 0, size, data );
+ mContext.BufferSubData( GL_ARRAY_BUFFER, 0, size, data );
}
else
{
// create a new buffer of the larger size,
// gl should automatically deallocate the old buffer
- mContext.BufferData( TypeAsGlEnum(mTarget), size, data, ModeAsGlEnum( mUsage ) );
+ mContext.BufferData( GL_ARRAY_BUFFER, size, data, ModeAsGlEnum( usage ) );
mCapacity = size;
}
}
else
{
// create the buffer
- mContext.BufferData( TypeAsGlEnum(mTarget), size, data, ModeAsGlEnum( mUsage ) );
+ mContext.BufferData( GL_ARRAY_BUFFER, size, data, ModeAsGlEnum( usage ) );
mBufferCreated = true;
mCapacity = size;
}
- switch (mTarget)
- {
- case ARRAY_BUFFER:
- {
- mContext.BindArrayBuffer(0);
- break;
- }
- case ELEMENT_ARRAY_BUFFER:
- {
- mContext.BindElementArrayBuffer(0);
- break;
- }
- case TRANSFORM_FEEDBACK_BUFFER:
- {
- mContext.BindTransformFeedbackBuffer(0);
- break;
- }
- }
+ mContext.BindArrayBuffer(0);
}
-void GpuBuffer::Bind() const
+void GpuBuffer::Bind(Target target) const
{
DALI_ASSERT_DEBUG(mCapacity);
- BindNoChecks(mBufferId);
+ if (target == ARRAY_BUFFER)
+ {
+ mContext.BindArrayBuffer(mBufferId);
+ }
+ else
+ {
+ mContext.BindElementArrayBuffer(mBufferId);
+ }
}
bool GpuBuffer::BufferIsValid() const
mBufferCreated = false;
}
-void GpuBuffer::BindNoChecks(GLuint bufferId) const
-{
- // context currently only supports two targets, element and array
- // and it caches both of them (as in it won't bind them if the
- // buffer id is already bound).
-
- if (mTarget == ARRAY_BUFFER)
- {
- mContext.BindArrayBuffer(bufferId);
- }
- else
- {
- mContext.BindElementArrayBuffer(bufferId);
- }
-}
-
-
} // namespace Internal
} //namespace Dali
/**
* constructor
* @param context drawing context
- * @param target the type of buffer to create @see Type
- * @param usage how the buffer will be used @see DrawMode
*/
- GpuBuffer( Context& context, Target target, Usage usage );
+ GpuBuffer( Context& context );
/**
* Destructor, non virtual as no virtual methods or inheritance
* Creates or updates a buffer object and binds it to the target.
* @param size Specifies the size in bytes of the buffer object's new data store.
* @param data pointer to the data to load
+ * @param usage How the buffer will be used
*/
- void UpdateDataBuffer(GLsizeiptr size, const GLvoid *data);
+ void UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usage);
/**
* Bind the buffer object to the target
* Will assert if the buffer size is zero
*/
- void Bind() const;
+ void Bind(Target target) const;
/**
* @return true if the GPU buffer is valid, i.e. its created and not empty
return mSize;
}
- void SetStride( GLuint stride )
- {
- mStride = stride;
- }
-
- GLuint GetStride()
- {
- return mStride;
- }
-
/**
* Needs to be called when GL context is destroyed
*/
GLsizeiptr mCapacity; ///< buffer capacity
GLsizeiptr mSize; ///< buffer size
GLuint mBufferId; ///< buffer object name(id)
- GLuint mStride; ///< stride of data in buffer object
- Target mTarget:2; ///< type of buffer (array/element), 2 bits are enough
- Usage mUsage:2; ///< how the buffer is used (read, read/write etc), 2 bits are enough
bool mBufferCreated:1; ///< whether buffer has been created
};
#include <dali/internal/render/renderers/render-geometry.h>
#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/update/common/scene-graph-property-buffer.h>
#include <dali/internal/update/rendering/scene-graph-geometry.h>
#include <dali/internal/render/data-providers/render-data-provider.h>
#include <dali/internal/render/gl-resources/context.h>
#include <dali/internal/render/gl-resources/gpu-buffer.h>
+#include <dali/internal/render/renderers/render-property-buffer.h>
#include <dali/internal/render/shaders/program.h>
namespace Dali
RenderGeometry::RenderGeometry( const GeometryDataProvider& geometryDataProvider )
: mGeometryDataProvider( geometryDataProvider ),
+ mIndexBuffer(0),
mHasBeenUpdated(false),
mAttributesChanged(true)
{
{
}
-void RenderGeometry::AddPropertyBuffer( const PropertyBufferDataProvider* dataProvider, GpuBuffer::Target gpuBufferTarget, GpuBuffer::Usage gpuBufferUsage )
+void RenderGeometry::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer )
{
- if( gpuBufferTarget == GpuBuffer::ELEMENT_ARRAY_BUFFER )
+ if( isIndexBuffer )
{
- RenderPropertyBuffer* renderPropertyBuffer = new RenderPropertyBuffer( *dataProvider, gpuBufferTarget, gpuBufferUsage );
- mIndexBuffer = renderPropertyBuffer;
+ mIndexBuffer = propertyBuffer;
}
- else if( gpuBufferTarget == GpuBuffer::ARRAY_BUFFER )
+ else
{
- RenderPropertyBuffer* renderPropertyBuffer = new RenderPropertyBuffer( *dataProvider, gpuBufferTarget, gpuBufferUsage );
- mVertexBuffers.PushBack( renderPropertyBuffer );
+ mVertexBuffers.PushBack( propertyBuffer );
mAttributesChanged = true;
}
}
-void RenderGeometry::RemovePropertyBuffer( const PropertyBufferDataProvider* dataProvider )
+void RenderGeometry::RemovePropertyBuffer( const Render::PropertyBuffer* propertyBuffer )
{
- if( dataProvider == &mIndexBuffer->GetDataProvider() )
+ if( propertyBuffer == mIndexBuffer )
{
- mIndexBuffer.Reset();
+ mIndexBuffer = 0;
}
else
{
- for( RenderPropertyBufferIter iter( mVertexBuffers.Begin() ); iter != mVertexBuffers.End(); ++iter )
+ size_t bufferCount = mVertexBuffers.Size();
+ for( size_t i(0); i<bufferCount; ++i )
{
- if( dataProvider == &(*iter)->GetDataProvider() )
+ if( propertyBuffer == mVertexBuffers[i] )
{
//This will delete the gpu buffer associated to the RenderPropertyBuffer if there is one
- mVertexBuffers.Remove( iter );
+ mVertexBuffers.Remove( mVertexBuffers.Begin()+i);
mAttributesChanged = true;
break;
}
for( size_t i(0); i< mVertexBuffers.Size(); ++i )
{
- unsigned int attributeCount = mVertexBuffers[i]->GetDataProvider().GetAttributeCount( bufferIndex );
+ unsigned int attributeCount = mVertexBuffers[i]->GetAttributeCount();
for( unsigned int j = 0; j < attributeCount; ++j )
{
- const std::string& attributeName = mVertexBuffers[i]->GetDataProvider().GetAttributeName( bufferIndex, j );
+ const std::string& attributeName = mVertexBuffers[i]->GetAttributeName( j );
unsigned int index = program.RegisterCustomAttribute( attributeName );
GLint location = program.GetCustomAttributeLocation( index );
//Update buffers
if( mIndexBuffer )
{
- mIndexBuffer->Update( context, bufferIndex );
+ if(!mIndexBuffer->Update( context, true ) )
+ {
+ //Index buffer is not ready ( Size, data or format has not been specified yet )
+ return;
+ }
}
for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
{
- mVertexBuffers[i]->Update( context, bufferIndex );
+ if( !mVertexBuffers[i]->Update( context, false ) )
+ {
+ //Vertex buffer is not ready ( Size, data or format has not been specified yet )
+ return;
+ }
}
mHasBeenUpdated = true;
}
unsigned int base = 0;
for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
{
- mVertexBuffers[i]->BindBuffer( context );
- base += mVertexBuffers[i]->EnableVertexAttributes( context, bufferIndex, attributeLocation, base );
+ mVertexBuffers[i]->BindBuffer( GpuBuffer::ARRAY_BUFFER );
+ base += mVertexBuffers[i]->EnableVertexAttributes( context, attributeLocation, base );
}
if( mIndexBuffer )
{
- mIndexBuffer->BindBuffer( context );
+ mIndexBuffer->BindBuffer( GpuBuffer::ELEMENT_ARRAY_BUFFER );
}
//Bind index buffer
unsigned int numIndices(0u);
if( mIndexBuffer )
{
- const PropertyBufferDataProvider& indexBuffer = mIndexBuffer->GetDataProvider();
- numIndices = mIndexBuffer->GetDataProvider().GetDataSize(bufferIndex) / indexBuffer.GetElementSize(bufferIndex);
+ numIndices = mIndexBuffer->GetDataSize() / mIndexBuffer->GetElementSize();
}
//Draw call
}
else
{
- const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
- unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
+ unsigned int numVertices = mVertexBuffers[0]->GetElementCount();
context.DrawArrays( GL_TRIANGLES, 0, numVertices );
}
break;
}
else
{
- const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
- unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
+ unsigned int numVertices = mVertexBuffers[0]->GetElementCount();
context.DrawArrays( GL_LINES, 0, numVertices );
}
break;
}
case Dali::Geometry::POINTS:
{
- const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
- unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
+ unsigned int numVertices = mVertexBuffers[0]->GetElementCount();
context.DrawArrays(GL_POINTS, 0, numVertices );
break;
}
}
else
{
- const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
- unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
+ unsigned int numVertices = mVertexBuffers[0]->GetElementCount();
context.DrawArrays(GL_TRIANGLE_STRIP, 0, numVertices );
}
break;
}
else
{
- const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
- unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
+ unsigned int numVertices = mVertexBuffers[0]->GetElementCount();
context.DrawArrays(GL_TRIANGLE_FAN, 0, numVertices );
}
break;
#include <dali/internal/common/buffer-index.h>
#include <dali/internal/common/owner-pointer.h>
#include <dali/internal/render/data-providers/render-data-provider.h>
-#include <dali/internal/render/renderers/render-renderer-property-buffer.h>
+#include <dali/integration-api/gl-abstraction.h>
namespace Dali
{
class Program;
class GpuBuffer;
+namespace Render
+{
+class PropertyBuffer;
+}
+
namespace SceneGraph
{
class RenderDataProvider;
class GeometryDataProvider;
-typedef OwnerPointer< RenderPropertyBuffer > RenderPropertyBufferPtr;
-typedef OwnerContainer< RenderPropertyBuffer* > RenderPropertyBufferContainer;
-typedef RenderPropertyBufferContainer::Iterator RenderPropertyBufferIter;
-
-
/**
* This class encapsulates the GPU buffers. It is used to upload vertex data
* to it's GPU buffers, to bind all the buffers and to setup/teardown vertex attribute
/**
* Adds a property buffer to the geometry
* @param[in] dataProvider The PropertyBuffer data provider
- * @param[in] gpuBufferTarget target Specifies the type of the buffer
- * @param[in] gpuBufferUsage usage Specifies how will the buffer be used
+ * @param[in] isIndexBuffer True if the property buffer is intended to be used as an index buffer
*/
- void AddPropertyBuffer( const PropertyBufferDataProvider* dataProvider, GpuBuffer::Target gpuBufferTarget, GpuBuffer::Usage gpuBufferUsage );
+ void AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer );
/**
* Removes a PropertyBuffer from the geometry
- * @param[in] dataProvider The property buffer to be removed
+ * @param[in] propertyBuffer The property buffer to be removed
*/
- void RemovePropertyBuffer( const PropertyBufferDataProvider* dataProvider );
+ void RemovePropertyBuffer( const Render::PropertyBuffer* propertyBuffer );
/**
* Gets the attribute locations on the shader for the attributes defined in the geometry RenderBuffers
const GeometryDataProvider& mGeometryDataProvider; //Reference to update thread object
// PropertyBuffers
- RenderPropertyBufferPtr mIndexBuffer;
- RenderPropertyBufferContainer mVertexBuffers;
+ Render::PropertyBuffer* mIndexBuffer;
+ Vector<Render::PropertyBuffer*> mVertexBuffers;
// Booleans
bool mHasBeenUpdated : 1;
// make sure the vertex is bound, this has to be done before
// we call VertexAttribPointer otherwise you get weird output on the display
- mVertexBuffer->Bind();
+ mVertexBuffer->Bind(GpuBuffer::ARRAY_BUFFER);
samplerLoc = program.GetUniformLocation( Program::UNIFORM_SAMPLER_RECT );
if( -1 != samplerLoc )
case GRID_NINE_PATCH_NO_CENTER:
{
const GLsizei indexCount = mIndexBuffer->GetBufferSize() / sizeof(GLushort); // compiler will optimize this to >> if possible
- mIndexBuffer->Bind();
+ mIndexBuffer->Bind(GpuBuffer::ELEMENT_ARRAY_BUFFER);
context.DrawElements( GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0 );
break;
}
// create/destroy if needed/not needed.
if ( size && !mVertexBuffer )
{
- mVertexBuffer = new GpuBuffer( context, GpuBuffer::ARRAY_BUFFER, GpuBuffer::DYNAMIC_DRAW );
+ mVertexBuffer = new GpuBuffer( context );
}
else if ( !size && mVertexBuffer )
{
// update
if ( mVertexBuffer )
{
- mVertexBuffer->UpdateDataBuffer( size, data );
+ mVertexBuffer->UpdateDataBuffer( size, data, GpuBuffer::DYNAMIC_DRAW);
}
}
// create/destroy if needed/not needed.
if ( size && !mIndexBuffer )
{
- mIndexBuffer = new GpuBuffer( context, GpuBuffer::ELEMENT_ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ mIndexBuffer = new GpuBuffer( context );
}
else if ( !size && mIndexBuffer )
{
// update
if ( mIndexBuffer )
{
- mIndexBuffer->UpdateDataBuffer(size,data);
+ mIndexBuffer->UpdateDataBuffer(size,data,GpuBuffer::STATIC_DRAW);
}
}
#include <dali/internal/event/common/property-input-impl.h>
#include <dali/internal/update/common/uniform-map.h>
#include <dali/internal/render/data-providers/render-data-provider.h>
+#include <dali/internal/render/gl-resources/context.h>
#include <dali/internal/render/gl-resources/texture.h>
#include <dali/internal/render/gl-resources/texture-cache.h>
#include <dali/internal/render/renderers/render-sampler.h>
#include <dali/internal/render/renderers/render-geometry.h>
#include <dali/internal/update/manager/prepare-render-instructions.h>
+
namespace Dali
{
namespace Internal
{
+class Context;
class PropertyInputImpl;
namespace Render
--- /dev/null
+
+#include <dali/internal/render/renderers/render-property-buffer.h>
+#include <dali/internal/event/common/property-buffer-impl.h> // Dali::Internal::PropertyBuffer
+
+namespace
+{
+
+using namespace Dali;
+using Dali::Property;
+using Dali::Internal::PropertyImplementationType;
+
+Dali::GLenum GetPropertyImplementationGlType( Property::Type& propertyType )
+{
+ Dali::GLenum type = GL_BYTE;
+
+ switch( propertyType )
+ {
+ case Property::NONE:
+ case Property::STRING:
+ case Property::ARRAY:
+ case Property::MAP:
+ case Property::RECTANGLE:
+ case Property::ROTATION:
+ {
+ // types not supported by gl
+ break;
+ }
+ case Property::BOOLEAN:
+ {
+ type = GL_BYTE;
+ break;
+ }
+ case Property::INTEGER:
+ {
+ type = GL_SHORT;
+ break;
+ }
+ case Property::FLOAT:
+ case Property::VECTOR2:
+ case Property::VECTOR3:
+ case Property::VECTOR4:
+ case Property::MATRIX3:
+ case Property::MATRIX:
+ {
+ type = GL_FLOAT;
+ break;
+ }
+ }
+
+ return type;
+}
+
+size_t GetPropertyImplementationGlSize( Property::Type& propertyType )
+{
+ size_t size = 1u;
+
+ switch( propertyType )
+ {
+ case Property::NONE:
+ case Property::STRING:
+ case Property::ARRAY:
+ case Property::MAP:
+ case Property::RECTANGLE:
+ case Property::ROTATION:
+ {
+ // types not supported by gl
+ break;
+ }
+ case Property::BOOLEAN:
+ {
+ size = 1u;
+ break;
+ }
+ case Property::INTEGER:
+ {
+ size = 2u;
+ break;
+ }
+ case Property::FLOAT:
+ case Property::VECTOR2:
+ case Property::VECTOR3:
+ case Property::VECTOR4:
+ case Property::MATRIX3:
+ case Property::MATRIX:
+ {
+ size = 4u;
+ break;
+ }
+ }
+
+ return size;
+}
+} //Unnamed namespace
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Render
+{
+
+PropertyBuffer::PropertyBuffer()
+:mFormat(NULL),
+ mData(NULL),
+ mGpuBuffer(NULL),
+ mSize(0),
+ mDataChanged(true)
+{
+}
+
+PropertyBuffer::~PropertyBuffer()
+{
+}
+
+void PropertyBuffer::SetFormat( PropertyBuffer::Format* format )
+{
+ mFormat = format;
+ mDataChanged = true;
+}
+
+void PropertyBuffer::SetData( Dali::Vector<char>* data )
+{
+ mData = data;
+ mDataChanged = true;
+}
+
+void PropertyBuffer::SetSize( unsigned int size )
+{
+ mSize = size;
+ mDataChanged = true;
+}
+
+
+bool PropertyBuffer::Update( Context& context, bool isIndexBuffer )
+{
+ if( !mData || !mFormat || !mSize )
+ {
+ return false;
+ }
+
+ if( !mGpuBuffer || mDataChanged )
+ {
+ if ( ! mGpuBuffer )
+ {
+ mGpuBuffer = new GpuBuffer( context );
+ }
+
+ // Update the GpuBuffer
+ if ( mGpuBuffer )
+ {
+ DALI_ASSERT_DEBUG( mSize && "No data in the property buffer!" );
+
+ const void *data = &((*mData)[0]);
+
+ // Index buffer needs to be unsigned short which is not supported by the property system
+ Vector<unsigned short> ushortData;
+ if( isIndexBuffer )
+ {
+ ushortData.Resize(mSize);
+ const unsigned int* unsignedData = static_cast<const unsigned int*>(data);
+ for( unsigned int i = 0; i < mSize; ++i )
+ {
+ ushortData[i] = unsignedData[i];
+ }
+ data = &(ushortData[0]);
+ }
+
+ mGpuBuffer->UpdateDataBuffer( GetDataSize(), data, GpuBuffer::STATIC_DRAW );
+ }
+
+ mDataChanged = false;
+ }
+
+ return true;
+}
+
+void PropertyBuffer::BindBuffer(GpuBuffer::Target target)
+{
+ if(mGpuBuffer)
+ {
+ mGpuBuffer->Bind(target);
+ }
+}
+
+unsigned int PropertyBuffer::EnableVertexAttributes( Context& context, Vector<GLint>& vAttributeLocation, unsigned int locationBase )
+{
+
+ unsigned int attributeCount = mFormat->components.size();
+
+ GLsizei elementSize = mFormat->size;
+
+ for( unsigned int i = 0; i < attributeCount; ++i )
+ {
+ GLint attributeLocation = vAttributeLocation[i+locationBase];
+ if( attributeLocation != -1 )
+ {
+ context.EnableVertexAttributeArray( attributeLocation );
+
+ GLint attributeSize = mFormat->components[i].size;
+ size_t attributeOffset = mFormat->components[i].offset;
+ Property::Type attributeType = mFormat->components[i].type;
+
+ context.VertexAttribPointer( attributeLocation,
+ attributeSize / GetPropertyImplementationGlSize(attributeType),
+ GetPropertyImplementationGlType(attributeType),
+ GL_FALSE, // Not normalized
+ elementSize,
+ (void*)attributeOffset );
+ }
+ }
+
+ return attributeCount;
+
+}
+
+} //Render
+} //Internal
+} //Dali
--- /dev/null
+#ifndef DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
+#define DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
+
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <dali/internal/common/owner-pointer.h>
+#include <dali/public-api/actors/sampling.h>
+#include <dali/devel-api/rendering/sampler.h>
+#include <dali/internal/render/renderers/render-sampler.h>
+#include <dali/internal/render/gl-resources/gpu-buffer.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Render
+{
+
+class PropertyBuffer
+{
+public:
+
+ struct Component
+ {
+ std::string name;
+ unsigned int offset;
+ unsigned int size;
+ Property::Type type;
+ };
+
+ /**
+ * Structure that holds the meta-data of the format of PropertyBuffer.
+ */
+ struct Format
+ {
+ std::vector<Component> components;
+ unsigned int size;
+ };
+
+ /**
+ * @brief Default constructor
+ */
+ PropertyBuffer();
+
+ /**
+ * @brief Destructor
+ */
+ ~PropertyBuffer();
+
+ /**
+ * @brief Set the format of the buffer
+ *
+ * This function takes ownership of the pointer
+ *
+ * @param[in] format The format for the PropertyBuffer
+ */
+ void SetFormat( PropertyBuffer::Format* format );
+
+ /**
+ * @brief Set the data of the PropertyBuffer
+ *
+ * This function takes ownership of the pointer
+ * @param[in] data The new data of the PropertyBuffer
+ */
+ void SetData( Dali::Vector<char>* data );
+
+ /**
+ * @brief Set the number of elements
+ * @param[in] size The number of elements
+ */
+ void SetSize( unsigned int size );
+
+ /**
+ * @brief Bind the property buffer
+ * @param[in] target The binding point
+ */
+ void BindBuffer(GpuBuffer::Target target);
+
+ /**
+ * Perform the upload of the buffer only when requiered
+ * @param[in] context The GL context
+ * @param[in] isIndexBuffer True if the buffer is used as an index buffer
+ */
+ bool Update( Context& context, bool isIndexBuffer );
+
+ /**
+ * Enable the vertex attributes for each vertex buffer from the corresponding
+ * shader program.
+ * @param[in] context The GL context
+ * @param[in] vAttributeLocation Vector containing attributes location for current program
+ * @param[in] locationBase Index in vAttributeLocation corresponding to the first attribute defined by this buffer
+ */
+ unsigned int EnableVertexAttributes( Context& context, Vector<GLint>& vAttributeLocation, unsigned int locationBase );
+
+ /**
+ * Get the number of attributes present in the buffer
+ * @return The number of attributes stored in this buffer
+ */
+ inline unsigned int GetAttributeCount() const
+ {
+ DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
+ return mFormat->components.size();
+ }
+
+ /**
+ * Retrieve the i-essim attribute name
+ * @param[in] index The index of the attribute
+ * @return The name of the attribute
+ */
+ inline const std::string& GetAttributeName(unsigned int index ) const
+ {
+ DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
+ return mFormat->components[index].name;
+ }
+
+ /**
+ * Retrieve the size of the buffer in bytes
+ * @return The total size of the buffer
+ */
+ inline std::size_t GetDataSize() const
+ {
+ DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
+ return mFormat->size * mSize;
+ }
+
+ /**
+ * Retrieve the size of one element of the buffer
+ * @return The size of one element
+ */
+ inline std::size_t GetElementSize() const
+ {
+ DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
+ return mFormat->size;
+ }
+
+ /**
+ * Retrieve the number of elements in the buffer
+ * @return The total number of elements
+ */
+ inline unsigned int GetElementCount() const
+ {
+ return mSize;
+ }
+
+private:
+ OwnerPointer< PropertyBuffer::Format > mFormat; ///< Format of the buffer
+ OwnerPointer< Dali::Vector< char > > mData; ///< Data
+ OwnerPointer<GpuBuffer> mGpuBuffer; ///< Pointer to the GpuBuffer associated with this RenderPropertyBuffer
+
+ size_t mSize; ///< Number of Elements in the buffer
+ bool mDataChanged; ///< Flag to know if data has changed in a frame
+
+};
+
+} // namespace Render
+
+
+
+} // namespace Internal
+} // namespace Dali
+
+
+#endif // DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// CLASS HEADERS
-#include <dali/internal/render/renderers/render-renderer-property-buffer.h>
-
-// INTERNAL INCLUDES
-#include <dali/internal/event/common/property-buffer-impl.h> // Dali::Internal::PropertyBuffer
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
-#include <dali/internal/render/shaders/program.h>
-
-namespace
-{
-
-using namespace Dali;
-using Dali::Property;
-using Dali::Internal::PropertyImplementationType;
-
-Dali::GLenum GetPropertyImplementationGlType( Property::Type& propertyType )
-{
- Dali::GLenum type = GL_BYTE;
-
- switch( propertyType )
- {
- case Property::NONE:
- case Property::STRING:
- case Property::ARRAY:
- case Property::MAP:
- case Property::RECTANGLE:
- case Property::ROTATION:
- {
- // types not supported by gl
- break;
- }
- case Property::BOOLEAN:
- {
- type = GL_BYTE;
- break;
- }
- case Property::INTEGER:
- {
- type = GL_SHORT;
- break;
- }
- case Property::FLOAT:
- case Property::VECTOR2:
- case Property::VECTOR3:
- case Property::VECTOR4:
- case Property::MATRIX3:
- case Property::MATRIX:
- {
- type = GL_FLOAT;
- break;
- }
- }
-
- return type;
-}
-
-size_t GetPropertyImplementationGlSize( Property::Type& propertyType )
-{
- size_t size = 1u;
-
- switch( propertyType )
- {
- case Property::NONE:
- case Property::STRING:
- case Property::ARRAY:
- case Property::MAP:
- case Property::RECTANGLE:
- case Property::ROTATION:
- {
- // types not supported by gl
- break;
- }
- case Property::BOOLEAN:
- {
- size = 1u;
- break;
- }
- case Property::INTEGER:
- {
- size = 2u;
- break;
- }
- case Property::FLOAT:
- case Property::VECTOR2:
- case Property::VECTOR3:
- case Property::VECTOR4:
- case Property::MATRIX3:
- case Property::MATRIX:
- {
- size = 4u;
- break;
- }
- }
-
- return size;
-}
-
-void UploadAttribute( Dali::Internal::Context& context,
- Dali::GLint attributeLocation,
- Dali::GLint attributeSize,
- size_t attributeOffset,
- Dali::Property::Type attributeType,
- Dali::GLsizei elementSize )
-{
- // TODO: MESH_REWORK Matrices need multiple calls to this function
- context.VertexAttribPointer( attributeLocation,
- attributeSize / GetPropertyImplementationGlSize(attributeType),
- GetPropertyImplementationGlType(attributeType),
- GL_FALSE, // Not normalized
- elementSize,
- (void*)attributeOffset );
-}
-
-} // unnamed namespace
-
-namespace Dali
-{
-namespace Internal
-{
-namespace SceneGraph
-{
-
-RenderPropertyBuffer::RenderPropertyBuffer( const PropertyBufferDataProvider& propertyBufferDataProvider,
- GpuBuffer::Target gpuBufferTarget,
- GpuBuffer::Usage gpuBufferUsage )
-: mDataProvider( propertyBufferDataProvider ),
- mGpuBuffer( NULL ),
- mGpuBufferTarget( gpuBufferTarget ),
- mGpuBufferUsage( gpuBufferUsage )
-{
-}
-
-RenderPropertyBuffer::~RenderPropertyBuffer()
-{
-}
-
-void RenderPropertyBuffer::Update( Context& context, BufferIndex bufferIndex )
-{
- if( !mGpuBuffer || mDataProvider.HasDataChanged( bufferIndex ) )
- {
- if ( ! mGpuBuffer )
- {
- mGpuBuffer = new GpuBuffer( context, mGpuBufferTarget, mGpuBufferUsage );
- }
-
- // Update the GpuBuffer
- if ( mGpuBuffer )
- {
- std::size_t dataSize = mDataProvider.GetDataSize( bufferIndex );
- DALI_ASSERT_DEBUG( dataSize && "No data in the property buffer!" );
-
- const void *data = &(mDataProvider.GetData( bufferIndex )[0]);
- Vector<unsigned short> ushortData;
-
- // Index buffer needs to be unsigned short which is not supported by the property system
- if( mGpuBufferTarget == GpuBuffer::ELEMENT_ARRAY_BUFFER )
- {
- ushortData.Resize( dataSize );
- const unsigned int* unsignedData = static_cast<const unsigned int*>(data);
- unsigned int numberOfElements = dataSize / sizeof(unsigned int);
- for( unsigned int i = 0; i < numberOfElements; ++i )
- {
- ushortData[i] = unsignedData[i];
- }
- data = &(ushortData[0]);
- }
-
- mGpuBuffer->UpdateDataBuffer( dataSize, data );
- mGpuBuffer->SetStride( mDataProvider.GetElementSize( bufferIndex ) );
- }
- }
-}
-
-void RenderPropertyBuffer::BindBuffer( Context& context )
-{
- mGpuBuffer->Bind();
-}
-
-unsigned int RenderPropertyBuffer::EnableVertexAttributes( Context& context, BufferIndex bufferIndex, Vector<GLint>& vAttributeLocation, unsigned int locationBase )
-{
- unsigned int attributeCount = mDataProvider.GetAttributeCount( bufferIndex );
-
- GLsizei elementSize = mDataProvider.GetElementSize( bufferIndex );
-
- for( unsigned int i = 0; i < attributeCount; ++i )
- {
- GLint attributeLocation = vAttributeLocation[i+locationBase];
- if( attributeLocation != -1 )
- {
- context.EnableVertexAttributeArray( attributeLocation );
-
- GLint attributeSize = mDataProvider.GetAttributeSize( bufferIndex, i );
- size_t attributeOffset = mDataProvider.GetAttributeOffset( bufferIndex, i );
- Property::Type attributeType = mDataProvider.GetAttributeType( bufferIndex, i );
-
- UploadAttribute( context,
- attributeLocation,
- attributeSize,
- attributeOffset,
- attributeType,
- elementSize );
- }
- }
-
- return attributeCount;
-}
-
-void RenderPropertyBuffer::UpdateAttributeLocations( Context& context, BufferIndex bufferIndex, Program& program )
-{
- unsigned int attributeCount = mDataProvider.GetAttributeCount( bufferIndex );
- mAttributesLocation.Resize( attributeCount );
-
- for( unsigned int i = 0; i < attributeCount; ++i )
- {
- const std::string& attributeName = mDataProvider.GetAttributeName( bufferIndex, i );
- unsigned int index = program.RegisterCustomAttribute( attributeName );
- GLint attributeLocation = program.GetCustomAttributeLocation( index );
-
- if( -1 == attributeLocation )
- {
- DALI_LOG_WARNING( "Attribute not found in the shader: %s\n", attributeName.c_str() );
- }
- mAttributesLocation[i] = attributeLocation;
- }
-}
-
-} // namespace SceneGraph
-} // namespace Internal
-} // namespace Dali
+++ /dev/null
-#ifndef DALI_INTERNAL_SCENE_GRAPH_RENDER_RENDERER_PROPERTY_BUFFER_H
-#define DALI_INTERNAL_SCENE_GRAPH_RENDER_RENDERER_PROPERTY_BUFFER_H
-
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dali/devel-api/common/owner-container.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/common/owner-pointer.h>
-#include <dali/internal/render/data-providers/property-buffer-data-provider.h>
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
-
-namespace Dali
-{
-namespace Internal
-{
-class Context;
-class Program;
-
-namespace Render
-{
-class NewRenderer;
-}
-
-namespace SceneGraph
-{
-
-/**
- * This class encapsulates the GPU buffers. It is used to upload vertex data
- * to it's GPU buffers, to bind all the buffers and to setup/teardown vertex attribute
- * bindings
- */
-class RenderPropertyBuffer
-{
-public:
- typedef OwnerContainer< GpuBuffer* > GpuBuffers;
-
- /**
- * Constructor. Creates a render geometry object with no GPU buffers.
- * @param[in] propertyBufferDataProvider The property-buffer data provider (to fetch geometry from)
- * @param[in] gpuBufferTarget Type of target for the gpu-buffer
- * @param[in] gpuBufferUsage Type of target for the gpu-buffer
- */
- RenderPropertyBuffer( const PropertyBufferDataProvider& propertyBufferDataProvider,
- GpuBuffer::Target gpuBufferTarget,
- GpuBuffer::Usage gpuBufferUsage );
-
- /**
- * Destructor
- */
- ~RenderPropertyBuffer();
-
- /**
- * Perform the upload of the buffer only when requiered
- * @param[in] context The GL context
- * @param[in] bufferIndex The current buffer index
- */
- void Update( Context& context, BufferIndex bufferIndex );
-
- /**
- * Bind the geometry buffers
- * @param[in] context The GL context
- */
- void BindBuffer( Context& context );
-
- /**
- * Enable the vertex attributes for each vertex buffer from the corresponding
- * shader program.
- * @param[in] context The GL context
- * @param[in] bufferIndex The current buffer index
- * @param[in] program The shader program to query for attribute locations
- * @param[in] vAttributeLocation Vector containing attributes location for current program
- * @param[in] locationBase Index in vAttributeLocation corresponding to the first attribute defined by this buffer
- */
- unsigned int EnableVertexAttributes( Context& context, BufferIndex bufferIndex, Vector<GLint>& vAttributeLocation, unsigned int locationBase);
-
- /**
- * Get the data provider for the buffer
- */
- const PropertyBufferDataProvider& GetDataProvider() const
- {
- return mDataProvider;
- }
-
-private: // implementation
-
- /**
- * Update attribute locations
- * @param[in] context The GL context
- * @param[in] bufferIndex The current buffer index
- * @param[in] program The shader program to query for attribute locations
- */
- void UpdateAttributeLocations( Context& context, BufferIndex bufferIndex, Program& program );
-
-private:
- const PropertyBufferDataProvider& mDataProvider; ///< Data provider used by this property buffer
- Vector<GLint> mAttributesLocation; ///< Location of the attributes for the property buffer in this renderer.
-
- OwnerPointer<GpuBuffer> mGpuBuffer; ///< Pointer to the GpuBuffer associated with this RenderPropertyBuffer
- GpuBuffer::Target mGpuBufferTarget; ///< The type of GPU buffer to create
- GpuBuffer::Usage mGpuBufferUsage; ///< The type of usage the GPU buffer will have
-};
-
-} // namespace SceneGraph
-} // namespace Internal
-} // namespace Dali
-
-#endif // DALI_INTERNAL_SCENE_GRAPH_RENDER_RENDERER_PROPERTY_BUFFER_H
}
}
-void DiscardQueue::Add( BufferIndex updateBufferIndex, PropertyBuffer* propertyBuffer )
-{
- DALI_ASSERT_DEBUG( NULL != propertyBuffer );
-
- if ( 0u == updateBufferIndex )
- {
- mPropertyBufferQueue0.PushBack( propertyBuffer );
- }
- else
- {
- mPropertyBufferQueue1.PushBack( propertyBuffer );
- }
-}
-
void DiscardQueue::Clear( BufferIndex updateBufferIndex )
{
// Destroy some discarded objects; these should no longer own any GL resources
mShaderQueue0.Clear();
mGeometryQueue0.Clear();
mMaterialQueue0.Clear();
- mPropertyBufferQueue0.Clear();
mRendererQueue0.Clear();
}
else
mShaderQueue1.Clear();
mGeometryQueue1.Clear();
mMaterialQueue1.Clear();
- mPropertyBufferQueue1.Clear();
mRendererQueue1.Clear();
}
}
#include <dali/internal/common/buffer-index.h>
#include <dali/internal/update/nodes/node-declarations.h>
#include <dali/internal/update/node-attachments/node-attachment-declarations.h>
-#include <dali/internal/update/common/scene-graph-property-buffer.h>
#include <dali/internal/update/rendering/scene-graph-geometry.h>
#include <dali/internal/update/rendering/scene-graph-material.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h>
typedef OwnerContainer< Shader* > ShaderQueue;
typedef OwnerContainer< Geometry* > GeometryQueue;
typedef OwnerContainer< Material* > MaterialQueue;
- typedef OwnerContainer< PropertyBuffer* > PropertyBufferQueue;
typedef OwnerContainer< Renderer* > RendererQueue;
/**
* Adds an unwanted material to the discard queue.
* A message will be sent to clean up GL resources in the next Render.
*/
- void Add( BufferIndex updateBufferIndex, PropertyBuffer* material );
-
- /**
- * Adds an unwanted material to the discard queue.
- * A message will be sent to clean up GL resources in the next Render.
- */
void Add( BufferIndex updateBufferIndex, Material* material );
/**
ShaderQueue mShaderQueue0;
GeometryQueue mGeometryQueue0;
MaterialQueue mMaterialQueue0;
- PropertyBufferQueue mPropertyBufferQueue0;
RendererQueue mRendererQueue0;
// Messages are queued here when the update buffer index == 1
ShaderQueue mShaderQueue1;
GeometryQueue mGeometryQueue1;
MaterialQueue mMaterialQueue1;
- PropertyBufferQueue mPropertyBufferQueue1;
RendererQueue mRendererQueue1;
};
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dali/internal/update/common/scene-graph-property-buffer.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace SceneGraph
-{
-
-PropertyBuffer::PropertyBuffer()
-: mBufferData(NULL),
- mDataChanged(false),
- mSize(0u)
-{
-}
-
-PropertyBuffer::~PropertyBuffer()
-{
-}
-
-void PropertyBuffer::SetFormat( PropertyBufferMetadata::Format* format )
-{
- mFormat = format;
-}
-
-void PropertyBuffer::SetSize( BufferIndex bufferIndex, unsigned int size )
-{
- mSize.Set(bufferIndex, size);
-}
-
-void PropertyBuffer::SetData( BufferIndex bufferIndex, PropertyBufferDataProvider::BufferType* data )
-{
- mBufferData[bufferIndex] = data;
- mDataChanged[bufferIndex] = true;
-}
-
-void PropertyBuffer::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
-{
-}
-
-void PropertyBuffer::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
-{
-}
-
-bool PropertyBuffer::HasDataChanged( BufferIndex bufferIndex ) const
-{
- return mDataChanged[ bufferIndex ];
-}
-
-unsigned int PropertyBuffer::GetAttributeCount( BufferIndex bufferIndex ) const
-{
- DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
- return mFormat->components.size();
-}
-
-const std::string& PropertyBuffer::GetAttributeName( BufferIndex bufferIndex, unsigned int index ) const
-{
- DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
- return mFormat->components[index].name;
-}
-
-size_t PropertyBuffer::GetAttributeSize( BufferIndex bufferIndex, unsigned int index ) const
-{
- DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
-
- return mFormat->components[index].size;
-}
-
-Property::Type PropertyBuffer::GetAttributeType( BufferIndex bufferIndex, unsigned int index ) const
-{
- DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
-
- return mFormat->components[index].type;
-}
-
-size_t PropertyBuffer::GetAttributeOffset( BufferIndex bufferIndex, unsigned int index ) const
-{
- DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
-
- return mFormat->components[index].offset;
-}
-
-const PropertyBufferDataProvider::BufferType& PropertyBuffer::GetData( BufferIndex bufferIndex ) const
-{
- DALI_ASSERT_DEBUG( mBufferData[bufferIndex] && "Should have some data.");
-
- return *mBufferData[bufferIndex];
-}
-
-std::size_t PropertyBuffer::GetDataSize( BufferIndex bufferIndex ) const
-{
- DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
-
- return mFormat->size * mSize[ bufferIndex ];
-}
-
-
-std::size_t PropertyBuffer::GetElementSize( BufferIndex bufferIndex ) const
-{
- return mFormat->size;
-}
-
-unsigned int PropertyBuffer::GetElementCount( BufferIndex bufferIndex ) const
-{
- return mSize[bufferIndex];
-}
-
-unsigned int PropertyBuffer::GetGpuBufferId( BufferIndex bufferIndex ) const
-{
- //TODO: MESH_REWORK fix this
- DALI_ASSERT_DEBUG(false && "FIX THIS");
-
- return 0;
-}
-
-void PropertyBuffer::ResetDefaultProperties( BufferIndex updateBufferIndex )
-{
- // Age the double buffered properties
- mSize.CopyPrevious(updateBufferIndex);
-
- // Update double buffered value
- mBufferData.CopyPrevious(updateBufferIndex);
-
- // The flag should be reset each frame
- mDataChanged[updateBufferIndex] = false;
-}
-
-} // namespace SceneGraph
-} // namespace Internal
-} // namespace Dali
+++ /dev/null
-#ifndef DALI_INTERNAL_SCENE_GRAPH_PROPERTY_BUFFER_H
-#define DALI_INTERNAL_SCENE_GRAPH_PROPERTY_BUFFER_H
-
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dali/internal/common/buffer-index.h>
-#include <dali/internal/event/common/event-thread-services.h>
-#include <dali/internal/update/common/double-buffered-property.h>
-#include <dali/internal/update/common/property-owner.h>
-#include <dali/internal/render/data-providers/property-buffer-data-provider.h>
-
-namespace Dali
-{
-namespace Internal
-{
-namespace SceneGraph
-{
-class SceneController;
-
-namespace PropertyBufferMetadata
-{
-/**
- * Structure that holds name and size of a component in the PropertyBuffer.
- */
-struct Component
-{
- std::string name;
- unsigned int offset;
- unsigned int size;
- Property::Type type;
-};
-
-/**
- * Structure that holds the meta-data of the format of PropertyBuffer.
- */
-struct Format
-{
- std::vector<Component> components;
- unsigned int size;
-};
-
-} // PropertyBufferMetadata
-
-class PropertyBuffer : public PropertyOwner, public PropertyBufferDataProvider
-{
-public:
-
- /**
- * Constructor
- */
- PropertyBuffer();
-
- /**
- * Destructor
- */
- virtual ~PropertyBuffer();
-
- /**
- * @brief Set the format of the buffer
- *
- * This function takes ownership of the pointer
- *
- * @param[in] format The format for the PropertyBuffer
- */
- void SetFormat( PropertyBufferMetadata::Format* format );
-
- /**
- * @brief Set the data of the PropertyBuffer
- *
- * This function takes ownership of the pointer
- *
- * @param[in] bufferIndex Index for double buffered values
- * @param[in] data The new data of the PropertyBuffer
- */
- void SetData( BufferIndex bufferIndex, PropertyBufferDataProvider::BufferType* data );
-
- /**
- * @brief Set the number of elements
- *
- * @param[in] bufferIndex Index for double buffered values
- * @param[in] size The number of elements
- */
- void SetSize( BufferIndex bufferIndex, unsigned int size );
-
- /**
- * @brief Connect the object to the scene graph
- *
- * @param[in] sceneController The scene controller - used for sending messages to render thread
- * @param[in] bufferIndex The current buffer index - used for sending messages to render thread
- */
- void ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
-
- /**
- * @brief Disconnect the object from the scene graph
- */
- void DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
-
-public: // PropertyBufferDataProvider
-
- /**
- * @copydoc PropertyBufferDataProvider::HasDataChanged( BufferIndex bufferIndex )
- */
- virtual bool HasDataChanged( BufferIndex bufferIndex ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::HasDataChanged( BufferIndex bufferIndex )
- */
- virtual unsigned int GetAttributeCount( BufferIndex bufferIndex ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetAttributeName( BufferIndex bufferIndex, unsigned int index )
- */
- virtual const std::string& GetAttributeName( BufferIndex bufferIndex, unsigned int index ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetAttributeSize( BufferIndex bufferIndex, unsigned int index )
- */
- virtual size_t GetAttributeSize( BufferIndex bufferIndex, unsigned int index ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetAttributeType( BufferIndex bufferIndex, unsigned int index )
- */
- virtual Property::Type GetAttributeType( BufferIndex bufferIndex, unsigned int index ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetAttributeOffset( BufferIndex bufferIndex, unsigned int index )
- */
- virtual size_t GetAttributeOffset( BufferIndex bufferIndex, unsigned int index ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetData( BufferIndex bufferIndex )
- */
- virtual const PropertyBufferDataProvider::BufferType& GetData( BufferIndex bufferIndex ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetDataSize( BufferIndex bufferIndex )
- */
- virtual size_t GetDataSize( BufferIndex bufferIndex ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetElementSize( BufferIndex bufferIndex )
- */
- virtual size_t GetElementSize( BufferIndex bufferIndex ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetElementCount( BufferIndex bufferIndex )
- */
- virtual unsigned int GetElementCount( BufferIndex bufferIndex ) const;
-
- /**
- * @copydoc PropertyBufferDataProvider::GetGpuBufferId
- */
- virtual unsigned int GetGpuBufferId( BufferIndex bufferIndex ) const;
-
-protected: // From PropertyOwner
- /**
- * @copydoc Dali::Internal::SceneGraph::PropertyOwner::ResetDefaultProperties()
- */
- virtual void ResetDefaultProperties( BufferIndex updateBufferIndex );
-
-private:
- OwnerPointer<PropertyBufferMetadata::Format> mFormat; ///< Format of the buffer
-
- DoubleBuffered< OwnerPointer<PropertyBufferDataProvider::BufferType> > mBufferData; ///< Data
- DoubleBuffered< bool > mDataChanged; ///< Flag to know if data has changed in a frame
-
- DoubleBufferedProperty<int> mSize; ///< Number of Elements in the buffer
-};
-
-inline void SetFormatMessage( EventThreadServices& eventThreadServices,
- const PropertyBuffer& propertyBuffer,
- PropertyBufferMetadata::Format* format )
-{
- typedef MessageValue1< PropertyBuffer, OwnerPointer<PropertyBufferMetadata::Format> > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &propertyBuffer, &PropertyBuffer::SetFormat, format );
-}
-
-inline void SetSizeMessage( EventThreadServices& eventThreadServices,
- const PropertyBuffer& propertyBuffer,
- unsigned int size )
-{
- typedef MessageDoubleBuffered1 < PropertyBuffer, unsigned int > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &propertyBuffer, &PropertyBuffer::SetSize, size );
-}
-
-inline void SetDataMessage( EventThreadServices& eventThreadServices,
- const PropertyBuffer& propertyBuffer,
- PropertyBuffer::BufferType* data )
-{
- typedef MessageDoubleBuffered1< PropertyBuffer, OwnerPointer<PropertyBuffer::BufferType> > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &propertyBuffer, &PropertyBuffer::SetData, data );
-}
-
-} // namespace SceneGraph
-} // namespace Internal
-} // namespace Dali
-
-#endif // DALI_INTERNAL_SCENE_GRAPH_PROPERTY_BUFFER_H
new (slot) DerivedType( &mRenderManager, &RenderManager::RemoveGeometry, &renderGeometry );
}
-void RenderMessageDispatcher::AddPropertyBuffer( RenderGeometry& renderGeometry, PropertyBufferDataProvider* propertyBuffer, GpuBuffer::Target target, GpuBuffer::Usage usage )
+void RenderMessageDispatcher::AddPropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer )
{
- typedef MessageValue4< RenderManager, RenderGeometry*, PropertyBufferDataProvider*, GpuBuffer::Target, GpuBuffer::Usage > DerivedType;
+ typedef MessageValue3< RenderManager, RenderGeometry*, Render::PropertyBuffer*, bool > DerivedType;
// Reserve some memory inside the render queue
unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
// Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &mRenderManager, &RenderManager::AddPropertyBuffer, &renderGeometry, propertyBuffer, target, usage );
+ new (slot) DerivedType( &mRenderManager, &RenderManager::AddPropertyBuffer, &renderGeometry, propertyBuffer, isIndexBuffer);
}
-void RenderMessageDispatcher::RemovePropertyBuffer( RenderGeometry& renderGeometry, PropertyBufferDataProvider* propertyBuffer )
+void RenderMessageDispatcher::RemovePropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer )
{
- typedef MessageValue2< RenderManager, RenderGeometry*, PropertyBufferDataProvider* > DerivedType;
+ typedef MessageValue2< RenderManager, RenderGeometry*, Render::PropertyBuffer* > DerivedType;
// Reserve some memory inside the render queue
unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
// INTERNAL INCLUDES
#include <dali/internal/update/common/scene-graph-buffers.h>
#include <dali/internal/render/gl-resources/gpu-buffer.h>
+#include <dali/internal/render/renderers/render-property-buffer.h>
namespace Dali
{
* Add a PropertyBuffer.
* @param[in] renderGeometry The geometry
* @param[in] propertyBuffer The PropertyBuffer
- * @param[in] target Specifies the type of the buffer
- * @param[in] usage Specifies how will the buffer be used
+ * @param[in] isIndexBuffer True if the buffer is intended to be used as an index buffer
*/
- void AddPropertyBuffer( RenderGeometry& renderGeometry, PropertyBufferDataProvider* propertyBuffer, GpuBuffer::Target target, GpuBuffer::Usage usage );
+ void AddPropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer );
/**
* Remove a PropertyBuffer.
* @param[in] propertyBuffer The PropertyBuffer
* @post PropertyBuffer will be destroyed in the next Render.
*/
- void RemovePropertyBuffer( RenderGeometry& renderGeometry, PropertyBufferDataProvider* propertyBuffer );
+ void RemovePropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer );
/**
* Add a Render tracker.
#include <dali/internal/update/animation/scene-graph-animation.h>
#include <dali/internal/update/common/discard-queue.h>
#include <dali/internal/update/common/scene-graph-buffers.h>
-#include <dali/internal/update/common/scene-graph-property-buffer.h>
#include <dali/internal/update/controllers/render-message-dispatcher.h>
#include <dali/internal/update/controllers/scene-controller-impl.h>
#include <dali/internal/update/gestures/scene-graph-pan-gesture.h>
renderers( sceneGraphBuffers, discardQueue ),
geometries( sceneGraphBuffers, discardQueue ),
materials( sceneGraphBuffers, discardQueue ),
- propertyBuffers( sceneGraphBuffers, discardQueue ),
messageQueue( renderController, sceneGraphBuffers ),
keepRenderingSeconds( 0.0f ),
animationFinishedDuringUpdate( false ),
renderers.SetSceneController( *sceneController );
geometries.SetSceneController( *sceneController );
materials.SetSceneController( *sceneController );
- propertyBuffers.SetSceneController( *sceneController );
}
~Impl()
ObjectOwnerContainer<Renderer> renderers;
ObjectOwnerContainer<Geometry> geometries; ///< A container of geometries
ObjectOwnerContainer<Material> materials; ///< A container of materials
- ObjectOwnerContainer<PropertyBuffer> propertyBuffers; ///< A container of property buffers
ShaderContainer shaders; ///< A container of owned shaders
return mImpl->materials;
}
-ObjectOwnerContainer<PropertyBuffer>& UpdateManager::GetPropertyBufferOwner()
-{
- return mImpl->propertyBuffers;
-}
-
void UpdateManager::AddShader( Shader* shader )
{
DALI_ASSERT_DEBUG( NULL != shader );
mImpl->materials.ResetToBaseValues( bufferIndex );
mImpl->geometries.ResetToBaseValues( bufferIndex );
- mImpl->propertyBuffers.ResetToBaseValues( bufferIndex );
mImpl->renderers.ResetToBaseValues( bufferIndex );
// Constrain Materials and geometries
mImpl->materials.ConstrainObjects( bufferIndex );
mImpl->geometries.ConstrainObjects( bufferIndex );
- mImpl->propertyBuffers.ConstrainObjects( bufferIndex );
mImpl->renderers.ConstrainObjects( bufferIndex );
// constrain shaders... (in construction order)
new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetWrapMode, sampler, uWrapMode, vWrapMode );
}
+void UpdateManager::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer )
+{
+ typedef MessageValue1< RenderManager, Render::PropertyBuffer* > DerivedType;
+
+ // Reserve some memory inside the render queue
+ unsigned int* 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::AddPropertyBuffer, propertyBuffer );
+}
+
+void UpdateManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer )
+{
+ typedef MessageValue1< RenderManager, Render::PropertyBuffer* > DerivedType;
+
+ // Reserve some memory inside the render queue
+ unsigned int* 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::RemovePropertyBuffer, propertyBuffer );
+}
+
+void UpdateManager::SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format )
+{
+ typedef MessageValue2< RenderManager, Render::PropertyBuffer*, Render::PropertyBuffer::Format* > DerivedType;
+
+ // Reserve some memory inside the render queue
+ unsigned int* 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::SetPropertyBufferFormat, propertyBuffer, format );
+}
+
+void UpdateManager::SetPropertyBufferData(Render::PropertyBuffer* propertyBuffer, Dali::Vector<char>* data)
+{
+ typedef MessageValue2< RenderManager, Render::PropertyBuffer*, Dali::Vector<char>* > DerivedType;
+
+ // Reserve some memory inside the render queue
+ unsigned int* 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::SetPropertyBufferData, propertyBuffer, data );
+}
+
+void UpdateManager::SetPropertyBufferSize(Render::PropertyBuffer* propertyBuffer, size_t size )
+{
+ typedef MessageValue2< RenderManager, Render::PropertyBuffer*, size_t > DerivedType;
+
+ // Reserve some memory inside the render queue
+ unsigned int* 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::SetPropertyBufferSize, propertyBuffer, size );
+}
+
} // namespace SceneGraph
} // namespace Internal
#include <dali/internal/update/nodes/scene-graph-layer.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h>
#include <dali/internal/render/shaders/scene-graph-shader.h>
+#include <dali/internal/render/renderers/render-property-buffer.h>
namespace Dali
{
*/
void SetWrapMode( Render::Sampler* sampler, unsigned int uWrapMode, unsigned int vWrapMode );
+ /**
+ * Add a new sampler to RenderManager
+ * @param[in] propertryBuffer The property buffer to add
+ * @post Sends a message to RenderManager to add the property buffer.
+ * The property buffer will be owned by RenderManager
+ */
+ void AddPropertyBuffer( Render::PropertyBuffer* propertryBuffer );
+
+ /**
+ * Removes an existing PropertyBuffer from RenderManager
+ * @param[in] propertryBuffer The property buffer to remove
+ * @post The property buffer will be destroyed in the render thread
+ */
+ void RemovePropertyBuffer( Render::PropertyBuffer* propertryBuffer );
+
+ /**
+ * Sets the format of an existing property buffer
+ * @param[in] propertyBuffer The property buffer.
+ * @param[in] format The new format of the buffer
+ * @post Sends a message to RenderManager to set the new format to the property buffer.
+ */
+ void SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format );
+
+ /**
+ * Sets the data of an existing property buffer
+ * @param[in] propertyBuffer The property buffer.
+ * @param[in] data The new data of the buffer
+ * @post Sends a message to RenderManager to set the new data to the property buffer.
+ */
+ void SetPropertyBufferData(Render::PropertyBuffer* propertyBuffer, Dali::Vector<char>* data);
+
+ /**
+ * Sets the size of an existing property buffer
+ * @param[in] propertyBuffer The property buffer.
+ * @param[in] size The new size of the buffer
+ * @post Sends a message to RenderManager to set the new size to the property buffer.
+ */
+ void SetPropertyBufferSize(Render::PropertyBuffer* propertyBuffer, size_t size );
+
public:
/**
new (slot) LocalType( &manager, &UpdateManager::SetWrapMode, &sampler, uWrapMode, vWrapMode );
}
+inline void AddPropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer )
+{
+ typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &manager, &UpdateManager::AddPropertyBuffer, &propertyBuffer );
+}
+
+inline void RemovePropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer )
+{
+ typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &manager, &UpdateManager::RemovePropertyBuffer, &propertyBuffer );
+}
+
+inline void SetPropertyBufferFormat( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Render::PropertyBuffer::Format* format )
+{
+ typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, Render::PropertyBuffer::Format* > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferFormat, &propertyBuffer, format );
+}
+
+inline void SetPropertyBufferData( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Vector<char>* data )
+{
+ typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, Vector<char>* > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferData, &propertyBuffer, data );
+}
+
+inline void SetPropertyBufferSize( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, size_t size )
+{
+ typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, size_t > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferSize, &propertyBuffer, size );
+}
+
} // namespace SceneGraph
// INTERNAL HEADERS
#include <dali/internal/update/controllers/scene-controller.h>
#include <dali/internal/render/renderers/render-geometry.h>
+#include <dali/internal/render/renderers/render-property-buffer.h>
#include <dali/internal/update/controllers/render-message-dispatcher.h>
namespace Dali
mConnectionObservers.Destroy( *this );
}
-void Geometry::AddVertexBuffer( PropertyBuffer* vertexBuffer )
+void Geometry::AddVertexBuffer( Render::PropertyBuffer* vertexBuffer )
{
mVertexBuffers.PushBack( vertexBuffer );
- CalculateExtents( vertexBuffer );
- vertexBuffer->AddUniformMapObserver(*this);
mConnectionObservers.ConnectionsChanged(*this);
if( mRenderGeometry )
{
- mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, GpuBuffer::ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, false);
}
}
-void Geometry::RemoveVertexBuffer( PropertyBuffer* vertexBuffer )
+void Geometry::RemoveVertexBuffer( Render::PropertyBuffer* vertexBuffer )
{
DALI_ASSERT_DEBUG( NULL != vertexBuffer );
// Find the object and destroy it
- Vector<PropertyBuffer*>::Iterator match = std::find(
- mVertexBuffers.Begin(),
- mVertexBuffers.End(),
- vertexBuffer );
-
- DALI_ASSERT_DEBUG( mVertexBuffers.End() != match );
- if( mVertexBuffers.End() != match )
+ size_t bufferCount(mVertexBuffers.Size());
+ for( size_t i(0); i<bufferCount; ++i )
{
- vertexBuffer->RemoveUniformMapObserver(*this);
- mVertexBuffers.Erase( match );
- mConnectionObservers.ConnectionsChanged(*this);
-
- if( mRenderGeometry )
+ if( vertexBuffer == mVertexBuffers[i] )
{
- mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer );
+ mVertexBuffers.Erase( mVertexBuffers.Begin()+i );
+ mConnectionObservers.ConnectionsChanged(*this);
+
+ if( mRenderGeometry )
+ {
+ mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer );
+ }
}
}
}
-void Geometry::SetIndexBuffer( PropertyBuffer* indexBuffer )
+void Geometry::SetIndexBuffer( Render::PropertyBuffer* indexBuffer )
{
if( mIndexBuffer != indexBuffer )
{
mIndexBuffer = indexBuffer;
- indexBuffer->AddUniformMapObserver(*this);
mConnectionObservers.ConnectionsChanged(*this);
if( mRenderGeometry )
{
- mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, GpuBuffer::ELEMENT_ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, true );
}
}
}
{
if( mIndexBuffer )
{
- mIndexBuffer->RemoveUniformMapObserver(*this);
-
if( mRenderGeometry )
{
mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, mIndexBuffer );
mGeometryType.Set( bufferIndex, geometryType);
}
-Vector<PropertyBuffer*>& Geometry::GetVertexBuffers()
+Vector<Render::PropertyBuffer*>& Geometry::GetVertexBuffers()
{
return mVertexBuffers;
}
-PropertyBuffer* Geometry::GetIndexBuffer()
+Render::PropertyBuffer* Geometry::GetIndexBuffer()
{
return mIndexBuffer;
}
mRequiresDepthTest.CopyPrevious(updateBufferIndex);
}
-void Geometry::CalculateExtents( PropertyBuffer* vertexBuffer )
-{
- unsigned int elementIndex = 0;
- unsigned int elementCount = vertexBuffer->GetElementCount( 0 );
- unsigned int elementCount1 = vertexBuffer->GetElementCount( 1 );
-
- // Select the double buffered element list that is the largest...
- if ( elementCount < elementCount1 )
- {
- elementCount = elementCount1;
- elementIndex = 1;
- }
-
- unsigned int attributeCount = vertexBuffer->GetAttributeCount( elementIndex );
- unsigned int elementSize = vertexBuffer->GetElementSize( elementIndex );
-
- std::string posName( "aPos" );
- std::size_t found;
-
- float left = 0.0f;
- float right = 0.0f;
- float top = 0.0f;
- float bottom = 0.0f;
-
- // Find the position attribute index
- for ( unsigned int i = 0; i < attributeCount; ++i )
- {
- found = vertexBuffer->GetAttributeName( 0, i ).find( posName );
- if ( found != std::string::npos )
- {
- unsigned int offset = vertexBuffer->GetAttributeOffset( elementIndex, i );
- const PropertyBufferDataProvider::BufferType& data = vertexBuffer->GetData( elementIndex );
-
- // Check attribute type to determine correct position type
- Property::Type positionType = vertexBuffer->GetAttributeType( elementIndex, i );
- Vector3 halfExtents;
- Vector3 center;
- switch ( positionType )
- {
- case Property::VECTOR2:
- {
- for ( unsigned int j = 0; j < elementCount; ++j )
- {
- const Vector2* position = reinterpret_cast< const Vector2* >( &data[ offset ] );
- offset += elementSize;
-
- if ( position->x < left )
- {
- left = position->x;
- }
- if ( position->x > right )
- {
- right = position->x;
- }
- if ( position->y < top )
- {
- top = position->y;
- }
- if ( position->y > bottom )
- {
- bottom = position->y;
- }
- }
-
- halfExtents = Vector3( ( right - left ) * 0.5f, ( bottom - top ) * 0.5f, 0.0f );
- center = Vector3( halfExtents.x + left , halfExtents.y + top, 0.0f );
- break;
- }
- case Property::VECTOR3:
- {
- float near = 0.0f;
- float far = 0.0f;
- for ( unsigned int j = 0; j < elementCount; ++j )
- {
- const Vector3* position = reinterpret_cast< const Vector3* >( &data[ offset ] );
- offset += elementSize;
-
- if ( position->x < left )
- {
- left = position->x;
- }
- if ( position->x > right )
- {
- right = position->x;
- }
- if ( position->y < top )
- {
- top = position->y;
- }
- if ( position->y > bottom )
- {
- bottom = position->y;
- }
- if ( position->z > far )
- {
- far = position->z;
- }
- if ( position->z < near )
- {
- near = position->z;
- }
- }
- halfExtents = Vector3( ( right - left ) * 0.5f, ( bottom - top ) * 0.5f, ( far - near ) * 0.5f );
- center = Vector3( halfExtents.x + left , halfExtents.y + top, halfExtents.z + near );
- break;
- }
- default:
- {
- break;
- }
- }
- mCenter.Bake( 0, center );
- mCenter.Bake( 1, center );
- }
- }
-}
-
void Geometry::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
{
}
RenderGeometry* Geometry::GetRenderGeometry(SceneController* sceneController)
{
- if(!mRenderGeometry)
+ if(!mRenderGeometry )
{
//Create RenderGeometry
mSceneController = sceneController;
size_t vertexBufferCount( mVertexBuffers.Size() );
for( size_t i(0); i<vertexBufferCount; ++i )
{
- mRenderGeometry->AddPropertyBuffer( mVertexBuffers[i], GpuBuffer::ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ mRenderGeometry->AddPropertyBuffer( mVertexBuffers[i], false );
}
if( mIndexBuffer )
{
- mRenderGeometry->AddPropertyBuffer( mIndexBuffer, GpuBuffer::ELEMENT_ARRAY_BUFFER, GpuBuffer::STATIC_DRAW );
+ mRenderGeometry->AddPropertyBuffer( mIndexBuffer, true );
}
//Transfer ownership to RenderManager
#include <dali/internal/update/common/property-boolean.h>
#include <dali/internal/update/common/uniform-map.h>
#include <dali/internal/update/common/scene-graph-connection-change-propagator.h>
-#include <dali/internal/update/common/scene-graph-property-buffer.h>
#include <dali/internal/render/data-providers/geometry-data-provider.h>
#include <dali/internal/render/data-providers/render-data-provider.h>
{
namespace Internal
{
+namespace Render
+{
+class PropertyBuffer;
+}
namespace SceneGraph
{
class SceneController;
/**
* Add a property buffer to be used as a vertex buffer
*/
- void AddVertexBuffer( PropertyBuffer* vertexBuffer );
+ void AddVertexBuffer( Render::PropertyBuffer* vertexBuffer );
/**
* Remove a property buffer to be used as a vertex buffer
* @param[in] vertexBuffer the associated vertex buffer to remove
*/
- void RemoveVertexBuffer( PropertyBuffer* vertexBuffer );
+ void RemoveVertexBuffer( Render::PropertyBuffer* vertexBuffer );
/**
* Set the buffer to be used as a source of indices for the geometry
* @param[in] indexBuffer the Property buffer describing the indexes for Line, Triangle tyes.
*/
- void SetIndexBuffer( PropertyBuffer* indexBuffer );
+ void SetIndexBuffer( Render::PropertyBuffer* indexBuffer );
/**
* Clear the index buffer if it is no longer required, e.g. if changing geometry type
* Get the vertex buffers of the geometry
* @return A const reference to the vertex buffers
*/
- Vector<PropertyBuffer*>& GetVertexBuffers();
+ Vector<Render::PropertyBuffer*>& GetVertexBuffers();
/**
* Get the index buffer of the geometry
* @return A pointer to the index buffer if it exists, or NULL if it doesn't.
*/
- PropertyBuffer* GetIndexBuffer();
+ Render::PropertyBuffer* GetIndexBuffer();
/**
* Gets the associated RenderGeometry
private:
- /**
- * @brief Calculate the extents of geometry contained in a vertex buffer.
- *
- * @param[in] vertexBuffer pointer to a vertex buffer.
- */
- void CalculateExtents( PropertyBuffer* vertexBuffer );
-
- Vector<PropertyBuffer*> mVertexBuffers; ///< The vertex buffers
- PropertyBuffer* mIndexBuffer; ///< The index buffer if required
+ Vector<Render::PropertyBuffer*> mVertexBuffers; ///< The vertex buffers
+ Render::PropertyBuffer* mIndexBuffer; ///< The index buffer if required
ConnectionChangePropagator mConnectionObservers;
RenderGeometry* mRenderGeometry;
DoubleBufferedProperty<bool> mRequiresDepthTest;
};
-inline void AddVertexBufferMessage( EventThreadServices& eventThreadServices , const Geometry& geometry, const PropertyBuffer& vertexBuffer )
+inline void AddVertexBufferMessage( EventThreadServices& eventThreadServices , const Geometry& geometry, const Render::PropertyBuffer& vertexBuffer )
{
- typedef MessageValue1< Geometry, PropertyBuffer* > LocalType;
+ typedef MessageValue1< Geometry, Render::PropertyBuffer* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
// Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &geometry, &Geometry::AddVertexBuffer, const_cast<PropertyBuffer*>(&vertexBuffer) );
+ new (slot) LocalType( &geometry, &Geometry::AddVertexBuffer, const_cast<Render::PropertyBuffer*>(&vertexBuffer) );
}
-inline void RemoveVertexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, const PropertyBuffer& vertexBuffer )
+inline void RemoveVertexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, const Render::PropertyBuffer& vertexBuffer )
{
- typedef MessageValue1< Geometry, PropertyBuffer* > LocalType;
+ typedef MessageValue1< Geometry, Render::PropertyBuffer* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
// Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &geometry, &Geometry::RemoveVertexBuffer, const_cast<PropertyBuffer*>(&vertexBuffer) );
+ new (slot) LocalType( &geometry, &Geometry::RemoveVertexBuffer, const_cast<Render::PropertyBuffer*>(&vertexBuffer) );
}
-inline void SetIndexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, const PropertyBuffer& indexBuffer )
+inline void SetIndexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, const Render::PropertyBuffer& indexBuffer )
{
- typedef MessageValue1< Geometry, PropertyBuffer* > LocalType;
+ typedef MessageValue1< Geometry, Render::PropertyBuffer* > LocalType;
// Reserve some memory inside the message queue
unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
// Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &geometry, &Geometry::SetIndexBuffer, const_cast<PropertyBuffer*>(&indexBuffer) );
+ new (slot) LocalType( &geometry, &Geometry::SetIndexBuffer, const_cast<Render::PropertyBuffer*>(&indexBuffer) );
}
inline void ClearIndexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry )
AddMappings( localMap, mMaterial->GetShader()->GetUniformMap() );
AddMappings( localMap, mGeometry->GetUniformMap() );
- Vector<PropertyBuffer*>& vertexBuffers = mGeometry->GetVertexBuffers();
- unsigned int vertexBufferCount( vertexBuffers.Size() );
- for( unsigned int i(0); i<vertexBufferCount; ++i )
- {
- AddMappings( localMap, vertexBuffers[i]->GetUniformMap() );
- }
-
- PropertyBuffer* indexBuffer = mGeometry->GetIndexBuffer();
- if( indexBuffer )
- {
- AddMappings( localMap, indexBuffer->GetUniformMap() );
- }
}
else if( mRegenerateUniformMap == COPY_UNIFORM_MAP )
{
if( mReferenceCount == 0 )
{
mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mRenderer );
+ if( mGeometry )
+ {
+ mGeometry->OnRendererDisconnect();
+ }
mRenderer = NULL;
}
}
#include <dali/internal/update/common/property-boolean.h>
#include <dali/internal/update/common/uniform-map.h>
#include <dali/internal/update/common/scene-graph-connection-change-propagator.h>
-#include <dali/internal/update/common/scene-graph-property-buffer.h>
#include <dali/internal/render/data-providers/geometry-data-provider.h>
#include <dali/internal/render/data-providers/render-data-provider.h>
#include <dali/internal/render/renderers/render-new-renderer.h>