void RigidBodyBullet::_internal_set_mass(real_t p_mass) { btVector3 localInertia(0, 0, 0); int clearedCurrentFlags = btBody->getCollisionFlags(); clearedCurrentFlags &= ~(btCollisionObject::CF_KINEMATIC_OBJECT | btCollisionObject::CF_STATIC_OBJECT | btCollisionObject::CF_CHARACTER_OBJECT); // Rigidbody is dynamic if and only if mass is non Zero, otherwise static const bool isDynamic = p_mass != 0.f; if (isDynamic) { if (PhysicsServer::BODY_MODE_RIGID != mode && PhysicsServer::BODY_MODE_CHARACTER != mode) return; m_isStatic = false; if (mainShape) mainShape->calculateLocalInertia(p_mass, localInertia); if (PhysicsServer::BODY_MODE_RIGID == mode) { btBody->setCollisionFlags(clearedCurrentFlags); // Just set the flags without Kin and Static } else { btBody->setCollisionFlags(clearedCurrentFlags | btCollisionObject::CF_CHARACTER_OBJECT); } if (can_sleep) { btBody->forceActivationState(ACTIVE_TAG); // ACTIVE_TAG 1 } else { btBody->forceActivationState(DISABLE_DEACTIVATION); // DISABLE_DEACTIVATION 4 } } else { if (PhysicsServer::BODY_MODE_STATIC != mode && PhysicsServer::BODY_MODE_KINEMATIC != mode) return; m_isStatic = true; if (PhysicsServer::BODY_MODE_STATIC == mode) { btBody->setCollisionFlags(clearedCurrentFlags | btCollisionObject::CF_STATIC_OBJECT); } else { btBody->setCollisionFlags(clearedCurrentFlags | btCollisionObject::CF_KINEMATIC_OBJECT); set_transform__bullet(btBody->getWorldTransform()); // Set current Transform using kinematic method } btBody->forceActivationState(DISABLE_SIMULATION); // DISABLE_SIMULATION 5 } btBody->setMassProps(p_mass, localInertia); btBody->updateInertiaTensor(); reload_body(); }
void RigidBodyBullet::on_shapes_changed() { RigidCollisionObjectBullet::on_shapes_changed(); const btScalar invMass = btBody->getInvMass(); const btScalar mass = invMass == 0 ? 0 : 1 / invMass; btVector3 inertia; btBody->getCollisionShape()->calculateLocalInertia(mass, inertia); btBody->setMassProps(mass, inertia); btBody->updateInertiaTensor(); reload_kinematic_shapes(); reload_body(); }