Finally, I find a way to make it worked.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma optimize("", off)
#include "MyWorldSettings.h"
#include <PhysXPublicCore.h>
#include "Physics/PhysicsFiltering.h"
PxFilterFlags PxSimulationFilterShaderProc(PxFilterObjectAttributes attributes0, PxFilterData filterData0,
PxFilterObjectAttributes attributes1, PxFilterData filterData1,
PxPairFlags& pairFlags, const void* constantBlock, PxU32 constantBlockSize)
{
pairFlags = physx::PxPairFlag::eCONTACT_DEFAULT;
pairFlags |= physx::PxPairFlag::eDETECT_CCD_CONTACT;
pairFlags |= physx::PxPairFlag::eNOTIFY_CONTACT_POINTS;
pairFlags |= physx::PxPairFlag::eMODIFY_CONTACTS; //necessary
PxFilterFlags ret = PxFilterFlag::eDEFAULT;
return ret;
}
class MyContactModifyCallback : public FContactModifyCallback
{
public:
void onContactModify(PxContactModifyPair* const pairs, PxU32 count)
{
for (PxU32 i = 0; i < count; i++)
{
PxContactModifyPair& pair = pairs[i];
for (PxU32 j = 0; j < pair.contacts.size(); j++)
{
// code your filter codes
//pair.contacts.ignore(j);
}
}
}
};
class MyContactModifyCallbackFactory : public IContactModifyCallbackFactory
{
public:
FContactModifyCallback* Create(FPhysScene_PhysX* PhysScene)
{
return new MyContactModifyCallback();
}
void Destroy(FContactModifyCallback* Callback)
{
delete Callback;
}
};
AMyWorldSettings::AMyWorldSettings(const FObjectInitializer& ObjectInitializer)
: AWorldSettings(ObjectInitializer)
{
GSimulationFilterShader = PxSimulationFilterShaderProc;
FPhysScene_PhysX::ContactModifyCallbackFactory = TSharedPtr<IContactModifyCallbackFactory>(new MyContactModifyCallbackFactory());
}
This example is taking effect only if the following conditions are reached.
- ’ Edit → Project Settings → General Settings → Default Classes → World Settings Class ’ be set of ‘AMyWorldSettings’ .
- ‘Simulate Physics’ be set of true.
- Physics Collision enabled.
- Add module ‘PhysicsCore’ in xxx.Build.cs.