[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23639] trunk/blender/source/blender/gpu/ intern/gpu_buffers.c: VBO:

Brecht Van Lommel brecht at blender.org
Mon Oct 5 18:48:52 CEST 2009


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
+}





More information about the Bf-blender-cvs mailing list