[Bf-blender-cvs] [f08018f] master: Fix (unreported) EditNormal modifier: broken 'flip poly' feature.

Bastien Montagne noreply at git.blender.org
Tue Jun 7 13:07:23 CEST 2016


Commit: f08018f92868806bd840670e7e94c65d83a069c0
Author: Bastien Montagne
Date:   Tue Jun 7 13:04:05 2016 +0200
Branches: master
https://developer.blender.org/rBf08018f92868806bd840670e7e94c65d83a069c0

Fix (unreported) EditNormal modifier: broken 'flip poly' feature.

Newly computed custom normals were forgotten during poly flipping, leading
to wrong custom normals being assigned to wrong loop...

Dead simple, but was tough to track down this one!

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/mesh_evaluate.c
M	source/blender/modifiers/intern/MOD_normal_edit.c

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index c7d5857..d8d8690 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -323,7 +323,7 @@ void BKE_mesh_mdisp_flip(struct MDisps *md, const bool use_loop_mdisp_flip);
 
 void BKE_mesh_polygon_flip_ex(
         struct MPoly *mpoly, struct MLoop *mloop, struct CustomData *ldata,
-        struct MDisps *mdisp, const bool use_loop_mdisp_flip);
+        float (*lnors)[3], struct MDisps *mdisp, const bool use_loop_mdisp_flip);
 void BKE_mesh_polygon_flip(struct MPoly *mpoly, struct MLoop *mloop, struct CustomData *ldata);
 void BKE_mesh_polygons_flip(struct MPoly *mpoly, struct MLoop *mloop, struct CustomData *ldata, int totpoly);
 
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index e7e6118..392a387 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -2660,6 +2660,9 @@ void CDDM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, const
 }
 
 /* #define DEBUG_CLNORS */
+#ifdef DEBUG_CLNORS
+#  include "BLI_linklist.h"
+#endif
 
 void CDDM_calc_loop_normals_spacearr(
         DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr)
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c
index 577a212..1c86fbc 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.c
+++ b/source/blender/blenkernel/intern/mesh_evaluate.c
@@ -677,7 +677,7 @@ static void split_loop_nor_single_do(LoopSplitTaskDataCommon *common_data, LoopS
 	 */
 	copy_v3_v3(*lnor, polynors[mp_index]);
 
-	/* printf("BASIC: handling loop %d / edge %d / vert %d\n", ml_curr_index, ml_curr->e, ml_curr->v); */
+	/* printf("BASIC: handling loop %d / edge %d / vert %d / poly %d\n", ml_curr_index, ml_curr->e, ml_curr->v, mp_index); */
 
 	/* If needed, generate this (simple!) lnor space. */
 	if (lnors_spacearr) {
@@ -3262,14 +3262,14 @@ void BKE_mesh_mdisp_flip(MDisps *md, const bool use_loop_mdisp_flip)
  */
 void BKE_mesh_polygon_flip_ex(
         MPoly *mpoly, MLoop *mloop, CustomData *ldata,
-        MDisps *mdisp, const bool use_loop_mdisp_flip)
+        float (*lnors)[3], MDisps *mdisp, const bool use_loop_mdisp_flip)
 {
 	int loopstart = mpoly->loopstart;
 	int loopend = loopstart + mpoly->totloop - 1;
 	const bool loops_in_ldata = (CustomData_get_layer(ldata, CD_MLOOP) == mloop);
 
 	if (mdisp) {
-		for (int i = mpoly->loopstart; i <= loopend; i++) {
+		for (int i = loopstart; i <= loopend; i++) {
 			BKE_mesh_mdisp_flip(&mdisp[i], use_loop_mdisp_flip);
 		}
 	}
@@ -3288,6 +3288,9 @@ void BKE_mesh_polygon_flip_ex(
 		if (!loops_in_ldata) {
 			SWAP(MLoop, mloop[loopstart], mloop[loopend]);
 		}
+		if (lnors) {
+			swap_v3_v3(lnors[loopstart], lnors[loopend]);
+		}
 		CustomData_swap(ldata, loopstart, loopend);
 	}
 	/* Even if we did not swap the other 'pivot' loop, we need to set its swapped edge. */
@@ -3299,7 +3302,7 @@ void BKE_mesh_polygon_flip_ex(
 void BKE_mesh_polygon_flip(MPoly *mpoly, MLoop *mloop, CustomData *ldata)
 {
 	MDisps *mdisp = CustomData_get_layer(ldata, CD_MDISPS);
-	BKE_mesh_polygon_flip_ex(mpoly, mloop, ldata, mdisp, true);
+	BKE_mesh_polygon_flip_ex(mpoly, mloop, ldata, NULL, mdisp, true);
 }
 
 /**
@@ -3315,7 +3318,7 @@ void BKE_mesh_polygons_flip(
 	int i;
 
 	for (mp = mpoly, i = 0; i < totpoly; mp++, i++) {
-		BKE_mesh_polygon_flip_ex(mp, mloop, ldata, mdisp, true);
+		BKE_mesh_polygon_flip_ex(mp, mloop, ldata, NULL, mdisp, true);
 	}
 }
 
diff --git a/source/blender/modifiers/intern/MOD_normal_edit.c b/source/blender/modifiers/intern/MOD_normal_edit.c
index d386653..2cfa746 100644
--- a/source/blender/modifiers/intern/MOD_normal_edit.c
+++ b/source/blender/modifiers/intern/MOD_normal_edit.c
@@ -158,6 +158,7 @@ static bool polygons_check_flip(
         MPoly *mpoly, float (*polynors)[3], const int num_polys)
 {
 	MPoly *mp;
+	MDisps *mdisp = CustomData_get_layer(ldata, CD_MDISPS);
 	int i;
 	bool flipped = false;
 
@@ -176,7 +177,7 @@ static bool polygons_check_flip(
 
 		/* If average of new loop normals is opposed to polygon normal, flip polygon. */
 		if (dot_v3v3(polynors[i], norsum) < 0.0f) {
-			BKE_mesh_polygon_flip(mp, mloop, ldata);
+			BKE_mesh_polygon_flip_ex(mp, mloop, ldata, nos, mdisp, true);
 			negate_v3(polynors[i]);
 			flipped = true;
 		}
@@ -272,6 +273,8 @@ static void normalEditModifier_do_radial(
 
 	if (polygons_check_flip(mloop, nos, dm->getLoopDataLayout(dm), mpoly, polynors, num_polys)) {
 		dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
+		/* We need to recompute vertex normals! */
+		dm->calcNormals(dm);
 	}
 
 	BKE_mesh_normals_loop_custom_set(mvert, num_verts, medge, num_edges, mloop, nos, num_loops,




More information about the Bf-blender-cvs mailing list