UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CollisionFilter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4// HEADER_UNIT_SKIP - Internal
5
6#include "Chaos/Core.h"
13
15
16namespace Chaos
17{
23 const FGeometryParticleHandle* Particle1,
25 const FIgnoreCollisionManager* IgnoreCollisionManager)
26 {
27 if (Particle1 == Particle2)
28 {
29 return false;
30 }
31
32 bool bIsKinematic1 = true;
33 bool bUseIgnoreCollisionManager1 = false;
34 bool bDisabled1 = false;
37 if (Rigid1 != nullptr)
38 {
39 bIsKinematic1 = Rigid1->IsKinematic();
40 bUseIgnoreCollisionManager1 = Rigid1->UseIgnoreCollisionManager();
41 bDisabled1 = Rigid1->Disabled();
42 CollisionGroup1 = Rigid1->CollisionGroup();
43 }
44
45 bool bIsKinematic2 = true;
46 bool bUseIgnoreCollisionManager2 = false;
47 bool bDisabled2 = false;
50 if (Rigid2 != nullptr)
51 {
52 bIsKinematic2 = Rigid2->IsKinematic();
53 bUseIgnoreCollisionManager2 = Rigid2->UseIgnoreCollisionManager();
54 bDisabled2 = Rigid2->Disabled();
55 CollisionGroup2 = Rigid2->CollisionGroup();
56 }
57
58 // @todo(chaos): This should not be happening if the disabled particles are removed from the active particles list, but GeometryCollection may leave them there
59 //check(!bDisabled2);
61 {
62 return false;
63 }
64
65 // At least one particle needs to be dynamic to generate a collision response
67 {
68 return false;
69 }
70 check((Rigid1 != nullptr) || (Rigid2 != nullptr));
71
72 // CollisionGroups are used by geometry collections for high-level collision filtering
73 // CollisionGroup == 0 : Collide_With_Everything
74 // CollisionGroup == INDEX_NONE : Disabled collisions
75 // CollisionGroup1 != CollisionGroup2 : Disabled collisions (if other conditions not met)
77 {
78 return false;
79 }
81 {
82 return false;
83 }
84
85 // Is this particle interaction governed by the IgnoreCollisionManager? If so, check to see if interaction is allowed
86 if ((bUseIgnoreCollisionManager1 || bUseIgnoreCollisionManager2) && (IgnoreCollisionManager != nullptr))
87 {
88 if (IgnoreCollisionManager->IgnoresCollision(Particle1, Particle2))
89 {
90 return false;
91 }
92 }
93
94 return true;
95 }
96
97
101 inline bool IsFilterValid(const FCollisionFilterData& Filter)
102 {
103 return Filter.Word0 || Filter.Word1 || Filter.Word2 || Filter.Word3;
104 }
105
109 inline bool FilterHasSimEnabled(const FPerShapeData* Shape)
110 {
111 return (!Shape || (Shape->GetSimEnabled() && IsFilterValid(Shape->GetSimData())));
112 }
113
114 inline bool DoCollide(EImplicitObjectType ImplicitType, const FPerShapeData* Shape)
115 {
116 //
117 // Disabled shapes do not collide
118 //
119 if (!FilterHasSimEnabled(Shape)) return false;
120
121 //
122 // Triangle Mesh geometry is only used if the shape specifies UseComplexAsSimple
123 //
124 if (Shape)
125 {
127 {
128 return false;
129 }
131 {
132 return false;
133 }
134 }
135 else if (ImplicitType == ImplicitObjectType::TriangleMesh)
136 {
137 return false;
138 }
139
140 return true;
141 }
142
147 {
148
149 if (!DoCollide(Implicit0Type, Shape0)) { return false; }
150 if (!DoCollide(Implicit1Type, Shape1)) { return false; }
151
152 //
153 // Shape Filtering
154 //
155 if (Shape0 && Shape1)
156 {
157
158 if (IsFilterValid(Shape0->GetSimData()) && IsFilterValid(Shape1->GetSimData()))
159 {
163
164 const uint32 Filter1Bit = 1 << (Filter1Channel); // SIMDATA_TO_BITFIELD
165 uint32 const Filter0Bit = 1 << (Filter0Channel); // SIMDATA_TO_BITFIELD
166 return (Filter0Bit & Shape1->GetSimData().Word1) && (Filter1Bit & Shape0->GetSimData().Word1);
167 }
168 }
169
170 return true;
171 }
172
183}
#define check(expr)
Definition AssertionMacros.h:314
uint8 FMaskFilter
Definition CollisionFilter.h:14
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition CollisionConstraintFlags.h:33
CHAOS_API bool IgnoresCollision(FHandleID Body0, FHandleID Body1) const
Definition CollisionConstraintFlags.cpp:20
Definition ShapeInstance.h:36
EChaosCollisionTraceFlag GetCollisionTraceType() const
Definition ShapeInstance.h:1187
bool GetSimEnabled() const
Definition ShapeInstance.h:1167
const FCollisionFilterData & GetSimData() const
Definition ShapeInstance.h:1032
Definition ParticleHandle.h:436
const TPBDRigidParticleHandleImp< T, d, bPersistent > * CastToRigidParticle() const
Definition ParticleHandle.h:1697
Definition ParticleHandle.h:987
@ TriangleMesh
Definition ImplicitObjectType.h:24
Definition SkeletalMeshComponent.h:307
FORCEINLINE_DEBUGGABLE uint32 GetChaosCollisionChannelAndExtraFilter(uint32 Word3, uint8 &OutMaskFilter)
Definition ParticleHandle.h:183
uint8 EImplicitObjectType
Definition ImplicitObjectType.h:41
bool IsFilterValid(const FCollisionFilterData &Filter)
Definition CollisionFilter.h:101
bool FilterHasSimEnabled(const FPerShapeData *Shape)
Definition CollisionFilter.h:109
bool ParticlePairBroadPhaseFilter(const FGeometryParticleHandle *Particle1, const FGeometryParticleHandle *Particle2, const FIgnoreCollisionManager *IgnoreCollisionManager)
Definition CollisionFilter.h:22
bool ShapePairNarrowPhaseFilter(EImplicitObjectType Implicit0Type, const FPerShapeData *Shape0, EImplicitObjectType Implicit1Type, const FPerShapeData *Shape1)
Definition CollisionFilter.h:179
bool DoCollide(EImplicitObjectType ImplicitType, const FPerShapeData *Shape)
Definition CollisionFilter.h:114
Definition CollisionFilterData.h:46
uint32 Word3
Definition CollisionFilterData.h:50
uint32 Word1
Definition CollisionFilterData.h:48