[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21380] branches/soc-2009-imbusy/source/ blender: fixed a crashing bug when allocating buffers from pool, started work on vertex paint mode, somehow can paint only 4 vertices
Lukas Steiblys
imbusy at imbusy.org
Mon Jul 6 12:45:15 CEST 2009
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;
}
More information about the Bf-blender-cvs
mailing list