[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22086] branches/soc-2009-imbusy/source/ blender: some more edit mode code.
Lukas Steiblys
imbusy at imbusy.org
Fri Jul 31 16:01:20 CEST 2009
Revision: 22086
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22086
Author: imbusy
Date: 2009-07-31 16:01:20 +0200 (Fri, 31 Jul 2009)
Log Message:
-----------
some more edit mode code. The code is getting hacky, because of all the set*Options function pointers in the DerivedMesh render function arguments.
Modified Paths:
--------------
branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.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/DerivedMesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-07-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-07-31 14:01:20 UTC (rev 22086)
@@ -491,14 +491,51 @@
}
glEnd();
} else {
- glBegin(GL_LINES);
- for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
- if(!setDrawOptions || setDrawOptions(userData, i)) {
- glVertex3fv(eed->v1->co);
- glVertex3fv(eed->v2->co);
+ GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*3*2*emdm->em->totedge, 0 );
+ float *varray;
+ if( (varray = GPU_buffer_lock( buffer )) ) {
+ int prevdraw = 0;
+ int numedges = 0;
+ int draw = 0;
+ int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_END };
+ GPU_buffer_unlock( buffer );
+ GPU_interleaved_setup( buffer, datatype );
+ GPU_buffer_lock( buffer );
+ for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+ if(!setDrawOptions || setDrawOptions(userData, i)) {
+ draw = 1;
+ } else {
+ draw = 0;
+ }
+ if( prevdraw != draw && prevdraw != 0 && numedges > 0) {
+ GPU_buffer_unlock( buffer );
+ glDrawArrays(GL_LINES,0,numedges*2);
+ varray = GPU_buffer_lock( buffer );
+ numedges = 0;
+ }
+ if( draw != 0 ) {
+ VECCOPY(&varray[numedges*6],eed->v1->co);
+ VECCOPY(&varray[numedges*6+3],eed->v2->co);
+ numedges++;
+ }
+ prevdraw = draw;
}
+ GPU_buffer_unlock( buffer );
+ if( prevdraw != 0 && numedges > 0) {
+ glDrawArrays(GL_LINES,0,numedges*2);
+ }
+ GPU_buffer_unbind();
+ } else {
+ glBegin(GL_LINES);
+ for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+ if(!setDrawOptions || setDrawOptions(userData, i)) {
+ glVertex3fv(eed->v1->co);
+ glVertex3fv(eed->v2->co);
+ }
+ }
+ glEnd();
}
- glEnd();
+ GPU_buffer_free( buffer, 0 );
}
}
static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
@@ -735,12 +772,12 @@
}
prevdraw = draw;
}
+ GPU_buffer_unlock( buffer );
if( prevdraw != 0 && numfaces > 0) {
if( prevdraw==2 ) {
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(stipple_quarttone);
}
- GPU_buffer_unlock( buffer );
glDrawArrays(GL_TRIANGLES,0,numfaces*3);
if( prevdraw==2 ) {
glDisable(GL_POLYGON_STIPPLE);
Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c 2009-07-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c 2009-07-31 14:01:20 UTC (rev 22086)
@@ -1601,12 +1601,52 @@
col0[2] + (col1[2]-col0[2])*t,
col0[3] + (col1[3]-col0[3])*t);
}
+
+typedef struct {
+ DerivedMesh dm;
+
+ EditMesh *em;
+} EMDM;
+
static void draw_dm_edges_sel_interp(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
{
unsigned char *cols[2];
+ int elemsize = sizeof(float)*3+sizeof(unsigned char)*4;
+ EditMesh *em= *((EditMesh **)(dm+1));
+ char *varray;
+ int i;
+ GPUBuffer *buffer;
cols[0] = baseCol;
cols[1] = selCol;
- dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, draw_dm_edges_sel_interp__setDrawInterpOptions, cols);
+
+ buffer = GPU_buffer_alloc( elemsize*em->totedge*2, 0 );
+ if( (varray = GPU_buffer_lock( buffer )) ) {
+ EditEdge *eed;
+ int numedges = 0;
+ int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_C4UB, GPU_BUFFER_INTER_END };
+ GPU_buffer_unlock( buffer );
+ GPU_interleaved_setup( buffer, datatype );
+ GPU_buffer_lock( buffer );
+ for (i=0,eed= em->edges.first; eed; i++,eed= eed->next) {
+ if(eed->h==0) {
+ unsigned char *col0 = cols[(eed->v1->f&SELECT)?1:0];
+ unsigned char *col1 = cols[(eed->v2->f&SELECT)?1:0];
+
+ VECCOPY(((float *)&varray[elemsize*numedges*2]),eed->v1->co);
+ QUATCOPY(&varray[elemsize*numedges*2+sizeof(float)*3],col0);
+ VECCOPY(((float *)&varray[elemsize*numedges*2+elemsize]),eed->v2->co);
+ QUATCOPY(&varray[elemsize*numedges*2+elemsize+sizeof(float)*3],col1);
+ numedges++;
+ }
+ }
+ GPU_buffer_unlock( buffer );
+ glDrawArrays(GL_LINES,0,numedges*2);
+ GPU_buffer_unbind();
+ }
+ else {
+ dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, draw_dm_edges_sel_interp__setDrawInterpOptions, cols);
+ }
+ GPU_buffer_free( buffer, 0 );
}
/* Draw only seam edges */
Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-31 14:01:20 UTC (rev 22086)
@@ -49,6 +49,7 @@
#define GPU_BUFFER_INTER_N3F 2
#define GPU_BUFFER_INTER_T2F 3
#define GPU_BUFFER_INTER_C3UB 4
+#define GPU_BUFFER_INTER_C4UB 5
#define GPU_BUFFER_INTER_END -1
typedef struct GPUBuffer
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-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-07-31 14:01:20 UTC (rev 22086)
@@ -942,6 +942,9 @@
case GPU_BUFFER_INTER_C3UB:
elementsize += 3*sizeof(unsigned char);
break;
+ case GPU_BUFFER_INTER_C4UB:
+ elementsize += 4*sizeof(unsigned char);
+ break;
default:
DEBUG_VBO( "Unknown element in data type array in GPU_interleaved_setup\n" );
}
@@ -951,60 +954,72 @@
glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
switch( data[i] ) {
- case GPU_BUFFER_INTER_V3F:
- glEnableClientState( GL_VERTEX_ARRAY );
- glVertexPointer( 3, GL_FLOAT, elementsize, (void *)offset );
- GLStates |= GPU_BUFFER_VERTEX_STATE;
- offset += 3*sizeof(float);
- break;
- case GPU_BUFFER_INTER_N3F:
- glEnableClientState( GL_NORMAL_ARRAY );
- glNormalPointer( GL_FLOAT, elementsize, (void *)offset );
- GLStates |= GPU_BUFFER_NORMAL_STATE;
- offset += 3*sizeof(float);
- break;
- case GPU_BUFFER_INTER_T2F:
- glEnableClientState( GL_TEXTURE_COORD_ARRAY );
- glTexCoordPointer( 2, GL_FLOAT, elementsize, (void *)offset );
- GLStates |= GPU_BUFFER_TEXCOORD_STATE;
- offset += 2*sizeof(float);
- break;
- case GPU_BUFFER_INTER_C3UB:
- glEnableClientState( GL_COLOR_ARRAY );
- glColorPointer( 3, GL_UNSIGNED_BYTE, elementsize, (void *)offset );
- GLStates |= GPU_BUFFER_COLOR_STATE;
- offset += 3*sizeof(unsigned char);
- break;
+ case GPU_BUFFER_INTER_V3F:
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glVertexPointer( 3, GL_FLOAT, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_N3F:
+ glEnableClientState( GL_NORMAL_ARRAY );
+ glNormalPointer( GL_FLOAT, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_NORMAL_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_T2F:
+ glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+ glTexCoordPointer( 2, GL_FLOAT, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_TEXCOORD_STATE;
+ offset += 2*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_C3UB:
+ glEnableClientState( GL_COLOR_ARRAY );
+ glColorPointer( 3, GL_UNSIGNED_BYTE, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_COLOR_STATE;
+ offset += 3*sizeof(unsigned char);
+ break;
+ case GPU_BUFFER_INTER_C4UB:
+ glEnableClientState( GL_COLOR_ARRAY );
+ glColorPointer( 4, GL_UNSIGNED_BYTE, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_COLOR_STATE;
+ offset += 4*sizeof(unsigned char);
+ break;
}
}
}
else {
for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
switch( data[i] ) {
- case GPU_BUFFER_INTER_V3F:
- glEnableClientState( GL_VERTEX_ARRAY );
- glVertexPointer( 3, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
- GLStates |= GPU_BUFFER_VERTEX_STATE;
- offset += 3*sizeof(float);
- break;
- case GPU_BUFFER_INTER_N3F:
- glEnableClientState( GL_NORMAL_ARRAY );
- glNormalPointer( GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
- GLStates |= GPU_BUFFER_NORMAL_STATE;
- offset += 3*sizeof(float);
- break;
- case GPU_BUFFER_INTER_T2F:
- glEnableClientState( GL_TEXTURE_COORD_ARRAY );
- glTexCoordPointer( 2, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
- GLStates |= GPU_BUFFER_TEXCOORD_STATE;
- offset += 2*sizeof(float);
- break;
- case GPU_BUFFER_INTER_C3UB:
- glEnableClientState( GL_COLOR_ARRAY );
- glColorPointer( 3, GL_UNSIGNED_BYTE, elementsize, offset+(char *)buffer->pointer );
- GLStates |= GPU_BUFFER_COLOR_STATE;
- offset += 3*sizeof(unsigned char);
- break;
+ case GPU_BUFFER_INTER_V3F:
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glVertexPointer( 3, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_N3F:
+ glEnableClientState( GL_NORMAL_ARRAY );
+ glNormalPointer( GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+ GLStates |= GPU_BUFFER_NORMAL_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_T2F:
+ glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+ glTexCoordPointer( 2, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+ GLStates |= GPU_BUFFER_TEXCOORD_STATE;
+ offset += 2*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_C3UB:
+ glEnableClientState( GL_COLOR_ARRAY );
+ glColorPointer( 3, GL_UNSIGNED_BYTE, elementsize, offset+(char *)buffer->pointer );
+ GLStates |= GPU_BUFFER_COLOR_STATE;
+ offset += 3*sizeof(unsigned char);
+ break;
+ case GPU_BUFFER_INTER_C4UB:
+ glEnableClientState( GL_COLOR_ARRAY );
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list