From b8199b902c10ea4997f452f9de45a3dda89be18e Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Wed, 1 Mar 2023 23:01:47 +0100 Subject: [PATCH] rely on the reference pose instead of caching poses --- .../GameFramework/SGVirtualHand.cpp | 87 ++++--------------- .../SenseGlove/GameFramework/SGVirtualHand.h | 8 +- 2 files changed, 19 insertions(+), 76 deletions(-) diff --git a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGVirtualHand.cpp b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGVirtualHand.cpp index ea452793..f071f07e 100644 --- a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGVirtualHand.cpp +++ b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGVirtualHand.cpp @@ -79,12 +79,6 @@ struct ASGVirtualHand::FImpl return Path; } - /************************ - * Member variables - ************************/ - - TMap 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& 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::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 ASGVirtualHand::GetFingersBonesRotations() @@ -413,13 +381,10 @@ TMap 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); diff --git a/Source/SenseGlove/Public/SenseGlove/GameFramework/SGVirtualHand.h b/Source/SenseGlove/Public/SenseGlove/GameFramework/SGVirtualHand.h index bcab4444..6c88eee8 100644 --- a/Source/SenseGlove/Public/SenseGlove/GameFramework/SGVirtualHand.h +++ b/Source/SenseGlove/Public/SenseGlove/GameFramework/SGVirtualHand.h @@ -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& 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 GetFingersBonesRotations(); }; \ No newline at end of file