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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to