[Bf-blender-cvs] [b10611f957c] temp-fracture-modifier-2.8: using proper random number generator now + fixed dynamic trigger

Martin Felke noreply at git.blender.org
Wed Nov 21 15:31:38 CET 2018


Commit: b10611f957cebe9d1e6bdf77d49e13907f5095ac
Author: Martin Felke
Date:   Wed Nov 21 15:31:19 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBb10611f957cebe9d1e6bdf77d49e13907f5095ac

using proper random number generator now + fixed dynamic trigger

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

M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c
M	source/blender/makesdna/DNA_fracture_types.h

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

diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index df35ebf1a11..3497f44c049 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -93,9 +93,8 @@ 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);
 
-/* move the islands of the visible mesh according to shard rigidbody movement */
-void BKE_rigidbody_update_cell(struct MeshIsland *mi, struct Object* ob, float loc[3], float rot[4], struct FractureModifierData *rmd,
-                               int frame, struct RigidBodyWorld *rbw);
+bool BKE_check_island_size(struct FractureModifierData *fmd, struct MeshIsland *mi, bool check_min);
+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 4ff170060f5..004ec90c457 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -77,6 +77,7 @@
 #include "bmesh.h"
 
 #include "RBI_api.h"
+#include "PIL_time.h"
 
 /* debug timing */
 #define USE_DEBUG_TIMER
@@ -262,6 +263,22 @@ bool BKE_fracture_mesh_center_centroid_area(Mesh *shard, float cent[3])
 	return (shard->totpoly != 0);
 }
 
+static void init_random(FractureModifierData *fmd) {
+	/* Random generator, only init once. */
+	uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
+	rng_seed ^= POINTER_AS_UINT(fmd);
+	fmd->shared->rng = BLI_rng_new(rng_seed);
+}
+
+static float get_random(FractureModifierData *fmd)
+{
+	if(!fmd->shared->rng) {
+		init_random(fmd);
+	}
+
+	return BLI_rng_get_float(fmd->shared->rng);
+}
+
 static void calculate_fast_bisect(FractureModifierData *fmd, Mesh* me, BisectContext *ctx)
 {
 	float factor = 1 - fmd->orthogonality_factor;
@@ -272,9 +289,9 @@ static void calculate_fast_bisect(FractureModifierData *fmd, Mesh* me, BisectCon
 	BKE_fracture_mesh_boundbox_calc(me, loc, size);
 
 	//make a random vector (interpret as cutter plane)
-	vec[0] = BLI_thread_frand(0) * 2 - 1;
-	vec[1] = BLI_thread_frand(0) * 2 - 1;
-	vec[2] = BLI_thread_frand(0) * 2 - 1;
+	vec[0] = get_random(fmd) * 2 - 1;
+	vec[1] = get_random(fmd) * 2 - 1;
+	vec[2] = get_random(fmd) * 2 - 1;
 
 	//multiply two minor dimensions with a factor to emphasize the max dimension
 	max_axis = axis_dominant_v3_single(size);
@@ -311,9 +328,9 @@ static void calculate_fractal(FractureModifierData* fmd, Mesh* me, BooleanContex
 	BKE_fracture_mesh_boundbox_calc(me, loc, size);
 	radius = sqrt(size[0]*size[0] + size[1]*size[1] + size[2]*size[2]) * 1.5f;
 
-	vec[0] = BLI_thread_frand(0) * 2 - 1;
-	vec[1] = BLI_thread_frand(0) * 2 - 1;
-	vec[2] = BLI_thread_frand(0) * 2 - 1;
+	vec[0] = get_random(fmd) * 2 - 1;
+	vec[1] = get_random(fmd) * 2 - 1;
+	vec[2] = get_random(fmd) * 2 - 1;
 
 	//multiply two minor dimensions with a factor to emphasize the max dimension
 	max_axis = axis_dominant_v3_single(size);
@@ -709,7 +726,7 @@ static void stroke_to_faces(FractureModifierData *fmd, BMesh** bm, bGPDstroke *g
 
 	for (p = 0; p < gps->totpoints; p++) {
 
-		if ((BLI_thread_frand(0) < thresh) || (p == 0) || (p == gps->totpoints-1)) {
+		if ((get_random(fmd) < thresh) || (p == 0) || (p == gps->totpoints-1)) {
 			BMVert *v1, *v2;
 			float point[3] = {0, 0, 0};
 
@@ -900,7 +917,6 @@ void intersect_mesh_by_mesh(FractureModifierData* fmd, Object* ob, Mesh* meA, Me
 	}
 }
 
-
 void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob, MeshIsland*mi, Mesh** temp_meshs, int count,
                             Main* bmain, Scene* scene, int frame)
 {
@@ -949,6 +965,14 @@ void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob,
 					result->rigidbody->shape = RB_SHAPE_COMPOUND;
 				}
 
+				result->rigidbody->flag = mi->rigidbody->flag;
+
+				if (!BKE_rigidbody_activate_by_size_check(ob, mi))
+				{
+					result->rigidbody->flag |= RBO_FLAG_KINEMATIC;
+					result->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
+				}
+
 				/* process vertexgroups, if any */
 				BKE_fracture_meshisland_vertexgroups_do(fmd, ob, result);
 				if (result->passive_weight > 0.01f) {
@@ -1965,6 +1989,11 @@ void BKE_fracture_modifier_free(FractureModifierData *fmd, Scene *scene)
 
 		fmd->shared->last_expected_islands = 0;
 	}
+
+	if (fmd->shared->rng) {
+		BLI_rng_free(fmd->shared->rng);
+		fmd->shared->rng = NULL;
+	}
 }
 
 
@@ -2015,7 +2044,7 @@ static void points_from_verts(Object **ob, int totobj, FracPointCloud *points, f
 			vert = d->mvert;
 
 			for (v = 0; v < d->totvert; v++) {
-				if (BLI_thread_frand(0) < thresh) {
+				if (get_random(emd) < thresh) {
 
 					copy_v3_v3(co, vert[v].co);
 
@@ -2087,7 +2116,7 @@ static void points_from_particles(Object **ob, int totobj, Scene *scene, FracPoi
 					bool particle_dead = pa->alive == PARS_DEAD;
 					bool particle_mask = particle_unborn || particle_alive || particle_dead;
 
-					if ((BLI_thread_frand(0) < thresh) && particle_mask) {
+					if ((get_random(fmd) < thresh) && particle_mask) {
 						float co[3];
 
 						/* birth coordinates are not sufficient in case we did pre-simulate the particles, so they are not
@@ -2151,7 +2180,7 @@ static void points_from_greasepencil(Object **ob, int totobj, FracPointCloud *po
 				for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
 					for (gps = gpf->strokes.first; gps; gps = gps->next) {
 						for (p = 0; p < gps->totpoints; p++) {
-							if (BLI_thread_frand(0) < thresh) {
+							if (get_random(fmd) < thresh) {
 								float point[3] = {0, 0, 0};
 								points->points = MEM_reallocN(points->points, (pt + 1) * sizeof(FracPoint));
 
@@ -2313,6 +2342,7 @@ 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);
@@ -2321,12 +2351,13 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 		{
 			BLI_thread_srandom(0, emd->use_dynamic ? mi->id : emd->point_seed);
 		}
+#endif
 		for (i = 0; i < count; ++i) {
-			if (BLI_thread_frand(0) < thresh) {
+			if (get_random(emd) < thresh) {
 				float co[3];
-				co[0] = min[0] + (max[0] - min[0]) * BLI_thread_frand(0);
-				co[1] = min[1] + (max[1] - min[1]) * BLI_thread_frand(0);
-				co[2] = min[2] + (max[2] - min[2]) * BLI_thread_frand(0);
+				co[0] = min[0] + (max[0] - min[0]) * get_random(emd);
+				co[1] = min[1] + (max[1] - min[1]) * get_random(emd);
+				co[2] = min[2] + (max[2] - min[2]) * get_random(emd);
 
 				if (mi->id > 0 && emd->cutter_group == NULL)
 				{
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index 9c4cb73bee9..80024c8b614 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -82,6 +82,11 @@ void BKE_rigidbody_activate(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshI
 	RigidBodyShardCon *con;
 	int i;
 
+	if( !BKE_rigidbody_activate_by_size_check(ob, mi))
+	{
+		return;
+	}
+
 	if (rbo->flag & RBO_FLAG_KINEMATIC && rbo->type == RBO_TYPE_ACTIVE)
 	{
 		rbo->flag &= ~RBO_FLAG_KINEMATIC;
@@ -1072,10 +1077,14 @@ static bool do_activate(Object* ob, Object *ob2, MeshIsland *mi_compare, RigidBo
 	valid = valid && ((ob2->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER) || ((ob2->rigidbody_object->flag & RBO_FLAG_PROPAGATE_TRIGGER) &&
 			((mi_trigger) && (mi_trigger->rigidbody->flag & RBO_FLAG_PROPAGATE_TRIGGER))));
 
+#if 0
 	/*prefer dynamic trigger over trigger, and allow activation after queue is empty only (everything fractured) */
 	if (mi_trigger && mi_trigger->rigidbody->flag & RBO_FLAG_DYNAMIC_TRIGGER) {
-		valid = valid && BLI_listbase_is_empty(&fmd->shared->fracture_ids);
+		//valid = valid && BLI_listbase_is_empty(&fmd->shared->fracture_ids);
+		//allow "would activate" so a collision is registered, but dont actually activate here
+		return false;
 	}
+#endif
 
 	if (valid || antiValid)
 	{
@@ -1320,7 +1329,24 @@ static bool can_break(Object* collider, Object* ob, bool limit)
 	return !limit;
 }
 
-static bool check_island_size(FractureModifierData *fmd, MeshIsland *mi)
+bool BKE_rigidbody_activate_by_size_check(Object *ob, MeshIsland *mi)
+{
+	FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
+
+	if (!fmd) {
+		return true;
+	}
+
+	if (ob->rigidbody_object->flag & (RBO_FLAG_IS_TRIGGERED | RBO_FLAG_KINEMATIC) && fmd->use_dynamic)
+	{
+		//try to keep bigger shards in place
+		return BKE_check_island_size(fmd, mi, true);
+	}
+
+	return true;
+}
+
+bool BKE_check_island_size(FractureModifierData *fmd, MeshIsland *mi, bool check_min)
 {
 	FractureID *fid;
 	float size = fmd->dynamic_min_size, diff[3], min[3], max[3];
@@ -1328,20 +1354,33 @@ static bool check_island_size(FractureModifierData *fmd, MeshIsland *mi)
 	BKE_mesh_minmax(mi->mesh, min, max);
 
 	sub_v3_v3v3(diff, max, min);
-	if (diff[min_axis_v3(diff)] < size)
-	{
+
+	if (check_min) {
+		size = 4.0f * size;
+
+		if ((diff[max_axis_v3(diff)] < size))// && (diff[1] < size) && (diff[2] < size))
+		{
+			return true;
+		}
+
 		return false;
 	}
-
-	for (fid = fmd->shared->fracture_ids.first; fid; fid = fid->next)
-	{
-		if (fid->mi->id == mi->id)
+	else {
+		if (diff[max_axis_v3(diff)] < size)
 		{
 			return false;
 		}
-	}
 
-	return true;
+		for (fid = fmd->shared->fracture_ids.first; fid; fid = fid->next)
+		{
+			if (fid->mi->id == mi->id)
+			{
+				return false;
+			}
+		}
+
+		return true;
+	}
 }
 
 static bool check_constraints(FractureModifierData *fmd, MeshIsland *mi, RigidBodyWorld *rbw) {
@@ -1393,7 +1432,7 @@ static bool check_constraints(FractureModifierData *fmd, MeshIsland *mi, RigidBo
 	return false;
 }
 
-static void check_fracture_meshisland(FractureModifierData *fmd, MeshIsland *mi, Object* ob1, Object* ob2,
+static void check_fracture_meshisland(FractureModifierData *fmd, MeshIsland *mi, 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list