diff --git a/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp b/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp index b4719159b..6bcd68a9d 100644 --- a/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp +++ b/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp @@ -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;