[Bf-blender-cvs] [e6341b51070] fracture_modifier: fix for rotated box shapes in external mode + print -1 for unbreakable threshold in phys viz
Martin Felke
noreply at git.blender.org
Thu Aug 24 10:30:50 CEST 2017
Commit: e6341b510709be7624e3b48cdd01273187b90662
Author: Martin Felke
Date: Thu Aug 24 10:30:28 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBe6341b510709be7624e3b48cdd01273187b90662
fix for rotated box shapes in external mode + print -1 for unbreakable threshold in phys viz
===================================================================
M intern/rigidbody/rb_bullet_api.cpp
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 1f1aa574084..13e884e180a 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -440,7 +440,13 @@ void TickDiscreteDynamicsWorld::debugDrawWorld(draw_string str_callback)
static const char* val_to_str(rbConstraint* con, int precision, int *length)
{
std::ostringstream oss;
- oss << std::fixed << std::setprecision(precision) << con->id << ":" << con->con->getAppliedImpulse() << ":" << con->con->getBreakingImpulseThreshold();
+ btScalar threshold = con->con->getBreakingImpulseThreshold();
+ if (threshold == FLT_MAX)
+ {
+ threshold = -1;
+ }
+
+ oss << std::fixed << std::setprecision(precision) << con->id << ":" << con->con->getAppliedImpulse() << ":" << threshold;
*length = oss.str().length();
const char *ret = strdup(oss.str().c_str());
return ret;
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index b0cc6af9fcf..fad1258444e 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2780,7 +2780,7 @@ static void fracture_update_shards(FractureModifierData *fmd, Shard *s)
fm->shard_count++;
}
-static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s, int vertstart)
+static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s, int vertstart, float quat[4])
{
MeshIsland *mi;
int k = 0, j = 0, totvert;
@@ -2852,6 +2852,8 @@ static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
/* then eliminate centroid in vertex coords*/
sub_v3_v3(mv->co, s->centroid);
+
+ mul_qt_v3(quat, mv->co);
}
copy_v3_v3(mi->centroid, s->centroid);
@@ -3160,7 +3162,7 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
Shard *s;
int vertstart = 0;
short totcol = 0, totdef = 0;
- float loc[3], quat[4];
+ float loc[3], quat[4], iquat[4];
if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL || own->type != OB_MESH || !own->data)
return NULL;
@@ -3180,7 +3182,8 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
fmd->frac_mesh->progress_counter += s->totvert;
//hrm need to rebuild ALL islands since vertex refs are bonkers now after mesh has changed
- mi = fracture_shard_to_island(fmd, s, vertstart);
+ invert_qt_qt(iquat, quat);
+ mi = fracture_shard_to_island(fmd, s, vertstart, iquat);
copy_qt_qt(mi->rot, quat);
copy_v3_v3(mi->centroid, loc);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index c9e49313bce..250a221c798 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -846,25 +846,24 @@ RigidBodyOb *BKE_rigidbody_create_shard(Scene *scene, Object *ob, Object *target
if (target && target->rigidbody_object)
{
rbo = BKE_rigidbody_copy_object(target);
- //mat4_to_loc_quat(rbo->pos, rbo->orn, target->obmat);
-
+ mat4_to_loc_quat(rbo->pos, rbo->orn, target->obmat);
}
else
{
/* regular FM case */
rbo = BKE_rigidbody_copy_object(ob);
rbo->type = mi->ground_weight > 0.01f ? RBO_TYPE_PASSIVE : RBO_TYPE_ACTIVE;
- }
- /* set initial transform */
- mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
- mat4_to_size(size, ob->obmat);
+ /* set initial transform */
+ mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+ mat4_to_size(size, ob->obmat);
- //add initial "offset" (centroid), maybe subtract ob->obmat ?? (not sure)
- copy_v3_v3(centr, mi->centroid);
- mul_v3_v3(centr, size);
- mul_qt_v3(rbo->orn, centr);
- add_v3_v3(rbo->pos, centr);
+ //add initial "offset" (centroid), maybe subtract ob->obmat ?? (not sure)
+ copy_v3_v3(centr, mi->centroid);
+ mul_v3_v3(centr, size);
+ mul_qt_v3(rbo->orn, centr);
+ add_v3_v3(rbo->pos, centr);
+ }
/* return this object */
return rbo;
@@ -5198,25 +5197,28 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
mul_v3_v3(centr, size);
mul_qt_v3(rbo->orn, centr);
add_v3_v3(rbo->pos, centr);
- }
- //frame = (int)BKE_scene_frame_get(md->scene);
- //print_v3("RBO POS:", rbo->pos);
-#if 0
- if (mode)
- {
- float rot[4];
- copy_qt_qt(rot, mi->rot);
- mul_qt_qtqt(rot, rot, rbo->orn);
- BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
- }
- else
- {
- BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+ if (mode)
+ {
+ mul_qt_qtqt(rbo->orn, rbo->orn, mi->rot);
+ }
}
-#endif
+
if ((ob->rigidbody_object->type == RBO_TYPE_ACTIVE) && (rbo->type == RBO_TYPE_ACTIVE || rbo->flag & RBO_FLAG_KINEMATIC)) {
- BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+
+ float quat[4];
+
+ if (mode)
+ {
+ float iquat[4];
+ invert_qt_qt(iquat, mi->rot);
+ mul_qt_qtqt(quat, rbo->orn, iquat);
+ }
+ else {
+ copy_qt_qt(quat, rbo->orn);
+ }
+
+ BKE_rigidbody_update_cell(mi, ob, rbo->pos, quat, fmd, (int)ctime);
}
}
More information about the Bf-blender-cvs
mailing list