/** * @param collisionShape The collision shape you want to add to the body * @param transform The transformation of the collision shape that transforms the * local-space of the collision shape into the local-space of the body * @param mass Mass (in kilograms) of the collision shape you want to add * @return A pointer to the proxy shape that has been created to link the body to * the new collision shape you have added. */ ProxyShape* RigidBody::addCollisionShape(CollisionShape* collisionShape, const Transform& transform, decimal mass) { // Create a new proxy collision shape to attach the collision shape to the body ProxyShape* proxyShape = new (mWorld.mMemoryManager.allocate(MemoryManager::AllocationType::Pool, sizeof(ProxyShape))) ProxyShape(this, collisionShape, transform, mass, mWorld.mMemoryManager); #ifdef IS_PROFILING_ACTIVE // Set the profiler proxyShape->setProfiler(mProfiler); #endif #ifdef IS_LOGGING_ACTIVE // Set the logger proxyShape->setLogger(mLogger); #endif // Add it to the list of proxy collision shapes of the body if (mProxyCollisionShapes == nullptr) { mProxyCollisionShapes = proxyShape; } else { proxyShape->mNext = mProxyCollisionShapes; mProxyCollisionShapes = proxyShape; } // Compute the world-space AABB of the new collision shape AABB aabb; collisionShape->computeAABB(aabb, mTransform * transform); // Notify the collision detection about this new collision shape mWorld.mCollisionDetection.addProxyCollisionShape(proxyShape, aabb); mNbCollisionShapes++; // Recompute the center of mass, total mass and inertia tensor of the body with the new // collision shape recomputeMassInformation(); RP3D_LOG(mLogger, Logger::Level::Information, Logger::Category::Body, "Body " + std::to_string(mID) + ": Proxy shape " + std::to_string(proxyShape->getBroadPhaseId()) + " added to body"); RP3D_LOG(mLogger, Logger::Level::Information, Logger::Category::ProxyShape, "ProxyShape " + std::to_string(proxyShape->getBroadPhaseId()) + ": collisionShape=" + proxyShape->getCollisionShape()->to_string()); // Return a pointer to the proxy collision shape return proxyShape; }
// Set the profiler void RigidBody::setProfiler(Profiler* profiler) { CollisionBody::setProfiler(profiler); // Set the profiler for each proxy shape ProxyShape* proxyShape = getProxyShapesList(); while (proxyShape != nullptr) { proxyShape->setProfiler(profiler); proxyShape = proxyShape->getNext(); } }