[Bf-blender-cvs] [110a889] bmesh-boolean-experiment: Tessellate faces before transforming vertices

Campbell Barton noreply at git.blender.org
Thu Oct 29 08:40:40 CET 2015


Commit: 110a889be367dc9c2460b35b4514cde9acb7c001
Author: Campbell Barton
Date:   Thu Oct 29 18:34:02 2015 +1100
Branches: bmesh-boolean-experiment
https://developer.blender.org/rB110a889be367dc9c2460b35b4514cde9acb7c001

Tessellate faces before transforming vertices

Without this, ngons were tessellated with their old normals & transformed vertices.

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

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

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

diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index 38b05d2..877ab91 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -190,28 +190,8 @@ static DerivedMesh *applyModifier(
 			bm = BM_mesh_create(&allocsize);
 
 			DM_to_bmesh_ex(dm_other, bm, true);
-
-			{
-				BMIter iter;
-				BMVert *eve;
-
-				float mat[4][4];
-				float omat[4][4];
-				invert_m4_m4(mat, ob->obmat);
-				mul_m4_m4m4(omat, mat, bmd->object->obmat);
-
-
-				BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
-					mul_m4_v3(omat, eve->co);
-				}
-			}
-
 			DM_to_bmesh_ex(dm, bm, true);
 
-			/* not needed, but normals for 'dm' will be invalid,
-			 * currently this is ok for 'BM_mesh_intersect' */
-			// BM_mesh_normals_update(bm);
-
 			if (1) {
 				/* create tessface & intersect */
 				const int looptris_tot = poly_to_tri_count(bm->totface, bm->totloop);
@@ -226,6 +206,31 @@ static DerivedMesh *applyModifier(
 
 				user_data.face_tot_first_mesh = dm_other->getNumPolys(dm_other);
 
+				/* postpone this until after tessellating
+				 * so we can use the original normals before the vertex are moved */
+				{
+					BMIter iter;
+					BMVert *eve;
+					int i = 0, i_end = dm_other->getNumVerts(dm_other);
+
+					float mat[4][4];
+					float omat[4][4];
+					invert_m4_m4(mat, ob->obmat);
+					mul_m4_m4m4(omat, mat, bmd->object->obmat);
+
+
+					BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+						mul_m4_v3(omat, eve->co);
+						if (++i == i_end) {
+							break;
+						}
+					}
+				}
+
+				/* not needed, but normals for 'dm' will be invalid,
+				 * currently this is ok for 'BM_mesh_intersect' */
+				// BM_mesh_normals_update(bm);
+
 				BM_mesh_intersect(
 				        bm,
 				        looptris, tottri,




More information about the Bf-blender-cvs mailing list