2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <dali/internal/render/renderers/render-geometry.h>
19 #include <dali/internal/common/buffer-index.h>
20 #include <dali/internal/update/common/scene-graph-property-buffer.h>
21 #include <dali/internal/update/rendering/scene-graph-geometry.h>
22 #include <dali/internal/render/data-providers/render-data-provider.h>
23 #include <dali/internal/render/gl-resources/context.h>
24 #include <dali/internal/render/gl-resources/gpu-buffer.h>
25 #include <dali/internal/render/shaders/program.h>
34 RenderGeometry::RenderGeometry()
35 : mDataNeedsUploading( true ),
36 mShaderChanged( true )
40 RenderGeometry::~RenderGeometry()
44 void RenderGeometry::GlContextCreated( Context& context )
46 mDataNeedsUploading = true;
49 void RenderGeometry::GlContextDestroyed()
53 void RenderGeometry::UploadAndDraw(
56 BufferIndex bufferIndex,
57 const RenderDataProvider* dataProviders )
59 UploadVertexData( context, bufferIndex, dataProviders );
61 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
63 mVertexBuffers[i]->BindBuffer( context, program );
64 mVertexBuffers[i]->EnableVertexAttributes( context, bufferIndex, program );
69 mIndexBuffer->BindBuffer( context, program );
72 Draw( context, bufferIndex, dataProviders );
74 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
76 mVertexBuffers[i]->DisableVertexAttributes( context, bufferIndex, program );
80 void RenderGeometry::GeometryUpdated()
82 mDataNeedsUploading = true;
85 void RenderGeometry::UploadVertexData(
87 BufferIndex bufferIndex,
88 const RenderDataProvider* dataProviders )
90 if( mDataNeedsUploading )
92 SetUpPropertyBuffers( context, bufferIndex, dataProviders );
94 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
96 mVertexBuffers[i]->Upload( context, bufferIndex );
100 mIndexBuffer->Upload( context, bufferIndex );
103 mDataNeedsUploading = false;
107 void RenderGeometry::SetUpPropertyBuffers(
109 BufferIndex bufferIndex,
110 const RenderDataProvider* dataProvider )
113 RenderDataProvider::VertexBuffers vertexBuffers = dataProvider->GetVertexBuffers();
115 DALI_ASSERT_DEBUG( vertexBuffers.Count() > 0 && "Need vertex buffers to upload" );
117 for( unsigned int i=0; i<vertexBuffers.Count(); ++i)
119 const PropertyBufferDataProvider* vertexBuffer = vertexBuffers[i];
121 RenderPropertyBuffer* propertyBuffer = new RenderPropertyBuffer(
123 GpuBuffer::ARRAY_BUFFER,
124 GpuBuffer::STATIC_DRAW ); // TODO: MESH_REWORK: change this for animated meshes
126 mVertexBuffers.PushBack( propertyBuffer );
130 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
133 mIndexBuffer = new RenderPropertyBuffer(
135 GpuBuffer::ELEMENT_ARRAY_BUFFER,
136 GpuBuffer::STATIC_DRAW ); // TODO: MESH_REWORK: change this for animated meshes
140 void RenderGeometry::BindBuffers( Context& context, BufferIndex bufferIndex, Program& program )
142 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
144 mVertexBuffers[i]->BindBuffer( context, program );
149 mIndexBuffer->BindBuffer( context, program );
153 void RenderGeometry::EnableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
155 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
156 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
157 for( ; it != end; ++it )
159 (*it)->EnableVertexAttributes( context, bufferIndex, program );
163 void RenderGeometry::DisableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
165 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
166 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
167 for( ; it != end; ++it )
169 (*it)->DisableVertexAttributes( context, bufferIndex, program );
173 void RenderGeometry::Draw( Context& context, BufferIndex bufferIndex, const RenderDataProvider* dataProvider )
175 const GeometryDataProvider& geometry = dataProvider->GetGeometry();
176 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
178 GeometryDataProvider::GeometryType type = geometry.GetGeometryType( bufferIndex );
180 unsigned int numIndices = 0;
183 numIndices = indexBuffer->GetDataSize(bufferIndex) / indexBuffer->GetElementSize(bufferIndex);
188 case Dali::Geometry::TRIANGLES:
192 context.DrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);
196 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
197 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
198 context.DrawArrays( GL_TRIANGLES, 0, numVertices );
202 case Dali::Geometry::LINES:
206 context.DrawElements(GL_LINES, numIndices, GL_UNSIGNED_SHORT, 0);
210 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
211 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
212 context.DrawArrays( GL_LINES, 0, numVertices );
216 case Dali::Geometry::POINTS:
218 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
219 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
220 context.DrawArrays(GL_POINTS, 0, numVertices );
225 DALI_ASSERT_ALWAYS( 0 && "Geometry type not supported (yet)" );
231 } // namespace SceneGraph
232 } // namespace Internal