Fix physics trigger layer mask matching trigger events (filter body types)

This commit is contained in:
Wojtek Figat
2022-07-24 13:12:18 +02:00
parent 928d318f24
commit c25305e695

View File

@@ -428,11 +428,17 @@ PxFilterFlags FilterShader(
PxFilterObjectAttributes attributes1, PxFilterData filterData1,
PxPairFlags& pairFlags, const void* constantBlock, PxU32 constantBlockSize)
{
const bool maskTest = (filterData0.word0 & filterData1.word1) && (filterData1.word0 & filterData0.word1);
// Let triggers through
if (PxFilterObjectIsTrigger(attributes0) || PxFilterObjectIsTrigger(attributes1))
{
pairFlags |= PxPairFlag::eNOTIFY_TOUCH_FOUND;
pairFlags |= PxPairFlag::eNOTIFY_TOUCH_LOST;
if (maskTest)
{
// Notify trigger if masks specify it
pairFlags |= PxPairFlag::eNOTIFY_TOUCH_FOUND;
pairFlags |= PxPairFlag::eNOTIFY_TOUCH_LOST;
}
pairFlags |= PxPairFlag::eDETECT_DISCRETE_CONTACT;
return PxFilterFlag::eDEFAULT;
}
@@ -448,7 +454,7 @@ PxFilterFlags FilterShader(
}
// Trigger the contact callback for pairs (A,B) where the filtermask of A contains the ID of B and vice versa
if ((filterData0.word0 & filterData1.word1) && (filterData1.word0 & filterData0.word1))
if (maskTest)
{
pairFlags |= PxPairFlag::eSOLVE_CONTACT;
pairFlags |= PxPairFlag::eDETECT_DISCRETE_CONTACT;
@@ -1647,7 +1653,7 @@ int32 PhysicsBackend::GetRigidActorShapesCount(void* actor)
void* PhysicsBackend::CreateRigidDynamicActor(IPhysicsActor* actor, const Vector3& position, const Quaternion& orientation, void* scene)
{
const Vector3 sceneOrigin = SceneOrigins[scene ? ( (ScenePhysX*)scene)->Scene : nullptr];
const Vector3 sceneOrigin = SceneOrigins[scene ? ((ScenePhysX*)scene)->Scene : nullptr];
const PxTransform trans(C2P(position - sceneOrigin), C2P(orientation));
PxRigidDynamic* actorPhysX = PhysX->createRigidDynamic(trans);
actorPhysX->userData = actor;
@@ -1662,7 +1668,7 @@ void* PhysicsBackend::CreateRigidDynamicActor(IPhysicsActor* actor, const Vector
void* PhysicsBackend::CreateRigidStaticActor(IPhysicsActor* actor, const Vector3& position, const Quaternion& orientation, void* scene)
{
const Vector3 sceneOrigin = SceneOrigins[scene ? ( (ScenePhysX*)scene)->Scene : nullptr];
const Vector3 sceneOrigin = SceneOrigins[scene ? ((ScenePhysX*)scene)->Scene : nullptr];
const PxTransform trans(C2P(position - sceneOrigin), C2P(orientation));
PxRigidStatic* actorPhysX = PhysX->createRigidStatic(trans);
actorPhysX->userData = actor;