From 05cbd9697210a950ee366fe194f5f10770da9902 Mon Sep 17 00:00:00 2001 From: ejcoumans Date: Wed, 13 Jun 2007 22:25:37 +0000 Subject: [PATCH] updated multithreaded version for concave trimeshes --- .../SpuContactManifoldCollisionAlgorithm.cpp | 2 +- .../SpuContactManifoldCollisionAlgorithm.h | 2 +- .../SpuGatheringCollisionTask.cpp | 25 +++++++++++-------- .../SpuVoronoiSimplexSolver.h | 2 +- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.cpp b/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.cpp index 6bf85dbd2..0299301f9 100644 --- a/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.cpp +++ b/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.cpp @@ -31,7 +31,7 @@ void SpuContactManifoldCollisionAlgorithm::processCollision (btCollisionObject* btAssert(0); } -float SpuContactManifoldCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +btScalar SpuContactManifoldCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) { btAssert(0); return 1.f; diff --git a/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h b/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h index 0f0c933cf..4a4069eb7 100644 --- a/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h +++ b/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h @@ -36,7 +36,7 @@ public: virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); - virtual float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); SpuContactManifoldCollisionAlgorithm(); diff --git a/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp b/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp index adabce684..4eeb827aa 100644 --- a/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp +++ b/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp @@ -32,7 +32,7 @@ #include #endif - +#define MAX_SHAPE_SIZE 256 //int gNumConvexPoints0=0; @@ -55,12 +55,11 @@ struct CollisionTask_LocalStoreMemory btCollisionObject gColObj0; btCollisionObject gColObj1; - static const int maxShapeSize = 256;//todo: make some compile-time assert that this is value is larger then sizeof(btCollisionShape) + static const int maxShapeSize = MAX_SHAPE_SIZE;//todo: make some compile-time assert that this is value is larger then sizeof(btCollisionShape) ATTRIBUTE_ALIGNED16(char gCollisionShape0[maxShapeSize]); ATTRIBUTE_ALIGNED16(char gCollisionShape1[maxShapeSize]); - ATTRIBUTE_ALIGNED16(btScalar spuUnscaledVertex[4]); ATTRIBUTE_ALIGNED16(int spuIndices[16]); ATTRIBUTE_ALIGNED16(btOptimizedBvh gOptimizedBvh); @@ -122,6 +121,7 @@ void spuWalkStacklessQuantizedTree(btNodeOverlapCallback* nodeCallback,unsigned if (isLeafNode && aabbOverlap) { + //printf("overlap with node %d\n",rootNode->getTriangleIndex()); nodeCallback->processNode(0,rootNode->getTriangleIndex()); // spu_printf("SPU: overlap detected with triangleIndex:%d\n",rootNode->getTriangleIndex()); } @@ -211,9 +211,9 @@ public: ///handle un-aligned vertices... //another DMA for each vertex - small_cache_read(&m_lsMemPtr->spuUnscaledVertex[0],(uint64_t)&graphicsbasePtr[0],sizeof(btScalar)); - small_cache_read(&m_lsMemPtr->spuUnscaledVertex[1],(uint64_t)&graphicsbasePtr[1],sizeof(btScalar)); - small_cache_read(&m_lsMemPtr->spuUnscaledVertex[2],(uint64_t)&graphicsbasePtr[2],sizeof(btScalar)); + small_cache_read(&spuUnscaledVertex[0],(uint64_t)&graphicsbasePtr[0],sizeof(btScalar)); + small_cache_read(&spuUnscaledVertex[1],(uint64_t)&graphicsbasePtr[1],sizeof(btScalar)); + small_cache_read(&spuUnscaledVertex[2],(uint64_t)&graphicsbasePtr[2],sizeof(btScalar)); spuTriangleVertices[j] = btVector3( spuUnscaledVertex[0]*meshScaling.getX(), @@ -254,6 +254,11 @@ void ProcessConvexConcaveSpuCollision(SpuCollisionPairInput* wuInput, CollisionT //order: first collision shape is convex, second concave. m_isSwapped is true, if the original order was opposite + int sb = sizeof(btBvhTriangleMeshShape); + + btAssert(sizeof(btBvhTriangleMeshShape) < MAX_SHAPE_SIZE); + + btBvhTriangleMeshShape* trimeshShape = (btBvhTriangleMeshShape*)wuInput->m_spuCollisionShapes[1]; //need the mesh interface, for access to triangle vertices @@ -760,13 +765,13 @@ void processCollisionTask(void* userPtr, void* lsMemPtr) { { - int dmaSize = sizeof(btSphereShape);//lsMem.maxShapeSize; + int dmaSize = lsMem.maxShapeSize; uint64_t dmaPpuAddress2 = (uint64_t)lsMem.gColObj0.getCollisionShape(); cellDmaGet(lsMem.gCollisionShape0, dmaPpuAddress2 , dmaSize, DMA_TAG(1), 0, 0); cellDmaWaitTagStatusAll(DMA_MASK(1)); } { - int dmaSize = sizeof(btSphereShape);//lsMem.maxShapeSize; + int dmaSize = lsMem.maxShapeSize; uint64_t dmaPpuAddress2 = (uint64_t)lsMem.gColObj1.getCollisionShape(); cellDmaGet(lsMem.gCollisionShape1, dmaPpuAddress2 , dmaSize, DMA_TAG(2), 0, 0); cellDmaWaitTagStatusAll(DMA_MASK(2)); @@ -815,14 +820,14 @@ void processCollisionTask(void* userPtr, void* lsMemPtr) ///dma and initialize the convex object { - int dmaSize = sizeof(btSphereShape);//lsMem.maxShapeSize; + int dmaSize = lsMem.maxShapeSize; uint64_t dmaPpuAddress2 = (uint64_t)lsMem.gColObj0.getCollisionShape(); cellDmaGet(lsMem.gCollisionShape0, dmaPpuAddress2 , dmaSize, DMA_TAG(1), 0, 0); cellDmaWaitTagStatusAll(DMA_MASK(1)); } ///dma and initialize the concave object { - int dmaSize = sizeof(btBvhTriangleMeshShape);//lsMem.maxShapeSize; + int dmaSize = lsMem.maxShapeSize;//sizeof(btBvhTriangleMeshShape);//lsMem.maxShapeSize; uint64_t dmaPpuAddress2 = (uint64_t)lsMem.gColObj1.getCollisionShape(); // spu_printf("SPU: trimesh = %llx\n",dmaPpuAddress2); cellDmaGet(lsMem.gCollisionShape1, dmaPpuAddress2 , dmaSize, DMA_TAG(2), 0, 0); diff --git a/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuVoronoiSimplexSolver.h b/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuVoronoiSimplexSolver.h index b2d2677bb..88c6c9a34 100644 --- a/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuVoronoiSimplexSolver.h +++ b/Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuVoronoiSimplexSolver.h @@ -128,7 +128,7 @@ public: bool closest(btVector3& v); - float maxVertex(); + btScalar maxVertex(); bool fullSimplex() const {