Revision: 34874 http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34874 Author: imbusy Date: 2011-02-15 18:36:42 +0000 (Tue, 15 Feb 2011) Log Message: ----------- a fix for bug #25806 http://projects.blender.org/tracker/index.php?func=detail&aid=25806 Thanks Andrew Wall for the report and the patch
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 2011-02-15 18:33:05 UTC (rev 34873) +++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c 2011-02-15 18:36:42 UTC (rev 34874) @@ -773,7 +773,7 @@ } } -static GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) ) +static GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int vector_size, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) ) { GPUBuffer *buffer; float *varray; @@ -798,7 +798,7 @@ index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup"); for( i = 0; i < object->nmaterials; i++ ) { - index[i] = object->materials[i].start*3; + index[i] = object->materials[i].start*vector_size; redir[object->materials[i].mat_nr+16383] = i; } @@ -901,7 +901,7 @@ { DEBUG_VBO("GPU_buffer_vertex\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*(dm->drawObject->nelements+dm->drawObject->nlooseverts), GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex); + return GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(float)*3*(dm->drawObject->nelements+dm->drawObject->nlooseverts), GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex); } static void GPU_buffer_copy_normal(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user)) @@ -967,7 +967,7 @@ { DEBUG_VBO("GPU_buffer_normal\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal); + return GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal); } static void GPU_buffer_copy_uv(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user)) @@ -1013,8 +1013,8 @@ static GPUBuffer *GPU_buffer_uv( DerivedMesh *dm ) { DEBUG_VBO("GPU_buffer_uv\n"); - if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 ) /* was sizeof(float)*2 but caused buffer overrun */ - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv); + if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 ) + return GPU_buffer_setup( dm, dm->drawObject, 2, sizeof(float)*2*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv); else return 0; } @@ -1106,7 +1106,7 @@ colors[i*3+2] = mcol[i].r; } - result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 ); + result = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 ); MEM_freeN(colors); return result; @@ -1135,7 +1135,7 @@ { DEBUG_VBO("GPU_buffer_edge\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge); + return GPU_buffer_setup( dm, dm->drawObject, 2, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge); } static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(redir), void *UNUSED(user)) @@ -1184,7 +1184,7 @@ * ...each edge has its own, non-shared coords. * so each tri corner needs minimum of 4 floats, quads used less so here we can over allocate and assume all tris. * */ - return GPU_buffer_setup( dm, dm->drawObject, 4 * sizeof(float) * dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge); + return GPU_buffer_setup( dm, dm->drawObject, 4, 4 * sizeof(float) * dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge); } @@ -1553,14 +1553,14 @@ if( dm->drawObject == 0 ) dm->drawObject = GPU_drawobject_new(dm); GPU_buffer_free(dm->drawObject->colors,globalPool); - dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 ); + dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 ); } void GPU_color4_upload( DerivedMesh *dm, unsigned char *data ) { if( dm->drawObject == 0 ) dm->drawObject = GPU_drawobject_new(dm); GPU_buffer_free(dm->drawObject->colors,globalPool); - dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 ); + dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 ); } void GPU_color_switch( int mode ) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs