revert back the last commit and ignore the last joint

This commit is contained in:
Mamadou Babaei
2023-03-28 10:34:35 +02:00
parent 2b818dd11b
commit dafc7c0ad6
4 changed files with 82 additions and 164 deletions
@@ -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<FName, FRotator> 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<ASGVirtualHand>(GetOwningActor()));
if (!IsValid(Hand))
{
return;
}
const USGHandPose* HandPose = Hand->GetHandPose();
if (!IsValid(HandPose))
{
return;
}
TArray<TArray<FRotator>> JointRotations = HandPose->GetJointRotations();
int32 FingerIndex = 0;
for (const TArray<FRotator>& 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<FName, FRotator> USGVirtualHandAnimInstance::GetBoneMap() const
{
TMap<FName, FRotator> BoneMap;
if (Pimpl->BoneMap.Num() <= 0)
{
return MoveTemp(BoneMap);
}
for (const TTuple<FName, FRotator>& 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<TArray<FName>> 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<TArray<FName>> 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;
}
@@ -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<TArray<FName>> 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<TArray<FName>> 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<USGVirtualHandAnimInstance>(InAnimInstance);
if (!IsValid(VirtualHandAnimInstance))
if (!IsValid(InAnimInstance))
{
return;
}
BoneMap = VirtualHandAnimInstance->GetBoneMap();
ASGVirtualHand* Hand(Cast<ASGVirtualHand>(InAnimInstance->GetOwningActor()));
if (!IsValid(Hand))
{
return;
}
const USGHandPose* HandPose = Hand->GetHandPose();
if (!IsValid(HandPose))
{
return;
}
BoneMap.Empty();
const TArray<TArray<FRotator>> JointRotations = HandPose->GetJointRotations();
for (int32 FingerIndex = 0; FingerIndex < JointRotations.Num(); ++FingerIndex)
{
const TArray<FRotator>& 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;
}
@@ -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<FImpl, FImplDeleter> 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<FName, FRotator> GetBoneMap() const;
};
@@ -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<FName, FRotator> BoneMap;