translate senseglove/unreal angles/directions

This commit is contained in:
Mamadou Babaei
2022-11-16 18:49:33 +01:00
parent 3ac545911e
commit dfd08a746e
15 changed files with 283 additions and 98 deletions
@@ -39,6 +39,7 @@
#include "SGBuildHacks/SGInclude_Core_Vect3D.h" #include "SGBuildHacks/SGInclude_Core_Vect3D.h"
#include "SGCoreImpl/SGVect3DImpl.h" #include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h" #include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
float FSGAnatomyImpl::GetTotalFingerFlexion() float FSGAnatomyImpl::GetTotalFingerFlexion()
{ {
@@ -63,13 +64,15 @@ float FSGAnatomyImpl::GetTotalThumbExtension()
float FSGAnatomyImpl::GetFingerJointLimit( float FSGAnatomyImpl::GetFingerJointLimit(
const bool bRightHanded, const int32 Joint, const int32 Movement, const bool bMax) const bool bRightHanded, const int32 Joint, const int32 Movement, const bool bMax)
{ {
return FAnatomyType::GetFingerJointLimit(bRightHanded, Joint, Movement, bMax); return FSGCoordinates::TransformToUnreal(
Movement, FAnatomyType::GetFingerJointLimit(bRightHanded, Joint, Movement, bMax));
} }
float FSGAnatomyImpl::GetThumbJointLimit( float FSGAnatomyImpl::GetThumbJointLimit(
const bool bRightHanded, const int32 Joint, const int32 Movement, const bool bMax) const bool bRightHanded, const int32 Joint, const int32 Movement, const bool bMax)
{ {
return FAnatomyType::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax); return FSGCoordinates::TransformToUnreal(
Movement, FAnatomyType::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax));
} }
float FSGAnatomyImpl::NormalizeFingerFlexion(const float FlexionInRadians) float FSGAnatomyImpl::NormalizeFingerFlexion(const float FlexionInRadians)
@@ -85,35 +88,35 @@ float FSGAnatomyImpl::NormalizeThumbFlexion(const float FlexionInRadians)
TArray<TArray<FVector>> FSGAnatomyImpl::GetDefaultHandAngles(const bool bRightHanded) TArray<TArray<FVector>> FSGAnatomyImpl::GetDefaultHandAngles(const bool bRightHanded)
{ {
TArray<TArray<FVector>> DefaultHandAngles{ TArray<TArray<FVector>> DefaultHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetDefaultHandAngles(bRightHanded)) FAnatomyType::GetDefaultHandAngles(bRightHanded))
}; };
return DefaultHandAngles; return MoveTemp(DefaultHandAngles);
} }
TArray<TArray<FVector>> FSGAnatomyImpl::GetFlatHandAngles(const bool bRightHanded) TArray<TArray<FVector>> FSGAnatomyImpl::GetFlatHandAngles(const bool bRightHanded)
{ {
TArray<TArray<FVector>> FlatHandAngles{ TArray<TArray<FVector>> FlatHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetFlatHandAngles(bRightHanded)) FAnatomyType::GetFlatHandAngles(bRightHanded))
}; };
return FlatHandAngles; return MoveTemp(FlatHandAngles);
} }
TArray<TArray<FVector>> FSGAnatomyImpl::GetThumbsUpHandAngles(const bool bRightHanded) TArray<TArray<FVector>> FSGAnatomyImpl::GetThumbsUpHandAngles(const bool bRightHanded)
{ {
TArray<TArray<FVector>> ThumbsUpHandAngles{ TArray<TArray<FVector>> ThumbsUpHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetThumbsUpHandAngles(bRightHanded)) FAnatomyType::GetThumbsUpHandAngles(bRightHanded))
}; };
return ThumbsUpHandAngles; return MoveTemp(ThumbsUpHandAngles);
} }
TArray<TArray<FVector>> FSGAnatomyImpl::GetFistHandAngles(const bool bRightHanded) TArray<TArray<FVector>> FSGAnatomyImpl::GetFistHandAngles(const bool bRightHanded)
{ {
TArray<TArray<FVector>> FistHandAngles{ TArray<TArray<FVector>> FistHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetFistHandAngles(bRightHanded)) FAnatomyType::GetFistHandAngles(bRightHanded))
}; };
return FistHandAngles; return MoveTemp(FistHandAngles);
} }
@@ -49,6 +49,7 @@
#include "SGCoreImpl/SGQuatImpl.h" #include "SGCoreImpl/SGQuatImpl.h"
#include "SGCoreImpl/SGVect3DImpl.h" #include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h" #include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
struct FSGHandInterpolatorImpl::FImpl struct FSGHandInterpolatorImpl::FImpl
{ {
@@ -81,53 +82,53 @@ struct FSGHandInterpolatorImpl::FImpl
FSGHandInterpolatorImpl FSGHandInterpolatorImpl::Default(const bool bRightHanded) FSGHandInterpolatorImpl FSGHandInterpolatorImpl::Default(const bool bRightHanded)
{ {
const FSGHandInterpolatorImpl HandInterpolatorImpl(FHandInterpolatorType::Default(bRightHanded)); FSGHandInterpolatorImpl HandInterpolatorImpl(FHandInterpolatorType::Default(bRightHanded));
return HandInterpolatorImpl; return MoveTemp(HandInterpolatorImpl);
} }
FSGHandInterpolatorImpl FSGHandInterpolatorImpl::Deserialize(const FString& SerializedString) FSGHandInterpolatorImpl FSGHandInterpolatorImpl::Deserialize(const FString& SerializedString)
{ {
std::string Serialized(TCHAR_TO_UTF8(*SerializedString)); std::string Serialized(TCHAR_TO_UTF8(*SerializedString));
const FSGHandInterpolatorImpl GlovePose(FHandInterpolatorType::Deserialize(MoveTemp(Serialized))); FSGHandInterpolatorImpl GlovePose(FHandInterpolatorType::Deserialize(MoveTemp(Serialized)));
return GlovePose; return MoveTemp(GlovePose);
} }
TArray<FVector> FSGHandInterpolatorImpl::InterpolateFingerAngles( TArray<FVector> FSGHandInterpolatorImpl::InterpolateFingerAngles(
ESGFinger Finger, const FSGHandInterpolatorImpl& Interpolator, const FVector& TotalGloveAngles) const ESGFinger Finger, const FSGHandInterpolatorImpl& Interpolator, const FVector& TotalGloveAngles)
{ {
const TArray<FVector> Angles{ TArray<FVector> Angles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FHandInterpolatorType::InterpolateFingerAngles( FHandInterpolatorType::InterpolateFingerAngles(
FSGCoreEnumCast::ToEFinger(Finger), Interpolator.ToHandInterpolator(), FSGCoreEnumCast::ToEFinger(Finger), Interpolator.ToHandInterpolator(),
FSGVect3DImpl(TotalGloveAngles).ToVect3D())) FSGCoordinates::TransformToSenseGlove<FSGVect3DImpl::FVect3DType>(TotalGloveAngles)))
}; };
return Angles; return MoveTemp(Angles);
} }
TArray<FVector> FSGHandInterpolatorImpl::InterpolateThumbAngles(const FSGHandInterpolatorImpl& Interpolator, TArray<FVector> FSGHandInterpolatorImpl::InterpolateThumbAngles(const FSGHandInterpolatorImpl& Interpolator,
const FVector& TotalGloveAngles) const FVector& TotalGloveAngles)
{ {
const TArray<FVector> Angles{ TArray<FVector> Angles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FHandInterpolatorType::InterpolateThumbAngles( FHandInterpolatorType::InterpolateThumbAngles(
Interpolator.ToHandInterpolator(), FSGVect3DImpl(TotalGloveAngles).ToVect3D())) Interpolator.ToHandInterpolator(),
FSGCoordinates::TransformToSenseGlove<FSGVect3DImpl::FVect3DType>(TotalGloveAngles)))
}; };
return Angles; return MoveTemp(Angles);
} }
TArray<TArray<FVector>> FSGHandInterpolatorImpl::InterpolateHandAngles(const FSGHandInterpolatorImpl& Interpolator, TArray<TArray<FVector>> FSGHandInterpolatorImpl::InterpolateHandAngles(const FSGHandInterpolatorImpl& Interpolator,
const TArray<FVector>& TotalAngles) const TArray<FVector>& TotalAngles)
{ {
std::vector<FSGVect3DImpl::FVect3DType> TotalAnglesVector{ std::vector<FSGVect3DImpl::FVect3DType> TotalAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(TotalAngles)
TotalAngles)
}; };
const TArray<TArray<FVector>> Angles{ TArray<TArray<FVector>> Angles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FHandInterpolatorType::InterpolateHandAngles( FHandInterpolatorType::InterpolateHandAngles(
Interpolator.ToHandInterpolator(), MoveTemp(TotalAnglesVector))) Interpolator.ToHandInterpolator(), MoveTemp(TotalAnglesVector)))
}; };
return Angles; return MoveTemp(Angles);
} }
FSGHandInterpolatorImpl::FSGHandInterpolatorImpl() FSGHandInterpolatorImpl::FSGHandInterpolatorImpl()
@@ -242,28 +243,33 @@ void FSGHandInterpolatorImpl::SetCmcStartRotation(const FQuat& CmcStartRotation)
float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const int32 Movement, const float Value) const float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const int32 Movement, const float Value) const
{ {
return Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger), Movement, Value); return FSGCoordinates::TransformToUnreal(
Movement, Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger), Movement, Value));
} }
float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const ESGFingerMovement Movement, float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const ESGFingerMovement Movement,
const float Value) const const float Value) const
{ {
return Pimpl->HandInterpolator.CalculateAngle( return FSGCoordinates::TransformToUnreal(
FSGCoreEnumCast::ToEFinger(Finger), FSGCoreEnumCast::ToEFingerMovement(Movement), Value); Movement, Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger),
FSGCoreEnumCast::ToEFingerMovement(Movement), Value));
} }
float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const ESGThumbMovement Movement, float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const ESGThumbMovement Movement,
const float Value) const const float Value) const
{ {
return Pimpl->HandInterpolator.CalculateAngle( return FSGCoordinates::TransformToUnreal(
FSGCoreEnumCast::ToEFinger(Finger), FSGCoreEnumCast::ToEThumbMovement(Movement), Value); Movement, Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger),
FSGCoreEnumCast::ToEThumbMovement(Movement), Value));
} }
void FSGHandInterpolatorImpl::SetInterpolation( void FSGHandInterpolatorImpl::SetInterpolation(
const int32 Finger, const int32 Movement, const int32 Finger, const int32 Movement,
const float InputAt0, const float InputAt1, const float AngleAt0, const float AngleAt1) const float InputAt0, const float InputAt1, const float AngleAt0, const float AngleAt1)
{ {
Pimpl->HandInterpolator.SetInterpolation(Finger, Movement, InputAt0, InputAt1, AngleAt0, AngleAt1); Pimpl->HandInterpolator.SetInterpolation(Finger, Movement, InputAt0, InputAt1,
FSGCoordinates::TransformToUnreal(Movement, AngleAt0),
FSGCoordinates::TransformToUnreal(Movement, AngleAt1));
} }
void FSGHandInterpolatorImpl::SetInterpolation( void FSGHandInterpolatorImpl::SetInterpolation(
@@ -272,7 +278,9 @@ void FSGHandInterpolatorImpl::SetInterpolation(
{ {
Pimpl->HandInterpolator.SetInterpolation( Pimpl->HandInterpolator.SetInterpolation(
FSGCoreEnumCast::ToEFinger(Finger), FSGCoreEnumCast::ToEFingerMovement(Movement), FSGCoreEnumCast::ToEFinger(Finger), FSGCoreEnumCast::ToEFingerMovement(Movement),
InputAt0, InputAt1, AngleAt0, AngleAt1); InputAt0, InputAt1,
FSGCoordinates::TransformToUnreal(Movement, AngleAt0),
FSGCoordinates::TransformToUnreal(Movement, AngleAt1));
} }
void FSGHandInterpolatorImpl::SetInterpolation( void FSGHandInterpolatorImpl::SetInterpolation(
@@ -280,7 +288,9 @@ void FSGHandInterpolatorImpl::SetInterpolation(
const float InputAt0, const float InputAt1, const float AngleAt0, const float AngleAt1) const float InputAt0, const float InputAt1, const float AngleAt0, const float AngleAt1)
{ {
Pimpl->HandInterpolator.SetInterpolation(FSGCoreEnumCast::ToEThumbMovement(Movement), Pimpl->HandInterpolator.SetInterpolation(FSGCoreEnumCast::ToEThumbMovement(Movement),
InputAt0, InputAt1, AngleAt0, AngleAt1); InputAt0, InputAt1,
FSGCoordinates::TransformToUnreal(Movement, AngleAt0),
FSGCoordinates::TransformToUnreal(Movement, AngleAt1));
} }
FSGInterpolationSetImpl FSGHandInterpolatorImpl::GetInterpolation(const int32 Finger, const int32 Movement) const FSGInterpolationSetImpl FSGHandInterpolatorImpl::GetInterpolation(const int32 Finger, const int32 Movement) const
@@ -48,6 +48,7 @@
#include "SGCoreImpl/SGQuatImpl.h" #include "SGCoreImpl/SGQuatImpl.h"
#include "SGCoreImpl/SGVect3DImpl.h" #include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h" #include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
struct FSGHandPoseImpl::FImpl struct FSGHandPoseImpl::FImpl
{ {
@@ -89,8 +90,7 @@ FSGHandPoseImpl FSGHandPoseImpl::FromHandAngles(const TArray<TArray<FVector>>& H
const FSGBasicHandModelImpl& HandDimensions) const FSGBasicHandModelImpl& HandDimensions)
{ {
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
HandAngles)
}; };
return FSGHandPoseImpl(FHandPoseType::FromHandAngles( return FSGHandPoseImpl(FHandPoseType::FromHandAngles(
MoveTemp(HandAnglesVector), bRightHanded, HandDimensions.ToBasicHandModel())); MoveTemp(HandAnglesVector), bRightHanded, HandDimensions.ToBasicHandModel()));
@@ -99,8 +99,7 @@ FSGHandPoseImpl FSGHandPoseImpl::FromHandAngles(const TArray<TArray<FVector>>& H
FSGHandPoseImpl FSGHandPoseImpl::FromHandAngles(const TArray<TArray<FVector>>& HandAngles, const bool bRightHanded) FSGHandPoseImpl FSGHandPoseImpl::FromHandAngles(const TArray<TArray<FVector>>& HandAngles, const bool bRightHanded)
{ {
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
HandAngles)
}; };
return FSGHandPoseImpl(FHandPoseType::FromHandAngles(MoveTemp(HandAnglesVector), bRightHanded)); return FSGHandPoseImpl(FHandPoseType::FromHandAngles(MoveTemp(HandAnglesVector), bRightHanded));
} }
@@ -173,8 +172,7 @@ FSGHandPoseImpl::FSGHandPoseImpl(const bool bRightHanded, const TArray<TArray<FV
}; };
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
HandAngles)
}; };
Pimpl->HandPose = FHandPoseType( Pimpl->HandPose = FHandPoseType(
@@ -271,8 +269,7 @@ void FSGHandPoseImpl::SetJointRotations(const TArray<TArray<FQuat>>& JointRotati
TArray<TArray<FVector>> FSGHandPoseImpl::GetHandAngles() const TArray<TArray<FVector>> FSGHandPoseImpl::GetHandAngles() const
{ {
TArray<TArray<FVector>> HandAngles{ TArray<TArray<FVector>> HandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(Pimpl->HandPose.GetHandAngles())
Pimpl->HandPose.GetHandAngles())
}; };
return MoveTemp(HandAngles); return MoveTemp(HandAngles);
} }
@@ -280,8 +277,7 @@ TArray<TArray<FVector>> FSGHandPoseImpl::GetHandAngles() const
void FSGHandPoseImpl::SetHandAngles(const TArray<TArray<FVector>>& HandAngles) const void FSGHandPoseImpl::SetHandAngles(const TArray<TArray<FVector>>& HandAngles) const
{ {
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
HandAngles)
}; };
Pimpl->HandPose.SetHandAngles(MoveTemp(HandAnglesVector)); Pimpl->HandPose.SetHandAngles(MoveTemp(HandAnglesVector));
} }
@@ -46,6 +46,7 @@
#include "SGCoreImpl/SGSensorRangeImpl.h" #include "SGCoreImpl/SGSensorRangeImpl.h"
#include "SGCoreImpl/SGVect3DImpl.h" #include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h" #include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
struct FSGHapticGloveCalibrationCheckImpl::FImpl struct FSGHapticGloveCalibrationCheckImpl::FImpl
{ {
@@ -88,6 +89,8 @@ float FSGHapticGloveCalibrationCheckImpl::GetNovaGloveThreshold()
float FSGHapticGloveCalibrationCheckImpl::GetSenseGloveMinFlexion() float FSGHapticGloveCalibrationCheckImpl::GetSenseGloveMinFlexion()
{ {
/// TODO
/// Though flexion should not be translated, should we still call the translation function?
return FHapticGloveCalibrationCheckType::GetSenseGloveMinFlexion(); return FHapticGloveCalibrationCheckType::GetSenseGloveMinFlexion();
} }
@@ -98,11 +101,15 @@ float FSGHapticGloveCalibrationCheckImpl::GetNovaGloveMinFlexion()
float FSGHapticGloveCalibrationCheckImpl::GetSenseGloveMinAbduction() float FSGHapticGloveCalibrationCheckImpl::GetSenseGloveMinAbduction()
{ {
return FHapticGloveCalibrationCheckType::GetSenseGloveMinAbduction(); /// TODO
/// Maybe use enums?
return FSGCoordinates::TransformToUnreal(2, FHapticGloveCalibrationCheckType::GetSenseGloveMinAbduction());
} }
float FSGHapticGloveCalibrationCheckImpl::GetNovaGloveMinAbduction() float FSGHapticGloveCalibrationCheckImpl::GetNovaGloveMinAbduction()
{ {
/// NOTE
/// Nova abduction translation is redundant.
return FHapticGloveCalibrationCheckType::GetNovaGloveMinAbduction(); return FHapticGloveCalibrationCheckType::GetNovaGloveMinAbduction();
} }
@@ -57,8 +57,7 @@ bool FSGJointKinematicsImpl::ForwardKinematics(const FVector& StartPosition, con
}; };
std::vector<FSGVect3DImpl::FVect3DType> JointAnglesVector{ std::vector<FSGVect3DImpl::FVect3DType> JointAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(JointAngles)
JointAngles)
}; };
std::vector<FSGVect3DImpl::FVect3DType> NewPositions; std::vector<FSGVect3DImpl::FVect3DType> NewPositions;
@@ -81,8 +80,7 @@ bool FSGJointKinematicsImpl::ForwardKinematics(const FSGBasicHandModelImpl& Prof
TArray<FVector>& OutNewPositions, TArray<FQuat>& OutNewRotations) TArray<FVector>& OutNewPositions, TArray<FQuat>& OutNewRotations)
{ {
std::vector<FSGVect3DImpl::FVect3DType> JointAnglesVector{ std::vector<FSGVect3DImpl::FVect3DType> JointAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(JointAngles)
JointAngles)
}; };
std::vector<FSGVect3DImpl::FVect3DType> NewPositions; std::vector<FSGVect3DImpl::FVect3DType> NewPositions;
@@ -77,13 +77,11 @@ void FSGNovaGloveCalibrationImpl::ApplyInterpolationValues(const TArray<FVector>
}; };
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> RetractedAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> RetractedAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(RetractedAngles)
RetractedAngles)
}; };
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> ExtendedAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> ExtendedAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(ExtendedAngles)
ExtendedAngles)
}; };
FNovaGloveCalibrationType::ApplyInterpolationValues( FNovaGloveCalibrationType::ApplyInterpolationValues(
@@ -246,7 +246,7 @@ FSGNovaGloveImpl::FSGNovaGloveImpl()
{ {
} }
FSGNovaGloveImpl::FSGNovaGloveImpl(const FSGNovaGloveInfoImpl DeviceInfo) FSGNovaGloveImpl::FSGNovaGloveImpl(const FSGNovaGloveInfoImpl& DeviceInfo)
: FSGHapticGloveImpl(FSGNovaGloveImpl(std::make_shared<FNovaGloveType>((DeviceInfo.ToNovaGloveInfo())))), : FSGHapticGloveImpl(FSGNovaGloveImpl(std::make_shared<FNovaGloveType>((DeviceInfo.ToNovaGloveInfo())))),
#if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 22 ) #if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 22 )
Pimpl(TUniquePtr<FImpl, FImplDeleter>(new FImpl{this}, PimplDeleter)) Pimpl(TUniquePtr<FImpl, FImplDeleter>(new FImpl{this}, PimplDeleter))
@@ -119,8 +119,7 @@ FSGSenseGlovePoseImpl FSGSenseGloveImpl::CalculateGlovePose(const TArray<TArray<
const FSGSenseGloveInfoImpl& GloveModel) const FSGSenseGloveInfoImpl& GloveModel)
{ {
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> GloveAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> GloveAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(GloveAngles)
GloveAngles)
}; };
FSGSenseGlovePoseImpl Pose{ FSGSenseGlovePoseImpl Pose{
FSenseGloveType::CalculateGlovePose(MoveTemp(GloveAnglesVector), GloveModel.ToSenseGloveInfo()) FSenseGloveType::CalculateGlovePose(MoveTemp(GloveAnglesVector), GloveModel.ToSenseGloveInfo())
@@ -352,9 +352,13 @@ TArray<FVector> FSGSenseGloveInfoImpl::GetGloveLengths(const ESGFinger Finger) c
TArray<TArray<FVector>> FSGSenseGloveInfoImpl::ToGloveAngles(const TArray<TArray<float>>& SensorAngles) const TArray<TArray<FVector>> FSGSenseGloveInfoImpl::ToGloveAngles(const TArray<TArray<float>>& SensorAngles) const
{ {
std::vector<std::vector<float>> SensorAnglesVector{FSGArrayUtils::ToStdVector<float>(SensorAngles)}; /// TODO
/// Does the nested float TArray requires translation? If so, how to do that without a Movement value?
std::vector<std::vector<float>> SensorAnglesVector{
FSGArrayUtils::ToStdVector<float>(SensorAngles)
};
TArray<TArray<FVector>> GloveAngles{ TArray<TArray<FVector>> GloveAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
Pimpl->SenseGloveInfo.ToGloveAngles(MoveTemp((SensorAnglesVector)))) Pimpl->SenseGloveInfo.ToGloveAngles(MoveTemp((SensorAnglesVector))))
}; };
return MoveTemp(GloveAngles); return MoveTemp(GloveAngles);
@@ -81,15 +81,15 @@ struct FSGSenseGlovePoseImpl::FImpl
FSGSenseGlovePoseImpl FSGSenseGlovePoseImpl::IdlePose(const FSGSenseGloveInfoImpl& GloveInfo) FSGSenseGlovePoseImpl FSGSenseGlovePoseImpl::IdlePose(const FSGSenseGloveInfoImpl& GloveInfo)
{ {
const FSGSenseGlovePoseImpl GlovePoseImpl(FSenseGlovePoseType::IdlePose(GloveInfo.ToSenseGloveInfo())); FSGSenseGlovePoseImpl GlovePoseImpl(FSenseGlovePoseType::IdlePose(GloveInfo.ToSenseGloveInfo()));
return GlovePoseImpl; return MoveTemp(GlovePoseImpl);
} }
FSGSenseGlovePoseImpl FSGSenseGlovePoseImpl::Deserialize(const FString& SerializedString) FSGSenseGlovePoseImpl FSGSenseGlovePoseImpl::Deserialize(const FString& SerializedString)
{ {
std::string Serialized(TCHAR_TO_UTF8(*SerializedString)); std::string Serialized(TCHAR_TO_UTF8(*SerializedString));
const FSGSenseGlovePoseImpl GlovePose(FSenseGlovePoseType::Deserialize(MoveTemp(Serialized))); FSGSenseGlovePoseImpl GlovePose(FSenseGlovePoseType::Deserialize(MoveTemp(Serialized)));
return GlovePose; return MoveTemp(GlovePose);
} }
FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl() FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl()
@@ -102,7 +102,7 @@ FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl()
{ {
} }
FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl(bool bRightHanded, const TArray<TArray<FVector>>& JointPositions, FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl(const bool bRightHanded, const TArray<TArray<FVector>>& JointPositions,
const TArray<TArray<FQuat>>& JointRotations, const TArray<TArray<FQuat>>& JointRotations,
const TArray<TArray<FVector>>& GloveAngles) const TArray<TArray<FVector>>& GloveAngles)
: :
@@ -116,12 +116,10 @@ FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl(bool bRightHanded, const TArray<TAr
FSGArrayUtils::ToMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(JointPositions) FSGArrayUtils::ToMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(JointPositions)
}; };
std::vector<std::vector<FSGQuatImpl::FQuatType>> JointRotationsVector{ std::vector<std::vector<FSGQuatImpl::FQuatType>> JointRotationsVector{
FSGArrayUtils::ToStdVector<FQuat, FSGQuatImpl::FQuatType, FSGQuatImpl, &FSGQuatImpl::ToQuat>( FSGArrayUtils::ToStdVector<FQuat, FSGQuatImpl::FQuatType, FSGQuatImpl, &FSGQuatImpl::ToQuat>(JointRotations)
JointRotations)
}; };
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> GloveAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> GloveAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(GloveAngles)
GloveAngles)
}; };
Pimpl->SenseGlovePose = FSenseGlovePoseType(bRightHanded, Pimpl->SenseGlovePose = FSenseGlovePoseType(bRightHanded,
@@ -182,11 +180,11 @@ void FSGSenseGlovePoseImpl::SetIsRight(const bool bRightHanded) const
TArray<TArray<FVector>> FSGSenseGlovePoseImpl::GetJointPositions() const TArray<TArray<FVector>> FSGSenseGlovePoseImpl::GetJointPositions() const
{ {
const TArray<TArray<FVector>> JointPositions{ TArray<TArray<FVector>> JointPositions{
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>( FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.GetJointPositions()) Pimpl->SenseGlovePose.GetJointPositions())
}; };
return JointPositions; return MoveTemp(JointPositions);
} }
void FSGSenseGlovePoseImpl::SetJointPositions(const TArray<TArray<FVector>>& JointPositions) const void FSGSenseGlovePoseImpl::SetJointPositions(const TArray<TArray<FVector>>& JointPositions) const
@@ -199,11 +197,11 @@ void FSGSenseGlovePoseImpl::SetJointPositions(const TArray<TArray<FVector>>& Joi
TArray<TArray<FQuat>> FSGSenseGlovePoseImpl::GetJointRotations() const TArray<TArray<FQuat>> FSGSenseGlovePoseImpl::GetJointRotations() const
{ {
const TArray<TArray<FQuat>> JointRotations{ TArray<TArray<FQuat>> JointRotations{
FSGArrayUtils::FromStdVector<FSGQuatImpl::FQuatType, FQuat, FSGQuatImpl, &FSGQuatImpl::ToFQuat>( FSGArrayUtils::FromStdVector<FSGQuatImpl::FQuatType, FQuat, FSGQuatImpl, &FSGQuatImpl::ToFQuat>(
Pimpl->SenseGlovePose.GetJointRotations()) Pimpl->SenseGlovePose.GetJointRotations())
}; };
return JointRotations; return MoveTemp(JointRotations);
} }
void FSGSenseGlovePoseImpl::SetJointRotations(const TArray<TArray<FQuat>>& JointRotations) const void FSGSenseGlovePoseImpl::SetJointRotations(const TArray<TArray<FQuat>>& JointRotations) const
@@ -217,17 +215,17 @@ void FSGSenseGlovePoseImpl::SetJointRotations(const TArray<TArray<FQuat>>& Joint
TArray<TArray<FVector>> FSGSenseGlovePoseImpl::GetGloveAngles() const TArray<TArray<FVector>> FSGSenseGlovePoseImpl::GetGloveAngles() const
{ {
const TArray<TArray<FVector>> GloveAngles{ TArray<TArray<FVector>> GloveAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
Pimpl->SenseGlovePose.GetGloveAngles()) Pimpl->SenseGlovePose.GetGloveAngles())
}; };
return GloveAngles; return MoveTemp(GloveAngles);
} }
void FSGSenseGlovePoseImpl::SetGloveAngles(const TArray<TArray<FVector>>& GloveAngles) const void FSGSenseGlovePoseImpl::SetGloveAngles(const TArray<TArray<FVector>>& GloveAngles) const
{ {
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{ std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>( FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
GloveAngles) GloveAngles)
}; };
Pimpl->SenseGlovePose.SetGloveAngles(MoveTemp(HandAnglesVector)); Pimpl->SenseGlovePose.SetGloveAngles(MoveTemp(HandAnglesVector));
@@ -235,39 +233,38 @@ void FSGSenseGlovePoseImpl::SetGloveAngles(const TArray<TArray<FVector>>& GloveA
TArray<FVector> FSGSenseGlovePoseImpl::GetThimblePositions() const TArray<FVector> FSGSenseGlovePoseImpl::GetThimblePositions() const
{ {
const TArray<FVector> ThimblePositions{ TArray<FVector> ThimblePositions{
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>( FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.GetThimblePositions()) Pimpl->SenseGlovePose.GetThimblePositions())
}; };
return ThimblePositions; return MoveTemp(ThimblePositions);
} }
TArray<FQuat> FSGSenseGlovePoseImpl::GetThimbleRotations() const TArray<FQuat> FSGSenseGlovePoseImpl::GetThimbleRotations() const
{ {
const TArray<FQuat> ThimbleRotations{ TArray<FQuat> ThimbleRotations{
FSGArrayUtils::FromStdVector<FSGQuatImpl::FQuatType, FQuat, FSGQuatImpl, &FSGQuatImpl::ToFQuat>( FSGArrayUtils::FromStdVector<FSGQuatImpl::FQuatType, FQuat, FSGQuatImpl, &FSGQuatImpl::ToFQuat>(
Pimpl->SenseGlovePose.GetThimbleRotations()) Pimpl->SenseGlovePose.GetThimbleRotations())
}; };
return ThimbleRotations; return MoveTemp(ThimbleRotations);
} }
TArray<FVector> FSGSenseGlovePoseImpl::GetTotalGloveAngles() const TArray<FVector> FSGSenseGlovePoseImpl::GetTotalGloveAngles() const
{ {
const TArray<FVector> TotalGloveAngles{ TArray<FVector> TotalGloveAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>( FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(Pimpl->SenseGlovePose.GetTotalGloveAngles())
Pimpl->SenseGlovePose.GetTotalGloveAngles())
}; };
return TotalGloveAngles; return MoveTemp(TotalGloveAngles);
} }
TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips( TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips(
const FSGSenseGloveHandProfileImpl& SenseGloveHandProfileImpl) const const FSGSenseGloveHandProfileImpl& SenseGloveHandProfileImpl) const
{ {
const TArray<FVector> FingerTips{ TArray<FVector> FingerTips{
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>( FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.CalculateFingerTips(SenseGloveHandProfileImpl.ToSenseGloveHandProfile())) Pimpl->SenseGlovePose.CalculateFingerTips(SenseGloveHandProfileImpl.ToSenseGloveHandProfile()))
}; };
return FingerTips; return MoveTemp(FingerTips);
} }
TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips(const TArray<FVector>& FingerOffsets) const TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips(const TArray<FVector>& FingerOffsets) const
@@ -279,7 +276,7 @@ TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips(const TArray<FVector>
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>( FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.CalculateFingerTips(MoveTemp(FingerOffsetsVector))) Pimpl->SenseGlovePose.CalculateFingerTips(MoveTemp(FingerOffsetsVector)))
}; };
return FingerTips; return MoveTemp(FingerTips);
} }
bool FSGSenseGlovePoseImpl::Equals(const FSGSenseGlovePoseImpl& SenseGlovePoseImpl) const bool FSGSenseGlovePoseImpl::Equals(const FSGSenseGlovePoseImpl& SenseGlovePoseImpl) const
@@ -289,14 +286,14 @@ bool FSGSenseGlovePoseImpl::Equals(const FSGSenseGlovePoseImpl& SenseGlovePoseIm
FString FSGSenseGlovePoseImpl::ToString(bool bShortFormat) const FString FSGSenseGlovePoseImpl::ToString(bool bShortFormat) const
{ {
const FString String(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.ToString(bShortFormat).c_str())); FString String(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.ToString(bShortFormat).c_str()));
return String; return MoveTemp(String);
} }
FString FSGSenseGlovePoseImpl::Serialize() const FString FSGSenseGlovePoseImpl::Serialize() const
{ {
const FString Serialized(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.Serialize().c_str())); FString Serialized(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.Serialize().c_str()));
return Serialized; return MoveTemp(Serialized);
} }
FSGSenseGlovePoseImpl::FImpl::FImpl(FSGSenseGlovePoseImpl* InOwner) FSGSenseGlovePoseImpl::FImpl::FImpl(FSGSenseGlovePoseImpl* InOwner)
@@ -135,7 +135,7 @@ private:
public: public:
FSGNovaGloveImpl(); FSGNovaGloveImpl();
explicit FSGNovaGloveImpl(const FSGNovaGloveInfoImpl DeviceInfo); explicit FSGNovaGloveImpl(const FSGNovaGloveInfoImpl& DeviceInfo);
public: public:
/** /**
@@ -37,6 +37,7 @@
#include <vector> #include <vector>
#include "SGCoordinates.h"
#include "Containers/Array.h" #include "Containers/Array.h"
#include "Templates/UnrealTemplate.h" #include "Templates/UnrealTemplate.h"
@@ -609,6 +610,60 @@ public:
return MoveTemp(NestedVector); return MoveTemp(NestedVector);
} }
template<typename V3D>
static std::vector<V3D> ToSenseGloveAngles(const TArray<FVector>& Array)
{
std::vector<V3D> Vector;
for (const FVector& Value: Array)
{
Vector.emplace_back(FSGCoordinates::TransformToSenseGlove<V3D>(Value));
}
return MoveTemp(Vector);
}
template<typename V3D>
static std::vector<std::vector<V3D>> ToSenseGloveAngles(const TArray<TArray<FVector>>& NestedArray)
{
std::vector<std::vector<V3D>> NestedVector;
for (const TArray<FVector>& InnerArray: NestedArray)
{
std::vector<V3D> InnerVector{ToSenseGloveAngles<V3D>(InnerArray)};
NestedVector.emplace_back(MoveTemp(InnerVector));
}
return MoveTemp(NestedVector);
}
template<typename V3D>
static TArray<FVector> FromSenseGloveAngles(const std::vector<V3D>& Vector)
{
TArray<FVector> Array;
for (const V3D& Value: Vector)
{
Array.Add(FSGCoordinates::TransformToUnreal<V3D>(Value));
}
return MoveTemp(Array);
}
template<typename V3D>
static TArray<TArray<FVector>> FromSenseGloveAngles(const std::vector<std::vector<V3D>>& NestedVector)
{
TArray<TArray<FVector>> NestedArray;
for (const std::vector<V3D>& InnerVector: NestedVector)
{
TArray<FVector> InnerArray{FromSenseGloveAngles<V3D>(InnerVector)};
NestedArray.Add(MoveTemp(InnerArray));
}
return MoveTemp(NestedArray);
}
public: public:
FSGArrayUtils() = delete; FSGArrayUtils() = delete;
virtual ~FSGArrayUtils() = delete; virtual ~FSGArrayUtils() = delete;
@@ -0,0 +1,117 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2022 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED To THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ToRT OR OTHERWISE, ARISING From,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
#pragma once
#include "Math/Vector.h"
#include "SGTypes/SGCoreTypes.h"
class SENSEGLOVEUTILS_API FSGCoordinates final
{
public:
static FORCEINLINE constexpr float TransformToSenseGlove(const int32 Movement, const float Direction)
{
// 0 = twist, 1 = flexion/extension, 2 = abduction
return Movement != 1 ? Direction * -1.0f : Direction;
}
static FORCEINLINE FVector TransformToSenseGlove(const FVector& Vector)
{
return FVector(Vector.X * -1.0f, Vector.Y, Vector.Z * -1.0f);
}
template<typename V>
static FORCEINLINE V TransformToSenseGlove(const FVector& Vector)
{
return V(Vector.X * -1.0f, Vector.Y, Vector.Z * -1.0f);
}
static FORCEINLINE constexpr float TransformToUnreal(const int32 Movement, const float Direction)
{
/// TODO
/// values require validation.
// 0 = twist, 1 = flexion/extension, 2 = abduction
return Movement != 1 ? Direction * -1.0f : Direction;
}
static FORCEINLINE constexpr float TransformToUnreal(const ESGFingerMovement Movement, const float Direction)
{
ensureAlwaysMsgf(Movement != ESGFingerMovement::None, TEXT("none is not a valid value!"));
/// TODO
/// values require validation.
// 0 = twist, 1 = flexion/extension, 2 = abduction
/// TODO
/// Which flexions should be ignored?
return (Movement != ESGFingerMovement::McpFlexion && Movement != ESGFingerMovement::PipFlexion && Movement !=
ESGFingerMovement::PipFlexion)
? Direction * -1.0f
: Direction;
}
static FORCEINLINE constexpr float TransformToUnreal(const ESGThumbMovement Movement, const float Direction)
{
ensureAlwaysMsgf(Movement != ESGThumbMovement::None, TEXT("none is not a valid value!"));
/// TODO
/// values require validation.
// 0 = twist, 1 = flexion/extension, 2 = abduction
/// TODO
/// Which flexions should be ignored?
return (Movement != ESGThumbMovement::CmcFlexion && Movement != ESGThumbMovement::McpFlexion && Movement !=
ESGThumbMovement::IpFlexion)
? Direction * -1.0f
: Direction;
}
static FORCEINLINE FVector TransformToUnreal(const FVector& Vector)
{
return FVector(Vector.X * -1.0f, Vector.Y, Vector.Z * -1.0f);
}
template<typename V>
static FORCEINLINE FVector TransformToUnreal(const V& Vector)
{
return FVector(Vector.GetX() * -1.0f, Vector.GetY(), Vector.GetZ() * -1.0f);
}
public:
FSGCoordinates() = delete;
virtual ~FSGCoordinates() = delete;
};
@@ -54,6 +54,7 @@ public class SenseGloveUtils : ModuleRules
{ {
"CoreUObject", "CoreUObject",
"SenseGloveLog", "SenseGloveLog",
"SenseGloveTypes",
} }
); );
} }