[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21801] branches/soc-2009-imbusy/source/ blender: edge drawing now uses buffer code
Lukas Steiblys
imbusy at imbusy.org
Wed Jul 22 18:28:27 CEST 2009
Revision: 21801
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21801
Author: imbusy
Date: 2009-07-22 18:28:27 +0200 (Wed, 22 Jul 2009)
Log Message:
-----------
edge drawing now uses buffer code
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-22 14:14:26 UTC (rev 21800)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-07-22 16:28:27 UTC (rev 21801)
@@ -222,16 +222,46 @@
MVert *mvert = cddm->mvert;
MEdge *medge = cddm->medge;
int i;
-
- glBegin(GL_LINES);
- for(i = 0; i < dm->numEdgeData; i++, medge++) {
- if((medge->flag&ME_EDGEDRAW)
- && (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) {
- glVertex3fv(mvert[medge->v1].co);
- glVertex3fv(mvert[medge->v2].co);
+
+ if( GPU_buffer_legacy(dm) ) {
+ DEBUG_VBO( "Using legacy code. cdDM_drawEdges\n" );
+ glBegin(GL_LINES);
+ for(i = 0; i < dm->numEdgeData; i++, medge++) {
+ if((medge->flag&ME_EDGEDRAW)
+ && (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) {
+ glVertex3fv(mvert[medge->v1].co);
+ glVertex3fv(mvert[medge->v2].co);
+ }
}
+ glEnd();
}
- glEnd();
+ else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
+ int prevstart = 0;
+ int prevdraw = 1;
+ int draw = 1;
+
+ GPU_edge_setup(dm);
+ if( !GPU_buffer_legacy(dm) ) {
+ for(i = 0; i < dm->numEdgeData; i++, medge++) {
+ if((medge->flag&ME_EDGEDRAW)
+ && (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) {
+ draw = 1;
+ }
+ else {
+ draw = 0;
+ }
+ if( prevdraw != draw && prevdraw > 0 && (i-prevstart) > 0) {
+ 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);
+ }
+ }
+ GPU_buffer_unbind();
+ }
}
static void cdDM_drawLooseEdges(DerivedMesh *dm)
Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-22 14:14:26 UTC (rev 21800)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-22 16:28:27 UTC (rev 21801)
@@ -78,6 +78,8 @@
GPUBuffer *normals;
GPUBuffer *uv;
GPUBuffer *colors;
+ GPUBuffer *edges;
+
int *faceRemap; /* at what index was the face originally in DerivedMesh */
IndexLink *indices; /* given an index, find all elements using it */
IndexLink *indexMem; /* for faster memory allocation/freeing */
@@ -88,6 +90,7 @@
int nmaterials;
int nelements;
+ int nedges;
int nindices;
int legacy; /* if there was a failure allocating some buffer, use old rendering code */
@@ -107,6 +110,7 @@
void GPU_normal_setup( struct DerivedMesh *dm );
void GPU_uv_setup( struct DerivedMesh *dm );
void GPU_color_setup( struct DerivedMesh *dm );
+void GPU_edge_setup( struct DerivedMesh *dm ); /* does not mix with other data */
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-22 14:14:26 UTC (rev 21800)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-07-22 16:28:27 UTC (rev 21801)
@@ -243,6 +243,8 @@
object = MEM_callocN(sizeof(GPUDrawObject),"GPU_drawobject_new_object");
object->nindices = dm->getNumVerts(dm);
object->indices = MEM_mallocN(sizeof(IndexLink)*object->nindices, "GPU_drawobject_new_indices");
+ object->nedges = dm->getNumEdges(dm);
+
for( i = 0; i < object->nindices; i++ ) {
object->indices[i].element = -1;
object->indices[i].next = 0;
@@ -355,8 +357,15 @@
DEBUG_VBO("GPU_buffer_setup\n");
- if( globalPool == 0 )
+ if( globalPool == 0 ) {
globalPool = GPU_buffer_pool_new();
+
+ /* somehow GL_NORMAL_ARRAY is enabled on startup and causes edge drawing code to crash */
+ glDisableClientState( GL_VERTEX_ARRAY );
+ glDisableClientState( GL_NORMAL_ARRAY );
+ glDisableClientState( GL_TEXTURE_COORD_ARRAY );
+ glDisableClientState( GL_COLOR_ARRAY );
+ }
buffer = GPU_buffer_alloc(size,globalPool);
if( buffer == 0 ) {
dm->drawObject->legacy = 1;
@@ -665,6 +674,31 @@
return result;
}
+void GPU_buffer_copy_edge( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+{
+ int i;
+
+ MVert *mvert;
+ MEdge *medge;
+
+ DEBUG_VBO("GPU_buffer_copy_edge\n");
+
+ mvert = dm->getVertArray(dm);
+ 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);
+ }
+}
+
+GPUBuffer *GPU_buffer_edge( DerivedMesh *dm )
+{
+ DEBUG_VBO("GPU_buffer_edge\n");
+
+ return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*6*dm->drawObject->nedges, 0, GPU_buffer_copy_edge);
+}
+
void GPU_vertex_setup( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_vertex_setup\n");
@@ -757,6 +791,29 @@
GLStates |= GPU_BUFFER_COLOR_STATE;
}
+void GPU_edge_setup( DerivedMesh *dm )
+{
+ DEBUG_VBO("GPU_buffer_edge_setup\n");
+ if( dm->drawObject == 0 )
+ dm->drawObject = GPU_drawobject_new( dm );
+ if( dm->drawObject->edges == 0 )
+ dm->drawObject->edges = GPU_buffer_edge( dm );
+ if( dm->drawObject->edges == 0 ) {
+ DEBUG_VBO( "Failed to setup edges\n" );
+ return;
+ }
+ glEnableClientState( GL_VERTEX_ARRAY );
+ if( useVBOs ) {
+ glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->edges->id );
+ glVertexPointer( 3, GL_FLOAT, 0, 0 );
+ }
+ else {
+ glVertexPointer( 3, GL_FLOAT, 0, dm->drawObject->edges->pointer );
+ }
+
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
+}
+
void GPU_buffer_unbind()
{
DEBUG_VBO("GPU_buffer_unbind\n");
More information about the Bf-blender-cvs
mailing list