diff --git a/Handbook/src/appendix/changelog.md b/Handbook/src/appendix/changelog.md index 11354311..a4b1e079 100644 --- a/Handbook/src/appendix/changelog.md +++ b/Handbook/src/appendix/changelog.md @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fix a critical issue where `HandStates->GetTransform(KeyPoint)` was incorrectly resolving to `(&HandStates[0])->GetTransform(KeyPoint)`, causing both hands to use the left hand's wrist transform under specific conditions. This occurred when the `bFallbackToHandTrackingIfNoGloveDetected` option was enabled, two gloves were present, and no hardware wrist-tracking device was active, resulting in both hands overlapping at the same transform. +- `FSGArrayUtils` optimizations that affect the plugin performance as a whole. - Additional minor fixes and improvements that may not be listed here. ### Changed diff --git a/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h b/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h index f1988dc5..ad6d8795 100644 --- a/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h +++ b/Source/SenseGloveUtils/Public/SGUtils/SGArrayUtils.h @@ -65,6 +65,7 @@ public: static TArray FromStdVector(const std::vector& Vector) { TArray Array; + Array.Reserve(Vector.size()); for (const bool bValue: Vector) { @@ -77,6 +78,7 @@ public: static TArray FromStdVector(const std::vector& Vector) { TArray Array; + Array.Reserve(Vector.size()); for (const std::string& StdString: Vector) { @@ -91,6 +93,7 @@ public: static TArray> FromStdVector(const std::vector>& NestedVector) { TArray> NestedArray; + NestedArray.Reserve(NestedVector.size()); for (const std::vector& InnerVector: NestedVector) { @@ -105,6 +108,7 @@ public: static TArray FromStdVector(const std::vector& Vector) { TArray Array; + Array.Reserve(Vector.size()); for (const T1& T1Element: Vector) { @@ -119,6 +123,7 @@ public: static TArray> FromStdVector(const std::vector>& NestedVector) { TArray> NestedArray; + NestedArray.Reserve(NestedVector.size()); for (const std::vector& InnerVector: NestedVector) { @@ -133,6 +138,7 @@ public: static TArray FromStdVector(const std::vector& Vector) { TArray Array; + Array.Reserve(Vector.size()); for (const T1& T1Element: Vector) { @@ -148,6 +154,7 @@ public: static TArray> FromStdVector(const std::vector>& NestedVector) { TArray> NestedArray; + NestedArray.Reserve(NestedVector.size()); for (const std::vector& InnerVector: NestedVector) { @@ -168,6 +175,7 @@ public: static std::vector ToStdVector(const TArray& Array) { std::vector Vector; + Vector.reserve(Array.Num()); for (const FString& String: Array) { @@ -182,6 +190,7 @@ public: static std::vector> ToStdVector(const TArray>& NestedArray) { std::vector> NestedVector; + NestedVector.reserve(NestedArray.Num()); for (const TArray& InnerArray: NestedArray) { @@ -196,6 +205,7 @@ public: static std::vector ToStdVector(const TArray& Array) { std::vector Vector; + Vector.reserve(Array.Num()); for (const T1& T1Element: Array) { @@ -210,6 +220,7 @@ public: static std::vector> ToStdVector(const TArray>& NestedArray) { std::vector> NestedVector; + NestedVector.reserve(NestedArray.Num()); for (const TArray& InnerArray: NestedArray) { @@ -225,6 +236,7 @@ public: static std::vector ToStdVector(const TArray& Array) { std::vector Vector; + Vector.reserve(Array.Num()); for (const T1& T1Element: Array) { @@ -241,6 +253,7 @@ public: static std::vector> ToStdVector(const TArray>& NestedArray) { std::vector> NestedVector; + NestedVector.reserve(NestedArray.Num()); for (const TArray& InnerArray: NestedArray) { @@ -255,6 +268,7 @@ public: static TArray FromImplType(const TArray& ImplArray) { TArray Array; + Array.Reserve(ImplArray.Num()); for (const T1& T1Element: ImplArray) { @@ -269,6 +283,7 @@ public: static TArray FromImplType(UObject* Outer, const TArray& ImplArray) { TArray Array; + Array.Reserve(ImplArray.Num()); for (const T1& T1Element: ImplArray) { @@ -283,6 +298,7 @@ public: static TArray> FromImplType(const TArray>& NestedImplArray) { TArray> NestedArray; + NestedArray.Reserve(NestedImplArray.Num()); for (const TArray& InnerImplArray: NestedImplArray) { @@ -297,6 +313,7 @@ public: static TArray> FromImplType(UObject* Outer, const TArray>& NestedImplArray) { TArray> NestedArray; + NestedArray.Reserve(NestedImplArray.Num()); for (const TArray& InnerImplArray: NestedImplArray) { @@ -311,6 +328,7 @@ public: static TArray FromImplType(const TArray>& NestedImplArray) { TArray NestedBPArray; + NestedBPArray.Reserve(NestedImplArray.Num()); for (const TArray& InnerImplArray: NestedImplArray) { @@ -323,39 +341,42 @@ public: } template - static TArray FromImplType(UObject* Outer, const TArray>& ImplArray) + static TArray FromImplType(UObject* Outer, const TArray>& NestedImplArray) { - TArray Array; + TArray NestedArray; + NestedArray.Reserve(NestedImplArray.Num()); - for (const TArray& InnerImplArray: ImplArray) + for (const TArray& InnerImplArray: NestedImplArray) { TArray InnerArray{FromImplType(Outer, InnerImplArray)}; S InnerArrayContainer{MoveTemp(InnerArray)}; - Array.Add(MoveTemp(InnerArrayContainer)); + NestedArray.Add(MoveTemp(InnerArrayContainer)); } - return Array; + return NestedArray; } template - static TArray FromImplType(const TArray>& ImplArray) + static TArray FromImplType(const TArray>& NestedImplArray) { - TArray Array; + TArray NestedArray; + NestedArray.Reserve(NestedImplArray.Num()); - for (const TArray& InnerImplArray: ImplArray) + for (const TArray& InnerImplArray: NestedImplArray) { TArray InnerArray{FromImplType(InnerImplArray)}; S InnerArrayContainer{MoveTemp(InnerArray)}; - Array.Add(MoveTemp(InnerArrayContainer)); + NestedArray.Add(MoveTemp(InnerArrayContainer)); } - return Array; + return NestedArray; } template static TArray ToImplType(const TArray& Array) { TArray ImplArray; + ImplArray.Reserve(Array.Num()); for (const T1& T1Element: Array) { @@ -370,6 +391,7 @@ public: static TArray ToImplType(const TArray& Array) { TArray ImplArray; + ImplArray.Reserve(Array.Num()); for (const T1* T1Element: Array) { @@ -384,6 +406,7 @@ public: static TArray> ToImplType(const TArray>& Array) { TArray> ImplArray; + ImplArray.Reserve(Array.Num()); for (const TArray& InnerArray: Array) { @@ -395,53 +418,57 @@ public: } template - static TArray> ToImplType(const TArray>& Array) + static TArray> ToImplType(const TArray>& NestedArray) { - TArray> ImplArray; + TArray> NestedImplArray; + NestedImplArray.Reserve(NestedArray.Num()); - for (const TArray& InnerArray: Array) + for (const TArray& InnerArray: NestedArray) { TArray InnerImplArray{ToImplType(InnerArray)}; - ImplArray.Add(MoveTemp(InnerImplArray)); + NestedImplArray.Add(MoveTemp(InnerImplArray)); } - return ImplArray; + return NestedImplArray; } template S::* InnerArray> - static TArray> ToImplType(const TArray& Array) + static TArray> ToImplType(const TArray& NestedArray) { - TArray> ImplArray; + TArray> NestedImplArray; + NestedImplArray.Reserve(NestedArray.Num()); - for (const S& InnerArrayContainer: Array) + for (const S& InnerArrayContainer: NestedArray) { TArray InnerImplArray{ToImplType(InnerArrayContainer.*InnerArray)}; - ImplArray.Add(MoveTemp(InnerImplArray)); + NestedImplArray.Add(MoveTemp(InnerImplArray)); } - return ImplArray; + return NestedImplArray; } template S::* InnerArray> - static TArray> ToImplType(const TArray& Array) + static TArray> ToImplType(const TArray& NestedArray) { - TArray> ImplArray; + TArray> NestedImplArray; + NestedImplArray.Reserve(NestedArray.Num()); - for (const S& InnerArrayContainer: Array) + for (const S& InnerArrayContainer: NestedArray) { TArray InnerImplArray{ToImplType(InnerArrayContainer.*InnerArray)}; - ImplArray.Add(MoveTemp(InnerImplArray)); + NestedImplArray.Add(MoveTemp(InnerImplArray)); } - return ImplArray; + return NestedImplArray; } template S::*InnerArray> static TArray> FromNestedBPArray(const TArray& NestedBPArray) { TArray> NestedArray; + NestedArray.Reserve(NestedBPArray.Num()); for (const S& InnerBPArrayContainer: NestedBPArray) { @@ -452,11 +479,12 @@ public: } template - static TArray ToNestedBPArray(const TArray>& Array) + static TArray ToNestedBPArray(const TArray>& NestedArray) { TArray NestedBPArray; + NestedBPArray.Reserve(NestedArray.Num()); - for (const TArray& InnerArray: Array) + for (const TArray& InnerArray: NestedArray) { S InnerBPArrayContainer{InnerArray}; NestedBPArray.Add(MoveTemp(InnerBPArrayContainer)); @@ -469,6 +497,7 @@ public: static TArray ToNestedBPArray(const TArray>& NestedArray) { TArray NestedBPArray; + NestedBPArray.Reserve(NestedArray.Num()); for (const TArray& InnerArray: NestedArray) { @@ -485,22 +514,24 @@ public: template S::*InnerArray> static TArray> QuatsToRotators(const TArray& QuatsNestedArray) { - TArray> RotatorsArray; + TArray> RotatorsNestedArray; + RotatorsNestedArray.Reserve(QuatsNestedArray.Num()); for (const S& QuatsInnerBPArrayContainer: QuatsNestedArray) { - RotatorsArray.Add(QuatsToRotators(QuatsInnerBPArrayContainer.*InnerArray)); + RotatorsNestedArray.Add(QuatsToRotators(QuatsInnerBPArrayContainer.*InnerArray)); } - return RotatorsArray; + return RotatorsNestedArray; } template - static TArray QuatsToRotators(const TArray>& QuatsArray) + static TArray QuatsToRotators(const TArray>& QuatsNestedArray) { TArray RotatorsNestedBPArray; + RotatorsNestedBPArray.Reserve(QuatsNestedArray.Num()); - for (const TArray& QuatsInnerArray: QuatsArray) + for (const TArray& QuatsInnerArray: QuatsNestedArray) { S RotatorsInnerBPArrayContainer{QuatsToRotators(QuatsInnerArray)}; RotatorsNestedBPArray.Add(MoveTemp(RotatorsInnerBPArrayContainer)); @@ -513,6 +544,7 @@ public: static TArray QuatsToRotators(const TArray& QuatsNestedArray) { TArray RotatorsNestedBPArray; + RotatorsNestedBPArray.Reserve(QuatsNestedArray.Num()); for (const Q& QuatsInnerArrayContainer: QuatsNestedArray) { @@ -529,20 +561,22 @@ public: template S::*InnerArray> static TArray> RotatorsToQuats(const TArray& RotatorsNestedArray) { - TArray> QuatsArray; + TArray> QuatsNestedArray; + QuatsNestedArray.Reserve(RotatorsNestedArray.Num()); for (const S& RotatorsInnerBPArrayContainer: RotatorsNestedArray) { - QuatsArray.Add(RotatorsToQuats(RotatorsInnerBPArrayContainer.*InnerArray)); + QuatsNestedArray.Add(RotatorsToQuats(RotatorsInnerBPArrayContainer.*InnerArray)); } - return QuatsArray; + return QuatsNestedArray; } template static TArray RotatorsToQuats(const TArray>& RotatorsNestedArray) { TArray QuatsNestedBPArray; + QuatsNestedBPArray.Reserve(RotatorsNestedArray.Num()); for (const TArray& RotatorsInnerArray: RotatorsNestedArray) { @@ -557,6 +591,7 @@ public: static TArray RotatorsToQuats(const TArray& RotatorsNestedArray) { TArray QuatsNestedBPArray; + QuatsNestedBPArray.Reserve(RotatorsNestedArray.Num()); for (const Q& RotatorsInnerArrayContainer: RotatorsNestedArray) { @@ -574,6 +609,7 @@ public: static TArray FromMillimeters(const std::vector& Vector) { TArray Array; + Array.Reserve(Vector.size()); for (const V3D& Value: Vector) { @@ -587,6 +623,7 @@ public: static TArray> FromMillimeters(const std::vector>& NestedVector) { TArray> NestedArray; + NestedArray.Reserve(NestedVector.size()); for (const std::vector& InnerVector: NestedVector) { @@ -604,6 +641,7 @@ public: static std::vector> ToMillimeters(const TArray& NestedBPArray) { std::vector> NestedVector; + NestedVector.reserve(NestedBPArray.Num()); for (const S& InnerBPArrayContainer: NestedBPArray) { @@ -618,6 +656,7 @@ public: static std::vector ToMillimeters(const TArray& Array) { std::vector Vector; + Vector.reserve(Array.Num()); for (const FVector& Value: Array) { @@ -631,6 +670,7 @@ public: static std::vector> ToMillimeters(const TArray>& NestedArray) { std::vector> NestedVector; + NestedVector.reserve(NestedArray.Num()); for (const TArray& InnerArray: NestedArray) { @@ -644,6 +684,7 @@ public: static std::vector ToSenseGloveAngles(const TArray& Array) { std::vector Vector; + Vector.reserve(Array.Num()); for (const float Value: Array) { @@ -656,6 +697,7 @@ public: static std::vector> ToSenseGloveAngles(const TArray>& NestedArray) { std::vector> NestedVector; + NestedVector.reserve(NestedArray.Num()); for (const TArray& InnerArray: NestedArray) { @@ -670,6 +712,7 @@ public: static std::vector ToSenseGloveAngles(const TArray& Array) { std::vector Vector; + Vector.reserve(Array.Num()); for (const FVector& Value: Array) { @@ -683,6 +726,7 @@ public: static std::vector> ToSenseGloveAngles(const TArray>& NestedArray) { std::vector> NestedVector; + NestedVector.reserve(NestedArray.Num()); for (const TArray& InnerArray: NestedArray) { @@ -696,6 +740,7 @@ public: static TArray FromSenseGloveAngles(const std::vector& Vector) { TArray Array; + Array.Reserve(Vector.size()); for (const float Value: Vector) { @@ -707,21 +752,23 @@ public: static TArray> FromSenseGloveAngles(const std::vector>& NestedVector) { - TArray> Array; + TArray> NestedArray; + NestedArray.Reserve(NestedVector.size()); for (const std::vector& InnerVector: NestedVector) { TArray InnerArray{FromSenseGloveAngles(InnerVector)}; - Array.Add(MoveTemp(InnerArray)); + NestedArray.Add(MoveTemp(InnerArray)); } - return Array; + return NestedArray; } template static TArray FromSenseGloveAngles(const std::vector& Vector) { TArray Array; + Array.Reserve(Vector.size()); for (const V3D& Value: Vector) { @@ -735,6 +782,7 @@ public: static TArray> FromSenseGloveAngles(const std::vector>& NestedVector) { TArray> NestedArray; + NestedArray.Reserve(NestedVector.size()); for (const std::vector& InnerVector: NestedVector) {