Commit: 81a67d8e988575b3870bd763a98d8d9fe6f9f716
Author: Martin Felke
Date:   Thu Oct 6 22:20:58 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB81a67d8e988575b3870bd763a98d8d9fe6f9f716

fixed some more transform issues with dynamic fracture, added openmp for loop 
for boolean fracturing

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

M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index 3200a0a..6f92463 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -937,7 +937,7 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
                }
 
                BLI_kdtree_balance(preselect_tree);
-
+#pragma omp parallel for if (algorithm == MOD_FRACTURE_BOOLEAN && !threaded)
                for (i = 0; i < expected_shards; i++)   {
                        bool stop = handle_boolean_bisect(fm, obj, 
expected_shards, algorithm, parent_id, tempshards, dm_parent,
                                              bm_parent, obmat, 
inner_material_index, num_cuts, num_levels, fractal,
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 0dd92b7..528f497 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2027,15 +2027,19 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
        return check_colgroup_ghost(ob1, ob2);
 }
 
-static bool can_break(Object* collider, Object* ob, bool limit, Shard *s)
+static bool can_break(Object* collider, Object* ob, bool limit)
 {
        //allow limit impact only on initial shard and 1st level shards ?
-       if (collider && collider->rigidbody_object && 
(collider->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER &&
-          s && (s->parent_id == 0 || s->shard_id == 0)))
+       if (collider && collider->rigidbody_object && 
(collider->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER))
        {
-               /*if (limit && (collider == ob)) {
+               if (limit && (collider == ob)) {
                        return false;
-               }*/
+               }
+
+               //dont allow limit impact with ground
+               if (collider->rigidbody_object->type == RBO_TYPE_PASSIVE) {
+                       return false;
+               }
 
                return true;
        }
@@ -2065,7 +2069,7 @@ static Shard* findShard(FractureModifierData *fmd, int id)
 static bool check_shard_size(FractureModifierData *fmd, int id)
 {
        FractureID *fid;
-       float size = 0.05f;
+       float size = 1.0f;
        Shard *s = NULL;
 
        s = findShard(fmd, id);
@@ -2084,10 +2088,6 @@ static bool check_shard_size(FractureModifierData *fmd, 
int id)
                return false;
        }
 
-       /*if (s->raw_volume < size) {
-               return false;
-       }*/
-
        for (fid = fmd->fracture_ids.first; fid; fid = fid->next)
        {
                if (fid->shardID == id)
@@ -2101,18 +2101,6 @@ static bool check_shard_size(FractureModifierData *fmd, 
int id)
        return true;
 }
 
-static void impact_to_shard(Shard* s/*, Object* ob,*/, RigidBodyOb *rbo)
-{
-       float mat[4][4];
-
-       if ((s->shard_id == 0) /*|| (s->parent_id == 0)*/)
-       {
-               /*invert_m4_m4(mat, ob->obmat);
-               mul_m4_v3(mat, s->impact_loc);*/
-               sub_v3_v3(s->impact_loc, rbo->pos);
-       }
-}
-
 static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 {
        int linear_index1, linear_index2;
@@ -2155,17 +2143,16 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                Shard *s = findShard(fmd1, id);
 
                                //printf("FORCE1:%f\n",force);
+                               bool canbreak = (force > fmd1->dynamic_force) 
|| (fmd1->limit_impact && can_break(ob2, ob1, fmd1->limit_impact));
 
-                               if (((force > fmd1->dynamic_force) && 
(!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || 
s->shard_id >= 0)))) ||
-                                   (s && ob2 && (fmd1->limit_impact && 
can_break(ob2, ob1, fmd1->limit_impact, s))))
+                               if (canbreak)
                                {
                                        if (s) {
                                                float size[3];
 
-                                               if (s->parent_id > 0 || ob1 == 
ob2 || (ob2 && ob2->rigidbody_object && ob2->rigidbody_object->type == 
RBO_TYPE_PASSIVE)) {
-                                                       size[0] = -1.0f; //mark 
as invalid, so the regular object size is used
-                                                       size[1] = -1.0f;
-                                                       size[2] = -1.0f;
+                                               if (ob1 == ob2) {
+                                                       //todo calculate 
shard...
+                                                       size[0] = size[1] = 
size[2] = force;
                                                }
                                                else {
                                                        
BKE_object_dimensions_get(ob2, size);
@@ -2173,11 +2160,6 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
 
                                                copy_v3_v3(s->impact_loc, 
cp->contact_pos_world_onA);
                                                copy_v3_v3(s->impact_size, 
size);
-
-                                               if (fmd1->limit_impact && s)
-                                               {
-                                                       impact_to_shard(s, rbo);
-                                               }
                                        }
                                        /*only fracture on new entries, this is 
necessary because after loading a file
                                         *the pointcache thinks it is empty and 
a fracture is attempted ! */
@@ -2208,28 +2190,21 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                Shard *s = findShard(fmd2, id);
 
                                //printf("FORCE2:%f\n",force);
+                               bool canbreak = (force > fmd2->dynamic_force) 
|| (fmd2->limit_impact && can_break(ob1, ob2, fmd2->limit_impact));
 
-                               if (((force > fmd2->dynamic_force) && 
(!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || 
s->shard_id >= 0)))) ||
-                                       (ob1 && s && (fmd2->limit_impact && 
can_break(ob1, ob2, fmd2->limit_impact, s))))
+                               if (canbreak)
                                {
                                        if (s) {
                                                float size[3];
 
-                                               if (s->parent_id > 0 ||ob1 == 
ob2 || (ob1 && ob1->rigidbody_object && ob1->rigidbody_object->type == 
RBO_TYPE_PASSIVE)) {
-                                                       size[0] = -1.0f; //mark 
as invalid, so the regular object size is used
-                                                       size[1] = -1.0f;
-                                                       size[2] = -1.0f;
+                                               if (ob1 == ob2) {
+                                                       size[0] = size[1] = 
size[2] = force;
                                                }
                                                else {
                                                        
BKE_object_dimensions_get(ob1, size);
                                                }
                                                copy_v3_v3(s->impact_loc, 
cp->contact_pos_world_onB);
                                                copy_v3_v3(s->impact_size, 
size);
-
-                                               if (fmd2->limit_impact && s)
-                                               {
-                                                       impact_to_shard(s, rbo);
-                                               }
                                        }
 
                                        if (check_shard_size(fmd2, id))
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 191098d..6ae3459 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1183,10 +1183,37 @@ static FracPointCloud 
get_points_global(FractureModifierData *emd, Object *ob, D
                        s = BKE_shard_by_id(emd->frac_mesh, id, fracmesh);
                        if (s != NULL && s->impact_size[0] > 0.0f) {
                                float size[3], nmin[3], nmax[3], loc[3], 
tmin[3], tmax[3];
+                               MeshIslandSequence *msq = 
emd->current_mi_entry, *prev = NULL;
+                               MeshIsland *mi = NULL;
+                               RigidBodyOb *rbo = NULL;
+
+                               if (msq) {
+                                       if (msq->prev) {
+                                               prev = msq->prev;
+                                       }
+                                       else {
+                                               prev = msq;
+                                       }
+
+                                       mi = 
find_meshisland(&prev->meshIslands, s->parent_id);
+                                       if (!mi) {
+                                               mi = 
find_meshisland(&prev->meshIslands, id);
+                                       }
+
+                                       rbo = mi->rigidbody;
+                               }
+
                                print_v3("Impact Loc\n", s->impact_loc);
                                print_v3("Impact Size\n", s->impact_size);
 
                                copy_v3_v3(loc, s->impact_loc);
+
+                               if (rbo) {
+                                       sub_v3_v3(loc, rbo->pos);
+                                       add_v3_v3(loc, cent);
+                                       add_v3_v3(loc, s->centroid);
+                               }
+
                                copy_v3_v3(tmax, s->max);
                                copy_v3_v3(tmin, s->min);
 
@@ -3357,21 +3384,21 @@ static void do_island_from_shard(FractureModifierData 
*fmd, Object *ob, Shard* s
 
                        //keep 1st level shards kinematic if parent is triggered
                        if (par->id == 0 && (par->rigidbody->flag & 
RBO_FLAG_USE_KINEMATIC_DEACTIVATION) && fmd->limit_impact) {
-#if 0
-                               ShardSequence *prev_shards = 
fmd->current_shard_entry ? fmd->current_shard_entry->prev : NULL;
+
+                               /*ShardSequence *prev_shards = 
fmd->current_shard_entry ? fmd->current_shard_entry->prev : NULL;
                                Shard *par_shard = prev_shards ? 
BKE_shard_by_id(prev_shards->frac_mesh, s->parent_id, NULL) : NULL;
 
                                if (par_shard) {
 
                                        float size[3];
-                                       mul_v3_v3fl(size, 
par_shard->impact_size, 0.5f);
+                                       //mul_v3_v3fl(size, 
par_shard->impact_size, 0.5f);
 
                                        if (!contains(par_shard->impact_loc, 
size, s->centroid)) {
                                                mi->rigidbody->flag |= 
RBO_FLAG_KINEMATIC;
                                                mi->rigidbody->flag |= 
RBO_FLAG_NEEDS_VALIDATE;
                                        }
-                               }
-#endif
+                               }*/
+
                                mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
                                mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
                        }

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

Reply via email to