fix deactivation slow-spinning kinematics

This commit is contained in:
Andrew Meadows 2018-07-02 15:01:57 -07:00
parent b862694e32
commit 9c32a38fb6
5 changed files with 19 additions and 2 deletions

View file

@ -834,3 +834,8 @@ void EntityMotionState::clearObjectVelocities() const {
}
_entity->setAcceleration(glm::vec3(0.0f));
}
void EntityMotionState::saveKinematicState(btScalar timeStep) {
_body->saveKinematicState(timeStep);
_body->setAngularVelocity(glmToBullet(_entity->getWorldAngularVelocity()));
}

View file

@ -97,6 +97,7 @@ public:
OwnershipState getOwnershipState() const { return _ownershipState; }
void setRegion(uint8_t region);
void saveKinematicState(btScalar timeStep) override;
protected:
void updateSendVelocities();

View file

@ -347,7 +347,7 @@ void ObjectMotionState::updateLastKinematicStep() {
}
void ObjectMotionState::updateBodyMassProperties() {
float mass = getMass();
btScalar mass = getMass();
btVector3 inertia(1.0f, 1.0f, 1.0f);
if (mass > 0.0f) {
_body->getCollisionShape()->calculateLocalInertia(mass, inertia);
@ -356,3 +356,7 @@ void ObjectMotionState::updateBodyMassProperties() {
_body->updateInertiaTensor();
}
void ObjectMotionState::saveKinematicState(btScalar timeStep) {
_body->saveKinematicState(timeStep);
}

View file

@ -165,6 +165,7 @@ public:
virtual bool isLocallyOwned() const { return false; }
virtual bool isLocallyOwnedOrShouldBe() const { return false; } // aka shouldEmitCollisionEvents()
virtual void saveKinematicState(btScalar timeStep);
friend class PhysicsEngine;

View file

@ -162,7 +162,13 @@ void ThreadSafeDynamicsWorld::saveKinematicState(btScalar timeStep) {
for (int i=0;i<m_nonStaticRigidBodies.size();i++) {
btRigidBody* body = m_nonStaticRigidBodies[i];
if (body && body->isKinematicObject() && body->getActivationState() != ISLAND_SLEEPING) {
body->saveKinematicState(timeStep);
if (body->getMotionState()) {
btMotionState* motionState = body->getMotionState();
ObjectMotionState* objectMotionState = static_cast<ObjectMotionState*>(motionState);
objectMotionState->saveKinematicState(timeStep);
} else {
body->saveKinematicState(timeStep);
}
}
}
}