void collisionTester::setTransformFromOF(ofMatrix4x4& mat, ofVec3f& s, btCollisionObject& obj){ btTransform trans; trans.setFromOpenGLMatrix(mat.getPtr()); obj.setWorldTransform(trans); obj.getCollisionShape()->setLocalScaling(btVector3(s.x, s.y, s.z)); }
virtual bool needsCollision(btBroadphaseProxy* proxy0) const { //don't collide with itself if (proxy0->m_clientObject == m_me) return false; ///don't do CCD when the collision filters are not matching if (!ClosestConvexResultCallback::needsCollision(proxy0)) return false; btCollisionObject* otherObj = (btCollisionObject*) proxy0->m_clientObject; //call needsResponse, see http://code.google.com/p/bullet/issues/detail?id=179 if (m_dispatcher->needsResponse(m_me,otherObj)) { ///don't do CCD when there are already contact points (touching contact/penetration) btAlignedObjectArray<btPersistentManifold*> manifoldArray; btBroadphasePair* collisionPair = m_pairCache->findPair(m_me->getBroadphaseHandle(),proxy0); if (collisionPair) { if (collisionPair->m_algorithm) { manifoldArray.resize(0); collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); for (int j=0;j<manifoldArray.size();j++) { btPersistentManifold* manifold = manifoldArray[j]; if (manifold->getNumContacts()>0) return false; } } } } return true; }
void Process(const btDbvtNode* leaf) { int index = leaf->dataAsInt; btCompoundShape* compoundShape = static_cast<btCompoundShape*>(m_compoundColObj->getCollisionShape()); btCollisionShape* childShape = compoundShape->getChildShape(index); if (m_dispatchInfo.m_debugDraw && (m_dispatchInfo.m_debugDraw->getDebugMode() & btIDebugDraw::DBG_DrawAabb)) { btVector3 worldAabbMin,worldAabbMax; btTransform orgTrans = m_compoundColObj->getWorldTransform(); btTransformAabb(leaf->volume.Mins(),leaf->volume.Maxs(),0.,orgTrans,worldAabbMin,worldAabbMax); m_dispatchInfo.m_debugDraw->drawAabb(worldAabbMin,worldAabbMax,btVector3(1,0,0)); } ProcessChildShape(childShape,index); }
void render() { btScalar childMat[16]; m_bulletObject->getWorldTransform().getOpenGLMatrix(childMat); if (m_texture) { m_texture->initOpenGLTexture(); glBindTexture(GL_TEXTURE_2D,m_texture->m_textureName); glEnable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glDepthFunc (GL_LEQUAL); glDisable(GL_BLEND); glEnable (GL_DEPTH_TEST); glMatrixMode(GL_TEXTURE); glMatrixMode(GL_MODELVIEW); } else { glDisable(GL_TEXTURE_2D); } glDisable(GL_LIGHTING); glPushMatrix(); btglMultMatrix(childMat); //glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); glBegin(GL_TRIANGLES); glColor4f(1, 1, 1,1); for (int i=0;i<m_indices.size();i++) { glNormal3f(1.f,0.f,0.f); glTexCoord2f(m_vertices[m_indices[i]].m_uv1[0],m_vertices[m_indices[i]].m_uv1[1]); glVertex3f(m_vertices[m_indices[i]].m_localxyz.getX(),m_vertices[m_indices[i]].m_localxyz.getY(),m_vertices[m_indices[i]].m_localxyz.getZ()); } glEnd(); glPopMatrix(); }
void Process(int i) { const btCollisionShape* childCollisionShape = m_compoundShape->getChildShape(i); const btTransform& childTrans = m_compoundShape->getChildTransform(i); btTransform childWorldTrans = m_colObjWorldTransform * childTrans; // replace collision shape so that callback can determine the triangle btCollisionShape* saveCollisionShape = m_collisionObject->getCollisionShape(); m_collisionObject->internalSetTemporaryCollisionShape((btCollisionShape*)childCollisionShape); LocalInfoAdder2 my_cb(i, &m_resultCallback); rayTestSingle( m_rayFromTrans, m_rayToTrans, m_collisionObject, childCollisionShape, childWorldTrans, my_cb); // restore m_collisionObject->internalSetTemporaryCollisionShape(saveCollisionShape); }
void ProcessChildShape(btCollisionShape* childShape,int index) { btCompoundShape* compoundShape = static_cast<btCompoundShape*>(m_compoundColObj->getCollisionShape()); //backup btTransform orgTrans = m_compoundColObj->getWorldTransform(); btTransform orgInterpolationTrans = m_compoundColObj->getInterpolationWorldTransform(); const btTransform& childTrans = compoundShape->getChildTransform(index); btTransform newChildWorldTrans = orgTrans*childTrans ; //perform an AABB check first btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1; childShape->getAabb(newChildWorldTrans,aabbMin0,aabbMax0); m_otherObj->getCollisionShape()->getAabb(m_otherObj->getWorldTransform(),aabbMin1,aabbMax1); if (TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1)) { m_compoundColObj->setWorldTransform( newChildWorldTrans); m_compoundColObj->setInterpolationWorldTransform(newChildWorldTrans); //the contactpoint is still projected back using the original inverted worldtrans btCollisionShape* tmpShape = m_compoundColObj->getCollisionShape(); m_compoundColObj->internalSetTemporaryCollisionShape( childShape ); if (!m_childCollisionAlgorithms[index]) m_childCollisionAlgorithms[index] = m_dispatcher->findAlgorithm(m_compoundColObj,m_otherObj,m_sharedManifold); m_childCollisionAlgorithms[index]->processCollision(m_compoundColObj,m_otherObj,m_dispatchInfo,m_resultOut); if (m_dispatchInfo.m_debugDraw && (m_dispatchInfo.m_debugDraw->getDebugMode() & btIDebugDraw::DBG_DrawAabb)) { btVector3 worldAabbMin,worldAabbMax; m_dispatchInfo.m_debugDraw->drawAabb(aabbMin0,aabbMax0,btVector3(1,1,1)); m_dispatchInfo.m_debugDraw->drawAabb(aabbMin1,aabbMax1,btVector3(1,1,1)); } //revert back transform m_compoundColObj->internalSetTemporaryCollisionShape( tmpShape); m_compoundColObj->setWorldTransform( orgTrans ); m_compoundColObj->setInterpolationWorldTransform(orgInterpolationTrans); } }