From 79989a8d3db838b52f9b32c2491f4af115d718f2 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Wed, 10 Oct 2012 04:21:36 +0000 Subject: [PATCH] Force spuNodeCallback to be 16-byte aligned, so that we can use SIMD. Related to Issue 657 Recompute the quantization values in case the maximum/minimum extends roundtrip using quantize/unQuantize are out-of-range (alternatively, pass in a larger quantizationMargin) --- .../BroadphaseCollision/btQuantizedBvh.cpp | 18 ++++++++++++++++++ .../SpuGatheringCollisionTask.cpp | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp b/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp index c911435a9..7ab5e9dc7 100644 --- a/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp +++ b/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp @@ -96,7 +96,25 @@ void btQuantizedBvh::setQuantizationValues(const btVector3& bvhAabbMin,const btV m_bvhAabbMax = bvhAabbMax + clampValue; btVector3 aabbSize = m_bvhAabbMax - m_bvhAabbMin; m_bvhQuantization = btVector3(btScalar(65533.0),btScalar(65533.0),btScalar(65533.0)) / aabbSize; + m_useQuantization = true; + + { + unsigned short vecIn[3]; + btVector3 v; + { + quantize(vecIn,bvhAabbMin,false); + v = unQuantize(vecIn); + m_bvhAabbMin.setMin(v-clampValue); + } + { + quantize(vecIn,bvhAabbMax,true); + v = unQuantize(vecIn); + m_bvhAabbMax.setMax(v+clampValue); + } + aabbSize = m_bvhAabbMax - m_bvhAabbMin; + m_bvhQuantization = btVector3(btScalar(65533.0),btScalar(65533.0),btScalar(65533.0)) / aabbSize; + } } diff --git a/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp b/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp index 46e4d98c1..7dad5ef3d 100644 --- a/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp +++ b/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp @@ -291,7 +291,7 @@ SIMD_FORCE_INLINE void small_cache_read_triple( void* ls0, ppu_address_t ea0, -class spuNodeCallback : public btNodeOverlapCallback +ATTRIBUTE_ALIGNED16(class) spuNodeCallback : public btNodeOverlapCallback { SpuCollisionPairInput* m_wuInput; SpuContactResult& m_spuContacts;