Commit: 9a891f26dd997bb2e9ad9a6a5ee1be6ed5fc6bc7
Author: Martin Felke
Date:   Sat Jun 6 23:04:44 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB9a891f26dd997bb2e9ad9a6a5ee1be6ed5fc6bc7

fix: limit speed transfer to dynamic objects only, caused severe glitches with 
prefractured objects

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

M       source/blender/blenkernel/BKE_rigidbody.h
M       source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/BKE_rigidbody.h 
b/source/blender/blenkernel/BKE_rigidbody.h
index 7607370..aa01595 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -78,7 +78,7 @@ void BKE_rigidbody_validate_sim_shape(struct Object *ob, 
short rebuild);
 void BKE_rigidbody_validate_sim_constraint(struct RigidBodyWorld *rbw, struct 
Object *ob, short rebuild);
 void BKE_rigidbody_validate_sim_shard_constraint(struct RigidBodyWorld *rbw, 
struct RigidBodyShardCon *rbsc, short rebuild);
 
-void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld *rbw, struct 
MeshIsland *mi, struct Object *ob, short rebuild);
+void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld *rbw, struct 
MeshIsland *mi, struct Object *ob, short rebuild, int transfer_speeds);
 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 
*/
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 4588116..f702cbc 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -73,7 +73,7 @@
 
 #ifdef WITH_BULLET
 
-static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int 
rebuild);
+static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int 
rebuild, int transfer_speed);
 
 static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), 
MeshIsland *UNUSED(mi), Object *UNUSED(ob))
 {
@@ -1150,7 +1150,7 @@ void BKE_rigidbody_validate_sim_shard_shape(MeshIsland 
*mi, Object *ob, short re
 /* Create physics sim representation of shard given RigidBody settings
  * < rebuild: even if an instance already exists, replace it
  */
-void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, 
Object *ob, short rebuild)
+void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, 
Object *ob, short rebuild, int transfer_speeds)
 {
        RigidBodyOb *rbo = (mi) ? mi->rigidbody : NULL;
        float loc[3];
@@ -1210,16 +1210,19 @@ 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)))
+               if (transfer_speeds)
                {
-                       //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->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 ((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);
+                       }
                }
        }
 
@@ -2731,7 +2734,7 @@ static void rigidbody_update_sim_ob(Scene *scene, 
RigidBodyWorld *rbw, Object *o
         */
 }
 
-static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int 
rebuild)
+static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int 
rebuild, int transfer_speed)
 {
        if (mi == NULL || mi->rigidbody == NULL) {
                return;
@@ -2739,10 +2742,10 @@ static void validateShard(RigidBodyWorld *rbw, 
MeshIsland *mi, Object *ob, int r
 
        if (rebuild || (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD)) {
                /* World has been rebuilt so rebuild object */
-               BKE_rigidbody_validate_sim_shard(rbw, mi, ob, true);
+               BKE_rigidbody_validate_sim_shard(rbw, mi, ob, true, 
transfer_speed);
        }
        else if (mi->rigidbody->flag & RBO_FLAG_NEEDS_VALIDATE) {
-               BKE_rigidbody_validate_sim_shard(rbw, mi, ob, false);
+               BKE_rigidbody_validate_sim_shard(rbw, mi, ob, false, 
transfer_speed);
        }
        /* refresh shape... */
        if (mi->rigidbody->flag & RBO_FLAG_NEEDS_RESHAPE) {
@@ -2958,7 +2961,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                        }
                                }
 
-                               validateShard(rbw, count == 0 ? NULL : mi, ob, 
do_rebuild);
+                               validateShard(rbw, count == 0 ? NULL : mi, ob, 
do_rebuild, fmd->fracture_mode == MOD_FRACTURE_DYNAMIC);
                        }
 
                        /* update simulation object... */
@@ -3173,8 +3176,11 @@ static void 
rigidbody_update_simulation_post_step(RigidBodyWorld *rbw)
                                                }
 
                                                /* 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);
+                                               if (rmd->fracture_mode == 
MOD_FRACTURE_DYNAMIC)
+                                               {
+                                                       
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;

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

Reply via email to