Commit: 1f88e48d088b0ff1e784e44e9b3baefa86bfec65
Author: Martin Felke
Date:   Sat Oct 1 14:25:27 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB1f88e48d088b0ff1e784e44e9b3baefa86bfec65

dynamic fracture can now react to multiple impacts on initial shard and 1st 
level shards

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

M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/pointcache.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 de88b68..ddb1f60 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -997,9 +997,6 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
        {
                j = 1;
 
-               //if (mode == MOD_FRACTURE_DYNAMIC)
-               //      j = 1;
-
                if (fm->shard_map.last)
                {
                        j += ((Shard*)(fm->shard_map.last))->shard_id;
@@ -1007,7 +1004,7 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
        }
        else
        {
-               j = 0;
+               j = 1;
        }
 
        for (i = 0; i < expected_shards; i++) {
@@ -1016,7 +1013,7 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
 
                if (s != NULL) {
                        add_shard(fm, s, mat);
-                       s->shard_id += j+1;
+                       s->shard_id += j;
                        s->parent_id = parent_id;
                        s->setting_id = active_setting;
                        //printf("ADDED: %d %d %d\n", i, j, s->shard_id);
diff --git a/source/blender/blenkernel/intern/pointcache.c 
b/source/blender/blenkernel/intern/pointcache.c
index 20645ec..7453f39 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1277,6 +1277,21 @@ static int ptcache_dynamicpaint_read(PTCacheFile *pf, 
void *dp_v)
        return 1;
 }
 
+static MeshIsland *find_meshisland(FractureModifierData *fmd, int id)
+{
+       MeshIsland *mi = (MeshIsland*)fmd->meshIslands.first;
+       while (mi)
+       {
+               if (mi->id == id)
+               {
+                       return mi;
+               }
+               mi = mi->next;
+       }
+
+       return NULL;
+}
+
 /* Rigid Body functions */
 static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int 
cfra)
 {
@@ -1319,7 +1334,8 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
                }
                else if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
                {
-                       MeshIsland *mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
+                       //MeshIsland *mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
+                       MeshIsland *mi = find_meshisland(fmd, 
rbo->meshisland_index);
                        int frame = (int)floor(cfra);
 
 //                     if (!mi)
@@ -1397,7 +1413,7 @@ static void ptcache_rigidbody_read(int index, void *rb_v, 
void **data, float cfr
                        MeshIsland *mi = NULL;
                        int frame = (int)floor(cfra);
 
-                       mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
+                       mi = find_meshisland(fmd, rbo->meshisland_index);
 
 //                     if (!mi)
 //                             return;
@@ -1458,7 +1474,8 @@ static void ptcache_rigidbody_interpolate(int index, void 
*rb_v, void **data, fl
                {
                        float loc[3], rot[4];
 
-                       MeshIsland *mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
+                       MeshIsland *mi = find_meshisland(fmd, 
rbo->meshisland_index);
+
                        int frame = (int)floor(cfra);
                        frame = frame - mi->start_frame;
 
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 8dd04cc..7b9a822 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2027,14 +2027,11 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
        return check_colgroup_ghost(ob1, ob2);
 }
 
-static bool contains(float loc[3], Object* collider, float point[3], Object* 
ob, bool limit)
+static bool can_break(Object* collider, Object* ob, bool limit, Shard *s)
 {
-       float size[3];
-       BKE_object_dimensions_get(collider, size);
-
-       if ((fabsf(loc[0] - point[0]) < size[0]) &&
-           (fabsf(loc[1] - point[1]) < size[1]) &&
-           (fabsf(loc[2] - point[2]) < size[2]))
+       //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 (limit && (collider == ob)) {
                        return false;
@@ -2043,7 +2040,7 @@ static bool contains(float loc[3], Object* collider, 
float point[3], Object* ob,
                return true;
        }
 
-       return false;
+       return !limit;
 }
 
 static Shard* findShard(FractureModifierData *fmd, int id)
@@ -2140,8 +2137,8 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                int id = 
rbw->cache_index_map[linear_index1]->meshisland_index;
                                Shard *s = findShard(fmd1, id);
 
-                               if (force > fmd1->dynamic_force || (s && ob2 && 
(fmd1->limit_impact &&
-                                  contains(cp->contact_pos_world_onA, ob2, 
s->centroid, ob1, fmd1->limit_impact))))
+                               if (force > fmd1->dynamic_force || (/*force > 
fmd1->dynamic_force &&*/ s && ob2 && (fmd1->limit_impact &&
+                                  can_break(ob2, ob1, fmd1->limit_impact, s))))
                                {
                                        if (s) {
                                                float size[3];
@@ -2154,7 +2151,7 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                        if (check_shard_size(fmd1, id))
                                        {
                                                FractureID* fid1 = 
MEM_mallocN(sizeof(FractureID), "contact_callback_fractureid1");
-                                               fid1->shardID = 
rbw->cache_index_map[linear_index1]->meshisland_index;
+                                               fid1->shardID = id;
                                                
BLI_addtail(&fmd1->fracture_ids, fid1);
                                                fmd1->update_dynamic = true;
                                        }
@@ -2173,11 +2170,11 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                {
                        if (fmd2->current_shard_entry && 
fmd2->current_shard_entry->is_new)
                        {
-                               int id = 
rbw->cache_index_map[linear_index1]->meshisland_index;
+                               int id = 
rbw->cache_index_map[linear_index2]->meshisland_index;
                                Shard *s = findShard(fmd2, id);
 
-                               if (force > fmd2->dynamic_force || (ob1 && s && 
(fmd2->limit_impact &&
-                                  contains(cp->contact_pos_world_onB, ob1, 
s->centroid, ob2, fmd2->limit_impact))))
+                               if (force > fmd2->dynamic_force || ( /*force > 
fmd2->dynamic_force &&*/ ob1 && s && (fmd2->limit_impact &&
+                                  can_break(ob1, ob2, fmd2->limit_impact, s))))
                                {
                                        if (s) {
                                                float size[3];
@@ -2985,8 +2982,10 @@ void BKE_rigidbody_update_ob_array(RigidBodyWorld *rbw)
                                                rbw->cache_index_map[counter] = 
mi->rigidbody; /* map all shards of an object to this object index*/
                                                rbw->cache_offset_map[counter] 
= i;
                                                mi->linear_index = counter;
-                                               if (mi->rigidbody)
-                                                       
mi->rigidbody->meshisland_index = j;
+                                               if (mi->rigidbody) {
+                                                       //as we search by id 
now in the pointcache, we set the id here too
+                                                       
mi->rigidbody->meshisland_index = mi->id;
+                                               }
                                                counter++;
                                                j++;
                                        }
@@ -4344,8 +4343,9 @@ static void resetDynamic(RigidBodyWorld *rbw, bool 
do_reset_always)
                                                {
                                                        float (*vertexCos)[3];
                                                        int totvert = 
dm->getNumVerts(dm);
-                                                       dm->getVertCos(dm, 
vertexCos);
+
                                                        vertexCos = 
MEM_callocN(sizeof(float) * 3 * totvert, "Vertex Cos");
+                                                       dm->getVertCos(dm, 
vertexCos);
                                                        mti->deformVerts(md, 
ob, dm, vertexCos, totvert, 0);
                                                        
CDDM_apply_vert_coords(dm, vertexCos);
                                                        MEM_freeN(vertexCos);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 8d71fa9..c67df79 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -90,6 +90,7 @@ static void do_prehalving(FractureModifierData *fmd, Object* 
ob, DerivedMesh* de
 static Shard* copy_shard(Shard *s);
 static void arrange_shard(FractureModifierData *fmd, ShardID id, bool 
do_verts, float cent[]);
 static Shard* find_shard(ListBase *shards, ShardID id);
+static void cleanup_arrange_shard(FractureModifierData *fmd, Shard *s, float 
cent[]);
 
 //TODO XXX Make BKE
 static FracMesh* copy_fracmesh(FracMesh* fm)
@@ -1163,40 +1164,54 @@ static FracPointCloud 
get_points_global(FractureModifierData *emd, Object *ob, D
        {
                float cent[3], bmin[3], bmax[3];
                int count = emd->shard_count;
+               Shard *s = NULL;
+
                INIT_MINMAX(min, max);
+               //for limit impact we need entire container always, because we 
need to determine secondary impacts on the shards at their original pos
                if (!BKE_get_shard_minmax(emd->frac_mesh, id, min, max, 
fracmesh))
                        return points; //id 0 should be entire mesh
 
+               //arrange shards according to their original centroid (parent 
centroid sum) position in shard-space (else they are centered at 0, 0, 0)
                arrange_shard(emd, id, false, cent);
                add_v3_v3v3(bmax, max, cent);
                add_v3_v3v3(bmin, min, cent);
 
                //first impact only, so shard has id 0
-               if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC && 
emd->limit_impact && id == 0) {
+               if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC && 
emd->limit_impact) {
                        //shrink pointcloud container around impact point, to a 
size
-                       Shard *s = BKE_shard_by_id(emd->frac_mesh, 0, fracmesh);
-                       if (s != NULL) {
+                       s = BKE_shard_by_id(emd->frac_mesh, id, fracmesh);
+                       if (s != NULL && (s->shard_id == 0 || s->parent_id == 
0)) {
                                float size[3], nmin[3], nmax[3], loc[3], 
imat[4][4], tmin[3], tmax[3], quat[4];
                                print_v3("Impact Loc\n", s->impact_loc);
                                print_v3("Impact Size\n", s->impact_size);
 
                                //invert_m4_m4(imat, ob->obmat);
                                //mul_v3_m4v3(loc, imat, s->impact_loc);
-                               //mat4_to_quat(quat, imat);
                                //sub_v3_v3v3(loc, s->impact_loc, ob->loc);
+                               //mat4_to_quat(quat, imat);
                                //mul_qt_v3(quat, loc);
                                copy_v3_v3(loc, s->impact_loc);
-                               mul_v3_v3fl(size, s->impact_size, 0.5f);
+                               copy_v3_v3(tmax, s->max);
+                               copy_v3_v3(tmin, s->min);
+
+                               //sub_v3_v3(loc, cent);
+                               //sub_v3_v3(loc, s->centroid);
+
+                               mul_v3_v3fl(size, s->impact_size, 0.75f);
                                sub_v3_v3v3(nmin, loc, size);
                                add_v3_v3v3(nmax, loc, size);
 
-                               copy_v3_v3(tmin, min);
-                               copy_v3_v3(tmax, max);
+                               /*sub_v3_v3(tmin, cent);
+                               sub_v3_v3(tmin, s->centroid);
+
+                               sub_v3_v3(tmax, cent);
+                               sub_v3_v3(tmax, s->centroid);
 
-                               /*mat4_to_quat(quat, ob->obmat);
+                               mat4_to_quat(quat, ob->obmat);
                                mul_qt_v3(quat, tmin);
-                               mul_qt_v3(quat, tmax);
-                               add_v3_v3(tmin, ob->loc);
+                               mul_qt_v3(quat, tmax);*/
+
+                               /*add_v3_v3(tmin, ob->loc);
                                add_v3_v3(tmax, ob->loc);*/
 
                                //clamp
@@ -1229,8 +1244,6 @@ static FracPointCloud 
get_points_global(FractureModifierData *emd, Object *ob, D
                        }
                }
 
-               printf("min, max: (%f %f %f), (%f %f %f)\n", min[0], min[1], 
min[2], max[0], max[1], max[2]);
-
                if (emd->frac_algorithm == MOD_FRACTURE_BISECT_FAST || 
emd->frac_algorithm == MOD_FRACTURE_BISECT_FAST_FILL ||
                    emd->fra

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