rely on the reference pose instead of caching poses
This commit is contained in:
@@ -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();
|
||||
};
|
||||
Reference in New Issue
Block a user