UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SkeletalMeshUpdater.inl
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
4
5template <typename SkeletalMeshMeshDynamicDataType>
7{
8 if (ensure(Channel))
9 {
10 checkf(Channel->IsChannelFor<SkeletalMeshMeshDynamicDataType>(), TEXT("Provided MeshDynamicData is not the correct type for this handle."));
11 return Channel->Update(*this, MeshDynamicData);
12 }
13 return false;
14}
15
17{
18 if (Channel)
19 {
20 Channel->Release(MoveTemp(*this));
21 }
22}
23
25
26inline void FSkeletalMeshUpdateChannel::FDynamicDataList::Add(FSkeletalMeshDynamicData* Command)
27{
28 if (!Head)
29 {
30 Head = Tail = Command;
31 }
32 else
33 {
34 Tail->Next = Command;
35 Tail = Command;
36 }
37}
38
39template <typename LambdaType>
40void FSkeletalMeshUpdateChannel::FDynamicDataList::Consume(LambdaType&& Lambda)
41{
43 {
45 Current->Next = nullptr;
46 Lambda(Current, Next != nullptr);
47 Current = Next;
48 }
49 Head = Tail = nullptr;
50}
51
53
54template <typename SkeletalMeshUpdatePacketType>
55void FSkeletalMeshUpdateChannel::Replay(FRHICommandList& RHICmdList, SkeletalMeshUpdatePacketType& UpdatePacket)
56{
58 TRACE_CPUPROFILER_EVENT_SCOPE(FSkeletalMeshUpdateChannel::Replay);
59
60 using MeshObjectType = typename SkeletalMeshUpdatePacketType::MeshObjectType;
61 using MeshDynamicDataType = typename SkeletalMeshUpdatePacketType::MeshDynamicDataType;
62
63 for (FOp Op : OpStream.Ops)
64 {
65 switch (Op.Type)
66 {
67 case FOp::EType::Add:
68 {
69 const int32 ExpectedSize = Op.HandleIndex + 1;
70 if (SlotRegistry.Slots.Num() < ExpectedSize)
71 {
72 SlotRegistry.Slots.SetNum(ExpectedSize);
73 SlotRegistry.SlotBits.SetNum(ExpectedSize, false);
74 }
75 SlotRegistry.Slots[Op.HandleIndex].MeshObject = Op.Data_Add.MeshObject;
76 }
77 break;
78 case FOp::EType::Remove:
79 {
80 FSlot& Slot = SlotRegistry.Slots[Op.HandleIndex];
81 Slot.UpdateList.Consume([&](FSkeletalMeshDynamicData* MeshDynamicDataBase, bool bHasNext)
82 {
83 UpdatePacket.Free(static_cast<MeshDynamicDataType*>(MeshDynamicDataBase));
84 });
85 Slot = {};
86 SlotRegistry.SlotBits[Op.HandleIndex] = false;
87 }
88 break;
89 case FOp::EType::Update:
90 {
91 FSlot& Slot = SlotRegistry.Slots[Op.HandleIndex];
92 check(Slot.MeshObject);
93 Slot.UpdateList.Add(Op.Data_Update.MeshDynamicData);
94 SlotRegistry.SlotBits[Op.HandleIndex] = true;
95 }
96 break;
97 }
98 }
99
100 for (TConstSetBitIterator<> It(SlotRegistry.SlotBits); It; ++It)
101 {
102 FSlot& Slot = SlotRegistry.Slots[It.GetIndex()];
103 auto* MeshObject = static_cast<MeshObjectType*>(Slot.MeshObject);
104 Slot.UpdateList.Consume([&] (FSkeletalMeshDynamicData* MeshDynamicDataBase, bool bHasNext)
105 {
106 auto* MeshDynamicData = static_cast<MeshDynamicDataType*>(MeshDynamicDataBase);
107 if (bHasNext)
108 {
109 UpdatePacket.UpdateImmediate(RHICmdList, MeshObject, MeshDynamicData);
110 }
111 else
112 {
113 UpdatePacket.Add(MeshObject, MeshDynamicData);
114 }
115 });
116 }
117
118 SlotRegistry.SlotBits.Init(false, SlotRegistry.SlotBits.Num());
119 OpStream = {};
120}
121
123
124template <typename SkeletalMeshObjectType>
126{
127 return Channels[FSkeletalMeshUpdateChannel::GetChannelIndex<SkeletalMeshObjectType>()].Create(MeshObject);
128}
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
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
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
CORE_API bool IsInParallelRenderingThread()
Definition ThreadingBase.cpp:301
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition RHICommandList.h:3819
Definition SkeletalMeshUpdater.h:96
void Release(FSkeletalMeshUpdateHandle &&Handle)
Definition SkeletalMeshUpdater.cpp:232
bool Update(const FSkeletalMeshUpdateHandle &Handle, FSkeletalMeshDynamicData *MeshDynamicData)
Definition SkeletalMeshUpdater.cpp:252
bool IsChannelFor() const
Definition SkeletalMeshUpdater.h:637
Definition SkeletalMeshUpdater.h:353
bool Update(SkeletalMeshDynamicDataType *MeshDynamicData)
void Release()
Definition SkeletalMeshUpdater.inl:16
FSkeletalMeshUpdateHandle Create(SkeletalMeshObjectType *MeshObject)
Definition SkeletalMeshUpdater.inl:125
Definition BitArray.h:1944
const Type Command
Definition GenericApplication.h:46