[Bf-blender-cvs] [b463ffc] fracture_modifier: small improvement for autohide, removing inner edges now as well

Martin Felke noreply at git.blender.org
Mon Nov 17 15:49:37 CET 2014


Commit: b463ffc52cf7b63670240510e23a72fa25e93c1e
Author: Martin Felke
Date:   Mon Nov 17 15:48:58 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBb463ffc52cf7b63670240510e23a72fa25e93c1e

small improvement for autohide, removing inner edges now as well

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

M	source/blender/bmesh/intern/bmesh_opdefines.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index 27f394f..ded9fa5 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -1065,6 +1065,27 @@ static BMOpDefine bmo_dissolve_edges_def = {
 };
 
 /*
+ * Dissolve Edges (Keep Normals).
+ */
+static BMOpDefine bmo_dissolve_edges_keep_normal_def = {
+	"dissolve_edges_keep_normals",
+	/* slots_in */
+	{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
+	 {"use_verts", BMO_OP_SLOT_BOOL},  /* dissolve verts left between only 2 edges. */
+	 {"use_face_split", BMO_OP_SLOT_BOOL},
+	 {{'\0'}},
+	},
+	/* slots_out */
+	{{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
+	 {{'\0'}},
+	},
+	bmo_dissolve_edges_exec,
+	(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
+	 BMO_OPTYPE_FLAG_SELECT_FLUSH |
+	 BMO_OPTYPE_FLAG_SELECT_VALIDATE),
+};
+
+/*
  * Dissolve Faces.
  */
 static BMOpDefine bmo_dissolve_faces_def = {
@@ -1287,6 +1308,24 @@ static BMOpDefine bmo_delete_def = {
 };
 
 /*
+ * Delete Geometry (Keep Normals).
+ *
+ * Utility operator to delete geometry.
+ */
+static BMOpDefine bmo_delete_keep_normal_def = {
+	"delete_keep_normals",
+	/* slots_in */
+	{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
+	 {"context", BMO_OP_SLOT_INT},  /* enum DEL_VERTS ... */
+	 {{'\0'}},
+	},
+	{{{'\0'}}},  /* no output */
+	bmo_delete_exec,
+	(BMO_OPTYPE_FLAG_SELECT_FLUSH |
+	 BMO_OPTYPE_FLAG_SELECT_VALIDATE),
+};
+
+/*
  * Duplicate Geometry.
  *
  * Utility operator to duplicate geometry,
@@ -1988,7 +2027,9 @@ const BMOpDefine *bmo_opdefines[] = {
 	&bmo_create_uvsphere_def,
 	&bmo_create_vert_def,
 	&bmo_delete_def,
+	&bmo_delete_keep_normal_def,
 	&bmo_dissolve_edges_def,
+	&bmo_dissolve_edges_keep_normal_def,
 	&bmo_dissolve_faces_def,
 	&bmo_dissolve_verts_def,
 	&bmo_dissolve_limit_def,
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 2d94c18..c4f2d05 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2053,6 +2053,8 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 	/* make kdtree of all faces of dm, then find closest face for each face*/
 	MPoly *mp = NULL;
 	MPoly *mpoly = dm->getPolyArray(dm);
+//	MLoop* mloop = dm->getLoopArray(dm);
+//	MVert* mvert = dm->getVertArray(dm);
 	int totpoly = dm->getNumPolys(dm);
 	KDTree *tree = BLI_kdtree_new(totpoly);
 	int i = 0;
@@ -2062,7 +2064,10 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 	for (i = 0, mp = mpoly; i < totpoly; mp++, i++) {
 		float co[3];
 		DM_face_calc_center_mean(dm, mp, co);
-		BLI_kdtree_insert(tree, i, co);
+		//if (mp->mat_nr == 1)
+		{
+			BLI_kdtree_insert(tree, i, co);
+		}
 	}
 
 	BLI_kdtree_balance(tree);
@@ -2071,28 +2076,62 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 
 	for (i = 0, mp = mpoly; i < totpoly; mp++, i++)
 	{
-		int index = -1, j = 0, r = 0;
-		KDTreeNearest *n;
-		float co[3];
+		//if (mp->mat_nr == 1)
+		{
+			int index = -1, j = 0, r = 0;
+			KDTreeNearest *n;
+			float co[3];
+
+			DM_face_calc_center_mean(dm, mp, co);
+			r = BLI_kdtree_range_search(tree, co, &n, fmd->autohide_dist * 4);
+			/*2nd nearest means not ourselves...*/
+			if (r == 0)
+				continue;
+
+			index = n[0].index;
+			while ((j < r) && i == index) {
+				index = n[j].index;
+				j++;
+			}
 
-		DM_face_calc_center_mean(dm, mp, co);
-		r = BLI_kdtree_range_search(tree, co, &n, fmd->autohide_dist * 4);
-		/*2nd nearest means not ourselves...*/
-		if (r == 0)
-			continue;
+			if (!BLI_ghash_haskey(fmd->face_pairs, SET_INT_IN_POINTER(index))) {
 
-		index = n[0].index;
-		while ((j < r) && i == index) {
-			index = n[j].index;
-			j++;
-		}
+				//int j = 0;
 
-		if (!BLI_ghash_haskey(fmd->face_pairs, SET_INT_IN_POINTER(index))) {
-			BLI_ghash_insert(fmd->face_pairs, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(index));
-		}
+				BLI_ghash_insert(fmd->face_pairs, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(index));
+#if 0
+				/*match normals...*/
+				if (fmd->fix_normals)
+				{
+					MLoop ml, ml2;
+					MVert *v, *v2;
+					short sno[3];
+					float fno[3], fno2[3];
+					if (mp->totloop == (mpoly+index)->totloop)
+					{
+						for (j = 0; j < mp->totloop; j++)
+						{
+							ml = mloop[mp->loopstart + j];
+							ml2 = mloop[(mpoly+index)->loopstart + j];
+							v = mvert + ml.v;
+							v2 = mvert + ml2.v;
+
+							normal_short_to_float_v3(fno, v->no);
+							normal_short_to_float_v3(fno2, v2->no);
+							add_v3_v3(fno, fno2);
+							mul_v3_fl(fno, 0.5f);
+							normal_float_to_short_v3(sno, fno);
+							copy_v3_v3_short(v->no, sno);
+							copy_v3_v3_short(v2->no, sno);
+						}
+					}
+				}
+#endif
+			}
 
-		if (n != NULL) {
-			MEM_freeN(n);
+			if (n != NULL) {
+				MEM_freeN(n);
+			}
 		}
 	}
 
@@ -2114,6 +2153,11 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
 	BM_mesh_elem_table_ensure(bm, BM_FACE);
 	BM_mesh_elem_toolflags_ensure(bm);
 
+	BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
+
+	//BM_mesh_elem_hflag_enable_all(bm, BM_EDGE, BM_ELEM_SELECT, false);
+	//BM_mesh_elem_hflag_disable_test(bm, BM_EDGE, BM_ELEM_SELECT, false, false, BM_ELEM_SMOOTH);
+
 	for (i = 0; i < totpoly; i++) {
 		BMFace *f1, *f2;
 		other = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->face_pairs, SET_INT_IN_POINTER(i)));
@@ -2155,13 +2199,21 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
 				BM_elem_flag_enable(v, BM_ELEM_SELECT);
 			}
 
-			BM_face_kill(bm, f);
+			//BM_face_kill(bm, f);
+			BM_elem_flag_enable(f, BM_ELEM_SELECT);
 		}
 	}
 
+	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "delete_keep_normals geom=%hf context=%i", BM_ELEM_SELECT, DEL_FACES);
 	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
 	             "automerge_keep_normals verts=%hv dist=%f", BM_ELEM_SELECT, fmd->autohide_dist * 10, false);
 
+#if 0
+	//dissolve sharp edges
+	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "dissolve_edges_keep_normals edges=%he use_verts=%b use_face_split=%b",
+	             BM_ELEM_SELECT, true, false);
+#endif
+
 	BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_SELECT, false);
 
 	result = CDDM_from_bmesh(bm, true);
@@ -2175,7 +2227,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
 static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMesh *dm, DerivedMesh *orig_dm)
 {
 	bool exploOK = false; /* doFracture */
-	double start;
+	double start = 0.0;
 
 	if ((fmd->refresh) || (fmd->refresh_constraints && !fmd->execute_threaded) ||
 	    (fmd->refresh_constraints && fmd->execute_threaded && fmd->frac_mesh && fmd->frac_mesh->running == 0))




More information about the Bf-blender-cvs mailing list