Commit: bcc260c778f81e823359676f1b33cf51d1821314
Author: Martin Felke
Date:   Wed Jan 27 18:23:15 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBbcc260c778f81e823359676f1b33cf51d1821314

improved the fake hook system, should behave now exactly as a regular hook and 
added some FM code comments to plan further work.

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index f41e877..73d095a 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -78,6 +78,7 @@
 static void resetDynamic(RigidBodyWorld *rbw);
 static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int 
rebuild, int transfer_speed);
 static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object 
*ob, RigidBodyOb *rbo);
+static void handle_passive_transform(FractureModifierData *fmd, MeshIsland 
*mi, Object* ob);
 
 
 static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), 
MeshIsland *UNUSED(mi), Object *UNUSED(ob))
@@ -475,7 +476,7 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, 
Object *ob, float loc[3],
        invert_m4_m4(ob->imat, ob->obmat);
        mat4_to_size(size, ob->obmat);
 
-       if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED) {
+       if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED && frame > -1) {
                /*record only in prefracture case here, when you want to 
convert to keyframes*/
                n = frame - mi->start_frame + 1;
 
@@ -2922,11 +2923,11 @@ static void rigidbody_update_sim_world(Scene *scene, 
RigidBodyWorld *rbw)
        }
 }
 
-static void rigidbody_passive_fake_hook(MeshIsland *mi, MVert *mv)
+static void rigidbody_passive_fake_hook(MeshIsland *mi, float co[3], 
FractureModifierData *fmd, Object *ob)
 {
        //no reshape necessary as vertcount didnt change, but update rbo->pos / 
orn ? according to change of 1st vertex
        //fake hook system
-       if (mv && mi->rigidbody->type == RBO_TYPE_PASSIVE &&
+       if (mi->rigidbody->type == RBO_TYPE_PASSIVE &&
            mi->rigidbody->physics_object && !(mi->rigidbody->flag & 
RBO_FLAG_KINEMATIC))
        {
                float oldloc[3], loc[3], diff[3], pos[3];
@@ -2936,7 +2937,7 @@ static void rigidbody_passive_fake_hook(MeshIsland *mi, 
MVert *mv)
 
                //this location comes from the final DM, which might be changed 
by hook modifiers for example
                //XXX TODO maybe need a proper switch for this behavior, too
-               copy_v3_v3(loc, mv->co);
+               copy_v3_v3(loc, co);
                sub_v3_v3v3(diff, oldloc, loc);
                //sub_v3_v3(diff, mi->centroid);
 
@@ -2949,7 +2950,9 @@ static void rigidbody_passive_fake_hook(MeshIsland *mi, 
MVert *mv)
                RB_body_set_kinematic_state(mi->rigidbody->physics_object, 
true);
 
                //XXX TODO how to handle rotation properly ? and omit if 
kinematic, else it will interfere
+               //copy_v3_v3(mi->rigidbody->pos, pos);
                RB_body_set_loc_rot(mi->rigidbody->physics_object, pos, 
mi->rigidbody->orn);
+               //BKE_rigidbody_update_cell(mi, ob, pos, mi->rigidbody->orn, 
fmd, -1);
        }
 }
 
@@ -2982,12 +2985,14 @@ static void rigidbody_update_sim_ob(Scene *scene, 
RigidBodyWorld *rbw, Object *o
                        {
                                if (mi != NULL)
                                {
+#if 0
                                        if (mi->rigidbody->type == 
RBO_TYPE_PASSIVE)
                                        {
                                                MVert *mv = mvert + 
mi->vertex_indices[0];
                                                rigidbody_passive_fake_hook(mi, 
mv);
                                        }
                                        else
+#endif
                                        {
                                                //fracture modifier case TODO, 
update mi->physicsmesh somehow and redraw
                                                rbo->flag |= 
RBO_FLAG_NEEDS_RESHAPE;
@@ -3414,16 +3419,6 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                int count = 0, brokencount = 0, plastic = 0;
                float frame = 0;
 
-               if (rebuild || is_zero_m4(fmd->passive_parent_mat))
-               {
-                       copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
-               }
-
-               //print_m4("Obmat: \n", ob->obmat);
-               //print_m4("Passivemat: \n", fmd->passive_parent_mat);
-
-               BKE_object_where_is_calc(scene, ob);
-
                if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
                {
                        int frame = (int)BKE_scene_frame_get(scene);
@@ -3432,12 +3427,18 @@ static bool do_update_modifier(Scene* scene, Object* 
ob, RigidBodyWorld *rbw, bo
                                BKE_rigidbody_update_ob_array(rbw);
                        }
                }
+               else
+               {
+                       if (rebuild || is_zero_m4(fmd->passive_parent_mat))
+                       {
+                               copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
+                       }
 
-               //count = BLI_listbase_count(&fmd->meshIslands);
+                       //print_m4("Obmat: \n", ob->obmat);
+                       //print_m4("Passivemat: \n", fmd->passive_parent_mat);
 
-               //if (fmd->use_compounds && rebuild)
-                       /*create compound */
-               //      compound = RB_shape_new_compound();
+                       BKE_object_where_is_calc(scene, ob);
+               }
 
                for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
                        if (mi->rigidbody == NULL) {
@@ -3456,6 +3457,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                        zero_v3(mi->rigidbody->ang_vel);
                                }
 
+                               handle_passive_transform(fmd, mi, ob);
+
                                if (fmd->use_breaking)
                                {
                                        float weight = mi->thresh_weight;
@@ -3751,6 +3754,61 @@ bool BKE_rigidbody_check_sim_running(RigidBodyWorld 
*rbw, float ctime)
        return (rbw && (rbw->flag & RBW_FLAG_MUTED) == 0 && ctime > 
rbw->pointcache->startframe);
 }
 
+static void handle_passive_transform(FractureModifierData *fmd, MeshIsland 
*mi, Object* ob)
+{
+       RigidBodyOb *rbo = mi->rigidbody;
+
+       if (rbo->type == RBO_TYPE_PASSIVE)
+       {
+               if (rbo->flag & RBO_FLAG_KINEMATIC)
+               {
+                       rigidbody_passive_fake_parenting(fmd, ob, rbo);
+               }
+               else
+               {
+                       DerivedMesh *dm = fmd->visible_mesh_cached;
+                       ModifierData *md;
+                       bool found = false;
+
+                       if (dm)
+                       {
+                               int totvert = dm->getNumVerts(dm);
+
+                               for (md = ob->modifiers.first; md; md = 
md->next)
+                               {
+                                       if (md->type == eModifierType_Fracture)
+                                       {
+                                               if ((FractureModifierData*)md 
== fmd)
+                                               {
+                                                       found = true;
+                                               }
+                                       }
+
+                                       //only eval following hookmodifiers, 
based on our derivedmesh
+                                       if (md->type == eModifierType_Hook && 
found)
+                                       {
+                                               float (*vertexCos)[3];
+                                               const ModifierTypeInfo *mti = 
modifierType_getInfo(md->type);
+                                               HookModifierData *hmd = 
(HookModifierData*)md;
+
+                                               //skip hook modifiers which 
were just added and arent valid yet
+                                               if (!hmd->object)
+                                                       continue;
+
+                                               vertexCos = 
MEM_callocN(sizeof(float) * 3 * totvert, "Vertex Cos");
+                                               dm->getVertCos(dm, vertexCos);
+
+                                               mti->deformVerts(md, ob, dm, 
vertexCos, totvert, 0);
+                                               rigidbody_passive_fake_hook(mi, 
vertexCos[mi->vertex_indices[0]], fmd, ob);
+
+                                               MEM_freeN(vertexCos);
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
 static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld 
*rbw, float ctime)
 {
        bool modFound = false;
@@ -3788,7 +3846,7 @@ static bool do_sync_modifier(ModifierData *md, Object 
*ob, RigidBodyWorld *rbw,
                                        continue;
                                }
 
-                               rigidbody_passive_fake_parenting(fmd, ob, rbo);
+                               //handle_passive_transform(fmd, mi, ob);
 
                                /* use rigid body transform after cache start 
frame if objects is not being transformed */
                                if (BKE_rigidbody_check_sim_running(rbw, ctime) 
&& !(ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) {
@@ -3971,8 +4029,11 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float 
loc[3], float rot[3], flo
                {
                        rbo = mi->rigidbody;
                        do_reset_rigidbody(rbo, ob, mi, loc, rot, quat, 
rotAxis, rotAngle);
-                       rigidbody_passive_fake_parenting(rmd, ob, rbo);
+                       handle_passive_transform(rmd, mi, ob);
                }
+
+               //then update origmat
+               copy_m4_m4(rmd->origmat, ob->obmat);
        }
        else {
                rbo = ob->rigidbody_object;
@@ -3981,9 +4042,6 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float 
loc[3], float rot[3], flo
                // RB_TODO update rigid body physics object's loc/rot for 
dynamic objects here as well (needs to be done outside bullet's update loop)
        }
 
-       //then update origmat
-       copy_m4_m4(rmd->origmat, ob->obmat);
-
        // RB_TODO update rigid body physics object's loc/rot for dynamic 
objects here as well (needs to be done outside bullet's update loop)
 }
 
@@ -4047,8 +4105,8 @@ void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
        if (rbw) {
                rbw->pointcache->flag |= PTCACHE_OUTDATED;
                //restoreKinematic(rbw);
-               if (!(rbw->pointcache->flag & PTCACHE_BAKED))
-                       resetDynamic(rbw);
+               //if (!(rbw->pointcache->flag & PTCACHE_BAKED))
+               //      resetDynamic(rbw);
        }
 }
 
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 608df77..422d9e5 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -87,6 +87,7 @@ static DerivedMesh* do_prefractured(FractureModifierData 
*fmd, Object *ob, Deriv
 static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* 
derivedData);
 static Shard* copy_shard(Shard *s);
 
+//TODO XXX Make BKE
 static FracMesh* copy_fracmesh(FracMesh* fm)
 {
        FracMesh *fmesh;
@@ -94,7 +95,6 @@ static FracMesh* copy_fracmesh(FracMesh* fm)
        int i = 0;
 
        fmesh = MEM_mallocN(sizeof(FracMesh), __func__);
-       //BLI_duplicatelist(&fmesh->shard_map, &fm->shard_map);
        fmesh->shard_map.first = NULL;
        fmesh->shard_map.last = NULL;
 
@@ -216,6 +216,7 @@ static void initData(ModifierData *md)
        fmd->constraint_count = 0;
 }
 
+//XXX TODO, freeing functionality should be in BKE too
 static void free_meshislands(FractureModifierData* fmd, ListBase* meshIslands)
 {
        MeshIsland *mi;
@@ -424,6 +425,7 @@ static void freeData(ModifierData *md)
        free_shards(fmd);
 }
 
+//XXX TODO move cluster handling to BKE too
 static void do_cluster_count(FractureModifierData *fmd)
 {
        int k = 0;
@@ -525,6 +527,7 @@ static void do_clusters(FractureModifierData *fmd, Object* 
obj)
        }
 }
 
+//XXXX TODO same applies for autohide prep and normals fixing, latter could be 
a separate operator or so, called from refresh op
 static KDTree *build_nor_tree(DerivedMesh *dm)
 {
        int i = 0, totvert = dm->getNumVerts(dm);
@@ -577,6 +580,7 @@ static void find_normal(DerivedMesh *dm, KDTree *tree, 
float co[3], short no[3],
        copy_v3_v3_short(rno, mvert.no);
 }
 
+//Move to BKE too, TODO XXXX
 static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh *dm)
 {
        /* may have messed up meshes from conversion */
@@ -599,6 +603,7 @@ static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh 
*dm)
        return dm;
 }
 
+//XXX TODO plan is to get rid of this, since we have a packing mechanism now, 
but wrap that functionality to useful op (via C, python api is optional)
 static int getGroupObjects(Group *gr, Object ***obs, int g_exist)
 {
        int ctr = g_exist;
@@ -633,34 +638,6 @@ static DerivedMesh* get_object_dm(Object* o)
        return dm_ob;
 }
 
-#if 0

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to