Revision: 22016
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22016
Author:   imbusy
Date:     2009-07-29 16:20:49 +0200 (Wed, 29 Jul 2009)

Log Message:
-----------
started working on editmode

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.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-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c     
2009-07-29 14:20:49 UTC (rev 22016)
@@ -627,8 +627,8 @@
                        draw = setDrawOptions==NULL ? 1 : 
setDrawOptions(userData, i, &drawSmooth);
                        if(draw) {
                                if (draw==2) { /* enabled with stipple */
-                                       glEnable(GL_POLYGON_STIPPLE);
-                                       glPolygonStipple(stipple_quarttone);
+                                       glEnable(GL_POLYGON_STIPPLE);
+                                       glPolygonStipple(stipple_quarttone);
                                }
                                
                                glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
@@ -659,41 +659,132 @@
                        }
                }
        } else {
-               for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
-                       int drawSmooth = (efa->flag & ME_SMOOTH);
-                       draw = setDrawOptions==NULL ? 1 : 
setDrawOptions(userData, i, &drawSmooth);
-                       if(draw) {
-                               if (draw==2) { /* enabled with stipple */
-                                       glEnable(GL_POLYGON_STIPPLE);
-                                       glPolygonStipple(stipple_quarttone);
+               /* 3 floats for position, 3 for normal and times two because 
the faces may actually be quads instead of triangles */
+               GPUBuffer *buffer = GPU_buffer_alloc( 
sizeof(float)*6*emdm->em->totface*3*2, 0 );
+               float *varray;
+               if( (varray = GPU_buffer_lock( buffer )) ) {
+                       int prevdraw = 0;
+                       int numfaces = 0;
+                       int datatype[] = { GPU_BUFFER_INTER_V3F, 
GPU_BUFFER_INTER_N3F, GPU_BUFFER_INTER_END };
+                       GPU_buffer_unlock( buffer );
+                       GPU_interleaved_setup( buffer, datatype );
+                       glShadeModel(GL_SMOOTH);
+                       GPU_buffer_lock( buffer );
+                       for (i=0,efa= emdm->em->faces.first; efa; i++,efa= 
efa->next) {
+                               int drawSmooth = (efa->flag & ME_SMOOTH);
+                               draw = setDrawOptions==NULL ? 1 : 
setDrawOptions(userData, i, &drawSmooth);
+                               if( prevdraw != draw && prevdraw != 0 && 
numfaces > 0) {
+                                       if( prevdraw==2 ) {
+                                               glEnable(GL_POLYGON_STIPPLE);
+                                               
glPolygonStipple(stipple_quarttone);
+                                               glDisable(GL_POLYGON_STIPPLE);
+                                       }
+                                       GPU_buffer_unlock( buffer );
+                                       glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+                                       if( prevdraw==2 ) {
+                                               glDisable(GL_POLYGON_STIPPLE);
+                                       }
+                                       varray = GPU_buffer_lock( buffer );
+                                       numfaces = 0;
                                }
-                               glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+                               if( draw != 0 ) {
+                                       if(!drawSmooth) {
+                                               
VECCOPY(&varray[numfaces*18],efa->v1->co);
+                                               
VECCOPY(&varray[numfaces*18+3],efa->n);
 
-                               glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
-                               if (!drawSmooth) {
-                                       glNormal3fv(efa->n);
-                                       glVertex3fv(efa->v1->co);
-                                       glVertex3fv(efa->v2->co);
-                                       glVertex3fv(efa->v3->co);
-                                       if(efa->v4) glVertex3fv(efa->v4->co);
-                               } else {
-                                       glNormal3fv(efa->v1->no);
-                                       glVertex3fv(efa->v1->co);
-                                       glNormal3fv(efa->v2->no);
-                                       glVertex3fv(efa->v2->co);
-                                       glNormal3fv(efa->v3->no);
-                                       glVertex3fv(efa->v3->co);
-                                       if(efa->v4) {
-                                               glNormal3fv(efa->v4->no);
-                                               glVertex3fv(efa->v4->co);
+                                               
VECCOPY(&varray[numfaces*18+6],efa->v2->co);
+                                               
VECCOPY(&varray[numfaces*18+9],efa->n);
+
+                                               
VECCOPY(&varray[numfaces*18+12],efa->v3->co);
+                                               
VECCOPY(&varray[numfaces*18+15],efa->n);
+                                               numfaces++;
+                                               if( efa->v4 ) {
+                                                       
VECCOPY(&varray[numfaces*18],efa->v3->co);
+                                                       
VECCOPY(&varray[numfaces*18+3],efa->n);
+
+                                                       
VECCOPY(&varray[numfaces*18+6],efa->v4->co);
+                                                       
VECCOPY(&varray[numfaces*18+9],efa->n);
+
+                                                       
VECCOPY(&varray[numfaces*18+12],efa->v1->co);
+                                                       
VECCOPY(&varray[numfaces*18+15],efa->n);
+                                                       numfaces++;
+                                               }
                                        }
+                                       else {
+                                               
VECCOPY(&varray[numfaces*18],efa->v1->co);
+                                               
VECCOPY(&varray[numfaces*18+3],efa->v1->no);
+
+                                               
VECCOPY(&varray[numfaces*18+6],efa->v2->co);
+                                               
VECCOPY(&varray[numfaces*18+9],efa->v2->no);
+
+                                               
VECCOPY(&varray[numfaces*18+12],efa->v3->co);
+                                               
VECCOPY(&varray[numfaces*18+15],efa->v3->no);
+                                               numfaces++;
+                                               if( efa->v4 ) {
+                                                       
VECCOPY(&varray[numfaces*18],efa->v3->co);
+                                                       
VECCOPY(&varray[numfaces*18+3],efa->v3->no);
+
+                                                       
VECCOPY(&varray[numfaces*18+6],efa->v4->co);
+                                                       
VECCOPY(&varray[numfaces*18+9],efa->v4->no);
+
+                                                       
VECCOPY(&varray[numfaces*18+12],efa->v1->co);
+                                                       
VECCOPY(&varray[numfaces*18+15],efa->v1->no);
+                                                       numfaces++;
+                                               }
+                                       }
                                }
-                               glEnd();
-                               
-                               if (draw==2)
+                               prevdraw = draw;
+                       }
+                       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);
+                               }
                        }
+                       GPU_buffer_unbind();
+               } else {
+                       for (i=0,efa= emdm->em->faces.first; efa; i++,efa= 
efa->next) {
+                               int drawSmooth = (efa->flag & ME_SMOOTH);
+                               draw = setDrawOptions==NULL ? 1 : 
setDrawOptions(userData, i, &drawSmooth);
+                               if(draw) {
+                                       if (draw==2) { /* enabled with stipple 
*/
+                                               glEnable(GL_POLYGON_STIPPLE);
+                                               
glPolygonStipple(stipple_quarttone);
+                                       }
+                                       
glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+
+                                       glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+                                       if (!drawSmooth) {
+                                               glNormal3fv(efa->n);
+                                               glVertex3fv(efa->v1->co);
+                                               glVertex3fv(efa->v2->co);
+                                               glVertex3fv(efa->v3->co);
+                                               if(efa->v4) 
glVertex3fv(efa->v4->co);
+                                       } else {
+                                               glNormal3fv(efa->v1->no);
+                                               glVertex3fv(efa->v1->co);
+                                               glNormal3fv(efa->v2->no);
+                                               glVertex3fv(efa->v2->co);
+                                               glNormal3fv(efa->v3->no);
+                                               glVertex3fv(efa->v3->co);
+                                               if(efa->v4) {
+                                                       
glNormal3fv(efa->v4->no);
+                                                       
glVertex3fv(efa->v4->co);
+                                               }
+                                       }
+                                       glEnd();
+                                       
+                                       if (draw==2)
+                                               glDisable(GL_POLYGON_STIPPLE);
+                               }
+                       }
                }
+               GPU_buffer_free( buffer, 0 );
        }
 }
 

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-07-29 
14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-07-29 
14:20:49 UTC (rev 22016)
@@ -43,6 +43,14 @@
 
 struct DerivedMesh;
 
+/* V - vertex, N - normal, T - uv, C - color
+   F - float, UB - unsigned byte */
+#define GPU_BUFFER_INTER_V3F   1
+#define GPU_BUFFER_INTER_N3F   2
+#define GPU_BUFFER_INTER_T2F   3
+#define GPU_BUFFER_INTER_C3UB  4
+#define GPU_BUFFER_INTER_END   -1
+
 typedef struct GPUBuffer
 {
        int size;       /* in bytes */
@@ -114,6 +122,7 @@
 void GPU_color_setup( struct DerivedMesh *dm );
 void GPU_edge_setup( struct DerivedMesh *dm ); /* does not mix with other data 
*/
 void GPU_uvedge_setup( struct DerivedMesh *dm );
+void GPU_interleaved_setup( GPUBuffer *buffer, int data[] );
 
 void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int 
start, int count );
 void *GPU_buffer_lock( 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-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-07-29 14:20:49 UTC (rev 22016)
@@ -149,6 +149,12 @@
 
        DEBUG_VBO("GPU_buffer_alloc\n");
 
+       if( pool == 0 ) {
+               if( globalPool == 0 )
+                       globalPool = GPU_buffer_pool_new();
+               pool = globalPool;
+       }
+
        while( pool->start < 0 )
                pool->start += MAX_FREE_GPU_BUFFERS;
 
@@ -176,8 +182,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 {
@@ -918,6 +924,92 @@
        GLStates |= GPU_BUFFER_VERTEX_STATE;
 }
 
+void GPU_interleaved_setup( GPUBuffer *buffer, int data[] ) {
+       int i;
+       int elementsize = 0;
+       int offset = 0;
+       for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
+               switch( data[i] ) {
+                       case GPU_BUFFER_INTER_V3F:
+                               elementsize += 3*sizeof(float);
+                               break;
+                       case GPU_BUFFER_INTER_N3F:
+                               elementsize += 3*sizeof(float);
+                               break;
+                       case GPU_BUFFER_INTER_T2F:
+                               elementsize += 2*sizeof(float);
+                               break;
+                       case GPU_BUFFER_INTER_C3UB:
+                               elementsize += 3*sizeof(unsigned char);
+                               break;
+                       default:
+                               DEBUG_VBO( "Unknown element in data type array 
in GPU_interleaved_setup\n" );
+               }
+       }
+
+       if( useVBOs ) {
+               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;
+                       }
+               }
+       }
+       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:

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