[Bf-blender-cvs] [8a2ee5573c1] temp-fracture-modifier-2.8: added constraint search size, made mixed/none constraint setting in dynamic work

Martin Felke noreply at git.blender.org
Thu Nov 22 14:21:05 CET 2018


Commit: 8a2ee5573c1703ed2da0735a34e203537d575cc6
Author: Martin Felke
Date:   Thu Nov 22 14:20:51 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB8a2ee5573c1703ed2da0735a34e203537d575cc6

added constraint search size, made mixed/none constraint setting in dynamic work

plus fix attempts for dynamic cache logic

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

M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_constraints.c
M	source/blender/blenkernel/intern/fracture_dynamic.c
M	source/blender/blenkernel/intern/fracture_prefractured.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_fracture.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 64fb42321ef..4ee94a798c2 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -229,6 +229,7 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel):
         col = layout.column(align=True)
         col.prop(md, "constraint_limit")
         col.prop(md, "contact_dist")
+        col.prop(md, "contact_size")
 
         layout.label(text="Constraint Cluster Settings")
         layout.prop(md, "cluster_count")
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index e6c933c0f09..0c359cb98e1 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -173,4 +173,6 @@ void BKE_fracture_meshisland_normals_fix(struct FractureModifierData *fmd, struc
 void BKE_fracture_copy_customdata(struct CustomData* src, struct CustomData* dst, CustomDataMask mask, int src_ofs, int dst_ofs,
                               int copyelem, int totelem);
 
+bool BKE_fracture_check_valid_shard(struct FractureModifierData *fmd, struct MeshIsland *mi, struct Scene *scene);
+
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 3497f44c049..29a567625cc 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -93,7 +93,7 @@ void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld *rbw, struct MeshIsl
 
 void BKE_rigidbody_validate_sim_shard_shape(struct MeshIsland *mi, struct Object *ob, short rebuild);
 
-bool BKE_check_island_size(struct FractureModifierData *fmd, struct MeshIsland *mi, bool check_min);
+bool BKE_rigidbody_check_island_size(struct FractureModifierData *fmd, struct MeshIsland *mi, float check_size);
 bool BKE_rigidbody_activate_by_size_check(struct Object *ob, struct MeshIsland *mi);
 
 void BKE_rigidbody_calc_center_of_mass(struct Object *ob, float r_center[3]);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 004ec90c457..d030d4a3764 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -279,6 +279,14 @@ static float get_random(FractureModifierData *fmd)
 	return BLI_rng_get_float(fmd->shared->rng);
 }
 
+static void seed_random(FractureModifierData *fmd, unsigned int seed) {
+	if(!fmd->shared->rng) {
+		init_random(fmd);
+	}
+
+	BLI_rng_seed(fmd->shared->rng, seed);
+}
+
 static void calculate_fast_bisect(FractureModifierData *fmd, Mesh* me, BisectContext *ctx)
 {
 	float factor = 1 - fmd->orthogonality_factor;
@@ -604,6 +612,7 @@ static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain
 		int k = 0;
 		for (k = 0; k < fmd->shared->last_expected_islands; k++)
 		{
+			BLI_remlink(&fmd->shared->mesh_islands, fmd->shared->last_islands[k]);
 			BKE_fracture_mesh_island_free(fmd->shared->last_islands[k], scene);
 		}
 
@@ -1294,8 +1303,7 @@ void BKE_fracture_clear_cache(FractureModifierData* fmd, Object* ob, Scene *scen
 
 	mi = fmd->shared->mesh_islands.first;
 	while (mi) {
-		if ((!fmd->use_dynamic && mi->id == 0) ||
-			(fmd->use_dynamic && mi->id > 0))
+		if ((fmd->shared->refresh && fmd->use_dynamic && mi->startframe > startframe) || (!fmd->use_dynamic && mi->id == 0))
 		{
 			next = mi->next;
 			BLI_remlink(&fmd->shared->mesh_islands, mi);
@@ -1331,14 +1339,6 @@ void BKE_fracture_clear_cache(FractureModifierData* fmd, Object* ob, Scene *scen
 		}
 	}
 
-#if 0
-	while (fmd->shared->fracture_ids.first) {
-		FractureID* fid = fmd->shared->fracture_ids.first;
-		BLI_remlink(&fmd->shared->fracture_ids, fid);
-		MEM_freeN(fid);
-	}
-#endif
-
 	fmd->shared->last_cache_end = endframe;
 	fmd->shared->last_cache_start = startframe;
 }
@@ -1981,6 +1981,7 @@ void BKE_fracture_modifier_free(FractureModifierData *fmd, Scene *scene)
 		int j;
 		for (j = 0; j < fmd->shared->last_expected_islands; j++)
 		{
+			BLI_remlink(&fmd->shared->mesh_islands, fmd->shared->last_islands[j]);
 			BKE_fracture_mesh_island_free(fmd->shared->last_islands[j], scene);
 		}
 
@@ -2220,41 +2221,42 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 	points.points = MEM_mallocN(sizeof(FracPoint), "points");
 	points.totpoints = 0;
 
-	if (emd->point_source & (MOD_FRACTURE_EXTRA_PARTICLES | MOD_FRACTURE_EXTRA_VERTS)) {
-		if (((emd->point_source & MOD_FRACTURE_OWN_PARTICLES) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
-			((emd->point_source & MOD_FRACTURE_OWN_VERTS) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)) ||
-			((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
-			((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)))
-		{
-			go = MEM_reallocN(go, sizeof(Object *) * (totgroup + 1));
-			go[totgroup] = ob;
-			totgroup++;
-		}
+	if (!emd->use_dynamic) {
+		if (emd->point_source & (MOD_FRACTURE_EXTRA_PARTICLES | MOD_FRACTURE_EXTRA_VERTS)) {
+			if (((emd->point_source & MOD_FRACTURE_OWN_PARTICLES) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
+				((emd->point_source & MOD_FRACTURE_OWN_VERTS) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)) ||
+				((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
+				((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)))
+			{
+				go = MEM_reallocN(go, sizeof(Object *) * (totgroup + 1));
+				go[totgroup] = ob;
+				totgroup++;
+			}
 
-		totgroup = getGroupObjects(emd->extra_group, &go, totgroup);
-	}
-	else {
-		totgroup = 1;
-		go[0] = ob;
-	}
+			totgroup = getGroupObjects(emd->extra_group, &go, totgroup);
+		}
+		else {
+			totgroup = 1;
+			go[0] = ob;
+		}
 
-	if (emd->point_source & (MOD_FRACTURE_OWN_PARTICLES | MOD_FRACTURE_EXTRA_PARTICLES)) {
-		points_from_particles(go, totgroup, scene, &points, ob->obmat, thresh, emd, mi);
-	}
+		if (emd->point_source & (MOD_FRACTURE_OWN_PARTICLES | MOD_FRACTURE_EXTRA_PARTICLES)) {
+			points_from_particles(go, totgroup, scene, &points, ob->obmat, thresh, emd, mi);
+		}
 
-	if (emd->point_source & (MOD_FRACTURE_OWN_VERTS | MOD_FRACTURE_EXTRA_VERTS)) {
-		points_from_verts(go, totgroup, &points, ob->obmat, thresh, emd, ob, mi);
-	}
+		if (emd->point_source & (MOD_FRACTURE_OWN_VERTS | MOD_FRACTURE_EXTRA_VERTS)) {
+			points_from_verts(go, totgroup, &points, ob->obmat, thresh, emd, ob, mi);
+		}
 
-#if 0
-	if (emd->point_source & MOD_FRACTURE_GREASEPENCIL && !emd->use_greasepencil_edges) {
-		points_from_greasepencil(go, totgroup, &points, ob->obmat, thresh);
+	#if 0
+		if (emd->point_source & MOD_FRACTURE_GREASEPENCIL && !emd->use_greasepencil_edges) {
+			points_from_greasepencil(go, totgroup, &points, ob->obmat, thresh);
+		}
+	#endif
 	}
-#endif
-
 
 	/* local settings, apply per shard!!! Or globally too first. */
-	if (emd->point_source & MOD_FRACTURE_UNIFORM)
+	if ((emd->point_source & MOD_FRACTURE_UNIFORM) || (emd->use_dynamic))
 	{
 		float cent[3], bmin[3], bmax[3];
 		int count = emd->shard_count;
@@ -2342,16 +2344,14 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 			}
 		}
 
-#if 0
 		//omg, vary the seed here
 		if (emd->split_islands) {
-			BLI_thread_srandom(0, mi->id);
+			seed_random(emd, (unsigned int)mi->id);
 		}
-		else
-		{
-			BLI_thread_srandom(0, emd->use_dynamic ? mi->id : emd->point_seed);
+		else {
+			seed_random(emd, emd->use_dynamic ? (unsigned int)mi->id : (unsigned int)emd->point_seed);
 		}
-#endif
+
 		for (i = 0; i < count; ++i) {
 			if (get_random(emd) < thresh) {
 				float co[3];
@@ -2380,7 +2380,7 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 		}
 	}
 
-	if (emd->point_source & MOD_FRACTURE_GRID)
+	if ((emd->point_source & MOD_FRACTURE_GRID) && (!emd->use_dynamic))
 	{
 		float cent[3], bmin[3], bmax[3];
 		int x, y, z, k = 0;
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c b/source/blender/blenkernel/intern/fracture_constraints.c
index 79d95eb040c..4827c0ef251 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -32,6 +32,7 @@
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
+#include "BKE_pointcache.h"
 #include "BKE_rigidbody.h"
 
 #include "BLI_kdtree.h"
@@ -65,10 +66,10 @@ static int get_object_index(Scene *scene, Object *ob) {
 	int i = 0;
 	if (rbw && rbw->group) {
 
-		obb = DEG_get_original_id(ob);
+		obb = DEG_get_original_object(ob);
 		FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->group, obj)
 		{
-			obbj = DEG_get_original_id(obj);
+			obbj = DEG_get_original_object(obj);
 			if (obb == obbj) {
 				return i;
 			}
@@ -80,6 +81,28 @@ static int get_object_index(Scene *scene, Object *ob) {
 	return -1;
 }
 
+bool BKE_fracture_check_valid_shard(FractureModifierData *fmd, MeshIsland *mi, Scene *scene)
+{
+	//why for gods sake is the correct frame only in the original scene ?
+	Scene* sc = (Scene*)DEG_get_original_id(&scene->id);
+	int frame = BKE_scene_frame_get(sc);
+
+	return !BKE_fracture_meshisland_check_frame(fmd, mi, frame);
+}
+
+static int count_valid_shards(FractureModifierData *fmd, Scene *scene) {
+	int count = 0;
+	MeshIsland *mi;
+
+	for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next) {
+		if (BKE_fracture_check_valid_shard(fmd, mi, scene)) {
+			count++;
+		}
+	}
+
+	return count;
+}
+
 static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland ***mesh_islands, KDTree **combined_tree, Object *obj,
 								   MVert** mverts, Scene *scene)
 {
@@ -97,7 +120,7 @@ static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland ***mesh
 			{
 				FractureModifierData *fmdi = (FractureModifierData *)modifiers_findByType(ob, eModifierType_Fracture);
 				if (fmdi) {
-					islands += BLI_listbase_count(&fmdi->shared->mesh_islands);
+					islands += count_valid_shards(fmdi,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list