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 // BindBuffers( context, bufferIndex, program );
73 // EnableVertexAttributes( context, bufferIndex, program );
74 Draw( context, bufferIndex, dataProviders );
76 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
78 mVertexBuffers[i]->DisableVertexAttributes( context, bufferIndex, program );
80 //DisableVertexAttributes( context, bufferIndex, program );
83 void RenderGeometry::GeometryUpdated()
85 mDataNeedsUploading = true;
88 void RenderGeometry::UploadVertexData(
90 BufferIndex bufferIndex,
91 const RenderDataProvider* dataProviders )
93 if( mDataNeedsUploading ) // @todo Or if any of the property buffers are dirty
95 DoUpload( context, bufferIndex, dataProviders );
97 mDataNeedsUploading = false;
101 void RenderGeometry::DoUpload(
103 BufferIndex bufferIndex,
104 const RenderDataProvider* dataProvider )
107 RenderDataProvider::VertexBuffers vertexBuffers = dataProvider->GetVertexBuffers();
109 DALI_ASSERT_DEBUG( vertexBuffers.Count() > 0 && "Need vertex buffers to upload" );
111 for( unsigned int i=0; i<vertexBuffers.Count(); ++i)
113 const PropertyBufferDataProvider* vertexBuffer = vertexBuffers[i];
115 RenderPropertyBuffer* propertyBuffer = new RenderPropertyBuffer( *vertexBuffer, false );
117 propertyBuffer->DoUpload( context, bufferIndex );
119 mVertexBuffers.PushBack( propertyBuffer );
123 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
126 mIndexBuffer = new RenderPropertyBuffer( *indexBuffer, true );
128 mIndexBuffer->DoUpload( context, bufferIndex );
132 void RenderGeometry::BindBuffers( Context& context, BufferIndex bufferIndex, Program& program )
134 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
136 mVertexBuffers[i]->BindBuffer( context, program );
141 mIndexBuffer->BindBuffer( context, program );
145 void RenderGeometry::EnableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
147 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
148 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
149 for( ; it != end; ++it )
151 (*it)->EnableVertexAttributes( context, bufferIndex, program );
155 void RenderGeometry::DisableVertexAttributes( Context& context, BufferIndex bufferIndex, Program& program )
157 OwnerContainer< RenderPropertyBuffer* >::Iterator it = mVertexBuffers.Begin();
158 OwnerContainer< RenderPropertyBuffer* >::ConstIterator end = mVertexBuffers.End();
159 for( ; it != end; ++it )
161 (*it)->DisableVertexAttributes( context, bufferIndex, program );
165 void RenderGeometry::Draw( Context& context, BufferIndex bufferIndex, const RenderDataProvider* dataProvider )
167 const GeometryDataProvider& geometry = dataProvider->GetGeometry();
168 const PropertyBufferDataProvider* indexBuffer = dataProvider->GetIndexBuffer();
170 GeometryDataProvider::GeometryType type = geometry.GetGeometryType( bufferIndex );
172 unsigned int numIndices = 0;
175 numIndices = /* TODO: MESH_REWORK remove this 2, should implement unsigned short properties */ 2 * indexBuffer->GetDataSize(bufferIndex) / indexBuffer->GetElementSize(bufferIndex);
180 case Dali::Geometry::TRIANGLES:
182 context.DrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);
185 case Dali::Geometry::LINES:
187 context.DrawElements(GL_LINES, numIndices, GL_UNSIGNED_SHORT, 0);
190 case Dali::Geometry::POINTS:
192 const PropertyBufferDataProvider* firstVertexBuffer = dataProvider->GetVertexBuffers()[0];
194 unsigned int numVertices = firstVertexBuffer->GetElementCount( bufferIndex );
195 context.DrawArrays(GL_POINTS, 0, numVertices );
200 DALI_ASSERT_ALWAYS( 0 && "Geometry type not supported (yet)" );
206 } // namespace SceneGraph
207 } // namespace Internal