UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PhysicsFiltering.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "EngineDefines.h"
7#include "PhysicsPublic.h"
10
29
30
31// Bit counts for Word3 of filter data.
32// (ExtraFilter (top NumExtraFilterBits) + MyChannel (next NumCollisionChannelBits) as ECollisionChannel + Flags (remaining NumFilterDataFlagBits)
33// [NumExtraFilterBits] [NumCollisionChannelBits] [NumFilterDataFlagBits] = 32 bits
36
37
39{
41
42 inline void ConditionalSetFlags(EPhysXFilterDataFlags Flag, bool bEnabled)
43 {
44 if (bEnabled)
45 {
46 Word3 |= Flag;
47 }
48 }
49
51 {
60 OutWord1 = BlockingBits;
61 OutWord2 = TouchingBits;
62 OutWord3 = Word3;
63 }
64
66 {
74 OutWord0 = BodyIndex;
75 OutWord1 = BlockingBits;
77 OutWord3 = Word3;
78 }
79
81 {
82 OutBlockingBits = BlockingBits;
83 OutTouchingBits = TouchingBits;
85 }
86
87private:
88 uint32 BlockingBits;
89 uint32 TouchingBits;
90 uint32 Word3;
91};
92
119
121{
123 return (ECollisionChannel)ChannelMask;
124}
125
127{
128 uint32 ChannelMask = GetCollisionChannel(Word3);
129 OutMaskFilter = Word3 >> (32 - NumExtraFilterBits);
130 return (ECollisionChannel)ChannelMask;
131}
132
133inline uint32 CreateChannelAndFilter(ECollisionChannel CollisionChannel, FMaskFilter MaskFilter)
134{
135 uint32 ResultMask = (uint32(MaskFilter) << NumCollisionChannelBits) | (uint32)CollisionChannel;
137}
138
140{
141 static_assert(NumExtraFilterBits <= 8, "Only up to 8 extra filter bits are supported.");
142 Word3 &= (0xFFFFFFFFu >> NumExtraFilterBits); //we drop the top NumExtraFilterBits bits because that's where the new mask filter is going
143 Word3 |= uint32(NewMaskFilter) << (32 - NumExtraFilterBits);
144}
145
147{
148 FCollisionResponseContainer CollisionResponseContainer;
149
150 for (int32 ChannelIndex = 0; ChannelIndex < UE_ARRAY_COUNT(CollisionResponseContainer.EnumArray); ++ChannelIndex)
151 {
152 if ((InSimFilterData.Word1) & (1 << ChannelIndex))
153 {
154 CollisionResponseContainer.EnumArray[ChannelIndex] = ECR_Block;
155 }
156 else
157 {
158 CollisionResponseContainer.EnumArray[ChannelIndex] = ECR_Ignore;
159 }
160 }
161
162 return CollisionResponseContainer;
163}
164
166{
167 FCollisionResponseContainer CollisionResponseContainer;
168
169 for (int32 ChannelIndex = 0; ChannelIndex < UE_ARRAY_COUNT(CollisionResponseContainer.EnumArray); ++ChannelIndex)
170 {
171 if ((InQueryFilterData.Word1) & (1 << ChannelIndex))
172 {
173 CollisionResponseContainer.EnumArray[ChannelIndex] = ECR_Block;
174 }
175 else if ((InQueryFilterData.Word2) & (1 << ChannelIndex))
176 {
177 CollisionResponseContainer.EnumArray[ChannelIndex] = ECR_Overlap;
178 }
179 else
180 {
181 CollisionResponseContainer.EnumArray[ChannelIndex] = ECR_Ignore;
182 }
183 }
184
185 return CollisionResponseContainer;
186}
uint8 FMaskFilter
Definition CollisionFilter.h:14
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ NumExtraFilterBits
Definition EngineTypes.h:1052
ECollisionChannel
Definition EngineTypes.h:1088
ECollisionChannel GetCollisionChannel(uint32 Word3)
Definition PhysicsFiltering.h:120
uint32 CreateChannelAndFilter(ECollisionChannel CollisionChannel, FMaskFilter MaskFilter)
Definition PhysicsFiltering.h:133
@ NumFilterDataFlagBits
Definition PhysicsFiltering.h:35
void UpdateMaskFilter(uint32 &Word3, FMaskFilter NewMaskFilter)
Definition PhysicsFiltering.h:139
void CreateShapeFilterData(const uint8 MyChannel, const FMaskFilter MaskFilter, const int32 SourceObjectID, const FCollisionResponseContainer &ResponseToChannels, uint32 ComponentID, uint16 BodyIndex, FCollisionFilterData &OutQueryData, FCollisionFilterData &OutSimData, bool bEnableCCD, bool bEnableContactNotify, bool bStaticShape, bool bModifyContacts=false)
Definition PhysicsFiltering.h:94
ECollisionChannel GetCollisionChannelAndExtraFilter(uint32 Word3, FMaskFilter &OutMaskFilter)
Definition PhysicsFiltering.h:126
EPhysXFilterDataFlags
Definition PhysicsFiltering.h:19
@ EPDF_ContactNotify
Definition PhysicsFiltering.h:24
@ EPDF_ComplexCollision
Definition PhysicsFiltering.h:22
@ EPDF_SimpleCollision
Definition PhysicsFiltering.h:21
@ EPDF_CCD
Definition PhysicsFiltering.h:23
@ EPDF_ModifyContacts
Definition PhysicsFiltering.h:26
@ EPDF_KinematicKinematicPairs
Definition PhysicsFiltering.h:27
@ EPDF_StaticShape
Definition PhysicsFiltering.h:25
FCollisionResponseContainer ExtractQueryCollisionResponseContainer(const FCollisionFilterData &InQueryFilterData)
Definition PhysicsFiltering.h:165
FCollisionResponseContainer ExtractSimCollisionResponseContainer(const FCollisionFilterData &InSimFilterData)
Definition PhysicsFiltering.h:146
@ NumCollisionChannelBits
Definition PhysicsFiltering.h:34
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition EnumAsByte.h:22
Definition CollisionFilterData.h:46
Definition EngineTypes.h:1339
uint8 EnumArray[32]
Definition EngineTypes.h:1510
Definition PhysicsFiltering.h:39
void GetSimData(uint32 BodyIndex, uint32 ComponentID, uint32 &OutWord0, uint32 &OutWord1, uint32 &OutWord2, uint32 &OutWord3) const
Definition PhysicsFiltering.h:65
void ConditionalSetFlags(EPhysXFilterDataFlags Flag, bool bEnabled)
Definition PhysicsFiltering.h:42
void GetCombinedData(uint32 &OutBlockingBits, uint32 &OutTouchingBits, uint32 &OutObjectTypeAndFlags) const
Definition PhysicsFiltering.h:80
void GetQueryData(uint32 SourceObjectID, uint32 &OutWord0, uint32 &OutWord1, uint32 &OutWord2, uint32 &OutWord3) const
Definition PhysicsFiltering.h:50