29#ifndef SC_CONTACT_STREAM_H
30#define SC_CONTACT_STREAM_H
32#include "foundation/Px.h"
33#include "PxSimulationEventCallback.h"
34#include "ScObjectIDTracker.h"
35#include "ScRigidSim.h"
36#include "ScStaticSim.h"
53 const PxU8* contactPatches;
54 const PxU8* contactPoints;
55 const PxReal* contactForces;
56 PxU32 requiredBufferSize;
59 PxU16 constraintStreamSize;
143 PX_FORCE_INLINE static PxU32 computeExtraDataBlockCount(PxU32 extraDataSize);
144 PX_FORCE_INLINE static PxU32 computeExtraDataBlockSize(PxU32 extraDataSize);
145 PX_FORCE_INLINE static PxU16 computeContactReportExtraDataSize(PxU32 extraDataFlags,
bool addHeader);
148 PX_FORCE_INLINE void fillInContactReportExtraData(PxU8* stream, PxU32 extraDataFlags,
const ActorSim&,
const ActorSim&, PxU32 ccdPass,
const bool useCurrentTransform, PxU32 pairIndex, PxU32 sizeOffset);
153 PxU16 currentPairCount;
156 PxU16 flags_and_maxExtraDataBlocks;
159 static const PxU32 sExtraDataBlockSizePow2 = 4;
161 static const PxU32 sMaxExtraDataShift = 4;
171 currentPairCount = 0;
173 flags_and_maxExtraDataBlocks &= ~sFlagMask;
179 return (flags_and_maxExtraDataBlocks & sFlagMask);
187 flags_and_maxExtraDataBlocks |= flags;
195 PxU16 tmpFlags = getFlags();
197 flags_and_maxExtraDataBlocks &= ~sFlagMask;
198 raiseFlags(tmpFlags);
202PX_FORCE_INLINE PxU32 Sc::ContactStreamManager::getMaxExtraDataSize()
const
204 return PxU32((flags_and_maxExtraDataBlocks >> sMaxExtraDataShift) << sExtraDataBlockSizePow2);
208PX_FORCE_INLINE void Sc::ContactStreamManager::setMaxExtraDataSize(PxU32 size)
210 PxU32 nbBlocks = computeExtraDataBlockCount(size);
211 flags_and_maxExtraDataBlocks = PxTo16((flags_and_maxExtraDataBlocks & sFlagMask) | (nbBlocks << sMaxExtraDataShift));
215PX_FORCE_INLINE Sc::ContactShapePair* Sc::ContactStreamManager::getShapePairs(PxU8* contactReportPairData)
const
217 return reinterpret_cast<Sc::ContactShapePair*
>(contactReportPairData + getMaxExtraDataSize());
221PX_FORCE_INLINE void Sc::ContactStreamManager::convertDeletedShapesInContactStream(ContactShapePair* shapePairs, PxU32 pairCount,
const ObjectIDTracker& tracker)
223 for(PxU32 i=0; i < pairCount; i++)
225 ContactShapePair& csp = shapePairs[i];
227 PxU32 shape0ID = csp.shapeID[0];
228 PxU32 shape1ID = csp.shapeID[1];
230 PxU16 flags = csp.flags;
233 if (tracker.isDeletedID(shape0ID))
235 if (tracker.isDeletedID(shape1ID))
243PX_FORCE_INLINE PxU32 Sc::ContactStreamManager::computeExtraDataBlockCount(PxU32 extraDataSize_)
246 if (extraDataSize_ & ((1 << sExtraDataBlockSizePow2) - 1))
247 nbBlocks = (extraDataSize_ >> sExtraDataBlockSizePow2) + 1;
249 nbBlocks = (extraDataSize_ >> sExtraDataBlockSizePow2);
255PX_FORCE_INLINE PxU32 Sc::ContactStreamManager::computeExtraDataBlockSize(PxU32 extraDataSize_)
257 return (computeExtraDataBlockCount(extraDataSize_) << sExtraDataBlockSizePow2);
261PX_FORCE_INLINE PxU16 Sc::ContactStreamManager::computeContactReportExtraDataSize(PxU32 extraDataFlags,
bool addHeader)
263 PX_ASSERT(extraDataFlags);
265 PxU16 extraDataSize_ =
sizeof(PxContactPairIndex);
267 extraDataSize_ +=
sizeof(PxContactPairVelocity);
269 extraDataSize_ +=
sizeof(PxContactPairVelocity);
271 extraDataSize_ +=
sizeof(PxContactPairPose);
273 extraDataSize_ +=
sizeof(ContactStreamHeader);
274 return extraDataSize_;
278PX_FORCE_INLINE void Sc::ContactStreamManager::fillInContactReportExtraData(PxContactPairVelocity* cpVel, PxU32 index,
const ActorSim& rs,
bool isCCDPass)
282 const BodySim& bs =
static_cast<const BodySim&
>(rs);
285 const BodyCore& bc = bs.getBodyCore();
286 cpVel->linearVelocity[index] = bc.getLinearVelocity();
287 cpVel->angularVelocity[index] = bc.getAngularVelocity();
292 const Cm::SpatialVector& vel = bs.getLowLevelBody().getPreSolverVelocities();
293 cpVel->linearVelocity[index] = vel.linear;
294 cpVel->angularVelocity[index] = vel.angular;
299 cpVel->linearVelocity[index] = PxVec3(0.0f);
300 cpVel->angularVelocity[index] = PxVec3(0.0f);
305PX_FORCE_INLINE void Sc::ContactStreamManager::fillInContactReportExtraData(PxContactPairPose* cpPose, PxU32 index,
const ActorSim& rs,
bool isCCDPass,
const bool useCurrentTransform)
309 const BodySim& bs =
static_cast<const BodySim&
>(rs);
310 const BodyCore& bc = bs.getBodyCore();
311 const PxTransform& src = (!isCCDPass && useCurrentTransform) ? bc.getBody2World() : bs.getLowLevelBody().getLastCCDTransform();
312 cpPose->globalPose[index] = src * bc.getBody2Actor().getInverse();
316 const StaticSim& ss =
static_cast<const StaticSim&
>(rs);
317 const StaticCore& sc = ss.getStaticCore();
318 cpPose->globalPose[index] = sc.getActor2World();
323PX_FORCE_INLINE void Sc::ContactStreamManager::fillInContactReportExtraData(PxU8* stream, PxU32 extraDataFlags,
const ActorSim& rs0,
const ActorSim& rs1, PxU32 ccdPass,
const bool useCurrentTransform,
324 PxU32 pairIndex, PxU32 sizeOffset)
326 ContactStreamHeader* strHeader =
reinterpret_cast<ContactStreamHeader*
>(stream);
327 strHeader->contactPass = PxTo16(ccdPass);
329 stream += sizeOffset;
330 PxU8* edStream = stream;
331 bool isCCDPass = (ccdPass != 0);
334 PxContactPairIndex* cpIndex =
reinterpret_cast<PxContactPairIndex*
>(edStream);
336 cpIndex->index = PxTo16(pairIndex);
337 edStream +=
sizeof(PxContactPairIndex);
339 PX_ASSERT(edStream <=
reinterpret_cast<PxU8*
>(getShapePairs(stream)));
346 PxContactPairVelocity* cpVel =
reinterpret_cast<PxContactPairVelocity*
>(edStream);
348 edStream +=
sizeof(PxContactPairVelocity);
354 ContactStreamManager::fillInContactReportExtraData(cpVel, 0, rs0,
true);
355 ContactStreamManager::fillInContactReportExtraData(cpVel, 1, rs1,
true);
358 PX_ASSERT(edStream <=
reinterpret_cast<PxU8*
>(getShapePairs(stream)));
362 PxContactPairVelocity* cpVel =
reinterpret_cast<PxContactPairVelocity*
>(edStream);
364 ContactStreamManager::fillInContactReportExtraData(cpVel, 0, rs0, isCCDPass);
365 ContactStreamManager::fillInContactReportExtraData(cpVel, 1, rs1, isCCDPass);
366 edStream +=
sizeof(PxContactPairVelocity);
368 PX_ASSERT(edStream <=
reinterpret_cast<PxU8*
>(getShapePairs(stream)));
372 PxContactPairPose* cpPose =
reinterpret_cast<PxContactPairPose*
>(edStream);
374 ContactStreamManager::fillInContactReportExtraData(cpPose, 0, rs0, isCCDPass, useCurrentTransform);
375 ContactStreamManager::fillInContactReportExtraData(cpPose, 1, rs1, isCCDPass, useCurrentTransform);
376 edStream +=
sizeof(PxContactPairPose);
378 PX_ASSERT(edStream <=
reinterpret_cast<PxU8*
>(getShapePairs(stream)));
381 extraDataSize = PxTo16(sizeOffset + PxU32(edStream - stream));
385PX_FORCE_INLINE void Sc::ContactStreamManager::setContactReportPostSolverVelocity(PxU8* stream,
const ActorSim& rs0,
const ActorSim& rs1)
387 PX_ASSERT(extraDataSize > (
sizeof(ContactStreamHeader) +
sizeof(PxContactPairIndex)));
388 PxContactPairVelocity* cpVel =
reinterpret_cast<PxContactPairVelocity*
>(stream +
sizeof(ContactStreamHeader) +
sizeof(PxContactPairIndex));
391 fillInContactReportExtraData(cpVel, 0, rs0,
false);
392 fillInContactReportExtraData(cpVel, 1, rs1,
false);
Abstract class for collision shapes.
Definition PxShape.h:146
Definition ScActorSim.h:83
Definition ScObjectIDTracker.h:42
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
#define PX_COMPILE_TIME_ASSERT(exp)
Definition PxPreprocessor.h:428
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
@ eRIGID_STATIC
A static rigid body.
Definition PxActor.h:126
@ ePOST_SOLVER_VELOCITY
Provide post solver velocities in contact reports for this collision pair.
Definition PxFiltering.h:240
@ eCONTACT_EVENT_POSE
Provide rigid body poses in contact reports for this collision pair.
Definition PxFiltering.h:256
@ ePRE_SOLVER_VELOCITY
Provide pre solver velocities in contact reports for this collision pair.
Definition PxFiltering.h:230