[Bf-blender-cvs] [dcb0c61] fracture_modifier: autohide now automatically removes doubles as well to close small gaps between shards due to constraint movement, tweaks to pointcache (no reset of cache) and a new bm operator (no normal recalc) were necessary

Martin Felke noreply at git.blender.org
Sat Nov 15 00:35:40 CET 2014


Commit: dcb0c614955016ae4c77301c87a089d47b3ffd51
Author: Martin Felke
Date:   Sat Nov 15 00:35:18 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBdcb0c614955016ae4c77301c87a089d47b3ffd51

autohide now automatically removes doubles as well to close small gaps between shards due to constraint movement, tweaks to pointcache (no reset of cache) and a new bm operator (no normal recalc) were necessary

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

M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/bmesh/intern/bmesh_opdefines.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 7f93462..5e4330e 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -2934,11 +2934,27 @@ int  BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
 	}
 
 	if (scene->rigidbody_world && (ob->rigidbody_object || ob->rigidbody_constraint)) {
-		if (ob->rigidbody_object)
-			ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_RESHAPE;
-		BKE_ptcache_id_from_rigidbody(&pid, ob, scene->rigidbody_world);
-		/* only flag as outdated, resetting should happen on start frame */
-		pid.cache->flag |= PTCACHE_OUTDATED;
+		ModifierData *md = modifiers_findByType(ob, eModifierType_Fracture);
+		if (md && md->type == eModifierType_Fracture)
+		{
+			FractureModifierData *fmd = (FractureModifierData*)md;
+			if (!fmd->refresh_autohide)
+			{
+				if (ob->rigidbody_object)
+					ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_RESHAPE;
+				BKE_ptcache_id_from_rigidbody(&pid, ob, scene->rigidbody_world);
+				/* only flag as outdated, resetting should happen on start frame */
+				pid.cache->flag |= PTCACHE_OUTDATED;
+			}
+		}
+		else
+		{
+			if (ob->rigidbody_object)
+				ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_RESHAPE;
+			BKE_ptcache_id_from_rigidbody(&pid, ob, scene->rigidbody_world);
+			/* only flag as outdated, resetting should happen on start frame */
+			pid.cache->flag |= PTCACHE_OUTDATED;
+		}
 	}
 
 	if (ob->type == OB_ARMATURE)
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index 1143588..27f394f 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -350,6 +350,28 @@ static BMOpDefine bmo_automerge_def = {
 	 BMO_OPTYPE_FLAG_SELECT_VALIDATE),
 };
 
+
+/*
+ * Auto Merge (Keep Normals).
+ *
+ * Finds groups of vertices closer then **dist** and merges them together,
+ * using the weld verts bmop.  The merges must go from a vert not in
+ * **verts** to one in **verts**.
+ */
+static BMOpDefine bmo_automerge_keep_normal_def = {
+	"automerge_keep_normals",
+	/* slots_in */
+	{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input verts */
+	 {"dist",         BMO_OP_SLOT_FLT}, /* minimum distance */
+	 {{'\0'}},
+	},
+	{{{'\0'}}},  /* no output */
+	bmo_remove_doubles_exec,
+	(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
+	 BMO_OPTYPE_FLAG_SELECT_FLUSH |
+	 BMO_OPTYPE_FLAG_SELECT_VALIDATE),
+};
+
 /*
  * Collapse Connected.
  *
@@ -1941,6 +1963,7 @@ static BMOpDefine bmo_symmetrize_def = {
 
 const BMOpDefine *bmo_opdefines[] = {
 	&bmo_automerge_def,
+	&bmo_automerge_keep_normal_def,
 	&bmo_average_vert_facedata_def,
 	&bmo_beautify_fill_def,
 	&bmo_bevel_def,
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 65fe44e..fca26a4 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1467,6 +1467,7 @@ typedef struct FractureModifierData {
 	/* flags */
 	int refresh;
 	int refresh_constraints;
+	int refresh_autohide;
 
 	int use_constraints;
 	int use_mass_dependent_thresholds;
@@ -1489,7 +1490,7 @@ typedef struct FractureModifierData {
 	/* internal values */
 	float max_vol;
 
-	//char pad[4];
+	char pad[4];
 } FractureModifierData;
 
 #endif  /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 18f99d6..f3cae89 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -724,7 +724,7 @@ static void rna_RigidBodyModifier_autohide_dist_set(PointerRNA *ptr, float value
 {
 	FractureModifierData *rmd = (FractureModifierData*)ptr->data;
 	rmd->autohide_dist = value;
-	rmd->refresh_constraints = true;
+	rmd->refresh_autohide = true;
 }
 
 #else
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 3edd8cf..32b7dac 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2057,6 +2057,8 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
 	KDTree *tree = BLI_kdtree_new(totpoly);
 	int i = 0;
 
+	//printf("Make Face Pairs\n");
+
 	for (i = 0, mp = mpoly; i < totpoly; mp++, i++) {
 		float co[3];
 		DM_face_calc_center_mean(dm, mp, co);
@@ -2143,10 +2145,22 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
 	for (i = 0; i < del_faces; i++) {
 		BMFace *f = faces[i];
 		if (f->l_first->e != NULL) { /* a lame check.... */
+			BMIter iter;
+			BMVert *v;
+			BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE)
+			{
+				BM_elem_flag_enable(v, BM_ELEM_SELECT);
+			}
+
 			BM_face_kill(bm, f);
 		}
 	}
 
+	BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
+	             "automerge_keep_normals verts=%hv dist=%f", BM_ELEM_SELECT, fmd->autohide_dist * 100, false);
+
+	BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_SELECT, false);
+
 	result = CDDM_from_bmesh(bm, true);
 	BM_mesh_free(bm);
 	MEM_freeN(faces);
@@ -2389,16 +2403,7 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 
 		fmd->refresh = false;
 		fmd->refresh_constraints = true;
-
-		/*HERE make a kdtree of the fractured derivedmesh,
-		 * store pairs of faces (MPoly) here (will be most likely the inner faces) */
-		if (fmd->face_pairs != NULL) {
-			BLI_ghash_free(fmd->face_pairs, NULL, NULL);
-			fmd->face_pairs = NULL;
-		}
-
-		fmd->face_pairs = BLI_ghash_int_new("face_pairs");
-		make_face_pairs(fmd, fmd->visible_mesh_cached);
+		fmd->refresh_autohide = true;
 
 		if (fmd->execute_threaded) {
 			/* job done */
@@ -2431,6 +2436,33 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 		printf("Constraints: %d\n", BLI_countlist(&fmd->meshConstraints));
 	}
 
+	if (fmd->refresh_autohide)
+	{
+		fmd->refresh_autohide = false;
+		/*HERE make a kdtree of the fractured derivedmesh,
+		 * store pairs of faces (MPoly) here (will be most likely the inner faces) */
+		if (fmd->face_pairs != NULL) {
+			BLI_ghash_free(fmd->face_pairs, NULL, NULL);
+			fmd->face_pairs = NULL;
+		}
+
+		fmd->face_pairs = BLI_ghash_int_new("face_pairs");
+
+		if (fmd->dm)
+		{
+			make_face_pairs(fmd, fmd->dm);
+		}
+		else if (fmd->visible_mesh)
+		{
+			DerivedMesh *fdm = CDDM_from_bmesh(fmd->visible_mesh, true);
+			make_face_pairs(fmd, fdm);
+
+			fdm->needsFree = 1;
+			fdm->release(fdm);
+			fdm = NULL;
+		}
+	}
+
 	/*XXX better rename this, it checks whether we have a valid fractured mesh */
 	exploOK = !fmd->explo_shared || (fmd->explo_shared && fmd->dm && fmd->frac_mesh);
 
@@ -2460,8 +2492,9 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 		DerivedMesh *dm_final;
 		/* HERE Hide facepairs closer than dist X*/
 
-		if (fmd->autohide_dist > 0) {
+		if (fmd->autohide_dist > 0 && fmd->face_pairs) {
 			dm_final = do_autoHide(fmd, fmd->visible_mesh_cached);
+			//printf("Autohide1 \n");
 		}
 		else {
 			dm_final = CDDM_copy(fmd->visible_mesh_cached);
@@ -2471,7 +2504,8 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 	else if ((fmd->visible_mesh_cached != NULL) && exploOK) {
 		DerivedMesh *dm_final;
 
-		if (fmd->autohide_dist > 0) {
+		if (fmd->autohide_dist > 0 && fmd->face_pairs) {
+			//printf("Autohide2 \n");
 			dm_final = do_autoHide(fmd, fmd->visible_mesh_cached);
 		}
 		else {




More information about the Bf-blender-cvs mailing list