Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-10-05 20:48:52 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-10-05 20:48:52 +0400
commite61e1c5ca827caafb4d7ee2f2a042c9a7ec44863 (patch)
tree6815c9e7bf32b00747cd326aafab3376f484c0fe /source/blender/gpu
parent5f1b4334e2e8eb6eacf921a43548e0de2cd7c23b (diff)
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.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c63
1 files changed, 38 insertions, 25 deletions
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index f19edb61df1..e750a3d05fd 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -34,14 +34,18 @@
#include "GL/glew.h"
-#include "DNA_userdef_types.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
@@ -248,7 +252,7 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
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 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
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 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
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 @@ GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, G
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 @@ void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *re
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 @@ GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm )
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 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re
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 @@ GPUBuffer *GPU_buffer_normal( DerivedMesh *dm )
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 @@ void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir,
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 @@ GPUBuffer *GPU_buffer_uv( DerivedMesh *dm )
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_color3( DerivedMesh *dm, float *varray_, int *index, int *r
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 @@ void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *r
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 @@ GPUBuffer *GPU_buffer_color( DerivedMesh *dm )
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 @@ void GPU_buffer_copy_edge( DerivedMesh *dm, float *varray, int *index, int *redi
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_uvedge_setup( DerivedMesh *dm )
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 @@ int GPU_attrib_element_size( GPUAttrib data[], int numdata ) {
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 @@ void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start
else {
glDrawElements( mode, count, GL_UNSIGNED_INT, ((int *)elements->pointer)+start );
}
-} \ No newline at end of file
+}