UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BoneSocketReference.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
8#pragma once
9
10#include "CoreMinimal.h"
12#include "BoneIndices.h"
13#include "BonePose.h"
14#include "BoneContainer.h"
15#include "BoneSocketReference.generated.h"
16
17class USkeletalMeshComponent;
19
20USTRUCT()
22{
24
25private:
26 FTransform CachedSocketLocalTransform;
27
28public:
30 UPROPERTY(EditAnywhere, Category = FSocketReference)
31 FName SocketName;
32
34 FMeshPoseBoneIndex CachedSocketMeshBoneIndex;
35 FCompactPoseBoneIndex CachedSocketCompactBoneIndex;
36
37public:
39 : CachedSocketMeshBoneIndex(INDEX_NONE)
40 , CachedSocketCompactBoneIndex(INDEX_NONE)
41 {
42 }
43
44 FSocketReference(const FName& InSocketName)
45 : SocketName(InSocketName)
46 , CachedSocketMeshBoneIndex(INDEX_NONE)
47 , CachedSocketCompactBoneIndex(INDEX_NONE)
48 {
49 }
50
51 ENGINE_API void InitializeSocketInfo(const FAnimInstanceProxy* InAnimInstanceProxy);
52 ENGINE_API void InitialzeCompactBoneIndex(const FBoneContainer& RequiredBones);
53 /* There are subtle difference between this two IsValid function
54 * First one says the configuration had a valid socket as mesh index is valid
55 * Second one says the current bonecontainer doesn't contain it, meaning the current LOD is missing the joint that is required to evaluate
56 * Although the expected behavior is ambiguous, I'll still split these two, and use it accordingly */
57 bool HasValidSetup() const
58 {
59 return (CachedSocketMeshBoneIndex.IsValid());
60 }
61
62 bool IsValidToEvaluate() const
63 {
64 return (CachedSocketCompactBoneIndex.IsValid());
65 }
66
68 {
69 return CachedSocketCompactBoneIndex;
70 }
71
72 template<typename poseType>
74 {
75 // current LOD has valid index (FCompactPoseBoneIndex is valid if current LOD supports)
76 if (CachedSocketCompactBoneIndex.IsValid())
77 {
78 FTransform BoneTransform = InPose.GetComponentSpaceTransform(CachedSocketCompactBoneIndex);
79 return CachedSocketLocalTransform * BoneTransform;
80 }
81
83 }
84
86 {
87 CachedSocketMeshBoneIndex = FMeshPoseBoneIndex(INDEX_NONE);
88 CachedSocketCompactBoneIndex = FCompactPoseBoneIndex(INDEX_NONE);
89 }
90};
91
92USTRUCT()
94{
96
97 UPROPERTY(EditAnywhere, Category = FBoneSocketTarget)
98 bool bUseSocket;
99
100 UPROPERTY(EditAnywhere, Category = FBoneSocketTarget, meta=(EditCondition = "!bUseSocket"))
101 FBoneReference BoneReference;
102
103 UPROPERTY(EditAnywhere, Category = FBoneSocketTarget, meta = (EditCondition = "bUseSocket"))
104 FSocketReference SocketReference;
105
107 {
108 bUseSocket = bInUseSocket;
109
110 if (bUseSocket)
111 {
112 SocketReference.SocketName = InName;
113 }
114 else
115 {
116 BoneReference.BoneName = InName;
117 }
118 }
119
120 void InitializeBoneReferences(const FBoneContainer& RequiredBones)
121 {
122 if (bUseSocket)
123 {
124 SocketReference.InitialzeCompactBoneIndex(RequiredBones);
125 BoneReference.InvalidateCachedBoneIndex();
126 }
127 else
128 {
129 BoneReference.Initialize(RequiredBones);
130 SocketReference.InvalidateCachedBoneIndex();
131 }
132 }
133
136 {
137 if (bUseSocket)
138 {
139 SocketReference.InitializeSocketInfo(InAnimInstanceProxy);
140 }
141 }
142
143
145 bool HasValidSetup() const
146 {
147 if (bUseSocket)
148 {
149 return SocketReference.HasValidSetup();
150 }
151
152 return BoneReference.BoneIndex != INDEX_NONE;
153 }
154
155 bool HasTargetSetup() const
156 {
157 if (bUseSocket)
158 {
159 return (SocketReference.SocketName != NAME_None);
160 }
161
162 return (BoneReference.BoneName != NAME_None);
163 }
164
166 {
167 if (bUseSocket)
168 {
169 return (SocketReference.SocketName);
170 }
171
172 return (BoneReference.BoneName);
173 }
174
176 bool IsValidToEvaluate(const FBoneContainer& RequiredBones) const
177 {
178 if (bUseSocket)
179 {
180 return SocketReference.IsValidToEvaluate();
181 }
182
183 return BoneReference.IsValidToEvaluate(RequiredBones);
184 }
185
186 // this will return the compact pose bone index that matters
187 // if you're using socket, it will return socket's related joint's compact pose index
189 {
190 if (bUseSocket)
191 {
192 return SocketReference.GetCachedSocketCompactBoneIndex();
193 }
194
195 return BoneReference.CachedCompactPoseIndex;
196 }
197
199 template<typename poseType>
201 {
203
205 {
209 };
210
211 if (bUseSocket)
212 {
213 // this has to be done outside
214 if (SocketReference.IsValidToEvaluate())
215 {
216 FTransform SocketTransformInCS = SocketReference.GetAnimatedSocketTransform(InPose);
217
221 }
222 else
223 {
224 // if none is found, we consider this offset is world offset
226 }
227 }
228 // if valid data is available
229 else if (BoneReference.HasValidSetup())
230 {
231 if (BoneReference.IsValidToEvaluate() &&
232 ensureMsgf(InPose.GetPose().IsValidIndex(BoneReference.CachedCompactPoseIndex), TEXT("Invalid Cached Pose : Name %s(Bone Index (%d), Cached (%d))"), *BoneReference.BoneName.ToString(), BoneReference.BoneIndex, BoneReference.CachedCompactPoseIndex.GetInt()))
233 {
234 OutTargetTransform = InPose.GetComponentSpaceTransform(BoneReference.CachedCompactPoseIndex);
237 }
238 else
239 {
240 // if none is found, we consider this offset is world offset
242 }
243 }
244 else
245 {
246 // if none is found, we consider this offset is world offset
248 }
249
250 return OutTargetTransform;
251 }
252
253 template<typename poseType>
255 {
257
259 {
261 };
262
263 if (bUseSocket)
264 {
265 // this has to be done outside
266 if (SocketReference.IsValidToEvaluate())
267 {
268 OutTargetTransform = TargetOffset * SocketReference.GetAnimatedSocketTransform(InPose);
269 }
270 else
271 {
273 }
274 }
275 // if valid data is available
276 else if (BoneReference.HasValidSetup())
277 {
278 if (BoneReference.IsValidToEvaluate() &&
279 ensureMsgf(InPose.GetPose().IsValidIndex(BoneReference.CachedCompactPoseIndex), TEXT("Invalid Cached Pose : Name %s(Bone Index (%d), Cached (%d))"), *BoneReference.BoneName.ToString(), BoneReference.BoneIndex, BoneReference.CachedCompactPoseIndex.GetInt()))
280 {
281 OutTargetTransform = TargetOffset * InPose.GetComponentSpaceTransform(BoneReference.CachedCompactPoseIndex);
282 }
283 else
284 {
286 }
287 }
288 else
289 {
291 }
292
293 return OutTargetTransform;
294 }
295};
296
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
const bool
Definition NetworkReplayStreaming.h:178
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
Definition NameTypes.h:617
@ false
Definition radaudio_common.h:23
Definition AnimInstanceProxy.h:144
Definition BoneContainer.h:192
Definition BoneReference.h:14
FName BoneName
Definition BoneReference.h:19
Definition BoneSocketReference.h:94
FTransform GetTargetTransform(const FTransform &TargetOffset, FCSPose< poseType > &InPose, const FTransform &InComponentToWorld) const
Definition BoneSocketReference.h:254
FCompactPoseBoneIndex GetCompactPoseBoneIndex() const
Definition BoneSocketReference.h:188
FName GetTargetSetup() const
Definition BoneSocketReference.h:165
bool IsValidToEvaluate(const FBoneContainer &RequiredBones) const
Definition BoneSocketReference.h:176
void InitializeBoneReferences(const FBoneContainer &RequiredBones)
Definition BoneSocketReference.h:120
bool HasValidSetup() const
Definition BoneSocketReference.h:145
bool HasTargetSetup() const
Definition BoneSocketReference.h:155
FTransform GetTargetTransform(const FVector &TargetOffset, FCSPose< poseType > &InPose, const FTransform &InComponentToWorld) const
Definition BoneSocketReference.h:200
void Initialize(const FAnimInstanceProxy *InAnimInstanceProxy)
Definition BoneSocketReference.h:135
Definition BonePose.h:408
Definition BoneIndices.h:63
Definition BoneIndices.h:71
Definition BoneSocketReference.h:22
void InvalidateCachedBoneIndex()
Definition BoneSocketReference.h:85
FTransform GetAnimatedSocketTransform(struct FCSPose< poseType > &InPose) const
Definition BoneSocketReference.h:73
FSocketReference(const FName &InSocketName)
Definition BoneSocketReference.h:44
FCompactPoseBoneIndex GetCachedSocketCompactBoneIndex() const
Definition BoneSocketReference.h:67
FName SocketName
Definition BoneSocketReference.h:31
bool IsValidToEvaluate() const
Definition BoneSocketReference.h:62
bool HasValidSetup() const
Definition BoneSocketReference.h:57
CORE_API TTransform< T > GetRelativeTransform(const TTransform< T > &Other) const
Definition Transform.cpp:169
static CORE_API const TTransform< double > Identity
Definition TransformNonVectorized.h:58
void SetIdentity()
Definition TransformNonVectorized.h:770