[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