UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PhysxUserData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
5#include "EngineDefines.h"
7
9class UPrimitiveComponent;
10struct FBodyInstance;
12struct FKShapeElem;
13class FPhysScene_PhysX;
14
16struct FKShapeElem;
18
34
37{
38protected:
40 void* Payload;
41
42public:
48 FPhysxUserData(UPrimitiveComponent* InPayload) :Type(EPhysxUserDataType::PrimitiveComponent), Payload(InPayload) {}
51
52 template <class T> static T* Get(void* UserData);
53 template <class T> static void Set(void* UserData, T* Payload);
54
55 //helper function to determine if userData is garbage (maybe dangling pointer)
56 static bool IsGarbage(void* UserData){ return ((FPhysxUserData*)UserData)->Type < EPhysxUserDataType::Invalid || ((FPhysxUserData*)UserData)->Type > EPhysxUserDataType::CustomPayload; }
57};
58
59template <> inline FBodyInstance* FPhysxUserData::Get(void* UserData) { if (!UserData || ((FPhysxUserData*)UserData)->Type != EPhysxUserDataType::BodyInstance) { return nullptr; } return (FBodyInstance*)((FPhysxUserData*)UserData)->Payload; }
60template <> inline UPhysicalMaterial* FPhysxUserData::Get(void* UserData) { if (!UserData || ((FPhysxUserData*)UserData)->Type != EPhysxUserDataType::PhysicalMaterial) { return nullptr; } return (UPhysicalMaterial*)((FPhysxUserData*)UserData)->Payload; }
61template <> inline FPhysScene* FPhysxUserData::Get(void* UserData) { if (!UserData || ((FPhysxUserData*)UserData)->Type != EPhysxUserDataType::PhysScene) { return nullptr; }return (FPhysScene*)((FPhysxUserData*)UserData)->Payload; }
62template <> inline FConstraintInstance* FPhysxUserData::Get(void* UserData) { if (!UserData || ((FPhysxUserData*)UserData)->Type != EPhysxUserDataType::ConstraintInstance) { return nullptr; } return (FConstraintInstance*)((FPhysxUserData*)UserData)->Payload; }
63template <> inline UPrimitiveComponent* FPhysxUserData::Get(void* UserData) { if (!UserData || ((FPhysxUserData*)UserData)->Type != EPhysxUserDataType::PrimitiveComponent) { return nullptr; } return (UPrimitiveComponent*)((FPhysxUserData*)UserData)->Payload; }
64template <> inline FKShapeElem* FPhysxUserData::Get(void* UserData) { if (!UserData || ((FPhysxUserData*)UserData)->Type != EPhysxUserDataType::AggShape) { return nullptr; } return (FKShapeElem*)((FPhysxUserData*)UserData)->Payload; }
65template <> inline FCustomPhysXPayload* FPhysxUserData::Get(void* UserData) { if (!UserData || ((FPhysxUserData*)UserData)->Type != EPhysxUserDataType::CustomPayload) { return nullptr; } return (FCustomPhysXPayload*)((FPhysxUserData*)UserData)->Payload; }
66
67template <> inline void FPhysxUserData::Set(void* UserData, FBodyInstance* Payload) { check(UserData); ((FPhysxUserData*)UserData)->Type = EPhysxUserDataType::BodyInstance; ((FPhysxUserData*)UserData)->Payload = Payload; }
68template <> inline void FPhysxUserData::Set(void* UserData, UPhysicalMaterial* Payload) { check(UserData); ((FPhysxUserData*)UserData)->Type = EPhysxUserDataType::PhysicalMaterial; ((FPhysxUserData*)UserData)->Payload = Payload; }
69template <> inline void FPhysxUserData::Set(void* UserData, FPhysScene* Payload) { check(UserData); ((FPhysxUserData*)UserData)->Type = EPhysxUserDataType::PhysScene; ((FPhysxUserData*)UserData)->Payload = Payload; }
70template <> inline void FPhysxUserData::Set(void* UserData, FConstraintInstance* Payload) { check(UserData); ((FPhysxUserData*)UserData)->Type = EPhysxUserDataType::ConstraintInstance; ((FPhysxUserData*)UserData)->Payload = Payload; }
71template <> inline void FPhysxUserData::Set(void* UserData, UPrimitiveComponent* Payload) { check(UserData); ((FPhysxUserData*)UserData)->Type = EPhysxUserDataType::PrimitiveComponent; ((FPhysxUserData*)UserData)->Payload = Payload; }
72template <> inline void FPhysxUserData::Set(void* UserData, FKShapeElem* Payload) { check(UserData); ((FPhysxUserData*)UserData)->Type = EPhysxUserDataType::AggShape; ((FPhysxUserData*)UserData)->Payload = Payload; }
73template <> inline void FPhysxUserData::Set(void* UserData, FCustomPhysXPayload* Payload) { check(UserData); ((FPhysxUserData*)UserData)->Type = EPhysxUserDataType::CustomPayload; ((FPhysxUserData*)UserData)->Payload = Payload; }
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition PhysScene_Chaos.h:116
Definition PhysicalMaterial.h:104
Definition PhysxUserData.h:21
Type
Definition PhysxUserData.h:23
@ PhysicalMaterial
Definition PhysxUserData.h:26
@ ConstraintInstance
Definition PhysxUserData.h:28
@ CustomPayload
Definition PhysxUserData.h:31
@ BodyInstance
Definition PhysxUserData.h:25
@ PhysScene
Definition PhysxUserData.h:27
@ AggShape
Definition PhysxUserData.h:30
@ Invalid
Definition PhysxUserData.h:24
@ PrimitiveComponent
Definition PhysxUserData.h:29
Definition BodyInstance.h:320
Definition ConstraintInstance.h:255
Definition CustomPhysXPayload.h:41
Definition ShapeElem.h:35
Definition PhysxUserData.h:37
FPhysxUserData(FCustomPhysXPayload *InPayload)
Definition PhysxUserData.h:50
void * Payload
Definition PhysxUserData.h:40
FPhysxUserData(FBodyInstance *InPayload)
Definition PhysxUserData.h:44
FPhysxUserData(FConstraintInstance *InPayload)
Definition PhysxUserData.h:47
EPhysxUserDataType::Type Type
Definition PhysxUserData.h:39
FPhysxUserData(FKShapeElem *InPayload)
Definition PhysxUserData.h:49
static void Set(void *UserData, T *Payload)
FPhysxUserData(FPhysScene *InPayload)
Definition PhysxUserData.h:46
FPhysxUserData(UPhysicalMaterial *InPayload)
Definition PhysxUserData.h:45
FPhysxUserData(UPrimitiveComponent *InPayload)
Definition PhysxUserData.h:48
static bool IsGarbage(void *UserData)
Definition PhysxUserData.h:56
FPhysxUserData()
Definition PhysxUserData.h:43
static T * Get(void *UserData)