How do I get my ContactModifyCallback to work?

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.

  1. ’ Edit → Project Settings → General Settings → Default Classes → World Settings Class ’ be set of ‘AMyWorldSettings’ .
  2. ‘Simulate Physics’ be set of true.
  3. Physics Collision enabled.
  4. Add module ‘PhysicsCore’ in xxx.Build.cs.
1 Like