UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetObjectGroups.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
6#include "Containers/Array.h"
8#include "Containers/Map.h"
10#include "UObject/NameTypes.h"
13
14namespace UE::Net
15{
16 namespace Private
17 {
19
20 class FNetRefHandleManager;
21 }
22}
23
24namespace UE::Net::Private
25{
26
28{
29 None = 0x0000,
30 IsExclusionFiltering = 0x0001,
31 IsInclusionFiltering = 0x0002,
32};
34
36{
37 // Group members can only be replicated objects that have internal indices
42};
43
50
52{
54
55public:
58
59 void Init(const FNetObjectGroupInitParams& Params);
60
62 void DestroyGroup(FNetObjectGroupHandle GroupHandle);
63
64 void ClearGroup(FNetObjectGroupHandle GroupHandle);
65
67
68 const FNetObjectGroup* GetGroup(FNetObjectGroupHandle GroupHandle) const;
70
73
76
77 inline FName GetGroupName(FNetObjectGroupHandle GroupHandle) const;
78 inline FString GetGroupNameString(FNetObjectGroupHandle GroupHandle) const;
79
80 bool IsValidGroup(FNetObjectGroupHandle GroupHandle) const;
81
85
88
91
94
97
99 bool IsFilterGroup(FNetObjectGroupHandle GroupHandle) const;
100
103
106
109
112
114 const FNetBitArrayView GetGroupFilteredOutObjects() const { return MakeNetBitArrayView(GroupFilteredOutObjects); }
115
118
119private:
120 struct FNetObjectGroupMembership
121 {
122 private:
123 enum { NumInlinedGroupHandles = 2 };
126
127 public:
128
129 bool ContainsMembership(FNetObjectGroupHandle InGroupHandle) const { return GroupIndexes.Contains(InGroupHandle.GetGroupIndex()); }
130 void AddMembership(FNetObjectGroupHandle InGroupHandle) { GroupIndexes.Add(InGroupHandle.GetGroupIndex()); }
131 void RemoveMembership(FNetObjectGroupHandle InGroupHandle) { GroupIndexes.RemoveSingleSwap(InGroupHandle.GetGroupIndex()); }
132 void ResetMemberships() { GroupIndexes.Reset(); }
133 int32 NumMemberships() const { return GroupIndexes.Num(); }
134
135 const TArrayView<const FNetObjectGroupHandle::FGroupIndexType> GetGroupIndexes() const { return MakeArrayView(GroupIndexes.GetData(), GroupIndexes.Num()); }
136 };
137
138 static bool AddGroupMembership(FNetObjectGroupMembership& Target, FNetObjectGroupHandle Group);
139 static void ResetGroupMembership(FNetObjectGroupMembership& Target);
140 static bool IsMemberOf(const FNetObjectGroupMembership& Target, FNetObjectGroupHandle Group);
141
142 bool IsFilterGroup(const FNetObjectGroup& Group) const;
143 bool IsExclusionFilterGroup(const FNetObjectGroup& Group) const;
144 bool IsInclusionFilterGroup(const FNetObjectGroup& Group) const;
145
146 bool IsInAnyFilterGroup(const FNetObjectGroupMembership& GroupMembership) const;
147
148 const FNetObjectGroupHandle::FGroupIndexType GetIndexFromGroup(const FNetObjectGroup* InGroup) const;
149
150private:
151
152 FNetRefHandleManager* NetRefHandleManager = nullptr;
153
154 // Group usage pattern should not be high frequency so memory layout should not be a major concern
156
157 // Track what groups each internal handle is a member of, we can tighten this up a bit if needed
158 TArray<FNetObjectGroupMembership> GroupMemberships;
159
160 // Maximum number of groups that can be exist at once
161 uint32 MaxGroupCount = 0U;
162
163 // Index to use for groups with auto-generated names
164 int32 AutogeneratedGroupNameId = 0;
165
166 // List of objects that are members of a group with a filter trait
167 FNetBitArray GroupFilteredOutObjects;
168
169 // Identifies the ReplicationSystem the group handles were created by
171
172 // Unique Id assigned to each group handle
173 uint32 NextGroupUniqueId = 1U;
174};
175
177{
178 const bool bGroupIndexExists = GroupHandle.IsValid() && GroupHandle.Epoch == CurrentEpoch && Groups.IsValidIndex(GroupHandle.Index);
179 return bGroupIndexExists && Groups[GroupHandle.Index].GroupId == GroupHandle.UniqueId;
180}
181
183{
185}
186
188{
190}
191
192inline bool FNetObjectGroups::IsInclusionFilterGroup(const FNetObjectGroup& Group) const
193{
195}
196
198{
199 for (const FNetObjectGroup& Group : Groups)
200 {
201 if (Group.GroupName == InGroupName)
202 {
203 const int32 Index = GetIndexFromGroup(&Group);
205 }
206 }
207
208 return FNetObjectGroupHandle();
209}
210
216
217inline const FNetObjectGroupHandle::FGroupIndexType FNetObjectGroups::GetIndexFromGroup(const FNetObjectGroup* InGroup) const
218{
219 check(InGroup);
220 return (FNetObjectGroupHandle::FGroupIndexType)Groups.PointerToIndex(InGroup);
221}
222
224{
225 if (const FNetObjectGroup* Group = GetGroup(GroupHandle))
226 {
227 return Group->GroupName;
228 }
229
230 return FName();
231}
232
234{
235 return GetGroupName(GroupHandle).ToString();
236}
237
238} // end namespace UE::Net::Private
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define check(expr)
Definition AssertionMacros.h:314
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
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
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
void Init()
Definition LockFreeList.h:4
int32 InternalIndex
Definition VulkanMemory.cpp:4036
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
CORE_API FString ToString() const
Definition UnrealNames.cpp:3537
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
bool Contains(const ComparisonType &Item) const
Definition Array.h:1518
SizeType RemoveSingleSwap(const ElementType &Item, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:3211
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition SparseArray.h:524
Definition NetBitArray.h:337
Definition NetObjectGroupHandle.h:22
uint32 FGroupIndexType
Definition NetObjectGroupHandle.h:24
uint32 Index
Definition NetObjectGroupHandle.h:96
uint32 UniqueId
Definition NetObjectGroupHandle.h:98
uint32 Epoch
Definition NetObjectGroupHandle.h:97
bool IsValid() const
Definition NetObjectGroupHandle.h:46
Definition NetObjectGroups.h:52
void ClearGroup(FNetObjectGroupHandle GroupHandle)
Definition NetObjectGroups.cpp:137
void RemoveInclusionFilterTrait(FNetObjectGroupHandle GroupHandle)
Definition NetObjectGroups.cpp:317
void GetGroupHandlesOfNetObject(FInternalNetRefIndex InternalIndex, TArray< FNetObjectGroupHandle > &OutHandles) const
Definition NetObjectGroups.cpp:365
const FNetObjectGroup * GetGroup(FNetObjectGroupHandle GroupHandle) const
Definition NetObjectGroups.cpp:153
void OnMaxInternalNetRefIndexIncreased(FInternalNetRefIndex NewMaxInternalIndex)
Definition NetObjectGroups.cpp:73
FNetObjectGroupHandle GetHandleFromIndex(FNetObjectGroupHandle::FGroupIndexType GroupIndex) const
Definition NetObjectGroups.h:211
FString GetGroupNameString(FNetObjectGroupHandle GroupHandle) const
Definition NetObjectGroups.h:233
bool IsFilterGroup(FNetObjectGroupHandle GroupHandle) const
Definition NetObjectGroups.cpp:329
bool IsExclusionFilterGroup(FNetObjectGroupHandle GroupHandle) const
const TArrayView< const FNetObjectGroupHandle::FGroupIndexType > GetGroupIndexesOfNetObject(FInternalNetRefIndex InternalIndex) const
Definition NetObjectGroups.cpp:355
const FNetBitArrayView GetGroupFilteredOutObjects() const
Definition NetObjectGroups.h:114
const FNetObjectGroup * GetGroupFromIndex(FNetObjectGroupHandle::FGroupIndexType GroupIndex) const
Definition NetObjectGroups.cpp:163
FName GetGroupName(FNetObjectGroupHandle GroupHandle) const
Definition NetObjectGroups.h:223
bool IsValidGroup(FNetObjectGroupHandle GroupHandle) const
Definition NetObjectGroups.h:176
void RemoveFromGroup(FNetObjectGroupHandle GroupHandle, FInternalNetRefIndex InternalIndex)
Definition NetObjectGroups.cpp:229
void DestroyGroup(FNetObjectGroupHandle GroupHandle)
Definition NetObjectGroups.cpp:124
~FNetObjectGroups()
Definition NetObjectGroups.cpp:33
void AddToGroup(FNetObjectGroupHandle GroupHandle, FInternalNetRefIndex InternalIndex)
Definition NetObjectGroups.cpp:193
FNetObjectGroupHandle GetHandleFromGroup(const FNetObjectGroup *InGroup) const
Definition NetObjectGroups.cpp:173
void RemoveExclusionFilterTrait(FNetObjectGroupHandle GroupHandle)
Definition NetObjectGroups.cpp:278
FNetObjectGroups()
Definition NetObjectGroups.cpp:24
FNetObjectGroupHandle FindGroupHandle(FName GroupName) const
Definition NetObjectGroups.h:197
FNetObjectGroupHandle CreateGroup(FName GroupName)
Definition NetObjectGroups.cpp:79
void AddExclusionFilterTrait(FNetObjectGroupHandle GroupHandle)
Definition NetObjectGroups.cpp:259
bool Contains(FNetObjectGroupHandle GroupHandle, FInternalNetRefIndex InternalIndex) const
Definition NetObjectGroups.cpp:179
void AddInclusionFilterTrait(FNetObjectGroupHandle GroupHandle)
Definition NetObjectGroups.cpp:305
bool IsInclusionFilterGroup(FNetObjectGroupHandle GroupHandle) const
Definition NetRefHandleManager.h:72
Definition OverriddenPropertySet.cpp:45
Definition NetworkVersion.cpp:28
@ None
Definition ReplicationDataStreamDebug.h:25
uint32 FInternalNetRefIndex
Definition ReplicationStateStorage.h:20
ENetObjectGroupTraits
Definition NetObjectGroups.h:28
Definition NetworkVersion.cpp:28
FNetBitArrayView MakeNetBitArrayView(const FNetBitArrayView::StorageWordType *Storage, uint32 BitCount)
Definition NetBitArray.h:1677
U16 Index
Definition radfft.cpp:71
Definition NetObjectGroups.h:45
FNetRefHandleManager * NetRefHandleManager
Definition NetObjectGroups.h:46
uint32 MaxInternalNetRefIndex
Definition NetObjectGroups.h:47
uint32 MaxGroupCount
Definition NetObjectGroups.h:48
Definition NetObjectGroups.h:36
uint32 GroupId
Definition NetObjectGroups.h:40
TArray< FInternalNetRefIndex > Members
Definition NetObjectGroups.h:38
FName GroupName
Definition NetObjectGroups.h:39
ENetObjectGroupTraits Traits
Definition NetObjectGroups.h:41