rely on the reference pose instead of caching poses

This commit is contained in:
Mamadou Babaei
2023-03-28 10:39:48 +02:00
parent a3af992468
commit b8199b902c
2 changed files with 19 additions and 76 deletions
@@ -79,12 +79,6 @@ struct ASGVirtualHand::FImpl
return Path;
}
/************************
* Member variables
************************/
TMap<FName, FTransform> InitialBonesTransforms;
/************************
* Owner object
************************/
@@ -111,15 +105,13 @@ struct ASGVirtualHand::FImpl
bool IsEditor() const;
void SetHandMesh(USkeletalMesh* VirtualHandMesh, bool bReinitPos);
void SetHandMesh(USkeletalMesh* VirtualHandMesh, bool bReinitPos) const;
FString GetDefaultMeshPath() const;
bool IsUsingUserMesh() const;
USkeletalMesh* LoadDefaultMesh() const;
void SetDefaultMesh();
void CacheInitialBonesTransforms();
bool CheckGlove() const;
};
@@ -216,13 +208,6 @@ ASGVirtualHand::ASGVirtualHand(const FObjectInitializer& ObjectInitializer)
Glove = nullptr;
}
void ASGVirtualHand::BeginPlay()
{
Super::BeginPlay();
Pimpl->CacheInitialBonesTransforms();
}
void ASGVirtualHand::Tick(const float DeltaSeconds)
{
#if WITH_EDITOR
@@ -261,8 +246,6 @@ void ASGVirtualHand::OnConstruction(const FTransform& Transform)
{
Pimpl->SetDefaultMesh();
}
Pimpl->CacheInitialBonesTransforms();
}
void ASGVirtualHand::EditorTick(float DeltaSeconds)
@@ -359,39 +342,24 @@ const FName& ASGVirtualHand::GetFingerBoneName(const int32 Finger, const int32 J
return Name;
}
const TMap<FName, FTransform>& ASGVirtualHand::GetInitialBonesTransforms() const
{
return Pimpl->InitialBonesTransforms;
}
bool ASGVirtualHand::GetInitialBoneTransform(const int32 Finger, const int32 Joint,
FTransform& OutTransform) const
const FTransform& ASGVirtualHand::GetFingerBoneRefTransform(const int32 Finger, const int32 Joint) const
{
const FName& BoneName{GetFingerBoneName(Finger, Joint)};
const FReferenceSkeleton& ReferenceSkeleton{GetHandRefSkeleton()};
const int32 BoneIndex = ReferenceSkeleton.FindBoneIndex(BoneName);
const uint32 Hash = TDefaultMapHashableKeyFuncs<FName, FTransform, false>::GetKeyHash(BoneName);
FTransform* Transform{Pimpl->InitialBonesTransforms.FindByHash(Hash, BoneName)};
if (!Transform)
{
return false;
}
ensureAlwaysMsgf(BoneIndex != INDEX_NONE, TEXT("Invalid virtual hand bone name '%s' or index!"),
*BoneName.ToString());
OutTransform = MoveTemp(*Transform);
return true;
const FTransform& BoneTransform{ReferenceSkeleton.GetRefBonePose()[BoneIndex]};
return BoneTransform;
}
bool ASGVirtualHand::GetInitialBoneRotation(const int32 Finger, const int32 Joint, FRotator& OutRotation) const
FRotator ASGVirtualHand::GetFingerBoneRefRotation(const int32 Finger, const int32 Joint) const
{
FTransform Transform;
if (!GetInitialBoneTransform(Finger, Joint, Transform))
{
return false;
}
OutRotation = Transform.GetRotation().Rotator();
return true;
const FTransform BoneTransform{GetFingerBoneRefTransform(Finger, Joint)};
FRotator BoneRotation{BoneTransform.GetRotation().Rotator()};
return MoveTemp(BoneRotation);
}
TMap<FName, FRotator> ASGVirtualHand::GetFingersBonesRotations()
@@ -413,13 +381,10 @@ TMap<FName, FRotator> ASGVirtualHand::GetFingersBonesRotations()
for (int32 JointIndex = 0; JointIndex < FingerJointAngles.Num(); ++JointIndex)
{
const FVector& FingerJointAngle{FingerJointAngles[JointIndex]};
FRotator InitialBoneRotation;
if (GetInitialBoneRotation(FingerIndex, JointIndex, InitialBoneRotation))
{
FName BoneName{GetFingerBoneName(FingerIndex, JointIndex)};
FRotator BoneRotation{(InitialBoneRotation.Vector() + FingerJointAngle).Rotation()};
Rotations.Emplace(MoveTemp(BoneName), MoveTemp(BoneRotation));
}
FRotator RefBoneRotation{GetFingerBoneRefRotation(FingerIndex, JointIndex)};
FName BoneName{GetFingerBoneName(FingerIndex, JointIndex)};
FRotator BoneRotation{(RefBoneRotation.Vector() + FingerJointAngle).Rotation()};
Rotations.Emplace(MoveTemp(BoneName), MoveTemp(BoneRotation));
}
}
@@ -433,16 +398,13 @@ ASGVirtualHand::FImpl::FImpl(ASGVirtualHand* InOwner)
ASGVirtualHand::FImpl::~FImpl() = default;
void ASGVirtualHand::FImpl::SetHandMesh(USkeletalMesh* VirtualHandMesh, const bool bReinitPos)
void ASGVirtualHand::FImpl::SetHandMesh(USkeletalMesh* VirtualHandMesh, const bool bReinitPos) const
{
ensureAlwaysMsgf(IsValid(VirtualHandMesh), TEXT("Invalid VirtualHandMesh object!"));
ensureAlwaysMsgf(IsValid(Owner->Mesh), TEXT("Invalid Mesh object!"));
ensureAlwaysMsgf(IsValid(Owner->AnimInstanceClass), TEXT("Invalid AnimInstanceClass object!"));
Owner->Mesh->SetSkeletalMesh(VirtualHandMesh, bReinitPos);
CacheInitialBonesTransforms();
Owner->Mesh->SetAnimInstanceClass(Owner->AnimInstanceClass);
}
@@ -526,21 +488,6 @@ void ASGVirtualHand::FImpl::SetDefaultMesh()
SetHandMesh(LoadDefaultMesh(), true);
}
void ASGVirtualHand::FImpl::CacheInitialBonesTransforms()
{
InitialBonesTransforms.Empty();
ensureAlwaysMsgf(IsValid(Owner->Mesh), TEXT("Invalid Mesh object!"));
const int32 NumBones = Owner->Mesh->GetNumBones();
for (int32 i = 0; i < NumBones; ++i)
{
const FName BoneName{Owner->Mesh->GetBoneName(i)};
FTransform BoneTransform{Owner->Mesh->GetSocketTransform(BoneName, RTS_ParentBoneSpace)};
InitialBonesTransforms.Emplace(BoneName, MoveTemp(BoneTransform));
}
}
bool ASGVirtualHand::FImpl::CheckGlove() const
{
const bool bGloveWasPresent = IsValid(Owner->Glove);
@@ -156,9 +156,6 @@ protected:
AnimInstanceClass = InAnimInstanceClass;
}
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaSeconds) override;
@@ -182,9 +179,8 @@ public:
public:
const FName& GetFingerBoneName(int32 Finger, int32 Joint) const;
const TMap<FName, FTransform>& GetInitialBonesTransforms() const;
bool GetInitialBoneTransform(int32 Finger, int32 Joint, FTransform& OutTransform) const;
bool GetInitialBoneRotation(int32 Finger, int32 Joint, FRotator& OutRotation) const;
const FTransform& GetFingerBoneRefTransform(int32 Finger, int32 Joint) const;
FRotator GetFingerBoneRefRotation(int32 Finger, int32 Joint) const;
TMap<FName, FRotator> GetFingersBonesRotations();
};