[Bf-blender-cvs] [d13f6ae2bf2] fracture_modifier: fix: separated comparison angle/distance for break/deform, propagate weakened threshold now
Martin Felke
noreply at git.blender.org
Sat Oct 7 20:00:10 CEST 2017
Commit: d13f6ae2bf20cf0815e8b98c008233b613f31761
Author: Martin Felke
Date: Sat Oct 7 19:59:44 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd13f6ae2bf20cf0815e8b98c008233b613f31761
fix: separated comparison angle/distance for break/deform, propagate weakened threshold now
===================================================================
M source/blender/blenkernel/BKE_rigidbody.h
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/makesdna/DNA_rigidbody_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 15c0ae1580b..50728e8a32d 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -102,7 +102,7 @@ void BKE_rigidbody_calc_shard_mass(struct Object* ob, struct MeshIsland* mi, str
void BKE_rigidbody_calc_threshold(float max_con_mass, struct FractureModifierData* rmd, struct RigidBodyShardCon *con);
float BKE_rigidbody_calc_max_con_mass(struct Object* ob);
float BKE_rigidbody_calc_min_con_dist(struct Object* ob);
-void BKE_rigidbody_start_dist_angle(struct RigidBodyShardCon* con, bool exact);
+void BKE_rigidbody_start_dist_angle(struct RigidBodyShardCon* con, bool exact, bool both);
void BKE_rigidbody_remove_shard_con(struct Scene* scene, struct RigidBodyShardCon* con);
void BKE_rigidbody_remove_shard(struct Scene* scene, struct MeshIsland *mi);
void BKE_rigidbody_update_ob_array(struct RigidBodyWorld *rbw, bool do_bake_correction);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index de4b194089f..47298d8d21f 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2547,15 +2547,21 @@ static void calc_dist_angle(RigidBodyShardCon *con, float *dist, float *angle, b
}
}
-void BKE_rigidbody_start_dist_angle(RigidBodyShardCon *con, bool exact)
+void BKE_rigidbody_start_dist_angle(RigidBodyShardCon *con, bool exact, bool both)
{
/* store starting angle and distance per constraint*/
float dist, angle;
calc_dist_angle(con, &dist, &angle, exact);
- //printf("Start Values(dist, angle) %f %f %f %f\n", con->start_dist, con->start_angle, dist, angle);
- con->start_dist = dist;
- con->start_angle = angle;
+ if (both)
+ {
+ con->start_dist = dist;
+ con->start_angle = angle;
+ //printf("Start Values(dist, angle) %f %f %f %f\n", con->start_dist, con->start_angle, dist, angle);
+ }
+
+ con->start_dist_deform = dist;
+ con->start_angle_deform = angle;
}
float BKE_rigidbody_calc_max_con_mass(Object *ob)
@@ -4648,17 +4654,17 @@ static void test_deactivate_rigidbody(RigidBodyOb *rbo)
static void deform_constraint(FractureModifierData *fmd, Object *ob, RigidBodyShardCon* rbsc, RigidBodyWorld *rbw)
{
- float thresh;
+ float thresh = RB_constraint_get_breaking_threshold(rbsc->physics_constraint);
float weakening = 1.0f - fmd->deform_weakening;
RB_dworld_remove_constraint(rbw->physics_world, rbsc->physics_constraint);
- BKE_rigidbody_start_dist_angle(rbsc, true);
+ BKE_rigidbody_start_dist_angle(rbsc, true, false);
//rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, true);
//set_constraint_index(fmd, rbsc);
- thresh = RB_constraint_get_breaking_threshold(rbsc->physics_constraint);
+ //thresh = RB_constraint_get_breaking_threshold(rbsc->physics_constraint);
RB_constraint_set_breaking_threshold(rbsc->physics_constraint, thresh * weakening);
RB_body_deactivate(rbsc->mi1->rigidbody->physics_object);
@@ -4893,8 +4899,8 @@ static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, Rigid
if (rbsc->physics_constraint && RB_constraint_is_enabled(rbsc->physics_constraint))
{
calc_dist_angle(rbsc, &dist, &angle, false);
- anglediff = fabs(angle - rbsc->start_angle);
- distdiff = fabs(dist - rbsc->start_dist);
+ anglediff = fabs(angle - rbsc->start_angle_deform);
+ distdiff = fabs(dist - rbsc->start_dist_deform);
/* handle deform */
handle_deform_angle(fmd, ob, rbsc, rbw, anglediff, weight, deform_angle);
@@ -5107,7 +5113,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
/* World has been rebuilt so rebuild constraint */
BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, true);
BKE_rigidbody_start_dist_angle(rbsc, fmd->fracture_mode == MOD_FRACTURE_EXTERNAL ||
- (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external));
+ (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external), true);
//TODO ensure evaluation on transform change too
}
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 42fdd977cc8..eab44334eed 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -313,6 +313,8 @@ typedef struct RigidBodyShardCon {
float breaking_dist;
float plastic_angle;
float plastic_dist;
+ float start_angle_deform;
+ float start_dist_deform;
float orn[4];
float pos[3];
More information about the Bf-blender-cvs
mailing list