190 PX_FORCE_INLINE TinyBitMap() { m[0] = m[1] = m[2] = m[3] = m[4] = m[5] = m[6] = m[7] = 0; }
192 PX_FORCE_INLINE bool get(PxU8 v)
const {
return (m[v >> 5] & 1 << (v & 31)) != 0; }
204 PX_SUPPORT_INLINE
ConvexHullV(
const Gu::ConvexHullData* _hullData,
const aos::Vec3VArg _center,
const aos::Vec3VArg scale,
const aos::QuatVArg scaleRot,
205 const bool idtScale) :
210 hullData = _hullData;
214 CalculateConvexMargin(_hullData->mInternal, margin, minMargin, sweepMargin, scale);
215 ConstructSkewMatrix(scale, scaleRot, vertex2Shape, shape2Vertex, center, idtScale);
224 hullData = _hullData;
231 PX_SUPPORT_INLINE
ConvexHullV(
const PxGeometry& geom) : ConvexV(ConvexType::eCONVEXHULL, aos::V3Zero())
234 const PxConvexMeshGeometry& convexGeom =
static_cast<const PxConvexMeshGeometry&
>(geom);
235 const Gu::ConvexHullData* hData = _getHullData(convexGeom);
237 const Vec3V vScale = V3LoadU_SafeReadW(convexGeom.scale.scale);
238 const QuatV vRot = QuatVLoadU(&convexGeom.scale.rotation.x);
239 const bool idtScale = convexGeom.scale.isIdentity();
242 const PxVec3*
PX_RESTRICT tempVerts = hData->getHullVertices();
244 numVerts = hData->mNbHullVertices;
245 CalculateConvexMargin(hData->mInternal, margin, minMargin, sweepMargin, vScale);
246 ConstructSkewMatrix(vScale, vRot, vertex2Shape, shape2Vertex, center, idtScale);
248 data = hData->mBigConvexRawData;
252 PX_SUPPORT_INLINE
ConvexHullV(
const Gu::PolygonalData& polyData,
const Cm::FastVertex2ShapeScaling& convexScale) :
253 ConvexV(ConvexType::eCONVEXHULL, aos::V3LoadU(polyData.mCenter))
257 const Vec3V vScale = V3LoadU(polyData.mScale.scale);
259 verts = polyData.mVerts;
260 numVerts = PxU8(polyData.mNbVerts);
261 CalculateConvexMargin(polyData.mInternal, margin, minMargin, sweepMargin, vScale);
263 const PxMat33& v2s = convexScale.getVertex2ShapeSkew();
264 const PxMat33& s2v = convexScale.getShape2VertexSkew();
266 vertex2Shape.col0 = V3LoadU(v2s.column0);
267 vertex2Shape.col1 = V3LoadU(v2s.column1);
268 vertex2Shape.col2 = V3LoadU(v2s.column2);
270 shape2Vertex.col0 = V3LoadU(s2v.column0);
271 shape2Vertex.col1 = V3LoadU(s2v.column1);
272 shape2Vertex.col2 = V3LoadU(s2v.column2);
274 data = polyData.mBigData;
278 PX_SUPPORT_INLINE
void initialize(
const Gu::ConvexHullData* _hullData,
const aos::Vec3VArg _center,
const aos::Vec3VArg scale,
279 const aos::QuatVArg scaleRot,
const bool idtScale)
283 const PxVec3* tempVerts = _hullData->getHullVertices();
284 CalculateConvexMargin(_hullData->mInternal, margin, minMargin, sweepMargin, scale);
285 ConstructSkewMatrix(scale, scaleRot, vertex2Shape, shape2Vertex, center, idtScale);
288 numVerts = _hullData->mNbHullVertices;
294 data = _hullData->mBigConvexRawData;
296 hullData = _hullData;
297 if (_hullData->mBigConvexRawData)
309 const PxReal toleranceMinMargin = toleranceLength * TOLERANCE_MIN_MARGIN_RATIO;
310 const PxReal toleranceMargin = toleranceLength * TOLERANCE_MARGIN_RATIO;
312 margin =
PxMin(margin, toleranceMargin);
313 minMargin =
PxMin(minMargin, toleranceMinMargin);
320 return M33MulV3(vertex2Shape, V3LoadU_SafeReadW(verts[index]));
323 PX_NOINLINE PxU32 hillClimbing(
const aos::Vec3VArg _dir)
const
327 const Gu::Valency* valency = data->
mValencies;
331 PxU32 smallBitMap[8] = {0,0,0,0,0,0,0,0};
337 PxVec3 vertexSpaceDirection;
338 V3StoreU(_dir, vertexSpaceDirection);
339 const PxU32 offset = ComputeCubemapNearestOffset(vertexSpaceDirection, data->mSubdiv);
341 index = data->mSamples[offset];
344 Vec3V maxPoint = V3LoadU_SafeReadW(verts[index]);
345 FloatV max = V3Dot(maxPoint, _dir);
347 PxU32 initialIndex = index;
351 initialIndex = index;
352 const PxU32 numNeighbours = valency[index].mCount;
353 const PxU32 offset = valency[index].mOffset;
355 for(PxU32 a = 0; a < numNeighbours; ++a)
357 const PxU32 neighbourIndex = adjacentVerts[offset + a];
359 const Vec3V vertex = V3LoadU_SafeReadW(verts[neighbourIndex]);
360 const FloatV dist = V3Dot(vertex, _dir);
361 if(FAllGrtr(dist, max))
363 const PxU32 ind = neighbourIndex>>5;
364 const PxU32 mask = PxU32(1 << (neighbourIndex & 31));
365 if((smallBitMap[ind] & mask) == 0)
367 smallBitMap[ind] |= mask;
369 index = neighbourIndex;
374 }
while(index != initialIndex);
379 PX_SUPPORT_INLINE PxU32 bruteForceSearch(
const aos::Vec3VArg _dir)
const
386 PxReal max = verts[0].
dot(dir);
389 for (PxU32 i = 1; i < numVerts; ++i)
391 const PxReal dist = verts[i].
dot(dir);
402 PX_NOINLINE PxU32 supportVertexIndex(
const aos::Vec3VArg _dir)
const
406 return hillClimbing(_dir);
408 return bruteForceSearch(_dir);
412 PX_SUPPORT_INLINE
void bruteForceSearchMinMax(
const aos::Vec3VArg _dir, aos::FloatV& min, aos::FloatV& max)
const
420 PxReal _max = verts[0].
dot(dir);
423 for(PxU32 i = 1; i < numVerts; ++i)
425 const PxReal dist = verts[i].
dot(dir);
426 _max =
PxMax(dist, _max);
427 _min =
PxMin(dist, _min);
435 PX_SUPPORT_INLINE
void supportVertexMinMax(
const aos::Vec3VArg _dir, aos::FloatV& min, aos::FloatV& max)
const
440 const Vec3V dir = M33TrnspsMulV3(vertex2Shape, _dir);
444 const PxU32 maxIndex= hillClimbing(dir);
445 const PxU32 minIndex= hillClimbing(V3Neg(dir));
446 const Vec3V maxPoint= M33MulV3(vertex2Shape, V3LoadU_SafeReadW(verts[maxIndex]));
447 const Vec3V minPoint= M33MulV3(vertex2Shape, V3LoadU_SafeReadW(verts[minIndex]));
448 min = V3Dot(_dir, minPoint);
449 max = V3Dot(_dir, maxPoint);
454 bruteForceSearchMinMax(dir, min, max);
459 PX_SUPPORT_INLINE
void populateVerts(
const PxU8* inds, PxU32 numInds,
const PxVec3* originalVerts, aos::Vec3V* _verts)
const
463 for(PxU32 i=0; i<numInds; ++i)
464 _verts[i] = M33MulV3(vertex2Shape, V3LoadU_SafeReadW(originalVerts[inds[i]]));
469 PX_SUPPORT_INLINE aos::Vec3V supportLocal(
const aos::Vec3VArg dir)
const
473 const Vec3V _dir = M33TrnspsMulV3(vertex2Shape, dir);
474 const PxU32 maxIndex = supportVertexIndex(_dir);
475 return M33MulV3(vertex2Shape, V3LoadU_SafeReadW(verts[maxIndex]));
479 PX_SUPPORT_INLINE
void supportLocal(
const aos::Vec3VArg dir, aos::FloatV& min, aos::FloatV& max)
const
483 supportVertexMinMax(dir, min, max);
487 PX_SUPPORT_INLINE aos::Vec3V supportRelative(
const aos::Vec3VArg dir,
const aos::PxMatTransformV& aTob,
const aos::PxMatTransformV& aTobT)
const
493 const Vec3V dir_ = aTobT.rotate(dir);
494 const Vec3V maxPoint =supportLocal(dir_);
496 return aTob.transform(maxPoint);
500 PX_SUPPORT_INLINE aos::Vec3V supportLocal(
const aos::Vec3VArg dir, PxI32& index)
const
505 const Vec3V dir_ = M33TrnspsMulV3(vertex2Shape, dir);
507 const PxU32 maxIndex = supportVertexIndex(dir_);
508 index = PxI32(maxIndex);
510 return M33MulV3(vertex2Shape, V3LoadU_SafeReadW(verts[index]));
514 PX_SUPPORT_INLINE aos::Vec3V supportRelative(
const aos::Vec3VArg dir,
const aos::PxMatTransformV& aTob,
515 const aos::PxMatTransformV& aTobT, PxI32& index)
const
521 const Vec3V dir_ = aTobT.rotate(dir);
522 const Vec3V p = supportLocal(dir_, index);
524 return aTob.transform(p);
527 aos::Mat33V vertex2Shape;
528 aos::Mat33V shape2Vertex;
530 const Gu::ConvexHullData* hullData;
531 const BigConvexRawData* data;