[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21814] branches/soc-2009-imbusy/source/ blender: improved edge drawing, unsure about the last parameter to glDrawElements when using VBOs
Lukas Steiblys
imbusy at imbusy.org
Thu Jul 23 15:21:27 CEST 2009
Revision: 21814
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21814
Author: imbusy
Date: 2009-07-23 15:21:27 +0200 (Thu, 23 Jul 2009)
Log Message:
-----------
improved edge drawing, unsure about the last parameter to glDrawElements when using VBOs
Modified Paths:
--------------
branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-07-23 12:55:26 UTC (rev 21813)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-07-23 13:21:27 UTC (rev 21814)
@@ -177,10 +177,17 @@
MVert *mv = cddm->mvert;
int i;
- glBegin(GL_POINTS);
- for(i = 0; i < dm->numVertData; i++, mv++)
- glVertex3fv(mv->co);
- glEnd();
+ if( GPU_buffer_legacy(dm) ) {
+ glBegin(GL_POINTS);
+ for(i = 0; i < dm->numVertData; i++, mv++)
+ glVertex3fv(mv->co);
+ glEnd();
+ }
+ else {
+ GPU_vertex_setup(dm);
+ glDrawArrays(GL_POINTS,0,dm->drawObject->nelements);
+ GPU_buffer_unbind();
+ }
}
static void cdDM_drawUVEdges(DerivedMesh *dm)
@@ -251,13 +258,15 @@
draw = 0;
}
if( prevdraw != draw && prevdraw > 0 && (i-prevstart) > 0) {
- glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
+ GPU_buffer_draw_elements( dm->drawObject->edges, GL_LINES, prevstart*2, (i-prevstart)*2 );
+ //glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
prevstart = i;
}
prevdraw = draw;
}
if( prevdraw > 0 && (i-prevstart) > 0 ) {
- glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
+ //glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
+ GPU_buffer_draw_elements( dm->drawObject->edges, GL_LINES, prevstart*2, (i-prevstart)*2 );
}
}
GPU_buffer_unbind();
Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-23 12:55:26 UTC (rev 21813)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-23 13:21:27 UTC (rev 21814)
@@ -112,6 +112,7 @@
void GPU_color_setup( struct DerivedMesh *dm );
void GPU_edge_setup( struct DerivedMesh *dm ); /* does not mix with other data */
+void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
void *GPU_buffer_lock( GPUBuffer *buffer );
void GPU_buffer_unlock( GPUBuffer *buffer );
Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-07-23 12:55:26 UTC (rev 21813)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-07-23 13:21:27 UTC (rev 21814)
@@ -45,6 +45,7 @@
#define GPU_BUFFER_NORMAL_STATE 2
#define GPU_BUFFER_TEXCOORD_STATE 4
#define GPU_BUFFER_COLOR_STATE 8
+#define GPU_BUFFER_ELEMENT_STATE 16
/* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
int useVBOs = -1;
@@ -175,8 +176,8 @@
allocated->size = size;
if( useVBOs == 1 ) {
glGenBuffersARB( 1, &allocated->id );
- glBindBufferARB( GL_ARRAY_BUFFER_ARB, allocated->id );
- glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, 0, GL_STATIC_DRAW_ARB );
+ /*glBindBufferARB( GL_ARRAY_BUFFER_ARB, allocated->id );
+ glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, 0, GL_STATIC_DRAW_ARB );*/
glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
}
else {
@@ -291,7 +292,7 @@
object->indexMemUsage = 0;
#define ADDLINK( INDEX, ACTUAL ) \
- if( object->indices[INDEX].element == -1 ) { \
+ if( object->indices[INDEX].element == -1 ) { \
object->indices[INDEX].element = ACTUAL; \
} else { \
IndexLink *lnk = &object->indices[INDEX]; \
@@ -345,7 +346,7 @@
MEM_freeN(object);
}
-GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) )
+GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) )
{
GPUBuffer *buffer;
float *varray;
@@ -383,9 +384,9 @@
if( useVBOs ) {
success = 0;
while( success == 0 ) {
- glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
- glBufferDataARB( GL_ARRAY_BUFFER_ARB, buffer->size, 0, GL_STATIC_DRAW_ARB ); /* discard previous data, avoid stalling gpu */
- varray = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB );
+ glBindBufferARB( target, buffer->id );
+ glBufferDataARB( target, buffer->size, 0, GL_STATIC_DRAW_ARB ); /* discard previous data, avoid stalling gpu */
+ varray = glMapBufferARB( target, GL_WRITE_ONLY_ARB );
if( varray == 0 ) {
DEBUG_VBO( "Failed to map buffer to client address space\n" );
GPU_buffer_free( buffer, globalPool );
@@ -412,10 +413,10 @@
uploaded = GL_FALSE;
while( !uploaded ) {
(*copy_f)( dm, varray, index, redir, user );
- uploaded = glUnmapBufferARB( GL_ARRAY_BUFFER_ARB ); /* returns false if data got corruped during transfer */
+ uploaded = glUnmapBufferARB( target ); /* returns false if data got corruped during transfer */
}
}
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+ glBindBufferARB(target, 0);
}
else {
if( buffer->pointer != 0 ) {
@@ -470,7 +471,7 @@
{
DEBUG_VBO("GPU_buffer_vertex\n");
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, 0, GPU_buffer_copy_vertex);
+ return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex);
}
void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
@@ -533,7 +534,7 @@
{
DEBUG_VBO("GPU_buffer_normal\n");
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, 0, GPU_buffer_copy_normal);
+ return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal);
}
void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
@@ -579,7 +580,7 @@
{
DEBUG_VBO("GPU_buffer_uv\n");
if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 )
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+ return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv);
else
return 0;
}
@@ -668,7 +669,7 @@
colors[i*3+2] = mcol[i].r;
}
- result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, colors, GPU_buffer_copy_color3 );
+ result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 );
MEM_freeN(colors);
return result;
@@ -680,6 +681,7 @@
MVert *mvert;
MEdge *medge;
+ unsigned int *varray_ = (unsigned int *)varray;
DEBUG_VBO("GPU_buffer_copy_edge\n");
@@ -687,8 +689,8 @@
medge = dm->getEdgeArray(dm);
for(i = 0; i < dm->getNumEdges(dm); i++) {
- VECCOPY(&varray[i*6],mvert[medge[i].v1].co);
- VECCOPY(&varray[i*6+3],mvert[medge[i].v2].co);
+ varray_[i*2] = (unsigned int)dm->drawObject->indices[medge[i].v1].element;
+ varray_[i*2+1] = (unsigned int)dm->drawObject->indices[medge[i].v2].element;
}
}
@@ -696,7 +698,7 @@
{
DEBUG_VBO("GPU_buffer_edge\n");
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*6*dm->drawObject->nedges, 0, GPU_buffer_copy_edge);
+ return GPU_buffer_setup( dm, dm->drawObject, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge);
}
void GPU_vertex_setup( DerivedMesh *dm )
@@ -802,16 +804,29 @@
DEBUG_VBO( "Failed to setup edges\n" );
return;
}
+ if( dm->drawObject->vertices == 0 )
+ dm->drawObject->vertices = GPU_buffer_vertex( dm );
+ if( dm->drawObject->vertices == 0 ) {
+ DEBUG_VBO( "Failed to setup vertices\n" );
+ return;
+ }
+
glEnableClientState( GL_VERTEX_ARRAY );
if( useVBOs ) {
- glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->edges->id );
+ glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->vertices->id );
glVertexPointer( 3, GL_FLOAT, 0, 0 );
}
else {
- glVertexPointer( 3, GL_FLOAT, 0, dm->drawObject->edges->pointer );
+ glVertexPointer( 3, GL_FLOAT, 0, dm->drawObject->vertices->pointer );
}
+
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
- GLStates |= GPU_BUFFER_VERTEX_STATE;
+ if( useVBOs ) {
+ glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, dm->drawObject->edges->id );
+ }
+
+ GLStates |= GPU_BUFFER_ELEMENT_STATE;
}
void GPU_buffer_unbind()
@@ -826,7 +841,9 @@
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
if( GLStates & GPU_BUFFER_COLOR_STATE )
glDisableClientState( GL_COLOR_ARRAY );
- GLStates &= !(GPU_BUFFER_VERTEX_STATE | GPU_BUFFER_NORMAL_STATE | GPU_BUFFER_TEXCOORD_STATE | GPU_BUFFER_COLOR_STATE );
+ if( GLStates & GPU_BUFFER_ELEMENT_STATE )
+ glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );
+ GLStates &= !(GPU_BUFFER_VERTEX_STATE | GPU_BUFFER_NORMAL_STATE | GPU_BUFFER_TEXCOORD_STATE | GPU_BUFFER_COLOR_STATE | GPU_BUFFER_ELEMENT_STATE);
if( GLStates != 0 )
DEBUG_VBO( "Some weird OpenGL state is still set. Why?" );
@@ -839,14 +856,14 @@
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new(dm);
GPU_buffer_free(dm->drawObject->colors,globalPool);
- dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, data, GPU_buffer_copy_color3 );
+ dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 );
}
void GPU_color4_upload( DerivedMesh *dm, char *data )
{
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new(dm);
GPU_buffer_free(dm->drawObject->colors,globalPool);
- dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, data, GPU_buffer_copy_color4 );
+ dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 );
}
void GPU_color_switch( int mode )
@@ -902,4 +919,14 @@
}
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
+}
+
+void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count )
+{
+ if( useVBOs ) {
+ glDrawElements( mode, count, GL_UNSIGNED_INT, start );
+ }
+ else {
+ glDrawElements( mode, count, GL_UNSIGNED_INT, ((int *)elements->pointer)+start );
+ }
}
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list