Revision: 20993
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20993
Author:   imbusy
Date:     2009-06-18 22:02:50 +0200 (Thu, 18 Jun 2009)

Log Message:
-----------
VBOs work for solid faces! (still need to debug vertex arrays)

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-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c   
2009-06-18 20:02:50 UTC (rev 20993)
@@ -60,6 +60,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "GPU_buffers.h"
 #include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -252,72 +253,16 @@
 
 static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int, void 
*attribs))
 {
-       CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
-       MVert *mvert = cddm->mvert;
-       MFace *mface = cddm->mface;
-       float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
-       int a, glmode = -1, shademodel = -1, matnr = -1, drawCurrentMat = 1;
-
-#define PASSVERT(index) {                                              \
-       if(shademodel == GL_SMOOTH) {                           \
-               short *no = mvert[index].no;                    \
-               glNormal3sv(no);                                                
\
-       }                                                                       
                \
-       glVertex3fv(mvert[index].co);   \
-}
-
-       glBegin(glmode = GL_QUADS);
-       for(a = 0; a < dm->numFaceData; a++, mface++) {
-               int new_glmode, new_matnr, new_shademodel;
-
-               new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
-               new_matnr = mface->mat_nr + 1;
-               new_shademodel = (mface->flag & ME_SMOOTH)?GL_SMOOTH:GL_FLAT;
-               
-               if(new_glmode != glmode || new_matnr != matnr
-                  || new_shademodel != shademodel) {
-                       glEnd();
-
-                       drawCurrentMat = setMaterial(matnr = new_matnr, NULL);
-
-                       glShadeModel(shademodel = new_shademodel);
-                       glBegin(glmode = new_glmode);
-               } 
-               
-               if(drawCurrentMat) {
-                       if(shademodel == GL_FLAT) {
-                               if (nors) {
-                                       glNormal3fv(nors);
-                               }
-                               else {
-                                       /* TODO make this better (cache 
facenormals as layer?) */
-                                       float nor[3];
-                                       if(mface->v4) {
-                                               
CalcNormFloat4(mvert[mface->v1].co, mvert[mface->v2].co,
-                                                                          
mvert[mface->v3].co, mvert[mface->v4].co,
-                                                                          nor);
-                                       } else {
-                                               
CalcNormFloat(mvert[mface->v1].co, mvert[mface->v2].co,
-                                                                         
mvert[mface->v3].co, nor);
-                                       }
-                                       glNormal3fv(nor);
-                               }
-                       }
-
-                       PASSVERT(mface->v1);
-                       PASSVERT(mface->v2);
-                       PASSVERT(mface->v3);
-                       if(mface->v4) {
-                               PASSVERT(mface->v4);
-                       }
-               }
-
-               if(nors) nors += 3;
+       int i;
+       GPU_vertex_setup( dm );
+       GPU_normal_setup( dm );
+       glShadeModel(GL_SMOOTH);
+       for( i = 0; i < dm->drawObject->nmaterials; i++ ) {
+               setMaterial(dm->drawObject->materials[i].mat_nr+1, NULL);
+               glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[i].start, 
dm->drawObject->materials[i].end);
        }
-       glEnd();
-
+       GPU_buffer_unbind( );
        glShadeModel(GL_FLAT);
-#undef PASSVERT
 }
 
 static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned 
char *col1, unsigned char *col2)

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-06-18 
19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-06-18 
20:02:50 UTC (rev 20993)
@@ -83,20 +83,14 @@
 GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
 void GPU_drawobject_free( GPUDrawObject *object );
 
-/* collect the data into buffers */
-/*GPUBuffer *GPU_buffer_vertex( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_normal( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_color( struct DerivedMesh *dm );*/
-
 /* called before drawing */
 void GPU_vertex_setup( struct DerivedMesh *dm );
 void GPU_normal_setup( struct DerivedMesh *dm );
 void GPU_uv_setup( struct DerivedMesh *dm );
 void GPU_color_setup( struct DerivedMesh *dm );
 
-void GPU_buffer_draw( struct DerivedMesh *dm );
-void GPU_buffer_draw_selected( struct DerivedMesh *dm, int selected );
+/* upload three unsigned chars, representing RGB colors, for each vertex */
+void GPU_color_upload( struct DerivedMesh *dm, char *data );
 
 /* called after drawing */
 void GPU_buffer_unbind();

Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-06-18 20:02:50 UTC (rev 20993)
@@ -41,9 +41,15 @@
 #include "DNA_meshdata_types.h"
 #include "BLI_arithb.h"
 
+#define GPU_BUFFER_VERTEX_STATE 1
+#define GPU_BUFFER_NORMAL_STATE 2
+#define GPU_BUFFER_TEXCOORD_STATE 4
+#define GPU_BUFFER_COLOR_STATE 8
+
 /* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
 int useVBOs = -1;
 GPUBufferPool *globalPool = 0;
+int GLStates = 0;
 
 GPUBufferPool *GPU_buffer_pool_new()
 {
@@ -56,9 +62,7 @@
                        useVBOs = 0;
        }
 
-       pool = MEM_mallocN(sizeof(GPUBufferPool), "GPU_buffer_pool_new");
-       pool->size = 0;
-       pool->start = 0;
+       pool = MEM_callocN(sizeof(GPUBufferPool), "GPU_buffer_pool_new");
 
        return pool;
 }
@@ -216,7 +220,7 @@
        curmat = curverts = 0;
        for( i = 0; i < 256; i++ ) {
                if( numverts[i] > 0 ) {
-                       object->materials[curmat].mat_nr = i;
+                       object->materials[curmat].mat_nr = i-127;
                        object->materials[curmat].start = curverts;
                        object->materials[curmat].end = curverts+numverts[i];
                        curverts += numverts[i];
@@ -254,9 +258,11 @@
        index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup");
        for( i = 0; i < object->nmaterials; i++ ) {
                index[i] = object->materials[i].start;
-               redir[object->materials[i].mat_nr] = i;
+               redir[object->materials[i].mat_nr+127] = i;
        }
 
+       if( globalPool == 0 )
+               globalPool = GPU_buffer_pool_new();
        buffer = GPU_buffer_alloc(size,globalPool);
 
        if( useVBOs ) {
@@ -358,14 +364,14 @@
                if( mface[i].v4 ) {
                        /* v3 v4 v1 */
                        if( mface->flag & ME_SMOOTH ) {
-                               VECCOPY(&varray[start],mvert[mface[i].v3].no);
-                               VECCOPY(&varray[start+3],mvert[mface[i].v4].no);
-                               VECCOPY(&varray[start+6],mvert[mface[i].v1].no);
+                               VECCOPY(&varray[start+9],mvert[mface[i].v3].no);
+                               
VECCOPY(&varray[start+12],mvert[mface[i].v4].no);
+                               
VECCOPY(&varray[start+15],mvert[mface[i].v1].no);
                        }
                        else {
-                               VECCOPY(&varray[start],norm);
-                               VECCOPY(&varray[start+3],norm);
-                               VECCOPY(&varray[start+6],norm);
+                               VECCOPY(&varray[start+9],norm);
+                               VECCOPY(&varray[start+12],norm);
+                               VECCOPY(&varray[start+15],norm);
                        }
                }
        }
@@ -477,10 +483,12 @@
        if( dm->drawObject == 0 )
                dm->drawObject = GPU_drawobject_new( dm );
        if( dm->drawObject->vertices == 0 )
-               GPU_buffer_vertex( dm );
+               dm->drawObject->vertices = GPU_buffer_vertex( dm );
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->vertices->id );
        glEnableClientState( GL_VERTEX_ARRAY );
        glVertexPointer( 3, GL_FLOAT, 0, 0 );
+       
+       GLStates |= GPU_BUFFER_VERTEX_STATE;
 }
 
 void GPU_normal_setup( DerivedMesh *dm )
@@ -488,10 +496,12 @@
        if( dm->drawObject == 0 )
                dm->drawObject = GPU_drawobject_new( dm );
        if( dm->drawObject->normals == 0 )
-               GPU_buffer_normal( dm );
+               dm->drawObject->normals = GPU_buffer_normal( dm );
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->normals->id );
        glEnableClientState( GL_NORMAL_ARRAY );
        glNormalPointer( GL_FLOAT, 0, 0 );
+
+       GLStates |= GPU_BUFFER_NORMAL_STATE;
 }
 
 void GPU_uv_setup( DerivedMesh *dm )
@@ -499,10 +509,12 @@
        if( dm->drawObject == 0 )
                dm->drawObject = GPU_drawobject_new( dm );
        if( dm->drawObject->uv == 0 )
-               GPU_buffer_uv( dm );
+               dm->drawObject->uv = GPU_buffer_uv( dm );
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
        glEnableClientState( GL_TEXTURE_COORD_ARRAY );
        glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+
+       GLStates |= GPU_BUFFER_TEXCOORD_STATE;
 }
 
 void GPU_color_setup( DerivedMesh *dm )
@@ -510,8 +522,24 @@
        if( dm->drawObject == 0 )
                dm->drawObject = GPU_drawobject_new( dm );
        if( dm->drawObject->colors == 0 )
-               GPU_buffer_uv( dm );
+               dm->drawObject->colors = GPU_buffer_uv( dm );
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->colors->id );
        glEnableClientState( GL_COLOR_ARRAY );
        glColorPointer( 3, GL_UNSIGNED_BYTE, 0, 0 );
+
+       GLStates |= GPU_BUFFER_COLOR_STATE;
 }
+
+void GPU_buffer_unbind()
+{
+       if( GLStates & GPU_BUFFER_VERTEX_STATE )
+               glDisableClientState( GL_VERTEX_ARRAY );
+       if( GLStates & GPU_BUFFER_NORMAL_STATE )
+               glDisableClientState( GL_NORMAL_ARRAY );
+       if( GLStates & GPU_BUFFER_TEXCOORD_STATE )
+               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 );
+       glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
+}
\ No newline at end of file


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

Reply via email to