Fixes to Bullet soft body transform handling.
This commit is contained in:
parent
82eb82d026
commit
455a504cec
|
|
@ -194,22 +194,35 @@ transform_changed() {
|
|||
LMatrix4 m_ts = ts->get_mat();
|
||||
|
||||
if (!m_sync.almost_equal(m_ts)) {
|
||||
_sync = ts;
|
||||
|
||||
// New transform for the center
|
||||
btTransform trans = TransformState_to_btTrans(ts);
|
||||
|
||||
trans *= _soft->m_initialWorldTransform.inverse();
|
||||
// Offset between current approx center and current initial transform
|
||||
btVector3 pos = LVecBase3_to_btVector3(this->get_aabb().get_approx_center());
|
||||
btVector3 origin = _soft->m_initialWorldTransform.getOrigin();
|
||||
btVector3 offset = pos - origin;
|
||||
|
||||
// Subtract offset to get new transform for the body
|
||||
trans.setOrigin(trans.getOrigin() - offset);
|
||||
|
||||
// Now apply the new transform
|
||||
_soft->transform(_soft->m_initialWorldTransform.inverse());
|
||||
_soft->transform(trans);
|
||||
|
||||
if (ts->has_scale()) {
|
||||
LVecBase3 scale = ts->get_scale();
|
||||
if (!scale.almost_equal(LVecBase3(1.0f, 1.0f, 1.0f))) {
|
||||
for (int i=0; i<get_num_shapes(); i++) {
|
||||
PT(BulletShape) shape = _shapes[i];
|
||||
shape->set_local_scale(scale);
|
||||
}
|
||||
}
|
||||
btVector3 current_scale = LVecBase3_to_btVector3(_sync->get_scale());
|
||||
btVector3 new_scale = LVecBase3_to_btVector3(ts->get_scale());
|
||||
|
||||
current_scale.setX(1.0 / current_scale.getX());
|
||||
current_scale.setY(1.0 / current_scale.getY());
|
||||
current_scale.setZ(1.0 / current_scale.getZ());
|
||||
|
||||
_soft->scale(current_scale);
|
||||
_soft->scale(new_scale);
|
||||
}
|
||||
|
||||
_sync = ts;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -221,7 +234,7 @@ transform_changed() {
|
|||
void BulletSoftBodyNode::
|
||||
sync_p2b() {
|
||||
|
||||
transform_changed();
|
||||
//transform_changed(); Disabled for now...
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -280,22 +293,21 @@ sync_b2p() {
|
|||
}
|
||||
}
|
||||
|
||||
// It is ok to pass the address of a temporary object here, because
|
||||
// set_bounds does not store the pointer - it makes a copy using
|
||||
// volume->make_copy().
|
||||
BoundingBox bb = this->get_aabb();
|
||||
LVecBase3 pos = bb.get_approx_center();
|
||||
// Update the synchronized transform with the current
|
||||
// approximate center of the soft body
|
||||
LVecBase3 pos = this->get_aabb().get_approx_center();
|
||||
CPT(TransformState) ts = TransformState::make_pos(pos);
|
||||
|
||||
NodePath np = NodePath::any_path((PandaNode *)this);
|
||||
LVecBase3 scale = np.get_net_transform()->get_scale();
|
||||
|
||||
CPT(TransformState) ts = TransformState::make_pos(pos);
|
||||
ts = ts->set_scale(scale);
|
||||
|
||||
_sync = ts;
|
||||
_sync_disable = true;
|
||||
np.set_transform(NodePath(), ts);
|
||||
_sync_disable = false;
|
||||
/*
|
||||
*/
|
||||
|
||||
Thread *current_thread = Thread::get_current_thread();
|
||||
this->r_mark_geom_bounds_stale(current_thread);
|
||||
|
|
|
|||
Loading…
Reference in New Issue