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, program, 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(
88 BufferIndex bufferIndex,
89 const RenderDataProvider* dataProviders )
91 if( mDataNeedsUploading )
93 SetUpPropertyBuffers( context, bufferIndex, dataProviders );
95 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
97 mVertexBuffers[i]->Upload( context, bufferIndex );
98 mVertexBuffers[i]->UpdateAttributeLocations( context, bufferIndex, program );
102 mIndexBuffer->Upload( context, bufferIndex );
105 mDataNeedsUploading = false;
109 void RenderGeometry::SetUpPropertyBuffers(
111 BufferIndex bufferIndex,
112 const RenderDataProvider* dataProvider )
115 RenderDataProvider::VertexBuffers vertexBuffers = dataProvider->GetVertexBuffers();
117 DALI_ASSERT_DEBUG( vertexBuffers.Count() > 0 && "Need vertex buffers to upload" );
119 mVertexBuffers.Clear();
120 for( unsigned int i=0; i<vertexBuffers.Count(); ++i)
122 const PropertyBufferDataProvider* vertexBuffer = vertexBuffers[i];
124 RenderPropertyBuffer* propertyBuffer = new RenderPropertyBuffer(
126 GpuBuffer::ARRAY_BUFFER,
127 GpuBuffer::STATIC_DRAW ); // TODO: MESH_REWORK: change this for animated meshes
129 mVertexBuffers.PushBack( propertyBuffer );
133 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
136 mIndexBuffer = new RenderPropertyBuffer(
138 GpuBuffer::ELEMENT_ARRAY_BUFFER,
139 GpuBuffer::STATIC_DRAW ); // TODO: MESH_REWORK: change this for animated meshes
143 void RenderGeometry::BindBuffers( Context& context, BufferIndex bufferIndex, Program& program )
145 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
147 mVertexBuffers[i]->BindBuffer( context, program );
152 mIndexBuffer->BindBuffer( context, program );
156 void RenderGeometry::EnableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
158 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
159 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
160 for( ; it != end; ++it )
162 (*it)->EnableVertexAttributes( context, bufferIndex, program );
166 void RenderGeometry::DisableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
168 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
169 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
170 for( ; it != end; ++it )
172 (*it)->DisableVertexAttributes( context, bufferIndex, program );
176 void RenderGeometry::Draw( Context& context, BufferIndex bufferIndex, const RenderDataProvider* dataProvider )
178 const GeometryDataProvider& geometry = dataProvider->GetGeometry();
179 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
181 GeometryDataProvider::GeometryType type = geometry.GetGeometryType( bufferIndex );
183 unsigned int numIndices = 0;
186 numIndices = indexBuffer->GetDataSize(bufferIndex) / indexBuffer->GetElementSize(bufferIndex);
191 case Dali::Geometry::TRIANGLES:
195 context.DrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);
199 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
200 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
201 context.DrawArrays( GL_TRIANGLES, 0, numVertices );
205 case Dali::Geometry::LINES:
209 context.DrawElements(GL_LINES, numIndices, GL_UNSIGNED_SHORT, 0);
213 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
214 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
215 context.DrawArrays( GL_LINES, 0, numVertices );
219 case Dali::Geometry::POINTS:
221 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
222 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
223 context.DrawArrays(GL_POINTS, 0, numVertices );
228 DALI_ASSERT_ALWAYS( 0 && "Geometry type not supported (yet)" );
234 } // namespace SceneGraph
235 } // namespace Internal