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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to