[Bf-blender-cvs] [33ddcf4] temp_display_optimization: Fix crash in viewport benchmark file with GLSL

Antony Riakiotakis noreply at git.blender.org
Fri Jun 26 17:10:20 CEST 2015


Commit: 33ddcf4dc3d3de347e85894ff5ae8704b316c0a2
Author: Antony Riakiotakis
Date:   Fri Jun 26 17:09:49 2015 +0200
Branches: temp_display_optimization
https://developer.blender.org/rB33ddcf4dc3d3de347e85894ff5ae8704b316c0a2

Fix crash in viewport benchmark file with GLSL

Total loops were calculated erroneously, probably due to ngon to loop
conversion.

===================================================================

M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/gpu/GPU_buffers.h

===================================================================

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index d1e277c..1c4e4d5 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1815,7 +1815,7 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	MFace *mface;
 	int totmat = dm->totmat;
 	GPUMaterialInfo *mat_info;
-	int i, curmat, curpoint, totface;
+	int i, curmat, totelements, totface, totloops;
 
 	/* object contains at least one material (default included) so zero means uninitialized dm */
 	BLI_assert(totmat != 0);
@@ -1840,7 +1840,6 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	gdo = MEM_callocN(sizeof(GPUDrawObject), "GPUDrawObject");
 	gdo->totvert = dm->getNumVerts(dm);
 	gdo->totedge = dm->getNumEdges(dm);
-	gdo->tot_loop_verts = dm->getNumLoops(dm);
 
 	/* count the number of materials used by this DerivedMesh */
 	for (i = 0; i < totmat; i++) {
@@ -1853,21 +1852,24 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	                             "GPUDrawObject.materials");
 
 	/* initialize the materials array */
-	for (i = 0, curmat = 0, curpoint = 0; i < totmat; i++) {
+	for (i = 0, curmat = 0, totelements = 0, totloops = 0; i < totmat; i++) {
 		if (mat_info[i].elements > 0) {
-			gdo->materials[curmat].start = curpoint;
+			gdo->materials[curmat].start = totelements;
 			/* can set it to points now but used in cdDM_drawobject_init_vert_points as counter */
 			gdo->materials[curmat].totelements = 0;
 			gdo->materials[curmat].totloops = mat_info[i].loops;
 			gdo->materials[curmat].mat_nr = i;
 
-			curpoint += mat_info[i].elements;
+			totelements += mat_info[i].elements;
+			totloops += mat_info[i].loops;
 			curmat++;
 		}
 	}
 
+	gdo->tot_loop_verts = totloops;
+
 	/* store total number of points used for triangles */
-	gdo->tot_triangle_point = curpoint;
+	gdo->tot_triangle_point = totelements;
 
 	gdo->triangle_to_mface = MEM_mallocN(sizeof(int) * (gdo->tot_triangle_point / 3),
 	                                     "GPUDrawObject.triangle_to_mface");
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 7f3a288..dfa1513 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -116,6 +116,7 @@ typedef struct GPUDrawObject {
 	
 	int tot_triangle_point;
 	int tot_loose_point;
+	/* different than total loops since ngons get tesselated still */
 	int tot_loop_verts;
 	
 	/* caches of the original DerivedMesh values */




More information about the Bf-blender-cvs mailing list