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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to