bool PhysicsSystem::AddRigidBody(CollisionBody* collision_body) { eid entity_id = collision_body->entity_id; RemoveRigidBody(entity_id); if (!collision_body->shape) { return false; } btVector3 fallInertia(0, 0, 0); if (collision_body->mass > 0.0) { if (collision_body->shape) { collision_body->shape->calculateLocalInertia(collision_body->mass, fallInertia); } } btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(collision_body->mass, &collision_body->motion_state, collision_body->shape.get(), fallInertia); auto body = new btRigidBody(fallRigidBodyCI); if (!body) { return false; } this->bodies[entity_id] = body; body->setUserPointer(collision_body); return true; }
void DynamicsWorld::AddRigidBody(RigidBody &body, short group, short mask) { auto prevWorld = body.GetWorld(); if (prevWorld != nullptr) { prevWorld->RemoveRigidBody(body); } body.SetWorld(this); this->world.addRigidBody(&body, group, mask); }
void PhysicsSystem::On(std::shared_ptr<EntityDestroyed> data) { RemoveRigidBody(data->entity_id); this->bodies.erase(data->entity_id); // There isn't a chance it will be re-added. }