Code: Select all
void explodeAtPos(const btVector3& pos, float force, float radius)
{
btGhostObject* explosionRadius = new btPairCachingGhostObject();
btCollisionShape* explosionshape = new btSphereShape(radius);
explosionRadius->setCollisionShape(explosionshape);
explosionRadius->setCollisionFlags(explosionRadius->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE);
dynamicsWorld->addCollisionObject(explosionRadius, btBroadphaseProxy::SensorTrigger, btBroadphaseProxy::AllFilter);
btTransform explosionTrans;
explosionTrans.setIdentity();
explosionTrans.setOrigin(pos);
explosionRadius->setWorldTransform(explosionTrans);
for(int i = 0; i < explosionRadius->getOverlappingPairs().size(); i++)
{
if(!explosionRadius->getOverlappingPairs().at(i)->isStaticObject())
{
btCollisionObject* forcedObject = explosionRadius->getOverlappingPairs().at(i);
btTransform forcedTrans = forcedObject->getWorldTransform();
btVector3 forceDirection = forcedTrans.getOrigin() - pos;
forceDirection.normalize();
btRigidBody::upcast(forcedObject)->applyCentralImpulse(forceDirection*force); //problem is here, commenting out this line prevents crash
}
}
dynamicsWorld->removeCollisionObject(explosionRadius);
delete explosionRadius;
delete explosionshape;
}