19#ifndef BT_AXIS_SWEEP_3_INTERNAL_H
20#define BT_AXIS_SWEEP_3_INTERNAL_H
30#define USE_OVERLAP_TEST_ON_REMOVES 1
35template <
typename BP_FP_INT_TYPE>
51 BP_FP_INT_TYPE
IsMax()
const {
return static_cast<BP_FP_INT_TYPE
>(
m_pos & 1); }
103 bool testOverlap2D(
const Handle* pHandleA,
const Handle* pHandleB,
int axis0,
int axis1);
105#ifdef DEBUG_BROADPHASE
106 void debugPrintAxis(
int axis,
bool checkCardinality =
true);
191#ifdef DEBUG_BROADPHASE
194template <
typename BP_FP_INT_TYPE>
197 int numEdges = m_pHandles[0].
m_maxEdges[axis];
198 printf(
"SAP Axis %d, numEdges=%d\n", axis, numEdges);
201 for (i = 0; i < numEdges + 1; i++)
203 Edge* pEdge = m_pEdges[axis] + i;
204 Handle* pHandlePrev = getHandle(pEdge->m_handle);
205 int handleIndex = pEdge->IsMax() ? pHandlePrev->m_maxEdges[axis] : pHandlePrev->m_minEdges[axis];
207 beginOrEnd = pEdge->IsMax() ?
'E' :
'B';
208 printf(
" [%c,h=%d,p=%x,i=%d]\n", beginOrEnd, pEdge->m_handle, pEdge->m_pos, handleIndex);
211 if (checkCardinality)
212 btAssert(numEdges == m_numHandles * 2 + 1);
216template <
typename BP_FP_INT_TYPE>
220 BP_FP_INT_TYPE handleId =
addHandle(aabbMin, aabbMax, userPtr, collisionFilterGroup, collisionFilterMask, dispatcher);
232template <
typename BP_FP_INT_TYPE>
238 removeHandle(
static_cast<BP_FP_INT_TYPE
>(handle->m_uniqueId), dispatcher);
241template <
typename BP_FP_INT_TYPE>
245 handle->m_aabbMin = aabbMin;
246 handle->m_aabbMax = aabbMax;
247 updateHandle(
static_cast<BP_FP_INT_TYPE
>(handle->m_uniqueId), aabbMin, aabbMax, dispatcher);
252template <
typename BP_FP_INT_TYPE>
262 BP_FP_INT_TYPE axis = 0;
264 for (BP_FP_INT_TYPE i = 1; i <
m_numHandles * 2 + 1; i++)
274template <
typename BP_FP_INT_TYPE>
284 BP_FP_INT_TYPE axis = 0;
286 for (BP_FP_INT_TYPE i = 1; i <
m_numHandles * 2 + 1; i++)
300template <
typename BP_FP_INT_TYPE>
304 aabbMin = pHandle->m_aabbMin;
305 aabbMax = pHandle->m_aabbMax;
308template <
typename BP_FP_INT_TYPE>
313 unsigned short vecInMin[3];
314 unsigned short vecInMax[3];
330template <
typename BP_FP_INT_TYPE>
340 BP_FP_INT_TYPE maxHandles =
static_cast<BP_FP_INT_TYPE
>(userMaxHandles + 1);
349 if (!disableRaycastAccelerator)
378 m_pHandles[i].SetNextFree(
static_cast<BP_FP_INT_TYPE
>(i + 1));
384 for (
int i = 0; i < 3; i++)
396 for (
int axis = 0; axis < 3; axis++)
405#ifdef DEBUG_BROADPHASE
406 debugPrintAxis(axis);
411template <
typename BP_FP_INT_TYPE>
422 for (
int i = 2; i >= 0; i--)
435template <
typename BP_FP_INT_TYPE>
438#ifdef OLD_CLAMPING_METHOD
445 out[0] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)
v.getX() &
m_bpHandleMask) | isMax);
446 out[1] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)
v.getY() &
m_bpHandleMask) | isMax);
447 out[2] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)
v.getZ() &
m_bpHandleMask) | isMax);
456template <
typename BP_FP_INT_TYPE>
468template <
typename BP_FP_INT_TYPE>
479template <
typename BP_FP_INT_TYPE>
483 BP_FP_INT_TYPE
min[3],
max[3];
492 pHandle->m_uniqueId =
static_cast<int>(handle);
494 pHandle->m_clientObject = pOwner;
495 pHandle->m_collisionFilterGroup = collisionFilterGroup;
496 pHandle->m_collisionFilterMask = collisionFilterMask;
499 BP_FP_INT_TYPE limit =
static_cast<BP_FP_INT_TYPE
>(
m_numHandles * 2);
502 for (BP_FP_INT_TYPE axis = 0; axis < 3; axis++)
509 m_pEdges[axis][limit - 1].m_handle = handle;
512 m_pEdges[axis][limit].m_handle = handle;
514 pHandle->
m_minEdges[axis] =
static_cast<BP_FP_INT_TYPE
>(limit - 1);
529template <
typename BP_FP_INT_TYPE>
539 m_pairCache->removeOverlappingPairsContainingProxy(pHandle, dispatcher);
547 for (axis = 0; axis < 3; axis++)
553 for (axis = 0; axis < 3; axis++)
569#ifdef DEBUG_BROADPHASE
570 debugPrintAxis(axis,
false);
578template <
typename BP_FP_INT_TYPE>
586 m_pHandles[i].SetNextFree(
static_cast<BP_FP_INT_TYPE
>(i + 1));
594template <
typename BP_FP_INT_TYPE>
610 previousPair.m_pProxy0 = 0;
611 previousPair.m_pProxy1 = 0;
612 previousPair.m_algorithm = 0;
614 for (i = 0; i < overlappingPairArray.
size(); i++)
618 bool isDuplicate = (pair == previousPair);
622 bool needsRemoval =
false;
631 needsRemoval =
false;
648 m_pairCache->cleanOverlappingPair(pair, dispatcher);
659#define CLEAN_INVALID_PAIRS 1
660#ifdef CLEAN_INVALID_PAIRS
673template <
typename BP_FP_INT_TYPE>
681 for (
int axis = 0; axis < 3; axis++)
692template <
typename BP_FP_INT_TYPE>
707template <
typename BP_FP_INT_TYPE>
716 BP_FP_INT_TYPE
min[3],
max[3];
721 for (
int axis = 0; axis < 3; axis++)
723 BP_FP_INT_TYPE emin = pHandle->
m_minEdges[axis];
724 BP_FP_INT_TYPE emax = pHandle->
m_maxEdges[axis];
746#ifdef DEBUG_BROADPHASE
747 debugPrintAxis(axis);
753template <
typename BP_FP_INT_TYPE>
757 Edge* pPrev = pEdge - 1;
767 const int axis1 = (1 << axis) & 3;
768 const int axis2 = (1 << axis1) & 3;
769 if (updateOverlaps &&
testOverlap2D(pHandleEdge, pHandlePrev, axis1, axis2))
771 m_pairCache->addOverlappingPair(pHandleEdge, pHandlePrev);
796#ifdef DEBUG_BROADPHASE
797 debugPrintAxis(axis);
802template <
typename BP_FP_INT_TYPE>
806 Edge* pNext = pEdge + 1;
817 const int axis1 = (1 << axis) & 3;
818 const int axis2 = (1 << axis1) & 3;
827 m_pairCache->removeOverlappingPair(handle0, handle1, dispatcher);
852template <
typename BP_FP_INT_TYPE>
856 Edge* pPrev = pEdge - 1;
868 const int axis1 = (1 << axis) & 3;
869 const int axis2 = (1 << axis1) & 3;
879 m_pairCache->removeOverlappingPair(handle0, handle1, dispatcher);
903#ifdef DEBUG_BROADPHASE
904 debugPrintAxis(axis);
909template <
typename BP_FP_INT_TYPE>
913 Edge* pNext = pEdge + 1;
920 const int axis1 = (1 << axis) & 3;
921 const int axis2 = (1 << axis1) & 3;
926 if (updateOverlaps &&
testOverlap2D(pHandleEdge, pHandleNext, axis1, axis2))
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a point
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE bool TestAabbAgainstAabb2(const btVector3 &aabbMin1, const btVector3 &aabbMax1, const btVector3 &aabbMin2, const btVector3 &aabbMax2)
conservative test for overlap between two aabbs
#define btAlignedFree(ptr)
#define btAlignedAlloc(size, alignment)
#define USE_OVERLAP_TEST_ON_REMOVES
btHashedOverlappingPairCache()
btAlignedObjectArray< btBroadphasePair > btBroadphasePairArray
SIMD_FORCE_INLINE void quantize(unsigned short *out, const btVector3 &point, int isMax) const
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define SIMD_FORCE_INLINE
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
void quickSort(const L &CompareFunc)
BP_FP_INT_TYPE IsMax() const
SIMD_FORCE_INLINE void SetNextFree(BP_FP_INT_TYPE next)
btBroadphaseProxy * m_dbvtProxy
SIMD_FORCE_INLINE BP_FP_INT_TYPE GetNextFree() const
BP_FP_INT_TYPE m_maxEdges[3]
BT_DECLARE_ALIGNED_ALLOCATOR()
BP_FP_INT_TYPE m_minEdges[3]
virtual void getAabb(btBroadphaseProxy *proxy, btVector3 &aabbMin, btVector3 &aabbMax) const
btOverlappingPairCache * m_pairCache
BP_FP_INT_TYPE m_handleSentinel
bool testAabbOverlap(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1)
SIMD_FORCE_INLINE Handle * getHandle(BP_FP_INT_TYPE index) const
void unQuantize(btBroadphaseProxy *proxy, btVector3 &aabbMin, btVector3 &aabbMax) const
unQuantize should be conservative: aabbMin/aabbMax should be larger then 'getAabb' result
void sortMaxDown(int axis, BP_FP_INT_TYPE edge, btDispatcher *dispatcher, bool updateOverlaps)
virtual void rayTest(const btVector3 &rayFrom, const btVector3 &rayTo, btBroadphaseRayCallback &rayCallback, const btVector3 &aabbMin=btVector3(0, 0, 0), const btVector3 &aabbMax=btVector3(0, 0, 0))
BP_FP_INT_TYPE m_bpHandleMask
BP_FP_INT_TYPE allocHandle()
BP_FP_INT_TYPE m_numHandles
bool testOverlap2D(const Handle *pHandleA, const Handle *pHandleB, int axis0, int axis1)
const btOverlappingPairCallback * getOverlappingPairUserCallback() const
BP_FP_INT_TYPE addHandle(const btVector3 &aabbMin, const btVector3 &aabbMax, void *pOwner, int collisionFilterGroup, int collisionFilterMask, btDispatcher *dispatcher)
void removeHandle(BP_FP_INT_TYPE handle, btDispatcher *dispatcher)
virtual btBroadphaseProxy * createProxy(const btVector3 &aabbMin, const btVector3 &aabbMax, int shapeType, void *userPtr, int collisionFilterGroup, int collisionFilterMask, btDispatcher *dispatcher)
virtual void printStats()
const btOverlappingPairCache * getOverlappingPairCache() const
void quantize(BP_FP_INT_TYPE *out, const btVector3 &point, int isMax) const
BP_FP_INT_TYPE getNumHandles() const
btDbvtBroadphase * m_raycastAccelerator
btOverlappingPairCache * getOverlappingPairCache()
BP_FP_INT_TYPE m_maxHandles
virtual void setAabb(btBroadphaseProxy *proxy, const btVector3 &aabbMin, const btVector3 &aabbMax, btDispatcher *dispatcher)
virtual void calculateOverlappingPairs(btDispatcher *dispatcher)
calculateOverlappingPairs is optional: incremental algorithms (sweep and prune) might do it during th...
void sortMinDown(int axis, BP_FP_INT_TYPE edge, btDispatcher *dispatcher, bool updateOverlaps)
void freeHandle(BP_FP_INT_TYPE handle)
virtual void aabbTest(const btVector3 &aabbMin, const btVector3 &aabbMax, btBroadphaseAabbCallback &callback)
void updateHandle(BP_FP_INT_TYPE handle, const btVector3 &aabbMin, const btVector3 &aabbMax, btDispatcher *dispatcher)
btAxisSweep3Internal(const btVector3 &worldAabbMin, const btVector3 &worldAabbMax, BP_FP_INT_TYPE handleMask, BP_FP_INT_TYPE handleSentinel, BP_FP_INT_TYPE maxHandles=16384, btOverlappingPairCache *pairCache=0, bool disableRaycastAccelerator=false)
virtual ~btAxisSweep3Internal()
virtual void getBroadphaseAabb(btVector3 &aabbMin, btVector3 &aabbMax) const
btOverlappingPairCallback * m_userPairCallback
btOverlappingPairCallback is an additional optional user callback for adding/removing overlapping pai...
BT_DECLARE_ALIGNED_ALLOCATOR()
virtual void destroyProxy(btBroadphaseProxy *proxy, btDispatcher *dispatcher)
void processAllOverlappingPairs(btOverlapCallback *callback)
BP_FP_INT_TYPE m_firstFreeHandle
void sortMinUp(int axis, BP_FP_INT_TYPE edge, btDispatcher *dispatcher, bool updateOverlaps)
void setOverlappingPairUserCallback(btOverlappingPairCallback *pairCallback)
virtual void resetPool(btDispatcher *dispatcher)
reset broadphase internal structures, to ensure determinism/reproducability
btOverlappingPairCache * m_nullPairCache
void sortMaxUp(int axis, BP_FP_INT_TYPE edge, btDispatcher *dispatcher, bool updateOverlaps)
The btOverlappingPairCallback class is an additional optional broadphase user callback for adding/rem...
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
virtual bool process(const btBroadphaseProxy *proxy)=0