PhysicsRigidBody::PhysicsRigidBody(Node* node, const PhysicsCollisionShape::Definition& shape, const Parameters& parameters, int group, int mask) : PhysicsCollisionObject(node, group, mask), _body(NULL), _mass(parameters.mass), _constraints(NULL), _inDestructor(false) { GP_ASSERT(Game::getInstance()->getPhysicsController()); GP_ASSERT(_node); // Create our collision shape. kmVec3 centerOfMassOffset = vec3Zero; _collisionShape = Game::getInstance()->getPhysicsController()->createShape(node, shape, ¢erOfMassOffset, parameters.mass != 0.0f); GP_ASSERT(_collisionShape && _collisionShape->getShape()); // Create motion state object. _motionState = new PhysicsMotionState(node, this, (kmVec3LengthSq(¢erOfMassOffset) > MATH_EPSILON) ? ¢erOfMassOffset : NULL); // If the mass is non-zero, then the object is dynamic so we calculate the local // inertia. However, if the collision shape is a triangle mesh, we don't calculate // inertia since Bullet doesn't currently support this. btVector3 localInertia(0.0, 0.0, 0.0); if (parameters.mass != 0.0) _collisionShape->getShape()->calculateLocalInertia(parameters.mass, localInertia); // Create the Bullet physics rigid body object. btRigidBody::btRigidBodyConstructionInfo rbInfo(parameters.mass, NULL, _collisionShape->getShape(), localInertia); rbInfo.m_friction = parameters.friction; rbInfo.m_restitution = parameters.restitution; rbInfo.m_linearDamping = parameters.linearDamping; rbInfo.m_angularDamping = parameters.angularDamping; // Create + assign the new bullet rigid body object. _body = bullet_new<btRigidBody>(rbInfo); // Set motion state after rigid body assignment, since bullet will callback on the motion state interface to query // the initial transform and it will need to access to rigid body (_body). _body->setMotionState(_motionState); // Set other initially defined properties. setKinematic(parameters.kinematic); setAnisotropicFriction(parameters.anisotropicFriction); setAngularFactor(parameters.angularFactor); setLinearFactor(parameters.linearFactor); // Add ourself to the physics world. Game::getInstance()->getPhysicsController()->addCollisionObject(this); if (_collisionShape->getType() == PhysicsCollisionShape::SHAPE_HEIGHTFIELD) { // Add a listener on the node's transform so we can track dirty changes to calculate // an inverse kmMat4 for transforming heightfield points between world and local space. _node->addListener(this); } }
PhysicsRigidBody::PhysicsRigidBody(Node* node, const PhysicsCollisionShape::Definition& shape, const Parameters& parameters) : PhysicsCollisionObject(node), _body(NULL), _mass(parameters.mass), _constraints(NULL), _inDestructor(false) { GP_ASSERT(Game::getInstance()->getPhysicsController()); GP_ASSERT(_node); // Create our collision shape. Vector3 centerOfMassOffset; _collisionShape = Game::getInstance()->getPhysicsController()->createShape(node, shape, ¢erOfMassOffset); GP_ASSERT(_collisionShape && _collisionShape->getShape()); // Create motion state object. _motionState = new PhysicsMotionState(node, (centerOfMassOffset.lengthSquared() > MATH_EPSILON) ? ¢erOfMassOffset : NULL); // If the mass is non-zero, then the object is dynamic so we calculate the local // inertia. However, if the collision shape is a triangle mesh, we don't calculate // inertia since Bullet doesn't currently support this. btVector3 localInertia(0.0, 0.0, 0.0); if (parameters.mass != 0.0 && _collisionShape->getType() != PhysicsCollisionShape::SHAPE_MESH) _collisionShape->getShape()->calculateLocalInertia(parameters.mass, localInertia); // Create the Bullet physics rigid body object. btRigidBody::btRigidBodyConstructionInfo rbInfo(parameters.mass, _motionState, _collisionShape->getShape(), localInertia); rbInfo.m_friction = parameters.friction; rbInfo.m_restitution = parameters.restitution; rbInfo.m_linearDamping = parameters.linearDamping; rbInfo.m_angularDamping = parameters.angularDamping; // Create + assign the new bullet rigid body object. _body = bullet_new<btRigidBody>(rbInfo); // Set other initially defined properties. setKinematic(parameters.kinematic); setAnisotropicFriction(parameters.anisotropicFriction); setGravity(parameters.gravity); // Add ourself to the physics world. Game::getInstance()->getPhysicsController()->addCollisionObject(this); if (_collisionShape->getType() == PhysicsCollisionShape::SHAPE_HEIGHTFIELD) { // Add a listener on the node's transform so we can track dirty changes to calculate // an inverse matrix for transforming heightfield points between world and local space. _node->addListener(this); } }