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/geometry/scene-graph-geometry.h>
21 #include <dali/internal/update/common/scene-graph-property-buffer.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 ) // @todo Or if any of the property buffers are dirty
92 DoUpload( context, bufferIndex, dataProviders );
94 mDataNeedsUploading = false;
98 void RenderGeometry::DoUpload(
100 BufferIndex bufferIndex,
101 const RenderDataProvider* dataProvider )
104 RenderDataProvider::VertexBuffers vertexBuffers = dataProvider->GetVertexBuffers();
106 DALI_ASSERT_DEBUG( vertexBuffers.Count() > 0 && "Need vertex buffers to upload" );
108 for( unsigned int i=0; i<vertexBuffers.Count(); ++i)
110 const PropertyBufferDataProvider* vertexBuffer = vertexBuffers[i];
112 RenderPropertyBuffer* propertyBuffer = new RenderPropertyBuffer(
114 GpuBuffer::ARRAY_BUFFER,
115 GpuBuffer::STATIC_DRAW ); // TODO: MESH_REWORK: change this for animated meshes
117 propertyBuffer->Upload( context, bufferIndex );
119 mVertexBuffers.PushBack( propertyBuffer );
123 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
126 mIndexBuffer = new RenderPropertyBuffer(
128 GpuBuffer::ELEMENT_ARRAY_BUFFER,
129 GpuBuffer::STATIC_DRAW ); // TODO: MESH_REWORK: change this for animated meshes
131 mIndexBuffer->Upload( context, bufferIndex );
135 void RenderGeometry::BindBuffers( Context& context, BufferIndex bufferIndex, Program& program )
137 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
139 mVertexBuffers[i]->BindBuffer( context, program );
144 mIndexBuffer->BindBuffer( context, program );
148 void RenderGeometry::EnableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
150 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
151 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
152 for( ; it != end; ++it )
154 (*it)->EnableVertexAttributes( context, bufferIndex, program );
158 void RenderGeometry::DisableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
160 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
161 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
162 for( ; it != end; ++it )
164 (*it)->DisableVertexAttributes( context, bufferIndex, program );
168 void RenderGeometry::Draw( Context& context, BufferIndex bufferIndex, const RenderDataProvider* dataProvider )
170 const GeometryDataProvider& geometry = dataProvider->GetGeometry();
171 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
173 GeometryDataProvider::GeometryType type = geometry.GetGeometryType( bufferIndex );
175 unsigned int numIndices = 0;
178 numIndices = /* TODO: MESH_REWORK remove this 2, should implement unsigned short properties */ 2 * indexBuffer->GetDataSize(bufferIndex) / indexBuffer->GetElementSize(bufferIndex);
183 case Dali::Geometry::TRIANGLES:
187 context.DrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);
191 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
192 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
193 context.DrawArrays( GL_TRIANGLES, 0, numVertices );
197 case Dali::Geometry::LINES:
201 context.DrawElements(GL_LINES, numIndices, GL_UNSIGNED_SHORT, 0);
205 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
206 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
207 context.DrawArrays( GL_LINES, 0, numVertices );
211 case Dali::Geometry::POINTS:
213 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
214 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
215 context.DrawArrays(GL_POINTS, 0, numVertices );
220 DALI_ASSERT_ALWAYS( 0 && "Geometry type not supported (yet)" );
226 } // namespace SceneGraph
227 } // namespace Internal