Revision: 21083
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21083
Author:   imbusy
Date:     2009-06-22 21:35:52 +0200 (Mon, 22 Jun 2009)

Log Message:
-----------
textured mode seems to work, but could be improved

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-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c   
2009-06-22 19:35:52 UTC (rev 21083)
@@ -318,8 +318,70 @@
        float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
        MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
        int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+       int startFace = 0, lastFlag = 0xdeadbeef;
+       GPU_vertex_setup( dm );
+       GPU_normal_setup( dm );
+       GPU_uv_setup( dm );
+       if( mcol != 0 ) {
+               if( dm->drawObject->colType != CD_MCOL ) {
+                       unsigned char *colors = 
MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), 
"cdDM_drawFacesTex_common");
+                       for( i=0; i < dm->getNumFaces(dm); i++ ) {
+                               colors[i*3] = mcol[i].r;
+                               colors[i*3+1] = mcol[i].g;
+                               colors[i*3+2] = mcol[i].b;
+                       }
+                       GPU_color3_upload(dm,colors);
+                       MEM_freeN(colors);
+                       dm->drawObject->colType = CD_MCOL;
+               }
+               GPU_color_setup( dm );
+       }
 
-       for(i = 0; i < dm->numFaceData; i++, mf++) {
+       glShadeModel( GL_SMOOTH );
+       for(i = 0; i < dm->drawObject->nelements/3; i++) {
+               int actualFace = dm->drawObject->faceRemap[i];
+               int flag;
+               unsigned char *cp = NULL;
+
+               if(drawParams) {
+                       flag = drawParams(tf? &tf[actualFace]: NULL, mcol? 
&mcol[actualFace*4]: NULL, mf[actualFace].mat_nr);
+               }
+               else {
+                       if(index) {
+                               orig = index[actualFace];
+                               if(drawParamsMapped)
+                                       flag = drawParamsMapped(userData, orig);
+                       }
+                       else
+                               if(drawParamsMapped)
+                                       flag = drawParamsMapped(userData, 
actualFace);
+               }
+               if( flag != lastFlag ) {
+                       if( startFace < i ) {
+                               if( lastFlag != 0 ) { /* if the flag is 0 it 
means the face is hidden or invisible */
+                                       if (lastFlag==1 && mcol)
+                                               GPU_color_switch(1);
+                                       else
+                                               GPU_color_switch(0);
+                                       
glDrawArrays(GL_TRIANGLES,startFace*3,(i-startFace)*3);
+                               }
+                       }
+                       lastFlag = flag;
+                       startFace = i;
+               }
+       }
+       if( startFace < dm->drawObject->nelements/3 ) {
+               if( lastFlag != 0 ) { /* if the flag is 0 it means the face is 
hidden or invisible */
+                       if (lastFlag==1 && mcol)
+                               GPU_color_switch(1);
+                       else
+                               GPU_color_switch(0);
+                       
glDrawArrays(GL_TRIANGLES,startFace*3,((dm->drawObject->nelements/3)-startFace)*3);
+               }
+       }
+       GPU_buffer_unbind();
+       glShadeModel( GL_FLAT );
+       /*for(i = 0; i < dm->numFaceData; i++, mf++) {
                MVert *mvert;
                int flag;
                unsigned char *cp = NULL;
@@ -339,7 +401,7 @@
                                else    { if(nors) nors += 3; continue; }
                }
                
-               if(flag != 0) { /* if the flag is 0 it means the face is hidden 
or invisible */
+               if(flag != 0) {
                        if (flag==1 && mcol)
                                cp= (unsigned char*) &mcol[i*4];
 
@@ -348,7 +410,6 @@
                                        glNormal3fv(nors);
                                }
                                else {
-                                       /* TODO make this better (cache 
facenormals as layer?) */
                                        float nor[3];
                                        if(mf->v4) {
                                                CalcNormFloat4(mv[mf->v1].co, 
mv[mf->v2].co,
@@ -392,7 +453,7 @@
                }
                
                if(nors) nors += 3;
-       }
+       }*/
 }
 
 static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace 
*tface, MCol *mcol, int matnr))

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-06-22 
18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-06-22 
19:35:52 UTC (rev 21083)
@@ -67,6 +67,8 @@
        GPUBuffer *normals;
        GPUBuffer *uv;
        GPUBuffer *colors;
+       int     *faceRemap;             /* at what index was the face 
originally in DerivedMesh */
+       int colType;
 
        GPUBufferMaterial *materials;
 
@@ -89,10 +91,12 @@
 void GPU_uv_setup( struct DerivedMesh *dm );
 void GPU_color_setup( struct DerivedMesh *dm );
 
-/* upload three unsigned chars, representing RGB colors, for each vertex */
+/* upload three unsigned chars, representing RGB colors, for each vertex. 
Resets dm->drawObject->colType to -1 */
 void GPU_color3_upload( struct DerivedMesh *dm, char *data );
-/* upload four unsigned chars, representing RGBA colors, for each vertex */
+/* upload four unsigned chars, representing RGBA colors, for each vertex. 
Resets dm->drawObject->colType to -1 */
 void GPU_color4_upload( struct DerivedMesh *dm, char *data );
+/* switch color rendering on=1/off=0 */
+void GPU_color_switch( int mode );
 
 /* 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-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-06-22 19:35:52 UTC (rev 21083)
@@ -195,6 +195,10 @@
 
        if( buffer == 0 )
                return;
+       if( pool == 0 )
+               pool = globalPool;
+       if( pool == 0 )
+               globalPool = GPU_buffer_pool_new();
 
        while( pool->start < 0 )
                pool->start += MAX_FREE_GPU_BUFFERS;
@@ -216,6 +220,8 @@
        MVert *mvert;
        MFace *mface;
        int numverts[256];      /* material number is an 8-bit char so there's 
at most 256 materials */
+       int redir[256];         /* material number is an 8-bit char so there's 
at most 256 materials */
+       int *index;
        int i;
        int curmat, curverts;
 
@@ -242,18 +248,36 @@
                }
        }
        object->materials = 
MEM_mallocN(sizeof(GPUBufferMaterial)*object->nmaterials,"GPU_drawobject_new_materials");
+       index = 
MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup_index");
 
        curmat = curverts = 0;
        for( i = 0; i < 256; i++ ) {
                if( numverts[i] > 0 ) {
                        object->materials[curmat].mat_nr = i-127;
                        object->materials[curmat].start = curverts;
+                       index[curmat] = curverts/3;
                        object->materials[curmat].end = curverts+numverts[i];
                        curverts += numverts[i];
                        curmat++;
                }
        }
+       object->faceRemap = 
MEM_mallocN(sizeof(int)*object->nelements/3,"GPU_drawobject_new_faceRemap");
+       for( i = 0; i < object->nmaterials; i++ ) {
+               redir[object->materials[i].mat_nr+127] = i;     /* material 
number -> material index */
+       }
 
+       for( i=0; i < dm->getNumFaces(dm); i++ ) {
+               object->faceRemap[index[redir[mface[i].mat_nr+127]]] = i; 
+               if( mface[i].v4 ) {
+                       object->faceRemap[index[redir[mface[i].mat_nr+127]]+1] 
= i;
+                       index[redir[mface[i].mat_nr+127]]+=2;
+               }
+               else
+               {
+                       index[redir[mface[i].mat_nr+127]]++;
+               }
+       }
+       MEM_freeN(index);
        return object;
 }
 
@@ -265,7 +289,7 @@
        DEBUG_VBO("GPU_drawobject_free\n");
 
        MEM_freeN(object->materials);
-
+       MEM_freeN(object->faceRemap);
        GPU_buffer_free( object->vertices, globalPool );
        GPU_buffer_free( object->normals, globalPool );
        GPU_buffer_free( object->uv, globalPool );
@@ -462,8 +486,10 @@
 GPUBuffer *GPU_buffer_uv( DerivedMesh *dm )
 {
        DEBUG_VBO("GPU_buffer_uv\n");
-
-       return GPU_buffer_setup( dm, dm->drawObject, 
sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+       if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 )
+               return GPU_buffer_setup( dm, dm->drawObject, 
sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+       else
+               return 0;
 }
 
 void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int 
*redir, void *user )
@@ -477,6 +503,7 @@
 
        DEBUG_VBO("GPU_buffer_copy_color3\n");
 
+       dm->drawObject->colType = -1;
        mcol = user;
        varray = (unsigned char *)varray_;
 
@@ -513,6 +540,7 @@
 
        DEBUG_VBO("GPU_buffer_copy_color4\n");
 
+       dm->drawObject->colType = -1;
        mcol = (unsigned char *)user;
        varray = (unsigned char *)varray_;
 
@@ -547,8 +575,9 @@
        DEBUG_VBO("GPU_buffer_color\n");
 
        mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
-       if(!mcol)
+       if(!mcol) {
                mcol = DM_get_face_data_layer(dm, CD_MCOL);
+       }
 
        colors = MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), 
"GPU_buffer_color");
        for( i=0; i < dm->getNumFaces(dm); i++ ) {
@@ -556,7 +585,14 @@
                colors[i*3+1] = mcol[i].g;
                colors[i*3+2] = mcol[i].b;
        }
+
        result = GPU_buffer_setup( dm, dm->drawObject, 
sizeof(char)*3*dm->drawObject->nelements, colors, GPU_buffer_copy_color3 );
+
+       mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+       dm->drawObject->colType = CD_WEIGHT_MCOL;
+       if(!mcol) {
+               dm->drawObject->colType = CD_MCOL;
+       }
        MEM_freeN(colors);
        return result;
 }
@@ -608,16 +644,19 @@
                dm->drawObject = GPU_drawobject_new( dm );
        if( dm->drawObject->uv == 0 )
                dm->drawObject->uv = GPU_buffer_uv( dm );
-       glEnableClientState( GL_TEXTURE_COORD_ARRAY );
-       if( useVBOs ) {
-               glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
-               glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+
+       if( dm->drawObject->uv != 0 ) {
+               glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+               if( useVBOs ) {
+                       glBindBufferARB( GL_ARRAY_BUFFER_ARB, 
dm->drawObject->uv->id );
+                       glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+               }
+               else {
+                       glTexCoordPointer( 2, GL_FLOAT, 0, 
dm->drawObject->uv->pointer );
+               }
+
+               GLStates |= GPU_BUFFER_TEXCOORD_STATE;
        }
-       else {
-               glTexCoordPointer( 2, GL_FLOAT, 0, dm->drawObject->uv->pointer 
);
-       }
-
-       GLStates |= GPU_BUFFER_TEXCOORD_STATE;
 }
 
 void GPU_color_setup( DerivedMesh *dm )
@@ -626,7 +665,7 @@
        if( dm->drawObject == 0 )
                dm->drawObject = GPU_drawobject_new( dm );
        if( dm->drawObject->colors == 0 )
-               dm->drawObject->colors = GPU_buffer_uv( dm );
+               dm->drawObject->colors = GPU_buffer_color( dm );
        glEnableClientState( GL_COLOR_ARRAY );
        if( useVBOs ) {
                glBindBufferARB( GL_ARRAY_BUFFER_ARB, 
dm->drawObject->colors->id );
@@ -670,4 +709,18 @@
                dm->drawObject = GPU_drawobject_new(dm);
        GPU_buffer_free(dm->drawObject->colors,globalPool);
        dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, 
sizeof(char)*3*dm->drawObject->nelements, data, GPU_buffer_copy_color4 );
+}
+
+void GPU_color_switch( int mode )
+{
+       if( mode ) {
+               if( !GLStates & GPU_BUFFER_COLOR_STATE )
+                       glEnableClientState( GL_COLOR_ARRAY );
+               GLStates |= GPU_BUFFER_COLOR_STATE;
+       }
+       else {
+               if( GLStates & GPU_BUFFER_COLOR_STATE )
+                       glDisableClientState( GL_COLOR_ARRAY );
+               GLStates &= (!GPU_BUFFER_COLOR_STATE);
+       }
 }
\ 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