Revision: 20768
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20768
Author:   imbusy
Date:     2009-06-09 20:57:39 +0200 (Tue, 09 Jun 2009)

Log Message:
-----------
Now generates vertex, normal, texture and color VBOs and vertex arrays. Not yet 
tested.

Modified Paths:
--------------
    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/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-06-09 
18:50:02 UTC (rev 20767)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-06-09 
18:57:39 UTC (rev 20768)
@@ -85,7 +85,7 @@
 
 GPUBuffer *GPU_buffer_vertex( struct DerivedMesh *dm, GPUDrawObject *object );
 GPUBuffer *GPU_buffer_normal( struct DerivedMesh *dm, GPUDrawObject *object );
+GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm, GPUDrawObject *object );
 GPUBuffer *GPU_buffer_color( struct DerivedMesh *dm, GPUDrawObject *object );
-GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm, GPUDrawObject *object );
 
 #endif

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-09 18:50:02 UTC (rev 20767)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-06-09 18:57:39 UTC (rev 20768)
@@ -37,7 +37,9 @@
 #include "gpu_buffers.h"
 #include "MEM_guardedalloc.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_utildefines.h"
 #include "DNA_meshdata_types.h"
+#include "BLI_arithb.h"
 
 /* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
 int useVBOs = -1;
@@ -137,7 +139,9 @@
                allocated = MEM_mallocN(sizeof(GPUBuffer), "GPU_buffer_alloc");
                allocated->size = size;
                if( useVBOs == 1 ) {
-                       glGenBuffersARB( 1, &allocated->id );   /* the actual 
size is specified later when copying data. Theoretically could be different */
+                       glGenBuffersARB( 1, &allocated->id );
+                       glBindBufferARB( GL_ARRAY_BUFFER_ARB, allocated->id );
+                       glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, 0, 
GL_STATIC_DRAW_ARB );
                }
                else {
                        allocated->pointer = MEM_mallocN(size, 
"GPU_buffer_alloc_vertexarray");
@@ -186,8 +190,7 @@
        int i;
        int curmat, curverts;
 
-       object = MEM_mallocN(sizeof(GPUDrawObject),"GPU_drawobject_new");
-       memset(object,0,sizeof(GPUDrawObject));
+       object = MEM_callocN(sizeof(GPUDrawObject),"GPU_drawobject_new");
 
        memset(numverts,0,sizeof(int)*256);
 
@@ -240,65 +243,226 @@
        MEM_freeN(object);
 }
 
-GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm, GPUDrawObject *object )
+GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, 
void (*copy_f)(DerivedMesh *, float *, int *, int *) )
 {
        GPUBuffer *buffer;
-       MVert *mvert;
-       MFace *mface;
        float *varray;
-       int start;
        int redir[256];
        int *index;
        int i;
+       GLboolean uploaded;
 
-       index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_vertex");
-       for( i = 0; i < object->nmaterials; i++ )
-       {
+       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;
        }
-       mvert = dm->getVertArray(dm);
-       mface = dm->getFaceArray(dm);
 
-       buffer = GPU_buffer_alloc(sizeof(float)*3*object->nelements,globalPool);
+       buffer = GPU_buffer_alloc(size,globalPool);
 
        if( useVBOs ) {
-               printf("GPU_buffer_vertex VBO not implemented yet");
+               glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
+               glBufferDataARB( GL_ARRAY_BUFFER_ARB, buffer->size, 0, 
GL_STATIC_DRAW_ARB );    /* discard previous data, avoid stalling gpu */
+               varray = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB 
);
+               if( varray == 0 )
+                       printf( "Failed to map buffer to client address space" 
);
+
+               uploaded = GL_FALSE;
+               while( !uploaded ) {
+                       (*copy_f)( dm, varray, index, redir );
+                       uploaded = glUnmapBufferARB( GL_ARRAY_BUFFER_ARB );     
/* returns false if data got corruped during transfer */
+               }
        }
        else {
                varray = buffer->pointer;
-               for( i=0; i < dm->getNumFaces(dm); i++ ) {
-                       start = index[redir[mface[i].mat_nr]];
+               (*copy_f)( dm, varray, index, redir );
+       }
+
+       MEM_freeN(index);
+
+       return buffer;
+}
+
+void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int 
*redir )
+{
+       int start;
+       int i;
+
+       MVert *mvert;
+       MFace *mface;
+
+       mvert = dm->getVertArray(dm);
+       mface = dm->getFaceArray(dm);
+
+       for( i=0; i < dm->getNumFaces(dm); i++ ) {
+               start = index[redir[mface[i].mat_nr]];
+               if( mface[i].v4 )
+                       index[redir[mface[i].mat_nr]] += 18;
+               else
+                       index[redir[mface[i].mat_nr]] += 9;
+
+               /* v1 v2 v3 */
+               VECCOPY(&varray[start],mvert[mface[i].v1].co);
+               VECCOPY(&varray[start+3],mvert[mface[i].v2].co);
+               VECCOPY(&varray[start+6],mvert[mface[i].v3].co);
+
+               if( mface[i].v4 ) {
+                       /* v3 v4 v1 */
+                       VECCOPY(&varray[start+9],mvert[mface[i].v3].co);
+                       VECCOPY(&varray[start+12],mvert[mface[i].v4].co);
+                       VECCOPY(&varray[start+15],mvert[mface[i].v1].co);
+               }
+       }
+}
+
+GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm, GPUDrawObject *object )
+{
+       return GPU_buffer_setup( dm, object, sizeof(float)*3*object->nelements, 
GPU_buffer_copy_vertex);
+}
+
+void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int 
*redir )
+{
+       int i;
+       int start;
+       float norm[3];
+
+       MVert *mvert;
+       MFace *mface;
+
+       mvert = dm->getVertArray(dm);
+       mface = dm->getFaceArray(dm);
+
+       for( i=0; i < dm->getNumFaces(dm); i++ ) {
+               start = index[redir[mface[i].mat_nr]];
+               if( mface[i].v4 )
+                       index[redir[mface[i].mat_nr]] += 18;
+               else
+                       index[redir[mface[i].mat_nr]] += 9;
+
+               /* v1 v2 v3 */
+               if( mface->flag & ME_SMOOTH ) {
+                       VECCOPY(&varray[start],mvert[mface[i].v1].no);
+                       VECCOPY(&varray[start+3],mvert[mface[i].v2].no);
+                       VECCOPY(&varray[start+6],mvert[mface[i].v3].no);
+               }
+               else {
                        if( mface[i].v4 )
-                               index[redir[mface[i].mat_nr]] += 18;
+                               CalcNormFloat4(mvert[mface[i].v1].co, 
mvert[mface[i].v2].co, mvert[mface[i].v3].co, mvert[mface[i].v4].co, norm);
                        else
-                               index[redir[mface[i].mat_nr]] += 9;
+                               CalcNormFloat(mvert[mface[i].v1].co, 
mvert[mface[i].v2].co, mvert[mface[i].v3].co, norm);
+                       VECCOPY(&varray[start],norm);
+                       VECCOPY(&varray[start+3],norm);
+                       VECCOPY(&varray[start+6],norm);
+               }
 
-                       varray[start] = mvert[mface[i].v1].co[0];
-                       varray[start+1] = mvert[mface[i].v1].co[1];
-                       varray[start+2] = mvert[mface[i].v1].co[2];
-                       varray[start+3] = mvert[mface[i].v2].co[0];
-                       varray[start+4] = mvert[mface[i].v2].co[1];
-                       varray[start+5] = mvert[mface[i].v2].co[2];
-                       varray[start+6] = mvert[mface[i].v3].co[0];
-                       varray[start+7] = mvert[mface[i].v3].co[1];
-                       varray[start+8] = mvert[mface[i].v3].co[2];
-
-                       if( mface[i].v4 ) {
-                               varray[start+9] = mvert[mface[i].v3].co[0];
-                               varray[start+10] = mvert[mface[i].v3].co[1];
-                               varray[start+11] = mvert[mface[i].v3].co[2];
-                               varray[start+12] = mvert[mface[i].v4].co[0];
-                               varray[start+13] = mvert[mface[i].v4].co[1];
-                               varray[start+14] = mvert[mface[i].v4].co[2];
-                               varray[start+15] = mvert[mface[i].v1].co[0];
-                               varray[start+16] = mvert[mface[i].v1].co[1];
-                               varray[start+17] = mvert[mface[i].v1].co[2];
+               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);
                        }
+                       else {
+                               VECCOPY(&varray[start],norm);
+                               VECCOPY(&varray[start+3],norm);
+                               VECCOPY(&varray[start+6],norm);
+                       }
                }
        }
+}
 
-       MEM_freeN(index);
+GPUBuffer *GPU_buffer_normal( struct DerivedMesh *dm, GPUDrawObject *object )
+{
+       return GPU_buffer_setup( dm, object, sizeof(float)*3*object->nelements, 
GPU_buffer_copy_normal);
+}
 
-       return buffer;
-}
\ No newline at end of file
+void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int 
*redir )
+{
+       int start;
+       int i;
+
+       MTFace *mtface;
+       MFace *mface;
+
+       mface = dm->getFaceArray(dm);
+       mtface = DM_get_face_data_layer(dm, CD_MTFACE);
+
+       for( i=0; i < dm->getNumFaces(dm); i++ ) {
+               start = index[redir[mface[i].mat_nr]];
+               if( mface[i].v4 )
+                       index[redir[mface[i].mat_nr]] += 12;
+               else
+                       index[redir[mface[i].mat_nr]] += 6;
+
+               /* v1 v2 v3 */
+               VECCOPY2D(&varray[start],mtface[i].uv[0]);
+               VECCOPY2D(&varray[start+2],mtface[i].uv[1]);
+               VECCOPY2D(&varray[start+4],mtface[i].uv[2]);
+
+               if( mface[i].v4 ) {
+                       /* v3 v4 v1 */
+                       VECCOPY2D(&varray[start+6],mtface[i].uv[2]);
+                       VECCOPY2D(&varray[start+8],mtface[i].uv[3]);
+                       VECCOPY2D(&varray[start+10],mtface[i].uv[0]);
+               }
+       }
+}
+
+GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm, GPUDrawObject *object )
+{
+       return GPU_buffer_setup( dm, object, sizeof(float)*2*object->nelements, 
GPU_buffer_copy_uv);
+}
+
+void GPU_buffer_copy_color( DerivedMesh *dm, float *varray_, int *index, int 
*redir )
+{
+       int start;
+       int i;
+       
+       char *varray;
+       MFace *mface;
+       MCol *mcol;
+
+       varray = (char *)varray_;
+
+       mface = dm->getFaceArray(dm);
+       mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+       if(!mcol)
+               mcol = DM_get_face_data_layer(dm, CD_MCOL);
+
+       for( i=0; i < dm->getNumFaces(dm); i++ ) {
+               start = index[redir[mface[i].mat_nr]];
+               if( mface[i].v4 )
+                       index[redir[mface[i].mat_nr]] += 18;
+               else
+                       index[redir[mface[i].mat_nr]] += 9;
+
+               /* v1 v2 v3 */
+               varray[start] = mcol[i*4].r;
+               varray[start+1] = mcol[i*4].g;
+               varray[start+2] = mcol[i*4].b;
+               varray[start+3] = mcol[i*4+1].r;
+               varray[start+4] = mcol[i*4+1].g;
+               varray[start+5] = mcol[i*4+1].b;
+               varray[start+6] = mcol[i*4+2].r;
+               varray[start+7] = mcol[i*4+2].g;
+               varray[start+8] = mcol[i*4+2].b;
+
+               if( mface[i].v4 ) {
+                       /* v3 v4 v1 */
+                       varray[start+9] = mcol[i*4+2].r;
+                       varray[start+10] = mcol[i*4+2].g;
+                       varray[start+11] = mcol[i*4+2].b;
+                       varray[start+12] = mcol[i*4+3].r;
+                       varray[start+13] = mcol[i*4+3].g;
+                       varray[start+14] = mcol[i*4+3].b;
+                       varray[start+15] = mcol[i*4].r;
+                       varray[start+16] = mcol[i*4].g;
+                       varray[start+17] = mcol[i*4].b;
+               }
+       }
+}
+
+GPUBuffer *GPU_buffer_color( struct DerivedMesh *dm, GPUDrawObject *object )
+{
+       return GPU_buffer_setup( dm, object, sizeof(char)*3*object->nelements, 
GPU_buffer_copy_color);
+}


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

Reply via email to