53 return V3LoadU_SafeReadW(verts[index]);
57 PX_SUPPORT_INLINE
void populateVerts(
const PxU8* inds, PxU32 numInds,
const PxVec3* originalVerts,
aos::Vec3V* verts_)
const
61 for(PxU32 i=0; i<numInds; ++i)
62 verts_[i] = V3LoadU_SafeReadW(originalVerts[inds[i]]);
67 PX_SUPPORT_INLINE aos::Vec3V supportLocal(
const aos::Vec3VArg dir)
const
70 const PxU32 maxIndex = supportVertexIndex(dir);
71 return V3LoadU_SafeReadW(verts[maxIndex]);
75 PX_SUPPORT_INLINE
void supportLocal(
const aos::Vec3VArg dir, aos::FloatV& min, aos::FloatV& max)
const
77 supportVertexMinMax(dir, min, max);
81 PX_SUPPORT_INLINE aos::Vec3V supportRelative(
const aos::Vec3VArg dir,
const aos::PxMatTransformV& aTob,
const aos::PxMatTransformV& aTobT)
const
86 const Vec3V _dir = aTobT.rotate(dir);
87 const Vec3V maxPoint = supportLocal(_dir);
89 return aTob.transform(maxPoint);
93 PX_SUPPORT_INLINE aos::Vec3V supportLocal(
const aos::Vec3VArg dir, PxI32& index)
const
99 const PxU32 maxIndex = supportVertexIndex(dir);
100 index = PxI32(maxIndex);
101 return V3LoadU_SafeReadW(verts[index]);
105 PX_SUPPORT_INLINE aos::Vec3V supportRelative(
const aos::Vec3VArg dir,
const aos::PxMatTransformV& aTob,
106 const aos::PxMatTransformV& aTobT, PxI32& index)
const
111 const Vec3V _dir = aTobT.rotate(dir);
112 const Vec3V p = supportLocal(_dir, index);
114 return aTob.transform(p);
117 PX_SUPPORT_INLINE
void bruteForceSearchMinMax(
const aos::Vec3VArg _dir, aos::FloatV& min, aos::FloatV& max)
const
122 FloatV _max = V3Dot(V3LoadU_SafeReadW(verts[0]), _dir);
125 for(PxU32 i = 1; i < numVerts; ++i)
128 const Vec3V vertex = V3LoadU_SafeReadW(verts[i]);
129 const FloatV dist = V3Dot(vertex, _dir);
131 _max = FMax(dist, _max);
132 _min = FMin(dist, _min);
140 PX_SUPPORT_INLINE
void supportVertexMinMax(
const aos::Vec3VArg dir, aos::FloatV& min, aos::FloatV& max)
const
146 const PxU32 maxIndex= hillClimbing(dir);
147 const PxU32 minIndex= hillClimbing(V3Neg(dir));
148 const Vec3V maxPoint= V3LoadU_SafeReadW(verts[maxIndex]);
149 const Vec3V minPoint= V3LoadU_SafeReadW(verts[minIndex]);
150 min = V3Dot(dir, minPoint);
151 max = V3Dot(dir, maxPoint);
155 bruteForceSearchMinMax(dir, min, max);