[Bf-blender-cvs] [3296d98] master: Solidify Modifier "Rim Only" Option

Campbell Barton noreply at git.blender.org
Fri Aug 15 11:18:06 CEST 2014


Commit: 3296d98ec1a11dc9fb915f934af56262a8dfaf28
Author: Campbell Barton
Date:   Fri Aug 15 17:26:39 2014 +1000
Branches: master
https://developer.blender.org/rB3296d98ec1a11dc9fb915f934af56262a8dfaf28

Solidify Modifier "Rim Only" Option

D737 by scorpion81 with own edits

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_solidify.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 5769db5..b729823 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -818,6 +818,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         col.prop(md, "use_even_offset")
         col.prop(md, "use_quality_normals")
         col.prop(md, "use_rim")
+        col_rim = col.column()
+        col_rim.active = md.use_rim
+        col_rim.prop(md, "rim_only")
 
         col.separator()
 
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 2bd33ae..47782bb 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -840,6 +840,7 @@ enum {
 	MOD_SOLIDIFY_VGROUP_INV     = (1 << 3),
 	MOD_SOLIDIFY_RIM_MATERIAL   = (1 << 4),  /* deprecated, used in do_versions */
 	MOD_SOLIDIFY_FLIP           = (1 << 5),
+	MOD_SOLIDIFY_NOSHELL        = (1 << 6),
 };
 
 #if (DNA_DEPRECATED_GCC_POISON == 1)
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index fb76010..d47bf95 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -2608,6 +2608,11 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_FLIP);
 	RNA_def_property_ui_text(prop, "Flip Normals", "Invert the face direction");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "rim_only", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_NOSHELL);
+	RNA_def_property_ui_text(prop, "Only Rim", "Only add the rim to the original data");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_screw(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 95b0c37..86115d9 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -20,6 +20,7 @@
  *
  * Contributor(s): Campbell Barton
  *                 Shinsuke Irie
+ *                 Martin Felke
  *
  * ***** END GPL LICENSE BLOCK *****
  *
@@ -220,7 +221,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;
+	unsigned int newLoops = 0, newFaces = 0, newEdges = 0, newVerts = 0;
 
 	/* only use material offsets if we have 2 or more materials  */
 	const short mat_nr_max = ob->totcol > 1 ? ob->totcol - 1 : 0;
@@ -251,12 +252,16 @@ static DerivedMesh *applyModifier(
 	const float offset_fac_vg_inv = 1.0f - smd->offset_fac_vg;
 	const bool do_flip = (smd->flag & MOD_SOLIDIFY_FLIP) != 0;
 	const bool do_clamp = (smd->offset_clamp != 0.0f);
+	const bool do_shell = ((smd->flag & MOD_SOLIDIFY_RIM) && (smd->flag & MOD_SOLIDIFY_NOSHELL)) == 0;
 
 	/* weights */
 	MDeformVert *dvert, *dv = NULL;
 	const int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
 	int defgrp_index;
 
+	/* array size is doubled in case of using a shell */
+	const unsigned int stride = do_shell ? 2 : 1;
+
 	modifier_get_vgroup(ob, dm, smd->defgrp_name, &dvert, &defgrp_index);
 
 	orig_mvert = dm->getVertArray(dm);
@@ -334,15 +339,15 @@ static DerivedMesh *applyModifier(
 			}
 		}
 
-#undef INVALID_UNUSED
-#undef INVALID_PAIR
-
 		for (i = 0; i < numVerts; i++) {
 			if (BLI_BITMAP_TEST(orig_mvert_tag, i)) {
 				old_vert_arr[i] = STACK_SIZE(new_vert_arr);
 				STACK_PUSH(new_vert_arr, i);
 				newEdges++;
 			}
+			else {
+				old_vert_arr[i] = INVALID_UNUSED;
+			}
 		}
 
 		MEM_freeN(orig_mvert_tag);
@@ -353,64 +358,103 @@ static DerivedMesh *applyModifier(
 		dm_calc_normal(dm, face_nors, vert_nors);
 	}
 
+	newVerts = do_shell ? 0 : newEdges;
+
 	result = CDDM_from_template(dm,
-	                            (int)(numVerts * 2),
-	                            (int)((numEdges * 2) + newEdges), 0,
-	                            (int)((numLoops * 2) + newLoops),
-	                            (int)((numFaces * 2) + newFaces));
+	                            (int)((numVerts * stride) + newVerts),
+	                            (int)((numEdges * stride) + newEdges + newVerts), 0,
+	                            (int)((numLoops * stride) + newLoops),
+	                            (int)((numFaces * stride) + newFaces));
 
 	mpoly = CDDM_get_polys(result);
 	mloop = CDDM_get_loops(result);
 	medge = CDDM_get_edges(result);
 	mvert = CDDM_get_verts(result);
 
-	DM_copy_edge_data(dm, result, 0, 0, (int)numEdges);
-	DM_copy_edge_data(dm, result, 0, (int)numEdges, (int)numEdges);
+	if (do_shell) {
+		DM_copy_vert_data(dm, result, 0, 0, (int)numVerts);
+		DM_copy_vert_data(dm, result, 0, (int)numVerts, (int)numVerts);
 
-	DM_copy_vert_data(dm, result, 0, 0, (int)numVerts);
-	DM_copy_vert_data(dm, result, 0, (int)numVerts, (int)numVerts);
+		DM_copy_edge_data(dm, result, 0, 0, (int)numEdges);
+		DM_copy_edge_data(dm, result, 0, (int)numEdges, (int)numEdges);
 
-	DM_copy_loop_data(dm, result, 0, 0, (int)numLoops);
-	DM_copy_loop_data(dm, result, 0, (int)numLoops, (int)numLoops);
+		DM_copy_loop_data(dm, result, 0, 0, (int)numLoops);
+		DM_copy_loop_data(dm, result, 0, (int)numLoops, (int)numLoops);
 
-	DM_copy_poly_data(dm, result, 0, 0, (int)numFaces);
-	DM_copy_poly_data(dm, result, 0, (int)numFaces, (int)numFaces);
-
-	/* flip normals */
-	mp = mpoly + numFaces;
-	for (i = 0; i < dm->numPolyData; i++, mp++) {
-		MLoop *ml2;
-		unsigned int e;
-		int j;
-
-		ml2 = mloop + mp->loopstart + dm->numLoopData;
-		for (j = 0; j < mp->totloop; j++) {
-			CustomData_copy_data(&dm->loopData, &result->loopData, mp->loopstart + j,
-			                     mp->loopstart + (mp->totloop - j - 1) + dm->numLoopData, 1);
+		DM_copy_poly_data(dm, result, 0, 0, (int)numFaces);
+		DM_copy_poly_data(dm, result, 0, (int)numFaces, (int)numFaces);
+	}
+	else {
+		int i, j;
+		DM_copy_vert_data(dm, result, 0, 0, (int)numVerts);
+		for (i = 0, j = (int)numVerts; i < numVerts; i++) {
+			if (old_vert_arr[i] != INVALID_UNUSED) {
+				DM_copy_vert_data(dm, result, i, j, 1);
+				j++;
+			}
 		}
 
-		if (mat_ofs) {
-			mp->mat_nr += mat_ofs;
-			CLAMP(mp->mat_nr, 0, mat_nr_max);
-		}
+		DM_copy_edge_data(dm, result, 0, 0, (int)numEdges);
+
+		for (i = 0, j = (int)numEdges; i < numEdges; i++) {
+			if (!ELEM(edge_users[i], INVALID_UNUSED, INVALID_PAIR)) {
+				MEdge* ed_src, *ed_dst;
+				DM_copy_edge_data(dm, result, i, j, 1);
 
-		e = ml2[0].e;
-		for (j = 0; j < mp->totloop - 1; j++) {
-			ml2[j].e = ml2[j + 1].e;
+				ed_src = &medge[i];
+				ed_dst = &medge[j];
+				ed_dst->v1 = old_vert_arr[ed_src->v1] + numVerts;
+				ed_dst->v2 = old_vert_arr[ed_src->v2] + numVerts;
+				j++;
+			}
 		}
-		ml2[mp->totloop - 1].e = e;
 
-		mp->loopstart += dm->numLoopData;
+		/* will be created later */
+		DM_copy_loop_data(dm, result, 0, 0, (int)numLoops);
+		DM_copy_poly_data(dm, result, 0, 0, (int)numFaces);
+	}
+
+#undef INVALID_UNUSED
+#undef INVALID_PAIR
+
+	/* flip normals */
 
-		for (j = 0; j < mp->totloop; j++) {
-			ml2[j].e += numEdges;
-			ml2[j].v += numVerts;
+	if (do_shell) {
+		mp = mpoly + numFaces;
+		for (i = 0; i < dm->numPolyData; i++, mp++) {
+			MLoop *ml2;
+			unsigned int e;
+			int j;
+
+			ml2 = mloop + mp->loopstart + dm->numLoopData;
+			for (j = 0; j < mp->totloop; j++) {
+				CustomData_copy_data(&dm->loopData, &result->loopData, mp->loopstart + j,
+				                     mp->loopstart + (mp->totloop - j - 1) + dm->numLoopData, 1);
+			}
+
+			if (mat_ofs) {
+				mp->mat_nr += mat_ofs;
+				CLAMP(mp->mat_nr, 0, mat_nr_max);
+			}
+
+			e = ml2[0].e;
+			for (j = 0; j < mp->totloop - 1; j++) {
+				ml2[j].e = ml2[j + 1].e;
+			}
+			ml2[mp->totloop - 1].e = e;
+
+			mp->loopstart += dm->numLoopData;
+
+			for (j = 0; j < mp->totloop; j++) {
+				ml2[j].e += numEdges;
+				ml2[j].v += numVerts;
+			}
 		}
-	}
 
-	for (i = 0, ed = medge + numEdges; i < numEdges; i++, ed++) {
-		ed->v1 += numVerts;
-		ed->v2 += numVerts;
+		for (i = 0, ed = medge + numEdges; i < numEdges; i++, ed++) {
+			ed->v1 += numVerts;
+			ed->v2 += numVerts;
+		}
 	}
 
 	/* note, copied vertex layers don't have flipped normals yet. do this after applying offset */
@@ -435,10 +479,20 @@ static DerivedMesh *applyModifier(
 		}
 
 		if (ofs_new != 0.0f) {
+			unsigned int i_end;
 			scalar_short = scalar_short_vgroup = ofs_new / 32767.0f;
-			mv = mvert + (((ofs_new >= ofs_orig) == do_flip) ? numVerts : 0);
+
+			if ((ofs_new >= ofs_orig) == do_flip) {
+				i_end = do_shell ? numVerts : newVerts;
+				mv = &mvert[numVerts];
+			}
+			else {
+				i_end = numVerts;
+				mv = mvert;
+			}
+
 			dv = dvert;
-			for (i = 0; i < numVerts; i++, mv++) {
+			for (i = 0; i < i_end; i++, mv++) {
 				if (dv) {
 					if (defgrp_invert) scalar_short_vgroup = 1.0f - defvert_find_weight(dv, defgrp_index);
 					else scalar_short_vgroup = defvert_find_weight(dv, defgrp_index);
@@ -460,10 +514,21 @@ static DerivedMesh *applyModifier(
 		}
 
 		if (ofs_orig != 0.0f) {
+			unsigned int i_end;
 			scalar_short = scalar_short_vgroup = ofs_orig / 32767.0f;
-			mv = mvert + (((ofs_new >= ofs_orig) == do_flip) ? 0 : numVerts); /* as above but swapped */
+
+			/* as above but swapped */
+			if ((ofs_new >= ofs_orig) == do_flip) {
+				i_end = numVerts;
+				mv = mvert;
+			}
+			else {
+				i_end = do_shell ? numVerts : newVerts;
+				mv = &mvert[numVerts];
+			}
+
 			dv = dvert;
-			for (i = 0; i < numVerts; i++, mv++) {
+			for (i = 0; i < i_end; i++, mv++) {
 				if (dv) {
 					if (defgrp_invert) scalar_short_vgroup = 1.0f - defvert_find_weight(dv, defgrp_index);
 					else scalar_short_vgroup = defvert_find_weight(dv, defgrp_index);
@@ -597,9 +662,18 @@ static DerivedMesh *applyModifier(
 		}
 
 		if (ofs_new) {
-			mv = mvert + (((ofs_new >= ofs_orig) == d

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list