diff --git a/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstance.cpp b/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstance.cpp index 5db07f5c..0fe2e660 100644 --- a/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstance.cpp +++ b/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstance.cpp @@ -35,45 +35,6 @@ #include "SenseGlove/Animation/SGVirtualHandAnimInstance.h" -#include "SenseGlove/GameFramework/SGVirtualHand.h" -#include "SGCore/SGHandPose.h" - -struct USGVirtualHandAnimInstance::FImpl -{ - /************************ - * Static methods - ************************/ - - static const FName& GetLeftHandBoneName(int32 Finger, int32 Joint); - static const FName& GetRightHandBoneName(int32 Finger, int32 Joint); - - /************************ - * Member variables - ************************/ - - TMap BoneMap; - - /************************ - * Owner object - ************************/ - - USGVirtualHandAnimInstance* Owner; - - /************************ - * Constructor / Destructor - ************************/ - - explicit FImpl(USGVirtualHandAnimInstance* InOwner); - ~FImpl(); - - /************************ - * Default copy constructor & copy assignment operator - ************************/ - - FImpl(const FImpl& Rhs) = default; - FImpl& operator=(const FImpl& Rhs) = default; -}; - USGVirtualHandAnimInstance::USGVirtualHandAnimInstance(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { @@ -82,40 +43,6 @@ USGVirtualHandAnimInstance::USGVirtualHandAnimInstance(const FObjectInitializer& void USGVirtualHandAnimInstance::NativeInitializeAnimation() { Super::NativeInitializeAnimation(); - - ASGVirtualHand* Hand(Cast(GetOwningActor())); - if (!IsValid(Hand)) - { - return; - } - - const USGHandPose* HandPose = Hand->GetHandPose(); - if (!IsValid(HandPose)) - { - return; - } - - TArray> JointRotations = HandPose->GetJointRotations(); - int32 FingerIndex = 0; - - for (const TArray& FingerJointRotations: JointRotations) - { - int32 JointIndex = 0; - - for (FRotator JointRotation: FingerJointRotations) - { - FName BoneName(Hand->IsRight() - ? FImpl::GetRightHandBoneName(FingerIndex, JointIndex) - : FImpl::GetLeftHandBoneName(FingerIndex, JointIndex)); - - Pimpl->BoneMap.Empty(); - Pimpl->BoneMap.Emplace(MoveTemp(BoneName), MoveTemp(JointRotation)); - - ++JointIndex; - } - - ++FingerIndex; - } } void USGVirtualHandAnimInstance::NativeUpdateAnimation(const float DeltaSeconds) @@ -141,70 +68,4 @@ void USGVirtualHandAnimInstance::NativeBeginPlay() FSGVirtualHandAnimInstanceProxy* USGVirtualHandAnimInstance::CreateAnimInstanceProxy() { return new FSGVirtualHandAnimInstanceProxy(); -} - -TMap USGVirtualHandAnimInstance::GetBoneMap() const -{ - TMap BoneMap; - - if (Pimpl->BoneMap.Num() <= 0) - { - return MoveTemp(BoneMap); - } - - for (const TTuple& Bone: Pimpl->BoneMap) - { - FName BoneName(Bone.Key); - FRotator BoneRotation(Bone.Value); - - BoneMap.Emplace(MoveTemp(BoneName), MoveTemp(BoneRotation)); - } - - return MoveTemp(BoneMap); -} - -const FName& USGVirtualHandAnimInstance::FImpl::GetLeftHandBoneName(const int32 Finger, const int32 Joint) -{ - static const TArray> BoneNames{ - {FName(TEXT("thumb_01_l")), FName(TEXT("thumb_02_l")), FName(TEXT("thumb_03_l"))}, - {FName(TEXT("index_01_l")), FName(TEXT("index_02_l")), FName(TEXT("index_03_l"))}, - {FName(TEXT("middle_01_l")), FName(TEXT("middle_02_l")), FName(TEXT("middle_03_l"))}, - {FName(TEXT("ring_01_l")), FName(TEXT("ring_02_l")), FName(TEXT("ring_03_l"))}, - {FName(TEXT("pinky_01_l")), FName(TEXT("pinky_02_l")), FName(TEXT("pinky_03_l"))}, - }; - - ensureAlwaysMsgf(Finger < BoneNames.Num(), TEXT("Finger index is out of bound!")); - ensureAlwaysMsgf(Joint < BoneNames[Finger].Num(), TEXT("Joint index is out of bound!")); - - const FName& BoneName = BoneNames[Finger][Joint]; - return BoneName; -} - -const FName& USGVirtualHandAnimInstance::FImpl::GetRightHandBoneName(const int32 Finger, const int32 Joint) -{ - static const TArray> BoneNames{ - {FName(TEXT("thumb_01_r")), FName(TEXT("thumb_02_r")), FName(TEXT("thumb_03_r"))}, - {FName(TEXT("index_01_r")), FName(TEXT("index_02_r")), FName(TEXT("index_03_r"))}, - {FName(TEXT("middle_01_r")), FName(TEXT("middle_02_r")), FName(TEXT("middle_03_r"))}, - {FName(TEXT("ring_01_r")), FName(TEXT("ring_02_r")), FName(TEXT("ring_03_r"))}, - {FName(TEXT("pinky_01_r")), FName(TEXT("pinky_02_r")), FName(TEXT("pinky_03_r"))}, - }; - - ensureAlwaysMsgf(Finger < BoneNames.Num(), TEXT("Finger index is out of bound!")); - ensureAlwaysMsgf(Joint < BoneNames[Finger].Num(), TEXT("Joint index is out of bound!")); - - const FName& BoneName = BoneNames[Finger][Joint]; - return BoneName; -} - -USGVirtualHandAnimInstance::FImpl::FImpl(USGVirtualHandAnimInstance* InOwner) - : Owner(InOwner) -{ -} - -USGVirtualHandAnimInstance::FImpl::~FImpl() = default; - -void USGVirtualHandAnimInstance::FImplDeleter::operator()(const FImpl* P) const -{ - delete P; } \ No newline at end of file diff --git a/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.cpp b/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.cpp index 837af067..3cf94ab1 100644 --- a/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.cpp +++ b/Source/SenseGlove/Private/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.cpp @@ -44,7 +44,44 @@ #include "Engine/SkeletalMesh.h" #include "Math/Rotator.h" -#include "SenseGlove/Animation/SGVirtualHandAnimInstance.h" +#include "SenseGlove/GameFramework/SGVirtualHand.h" +#include "SGCore/SGHandPose.h" +#include "SGLog/SGLog.h" + +const FName& FSGVirtualHandAnimInstanceProxy::GetLeftHandBoneName(const int32 Finger, const int32 Joint) +{ + static const TArray> BoneNames{ + {FName(TEXT("thumb_01_l")), FName(TEXT("thumb_02_l")), FName(TEXT("thumb_03_l"))}, + {FName(TEXT("index_01_l")), FName(TEXT("index_02_l")), FName(TEXT("index_03_l"))}, + {FName(TEXT("middle_01_l")), FName(TEXT("middle_02_l")), FName(TEXT("middle_03_l"))}, + {FName(TEXT("ring_01_l")), FName(TEXT("ring_02_l")), FName(TEXT("ring_03_l"))}, + {FName(TEXT("pinky_01_l")), FName(TEXT("pinky_02_l")), FName(TEXT("pinky_03_l"))}, + }; + + ensureAlwaysMsgf(Finger < BoneNames.Num(), TEXT("Finger index is out of bound!")); + ensureAlwaysMsgf(Joint < BoneNames[Finger].Num(), TEXT("Joint index is out of bound!")); + + const FName& BoneName = BoneNames[Finger][Joint]; + return BoneName; +} + +const FName& FSGVirtualHandAnimInstanceProxy::GetRightHandBoneName(const int32 Finger, const int32 Joint) +{ + static const TArray> BoneNames{ + {FName(TEXT("thumb_01_r")), FName(TEXT("thumb_02_r")), FName(TEXT("thumb_03_r"))}, + {FName(TEXT("index_01_r")), FName(TEXT("index_02_r")), FName(TEXT("index_03_r"))}, + {FName(TEXT("middle_01_r")), FName(TEXT("middle_02_r")), FName(TEXT("middle_03_r"))}, + {FName(TEXT("ring_01_r")), FName(TEXT("ring_02_r")), FName(TEXT("ring_03_r"))}, + {FName(TEXT("pinky_01_r")), FName(TEXT("pinky_02_r")), FName(TEXT("pinky_03_r"))}, + }; + + ensureAlwaysMsgf(Finger < BoneNames.Num(), TEXT("Finger index is out of bound!")); + ensureAlwaysMsgf(Joint < BoneNames[Finger].Num(), TEXT("Joint index is out of bound!")); + + const FName& BoneName = BoneNames[Finger][Joint]; + return BoneName; +} + FSGVirtualHandAnimInstanceProxy::FSGVirtualHandAnimInstanceProxy() : FAnimInstanceProxy() @@ -80,18 +117,54 @@ void FSGVirtualHandAnimInstanceProxy::PreEvaluateAnimation(UAnimInstance* InAnim { FAnimInstanceProxy::PreEvaluateAnimation(InAnimInstance); - const USGVirtualHandAnimInstance* VirtualHandAnimInstance = Cast(InAnimInstance); - if (!IsValid(VirtualHandAnimInstance)) + if (!IsValid(InAnimInstance)) { return; } - BoneMap = VirtualHandAnimInstance->GetBoneMap(); + ASGVirtualHand* Hand(Cast(InAnimInstance->GetOwningActor())); + if (!IsValid(Hand)) + { + return; + } + + const USGHandPose* HandPose = Hand->GetHandPose(); + if (!IsValid(HandPose)) + { + return; + } + + BoneMap.Empty(); + + const TArray> JointRotations = HandPose->GetJointRotations(); + + for (int32 FingerIndex = 0; FingerIndex < JointRotations.Num(); ++FingerIndex) + { + const TArray& FingerJointRotations = JointRotations[FingerIndex]; + + for (int32 JointIndex = 0; JointIndex < FingerJointRotations.Num(); ++JointIndex) + { + // FIXME ? + // Ignore the 4th joint. + if (JointIndex >= 3) + { + continue; + } + + FRotator JointRotation = FingerJointRotations[JointIndex]; + + FName BoneName(Hand->IsRight() + ? GetRightHandBoneName(FingerIndex, JointIndex) + : GetLeftHandBoneName(FingerIndex, JointIndex)); + + BoneMap.Emplace(MoveTemp(BoneName), MoveTemp(JointRotation)); + } + } } bool FSGVirtualHandAnimInstanceProxy::Evaluate(FPoseContext& Output) { - USkeletalMeshComponent* HandMeshComponent = GetSkelMeshComponent(); + const USkeletalMeshComponent* HandMeshComponent = GetSkelMeshComponent(); if (!IsValid(HandMeshComponent)) { return FAnimInstanceProxy::Evaluate(Output); @@ -145,8 +218,6 @@ bool FSGVirtualHandAnimInstanceProxy::Evaluate(FPoseContext& Output) } } - HandMeshComponent->MarkRenderStateDirty(); - return true; } diff --git a/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstance.h b/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstance.h index e7b12f6a..c4a68c8a 100644 --- a/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstance.h +++ b/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstance.h @@ -36,10 +36,6 @@ #pragma once #include "Animation/AnimInstance.h" -#include "Containers/Map.h" -#include "Math/Rotator.h" -#include "Templates/UniquePtr.h" -#include "UObject/NameTypes.h" #include "SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.h" @@ -50,17 +46,6 @@ class SENSEGLOVE_API USGVirtualHandAnimInstance : public UAnimInstance { GENERATED_UCLASS_BODY() -private: - struct FImpl; - - struct FImplDeleter - { - void operator()(const FImpl* P) const; - }; - - TUniquePtr Pimpl; - FImplDeleter PimplDeleter; - public: // the below functions are the native overrides for each phase // Native initialization override point @@ -81,7 +66,4 @@ public: protected: virtual FSGVirtualHandAnimInstanceProxy* CreateAnimInstanceProxy() override; - -public: - TMap GetBoneMap() const; }; \ No newline at end of file diff --git a/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.h b/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.h index 710ff117..2b3150e1 100644 --- a/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.h +++ b/Source/SenseGlove/Public/SenseGlove/Animation/SGVirtualHandAnimInstanceProxy.h @@ -46,6 +46,10 @@ struct SENSEGLOVE_API FSGVirtualHandAnimInstanceProxy : public FAnimInstanceProx { GENERATED_USTRUCT_BODY() +public: + static const FName& GetLeftHandBoneName(int32 Finger, int32 Joint); + static const FName& GetRightHandBoneName(int32 Finger, int32 Joint); + public: TMap BoneMap;