Changeset 1972 for code/branches/physics/src/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
- Timestamp:
- Oct 20, 2008, 5:40:38 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/physics/src/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
r1963 r1972 51 51 52 52 btSoftBodyTriangleCallback::btSoftBodyTriangleCallback(btDispatcher* dispatcher,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped): 53 m_dispatcher(dispatcher),54 m_dispatchInfoPtr(0)53 m_dispatcher(dispatcher), 54 m_dispatchInfoPtr(0) 55 55 { 56 56 m_softBody = (btSoftBody*) (isSwapped? body1:body0); 57 57 m_triBody = isSwapped? body0:body1; 58 59 // 60 // create the manifold from the dispatcher 'manifold pool' 61 // 62 // m_manifoldPtr = m_dispatcher->getNewManifold(m_convexBody,m_triBody); 63 58 59 // 60 // create the manifold from the dispatcher 'manifold pool' 61 // 62 // m_manifoldPtr = m_dispatcher->getNewManifold(m_convexBody,m_triBody); 63 64 clearCache(); 65 } 66 67 btSoftBodyTriangleCallback::~btSoftBodyTriangleCallback() 68 { 64 69 clearCache(); 65 } 66 67 btSoftBodyTriangleCallback::~btSoftBodyTriangleCallback() 68 { 69 clearCache(); 70 // m_dispatcher->releaseManifold( m_manifoldPtr ); 71 72 } 73 70 // m_dispatcher->releaseManifold( m_manifoldPtr ); 71 72 } 73 74 74 75 75 void btSoftBodyTriangleCallback::clearCache() … … 89 89 void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId, int triangleIndex) 90 90 { 91 //just for debugging purposes91 //just for debugging purposes 92 92 //printf("triangle %d",m_triangleCount++); 93 93 btCollisionObject* ob = static_cast<btCollisionObject*>(m_triBody); … … 95 95 ci.m_dispatcher1 = m_dispatcher; 96 96 97 ///debug drawing of the overlapping triangles97 ///debug drawing of the overlapping triangles 98 98 if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && m_dispatchInfoPtr->m_debugDraw->getDebugMode() > 0) 99 99 { … … 108 108 btHashKey<btTriIndex> triKey(triIndex.getUid()); 109 109 110 110 111 111 btTriIndex* shapeIndex = m_shapeCache[triKey]; 112 112 if (shapeIndex) … … 117 117 //copy over user pointers to temporary shape 118 118 tm->setUserPointer(ob->getRootCollisionShape()->getUserPointer()); 119 119 120 120 btCollisionShape* tmpShape = ob->getCollisionShape(); 121 121 ob->internalSetTemporaryCollisionShape( tm ); 122 122 123 123 124 124 btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_softBody,m_triBody,0);//m_manifoldPtr); 125 125 126 126 colAlgo->processCollision(m_softBody,m_triBody,*m_dispatchInfoPtr,m_resultOut); 127 127 colAlgo->~btCollisionAlgorithm(); … … 134 134 135 135 //btCollisionObject* colObj = static_cast<btCollisionObject*>(m_convexProxy->m_clientObject); 136 137 138 { 139 136 137 // if (m_softBody->getCollisionShape()->getShapeType()== 138 { 139 // btVector3 other; 140 140 btVector3 normal = (triangle[1]-triangle[0]).cross(triangle[2]-triangle[0]); 141 141 normal.normalize(); 142 142 normal*= BT_SOFTBODY_TRIANGLE_EXTRUSION; 143 144 143 // other=(triangle[0]+triangle[1]+triangle[2])*0.333333f; 144 // other+=normal*22.f; 145 145 btVector3 pts[6] = {triangle[0]+normal, 146 146 triangle[1]+normal, 147 148 149 150 147 triangle[2]+normal, 148 triangle[0]-normal, 149 triangle[1]-normal, 150 triangle[2]-normal}; 151 151 152 152 btConvexHullShape* tm = new btConvexHullShape(&pts[0].getX(),6); 153 153 154 154 155 156 155 // btBU_Simplex1to4 tm(triangle[0],triangle[1],triangle[2],other); 156 157 157 //btTriangleShape tm(triangle[0],triangle[1],triangle[2]); 158 159 158 // tm.setMargin(m_collisionMarginTriangle); 159 160 160 //copy over user pointers to temporary shape 161 161 tm->setUserPointer(ob->getRootCollisionShape()->getUserPointer()); 162 162 163 163 btCollisionShape* tmpShape = ob->getCollisionShape(); 164 164 ob->internalSetTemporaryCollisionShape( tm ); 165 165 166 166 167 167 btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_softBody,m_triBody,0);//m_manifoldPtr); … … 170 170 171 171 //m_resultOut->setShapeIdentifiers(-1,-1,partId,triangleIndex); 172 173 172 // cvxcvxalgo.setShapeIdentifiers(-1,-1,partId,triangleIndex); 173 // cvxcvxalgo.processCollision(m_convexBody,m_triBody,*m_dispatchInfoPtr,m_resultOut); 174 174 colAlgo->processCollision(m_softBody,m_triBody,*m_dispatchInfoPtr,m_resultOut); 175 175 colAlgo->~btCollisionAlgorithm(); 176 176 ci.m_dispatcher1->freeCollisionAlgorithm(colAlgo); 177 178 177 178 179 179 ob->internalSetTemporaryCollisionShape( tmpShape ); 180 180 triIndex.m_childShape = tm; … … 183 183 } 184 184 185 185 186 186 187 187 } … … 195 195 m_resultOut = resultOut; 196 196 197 197 198 198 btVector3 aabbWorldSpaceMin,aabbWorldSpaceMax; 199 199 m_softBody->getAabb(aabbWorldSpaceMin,aabbWorldSpaceMax); … … 218 218 void btSoftBodyConcaveCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) 219 219 { 220 221 220 221 222 222 btCollisionObject* convexBody = m_isSwapped ? body1 : body0; 223 223 btCollisionObject* triBody = m_isSwapped ? body0 : body1; … … 229 229 btCollisionObject* triOb = triBody; 230 230 btConcaveShape* concaveShape = static_cast<btConcaveShape*>( triOb->getCollisionShape()); 231 232 231 232 // if (convexBody->getCollisionShape()->isConvex()) 233 233 { 234 234 btScalar collisionMarginTriangle = concaveShape->getMargin(); 235 236 235 236 // resultOut->setPersistentManifold(m_btSoftBodyTriangleCallback.m_manifoldPtr); 237 237 m_btSoftBodyTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle,dispatchInfo,resultOut); 238 238 … … 240 240 //m_dispatcher->clearManifold(m_btSoftBodyTriangleCallback.m_manifoldPtr); 241 241 242 242 // m_btSoftBodyTriangleCallback.m_manifoldPtr->setBodies(convexBody,triBody); 243 243 244 244 245 245 concaveShape->processAllTriangles( &m_btSoftBodyTriangleCallback,m_btSoftBodyTriangleCallback.getAabbMin(),m_btSoftBodyTriangleCallback.getAabbMax()); 246 247 248 249 } 250 246 247 // resultOut->refreshContactPoints(); 248 249 } 250 251 251 } 252 252 … … 288 288 btScalar m_ccdSphereRadius; 289 289 btScalar m_hitFraction; 290 290 291 291 292 292 LocalTriangleSphereCastCallback(const btTransform& from,const btTransform& to,btScalar ccdSphereRadius,btScalar hitFraction) … … 297 297 { 298 298 } 299 300 299 300 301 301 virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) 302 302 { … … 328 328 329 329 330 331 332 330 331 332 333 333 if (triBody->getCollisionShape()->isConcave()) 334 334 { … … 350 350 351 351 btConcaveShape* triangleMesh = (btConcaveShape*) concavebody->getCollisionShape(); 352 352 353 353 if (triangleMesh) 354 354 { 355 355 triangleMesh->processAllTriangles(&raycastCallback,rayAabbMin,rayAabbMax); 356 356 } 357 357 358 358 359 359
Note: See TracChangeset
for help on using the changeset viewer.