Commit: cd603674c9b15f6e3871e985bc9f2d4114622465
Author: Martin Felke
Date:   Thu Jun 4 14:20:13 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBcd603674c9b15f6e3871e985bc9f2d4114622465

dynamic fracture: re-added modified version of speed transfer, it depends now 
on linear / angular deactivation threshold whether speed is transferred or not 
(to reduce "jumping" of shards on the ground)

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

M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/makesdna/DNA_rigidbody_types.h
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 163f065..3dcd7ec 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1698,8 +1698,8 @@ bool BKE_lookup_mesh_state(FractureModifierData *fmd, int 
frame, int do_lookup)
        {
                if (forward || backward)
                {
-                       fmd->modifier.scene->rigidbody_world->refresh_modifiers 
= true;
-                       fmd->modifier.scene->rigidbody_world->object_changed = 
true;
+                       fmd->modifier.scene->rigidbody_world->flag |= 
RBW_FLAG_REFRESH_MODIFIERS;
+                       fmd->modifier.scene->rigidbody_world->flag |= 
RBW_FLAG_OBJECT_CHANGED;
                }
 
                return forward || backward;
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 2757a06..fb2a670 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1209,13 +1209,23 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld 
*rbw, MeshIsland *mi, Objec
 
                RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
                RB_body_set_kinematic_state(rbo->physics_object, rbo->flag & 
RBO_FLAG_KINEMATIC || rbo->flag & RBO_FLAG_DISABLED);
+
+               if ((len_squared_v3(rbo->lin_vel) > (rbo->lin_sleep_thresh * 
rbo->lin_sleep_thresh)))
+               {
+                       //printf("Setting linear velocity (%f, %f, %f)\n", 
rbo->lin_vel[0], rbo->lin_vel[1], rbo->lin_vel[2]);
+                       RB_body_set_linear_velocity(rbo->physics_object, 
rbo->lin_vel);
+               }
+
+               if ((len_squared_v3(rbo->ang_vel) > (rbo->ang_sleep_thresh * 
rbo->ang_sleep_thresh)))
+               {
+                       //printf("Setting angular velocity (%f, %f, %f)\n", 
rbo->ang_vel[0], rbo->ang_vel[1], rbo->ang_vel[2]);
+                       RB_body_set_angular_velocity(rbo->physics_object, 
rbo->ang_vel);
+               }
        }
 
        if (rbw && rbw->physics_world && rbo->physics_object)
        {
                RB_dworld_add_body(rbw->physics_world, rbo->physics_object, 
rbo->col_groups, mi, ob, mi->linear_index);
-
-               //apply_movement_update(rbo, mi);
        }
 
        rbo->flag &= ~RBO_FLAG_NEEDS_VALIDATE;
@@ -2010,8 +2020,8 @@ RigidBodyWorld *BKE_rigidbody_create_world(Scene *scene)
 
        rbw->pointcache = BKE_ptcache_add(&(rbw->ptcaches));
        rbw->pointcache->step = 1;
-       rbw->object_changed = false;
-       rbw->refresh_modifiers = false;
+       rbw->flag &=~ RBW_FLAG_OBJECT_CHANGED;
+       rbw->flag &=~ RBW_FLAG_REFRESH_MODIFIERS;
 
        rbw->objects = MEM_mallocN(sizeof(Object *), "objects");
        rbw->cache_index_map = MEM_mallocN(sizeof(RigidBodyOb *), 
"cache_index_map");
@@ -2171,6 +2181,9 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, 
Object *ob, short type)
 
        rbo->meshisland_index = -1;
 
+       zero_v3(rbo->lin_vel);
+       zero_v3(rbo->ang_vel);
+
        fmd = (FractureModifierData*)modifiers_findByType(ob, 
eModifierType_Fracture);
        if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
        {       //keep cache here
@@ -2620,7 +2633,7 @@ static void rigidbody_update_sim_world(Scene *scene, 
RigidBodyWorld *rbw)
        RB_dworld_set_gravity(rbw->physics_world, adj_gravity);
 
        /* update object array in case there are changes */
-       if (!rbw->refresh_modifiers)
+       if (!(rbw->flag & RBW_FLAG_REFRESH_MODIFIERS))
                rigidbody_update_ob_array(rbw);
 }
 
@@ -3009,7 +3022,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                
BKE_rigidbody_validate_sim_shard_constraint(rbw, rbsc, false);
                        }
 
-                       if (rbsc->physics_constraint && rbw && 
rbw->rebuild_comp_con) {
+                       if (rbsc->physics_constraint && rbw && (rbw->flag & 
RBW_FLAG_REBUILD_CONSTRAINTS)) {
                                
RB_constraint_set_enabled(rbsc->physics_constraint, true);
                        }
 
@@ -3088,7 +3101,7 @@ static void rigidbody_update_simulation(Scene *scene, 
RigidBodyWorld *rbw, bool
                        rigidbody_update_sim_ob(scene, rbw, ob, rbo, centroid);
                }
 
-               rbw->refresh_modifiers = false;
+               rbw->flag &= ~RBW_FLAG_REFRESH_MODIFIERS;
        }
 
        /* update constraints */
@@ -3155,6 +3168,10 @@ static void 
rigidbody_update_simulation_post_step(RigidBodyWorld *rbw)
                                                        if (rbo->type == 
RBO_TYPE_PASSIVE)
                                                                
RB_body_deactivate(rbo->physics_object);
                                                }
+
+                                               /* update stored velocities, 
can be set again after sim rebuild */
+                                               
RB_body_get_linear_velocity(rbo->physics_object, rbo->lin_vel);
+                                               
RB_body_get_angular_velocity(rbo->physics_object, rbo->ang_vel);
                                        }
                                        modFound = true;
                                        break;
@@ -3208,7 +3225,7 @@ static bool do_sync_modifier(ModifierData *md, Object 
*ob, RigidBodyWorld *rbw,
                                if (ob->flag & SELECT && G.moving & 
G_TRANSFORM_OBJ && rbw) {
                                        RigidBodyShardCon *con;
 
-                                       rbw->object_changed = true;
+                                       rbw->flag |= RBW_FLAG_OBJECT_CHANGED;
                                        BKE_rigidbody_cache_reset(rbw);
                                        /* re-enable all constraints as well */
                                        for (con = fmd->meshConstraints.first; 
con; con = con->next) {
@@ -3218,7 +3235,7 @@ static bool do_sync_modifier(ModifierData *md, Object 
*ob, RigidBodyWorld *rbw,
                                }
                        }
 
-                       if (!is_zero_m4(fmd->origmat) && rbw && 
!rbw->object_changed) {
+                       if (!is_zero_m4(fmd->origmat) && rbw && !(rbw->flag & 
RBW_FLAG_OBJECT_CHANGED)) {
                                copy_m4_m4(ob->obmat, fmd->origmat);
                        }
 
@@ -3316,7 +3333,7 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, 
Object *ob, float ctime)
                /* otherwise set rigid body transform to current obmat */
                else {
                        if (ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)
-                               rbw->object_changed = true;
+                               rbw->flag |= RBW_FLAG_OBJECT_CHANGED;
 
                        mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
                }
@@ -3473,22 +3490,22 @@ void BKE_rigidbody_do_simulation(Scene *scene, float 
ctime)
        cache = rbw->pointcache;
 
        /*trigger dynamic update*/
-       if ((rbw->object_changed))
+       if ((rbw->flag & RBW_FLAG_OBJECT_CHANGED))
        {
-               rbw->object_changed = false;
+               rbw->flag &= ~RBW_FLAG_OBJECT_CHANGED;
                rigidbody_update_simulation(scene, rbw, true);
-               rbw->refresh_modifiers = false;
+               rbw->flag &= ~RBW_FLAG_REFRESH_MODIFIERS;
        }
 
        if (ctime <= startframe) {
                /* rebuild constraints */
-               rbw->rebuild_comp_con = true;
+               rbw->flag |= RBW_FLAG_REBUILD_CONSTRAINTS;
 
                rbw->ltime = startframe;
-               if (rbw->object_changed)
+               if (rbw->flag & RBW_FLAG_OBJECT_CHANGED)
                {       /* flag modifier refresh at their next execution XXX 
TODO -> still used ? */
-                       rbw->refresh_modifiers = true;
-                       rbw->object_changed = false;
+                       rbw->flag |= RBW_FLAG_REFRESH_MODIFIERS;
+                       rbw->flag &= ~RBW_FLAG_OBJECT_CHANGED;
                        rigidbody_update_simulation(scene, rbw, true);
                }
                return;
@@ -3527,7 +3544,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float 
ctime)
                }
 
                if (rbw->ltime > startframe) {
-                       rbw->rebuild_comp_con = false;
+                       rbw->flag &= ~RBW_FLAG_REBUILD_CONSTRAINTS;
                }
 
                /* update and validate simulation */
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h 
b/source/blender/makesdna/DNA_rigidbody_types.h
index a7f0c90..ab17416 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -74,13 +74,8 @@ typedef struct RigidBodyWorld {
        /* References to Physics Sim objects. Exist at runtime only 
---------------------- */
        void *physics_world;            /* Physics sim world (i.e. 
btDiscreteDynamicsWorld) */
        RigidBodyOb **cache_index_map;          /* Maps the linear RigidbodyOb 
index to the nested Object(Modifier) Index, at runtime*/
-       void *last_contact_point;
        int *cache_offset_map;          /* Maps the linear RigidbodyOb index to 
the nested Object(Modifier) cell offset, at runtime, so it does not need to be 
calced in cache*/
-       int *local_index_map;
-       int refresh_modifiers;          /* If we have rigidbody modifiers, time 
to refresh them if flag is set*/
-       int object_changed;                     /* Flag changes to objects 
(especially those with modifiers)*/
-       int rebuild_comp_con;
-       char pad2[4];
+       //char pad2[4];
 } RigidBodyWorld;
 
 /* Flags for RigidBodyWorld */
@@ -89,8 +84,14 @@ typedef enum eRigidBodyWorld_Flag {
        RBW_FLAG_MUTED                          = (1 << 0),
        /* sim data needs to be rebuilt */
        RBW_FLAG_NEEDS_REBUILD          = (1 << 1),
-       /* usse split impulse when stepping the simulation */
-       RBW_FLAG_USE_SPLIT_IMPULSE      = (1 << 2)
+       /* use split impulse when stepping the simulation */
+       RBW_FLAG_USE_SPLIT_IMPULSE      = (1 << 2),
+       /* Flag changes to objects (especially those with modifiers)*/
+       RBW_FLAG_OBJECT_CHANGED         = (1 << 3),
+       /* If we have rigidbody modifiers, time to refresh them if flag is set*/
+       RBW_FLAG_REFRESH_MODIFIERS      = (1 << 4),
+       /* Flag rebuild of constraints in fracture modifier objects */
+       RBW_FLAG_REBUILD_CONSTRAINTS = (1 << 5),
 } eRigidBodyWorld_Flag;
 
 /* ******************************** */
@@ -134,6 +135,8 @@ typedef struct RigidBodyOb {
        
        float orn[4];                   /* rigid body orientation */
        float pos[3];                   /* rigid body position */
+       float lin_vel[3];               /* rigid body linear velocity, 
important for dynamic fracture*/
+       float ang_vel[3];               /* rigid body angular velocity, 
important for dynamic fracture*/
        float pad1;
 } RigidBodyOb;
 
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 2634d68..94a6793 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -207,7 +207,7 @@ static void initData(ModifierData *md)
        fmd->last_frame = FLT_MIN;
        fmd->dynamic_force = 10.0f;
        fmd->update_dynamic = false;
-       fmd->limit_impact = true;
+       fmd->limit_impact = false;
 }
 
 static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool 
remove_rigidbody)
@@ -2773,7 +2773,7 @@ static void do_handle_parent_mi(FractureModifierData 
*fmd, MeshIsland *mi, MeshI
        BKE_match_vertex_coords(mi, par, ob, frame, is_parent);
 
        BKE_rigidbody_remove_shard(fmd->modifier.scene, par);
-       fmd->modifier.scene->rigidbody_world->object_changed = true;
+       fmd->modifier.scene->rigidbody_world->flag |= RBW_FLAG_OBJECT_CHANGED;
        par->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
 }
 
@@ -2838,6 +2838,8 @@ static void do_island_from_shard(FractureModifierData 
*fmd, Object *ob, Shard* s
                                  int i, int thresh_defgrp_index, int 
ground_defgrp_index, int vertstart)
 {
        MeshIsland *mi;
+       MeshIsland *par = NULL;
+       bool is_parent = false;
        short rb_type = RBO_TYPE_ACTIVE;
        float dummyloc[3], rot[4];
        //float linvel[3], angvel[3];
@@ -2935,20 +2937,21 @@ static void do_island_

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