From 4352a69f6381ccc5d57cd2093f18e0d458355f36 Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Tue, 15 Nov 2022 17:11:19 +0100 Subject: [PATCH] introduce more utility templates for metric unit conversions --- .../Public/SGUtils/SGArrayUtils.h | 56 +++++++++++++++++++ .../SenseGloveUtils/Public/SGUtils/SGUnits.h | 12 ++++ 2 files changed, 68 insertions(+) diff --git a/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h b/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h index 70ff4936..5fffd135 100644 --- a/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h +++ b/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h @@ -40,6 +40,8 @@ #include "Containers/Array.h" #include "Templates/UnrealTemplate.h" +#include "SGUtils/SGUnits.h" + class SENSEGLOVEUTILS_API FSGArrayUtils final { public: @@ -536,6 +538,33 @@ public: static TArray FromMillimeters(const std::vector& Vector); static TArray> FromMillimeters(const std::vector>& NestedVector); + template + static TArray FromMillimeters(const std::vector& Vector) + { + TArray Array; + + for (const V3D& Value: Vector) + { + Array.Add(FSGUnits::MillimetersToCentimeters(Value)); + } + + return MoveTemp(Array); + } + + template + static TArray> FromMillimeters(const std::vector>& NestedVector) + { + TArray> NestedArray; + + for (const std::vector& InnerVector: NestedVector) + { + TArray InnerArray{FromMillimeters(InnerVector)}; + NestedArray.Add(MoveTemp(InnerArray)); + } + + return MoveTemp(NestedArray); + } + static std::vector ToMillimeters(const TArray& Array); static std::vector> ToMillimeters(const TArray>& NestedArray); @@ -553,6 +582,33 @@ public: return MoveTemp(NestedVector); } + template + static std::vector ToMillimeters(const TArray& Array) + { + std::vector Vector; + + for (const FVector& Value: Array) + { + Vector.emplace_back(FSGUnits::CentimetersToMillimeters(Value)); + } + + return MoveTemp(Vector); + } + + template + static std::vector> ToMillimeters(const TArray>& NestedArray) + { + std::vector> NestedVector; + + for (const TArray& InnerArray: NestedArray) + { + std::vector InnerVector{ToMillimeters(InnerArray)}; + NestedVector.emplace_back(MoveTemp(InnerVector)); + } + + return MoveTemp(NestedVector); + } + public: FSGArrayUtils() = delete; virtual ~FSGArrayUtils() = delete; diff --git a/Source/SenseGloveUtils/Public/SGUtils/SGUnits.h b/Source/SenseGloveUtils/Public/SGUtils/SGUnits.h index 6773e673..e9fe6a7f 100644 --- a/Source/SenseGloveUtils/Public/SGUtils/SGUnits.h +++ b/Source/SenseGloveUtils/Public/SGUtils/SGUnits.h @@ -55,11 +55,23 @@ public: return Value * CentimetersToMillimetersMultiplier(); } + template + static FORCEINLINE V3D CentimetersToMillimeters(const FVector& Vector) + { + return V3DImpl(Vector * CentimetersToMillimetersMultiplier()).ToVect3D(); + } + static FORCEINLINE float MillimetersToCentimeters(const float Value) { return Value * MillimetersToCentimetersMultiplier(); } + template + static FORCEINLINE FVector MillimetersToCentimeters(const V3D& Vect3D) + { + return V3DImpl(Vect3D).ToFVector() * MillimetersToCentimetersMultiplier(); + } + public: FSGUnits() = delete; virtual ~FSGUnits() = delete;