From: Ferran Sole Date: Wed, 20 Apr 2016 15:06:34 +0000 (+0100) Subject: Remove Geometry scene object X-Git-Tag: dali_1.1.32~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F44%2F66744%2F14;p=platform%2Fcore%2Fuifw%2Fdali-core.git Remove Geometry scene object * Removed geometry scene object * Stop using PropertyBuffers for index data * Moved RenderGeometry to the Render namespace Change-Id: I9833a4cbe242a452b832ccecce60d21610a9a5b2 --- diff --git a/automated-tests/src/dali-devel/utc-Dali-Geometry.cpp b/automated-tests/src/dali-devel/utc-Dali-Geometry.cpp index ed32b48..96ad6a6 100644 --- a/automated-tests/src/dali-devel/utc-Dali-Geometry.cpp +++ b/automated-tests/src/dali-devel/utc-Dali-Geometry.cpp @@ -63,18 +63,6 @@ PropertyBuffer CreateVertexBuffer( const std::string& aPosition, const std::stri return vertexData; } -PropertyBuffer CreateIndexBuffer() -{ - const unsigned short indexData[6] = { 0, 3, 1, 0, 2, 3 }; - const unsigned int numberElements = sizeof(indexData)/sizeof(indexData[0]) ; - - Property::Map indexFormat; - indexFormat["indices"] = Property::INTEGER; - PropertyBuffer indices = PropertyBuffer::New( indexFormat ); - indices.SetData( indexData, numberElements ); - - return indices; -} } @@ -263,7 +251,6 @@ int UtcDaliGeometrySetIndexBuffer(void) tet_infoline("Test SetIndexBuffer"); PropertyBuffer vertexBuffer = CreateVertexBuffer("aPosition", "aTexCoord" ); - PropertyBuffer indexBuffer = CreateIndexBuffer( ); Geometry geometry = Geometry::New(); geometry.AddVertexBuffer( vertexBuffer ); @@ -292,7 +279,8 @@ int UtcDaliGeometrySetIndexBuffer(void) // Set index buffer application.GetGlAbstraction().ResetBufferDataCalls(); - geometry.SetIndexBuffer( indexBuffer ); + const unsigned short indexData[6] = { 0, 3, 1, 0, 2, 3 }; + geometry.SetIndexBuffer( indexData, sizeof(indexData)/sizeof(indexData[0]) ); application.SendNotification(); application.Render(0); application.Render(); @@ -450,11 +438,12 @@ int UtcDaliGeometrySetGetGeometryType02(void) unsigned int numVertex = 4u; unsigned int numIndex = 6u; // 6 unsigned short PropertyBuffer vertexBuffer = CreateVertexBuffer("aPosition", "aTexCoord" ); - PropertyBuffer indexBuffer = CreateIndexBuffer( ); + Geometry geometry = Geometry::New(); geometry.AddVertexBuffer( vertexBuffer ); - geometry.SetIndexBuffer( indexBuffer ); + const unsigned short indexData[6] = { 0, 3, 1, 0, 2, 3 }; + geometry.SetIndexBuffer( indexData, sizeof(indexData)/sizeof(indexData[0]) ); Shader shader = CreateShader(); Renderer renderer = Renderer::New(geometry, shader); @@ -602,224 +591,3 @@ int UtcDaliGeometrySetGetRequireDepthTesting(void) END_TEST; } -int UtcDaliGeometryPropertyRequiresDepthTest(void) -{ - TestApplication application; - - tet_infoline("Test SetRequiresDepthTesting, GetRequiresDepthTesting"); - - Shader shader = Shader::New("VertexSource", "FragmentSource"); - Geometry geometry = CreateQuadGeometry(); - Renderer renderer = Renderer::New( geometry, shader ); - - Actor actor = Actor::New(); - actor.AddRenderer(renderer); - actor.SetSize(400, 400); - Stage::GetCurrent().Add(actor); - - DALI_TEST_EQUALS( geometry.GetProperty(Geometry::Property::REQUIRES_DEPTH_TEST), false, TEST_LOCATION ); - - geometry.SetProperty(Geometry::Property::REQUIRES_DEPTH_TEST, true ); - - TestGlAbstraction& glAbstraction = application.GetGlAbstraction(); - glAbstraction.EnableEnableDisableCallTrace(true); - application.SendNotification(); - application.Render(); -// TODO: Not supported yet -// TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace(); -// std::ostringstream out; -// out << GL_DEPTH_TEST; -// DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", out.str().c_str() ) ); - - DALI_TEST_EQUALS( geometry.GetProperty(Geometry::Property::REQUIRES_DEPTH_TEST), true, TEST_LOCATION ); - - END_TEST; -} - -int UtcDaliGeometryConstraint(void) -{ - TestApplication application; - - tet_infoline("Test that a custom geometry property can be constrained"); - - Shader shader = Shader::New("VertexSource", "FragmentSource"); - Geometry geometry = CreateQuadGeometry(); - Renderer renderer = Renderer::New( geometry, shader ); - - Actor actor = Actor::New(); - actor.AddRenderer(renderer); - actor.SetSize(400, 400); - Stage::GetCurrent().Add(actor); - - Vector4 initialColor = Color::WHITE; - Property::Index colorIndex = geometry.RegisterProperty( "uFadeColor", initialColor ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( geometry.GetProperty(colorIndex), initialColor, TEST_LOCATION ); - - // Apply constraint - Constraint constraint = Constraint::New( geometry, colorIndex, TestConstraintNoBlue ); - constraint.Apply(); - application.SendNotification(); - application.Render(0); - - // Expect no blue component in either buffer - yellow - DALI_TEST_EQUALS( geometry.GetProperty(colorIndex), Color::YELLOW, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( geometry.GetProperty(colorIndex), Color::YELLOW, TEST_LOCATION ); - - geometry.RemoveConstraints(); - geometry.SetProperty(colorIndex, Color::WHITE ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( geometry.GetProperty(colorIndex), Color::WHITE, TEST_LOCATION ); - - END_TEST; -} - -int UtcDaliGeometryConstraint02(void) -{ - TestApplication application; - - tet_infoline("Test that a uniform map geometry property can be constrained"); - - Shader shader = Shader::New("VertexSource", "FragmentSource"); - Geometry geometry = CreateQuadGeometry(); - Renderer renderer = Renderer::New( geometry, shader ); - - 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 = geometry.RegisterProperty( "uFadeColor", initialColor ); - - TestGlAbstraction& gl = application.GetGlAbstraction(); - - application.SendNotification(); - application.Render(0); - - Vector4 actualValue(Vector4::ZERO); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, initialColor, TEST_LOCATION ); - - // Apply constraint - Constraint constraint = Constraint::New( geometry, colorIndex, TestConstraintNoBlue ); - constraint.Apply(); - application.SendNotification(); - application.Render(0); - - // Expect no blue component in either buffer - yellow - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION ); - - application.Render(0); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::YELLOW, TEST_LOCATION ); - - geometry.RemoveConstraints(); - geometry.SetProperty(colorIndex, Color::WHITE ); - application.SendNotification(); - application.Render(0); - - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::WHITE, TEST_LOCATION ); - - END_TEST; -} - - - -int UtcDaliGeometryAnimatedProperty01(void) -{ - TestApplication application; - - tet_infoline("Test that a custom geometry property can be animated"); - - Shader shader = Shader::New("VertexSource", "FragmentSource"); - Geometry geometry = CreateQuadGeometry(); - Renderer renderer = Renderer::New( geometry, shader ); - - Actor actor = Actor::New(); - actor.AddRenderer(renderer); - actor.SetSize(400, 400); - Stage::GetCurrent().Add(actor); - - Vector4 initialColor = Color::WHITE; - Property::Index colorIndex = geometry.RegisterProperty( "uFadeColor", initialColor ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( geometry.GetProperty(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( geometry, colorIndex ), keyFrames ); - animation.Play(); - - application.SendNotification(); - application.Render(500); - - DALI_TEST_EQUALS( geometry.GetProperty(colorIndex), Color::WHITE * 0.5f, TEST_LOCATION ); - - application.Render(500); - - DALI_TEST_EQUALS( geometry.GetProperty(colorIndex), Color::TRANSPARENT, TEST_LOCATION ); - - END_TEST; -} - -int UtcDaliGeometryAnimatedProperty02(void) -{ - TestApplication application; - - tet_infoline("Test that a uniform map geometry property can be animated"); - - Shader shader = Shader::New("VertexSource", "FragmentSource"); - Geometry geometry = CreateQuadGeometry(); - Renderer renderer = Renderer::New( geometry, shader ); - - 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 = geometry.RegisterProperty( "uFadeColor", initialColor ); - - TestGlAbstraction& gl = application.GetGlAbstraction(); - - application.SendNotification(); - application.Render(0); - - Vector4 actualValue(Vector4::ZERO); - DALI_TEST_CHECK( gl.GetUniformValue( "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( geometry, colorIndex ), keyFrames ); - animation.Play(); - - application.SendNotification(); - application.Render(500); - - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::WHITE * 0.5f, TEST_LOCATION ); - - application.Render(500); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::TRANSPARENT, TEST_LOCATION ); - - END_TEST; -} diff --git a/automated-tests/src/dali-devel/utc-Dali-Renderer.cpp b/automated-tests/src/dali-devel/utc-Dali-Renderer.cpp index b350bc8..a9724f1 100644 --- a/automated-tests/src/dali-devel/utc-Dali-Renderer.cpp +++ b/automated-tests/src/dali-devel/utc-Dali-Renderer.cpp @@ -123,10 +123,7 @@ int UtcDaliRendererSetGetGeometry(void) tet_infoline( "Test SetGeometry, GetGeometry" ); Geometry geometry1 = CreateQuadGeometry(); - geometry1.RegisterProperty( "uFadeColor", Color::RED ); - Geometry geometry2 = CreateQuadGeometry(); - geometry2.RegisterProperty( "uFadeColor", Color::GREEN ); Shader shader = CreateShader(); Renderer renderer = Renderer::New(geometry1, shader); @@ -135,15 +132,8 @@ int UtcDaliRendererSetGetGeometry(void) actor.SetSize(400, 400); Stage::GetCurrent().Add(actor); - TestGlAbstraction& gl = application.GetGlAbstraction(); application.SendNotification(); application.Render(0); - - // Expect that the first geometry's fade color property is accessed - Vector4 actualValue(Vector4::ZERO); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::RED, TEST_LOCATION ); - DALI_TEST_EQUALS( renderer.GetGeometry(), geometry1, TEST_LOCATION ); // Set geometry2 to the renderer @@ -151,11 +141,6 @@ int UtcDaliRendererSetGetGeometry(void) application.SendNotification(); application.Render(0); - - // Expect that the second geometry's fade color property is accessed - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::GREEN, TEST_LOCATION ); - DALI_TEST_EQUALS( renderer.GetGeometry(), geometry2, TEST_LOCATION ); END_TEST; @@ -1149,8 +1134,6 @@ int UtcDaliRendererUniformMapPrecendence01(void) shader.RegisterProperty( "uFadeColor", Color::MAGENTA ); - geometry.RegisterProperty( "uFadeColor", Color::YELLOW ); - TestGlAbstraction& gl = application.GetGlAbstraction(); application.SendNotification(); @@ -1213,8 +1196,6 @@ int UtcDaliRendererUniformMapPrecendence02(void) shader.RegisterProperty( "uFadeColor", Color::MAGENTA ); - geometry.RegisterProperty( "uFadeColor", Color::YELLOW ); - TestGlAbstraction& gl = application.GetGlAbstraction(); @@ -1275,12 +1256,7 @@ int UtcDaliRendererUniformMapPrecendence03(void) textureSet.RegisterProperty( "uFadeColor", Color::BLUE ); - shader.RegisterProperty( "uFadeColor", Color::MAGENTA ); - - Property::Index geometryFadeColorIndex = geometry.RegisterProperty( "uFadeColor", Color::YELLOW ); - - geometry.RegisterProperty( "uFadeColor", Color::BLACK ); - + Property::Index shaderFadeColorIndex = shader.RegisterProperty( "uFadeColor", Color::BLACK ); TestGlAbstraction& gl = application.GetGlAbstraction(); @@ -1297,7 +1273,7 @@ int UtcDaliRendererUniformMapPrecendence03(void) KeyFrames keyFrames = KeyFrames::New(); keyFrames.Add(0.0f, Color::WHITE); keyFrames.Add(1.0f, Color::TRANSPARENT); - animation.AnimateBetween( Property( geometry, geometryFadeColorIndex ), keyFrames ); + animation.AnimateBetween( Property( shader, shaderFadeColorIndex ), keyFrames ); animation.Play(); application.SendNotification(); @@ -1313,132 +1289,6 @@ int UtcDaliRendererUniformMapPrecendence03(void) END_TEST; } - -int UtcDaliRendererUniformMapPrecendence04(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"); - TextureSet textureSet = CreateTextureSet( image ); - - PropertyBuffer vertexBuffer = CreatePropertyBuffer(); - Geometry geometry = CreateQuadGeometryFromBuffer(vertexBuffer); - Renderer renderer = Renderer::New( geometry, shader ); - renderer.SetTextures( textureSet ); - - 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/texture set - shader.RegisterProperty( "uFadeColor", Color::MAGENTA ); - - Property::Index geometryFadeColorIndex = geometry.RegisterProperty( "uFadeColor", Color::YELLOW ); - - geometry.RegisterProperty( "uFadeColor", Color::BLACK ); - - - TestGlAbstraction& gl = application.GetGlAbstraction(); - - application.SendNotification(); - application.Render(0); - - // Expect that the sampler's fade color property is accessed - Vector4 actualValue(Vector4::ZERO); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::MAGENTA, TEST_LOCATION ); - - // Animate geometry'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( geometry, geometryFadeColorIndex ), keyFrames ); - animation.Play(); - - application.SendNotification(); - application.Render(500); - - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::MAGENTA, TEST_LOCATION ); - - application.Render(500); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::MAGENTA, TEST_LOCATION ); - - END_TEST; -} - -int UtcDaliRendererUniformMapPrecendence05(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"); - TextureSet textureSet = CreateTextureSet( image ); - - PropertyBuffer vertexBuffer = CreatePropertyBuffer(); - Geometry geometry = CreateQuadGeometryFromBuffer(vertexBuffer); - Renderer renderer = Renderer::New( geometry, shader ); - renderer.SetTextures( textureSet ); - - 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/texture set/sampler - - shader.RegisterProperty( "uFadeColor", Color::MAGENTA ); - - Property::Index geometryFadeColorIndex = geometry.RegisterProperty( "uFadeColor", Color::YELLOW ); - - geometry.RegisterProperty( "uFadeColor", Color::BLACK ); - - - TestGlAbstraction& gl = application.GetGlAbstraction(); - - application.SendNotification(); - application.Render(0); - - // Expect that the shader's fade color property is accessed - Vector4 actualValue(Vector4::ZERO); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::MAGENTA, TEST_LOCATION ); - - // Animate geometry'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( geometry, geometryFadeColorIndex ), keyFrames ); - animation.Play(); - - application.SendNotification(); - application.Render(500); - - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::MAGENTA, TEST_LOCATION ); - - application.Render(500); - DALI_TEST_CHECK( gl.GetUniformValue( "uFadeColor", actualValue ) ); - DALI_TEST_EQUALS( actualValue, Color::MAGENTA, TEST_LOCATION ); - - END_TEST; -} - int UtcDaliRendererUniformMapMultipleUniforms01(void) { TestApplication application; @@ -1466,7 +1316,6 @@ int UtcDaliRendererUniformMapMultipleUniforms01(void) actor.RegisterProperty( "uUniform2", Color::GREEN ); textureSet.RegisterProperty( "uUniform3", Color::BLUE ); shader.RegisterProperty( "uUniform4", Color::MAGENTA ); - geometry.RegisterProperty( "uUniform5", Color::YELLOW ); TestGlAbstraction& gl = application.GetGlAbstraction(); @@ -1486,18 +1335,13 @@ int UtcDaliRendererUniformMapMultipleUniforms01(void) DALI_TEST_CHECK( gl.GetUniformValue( "uUniform3", uniform3Value ) ); DALI_TEST_EQUALS( uniform3Value, Color::BLUE, TEST_LOCATION ); - Vector4 uniform5Value(Vector4::ZERO); - DALI_TEST_CHECK( gl.GetUniformValue( "uUniform4", uniform5Value ) ); - DALI_TEST_EQUALS( uniform5Value, Color::MAGENTA, TEST_LOCATION ); - - Vector4 uniform6Value(Vector4::ZERO); - DALI_TEST_CHECK( gl.GetUniformValue( "uUniform5", uniform6Value ) ); - DALI_TEST_EQUALS( uniform6Value, Color::YELLOW, TEST_LOCATION ); + Vector4 uniform4Value(Vector4::ZERO); + DALI_TEST_CHECK( gl.GetUniformValue( "uUniform4", uniform4Value ) ); + DALI_TEST_EQUALS( uniform4Value, Color::MAGENTA, TEST_LOCATION ); END_TEST; } - int UtcDaliRendererUniformMapMultipleUniforms02(void) { TestApplication application; @@ -1533,9 +1377,6 @@ int UtcDaliRendererUniformMapMultipleUniforms02(void) Property::Value value5(Matrix3::IDENTITY); shader.RegisterProperty( "uANormalMatrix", value5 ); - Property::Value value6(Matrix::IDENTITY); - geometry.RegisterProperty( "uAWorldMatrix", value6 ); - TestGlAbstraction& gl = application.GetGlAbstraction(); application.SendNotification(); @@ -1558,10 +1399,6 @@ int UtcDaliRendererUniformMapMultipleUniforms02(void) DALI_TEST_CHECK( gl.GetUniformValue( "uANormalMatrix", uniform5Value ) ); DALI_TEST_EQUALS( uniform5Value, value5.Get(), TEST_LOCATION ); - Matrix uniform6Value; - DALI_TEST_CHECK( gl.GetUniformValue( "uAWorldMatrix", uniform6Value ) ); - DALI_TEST_EQUALS( uniform6Value, value6.Get(), TEST_LOCATION ); - END_TEST; } @@ -1983,13 +1820,9 @@ int UtcDaliRendererSetIndexRange(void) // -------------------------------------------------------------------------- // index buffer - unsigned indices[] = { 0, 2, 4, 6, 8, // offset = 0, count = 5 + unsigned short indices[] = { 0, 2, 4, 6, 8, // offset = 0, count = 5 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // offset = 5, count = 10 1, 3, 5, 7, 9, 1 }; // offset = 15, count = 6 // line strip - Property::Map format; - format["indices"] = Property::INTEGER; - PropertyBuffer indexBuffer = PropertyBuffer::New( format ); - indexBuffer.SetData( indices, sizeof(indices)/sizeof(indices[0])); // -------------------------------------------------------------------------- // vertex buffer @@ -2012,7 +1845,7 @@ int UtcDaliRendererSetIndexRange(void) vertexBuffer.SetData( shapes, sizeof(shapes)/sizeof(shapes[0])); // -------------------------------------------------------------------------- - geometry.SetIndexBuffer( indexBuffer ); + geometry.SetIndexBuffer( indices, sizeof(indices)/sizeof(indices[0]) ); geometry.AddVertexBuffer( vertexBuffer ); // create shader diff --git a/automated-tests/src/dali-internal/utc-Dali-Internal-FrustumCulling.cpp b/automated-tests/src/dali-internal/utc-Dali-Internal-FrustumCulling.cpp index 4f8d579..7dfd62e 100644 --- a/automated-tests/src/dali-internal/utc-Dali-Internal-FrustumCulling.cpp +++ b/automated-tests/src/dali-internal/utc-Dali-Internal-FrustumCulling.cpp @@ -74,16 +74,12 @@ Geometry CreateGeometry() texturedQuadVertices.SetData( texturedQuadVertexData, 4 ); // Create indices - unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 }; - Property::Map indexFormat; - indexFormat["indices"] = Property::INTEGER; - PropertyBuffer indices = PropertyBuffer::New( indexFormat ); - indices.SetData( indexData, sizeof(indexData)/sizeof(indexData[0]) ); + unsigned short indexData[6] = { 0, 3, 1, 0, 2, 3 }; // Create the geometry object Geometry texturedQuadGeometry = Geometry::New(); texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices ); - texturedQuadGeometry.SetIndexBuffer( indices ); + texturedQuadGeometry.SetIndexBuffer( indexData, sizeof(indexData)/sizeof(indexData[0]) ); return texturedQuadGeometry; } diff --git a/automated-tests/src/dali/dali-test-suite-utils/mesh-builder.cpp b/automated-tests/src/dali/dali-test-suite-utils/mesh-builder.cpp index 304e567..5b127c7 100644 --- a/automated-tests/src/dali/dali-test-suite-utils/mesh-builder.cpp +++ b/automated-tests/src/dali/dali-test-suite-utils/mesh-builder.cpp @@ -62,15 +62,11 @@ Geometry CreateQuadGeometryFromBuffer( PropertyBuffer vertexData ) { Vector2( halfQuadSize, halfQuadSize), Vector2(1.f, 1.f) } }; vertexData.SetData(texturedQuadVertexData, 4); - unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 }; - Property::Map indexFormat; - indexFormat["indices"] = Property::INTEGER; - PropertyBuffer indices = PropertyBuffer::New( indexFormat ); - indices.SetData( indexData, sizeof(indexData)/sizeof(indexData[0]) ); + unsigned short indexData[6] = { 0, 3, 1, 0, 2, 3 }; Geometry geometry = Geometry::New(); geometry.AddVertexBuffer( vertexData ); - geometry.SetIndexBuffer( indices ); + geometry.SetIndexBuffer( indexData, sizeof(indexData)/sizeof(indexData[0]) ); return geometry; } diff --git a/dali/devel-api/object/property-buffer.h b/dali/devel-api/object/property-buffer.h index f9bcccc..f498d20 100644 --- a/dali/devel-api/object/property-buffer.h +++ b/dali/devel-api/object/property-buffer.h @@ -57,15 +57,11 @@ class PropertyBuffer; * * // Create indices * unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 }; - * Property::Map indexFormat; - * indexFormat["indices"] = Property::INTEGER; - * PropertyBuffer indices = PropertyBuffer::New( indexFormat ); - * indices.SetData( indexData, 6 ); * * // Create the geometry object * Geometry texturedQuadGeometry = Geometry::New(); * texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices ); - * texturedQuadGeometry.SetIndexBuffer( indices ); + * texturedQuadGeometry.SetIndexBuffer( indexData, sizeof(indexData)/sizeof(indexData[0] ); * */ class DALI_IMPORT_API PropertyBuffer : public BaseHandle diff --git a/dali/devel-api/rendering/geometry.cpp b/dali/devel-api/rendering/geometry.cpp index 4b12f05..14b6476 100644 --- a/dali/devel-api/rendering/geometry.cpp +++ b/dali/devel-api/rendering/geometry.cpp @@ -39,7 +39,7 @@ Geometry::~Geometry() } Geometry::Geometry( const Geometry& handle ) -: Handle( handle ) +: BaseHandle( handle ) { } @@ -70,10 +70,9 @@ void Geometry::RemoveVertexBuffer( std::size_t index ) GetImplementation(*this).RemoveVertexBuffer( index ); } -void Geometry::SetIndexBuffer( PropertyBuffer& indexBuffer ) +void Geometry::SetIndexBuffer( const unsigned short* indices, size_t count ) { - DALI_ASSERT_ALWAYS( indexBuffer && "indexBuffer is not initialized "); - GetImplementation(*this).SetIndexBuffer( GetImplementation( indexBuffer ) ); + GetImplementation(*this).SetIndexBuffer( indices, count ); } void Geometry::SetGeometryType( GeometryType geometryType ) @@ -97,7 +96,7 @@ bool Geometry::GetRequiresDepthTesting() const } Geometry::Geometry( Internal::Geometry* pointer ) -: Handle( pointer ) +: BaseHandle( pointer ) { } diff --git a/dali/devel-api/rendering/geometry.h b/dali/devel-api/rendering/geometry.h index 272769e..c57595b 100644 --- a/dali/devel-api/rendering/geometry.h +++ b/dali/devel-api/rendering/geometry.h @@ -37,7 +37,7 @@ class Geometry; /** * @brief Geometry is handle to an object that can be used to define a geometric elements. */ -class DALI_IMPORT_API Geometry : public Handle +class DALI_IMPORT_API Geometry : public BaseHandle { public: @@ -52,17 +52,6 @@ public: TRIANGLE_STRIP }; - /** - * @brief An enumeration of properties belonging to the Geometry class. - */ - struct Property - { - enum - { - GEOMETRY_TYPE = DEFAULT_OBJECT_PROPERTY_START_INDEX, ///< name "geometryType", type STRING - REQUIRES_DEPTH_TEST, ///< name "requiresDepthTesting", type BOOLEAN - }; - }; /** * @brief Creates a new Geometry object @@ -131,16 +120,15 @@ public: void RemoveVertexBuffer( std::size_t index ); /** - * @brief Set a PropertyBuffer to be used as a source of indices for the geometry - * - * This buffer is required to have exactly one component and it must be of the type Property::INTEGER + * @brief Set a the index data to be used as a source of indices for the geometry * - * By setting this buffer the will case the geometry to be rendered using indices. - * To unset call SetIndexBuffer with an empty handle. + * Setting this buffer will cause the geometry to be rendered using indices. + * To unset call SetIndexBuffer with a null pointer or count 0 * - * @param[in] indexBuffer PropertyBuffer to be used as a source of indices for the geometry + * @param[in] indices Array of indices + * @param[in] count Number of indices in the array */ - void SetIndexBuffer( PropertyBuffer& indexBuffer ); + void SetIndexBuffer( const unsigned short* indices, size_t count ); /** * @brief Set the type of primitives this geometry contains diff --git a/dali/integration-api/profiling.cpp b/dali/integration-api/profiling.cpp index 28a04bc..9a27aa7 100644 --- a/dali/integration-api/profiling.cpp +++ b/dali/integration-api/profiling.cpp @@ -125,8 +125,7 @@ const int RENDERER_MEMORY_SIZE( sizeof( Internal::Render::Renderer ) ); const int GEOMETRY_MEMORY_SIZE( sizeof( Internal::Geometry ) + - sizeof( Internal::SceneGraph::Geometry ) + - sizeof( Internal::SceneGraph::RenderGeometry) ); + sizeof( Internal::Render::Geometry) ); const int PROPERTY_BUFFER_MEMORY_SIZE( sizeof( Internal::PropertyBuffer ) + sizeof( Internal::Render::PropertyBuffer ) ); diff --git a/dali/internal/event/actors/image-actor-impl.cpp b/dali/internal/event/actors/image-actor-impl.cpp index 5275eb0..73d7be4 100644 --- a/dali/internal/event/actors/image-actor-impl.cpp +++ b/dali/internal/event/actors/image-actor-impl.cpp @@ -86,7 +86,7 @@ GeometryPtr CreateGeometry( unsigned int gridWidth, unsigned int gridHeight, con } // Create indices - Vector< unsigned int > indices; + Vector< unsigned short > indices; indices.Reserve( ( gridWidth + 2 ) * gridHeight * 2 - 2); for( unsigned int row = 0u; row < gridHeight; ++row ) @@ -120,18 +120,13 @@ GeometryPtr CreateGeometry( unsigned int gridWidth, unsigned int gridHeight, con vertexPropertyBuffer->SetData( &vertices[ 0 ], vertices.size() ); } - Property::Map indexFormat; - indexFormat[ "indices" ] = Property::INTEGER; - PropertyBufferPtr indexPropertyBuffer = PropertyBuffer::New( indexFormat ); - if( indices.Size() > 0 ) - { - indexPropertyBuffer->SetData( &indices[ 0 ], indices.Size() ); - } - // Create the geometry object GeometryPtr geometry = Geometry::New(); geometry->AddVertexBuffer( *vertexPropertyBuffer ); - geometry->SetIndexBuffer( *indexPropertyBuffer ); + if( indices.Size() > 0 ) + { + geometry->SetIndexBuffer( &indices[0], indices.Size() ); + } geometry->SetGeometryType( Dali::Geometry::TRIANGLE_STRIP ); return geometry; diff --git a/dali/internal/event/rendering/geometry-impl.cpp b/dali/internal/event/rendering/geometry-impl.cpp index 4ee6fde..0f5af2e 100644 --- a/dali/internal/event/rendering/geometry-impl.cpp +++ b/dali/internal/event/rendering/geometry-impl.cpp @@ -33,16 +33,6 @@ namespace Internal namespace { -/** - * |name |type |writable|animatable|constraint-input|enum for index-checking| - */ -DALI_PROPERTY_TABLE_BEGIN -DALI_PROPERTY( "geometryType", STRING, true, false, true, Dali::Geometry::Property::GEOMETRY_TYPE ) -DALI_PROPERTY( "requiresDepthTest", BOOLEAN, true, false, true, Dali::Geometry::Property::REQUIRES_DEPTH_TEST ) -DALI_PROPERTY_TABLE_END( DEFAULT_ACTOR_PROPERTY_START_INDEX ) - -const ObjectImplHelper GEOMETRY_IMPL = { DEFAULT_PROPERTY_DETAILS }; - BaseHandle Create() { return Dali::Geometry::New(); @@ -62,7 +52,7 @@ GeometryPtr Geometry::New() std::size_t Geometry::AddVertexBuffer( PropertyBuffer& vertexBuffer ) { mVertexBuffers.push_back( &vertexBuffer ); - SceneGraph::AddVertexBufferMessage( GetEventThreadServices(), *mSceneObject, *vertexBuffer.GetRenderObject() ); + SceneGraph::AddVertexBufferMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, *vertexBuffer.GetRenderObject() ); return mVertexBuffers.size() - 1u; } @@ -74,24 +64,28 @@ std::size_t Geometry::GetNumberOfVertexBuffers() const void Geometry::RemoveVertexBuffer( std::size_t index ) { const Render::PropertyBuffer& renderPropertyBuffer = static_cast( *(mVertexBuffers[index]->GetRenderObject()) ); - SceneGraph::RemoveVertexBufferMessage( GetEventThreadServices(), *mSceneObject, renderPropertyBuffer ); + SceneGraph::RemoveVertexBufferMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, renderPropertyBuffer ); mVertexBuffers.erase( mVertexBuffers.begin() + index ); } -void Geometry::SetIndexBuffer( PropertyBuffer& indexBuffer ) +void Geometry::SetIndexBuffer( const unsigned short* indices, size_t count ) { - mIndexBuffer = &indexBuffer; - SceneGraph::SetIndexBufferMessage( GetEventThreadServices(), *mSceneObject, *indexBuffer.GetRenderObject() ); + Dali::Vector indexData; + if( indices && count ) + { + indexData.Resize( count ); + std::copy( indices, indices + count, indexData.Begin() ); + } + + SceneGraph::SetIndexBufferMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, indexData ); } void Geometry::SetGeometryType( Dali::Geometry::GeometryType geometryType ) { if( geometryType != mGeometryType ) { - SceneGraph::SetGeometryTypeMessage(GetEventThreadServices(), - *mSceneObject, - geometryType ); + SceneGraph::SetGeometryTypeMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, geometryType ); mGeometryType = geometryType; } @@ -106,9 +100,7 @@ void Geometry::SetRequiresDepthTesting( bool requiresDepthTest ) { if( requiresDepthTest != mRequiresDepthTest ) { - SceneGraph::SetGeometryRequiresDepthTestMessage(GetEventThreadServices(), - *mSceneObject, - requiresDepthTest ); + SceneGraph::SetGeometryRequiresDepthTestMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, requiresDepthTest ); mRequiresDepthTest = requiresDepthTest; } @@ -119,199 +111,30 @@ bool Geometry::GetRequiresDepthTesting() const return mRequiresDepthTest; } -const SceneGraph::Geometry* Geometry::GetGeometrySceneObject() const -{ - return mSceneObject; -} - -unsigned int Geometry::GetDefaultPropertyCount() const -{ - return GEOMETRY_IMPL.GetDefaultPropertyCount(); -} - -void Geometry::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const -{ - GEOMETRY_IMPL.GetDefaultPropertyIndices( indices ); -} - -const char* Geometry::GetDefaultPropertyName(Property::Index index) const +const Render::Geometry* Geometry::GetRenderObject() const { - return GEOMETRY_IMPL.GetDefaultPropertyName( index ); -} - -Property::Index Geometry::GetDefaultPropertyIndex( const std::string& name ) const -{ - return GEOMETRY_IMPL.GetDefaultPropertyIndex( name ); -} - -bool Geometry::IsDefaultPropertyWritable( Property::Index index ) const -{ - return GEOMETRY_IMPL.IsDefaultPropertyWritable( index ); -} - -bool Geometry::IsDefaultPropertyAnimatable( Property::Index index ) const -{ - return GEOMETRY_IMPL.IsDefaultPropertyAnimatable( index ); -} - -bool Geometry::IsDefaultPropertyAConstraintInput( Property::Index index ) const -{ - return GEOMETRY_IMPL.IsDefaultPropertyAConstraintInput( index ); -} - -Property::Type Geometry::GetDefaultPropertyType( Property::Index index ) const -{ - return GEOMETRY_IMPL.GetDefaultPropertyType( index ); -} - -void Geometry::SetDefaultProperty( Property::Index index, - const Property::Value& propertyValue ) -{ - switch( index ) - { - case Dali::Geometry::Property::GEOMETRY_TYPE : - { - Dali::Geometry::GeometryType geometryType = static_cast(propertyValue.Get()); - if( geometryType != mGeometryType ) - { - SceneGraph::SetGeometryTypeMessage(GetEventThreadServices(), *mSceneObject, geometryType ); - mGeometryType = geometryType; - } - break; - } - case Dali::Geometry::Property::REQUIRES_DEPTH_TEST : - { - bool requiresDepthTest = propertyValue.Get(); - if( requiresDepthTest != mRequiresDepthTest ) - { - SceneGraph::SetGeometryRequiresDepthTestMessage(GetEventThreadServices(), *mSceneObject, requiresDepthTest); - mRequiresDepthTest = requiresDepthTest; - } - break; - } - } -} - -void Geometry::SetSceneGraphProperty( Property::Index index, - const PropertyMetadata& entry, - const Property::Value& value ) -{ - GEOMETRY_IMPL.SetSceneGraphProperty( GetEventThreadServices(), this, index, entry, value ); -} - -Property::Value Geometry::GetDefaultProperty( Property::Index index ) const -{ - Property::Value value; - - switch( index ) - { - case Dali::Geometry::Property::GEOMETRY_TYPE : - { - if( mSceneObject ) - { - value = mGeometryType; - } - break; - } - case Dali::Geometry::Property::REQUIRES_DEPTH_TEST : - { - if( mSceneObject ) - { - value = mRequiresDepthTest; - } - break; - } - } - - return value; -} - -const SceneGraph::PropertyOwner* Geometry::GetPropertyOwner() const -{ - return mSceneObject; -} - -const SceneGraph::PropertyOwner* Geometry::GetSceneObject() const -{ - return mSceneObject; -} - -const SceneGraph::PropertyBase* Geometry::GetSceneObjectAnimatableProperty( Property::Index index ) const -{ - const SceneGraph::PropertyBase* property = NULL; - if( OnStage() ) - { - property = GEOMETRY_IMPL.GetRegisteredSceneGraphProperty ( this, - &Geometry::FindAnimatableProperty, - &Geometry::FindCustomProperty, - index ); - } - - return property; -} - -const PropertyInputImpl* Geometry::GetSceneObjectInputProperty( Property::Index index ) const -{ - const PropertyInputImpl* property = NULL; - - if( OnStage() ) - { - const SceneGraph::PropertyBase* baseProperty = - GEOMETRY_IMPL.GetRegisteredSceneGraphProperty ( this, - &Geometry::FindAnimatableProperty, - &Geometry::FindCustomProperty, - index ); - - property = static_cast( baseProperty ); - } - - return property; -} - -bool Geometry::OnStage() const -{ - return mOnStage; -} - -void Geometry::Connect() -{ - mOnStage = true; -} - -void Geometry::Disconnect() -{ - mOnStage = false; + return mRenderObject; } Geometry::Geometry() -: mSceneObject( NULL ), - mIndexBuffer( NULL ), +: mEventThreadServices( *Stage::GetCurrent() ), + mRenderObject( NULL ), mGeometryType(Dali::Geometry::TRIANGLES), - mRequiresDepthTest(false), - mOnStage( false ) + mRequiresDepthTest(false) { } void Geometry::Initialize() { - EventThreadServices& eventThreadServices = GetEventThreadServices(); - SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager(); - - mSceneObject = new SceneGraph::Geometry(); - AddMessage( updateManager, updateManager.GetGeometryOwner(), *mSceneObject ); - - eventThreadServices.RegisterObject( this ); + mRenderObject = new Render::Geometry(); + AddGeometry( mEventThreadServices.GetUpdateManager(), *mRenderObject ); } Geometry::~Geometry() { - if( EventThreadServices::IsCoreRunning() ) + if( EventThreadServices::IsCoreRunning() && mRenderObject ) { - EventThreadServices& eventThreadServices = GetEventThreadServices(); - SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager(); - RemoveMessage( updateManager, updateManager.GetGeometryOwner(), *mSceneObject ); - - eventThreadServices.UnregisterObject( this ); + RemoveGeometry( mEventThreadServices.GetUpdateManager(), *mRenderObject ); } } diff --git a/dali/internal/event/rendering/geometry-impl.h b/dali/internal/event/rendering/geometry-impl.h index ae3acf1..1d7ba29 100644 --- a/dali/internal/event/rendering/geometry-impl.h +++ b/dali/internal/event/rendering/geometry-impl.h @@ -29,6 +29,7 @@ #include // Dali::Internal::ObjectConnector #include // Dali::Internal::Object #include // Dali::Internal::PropertyBuffer +#include namespace Dali { @@ -46,7 +47,7 @@ typedef IntrusivePtr GeometryPtr; * Geometry is an object that contains an array of structures of values that * can be accessed as properties. */ -class Geometry : public Object, public Connectable +class Geometry : public BaseObject { public: @@ -74,7 +75,7 @@ public: /** * @copydoc Dali::Geometry::SetIndexBuffer() */ - void SetIndexBuffer( PropertyBuffer& indexBuffer ); + void SetIndexBuffer( const unsigned short* indices, size_t count ); /** * @copydoc Dali::Geometry::SetGeometryType() @@ -101,102 +102,13 @@ public: * * @return the geometry scene object */ - const SceneGraph::Geometry* GetGeometrySceneObject() const; + const Render::Geometry* GetRenderObject() const; -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; - -public: // Functions from Connectable - /** - * @copydoc Dali::Internal::Connectable::OnStage() - */ - virtual bool OnStage() const; - - /** - * @copydoc Dali::Internal::Connectable::Connect() - */ - virtual void Connect(); +private: // implementation /** - * @copydoc Dali::Internal::Connectable::Disconnect() + * Constructor */ - virtual void Disconnect(); - -private: // implementation Geometry(); /** @@ -205,6 +117,7 @@ private: // implementation void Initialize(); protected: + /** * A reference counted object may only be deleted by calling Unreference() */ @@ -216,15 +129,13 @@ private: // unimplemented methods private: // data - SceneGraph::Geometry* mSceneObject; + EventThreadServices& mEventThreadServices; /// mVertexBuffers; ///< Vector of intrusive pointers to vertex buffers - PropertyBufferPtr mIndexBuffer; ///< Intrusive pointer to index buffer - Dali::Geometry::GeometryType mGeometryType; ///< Geometry type (cached) bool mRequiresDepthTest; ///< Establish if geometry requires depth testing (cached) - bool mOnStage; }; } // namespace Internal diff --git a/dali/internal/event/rendering/renderer-impl.cpp b/dali/internal/event/rendering/renderer-impl.cpp index e109bf6..aa93136 100644 --- a/dali/internal/event/rendering/renderer-impl.cpp +++ b/dali/internal/event/rendering/renderer-impl.cpp @@ -26,6 +26,7 @@ #include #include #include +#include namespace Dali { @@ -74,15 +75,15 @@ RendererPtr Renderer::New() void Renderer::SetGeometry( Geometry& geometry ) { - mGeometryConnector.Set( geometry, OnStage() ); - const SceneGraph::Geometry* geometrySceneObject = geometry.GetGeometrySceneObject(); + mGeometry = &geometry; + const Render::Geometry* geometrySceneObject = geometry.GetRenderObject(); SetGeometryMessage( GetEventThreadServices(), *mSceneObject, *geometrySceneObject ); } Geometry* Renderer::GetGeometry() const { - return mGeometryConnector.Get().Get(); + return mGeometry.Get(); } void Renderer::SetTextures( TextureSet& textureSet ) @@ -629,7 +630,6 @@ void Renderer::Connect() if( mOnStageCount == 0 ) { OnStageConnectMessage( GetEventThreadServices(), *mSceneObject ); - mGeometryConnector.OnStageConnect(); mTextureSetConnector.OnStageConnect(); } ++mOnStageCount; @@ -641,7 +641,6 @@ void Renderer::Disconnect() if( mOnStageCount == 0 ) { OnStageDisconnectMessage( GetEventThreadServices(), *mSceneObject); - mGeometryConnector.OnStageDisconnect(); mTextureSetConnector.OnStageDisconnect(); } } diff --git a/dali/internal/event/rendering/renderer-impl.h b/dali/internal/event/rendering/renderer-impl.h index e66383e..aec6305 100644 --- a/dali/internal/event/rendering/renderer-impl.h +++ b/dali/internal/event/rendering/renderer-impl.h @@ -304,7 +304,7 @@ private: // unimplemented methods private: // data SceneGraph::Renderer* mSceneObject; Vector4* mBlendColor; ///< Local copy of blend color, pointer only as its rarely used - ObjectConnector mGeometryConnector; ///< Connector that holds the geometry used by this renderer + GeometryPtr mGeometry; ///< Connector that holds the geometry used by this renderer ObjectConnector mTextureSetConnector; ///< Connector that holds the texture set used by this renderer IntrusivePtr mShader; ///< Connector that holds the shader used by this renderer diff --git a/dali/internal/file.list b/dali/internal/file.list index 90de749..b60aeff 100644 --- a/dali/internal/file.list +++ b/dali/internal/file.list @@ -152,7 +152,6 @@ internal_src_files = \ $(internal_src_dir)/update/nodes/scene-graph-layer.cpp \ $(internal_src_dir)/update/render-tasks/scene-graph-render-task.cpp \ $(internal_src_dir)/update/render-tasks/scene-graph-render-task-list.cpp \ - $(internal_src_dir)/update/rendering/scene-graph-geometry.cpp \ $(internal_src_dir)/update/rendering/scene-graph-texture-set.cpp \ $(internal_src_dir)/update/rendering/scene-graph-renderer.cpp \ $(internal_src_dir)/update/resources/resource-manager.cpp diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp index 23868a2..04b90a3 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -53,8 +53,8 @@ namespace SceneGraph typedef OwnerContainer< Render::Renderer* > RendererOwnerContainer; typedef RendererOwnerContainer::Iterator RendererOwnerIter; -typedef OwnerContainer< RenderGeometry* > RenderGeometryOwnerContainer; -typedef RenderGeometryOwnerContainer::Iterator RenderGeometryOwnerIter; +typedef OwnerContainer< Render::Geometry* > GeometryOwnerContainer; +typedef GeometryOwnerContainer::Iterator GeometryOwnerIter; typedef OwnerContainer< Render::Sampler* > SamplerOwnerContainer; typedef SamplerOwnerContainer::Iterator SamplerOwnerIter; @@ -148,7 +148,7 @@ struct RenderManager::Impl 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 + GeometryOwnerContainer geometryContainer; ///< List of owned Geometries bool renderersAdded; @@ -334,21 +334,26 @@ void RenderManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffe propertyBuffer->SetData( data, size ); } -void RenderManager::AddGeometry( RenderGeometry* renderGeometry ) +void RenderManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ) { - mImpl->renderGeometryContainer.PushBack( renderGeometry ); + geometry->SetIndexBuffer( indices ); } -void RenderManager::RemoveGeometry( RenderGeometry* renderGeometry ) +void RenderManager::AddGeometry( Render::Geometry* geometry ) { - DALI_ASSERT_DEBUG( NULL != renderGeometry ); + mImpl->geometryContainer.PushBack( geometry ); +} + +void RenderManager::RemoveGeometry( Render::Geometry* geometry ) +{ + DALI_ASSERT_DEBUG( NULL != geometry ); - RenderGeometryOwnerContainer& geometries = mImpl->renderGeometryContainer; + GeometryOwnerContainer& geometries = mImpl->geometryContainer; // Find the geometry - for ( RenderGeometryOwnerIter iter = geometries.Begin(); iter != geometries.End(); ++iter ) + for ( GeometryOwnerIter iter = geometries.Begin(); iter != geometries.End(); ++iter ) { - if ( *iter == renderGeometry ) + if ( *iter == geometry ) { geometries.Erase( iter ); // Geometry found; now destroy it break; @@ -356,33 +361,33 @@ void RenderManager::RemoveGeometry( RenderGeometry* renderGeometry ) } } -void RenderManager::AddPropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer ) +void RenderManager::AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ) { - DALI_ASSERT_DEBUG( NULL != renderGeometry ); + DALI_ASSERT_DEBUG( NULL != geometry ); - RenderGeometryOwnerContainer& geometries = mImpl->renderGeometryContainer; + GeometryOwnerContainer& geometries = mImpl->geometryContainer; // Find the renderer - for ( RenderGeometryOwnerIter iter = geometries.Begin(); iter != geometries.End(); ++iter ) + for ( GeometryOwnerIter iter = geometries.Begin(); iter != geometries.End(); ++iter ) { - if ( *iter == renderGeometry ) + if ( *iter == geometry ) { - (*iter)->AddPropertyBuffer( propertyBuffer, isIndexBuffer ); + (*iter)->AddPropertyBuffer( propertyBuffer ); break; } } } -void RenderManager::RemovePropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer ) +void RenderManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ) { - DALI_ASSERT_DEBUG( NULL != renderGeometry ); + DALI_ASSERT_DEBUG( NULL != geometry ); - RenderGeometryOwnerContainer& geometries = mImpl->renderGeometryContainer; + GeometryOwnerContainer& geometries = mImpl->geometryContainer; // Find the renderer - for ( RenderGeometryOwnerIter iter = geometries.Begin(); iter != geometries.End(); ++iter ) + for ( GeometryOwnerIter iter = geometries.Begin(); iter != geometries.End(); ++iter ) { - if ( *iter == renderGeometry ) + if ( *iter == geometry ) { (*iter)->RemovePropertyBuffer( propertyBuffer ); break; @@ -390,12 +395,12 @@ void RenderManager::RemovePropertyBuffer( RenderGeometry* renderGeometry, Render } } -void RenderManager::SetGeometryType( RenderGeometry* geometry, int type ) +void RenderManager::SetGeometryType( Render::Geometry* geometry, unsigned int geometryType ) { - geometry->SetGeometryType( static_cast(type) ); + geometry->SetGeometryType( Render::Geometry::GeometryType(geometryType) ); } -void RenderManager::SetGeometryRequiresDepthTest( RenderGeometry* geometry, bool requiresDepthTest ) +void RenderManager::SetGeometryRequiresDepthTest( Render::Geometry* geometry, bool requiresDepthTest ) { geometry->SetRequiresDepthTest( requiresDepthTest ); } @@ -493,7 +498,7 @@ bool RenderManager::Render( Integration::RenderStatus& status ) } //Notify RenderGeometries that rendering has finished - for ( RenderGeometryOwnerIter iter = mImpl->renderGeometryContainer.Begin(); iter != mImpl->renderGeometryContainer.End(); ++iter ) + for ( GeometryOwnerIter iter = mImpl->geometryContainer.Begin(); iter != mImpl->geometryContainer.End(); ++iter ) { (*iter)->OnRenderFinished(); } diff --git a/dali/internal/render/common/render-manager.h b/dali/internal/render/common/render-manager.h index a3bb7f5..ad4c059 100644 --- a/dali/internal/render/common/render-manager.h +++ b/dali/internal/render/common/render-manager.h @@ -49,6 +49,7 @@ namespace Render class Renderer; class Sampler; class RenderTracker; +class Geometry; } namespace SceneGraph @@ -58,7 +59,6 @@ class TextureCache; class RenderInstruction; class RenderInstructionContainer; class Shader; -class RenderGeometry; class PropertyBufferDataProvider; /** @@ -208,30 +208,29 @@ public: * @param[in] geometry The geometry to add. * @post geometry is owned by RenderManager */ - void AddGeometry( RenderGeometry* geometry ); + void AddGeometry( Render::Geometry* geometry ); /** * Remove a geometry from the render manager. * @param[in] geometry The geometry to remove. * @post geometry is destroyed. */ - void RemoveGeometry( RenderGeometry* geometry ); + void RemoveGeometry( Render::Geometry* geometry ); /** - * Adds a property buffer to a RenderGeometry from the render manager. + * Adds a property buffer to a geometry from the render manager. * @param[in] geometry The geometry * @param[in] propertyBuffer The property buffer to remove. - * @param[in] isIndexBuffer True if the property buffer is intended to be used as an index buffer */ - void AddPropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer ); + void AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); /** - * Remove a property buffer from a RenderGeometry from the render manager. + * Remove a property buffer from a Render::Geometry from the render manager. * @param[in] geometry The geometry * @param[in] propertyBuffer The property buffer to remove. * @post property buffer is destroyed. */ - void RemovePropertyBuffer( RenderGeometry* renderGeometry, Render::PropertyBuffer* propertyBuffer ); + void RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); /** * Sets the format of an existing property buffer @@ -249,18 +248,25 @@ public: void SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, Dali::Vector* data, size_t size ); /** + * Sets the data for the index buffer of an existing geometry + * @param[in] geometry The geometry + * @param[in] data A vector containing the indices + */ + void SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& data ); + + /** * Set the geometry type of an existing render geometry * @param[in] geometry The render geometry * @param[in] geometryType The new geometry type */ - void SetGeometryType( RenderGeometry* geometry, int geometryType ); + void SetGeometryType( Render::Geometry* geometry, unsigned int geometryType ); /** * Set if an existing geometry requires depth testing * @param[in] geometry The render geometry * @param[in] requiresDepthTest True if depth testing is required, false otherwise */ - void SetGeometryRequiresDepthTest( RenderGeometry* geometry, bool requiresDepthTest ); + void SetGeometryRequiresDepthTest( Render::Geometry* geometry, bool requiresDepthTest ); /** * Adds a render tracker to the RenderManager. RenderManager takes ownership of the diff --git a/dali/internal/render/gl-resources/gpu-buffer.cpp b/dali/internal/render/gl-resources/gpu-buffer.cpp index eb2f3d0..257b12a 100644 --- a/dali/internal/render/gl-resources/gpu-buffer.cpp +++ b/dali/internal/render/gl-resources/gpu-buffer.cpp @@ -98,15 +98,6 @@ void GpuBuffer::UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usag GLenum glTargetEnum = GL_ARRAY_BUFFER; - if(ELEMENT_ARRAY_BUFFER == target) - { - glTargetEnum = GL_ELEMENT_ARRAY_BUFFER; - } - else if(TRANSFORM_FEEDBACK_BUFFER == target) - { - glTargetEnum = GL_TRANSFORM_FEEDBACK_BUFFER; - } - // make sure the buffer is bound, don't perform any checks because size may be zero if(ARRAY_BUFFER == target) { @@ -114,10 +105,12 @@ void GpuBuffer::UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usag } else if(ELEMENT_ARRAY_BUFFER == target) { + glTargetEnum = GL_ELEMENT_ARRAY_BUFFER; mContext.BindElementArrayBuffer( mBufferId ); } else if(TRANSFORM_FEEDBACK_BUFFER == target) { + glTargetEnum = GL_TRANSFORM_FEEDBACK_BUFFER; mContext.BindTransformFeedbackBuffer( mBufferId ); } diff --git a/dali/internal/render/renderers/render-geometry.cpp b/dali/internal/render/renderers/render-geometry.cpp index 24a9522..0fc5c78 100644 --- a/dali/internal/render/renderers/render-geometry.cpp +++ b/dali/internal/render/renderers/render-geometry.cpp @@ -25,66 +25,60 @@ namespace Dali { namespace Internal { -namespace SceneGraph +namespace Render { -RenderGeometry::RenderGeometry( GeometryType type, bool requiresDepthTest ) -: mIndexBuffer(0), - mGeometryType( type ), - mRequiresDepthTest(requiresDepthTest ), +Geometry::Geometry() +: mIndices(), + mIndexBuffer(NULL), + mGeometryType( Dali::Geometry::TRIANGLES ), + mIndicesChanged(false), + mRequiresDepthTest(false ), mHasBeenUpdated(false), mAttributesChanged(true) { } -RenderGeometry::~RenderGeometry() +Geometry::~Geometry() { } -void RenderGeometry::GlContextCreated( Context& context ) +void Geometry::GlContextCreated( Context& context ) { } -void RenderGeometry::GlContextDestroyed() +void Geometry::GlContextDestroyed() { } -void RenderGeometry::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer ) +void Geometry::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer ) { - if( isIndexBuffer ) - { - mIndexBuffer = propertyBuffer; - } - else - { - mVertexBuffers.PushBack( propertyBuffer ); - mAttributesChanged = true; - } + mVertexBuffers.PushBack( propertyBuffer ); + mAttributesChanged = true; } -void RenderGeometry::RemovePropertyBuffer( const Render::PropertyBuffer* propertyBuffer ) +void Geometry::SetIndexBuffer( Dali::Vector& indices ) { - if( propertyBuffer == mIndexBuffer ) - { - mIndexBuffer = 0; - } - else + mIndices.Swap( indices ); + mIndicesChanged = true; +} + +void Geometry::RemovePropertyBuffer( const Render::PropertyBuffer* propertyBuffer ) +{ + size_t bufferCount = mVertexBuffers.Size(); + for( size_t i(0); i& attributeLocation, Program& program, BufferIndex bufferIndex ) const +void Geometry::GetAttributeLocationFromProgram( Vector& attributeLocation, Program& program, BufferIndex bufferIndex ) const { attributeLocation.Clear(); @@ -107,13 +101,13 @@ void RenderGeometry::GetAttributeLocationFromProgram( Vector& attributeLo } } -void RenderGeometry::OnRenderFinished() +void Geometry::OnRenderFinished() { mHasBeenUpdated = false; mAttributesChanged = false; } -void RenderGeometry::UploadAndDraw( +void Geometry::UploadAndDraw( Context& context, BufferIndex bufferIndex, Vector& attributeLocation, @@ -123,18 +117,29 @@ void RenderGeometry::UploadAndDraw( if( !mHasBeenUpdated ) { // Update buffers - if( mIndexBuffer ) + if( mIndicesChanged ) { - if(!mIndexBuffer->Update( context, true ) ) + if( mIndices.Empty() ) { - //Index buffer is not ready ( Size, data or format has not been specified yet ) - return; + mIndexBuffer = NULL; + } + else + { + if ( mIndexBuffer == NULL ) + { + mIndexBuffer = new GpuBuffer( context ); + } + + std::size_t bufferSize = sizeof( unsigned short ) * mIndices.Size(); + mIndexBuffer->UpdateDataBuffer( bufferSize, &mIndices[0], GpuBuffer::STATIC_DRAW, GpuBuffer::ELEMENT_ARRAY_BUFFER ); } + + mIndicesChanged = false; } for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i ) { - if( !mVertexBuffers[i]->Update( context, false ) ) + if( !mVertexBuffers[i]->Update( context ) ) { //Vertex buffer is not ready ( Size, data or format has not been specified yet ) return; @@ -145,116 +150,67 @@ void RenderGeometry::UploadAndDraw( } //Bind buffers to attribute locations - unsigned int base = 0; - for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i ) + unsigned int base = 0u; + size_t vertexBufferCount(mVertexBuffers.Count()); + for( unsigned int i = 0; i < vertexBufferCount; ++i ) { mVertexBuffers[i]->BindBuffer( GpuBuffer::ARRAY_BUFFER ); base += mVertexBuffers[i]->EnableVertexAttributes( context, attributeLocation, base ); } - if( mIndexBuffer ) - { - mIndexBuffer->BindBuffer( GpuBuffer::ELEMENT_ARRAY_BUFFER ); - } - - //Bind index buffer + GLenum geometryGLType(0); unsigned int numIndices(0u); intptr_t firstIndexOffset(0u); if( mIndexBuffer ) { - numIndices = mIndexBuffer->GetDataSize() / mIndexBuffer->GetElementSize(); + numIndices = mIndices.Size(); + + if( elementBufferOffset ) + { + elementBufferOffset = elementBufferOffset >= numIndices ? numIndices- 1 : elementBufferOffset; + firstIndexOffset = elementBufferOffset * sizeof(GLushort); + } if ( elementBufferCount ) { - numIndices = elementBufferCount > numIndices ? numIndices : elementBufferCount; + numIndices = std::min( elementBufferCount, numIndices - elementBufferOffset ); } - firstIndexOffset = elementBufferOffset * sizeof(GLushort); } - //Draw call switch(mGeometryType) { case Dali::Geometry::TRIANGLES: { - if( numIndices ) - { - context.DrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast(firstIndexOffset) ); - } - else - { - unsigned int numVertices = mVertexBuffers[0]->GetElementCount(); - context.DrawArrays( GL_TRIANGLES, 0, numVertices ); - } + geometryGLType = GL_TRIANGLES; break; } case Dali::Geometry::LINES: { - if( numIndices ) - { - context.DrawElements(GL_LINES, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast(firstIndexOffset) ); - } - else - { - unsigned int numVertices = mVertexBuffers[0]->GetElementCount(); - context.DrawArrays( GL_LINES, 0, numVertices ); - } + geometryGLType = GL_LINES; break; } case Dali::Geometry::POINTS: { - unsigned int numVertices = mVertexBuffers[0]->GetElementCount(); - context.DrawArrays(GL_POINTS, 0, numVertices ); + geometryGLType = GL_POINTS; break; } case Dali::Geometry::TRIANGLE_STRIP: { - if( numIndices ) - { - context.DrawElements(GL_TRIANGLE_STRIP, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast(firstIndexOffset) ); - } - else - { - unsigned int numVertices = mVertexBuffers[0]->GetElementCount(); - context.DrawArrays(GL_TRIANGLE_STRIP, 0, numVertices ); - } + geometryGLType = GL_TRIANGLE_STRIP; break; } case Dali::Geometry::TRIANGLE_FAN: { - if( numIndices ) - { - context.DrawElements(GL_TRIANGLE_FAN, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast(firstIndexOffset) ); - } - else - { - unsigned int numVertices = mVertexBuffers[0]->GetElementCount(); - context.DrawArrays(GL_TRIANGLE_FAN, 0, numVertices ); - } + geometryGLType = GL_TRIANGLE_FAN; break; } case Dali::Geometry::LINE_LOOP: { - if( numIndices ) - { - context.DrawElements(GL_LINE_LOOP, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast(firstIndexOffset) ); - } - else - { - unsigned int numVertices = mVertexBuffers[0]->GetElementCount(); - context.DrawArrays(GL_LINE_LOOP, 0, numVertices ); - } + geometryGLType = GL_LINE_LOOP; break; } case Dali::Geometry::LINE_STRIP: { - if( numIndices ) - { - context.DrawElements(GL_LINE_STRIP, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast(firstIndexOffset) ); - } - else - { - unsigned int numVertices = mVertexBuffers[0]->GetElementCount(); - context.DrawArrays(GL_LINE_STRIP, 0, numVertices ); - } + geometryGLType = GL_LINE_STRIP; break; } default: @@ -264,7 +220,26 @@ void RenderGeometry::UploadAndDraw( } } - //Disable atrributes + //Draw call + if( mIndexBuffer && geometryGLType != GL_POINTS ) + { + //Indexed draw call + mIndexBuffer->Bind( GpuBuffer::ELEMENT_ARRAY_BUFFER ); + context.DrawElements(geometryGLType, numIndices, GL_UNSIGNED_SHORT, reinterpret_cast(firstIndexOffset)); + } + else + { + //Unindex draw call + unsigned int numVertices(0u); + if( vertexBufferCount > 0 ) + { + numVertices = mVertexBuffers[0]->GetElementCount(); + } + + context.DrawArrays( geometryGLType, 0, numVertices ); + } + + //Disable attributes for( unsigned int i = 0; i < attributeLocation.Count(); ++i ) { if( attributeLocation[i] != -1 ) diff --git a/dali/internal/render/renderers/render-geometry.h b/dali/internal/render/renderers/render-geometry.h index 549c827..f9777f4 100644 --- a/dali/internal/render/renderers/render-geometry.h +++ b/dali/internal/render/renderers/render-geometry.h @@ -1,5 +1,5 @@ -#ifndef DALI_INTERNAL_SCENE_GRAPH_RENDER_GEOMETRY_H -#define DALI_INTERNAL_SCENE_GRAPH_RENDER_GEOMETRY_H +#ifndef DALI_INTERNAL_RENDER_GEOMETRY_H +#define DALI_INTERNAL_RENDER_GEOMETRY_H /* * Copyright (c) 2015 Samsung Electronics Co., Ltd. @@ -19,11 +19,14 @@ #include #include +#include +#include #include #include #include #include -#include +#include + namespace Dali { @@ -36,32 +39,23 @@ class GpuBuffer; namespace Render { class PropertyBuffer; -} - -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 RenderGeometry +class Geometry { public: + typedef Dali::Geometry::GeometryType GeometryType; + + Geometry(); - typedef SceneGraph::Geometry::GeometryType GeometryType; - /** - * Constructor. Creates a render geometry object with no GPU buffers. - * @param[in] center The center of the geometry - * @param[in] geometryType The geometry type - * @param[in] requiresDepthTest True if geometry requires depth testing, false otherwise - */ - RenderGeometry( GeometryType geometryType, bool requiresDepthTest ); /** * Destructor */ - ~RenderGeometry(); + ~Geometry(); /** * Called on Gl Context created @@ -76,9 +70,14 @@ public: /** * Adds a property buffer to the geometry * @param[in] dataProvider The PropertyBuffer data provider - * @param[in] isIndexBuffer True if the property buffer is intended to be used as an index buffer */ - void AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer ); + void AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer ); + + /** + * Set the data for the index buffer to be used by the geometry + * @param[in] indices A vector containing the indices + */ + void SetIndexBuffer( Dali::Vector& indices ); /** * Removes a PropertyBuffer from the geometry @@ -153,20 +152,22 @@ public: private: // PropertyBuffers - Render::PropertyBuffer* mIndexBuffer; - Vector mVertexBuffers; + Vector< Render::PropertyBuffer* > mVertexBuffers; - GeometryType mGeometryType; + Dali::Vector< unsigned short> mIndices; + OwnerPointer< GpuBuffer > mIndexBuffer; + GeometryType mGeometryType; // Booleans + bool mIndicesChanged : 1; bool mRequiresDepthTest : 1; bool mHasBeenUpdated : 1; bool mAttributesChanged : 1; }; -} // namespace SceneGraph +} // namespace Render } // namespace Internal } // namespace Dali -#endif // DALI_INTERNAL_SCENE_GRAPH_SAMPLER_DATA_PROVIDER_H +#endif // DALI_INTERNAL_RENDER_GEOMETRY_H diff --git a/dali/internal/render/renderers/render-property-buffer.cpp b/dali/internal/render/renderers/render-property-buffer.cpp index eb17d9e..6be4623 100644 --- a/dali/internal/render/renderers/render-property-buffer.cpp +++ b/dali/internal/render/renderers/render-property-buffer.cpp @@ -125,7 +125,7 @@ void PropertyBuffer::SetData( Dali::Vector* data, size_t size ) mDataChanged = true; } -bool PropertyBuffer::Update( Context& context, bool isIndexBuffer ) +bool PropertyBuffer::Update( Context& context ) { if( !mData || !mFormat || !mSize ) { @@ -143,31 +143,7 @@ bool PropertyBuffer::Update( Context& context, bool isIndexBuffer ) if ( mGpuBuffer ) { DALI_ASSERT_DEBUG( mSize && "No data in the property buffer!" ); - - const void *data = &((*mData)[0]); - std::size_t dataSize = GetDataSize(); - - // Index buffer needs to be unsigned short which is not supported by the property system - Vector ushortData; - if( isIndexBuffer ) - { - ushortData.Resize(mSize); - const unsigned int* unsignedData = static_cast(data); - for( unsigned int i = 0; i < mSize; ++i ) - { - ushortData[i] = unsignedData[i]; - } - data = &(ushortData[0]); - dataSize = ushortData.Size() * sizeof( unsigned short ); - } - - GpuBuffer::Target target = GpuBuffer::ARRAY_BUFFER; - if(isIndexBuffer) - { - target = GpuBuffer::ELEMENT_ARRAY_BUFFER; - } - mGpuBuffer->UpdateDataBuffer( dataSize, data, GpuBuffer::STATIC_DRAW, target ); - + mGpuBuffer->UpdateDataBuffer( GetDataSize(), &((*mData)[0]), GpuBuffer::STATIC_DRAW, GpuBuffer::ARRAY_BUFFER ); } mDataChanged = false; diff --git a/dali/internal/render/renderers/render-property-buffer.h b/dali/internal/render/renderers/render-property-buffer.h index 5cc92f4..86c74ff 100644 --- a/dali/internal/render/renderers/render-property-buffer.h +++ b/dali/internal/render/renderers/render-property-buffer.h @@ -93,9 +93,8 @@ public: /** * 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 ); + bool Update( Context& context ); /** * Enable the vertex attributes for each vertex buffer from the corresponding diff --git a/dali/internal/render/renderers/render-renderer.cpp b/dali/internal/render/renderers/render-renderer.cpp index ab85957..1edc017 100644 --- a/dali/internal/render/renderers/render-renderer.cpp +++ b/dali/internal/render/renderers/render-renderer.cpp @@ -111,17 +111,17 @@ namespace Render { Renderer* Renderer::New( SceneGraph::RenderDataProvider* dataProvider, - SceneGraph::RenderGeometry* renderGeometry, + Render::Geometry* geometry, unsigned int blendingBitmask, const Vector4* blendColor, Dali::Renderer::FaceCullingMode faceCullingMode, bool preMultipliedAlphaEnabled ) { - return new Renderer( dataProvider, renderGeometry, blendingBitmask, blendColor, faceCullingMode, preMultipliedAlphaEnabled ); + return new Renderer( dataProvider, geometry, blendingBitmask, blendColor, faceCullingMode, preMultipliedAlphaEnabled ); } Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider, - SceneGraph::RenderGeometry* renderGeometry, + Render::Geometry* geometry, unsigned int blendingBitmask, const Vector4* blendColor, Dali::Renderer::FaceCullingMode faceCullingMode, @@ -130,7 +130,7 @@ Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider, mContext(NULL), mTextureCache( NULL ), mUniformNameCache( NULL ), - mRenderGeometry( renderGeometry ), + mGeometry( geometry ), mUniformIndexMap(), mAttributesLocation(), mBlendingOptions(), @@ -169,9 +169,9 @@ void Renderer::SetRenderDataProvider( SceneGraph::RenderDataProvider* dataProvid mUpdateAttributesLocation = true; } -void Renderer::SetGeometry( SceneGraph::RenderGeometry* renderGeometry ) +void Renderer::SetGeometry( Render::Geometry* geometry ) { - mRenderGeometry = renderGeometry; + mGeometry = geometry; mUpdateAttributesLocation = true; } @@ -180,7 +180,7 @@ void Renderer::SetGeometry( SceneGraph::RenderGeometry* renderGeometry ) // @todo MESH_REWORK Should use Update thread objects only in PrepareRenderInstructions. bool Renderer::RequiresDepthTest() const { - return mRenderGeometry->RequiresDepthTest(); + return mGeometry->RequiresDepthTest(); } void Renderer::SetBlending( Context& context, bool blend ) @@ -213,7 +213,7 @@ void Renderer::SetBlending( Context& context, bool blend ) void Renderer::GlContextDestroyed() { - mRenderGeometry->GlContextDestroyed(); + mGeometry->GlContextDestroyed(); } void Renderer::GlCleanup() @@ -495,15 +495,15 @@ void Renderer::Render( Context& context, } } - SetUniforms( bufferIndex, node, size, *program ); + SetUniforms( bufferIndex, node, size, *program ); - if( mUpdateAttributesLocation || mRenderGeometry->AttributesChanged() ) + if( mUpdateAttributesLocation || mGeometry->AttributesChanged() ) { - mRenderGeometry->GetAttributeLocationFromProgram( mAttributesLocation, *program, bufferIndex ); + mGeometry->GetAttributeLocationFromProgram( mAttributesLocation, *program, bufferIndex ); mUpdateAttributesLocation = false; } - mRenderGeometry->UploadAndDraw( context, bufferIndex, mAttributesLocation, mIndexedDrawFirstElement, mIndexedDrawElementsCount ); + mGeometry->UploadAndDraw( context, bufferIndex, mAttributesLocation, mIndexedDrawFirstElement, mIndexedDrawElementsCount ); } } @@ -520,7 +520,7 @@ void Renderer::SetSortAttributes( BufferIndex bufferIndex, SceneGraph::RendererW sortAttributes.textureResourceId = Integration::InvalidResourceId; } - sortAttributes.geometry = mRenderGeometry; + sortAttributes.geometry = mGeometry; } } // namespace SceneGraph diff --git a/dali/internal/render/renderers/render-renderer.h b/dali/internal/render/renderers/render-renderer.h index d1cd70b..9c6b5b4 100644 --- a/dali/internal/render/renderers/render-renderer.h +++ b/dali/internal/render/renderers/render-renderer.h @@ -24,11 +24,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include namespace Dali @@ -75,14 +77,14 @@ public: /** * Create a new renderer instance * @param[in] dataProviders The data providers for the renderer - * @param[in] renderGeometry The geometry for the renderer + * @param[in] geometry The geometry for the renderer * @param[in] blendingBitmask A bitmask of blending options. * @param[in] blendColor The blend color to pass to GL * @param[in] faceCullingMode The face-culling mode. * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied. */ static Renderer* New( SceneGraph::RenderDataProvider* dataProviders, - SceneGraph::RenderGeometry* renderGeometry, + Render::Geometry* geometry, unsigned int blendingBitmask, const Vector4* blendColor, Dali::Renderer::FaceCullingMode faceCullingMode, @@ -91,14 +93,14 @@ public: /** * Constructor. * @param[in] dataProviders The data providers for the renderer - * @param[in] renderGeometry The geometry for the renderer + * @param[in] geometry The geometry for the renderer * @param[in] blendingBitmask A bitmask of blending options. * @param[in] blendColor The blend color to pass to GL * @param[in] faceCullingMode The face-culling mode. * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied. */ Renderer( SceneGraph::RenderDataProvider* dataProviders, - SceneGraph::RenderGeometry* renderGeometry, + Render::Geometry* geometry, unsigned int blendingBitmask, const Vector4* blendColor, Dali::Renderer::FaceCullingMode faceCullingMode, @@ -112,9 +114,9 @@ public: /** * Change the geometry used by the renderer - * @param[in] renderGeometry The new geometry + * @param[in] geometry The new geometry */ - void SetGeometry( SceneGraph::RenderGeometry* renderGeometry ); + void SetGeometry( Render::Geometry* geometry ); /** * Second-phase construction. * This is called when the renderer is inside render thread @@ -256,7 +258,7 @@ private: Context* mContext; SceneGraph::TextureCache* mTextureCache; Render::UniformNameCache* mUniformNameCache; - SceneGraph::RenderGeometry* mRenderGeometry; + Render::Geometry* mGeometry; struct UniformIndexMap { diff --git a/dali/internal/update/common/discard-queue.cpp b/dali/internal/update/common/discard-queue.cpp index 8cdf262..5fd4954 100644 --- a/dali/internal/update/common/discard-queue.cpp +++ b/dali/internal/update/common/discard-queue.cpp @@ -78,23 +78,6 @@ void DiscardQueue::Add( BufferIndex updateBufferIndex, Renderer* renderer ) } } -void DiscardQueue::Add( BufferIndex updateBufferIndex, Geometry* geometry ) -{ - DALI_ASSERT_DEBUG( NULL != geometry ); - - // The GL resources will now be freed in frame N - // The Update for frame N+1 may occur in parallel with the rendering of frame N - // Queue the node for destruction in frame N+2 - if ( 0u == updateBufferIndex ) - { - mGeometryQueue0.PushBack( geometry ); - } - else - { - mGeometryQueue1.PushBack( geometry ); - } -} - void DiscardQueue::Add( BufferIndex updateBufferIndex, TextureSet* textureSet ) { DALI_ASSERT_DEBUG( NULL != textureSet ); @@ -140,7 +123,6 @@ void DiscardQueue::Clear( BufferIndex updateBufferIndex ) { mNodeQueue0.Clear(); mShaderQueue0.Clear(); - mGeometryQueue0.Clear(); mTextureSetQueue0.Clear(); mRendererQueue0.Clear(); } @@ -148,7 +130,6 @@ void DiscardQueue::Clear( BufferIndex updateBufferIndex ) { mNodeQueue1.Clear(); mShaderQueue1.Clear(); - mGeometryQueue1.Clear(); mTextureSetQueue1.Clear(); mRendererQueue1.Clear(); } diff --git a/dali/internal/update/common/discard-queue.h b/dali/internal/update/common/discard-queue.h index 268ae57..c9cb7d0 100644 --- a/dali/internal/update/common/discard-queue.h +++ b/dali/internal/update/common/discard-queue.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #include @@ -55,7 +54,6 @@ class DiscardQueue public: typedef OwnerContainer< Shader* > ShaderQueue; - typedef OwnerContainer< Geometry* > GeometryQueue; typedef OwnerContainer< TextureSet* > TextureSetQueue; typedef OwnerContainer< Renderer* > RendererQueue; @@ -80,12 +78,6 @@ public: void Add( BufferIndex updateBufferIndex, Node* node ); /** - * Adds an unwanted geometry to the discard queue. - * A message will be sent to clean up GL resources in the next Render - */ - void Add( BufferIndex updateBufferIndex, Geometry* geometry ); - - /** * Adds an unwanted texture set to the discard queue. * A message will be sent to clean up GL resources in the next Render. */ @@ -130,14 +122,12 @@ private: // Messages are queued here when the update buffer index == 0 NodeOwnerContainer mNodeQueue0; ShaderQueue mShaderQueue0; - GeometryQueue mGeometryQueue0; TextureSetQueue mTextureSetQueue0; RendererQueue mRendererQueue0; // Messages are queued here when the update buffer index == 1 NodeOwnerContainer mNodeQueue1; ShaderQueue mShaderQueue1; - GeometryQueue mGeometryQueue1; TextureSetQueue mTextureSetQueue1; RendererQueue mRendererQueue1; }; diff --git a/dali/internal/update/controllers/render-message-dispatcher.cpp b/dali/internal/update/controllers/render-message-dispatcher.cpp index 39798c5..1e146d0 100644 --- a/dali/internal/update/controllers/render-message-dispatcher.cpp +++ b/dali/internal/update/controllers/render-message-dispatcher.cpp @@ -65,72 +65,6 @@ void RenderMessageDispatcher::RemoveRenderer( Render::Renderer& renderer ) new (slot) DerivedType( &mRenderManager, &RenderManager::RemoveRenderer, &renderer ); } -void RenderMessageDispatcher::AddGeometry( RenderGeometry& renderGeometry ) -{ - typedef MessageValue1< RenderManager, RenderGeometry* > 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::AddGeometry, &renderGeometry ); -} - -void RenderMessageDispatcher::RemoveGeometry( RenderGeometry& renderGeometry ) -{ - typedef MessageValue1< RenderManager, RenderGeometry* > 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::RemoveGeometry, &renderGeometry ); -} - -void RenderMessageDispatcher::AddPropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer ) -{ - 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, isIndexBuffer); -} - -void RenderMessageDispatcher::RemovePropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer ) -{ - typedef MessageValue2< RenderManager, RenderGeometry*, Render::PropertyBuffer* > 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::RemovePropertyBuffer, &renderGeometry, propertyBuffer ); -} - -void RenderMessageDispatcher::SetGeometryType( RenderGeometry& geometry, int geometryType ) -{ - typedef MessageValue2< RenderManager, RenderGeometry*, int > 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::SetGeometryType, &geometry, geometryType ); -} - -void RenderMessageDispatcher::SetGeometryRequiresDepthTest( RenderGeometry& geometry, bool requiresDepthTest ) -{ - typedef MessageValue2< RenderManager, RenderGeometry*, 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::SetGeometryRequiresDepthTest, &geometry, requiresDepthTest ); -} - void RenderMessageDispatcher::AddRenderTracker( Render::RenderTracker& renderTracker ) { typedef MessageValue1< RenderManager, Render::RenderTracker* > DerivedType; diff --git a/dali/internal/update/controllers/render-message-dispatcher.h b/dali/internal/update/controllers/render-message-dispatcher.h index 70be8cf..3554754 100644 --- a/dali/internal/update/controllers/render-message-dispatcher.h +++ b/dali/internal/update/controllers/render-message-dispatcher.h @@ -40,7 +40,6 @@ namespace SceneGraph class RenderManager; class RenderQueue; -class RenderGeometry; class PropertyBufferDataProvider; /** * A utility class for sending messages to the render-thread. @@ -74,50 +73,6 @@ public: void RemoveRenderer( Render::Renderer& renderer ); /** - * Add a Geometry - * @param[in] renderGeometry The geometry to add. - * @post RenderGeometry ownership is transferred. - */ - void AddGeometry( RenderGeometry& renderGeometry ); - - /** - * Remove a Geometry. - * @param[in] renderGeometry The geometry to remove. - * @post RenderGeometry will be destroyed in the next Render. - */ - void RemoveGeometry( RenderGeometry& renderGeometry ); - - /** - * Add a PropertyBuffer. - * @param[in] renderGeometry The geometry - * @param[in] propertyBuffer The PropertyBuffer - * @param[in] isIndexBuffer True if the buffer is intended to be used as an index buffer - */ - void AddPropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer ); - - /** - * Remove a PropertyBuffer. - * @param[in] renderGeometry The geometry - * @param[in] propertyBuffer The PropertyBuffer - * @post PropertyBuffer will be destroyed in the next Render. - */ - void RemovePropertyBuffer( RenderGeometry& renderGeometry, Render::PropertyBuffer* propertyBuffer ); - - /** - * Set the geometry type of an existing render geometry - * @param[in] geometry The render geometry - * @param[in] geometryType The new geometry type - */ - void SetGeometryType( RenderGeometry& geometry, int geometryType ); - - /** - * Set if an existing geometry requires depth testing - * @param[in] geometry The render geometry - * @param[in] requiresDepthTest True if depth testing is required, false otherwise - */ - void SetGeometryRequiresDepthTest( RenderGeometry& geometry, bool requiresDepthTest ); - - /** * Add a Render tracker. * @param[in] renderTracker The render tracker to add. * @post ownership is transferred diff --git a/dali/internal/update/manager/prepare-render-instructions.cpp b/dali/internal/update/manager/prepare-render-instructions.cpp index 1745827..4f3e2e9 100644 --- a/dali/internal/update/manager/prepare-render-instructions.cpp +++ b/dali/internal/update/manager/prepare-render-instructions.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include diff --git a/dali/internal/update/manager/prepare-render-instructions.h b/dali/internal/update/manager/prepare-render-instructions.h index c61f04c..860d2a0 100644 --- a/dali/internal/update/manager/prepare-render-instructions.h +++ b/dali/internal/update/manager/prepare-render-instructions.h @@ -29,12 +29,16 @@ namespace Dali namespace Internal { +namespace Render +{ +class Geometry; +} + namespace SceneGraph { class RenderTracker; class RenderItem; class Shader; -class RenderGeometry; /** * Structure to store information for sorting the renderers. @@ -54,7 +58,7 @@ struct RendererWithSortAttributes RenderItem* renderItem; ///< The render item that is being sorted (includes depth index) const Shader* shader; ///< The shader instance Integration::ResourceId textureResourceId;///< The first texture resource ID of the texture set instance, is InvalidResourceId if the texture set doesn't have any textures - const RenderGeometry* geometry; ///< The geometry instance + const Render::Geometry* geometry; ///< The geometry instance float zValue; ///< The zValue of the given renderer (either distance from camera, or a custom calculated value) }; diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index 0fbd58c..c414c4e 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -57,7 +57,6 @@ #include #include #include -#include #include #include @@ -151,7 +150,6 @@ struct UpdateManager::Impl root( NULL ), systemLevelRoot( NULL ), renderers( sceneGraphBuffers, discardQueue ), - geometries( sceneGraphBuffers, discardQueue ), textureSets( sceneGraphBuffers, discardQueue ), messageQueue( renderController, sceneGraphBuffers ), keepRenderingSeconds( 0.0f ), @@ -165,7 +163,6 @@ struct UpdateManager::Impl sceneController = new SceneControllerImpl( renderMessageDispatcher, renderQueue, discardQueue, textureCache ); renderers.SetSceneController( *sceneController ); - geometries.SetSceneController( *sceneController ); textureSets.SetSceneController( *sceneController ); // create first 'dummy' node @@ -252,7 +249,6 @@ struct UpdateManager::Impl PropertyNotificationContainer propertyNotifications; ///< A container of owner property notifications. ObjectOwnerContainer renderers; - ObjectOwnerContainer geometries; ///< A container of geometries ObjectOwnerContainer textureSets; ///< A container of texture sets ShaderContainer shaders; ///< A container of owned shaders @@ -496,11 +492,6 @@ void UpdateManager::PropertyNotificationSetNotify( PropertyNotification* propert propertyNotification->SetNotifyMode( notifyMode ); } -ObjectOwnerContainer& UpdateManager::GetGeometryOwner() -{ - return mImpl->geometries; -} - ObjectOwnerContainer& UpdateManager::GetRendererOwner() { return mImpl->renderers; @@ -686,7 +677,6 @@ void UpdateManager::ResetProperties( BufferIndex bufferIndex ) } mImpl->textureSets.ResetToBaseValues( bufferIndex ); - mImpl->geometries.ResetToBaseValues( bufferIndex ); mImpl->renderers.ResetToBaseValues( bufferIndex ); // Reset animatable shader properties to base values @@ -959,10 +949,9 @@ unsigned int UpdateManager::Update( float elapsedSeconds, //This will populate each Layer with a list of renderers which are ready. UpdateNodes( bufferIndex ); - //Apply constraints to RenderTasks, shaders and geometries + //Apply constraints to RenderTasks, shaders ConstrainRenderTasks( bufferIndex ); ConstrainShaders( bufferIndex ); - mImpl->geometries.ConstrainObjects( bufferIndex ); //Update renderers and apply constraints UpdateRenderers( bufferIndex ); @@ -1215,6 +1204,84 @@ void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffe new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetPropertyBufferData, propertyBuffer, data, size ); } +void UpdateManager::AddGeometry( Render::Geometry* geometry ) +{ + typedef MessageValue1< RenderManager, Render::Geometry* > 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::AddGeometry, geometry ); +} + +void UpdateManager::RemoveGeometry( Render::Geometry* geometry ) +{ + typedef MessageValue1< RenderManager, Render::Geometry* > 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::RemoveGeometry, geometry ); +} + +void UpdateManager::SetGeometryRequiresDepthTest( Render::Geometry* geometry, bool requiresDepthTest ) +{ + typedef MessageValue2< RenderManager, Render::Geometry*, bool > 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::SetGeometryRequiresDepthTest, geometry, requiresDepthTest ); +} + +void UpdateManager::SetGeometryType( Render::Geometry* geometry, unsigned int geometryType ) +{ + typedef MessageValue2< RenderManager, Render::Geometry*, unsigned int > 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::SetGeometryType, geometry, geometryType ); +} + +void UpdateManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ) +{ + typedef IndexBufferMessage< RenderManager > 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, geometry, indices ); +} + +void UpdateManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ) +{ + typedef MessageValue2< RenderManager, Render::Geometry*, 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::RemoveVertexBuffer, geometry, propertyBuffer ); +} + +void UpdateManager::AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ) +{ + typedef MessageValue2< RenderManager, Render::Geometry*, 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::AddVertexBuffer, geometry, propertyBuffer ); +} + + } // namespace SceneGraph } // namespace Internal diff --git a/dali/internal/update/manager/update-manager.h b/dali/internal/update/manager/update-manager.h index 54d8d96..745e042 100644 --- a/dali/internal/update/manager/update-manager.h +++ b/dali/internal/update/manager/update-manager.h @@ -76,7 +76,6 @@ class RenderManager; class RenderTaskList; class RenderQueue; class TextureCache; -class Geometry; class PropertyBuffer; class TextureSet; @@ -244,13 +243,6 @@ public: void PropertyNotificationSetNotify( PropertyNotification* propertyNotification, PropertyNotification::NotifyMode notifyMode ); /** - * @brief Get the geometry owner - * - * @return The geometry owner - */ - ObjectOwnerContainer< Geometry >& GetGeometryOwner(); - - /** * @brief Get the renderer owner * * @return The renderer owner @@ -395,7 +387,7 @@ public: void SetWrapMode( Render::Sampler* sampler, unsigned int uWrapMode, unsigned int vWrapMode ); /** - * Add a new sampler to RenderManager + * Add a new property buffer 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 @@ -426,6 +418,57 @@ public: */ void SetPropertyBufferData(Render::PropertyBuffer* propertyBuffer, Dali::Vector* data, size_t size); + /** + * Adds a geometry to the RenderManager + * @param[in] geometry The geometry to add + * @post Sends a message to RenderManager to add the Geometry + * The geometry will be owned by RenderManager + */ + void AddGeometry( Render::Geometry* geometry ); + + /** + * Removes an existing Geometry from RenderManager + * @param[in] geometry The geometry to remove + * @post The geometry will be destroyed in the render thread + */ + void RemoveGeometry( Render::Geometry* geometry ); + + /** + * Sets if a Geometry requieres depth testing + * @param[in] geometry The geometry + * @param[in] requiresDepthTest True if the geometry requires depth testing, false otherwise + */ + void SetGeometryRequiresDepthTest( Render::Geometry* geometry, bool requiresDepthTest ); + + /** + * Sets the geometry type of an existing Geometry + * @param[in] geometry The geometry + * @param[in] geometryType The type of the geometry + */ + void SetGeometryType( Render::Geometry* geometry, unsigned int geometryType ); + + /** + * Sets the index buffer to be used by a geometry + * @param[in] geometry The geometry + * @param[in] indices A vector containing the indices for the geometry + */ + void SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ); + + /** + * Adds a vertex buffer to a geomtry + * @param[in] geometry The geometry + * @param[in] propertyBuffer The property buffer + */ + void AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); + + /** + * Removes a vertex buffer from a geometry + * @param[in] geometry The geometry + * @param[in] propertyBuffer The property buffer + */ + void RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); + + public: /** @@ -975,6 +1018,123 @@ inline void SetPropertyBufferData( UpdateManager& manager, Render::PropertyBuffe new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferData, &propertyBuffer, data, size ); } +inline void AddGeometry( UpdateManager& manager, Render::Geometry& geometry ) +{ + typedef MessageValue1< UpdateManager, Render::Geometry* > 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::AddGeometry, &geometry ); +} + +inline void RemoveGeometry( UpdateManager& manager, Render::Geometry& geometry ) +{ + typedef MessageValue1< UpdateManager, Render::Geometry* > 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::RemoveGeometry, &geometry ); +} + +inline void AddVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::PropertyBuffer& vertexBuffer ) +{ + typedef MessageValue2< UpdateManager, Render::Geometry*, 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::AddVertexBuffer, &geometry, const_cast(&vertexBuffer) ); +} + +inline void RemoveVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::PropertyBuffer& vertexBuffer ) +{ + typedef MessageValue2< UpdateManager, Render::Geometry*, 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::RemoveVertexBuffer, &geometry, const_cast(&vertexBuffer) ); +} + +// Custom message type for SetIndexBuffer() used to move data with Vector::Swap() +template< typename T > +class IndexBufferMessage : public MessageBase +{ +public: + + /** + * Constructor which does a Vector::Swap() + */ + IndexBufferMessage( T* manager, Render::Geometry* geometry, Dali::Vector& indices ) + : MessageBase(), + mManager( manager ), + mRenderGeometry( geometry ) + { + mIndices.Swap( indices ); + } + + /** + * Virtual destructor + */ + virtual ~IndexBufferMessage() + { + } + + /** + * @copydoc MessageBase::Process + */ + virtual void Process( BufferIndex /*bufferIndex*/ ) + { + DALI_ASSERT_DEBUG( mManager && "Message does not have an object" ); + mManager->SetIndexBuffer( mRenderGeometry, mIndices ); + } + +private: + + T* mManager; + Render::Geometry* mRenderGeometry; + Dali::Vector mIndices; +}; + +inline void SetIndexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, Dali::Vector& indices ) +{ + typedef IndexBufferMessage< UpdateManager > 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, &geometry, indices ); +} + +inline void SetGeometryTypeMessage( UpdateManager& manager, Render::Geometry& geometry, unsigned int geometryType ) +{ + typedef MessageValue2< UpdateManager, Render::Geometry*, unsigned int > 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::SetGeometryType, &geometry, geometryType ); +} + +inline void SetGeometryRequiresDepthTestMessage( UpdateManager& manager, Render::Geometry& geometry, bool requiresDepthTest ) +{ + typedef MessageValue2< UpdateManager, Render::Geometry*, bool > 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::SetGeometryRequiresDepthTest, &geometry, requiresDepthTest ); +} + } // namespace SceneGraph } // namespace Internal diff --git a/dali/internal/update/rendering/scene-graph-geometry.cpp b/dali/internal/update/rendering/scene-graph-geometry.cpp deleted file mode 100644 index 8b712d1..0000000 --- a/dali/internal/update/rendering/scene-graph-geometry.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - * 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 HEADER -#include "scene-graph-geometry.h" - -// INTERNAL HEADERS -#include -#include -#include -#include - -namespace Dali -{ -namespace Internal -{ -namespace SceneGraph -{ - -Geometry::Geometry() -: mRenderGeometry(NULL), - mSceneController(NULL), - mIndexBuffer( NULL ), - mGeometryType(Dali::Geometry::TRIANGLES), - mRendererRefCount(0u), - mRequiresDepthTest(false) -{ - - // Observe our own PropertyOwner's uniform map - AddUniformMapObserver( *this ); -} - -Geometry::~Geometry() -{ - mConnectionObservers.Destroy( *this ); -} - -void Geometry::AddVertexBuffer( Render::PropertyBuffer* vertexBuffer ) -{ - mVertexBuffers.PushBack( vertexBuffer ); - mConnectionObservers.ConnectionsChanged(*this); - - if( mRenderGeometry ) - { - mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, false); - } -} - -void Geometry::RemoveVertexBuffer( Render::PropertyBuffer* vertexBuffer ) -{ - DALI_ASSERT_DEBUG( NULL != vertexBuffer ); - - // Find the object and destroy it - size_t bufferCount(mVertexBuffers.Size()); - for( size_t i(0); iGetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer ); - } - } - } -} - -void Geometry::SetIndexBuffer( Render::PropertyBuffer* indexBuffer ) -{ - if( mIndexBuffer != indexBuffer ) - { - mIndexBuffer = indexBuffer; - mConnectionObservers.ConnectionsChanged(*this); - - if( mRenderGeometry ) - { - mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, true ); - } - } -} - -void Geometry::ClearIndexBuffer() -{ - if( mIndexBuffer ) - { - if( mRenderGeometry ) - { - mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, mIndexBuffer ); - } - } - mIndexBuffer = 0; - mConnectionObservers.ConnectionsChanged(*this); -} - -void Geometry::SetGeometryType(Geometry::GeometryType geometryType ) -{ - mGeometryType = geometryType; - if( mRenderGeometry ) - { - mSceneController->GetRenderMessageDispatcher().SetGeometryType( *mRenderGeometry, static_cast(geometryType) ); - } -} - -void Geometry::SetRequiresDepthTest( bool requiresDepthTest ) -{ - mRequiresDepthTest = requiresDepthTest; - if( mRenderGeometry ) - { - mSceneController->GetRenderMessageDispatcher().SetGeometryRequiresDepthTest( *mRenderGeometry, requiresDepthTest ); - } -} - -Vector& Geometry::GetVertexBuffers() -{ - return mVertexBuffers; -} - -Render::PropertyBuffer* Geometry::GetIndexBuffer() -{ - return mIndexBuffer; -} - -Geometry::GeometryType Geometry::GetGeometryType( BufferIndex bufferIndex) const -{ - return mGeometryType; -} - -bool Geometry::GetRequiresDepthTesting( BufferIndex bufferIndex ) const -{ - return mRequiresDepthTest; -} - -void Geometry::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex ) -{ -} - -void Geometry::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex ) -{ -} - -void Geometry::AddConnectionObserver( ConnectionChangePropagator::Observer& observer ) -{ - mConnectionObservers.Add(observer); -} - -void Geometry::RemoveConnectionObserver( ConnectionChangePropagator::Observer& observer ) -{ - mConnectionObservers.Remove(observer); -} - -void Geometry::UniformMappingsChanged( const UniformMap& mappings ) -{ - // Our uniform map, or that of one of the watched children has changed. - // Inform connected observers. - mConnectionObservers.ConnectedUniformMapChanged(); -} - -RenderGeometry* Geometry::GetRenderGeometry(SceneController* sceneController) -{ - if(!mRenderGeometry ) - { - //Create RenderGeometry - mSceneController = sceneController; - mRenderGeometry = new RenderGeometry( mGeometryType, mRequiresDepthTest ); - - size_t vertexBufferCount( mVertexBuffers.Size() ); - for( size_t i(0); iAddPropertyBuffer( mVertexBuffers[i], false ); - } - - if( mIndexBuffer ) - { - mRenderGeometry->AddPropertyBuffer( mIndexBuffer, true ); - } - - //Transfer ownership to RenderManager - sceneController->GetRenderMessageDispatcher().AddGeometry( *mRenderGeometry ); - } - - ++mRendererRefCount; - return mRenderGeometry; -} - -void Geometry::OnRendererDisconnect() -{ - --mRendererRefCount; - if( mRendererRefCount == 0 ) - { - //Delete the corresponding RenderGeometry via message to RenderManager - mSceneController->GetRenderMessageDispatcher().RemoveGeometry( *mRenderGeometry ); - - mRenderGeometry = 0; - mSceneController = 0; - } -} - - -} // namespace SceneGraph -} // namespace Internal -} // namespace Dali diff --git a/dali/internal/update/rendering/scene-graph-geometry.h b/dali/internal/update/rendering/scene-graph-geometry.h deleted file mode 100644 index b4eddac..0000000 --- a/dali/internal/update/rendering/scene-graph-geometry.h +++ /dev/null @@ -1,260 +0,0 @@ -#ifndef DALI_INTERNAL_SCENE_GRAPH_GEOMETRY_H -#define DALI_INTERNAL_SCENE_GRAPH_GEOMETRY_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 -#include -#include -#include -#include -#include -#include -#include - -namespace Dali -{ -namespace Internal -{ -namespace Render -{ -class PropertyBuffer; -} -namespace SceneGraph -{ -class SceneController; -class RenderGeometry; - -/** - * This scene graph object is a property owner. It describes a geometry using a - * number of PropertyBuffers acting as Vertex buffers. - */ -class Geometry : public PropertyOwner, public UniformMap::Observer -{ -public: - - typedef Dali::Geometry::GeometryType GeometryType; - /** - * Constructor - */ - Geometry(); - - /** - * Destructor - */ - virtual ~Geometry(); - - /** - * Add a property buffer to be used as a vertex buffer - */ - 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( 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( Render::PropertyBuffer* indexBuffer ); - - /** - * Clear the index buffer if it is no longer required, e.g. if changing geometry type - * to POINTS. - */ - void ClearIndexBuffer(); - - /** - * Set the type of geometry to draw (Points, Lines, Triangles, etc) - * @param[in] bufferIndex Index for double buffered values - * @param[in] geometryType The geometry type - */ - void SetGeometryType( GeometryType geometryType ); - - /** - * Set if the geometry requires depth testing - * @param[in] requiresDepthTest True if depth testing is required, false otherwise - */ - void SetRequiresDepthTest( bool requiresDepthTest ); - - /** - * 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 ); - - /** - * Disconnect the object from 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 DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex ); - - /** - * @copydoc ConnectionObservers::AddObserver - */ - void AddConnectionObserver(ConnectionChangePropagator::Observer& observer); - - /** - * @copydoc ConnectionObservers::RemoveObserver - */ - void RemoveConnectionObserver(ConnectionChangePropagator::Observer& observer); - -public: // UniformMap::Observer - /** - * @copydoc UniformMap::Observer::UniformMappingsChanged - */ - virtual void UniformMappingsChanged( const UniformMap& mappings ); - - /** - * Get the vertex buffers of the geometry - * @return A const reference to the vertex buffers - */ - Vector& GetVertexBuffers(); - - /** - * Get the index buffer of the geometry - * @return A pointer to the index buffer if it exists, or NULL if it doesn't. - */ - Render::PropertyBuffer* GetIndexBuffer(); - - /** - * Gets the associated RenderGeometry - * @param[in] sceneController The scene controller - * @return The RenderGeometry associated to this Geometry - */ - RenderGeometry* GetRenderGeometry(SceneController* sceneController); - - /** - * Called from renderers using this geometry when they get disconnected from the scenegraph - */ - void OnRendererDisconnect(); - - -public: // GeometryDataProvider - /** - * Get the type of geometry to draw - * @param[in] bufferIndex Index for double buffered values - */ - virtual GeometryType GetGeometryType( BufferIndex bufferIndex ) const; - - /** - * Returns true if this geometry requires depth testing, e.g. if it is - * a set of vertices with z != 0 - * @param[in] bufferIndex Index for double buffered values - */ - virtual bool GetRequiresDepthTesting( BufferIndex bufferIndex ) const; - -private: - - RenderGeometry* mRenderGeometry; - SceneController* mSceneController; - - Render::PropertyBuffer* mIndexBuffer; ///< The index buffer if required - Vector mVertexBuffers; ///< The vertex buffers - - ConnectionChangePropagator mConnectionObservers; - - Geometry::GeometryType mGeometryType; - unsigned int mRendererRefCount; - bool mRequiresDepthTest; -}; - -inline void AddVertexBufferMessage( EventThreadServices& eventThreadServices , const Geometry& geometry, const Render::PropertyBuffer& vertexBuffer ) -{ - 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(&vertexBuffer) ); -} - -inline void RemoveVertexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, const Render::PropertyBuffer& vertexBuffer ) -{ - 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(&vertexBuffer) ); -} - -inline void SetIndexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, const Render::PropertyBuffer& indexBuffer ) -{ - 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(&indexBuffer) ); -} - -inline void ClearIndexBufferMessage( EventThreadServices& eventThreadServices, const Geometry& geometry ) -{ - typedef Message< Geometry > 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::ClearIndexBuffer ); -} - -} // namespace SceneGraph - -// Declare enum as a message parameter type -template <> struct ParameterType< SceneGraph::Geometry::GeometryType > : public BasicType< SceneGraph::Geometry::GeometryType > {}; - -namespace SceneGraph -{ - -inline void SetGeometryTypeMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, SceneGraph::Geometry::GeometryType geometryType ) -{ - typedef MessageValue1< Geometry, SceneGraph::Geometry::GeometryType > 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::SetGeometryType, geometryType ); -} - -inline void SetGeometryRequiresDepthTestMessage( EventThreadServices& eventThreadServices, const Geometry& geometry, bool requiresDepthTest ) -{ - typedef MessageValue1< Geometry, bool > 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::SetRequiresDepthTest, requiresDepthTest ); -} - -} // namespace SceneGraph -} // namespace Internal -} // namespace Dali - -#endif // DALI_INTERNAL_SCENE_GRAPH_GEOMETRY_H diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index a464224..4876a34 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -124,13 +123,13 @@ Renderer::Renderer() mBlendBitmask( 0u ), mFaceCullingMode( Dali::Renderer::NONE ), mBlendingMode( Dali::BlendingMode::AUTO ), + mIndexedDrawFirstElement( 0 ), + mIndexedDrawElementsCount( 0 ), mReferenceCount( 0 ), mRegenerateUniformMap( 0 ), mResendFlag( 0 ), mResourcesReady( false ), mFinishedResourceAcquisition( false ), - mIndexedDrawFirstElement( 0 ), - mIndexedDrawElementsCount( 0 ), mDepthIndex( 0 ) { mUniformMapChanged[0] = false; @@ -147,11 +146,6 @@ Renderer::~Renderer() mTextureSet->RemoveConnectionObserver(*this); mTextureSet=NULL; } - if (mGeometry) - { - mGeometry->RemoveConnectionObserver(*this); - mGeometry=NULL; - } if( mShader ) { mShader->RemoveConnectionObserver(*this); @@ -172,7 +166,7 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) mFinishedResourceAcquisition = false; // Can only be considered ready when all the scene graph objects are connected to the renderer - if( ( mGeometry ) && ( mGeometry->GetVertexBuffers().Count() > 0 ) && ( mShader ) ) + if( mGeometry && mShader ) { if( mTextureSet ) { @@ -204,8 +198,6 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) } AddMappings( localMap, mShader->GetUniformMap() ); - AddMappings( localMap, mGeometry->GetUniformMap() ); - } else if( mRegenerateUniformMap == COPY_UNIFORM_MAP ) { @@ -243,13 +235,10 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) if( mResendFlag & RESEND_GEOMETRY ) { - // The first call to GetRenderGeometry() creates the geometry and sends it in a message - RenderGeometry* geometry = mGeometry->GetRenderGeometry( mSceneController ); - - typedef MessageValue1< Render::Renderer, RenderGeometry* > DerivedType; + typedef MessageValue1< Render::Renderer, Render::Geometry* > DerivedType; unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::SetGeometry, geometry ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetGeometry, mGeometry ); mResendFlag &= ~RESEND_GEOMETRY; } @@ -334,18 +323,10 @@ void Renderer::SetShader( Shader* shader ) mResendFlag |= RESEND_DATA_PROVIDER; } -void Renderer::SetGeometry( Geometry* geometry ) +void Renderer::SetGeometry( Render::Geometry* geometry ) { DALI_ASSERT_DEBUG( geometry != NULL && "Geometry pointer is NULL"); - if( mGeometry) - { - mGeometry->RemoveConnectionObserver(*this); - mGeometry->OnRendererDisconnect(); - } - mGeometry = geometry; - mGeometry->AddConnectionObserver( *this ); // Observe geometry connections / uniform mapping changes - mRegenerateUniformMap = REGENERATE_UNIFORM_MAP; if( mRenderer ) { @@ -418,8 +399,7 @@ void Renderer::OnStageConnect() { RenderDataProvider* dataProvider = NewRenderDataProvider(); - RenderGeometry* renderGeometry = mGeometry->GetRenderGeometry(mSceneController); - mRenderer = Render::Renderer::New( dataProvider, renderGeometry, + mRenderer = Render::Renderer::New( dataProvider, mGeometry, mBlendBitmask, mBlendColor, static_cast< Dali::Renderer::FaceCullingMode >( mFaceCullingMode ), mPremultipledAlphaEnabled ); @@ -435,10 +415,6 @@ void Renderer::OnStageDisconnect() if( mReferenceCount == 0 ) { mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mRenderer ); - if( mGeometry ) - { - mGeometry->OnRendererDisconnect(); - } mRenderer = NULL; } } @@ -567,11 +543,7 @@ void Renderer::UniformMappingsChanged( const UniformMap& mappings ) void Renderer::ObservedObjectDestroyed(PropertyOwner& owner) { - if( reinterpret_cast(mGeometry) == &owner ) - { - mGeometry = NULL; - } - else if( reinterpret_cast(mTextureSet) == &owner ) + if( reinterpret_cast(mTextureSet) == &owner ) { mTextureSet = NULL; } diff --git a/dali/internal/update/rendering/scene-graph-renderer.h b/dali/internal/update/rendering/scene-graph-renderer.h index 890eb45..9311b3f 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.h +++ b/dali/internal/update/rendering/scene-graph-renderer.h @@ -35,6 +35,7 @@ namespace Internal namespace Render { class Renderer; +class Geometry; } namespace SceneGraph @@ -105,16 +106,7 @@ public: * Set the geometry for the renderer * @param[in] geometry The geometry this renderer will use */ - void SetGeometry( Geometry* geometry ); - - /** - * Get the geometry of this renderer - * @return the geometry this renderer uses - */ - Geometry& GetGeometry() - { - return *mGeometry; - } + void SetGeometry( Render::Geometry* geometry ); /** * Set the depth index @@ -310,10 +302,10 @@ private: private: - SceneController* mSceneController; ///< Used for initializing renderers whilst attached - Render::Renderer* mRenderer; ///< Raw pointer to the new renderer (that's owned by RenderManager) + SceneController* mSceneController; ///< Used for initializing renderers whilst attached + Render::Renderer* mRenderer; ///< Raw pointer to the renderer (that's owned by RenderManager) TextureSet* mTextureSet; ///< The texture set this renderer uses. (Not owned) - Geometry* mGeometry; ///< The geometry this renderer uses. (Not owned) + Render::Geometry* mGeometry; ///< The geometry this renderer uses. (Not owned) Shader* mShader; Vector4* mBlendColor; ///< The blend color for blending operation @@ -322,6 +314,9 @@ private: BlendingMode::Type mBlendingMode; ///< The mode of blending CollectedUniformMap mCollectedUniformMap[2]; ///< Uniform maps collected by the renderer + + size_t mIndexedDrawFirstElement; ///< first element index to be drawn using indexed draw + size_t mIndexedDrawElementsCount; ///< number of elements to be drawn using indexed draw unsigned int mReferenceCount; ///< Number of nodes currently using this renderer unsigned int mRegenerateUniformMap; ///< 2 if the map should be regenerated, 1 if it should be copied. unsigned char mResendFlag; ///< Indicate whether data should be resent to the renderer @@ -330,9 +325,6 @@ private: bool mFinishedResourceAcquisition; ///< Set during DoPrepareResources; true if ready & all resource acquisition has finished (successfully or otherwise) bool mPremultipledAlphaEnabled; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required - size_t mIndexedDrawFirstElement; ///< first element index to be drawn using indexed draw - size_t mIndexedDrawElementsCount; ///< number of elements to be drawn using indexed draw - public: int mDepthIndex; ///< Used only in PrepareRenderInstructions }; @@ -350,15 +342,15 @@ inline void SetTexturesMessage( EventThreadServices& eventThreadServices, const new (slot) LocalType( &renderer, &Renderer::SetTextures, const_cast(&textureSet) ); } -inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Geometry& geometry ) +inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Render::Geometry& geometry ) { - typedef MessageValue1< Renderer, Geometry* > LocalType; + typedef MessageValue1< Renderer, Render::Geometry* > 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( &renderer, &Renderer::SetGeometry, const_cast(&geometry) ); + new (slot) LocalType( &renderer, &Renderer::SetGeometry, const_cast(&geometry) ); } inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, Shader& shader )