29#ifndef GU_BV4_COMMON_H
30#define GU_BV4_COMMON_H
32#include "foundation/PxMat44.h"
33#include "geometry/PxTriangle.h"
39#define BV4_ALIGN16(x) PX_ALIGN_PREFIX(16) x PX_ALIGN_SUFFIX(16)
45 enum QueryModifierFlag
47 QUERY_MODIFIER_ANY_HIT = (1<<0),
48 QUERY_MODIFIER_DOUBLE_SIDED = (1<<1),
49 QUERY_MODIFIER_MESH_BOTH_SIDES = (1<<2)
52 template<
class ParamsT>
55 params->mBackfaceCulling = (flags & (QUERY_MODIFIER_DOUBLE_SIDED|QUERY_MODIFIER_MESH_BOTH_SIDES)) ? 0 : 1u;
56 params->mEarlyExit = flags & QUERY_MODIFIER_ANY_HIT;
89 typedef HitCode (*MeshRayCallback) (
void* userData,
const PxVec3& p0,
const PxVec3& p1,
const PxVec3& p2, PxU32 triangleIndex,
float dist,
float u,
float v);
90 typedef bool (*MeshOverlapCallback) (
void* userData,
const PxVec3& p0,
const PxVec3& p1,
const PxVec3& p2, PxU32 triangleIndex,
const PxU32* vertexIndices);
91 typedef bool (*TetMeshOverlapCallback) (
void* userData,
const PxVec3& p0,
const PxVec3& p1,
const PxVec3& p2,
const PxVec3& p3, PxU32 tetIndex,
const PxU32* vertexIndices);
92 typedef bool (*MeshSweepCallback) (
void* userData,
const PxVec3& p0,
const PxVec3& p1,
const PxVec3& p2, PxU32 triangleIndex,
float& dist);
93 typedef bool (*SweepUnlimitedCallback) (
void* userData,
const SweepHit& hit);
95 template<
class ParamsT>
103 (params->mCallback)(params->mUserData, hit);
108 if(!params->mNodeSorting)
109 params->mStabbedFace.mDistance = params->mMaxDist;
114 const float m30 = src->column3.x;
115 const float m31 = src->column3.y;
116 const float m32 = src->column3.z;
118 const float m00 = src->column0.x;
119 const float m01 = src->column0.y;
120 const float m02 = src->column0.z;
122 dest->column0.x = m00;
123 dest->column1.x = m01;
124 dest->column2.x = m02;
125 dest->column3.x = -(m30*m00 + m31*m01 + m32*m02);
127 const float m10 = src->column1.x;
128 const float m11 = src->column1.y;
129 const float m12 = src->column1.z;
131 dest->column0.y = m10;
132 dest->column1.y = m11;
133 dest->column2.y = m12;
134 dest->column3.y = -(m30*m10 + m31*m11 + m32*m12);
136 const float m20 = src->column2.x;
137 const float m21 = src->column2.y;
138 const float m22 = src->column2.z;
140 dest->column0.z = m20;
141 dest->column1.z = m21;
142 dest->column2.z = m22;
143 dest->column3.z = -(m30*m20 + m31*m21 + m32*m22);
145 dest->column0.w = 0.0f;
146 dest->column1.w = 0.0f;
147 dest->column2.w = 0.0f;
148 dest->column3.w = 1.0f;
151 PX_FORCE_INLINE void invertBoxMatrix(PxMat33& m, PxVec3& t,
const Gu::Box& box)
153 const float m30 = box.center.x;
154 const float m31 = box.center.y;
155 const float m32 = box.center.z;
157 const float m00 = box.rot.column0.x;
158 const float m01 = box.rot.column0.y;
159 const float m02 = box.rot.column0.z;
164 t.x = -(m30*m00 + m31*m01 + m32*m02);
166 const float m10 = box.rot.column1.x;
167 const float m11 = box.rot.column1.y;
168 const float m12 = box.rot.column1.z;
173 t.y = -(m30*m10 + m31*m11 + m32*m12);
175 const float m20 = box.rot.column2.x;
176 const float m21 = box.rot.column2.y;
177 const float m22 = box.rot.column2.z;
182 t.z = -(m30*m20 + m31*m21 + m32*m22);
185#ifdef GU_BV4_USE_SLABS
205 PX_FORCE_INLINE PxU32 getPrimitive(PxU32 i)
const {
return mData[i]>>1; }
206 PX_FORCE_INLINE PxU32 getChildOffset(PxU32 i)
const {
return mData[i]>>GU_BV4_CHILD_OFFSET_SHIFT_COUNT; }
207 PX_FORCE_INLINE PxU32 getChildType(PxU32 i)
const {
return (mData[i]>>1)&3; }
209 PX_FORCE_INLINE PxU32 decodePNSNoShift(PxU32 i)
const {
return mData[i]; }
224 PX_FORCE_INLINE PxU32 getPrimitive(PxU32 i)
const {
return mData[i]>>1; }
225 PX_FORCE_INLINE PxU32 getChildOffset(PxU32 i)
const {
return mData[i]>>GU_BV4_CHILD_OFFSET_SHIFT_COUNT; }
226 PX_FORCE_INLINE PxU32 getChildType(PxU32 i)
const {
return (mData[i]>>1)&3; }
228 PX_FORCE_INLINE PxU32 decodePNSNoShift(PxU32 i)
const {
return mData[i]; }
232 #define SSE_CONST4(name, val) static const __declspec(align(16)) PxU32 name[4] = { (val), (val), (val), (val) }
233 #define SSE_CONST(name) *(const __m128i *)&name
234 #define SSE_CONSTF(name) *(const __m128 *)&name
239 PxU32 NbToGo = (primIndex & 15)-1;
244 template<
class ParamsT>
247 using namespace physx::aos;
249 params->mTris32 = mesh->getTris32();
250 params->mTris16 = mesh->getTris16();
251 params->mVerts = mesh->getVerts();
253 V4StoreA_Safe(V4LoadU_Safe(&tree->mCenterOrMinCoeff.x), ¶ms->mCenterOrMinCoeff_PaddedAligned.x);
254 V4StoreA_Safe(V4LoadU_Safe(&tree->mExtentsOrMaxCoeff.x), ¶ms->mExtentsOrMaxCoeff_PaddedAligned.x);
257 template<
class ParamsT>
260 params->mTets32 = mesh->getTetrahedrons32();
261 params->mTets16 = mesh->getTetrahedrons16();
262 params->mVerts = mesh->getVerts();
264 V4StoreA_Safe(V4LoadU_Safe(&tree->mCenterOrMinCoeff.x), ¶ms->mCenterOrMinCoeff_PaddedAligned.x);
265 V4StoreA_Safe(V4LoadU_Safe(&tree->mExtentsOrMaxCoeff.x), ¶ms->mExtentsOrMaxCoeff_PaddedAligned.x);
271 dst.extents = src.extents;
276 const PxMat33 tmp(
PxVec3(m.column0.x, m.column0.y, m.column0.z),
277 PxVec3(m.column1.x, m.column1.y, m.column1.z),
278 PxVec3(m.column2.x, m.column2.y, m.column2.z));
279 dst.rot = tmp * src.rot;
284 const float m00 = src->column0.x;
285 const float m01 = src->column0.y;
286 const float m02 = src->column0.z;
288 const float m10 = src->column1.x;
289 const float m11 = src->column1.y;
290 const float m12 = src->column1.z;
292 const float m20 = src->column2.x;
293 const float m21 = src->column2.y;
294 const float m22 = src->column2.z;
296 return PxVec3( m00*p.x + m01*p.y + m02*p.z,
297 m10*p.x + m11*p.y + m12*p.z,
298 m20*p.x + m21*p.y + m22*p.z);
303 const float m30 = src->column3.x;
304 const float m31 = src->column3.y;
305 const float m32 = src->column3.z;
307 const float m00 = src->column0.x;
308 const float m01 = src->column0.y;
309 const float m02 = src->column0.z;
311 const float m10 = src->column1.x;
312 const float m11 = src->column1.y;
313 const float m12 = src->column1.z;
315 const float m20 = src->column2.x;
316 const float m21 = src->column2.y;
317 const float m22 = src->column2.z;
319 return PxVec3( m00*p.x + m01*p.y + m02*p.z -(m30*m00 + m31*m01 + m32*m02),
320 m10*p.x + m11*p.y + m12*p.z -(m30*m10 + m31*m11 + m32*m12),
321 m20*p.x + m21*p.y + m22*p.z -(m30*m20 + m31*m21 + m32*m22));
328 localDir = inverseRotate(worldm_Aligned, dir);
329 localOrigin = inverseTransform(worldm_Aligned, origin);
334 localOrigin = origin;
340 radius2 = sphere.radius * sphere.radius;
343 local_center = inverseTransform(worldm_Aligned, sphere.center);
347 local_center = sphere.center;
353 localCapsule.radius = capsule.radius;
356 localCapsule.
p0 = inverseTransform(worldm_Aligned, capsule.p0);
357 localCapsule.
p1 = inverseTransform(worldm_Aligned, capsule.p1);
361 localCapsule.
p0 = capsule.p0;
362 localCapsule.
p1 = capsule.p1;
371 invertPRMatrix(&invWorldM, worldm_Aligned);
373 rotateBox(dst, invWorldM, src);
381 template<
class ImpactFunctionT,
class ShapeT,
class ParamsT>
384 if(params->mStabbedFace.mTriangleID==PX_INVALID_U32)
389 const float t = params->getReportDistance();
390 hit->mTriangleID = params->mStabbedFace.mTriangleID;
404 WP.
verts[0] = worldm->transform(params->mP0);
405 WP.
verts[1] = worldm->transform(params->mP1);
406 WP.
verts[2] = worldm->transform(params->mP2);
410 WP.
verts[0] = params->mP0;
411 WP.
verts[1] = params->mP1;
412 WP.
verts[2] = params->mP2;
416 ImpactFunctionT::computeImpact(hit->mPos, impactNormal, shape, dir, t, WP);
419 if(shouldFlipNormal(impactNormal, meshBothSides, isDoubleSided, params->mBestTriNormal, dir))
420 impactNormal = -impactNormal;
422 hit->mNormal = impactNormal;
429 template<
class LeafFunction_AnyT,
class LeafFunction_ClosestT,
class ParamsT>
430 void doBruteForceTests(PxU32 nbTris, ParamsT*
PX_RESTRICT params)
432 PX_ASSERT(nbTris<16);
433 if(params->mEarlyExit)
434 LeafFunction_AnyT::doLeafTest(params, nbTris);
436 LeafFunction_ClosestT::doLeafTest(params, nbTris);
439#ifndef GU_BV4_USE_SLABS
440 template<
class ParamsT>
443 const float Half = 0.5f*max_dist;
444 const FloatV HalfV = FLoad(Half);
445 const Vec4V DataV = V4Scale(V4LoadU(&dir.x), HalfV);
446 const Vec4V Data2V = V4Add(V4LoadU(&origin.x), DataV);
447 const Vec4V FDirV = V4Abs(DataV);
448 V4StoreA_Safe(DataV, ¶ms->mData_PaddedAligned.x);
449 V4StoreA_Safe(Data2V, ¶ms->mData2_PaddedAligned.x);
450 V4StoreA_Safe(FDirV, ¶ms->mFDir_PaddedAligned.x);
Represents an oriented bounding box.
Definition GuBox.h:72
Represents a capsule.
Definition GuCapsule.h:47
Definition GuBV4_Common.h:67
PxVec3 p0
Start of segment.
Definition GuSegment.h:170
PxVec3 p1
End of segment.
Definition GuSegment.h:171
Definition GuBV4_Common.h:77
PxU32 mTriangleID
Index of touched face.
Definition GuBV4_Common.h:82
float mDistance
Impact distance.
Definition GuBV4_Common.h:83
3x3 matrix class
Definition PxMat33.h:91
4x4 matrix class
Definition PxMat44.h:55
PX_CUDA_CALLABLE PX_INLINE const PxVec4 transform(const PxVec4 &other) const
Transform vector by matrix, equal to v' = M*v.
Definition PxMat44.h:279
A padded version of PxTriangle, to safely load its data using SIMD.
Definition PxTriangle.h:145
PxVec3 verts[3]
Array of Vertices.
Definition PxTriangle.h:140
Definition PxUserAllocated.h:43
3 Element vector class.
Definition PxVec3.h:50
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
HitCode
Definition GuBV4_Common.h:60
@ HIT_NONE
No hit.
Definition GuBV4_Common.h:61
@ HIT_CONTINUE
Hit found, but keep looking for closer one.
Definition GuBV4_Common.h:62
@ HIT_EXIT
Hit found, you can early-exit (raycast any)
Definition GuBV4_Common.h:63
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
Definition GuBV4_Common.h:213
Definition GuBV4_Common.h:193
PxI16 mMax
Quantized max.
Definition GuBV4_Common.h:195
PxI16 mMin
Quantized min.
Definition GuBV4_Common.h:194
Definition GuBV4_Common.h:191
Definition PxVecMathAoSScalar.h:52
Definition PxVecMathAoSScalar.h:65