[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57398] trunk/blender/source/blender/ modifiers/intern/MOD_solidify.c: correct solidify normal calculation logic

Campbell Barton ideasman42 at gmail.com
Wed Jun 12 08:06:20 CEST 2013


Revision: 57398
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57398
Author:   campbellbarton
Date:     2013-06-12 06:06:19 +0000 (Wed, 12 Jun 2013)
Log Message:
-----------
correct solidify normal calculation logic
- always calculate vertex normals since they are used as fallbacks.
- only calculate rim normals if the normals are not already flagged as dirty.

Modified Paths:
--------------
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2013-06-12 04:05:35 UTC (rev 57397)
+++ trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2013-06-12 06:06:19 UTC (rev 57398)
@@ -65,7 +65,7 @@
 
 	float (*face_nors)[3];
 	float *f_no;
-	int calc_face_nors = 0;
+	bool calc_face_nors = false;
 
 	numVerts = dm->getNumVerts(dm);
 	numEdges = dm->getNumEdges(dm);
@@ -84,7 +84,7 @@
 
 	face_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL);
 	if (!face_nors) {
-		calc_face_nors = 1;
+		calc_face_nors = true;
 		face_nors = CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_CALLOC, NULL, numFaces);
 	}
 
@@ -504,7 +504,7 @@
 	else {
 		/* make a face normal layer if not present */
 		float (*face_nors)[3];
-		int face_nors_calc = 0;
+		bool face_nors_calc = false;
 
 		/* same as EM_solidify() in editmesh_lib.c */
 		float *vert_angles = MEM_callocN(sizeof(float) * numVerts * 2, "mod_solid_pair"); /* 2 in 1 */
@@ -514,7 +514,7 @@
 		face_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL);
 		if (!face_nors) {
 			face_nors = CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_CALLOC, NULL, dm->numPolyData);
-			face_nors_calc = 1;
+			face_nors_calc = true;
 		}
 
 		if (vert_nors == NULL) {
@@ -633,11 +633,17 @@
 	if (vert_nors)
 		MEM_freeN(vert_nors);
 
-	/* flip vertex normals for copied verts */
-	mv = mvert + numVerts;
-	for (i = 0; i < numVerts; i++, mv++) {
-		negate_v3_short(mv->no);
+	/* must recalculate normals with vgroups since they can displace unevenly [#26888] */
+	if ((dm->dirty & DM_DIRTY_NORMALS) || (smd->flag & MOD_SOLIDIFY_RIM) || dvert) {
+		result->dirty |= DM_DIRTY_NORMALS;
 	}
+	else {
+		/* flip vertex normals for copied verts */
+		mv = mvert + numVerts;
+		for (i = 0; i < numVerts; i++, mv++) {
+			negate_v3_short(mv->no);
+		}
+	}
 
 	if (smd->flag & MOD_SOLIDIFY_RIM) {
 
@@ -653,8 +659,9 @@
 #define SOLIDIFY_SIDE_NORMALS
 
 #ifdef SOLIDIFY_SIDE_NORMALS
+		const bool do_side_normals = !(result->dirty & DM_DIRTY_NORMALS);
 		/* annoying to allocate these since we only need the edge verts, */
-		float (*edge_vert_nos)[3] = MEM_callocN(sizeof(float) * numVerts * 3, "solidify_edge_nos");
+		float (*edge_vert_nos)[3] = do_side_normals ? MEM_callocN(sizeof(float) * numVerts * 3, __func__) : NULL;
 		float nor[3];
 #endif
 		const unsigned char crease_rim = smd->crease_rim * 255.0f;
@@ -772,41 +779,45 @@
 			}
 
 #ifdef SOLIDIFY_SIDE_NORMALS
-			normal_quad_v3(nor,
-			               mvert[ml[j - 4].v].co,
-			               mvert[ml[j - 3].v].co,
-			               mvert[ml[j - 2].v].co,
-			               mvert[ml[j - 1].v].co);
+			if (do_side_normals) {
+				normal_quad_v3(nor,
+				               mvert[ml[j - 4].v].co,
+				               mvert[ml[j - 3].v].co,
+				               mvert[ml[j - 2].v].co,
+				               mvert[ml[j - 1].v].co);
 
-			add_v3_v3(edge_vert_nos[ed->v1], nor);
-			add_v3_v3(edge_vert_nos[ed->v2], nor);
+				add_v3_v3(edge_vert_nos[ed->v1], nor);
+				add_v3_v3(edge_vert_nos[ed->v2], nor);
 
-			if (face_nors_result) {
-				copy_v3_v3(face_nors_result[(numFaces * 2) + i], nor);
+				if (face_nors_result) {
+					copy_v3_v3(face_nors_result[(numFaces * 2) + i], nor);
+				}
 			}
 #endif
 		}
 
 #ifdef SOLIDIFY_SIDE_NORMALS
-		ed = medge + (numEdges * 2);
-		for (i = 0; i < newEdges; i++, ed++) {
-			float nor_cpy[3];
-			short *nor_short;
-			int k;
+		if (do_side_normals) {
+			ed = medge + (numEdges * 2);
+			for (i = 0; i < newEdges; i++, ed++) {
+				float nor_cpy[3];
+				short *nor_short;
+				int k;
 
-			/* note, only the first vertex (lower half of the index) is calculated */
-			normalize_v3_v3(nor_cpy, edge_vert_nos[ed->v1]);
+				/* note, only the first vertex (lower half of the index) is calculated */
+				normalize_v3_v3(nor_cpy, edge_vert_nos[ed->v1]);
 
-			for (k = 0; k < 2; k++) { /* loop over both verts of the edge */
-				nor_short = mvert[*(&ed->v1 + k)].no;
-				normal_short_to_float_v3(nor, nor_short);
-				add_v3_v3(nor, nor_cpy);
-				normalize_v3(nor);
-				normal_float_to_short_v3(nor_short, nor);
+				for (k = 0; k < 2; k++) { /* loop over both verts of the edge */
+					nor_short = mvert[*(&ed->v1 + k)].no;
+					normal_short_to_float_v3(nor, nor_short);
+					add_v3_v3(nor, nor_cpy);
+					normalize_v3(nor);
+					normal_float_to_short_v3(nor_short, nor);
+				}
 			}
+
+			MEM_freeN(edge_vert_nos);
 		}
-
-		MEM_freeN(edge_vert_nos);
 #endif
 
 		BLI_array_free(new_vert_arr);
@@ -818,11 +829,6 @@
 	if (old_vert_arr)
 		MEM_freeN(old_vert_arr);
 
-	/* must recalculate normals with vgroups since they can displace unevenly [#26888] */
-	if ((dm->dirty & DM_DIRTY_NORMALS) || dvert) {
-		result->dirty |= DM_DIRTY_NORMALS;
-	}
-
 	if (numFaces == 0 && numEdges != 0) {
 		modifier_setError(md, "Faces needed for useful output");
 	}
@@ -832,11 +838,11 @@
 
 #undef SOLIDIFY_SIDE_NORMALS
 
-static bool dependsOnNormals(ModifierData *md)
+static bool dependsOnNormals(ModifierData *UNUSED(md))
 {
-	SolidifyModifierData *smd = (SolidifyModifierData *) md;
-
-	return (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) == 0;
+	/* even when we calculate our own normals,
+	 * the vertex normals are used as a fallback */
+	return true;
 }
 
 ModifierTypeInfo modifierType_Solidify = {




More information about the Bf-blender-cvs mailing list