Revision: 21380
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21380
Author:   imbusy
Date:     2009-07-06 12:45:14 +0200 (Mon, 06 Jul 2009)

Log Message:
-----------
fixed a crashing bug when allocating buffers from pool, started work on vertex 
paint mode, somehow can paint only 4 vertices

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
    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-07-06 08:57:37 UTC (rev 21379)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c   
2009-07-06 10:45:14 UTC (rev 21380)
@@ -563,7 +563,7 @@
                                        GPU_color_switch(1);
                                else
                                        GPU_color_switch(0);
-                               
glDrawArrays(GL_TRIANGLES,startFace*3,((dm->drawObject->nelements/3)-startFace)*3);
+                               
glDrawArrays(GL_TRIANGLES,startFace*3,dm->drawObject->nelements-startFace*3);
                        }
                }
                GPU_buffer_unbind();
@@ -662,13 +662,40 @@
                }
        }
        else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster 
rendering */
+               int state = 1;
+               int prevstate = 1;
+               int prevstart = 0;
                GPU_vertex_setup(dm);
                GPU_normal_setup(dm);
                if( useColors && mc )
                        GPU_color_setup(dm);
                glShadeModel(GL_SMOOTH);
-               glDrawArrays(GL_TRIANGLES,0,dm->drawObject->nelements);
-               glShadeModel(GL_FLOAT);
+               for( i = 0; i < dm->drawObject->nelements/3; i++ ) {
+                       int actualFace = dm->drawObject->faceRemap[i];
+                       int drawSmooth = (mf[actualFace].flag & ME_SMOOTH);
+                       if(index) {
+                               orig = index[actualFace];
+                       }
+                       else
+                               orig = i;
+                       if(!setDrawOptions || setDrawOptions(userData, orig, 
&drawSmooth)) {
+                               state = 1;
+                       }
+                       else {
+                               state = 0;
+                       }
+                       if( prevstate != state && prevstate == 1 ) {
+                               if( i-prevstart > 0 ) {
+                                       
glDrawArrays(GL_TRIANGLES,prevstart*3,(i-prevstart)*3);
+                               }
+                               prevstart = i;
+                       }
+                       prevstate = state;
+               }
+               if(state==1) {
+                       
glDrawArrays(GL_TRIANGLES,prevstart*3,dm->drawObject->nelements-prevstart*3);
+               }
+               glShadeModel(GL_FLAT);
                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-07-06 08:57:37 UTC (rev 21379)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-07-06 10:45:14 UTC (rev 21380)
@@ -145,9 +145,10 @@
                pool->start += MAX_FREE_GPU_BUFFERS;
 
        for( i = 0; i < pool->size; i++ ) {
-               cursize = 
pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS]->size;
+               int actuali = (pool->start+i)%MAX_FREE_GPU_BUFFERS;
+               cursize = pool->buffers[actuali]->size;
                if( cursize == size ) {
-                       allocated = pool->buffers[pool->start+i];
+                       allocated = pool->buffers[actuali];
                        GPU_buffer_pool_remove(i,pool);
                        DEBUG_VBO("free buffer of exact size found\n");
                        return allocated;
@@ -183,10 +184,10 @@
                }
        }
        else {
-               sprintf(buffer,"free buffer found. Wasted %d bytes\n", 
pool->buffers[pool->start+bestfit]->size-size);
+               sprintf(buffer,"free buffer found. Wasted %d bytes\n", 
pool->buffers[(pool->start+bestfit)%MAX_FREE_GPU_BUFFERS]->size-size);
                DEBUG_VBO(buffer);
 
-               allocated = pool->buffers[pool->start+bestfit];
+               allocated = 
pool->buffers[(pool->start+bestfit)%MAX_FREE_GPU_BUFFERS];
                GPU_buffer_pool_remove(bestfit,pool);
        }
        return allocated;
@@ -556,15 +557,31 @@
                else
                        index[redir[mface[i].mat_nr+127]] += 9;
 
+               varray[start] = mcol[i*12];
+               varray[start+1] = mcol[i*12+1];
+               varray[start+2] = mcol[i*12+2];
+
+               varray[start+3] = mcol[i*12+3];
+               varray[start+4] = mcol[i*12+4];
+               varray[start+5] = mcol[i*12+5];
+
+               varray[start+6] = mcol[i*12+6];
+               varray[start+7] = mcol[i*12+7];
+               varray[start+8] = mcol[i*12+8];
                /* v1 v2 v3 */
-               VECCOPY(&varray[start],&mcol[i*12]);
-               VECCOPY(&varray[start+3],&mcol[i*12+3]);
-               VECCOPY(&varray[start+6],&mcol[i*12+6]);
                if( mface[i].v4 ) {
                        /* v3 v4 v1 */
-                       VECCOPY(&varray[start+9],&mcol[i*12+6]);
-                       VECCOPY(&varray[start+12],&mcol[i*12+9]);
-                       VECCOPY(&varray[start+15],&mcol[i*12]);
+                       varray[start+9] = mcol[i*12+6];
+                       varray[start+10] = mcol[i*12+7];
+                       varray[start+11] = mcol[i*12+8];
+
+                       varray[start+12] = mcol[i*12+9];
+                       varray[start+13] = mcol[i*12+10];
+                       varray[start+14] = mcol[i*12+11];
+
+                       varray[start+15] = mcol[i*12];
+                       varray[start+16] = mcol[i*12+1];
+                       varray[start+17] = mcol[i*12+2];
                }
        }
 }
@@ -615,24 +632,21 @@
        DEBUG_VBO("GPU_buffer_color\n");
 
        mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+       dm->drawObject->colType = CD_WEIGHT_MCOL;
        if(!mcol) {
                mcol = DM_get_face_data_layer(dm, CD_MCOL);
+               dm->drawObject->colType = CD_MCOL;
        }
 
-       colors = MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), 
"GPU_buffer_color");
-       for( i=0; i < dm->getNumFaces(dm); i++ ) {
-               colors[i*3] = mcol[i].r;
+       colors = MEM_mallocN(dm->getNumFaces(dm)*12*sizeof(unsigned char), 
"GPU_buffer_color");
+       for( i=0; i < dm->getNumFaces(dm)*4; i++ ) {
+               colors[i*3] = mcol[i].b;
                colors[i*3+1] = mcol[i].g;
-               colors[i*3+2] = mcol[i].b;
+               colors[i*3+2] = mcol[i].r;
        }
 
        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;
 }


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

Reply via email to