Revision: 23639 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23639 Author: blendix Date: 2009-10-05 18:48:52 +0200 (Mon, 05 Oct 2009)
Log Message: ----------- VBO: * Fix slowdown/freeze entering editmode on a high poly mesh, dm->getNumFaces can be slow, don't call it in a loop. * Fix 64bit pointer casting warnings. Modified Paths: -------------- trunk/blender/source/blender/gpu/intern/gpu_buffers.c Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c =================================================================== --- trunk/blender/source/blender/gpu/intern/gpu_buffers.c 2009-10-05 16:40:13 UTC (rev 23638) +++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c 2009-10-05 16:48:52 UTC (rev 23639) @@ -34,15 +34,19 @@ #include "GL/glew.h" -#include "DNA_userdef_types.h" +#include "MEM_guardedalloc.h" -#include "gpu_buffers.h" -#include "MEM_guardedalloc.h" +#include "BLI_arithb.h" + +#include "DNA_meshdata_types.h" + #include "BKE_DerivedMesh.h" #include "BKE_utildefines.h" -#include "DNA_meshdata_types.h" -#include "BLI_arithb.h" +#include "DNA_userdef_types.h" + +#include "gpu_buffers.h" + #define GPU_BUFFER_VERTEX_STATE 1 #define GPU_BUFFER_NORMAL_STATE 2 #define GPU_BUFFER_TEXCOORD_STATE 4 @@ -248,7 +252,7 @@ int redir[32768]; /* material number is an 16-bit short so there's at most 32768 materials */ int *index; int i; - int curmat, curverts; + int curmat, curverts, numfaces; DEBUG_VBO("GPU_drawobject_new\n"); @@ -267,7 +271,8 @@ mvert = dm->getVertArray(dm); mface = dm->getFaceArray(dm); - for( i=0; i < dm->getNumFaces(dm); i++ ) { + numfaces= dm->getNumFaces(dm); + for( i=0; i < numfaces; i++ ) { if( mface[i].v4 ) numverts[mface[i].mat_nr+16383] += 6; /* split every quad into two triangles */ else @@ -313,7 +318,7 @@ object->indexMemUsage++; \ } - for( i=0; i < dm->getNumFaces(dm); i++ ) { + for( i=0; i < numfaces; i++ ) { int curInd = index[redir[mface[i].mat_nr+16383]]; object->faceRemap[curInd] = i; ADDLINK( mface[i].v1, curInd*3 ); @@ -461,7 +466,7 @@ void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *redir, void *user ) { int start; - int i, j; + int i, j, numfaces; MVert *mvert; MFace *mface; @@ -471,7 +476,8 @@ mvert = dm->getVertArray(dm); mface = dm->getFaceArray(dm); - for( i=0; i < dm->getNumFaces(dm); i++ ) { + numfaces= dm->getNumFaces(dm); + for( i=0; i < numfaces; i++ ) { start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) index[redir[mface[i].mat_nr+16383]] += 18; @@ -508,7 +514,7 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir, void *user ) { - int i; + int i, numfaces; int start; float norm[3]; @@ -518,7 +524,8 @@ DEBUG_VBO("GPU_buffer_copy_normal\n"); - for( i=0; i < dm->getNumFaces(dm); i++ ) { + numfaces= dm->getNumFaces(dm); + for( i=0; i < numfaces; i++ ) { start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) index[redir[mface[i].mat_nr+16383]] += 18; @@ -572,7 +579,7 @@ void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, void *user ) { int start; - int i; + int i, numfaces; MTFace *mtface; MFace *mface; @@ -587,7 +594,8 @@ return; } - for( i=0; i < dm->getNumFaces(dm); i++ ) { + numfaces= dm->getNumFaces(dm); + for( i=0; i < numfaces; i++ ) { start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) index[redir[mface[i].mat_nr+16383]] += 12; @@ -619,14 +627,15 @@ void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user ) { - int i; + int i, numfaces; unsigned char *varray = (unsigned char *)varray_; unsigned char *mcol = (unsigned char *)user; MFace *mface = dm->getFaceArray(dm); DEBUG_VBO("GPU_buffer_copy_color3\n"); - for( i=0; i < dm->getNumFaces(dm); i++ ) { + numfaces= dm->getNumFaces(dm); + for( i=0; i < numfaces; i++ ) { int start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) index[redir[mface[i].mat_nr+16383]] += 18; @@ -648,14 +657,15 @@ void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user ) { - int i; + int i, numfaces; unsigned char *varray = (unsigned char *)varray_; unsigned char *mcol = (unsigned char *)user; MFace *mface = dm->getFaceArray(dm); DEBUG_VBO("GPU_buffer_copy_color4\n"); - for( i=0; i < dm->getNumFaces(dm); i++ ) { + numfaces= dm->getNumFaces(dm); + for( i=0; i < numfaces; i++ ) { int start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) index[redir[mface[i].mat_nr+16383]] += 18; @@ -678,7 +688,7 @@ GPUBuffer *GPU_buffer_color( DerivedMesh *dm ) { unsigned char *colors; - int i; + int i, numfaces; MCol *mcol; GPUBuffer *result; DEBUG_VBO("GPU_buffer_color\n"); @@ -694,8 +704,9 @@ dm->drawObject->colType = CD_MCOL; } - colors = MEM_mallocN(dm->getNumFaces(dm)*12*sizeof(unsigned char), "GPU_buffer_color"); - for( i=0; i < dm->getNumFaces(dm)*4; i++ ) { + numfaces= dm->getNumFaces(dm); + colors = MEM_mallocN(numfaces*12*sizeof(unsigned char), "GPU_buffer_color"); + for( i=0; i < numfaces*4; i++ ) { colors[i*3] = mcol[i].b; colors[i*3+1] = mcol[i].g; colors[i*3+2] = mcol[i].r; @@ -714,13 +725,15 @@ MVert *mvert; MEdge *medge; unsigned int *varray_ = (unsigned int *)varray; + int numedges; DEBUG_VBO("GPU_buffer_copy_edge\n"); mvert = dm->getVertArray(dm); medge = dm->getEdgeArray(dm); - for(i = 0; i < dm->getNumEdges(dm); i++) { + numedges= dm->getNumEdges(dm); + for(i = 0; i < numedges; i++) { varray_[i*2] = (unsigned int)dm->drawObject->indices[medge[i].v1].element; varray_[i*2+1] = (unsigned int)dm->drawObject->indices[medge[i].v2].element; } @@ -933,7 +946,7 @@ void GPU_interleaved_setup( GPUBuffer *buffer, int data[] ) { int i; int elementsize = 0; - int offset = 0; + intptr_t offset = 0; DEBUG_VBO("GPU_interleaved_setup\n"); @@ -1068,7 +1081,7 @@ void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numdata ) { int i; int elementsize; - int offset = 0; + intptr_t offset = 0; DEBUG_VBO("GPU_interleaved_attrib_setup\n"); @@ -1245,4 +1258,4 @@ else { glDrawElements( mode, count, GL_UNSIGNED_INT, ((int *)elements->pointer)+start ); } -} \ No newline at end of file +} _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs