[Bf-blender-cvs] [31f6e62] master: Fix T43643: Solidify crashes with 'only-rim'

Campbell Barton noreply at git.blender.org
Thu Feb 26 08:50:04 CET 2015


Commit: 31f6e621b8cf005ff2b02fd7f0c6f4f9bfc5a8d4
Author: Campbell Barton
Date:   Thu Feb 26 18:44:45 2015 +1100
Branches: master
https://developer.blender.org/rB31f6e621b8cf005ff2b02fd7f0c6f4f9bfc5a8d4

Fix T43643: Solidify crashes with 'only-rim'

When verts were shared by 2+ face-islands, the number of allocated edges was wrong.

Cleanup the logic for new verts/edges.

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

M	source/blender/modifiers/intern/MOD_solidify.c

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

diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 00f541f..08b8854 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -220,7 +220,7 @@ static DerivedMesh *applyModifier(
 	const unsigned int numEdges = (unsigned int)dm->getNumEdges(dm);
 	const unsigned int numFaces = (unsigned int)dm->getNumPolys(dm);
 	const unsigned int numLoops = (unsigned int)dm->getNumLoops(dm);
-	unsigned int newLoops = 0, newFaces = 0, newEdges = 0, newVerts = 0;
+	unsigned int newLoops = 0, newFaces = 0, newEdges = 0, newVerts = 0, rimVerts = 0;
 
 	/* only use material offsets if we have 2 or more materials  */
 	const short mat_nr_max = ob->totcol > 1 ? ob->totcol - 1 : 0;
@@ -343,7 +343,7 @@ static DerivedMesh *applyModifier(
 			if (BLI_BITMAP_TEST(orig_mvert_tag, i)) {
 				old_vert_arr[i] = STACK_SIZE(new_vert_arr);
 				STACK_PUSH(new_vert_arr, i);
-				newEdges++;
+				rimVerts++;
 			}
 			else {
 				old_vert_arr[i] = INVALID_UNUSED;
@@ -353,16 +353,26 @@ static DerivedMesh *applyModifier(
 		MEM_freeN(orig_mvert_tag);
 	}
 
+	if (do_shell == false) {
+		/* only add rim vertices */
+		newVerts = rimVerts;
+		/* each extruded face needs an opposite edge */
+		newEdges = newFaces;
+	}
+	else {
+		/* (stride == 2) in this case, so no need to add newVerts/newEdges */
+		BLI_assert(newVerts == 0);
+		BLI_assert(newEdges == 0);
+	}
+
 	if (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) {
 		vert_nors = MEM_callocN(sizeof(float) * (size_t)numVerts * 3, "mod_solid_vno_hq");
 		dm_calc_normal(dm, face_nors, vert_nors);
 	}
 
-	newVerts = do_shell ? 0 : newEdges;
-
 	result = CDDM_from_template(dm,
 	                            (int)((numVerts * stride) + newVerts),
-	                            (int)((numEdges * stride) + newEdges + newVerts), 0,
+	                            (int)((numEdges * stride) + newEdges + rimVerts), 0,
 	                            (int)((numLoops * stride) + newLoops),
 	                            (int)((numFaces * stride) + newFaces));
 
@@ -759,9 +769,9 @@ static DerivedMesh *applyModifier(
 
 		/* add faces & edges */
 		origindex_edge = result->getEdgeDataArray(result, CD_ORIGINDEX);
-		ed = &medge[(numEdges * stride) + newVerts];  /* start after copied edges */
-		orig_ed = &origindex_edge[(numEdges * stride) + newVerts];
-		for (i = 0; i < newEdges; i++, ed++, orig_ed++) {
+		ed = &medge[(numEdges * stride) + newEdges];  /* start after copied edges */
+		orig_ed = &origindex_edge[(numEdges * stride) + newEdges];
+		for (i = 0; i < rimVerts; i++, ed++, orig_ed++) {
 			ed->v1 = new_vert_arr[i];
 			ed->v2 = (do_shell ? new_vert_arr[i] : i) + numVerts;
 			ed->flag |= ME_EDGEDRAW;
@@ -816,26 +826,26 @@ static DerivedMesh *applyModifier(
 				ml[j++].e = eidx;
 
 				ml[j].v = ed->v2;
-				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v2] + newVerts;
+				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v2] + newEdges;
 
 				ml[j].v = (do_shell ? ed->v2 : old_vert_arr[ed->v2]) + numVerts;
 				ml[j++].e = (do_shell ? eidx : i) + numEdges;
 
 				ml[j].v = (do_shell ? ed->v1 : old_vert_arr[ed->v1]) + numVerts;
-				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v1] + newVerts;
+				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v1] + newEdges;
 			}
 			else {
 				ml[j].v = ed->v2;
 				ml[j++].e = eidx;
 
 				ml[j].v = ed->v1;
-				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v1] + newVerts;
+				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v1] + newEdges;
 
 				ml[j].v = (do_shell ? ed->v1 : old_vert_arr[ed->v1]) + numVerts;
 				ml[j++].e = (do_shell ? eidx : i) + numEdges;
 
 				ml[j].v = (do_shell ? ed->v2 : old_vert_arr[ed->v2]) + numVerts;
-				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v2] + newVerts;
+				ml[j++].e = (numEdges * stride) + old_vert_arr[ed->v2] + newEdges;
 			}
 
 			origindex_edge[ml[j - 3].e] = ORIGINDEX_NONE;
@@ -877,7 +887,7 @@ static DerivedMesh *applyModifier(
 #ifdef SOLIDIFY_SIDE_NORMALS
 		if (do_side_normals) {
 			ed = medge + (numEdges * stride);
-			for (i = 0; i < newEdges; i++, ed++) {
+			for (i = 0; i < rimVerts; i++, ed++) {
 				float nor_cpy[3];
 				short *nor_short;
 				int k;




More information about the Bf-blender-cvs mailing list