diff --git a/Engine/Source/Runtime/Core/public/Math/Detail/Vector3Decl.inl b/Engine/Source/Runtime/Core/public/Math/Detail/Vector3Decl.inl index d742a39..fa620cb 100644 --- a/Engine/Source/Runtime/Core/public/Math/Detail/Vector3Decl.inl +++ b/Engine/Source/Runtime/Core/public/Math/Detail/Vector3Decl.inl @@ -31,9 +31,35 @@ namespace Phanes::Core::Math::Detail template struct compute_vec3_dec {}; + + // Cross product template struct compute_vec3_cross_p {}; + // Magnitude + template + struct compute_vec3_mag {}; + + // dot product + template + struct compute_vec3_dotp {}; + + // set + template + struct compute_vec3_set {}; + + // clamp to cube + template + struct compute_vec3_clamp {}; + + // max + template + struct compute_vec3_max {}; + + // min + template + struct compute_vec3_min {}; + template @@ -117,6 +143,13 @@ namespace Phanes::Core::Math::Detail r.y = v1.y - s; r.z = v1.z - s; } + + static constexpr void map(Phanes::Core::Math::TVector3& r, T s, const Phanes::Core::Math::TVector3& v1) + { + r.x = s - v1.x; + r.y = s - v1.y; + r.z = s - v1.z; + } }; @@ -157,6 +190,13 @@ namespace Phanes::Core::Math::Detail r.y = v1.y * s; r.z = v1.z * s; } + + static constexpr void map(Phanes::Core::Math::TVector3& r, T s, const Phanes::Core::Math::TVector3& v1) + { + r.x = s / v1.x; + r.y = s / v1.y; + r.z = s / v1.z; + } }; template @@ -215,5 +255,69 @@ namespace Phanes::Core::Math::Detail r.z = (v1.x * v2.y) - (v1.y * v2.x); } }; + + + template + struct compute_vec3_mag + { + static constexpr T map(const Phanes::Core::Math::TVector3& v1) + { + return sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z); + } + }; + + template + struct compute_vec3_dotp + { + static constexpr T map(const Phanes::Core::Math::TVector3& v1, const Phanes::Core::Math::TVector3& v2) + { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; + } + }; + + + template + struct compute_vec3_set + { + static constexpr void map(Phanes::Core::Math::TVector3& v1, T x, T y, T z) + { + v1.x = x; + v1.y = y; + v1.z = z; + } + }; + + template + struct compute_vec3_clamp + { + static constexpr void map(Phanes::Core::Math::TVector3& r, const Phanes::Core::Math::TVector3& v1, T radius) + { + r.x = Clamp(v1.x, -radius, radius); + r.y = Clamp(v1.y, -radius, radius); + r.z = Clamp(v1.z, -radius, radius); + } + }; + + template + struct compute_vec3_max + { + static constexpr void map(Phanes::Core::Math::TVector3& r, const Phanes::Core::Math::TVector3& v1, const Phanes::Core::Math::TVector3& v2) + { + r.x = (v1.x > v2.x) ? v1.x : v2.x; + r.y = (v1.y > v2.y) ? v1.y : v2.y; + r.z = (v1.z > v2.z) ? v1.z : v2.z; + } + }; + + template + struct compute_vec3_min + { + static constexpr void map(Phanes::Core::Math::TVector3& r, const Phanes::Core::Math::TVector3& v1, const Phanes::Core::Math::TVector3& v2) + { + r.x = (v1.x < v2.x) ? v1.x : v2.x; + r.y = (v1.y < v2.y) ? v1.y : v2.y; + r.z = (v1.z < v2.z) ? v1.z : v2.z; + } + }; } diff --git a/Engine/Source/Runtime/Core/public/Math/Detail/Vector4Decl.inl b/Engine/Source/Runtime/Core/public/Math/Detail/Vector4Decl.inl index 4c9d819..b553fce 100644 --- a/Engine/Source/Runtime/Core/public/Math/Detail/Vector4Decl.inl +++ b/Engine/Source/Runtime/Core/public/Math/Detail/Vector4Decl.inl @@ -32,6 +32,30 @@ namespace Phanes::Core::Math::Detail struct compute_vec4_dec {}; + // Magnitude + template + struct compute_vec4_mag {}; + + // dot product + template + struct compute_vec4_dotp {}; + + // set + template + struct compute_vec4_set {}; + + // max + template + struct compute_vec4_max {}; + + // min + template + struct compute_vec4_min {}; + + // perspective divide + template + struct compute_vec4_pdiv {}; + template struct construct_vec4 @@ -116,6 +140,14 @@ namespace Phanes::Core::Math::Detail r.z = v1.z - s; r.w = v1.w - s; } + + static constexpr void map(Phanes::Core::Math::TVector4& r, T s, const Phanes::Core::Math::TVector4& v1) + { + r.x = s - v1.x; + r.y = s - v1.y; + r.z = s - v1.z; + r.w = s - v1.w; + } }; @@ -160,6 +192,14 @@ namespace Phanes::Core::Math::Detail r.z = v1.z * s; r.w = v1.w * s; } + + static constexpr void map(Phanes::Core::Math::TVector4& r, T s, const Phanes::Core::Math::TVector4& v1) + { + r.x = s / v1.x; + r.y = s / v1.y; + r.z = s / v1.z; + r.w = s / v1.w; + } }; template @@ -209,5 +249,74 @@ namespace Phanes::Core::Math::Detail r.w = v1.w - 1; } }; + + + template + struct compute_vec4_mag + { + static constexpr T map(const Phanes::Core::Math::TVector4& v1) + { + return sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z + v1.w * v1.w); + } + }; + + template + struct compute_vec4_dotp + { + static constexpr T map(const Phanes::Core::Math::TVector4& v1, const Phanes::Core::Math::TVector4& v2) + { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w; + } + }; + + + template + struct compute_vec4_set + { + static constexpr void map(Phanes::Core::Math::TVector4& v1, T x, T y, T z, T w) + { + v1.x = x; + v1.y = y; + v1.z = z; + v1.w = w; + } + }; + + template + struct compute_vec4_max + { + static constexpr void map(Phanes::Core::Math::TVector4& r, const Phanes::Core::Math::TVector4& v1, const Phanes::Core::Math::TVector4& v2) + { + r.x = (v1.x > v2.x) ? v1.x : v2.x; + r.y = (v1.y > v2.y) ? v1.y : v2.y; + r.z = (v1.z > v2.z) ? v1.z : v2.z; + r.w = (v1.w > v2.w) ? v1.w : v2.w; + } + }; + + template + struct compute_vec4_min + { + static constexpr void map(Phanes::Core::Math::TVector4& r, const Phanes::Core::Math::TVector4& v1, const Phanes::Core::Math::TVector4& v2) + { + r.x = (v1.x < v2.x) ? v1.x : v2.x; + r.y = (v1.y < v2.y) ? v1.y : v2.y; + r.z = (v1.z < v2.z) ? v1.z : v2.z; + r.w = (v1.w < v2.w) ? v1.w : v2.w; + } + }; + + template + struct compute_vec4_pdiv + { + static constexpr void map(Phanes::Core::Math::TVector4& r, const Phanes::Core::Math::TVector4& v1) + { + T _1_w = (T)1.0 / v1.w; + r.x = v1.x * _1_w; + r.y = v1.y * _1_w; + r.z = v1.z * _1_w; + r.w = (T)0.0; + } + }; } diff --git a/Engine/Source/Runtime/Core/public/Math/Vector3.hpp b/Engine/Source/Runtime/Core/public/Math/Vector3.hpp index 7ea7282..7b768d3 100644 --- a/Engine/Source/Runtime/Core/public/Math/Vector3.hpp +++ b/Engine/Source/Runtime/Core/public/Math/Vector3.hpp @@ -91,7 +91,7 @@ namespace Phanes::Core::Math { /// Vector two /// Copy of v1. template - inline TVector3 operator+= (TVector3& v1, const TVector3& v2); + inline TVector3& operator+= (TVector3& v1, const TVector3& v2); /// /// Vector - scalar addition. @@ -102,7 +102,7 @@ namespace Phanes::Core::Math { /// Vector two /// Copy of v1. template - inline TVector3 operator+= (TVector3& v1, T s); + inline TVector3& operator+= (TVector3& v1, T s); /// /// Vector - scalar substraction @@ -113,7 +113,7 @@ namespace Phanes::Core::Math { /// Vector two /// Copy of v1. template - inline TVector3 operator-= (TVector3& v1, const TVector3& v2); + inline TVector3& operator-= (TVector3& v1, const TVector3& v2); /// /// Vector substraction. @@ -124,7 +124,7 @@ namespace Phanes::Core::Math { /// Vector two /// Copy of v1. template - inline TVector3 operator-= (TVector3& v1, T s); + inline TVector3& operator-= (TVector3& v1, T s); /// /// Componentwise multiplication @@ -135,7 +135,7 @@ namespace Phanes::Core::Math { /// /// Copy of v1. template - inline TVector3 operator*=(TVector3& v1, const TVector3& v2); + inline TVector3& operator*=(TVector3& v1, const TVector3& v2); /** * Componentwise multiplication @@ -145,7 +145,7 @@ namespace Phanes::Core::Math { */ template - inline TVector3 operator*= (TVector3& v1, T s); + inline TVector3& operator*= (TVector3& v1, T s); /// /// Componentwise division @@ -156,7 +156,7 @@ namespace Phanes::Core::Math { /// /// Copy of v1. template - inline TVector3 operator/=(TVector3& v1, const TVector3& v2); + inline TVector3& operator/=(TVector3& v1, const TVector3& v2); /** * Coponentwise division of 3D vector with floating point @@ -166,7 +166,7 @@ namespace Phanes::Core::Math { */ template - inline TVector3 operator/= (TVector3& v1, T s); + inline TVector3& operator/= (TVector3& v1, T s); @@ -194,6 +194,7 @@ namespace Phanes::Core::Math { template TVector3 operator* (const TVector3& v1, T s); + /** * Componentwise division * @@ -206,6 +207,9 @@ namespace Phanes::Core::Math { template TVector3 operator/ (const TVector3& v1, const TVector3& v2); + template + TVector3 operator/ (T s, const TVector3& v1); + /** * Coponentwise division of 3D Vectors with floating point @@ -225,7 +229,7 @@ namespace Phanes::Core::Math { * @param(s) floating point * @param(v2) vector * - * @return Resultion vector + * @return Resulting vector */ template @@ -234,21 +238,6 @@ namespace Phanes::Core::Math { return v1 * s; }; - /** - * Coponentwise multiplication of 3D Vectors with floating point - * - * @param(s) floating point - * @param(v1) vector - * - * @return Resultion vector - */ - - template - FORCEINLINE TVector3 operator/ (T s, const TVector3& v1) - { - return v1 / s; - }; - /** * Coponentwise addition of floating point to 3D vector * @@ -285,6 +274,9 @@ namespace Phanes::Core::Math { template TVector3 operator- (const TVector3& v1, T s); + template + TVector3 operator- (T s, const TVector3& v1); + /** * Coponentwise substraction of floating point of 3D vector * @@ -326,16 +318,16 @@ namespace Phanes::Core::Math { inline bool operator!= (const TVector3& v1, const TVector3& v2); template - TVector3& operator++(TVector3& v1); + TVector3 operator++(TVector3& v1); template - TVector3& operator--(TVector3& v1); + TVector3 operator--(TVector3& v1); template - TVector3& operator++(TVector3& v1, int); + TVector3 operator++(TVector3& v1, int); template - TVector3& operator--(TVector3& v1, int); + TVector3 operator--(TVector3& v1, int); // ==================================== // // TVector3 function implementation // @@ -349,18 +341,15 @@ namespace Phanes::Core::Math { * @return Magnitude of vector */ - template - inline T Magnitude(const TVector3& v1) - { - return sqrt(DotP(v1, v1)); - } + template + inline T Magnitude(const TVector3& v1); /** * @see [FUNC]Magnitude */ - template - FORCEINLINE T Length(const TVector3& v1) { return Magnitude(v1); }; + template + FORCEINLINE T Length(const TVector3& v1) { return Magnitude(v1); }; /** * Gets square magnitude of vector @@ -370,18 +359,15 @@ namespace Phanes::Core::Math { * @return Square magnitude of vector */ - template - inline T SqrMagnitude(const TVector3& v1) - { - return DotP(v1, v1); - } + template + inline T SqrMagnitude(const TVector3& v1); /** * @see SqrMagnitude */ - template - FORCEINLINE T SqrLength(const TVector3& v1) + template + FORCEINLINE T SqrLength(const TVector3& v1) { return SqrMagnitude(v1); } @@ -394,8 +380,8 @@ namespace Phanes::Core::Math { * @note Result is stored in v1 */ - template - TVector3 NormalizeV(TVector3& v1) + template + TVector3& NormalizeV(TVector3& v1) { float vecNorm = Magnitude(v1); v1 /= (vecNorm < P_FLT_INAC) ? (T)1.0 : vecNorm; @@ -411,8 +397,8 @@ namespace Phanes::Core::Math { * @note Does not test for zero vector */ - template - TVector3 UnsafeNormalizeV(TVector3& v1) + template + TVector3& UnsafeNormalizeV(TVector3& v1) { v1 /= Magnitude(v1); @@ -426,8 +412,8 @@ namespace Phanes::Core::Math { * @param(normal) Normal of surface */ - template - TVector3 ReflectV(TVector3& v1, const TVector3& normal) + template + TVector3& ReflectV(TVector3& v1, const TVector3& normal) { v1 = ((T)2.0 * DotP(v1, normal) * normal) - v1; @@ -443,8 +429,8 @@ namespace Phanes::Core::Math { * @return Angle between vectors */ - template - T Angle(const TVector3& v1, const TVector3& v2) + template + T Angle(const TVector3& v1, const TVector3& v2) { return acos(DotP(v1, v2) / (Magnitude(v1) * Magnitude(v2))); } @@ -458,11 +444,8 @@ namespace Phanes::Core::Math { * @return Dot product of vectors */ - template - inline T DotP(const TVector3& v1, const TVector3& v2) - { - return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; - } + template + inline T DotP(const TVector3& v1, const TVector3& v2); /** * Orthogonalizes three vectors. @@ -472,8 +455,8 @@ namespace Phanes::Core::Math { * @param(v3) Vector two */ - template - void Orthogonalize(TVector3& v1, TVector3& v2, TVector3& v3) + template + void Orthogonalize(TVector3& v1, TVector3& v2, TVector3& v3) { Set(v2, Reject(v2, v1)); Set(v3, Reject(Reject(v3, v1), v2)); @@ -489,8 +472,8 @@ namespace Phanes::Core::Math { * @note Usefull for making sure coordinate axis are still orthogonal. */ - template - void OrthoNormalize(TVector3& v1, TVector3& v2, TVector3& v3) + template + void OrthoNormalize(TVector3& v1, TVector3& v2, TVector3& v3) { Set(v2, Reject(v2, v1)); Set(v3, Reject(Reject(v3, v1), v2)); @@ -511,8 +494,8 @@ namespace Phanes::Core::Math { * @return True if equal, false if not. */ - template - inline bool Equals(const TVector3& v1, const TVector3& v2, T threshold = P_FLT_INAC) + template + inline bool Equals(const TVector3& v1, const TVector3& v2, T threshold = P_FLT_INAC) { return (abs(v1.x - v2.x) < threshold && abs(v1.y - v2.y) < threshold && abs(v1.z - v2.z) < threshold); } @@ -523,8 +506,8 @@ namespace Phanes::Core::Math { * @param(v1) Vector */ - template - TVector3 PerspectiveDivideV(TVector3& v1) + template + TVector3& PerspectiveDivideV(TVector3& v1) { float _z = (T)1.0 / v1.z; v1.x *= _z; @@ -544,7 +527,7 @@ namespace Phanes::Core::Math { /// Copy of v1. template - TVector3 CrossPV(TVector3& v1, const TVector3& v2); + TVector3& CrossPV(TVector3& v1, const TVector3& v2); /** * Gets the componentwise max of both vectors. @@ -555,15 +538,8 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 MaxV(TVector3& v1, const TVector3& v2) - { - v1.x = Max(v1.x, v2.x); - v1.y = Max(v1.y, v2.y); - v1.z = Max(v1.z, v2.z); - - return v1; - } + template + TVector3& MaxV(TVector3& v1, const TVector3& v2); /** * Gets the componentwise min of both vectors. @@ -574,15 +550,8 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 MinV(TVector3& v1, const TVector3& v2) - { - v1.x = Min(v1.x, v2.x); - v1.y = Min(v1.y, v2.y); - v1.z = Min(v1.z, v2.z); - - return v1; - } + template + TVector3& MinV(TVector3& v1, const TVector3& v2); /** * Gets reversed vector. @@ -592,33 +561,10 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 NegateV(TVector3& v1) + template + TVector3& NegateV(TVector3& v1) { - v1.x = -v1.x; - v1.y = -v1.y; - v1.z = -v1.z; - - return v1; - } - - /** - * Performes componentwise multiplication of two vectors. - * - * @param(v1) Vector one - * @param(v2) Vector two - * - * @note result is stored in v1. - */ - - template - TVector3 ScaleV(TVector3& v1, const TVector3& v2) - { - v1.x *= v2.x; - v1.y *= v2.y; - v1.z *= v2.z; - - return v1; + return (v1 = (T)0.0 - v1); } @@ -631,8 +577,8 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 ProjectV(TVector3& v1, const TVector3& v2) + template + TVector3& ProjectV(TVector3& v1, const TVector3& v2) { float x = DotP(v1, v2) / DotP(v2, v2); v1 = x * v2; @@ -649,8 +595,8 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 RejectV(TVector3& v1, const TVector3& v2) + template + TVector3& RejectV(TVector3& v1, const TVector3& v2) { float x = DotP(v1, v2) / DotP(v2, v2); v1 -= x * v2; @@ -665,8 +611,8 @@ namespace Phanes::Core::Math { * @param(v2) Vector to copy */ - template - TVector3 Set(TVector3& v1, const TVector3& v2) + template + TVector3& Set(TVector3& v1, const TVector3& v2) { v1 = v2; @@ -682,15 +628,8 @@ namespace Phanes::Core::Math { * @param(z) Z component */ - template - TVector3 Set(TVector3& v1, T x, T y, T z) - { - v1.x = x; - v1.y = y; - v1.z = z; - - return v1; - } + template + TVector3& Set(TVector3& v1, T x, T y, T z); /** * Clamps vector to a range of magnitudes. @@ -702,8 +641,8 @@ namespace Phanes::Core::Math { * @note Result is stored in v1 */ - template - TVector3 ClampToMagnitudeV(TVector3& v1, T min, T max) + template + TVector3& ClampToMagnitudeV(TVector3& v1, T min, T max) { T magnitude = Magnitude(v1); @@ -722,14 +661,10 @@ namespace Phanes::Core::Math { * @note Result is stored in v1 */ - template - TVector3 CompInverseV(TVector3& v1) + template + TVector3& CompInverseV(TVector3& v1) { - v1.x = 1.0f / v1.x; - v1.y = 1.0f / v1.y; - v1.z = 1.0f / v1.z; - - return v1; + return (v1 = (T)1.0 / v1); } @@ -742,15 +677,8 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 ClampToCubeV(TVector3 v1, T cubeRadius) - { - v1.x = Clamp(v1.x, -cubeRadius, cubeRadius); - v1.y = Clamp(v1.y, -cubeRadius, cubeRadius); - v1.z = Clamp(v1.z, -cubeRadius, cubeRadius); - - return v1; - }; + template + TVector3& ClampToCubeV(TVector3 v1, T cubeRadius); /** * Rotates vector around axis @@ -761,8 +689,8 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 RotateAroundAxisV(TVector3& v1, const TVector3& axisNormal, T angle) + template + TVector3& RotateAroundAxisV(TVector3& v1, const TVector3& axisNormal, T angle) { T sinAngle = sin(angle); T cosAngle = cos(angle); @@ -779,8 +707,8 @@ namespace Phanes::Core::Math { * @note It's faster to use operator* or operator*= for naturaly normalized vectors. */ - template - TVector3 ScaleToMagnitudeV(TVector3& v1, T magnitude) + template + TVector3& ScaleToMagnitudeV(TVector3& v1, T magnitude) { NormalizeV(v1); v1 *= magnitude; @@ -793,8 +721,8 @@ namespace Phanes::Core::Math { * @param(v1) Vector one */ - template - TVector3 SignVectorV(TVector3& v1) + template + TVector3& SignVectorV(TVector3& v1) { v1.x = (v1.x >= (T)0.0) ? (T)1.0 : (T)-1; v1.y = (v1.y >= (T)0.0) ? (T)1.0 : (T)-1; @@ -814,8 +742,8 @@ namespace Phanes::Core::Math { * @return Vector triple product */ - template - T ScalarTriple(const TVector3& v1, const TVector3& v2, const TVector3& v3) + template + T ScalarTriple(const TVector3& v1, const TVector3& v2, const TVector3& v3) { return DotP(CrossP(v1, v2), v3); } @@ -830,8 +758,8 @@ namespace Phanes::Core::Math { * @note Simply omits acos of angle. */ - template - T CosineAngle(const TVector3& v1, const TVector3& v2) + template + T CosineAngle(const TVector3& v1, const TVector3& v2) { return DotP(v1, v2) / ((Magnitude(v1) * Magnitude(v2))); } @@ -846,8 +774,8 @@ namespace Phanes::Core::Math { * @note result is stored in v1 */ - template - TVector3 VectorTripleV(TVector3& v1, const TVector3& v2, const TVector3& v3) + template + TVector3& VectorTripleV(TVector3& v1, const TVector3& v2, const TVector3& v3) { CrossPV(CrossPV(v1, v2), v3); @@ -864,8 +792,8 @@ namespace Phanes::Core::Math { * @return True if perpendicular, false if not. */ - template - inline bool IsPerpendicular(const TVector3& v1, const TVector3& v2, T threshold = P_FLT_INAC) + template + inline bool IsPerpendicular(const TVector3& v1, const TVector3& v2, T threshold = P_FLT_INAC) { return (abs(DotP(v1, v2)) < threshold); } @@ -880,8 +808,8 @@ namespace Phanes::Core::Math { * @return True if parallel, false if not. */ - template - inline bool IsParallel(const TVector3& v1, const TVector3& v2, T threshold = 1.0f - P_FLT_INAC) + template + inline bool IsParallel(const TVector3& v1, const TVector3& v2, T threshold = 1.0f - P_FLT_INAC) { return (abs(DotP(v1, v2)) > threshold); } @@ -896,8 +824,8 @@ namespace Phanes::Core::Math { * @return True if coincident, false if not. */ - template - inline bool IsCoincident(const TVector3& v1, const TVector3& v2, T threshold = 1.0f - P_FLT_INAC) + template + inline bool IsCoincident(const TVector3& v1, const TVector3& v2, T threshold = 1.0f - P_FLT_INAC) { return (DotP(v1, v2) > threshold); } @@ -911,8 +839,8 @@ namespace Phanes::Core::Math { * @return True if unit vector, false if not. */ - template - inline bool IsNormalized(const TVector3& v1, T threshold = P_FLT_INAC) + template + inline bool IsNormalized(const TVector3& v1, T threshold = P_FLT_INAC) { return (SqrMagnitude(v1) - 1 < threshold); } @@ -928,24 +856,12 @@ namespace Phanes::Core::Math { * @return True if coplanar, false if not. */ - template - inline bool IsCoplanar(const TVector3& v1, const TVector3& v2, const TVector3& v3, T threshold = P_FLT_INAC) + template + inline bool IsCoplanar(const TVector3& v1, const TVector3& v2, const TVector3& v3, T threshold = P_FLT_INAC) { return (ScalarTriple(v1, v2, v3) < threshold); } - /** - * Gets outer product of to vectors. - * - * @param(v1) Vector one - * @param(v2) Vector two - * - * @return Resulting matrix - */ - - // - //Matrix3 OuterProduct(const TVector3& v1, const TVector3& v2); - // ============ // // WITH RETURN: // // ============ // @@ -958,8 +874,8 @@ namespace Phanes::Core::Math { * @return Normalized vector */ - template - TVector3 Normalize(const TVector3& v1) + template + TVector3 Normalize(const TVector3& v1) { float vecNorm = Magnitude(v1); return (vecNorm < P_FLT_INAC) ? v1 : v1 / vecNorm; @@ -973,8 +889,8 @@ namespace Phanes::Core::Math { * @note Does not test for zero vector */ - template - TVector3 UnsafeNormalize(const TVector3& v1) + template + TVector3 UnsafeNormalize(const TVector3& v1) { return v1 / Magnitude(v1); } @@ -988,8 +904,8 @@ namespace Phanes::Core::Math { * @return Vector with signs a components. */ - template - TVector3 SignVector(const TVector3& v1) + template + TVector3 SignVector(const TVector3& v1) { return TVector3((v1.x >= (T)0) ? (T)1 : (T)-1, (v1.y >= (T)0) ? (T)1 : (T)-1, @@ -1005,8 +921,8 @@ namespace Phanes::Core::Math { * @return Reflected vector */ - template - TVector3 Reflect(const TVector3& v1, const TVector3& normal) + template + TVector3 Reflect(const TVector3& v1, const TVector3& normal) { return (2 * DotP(v1, normal) * normal) - v1; } @@ -1020,8 +936,8 @@ namespace Phanes::Core::Math { * @return Perspective divided vector */ - template - TVector3 PerspectiveDivide(const TVector3& v1) + template + TVector3 PerspectiveDivide(const TVector3& v1) { float _z = (T)1.0 / v1.z; return TVector3(v1.x * _z, v1.y * _z, (T)0.0); @@ -1049,8 +965,8 @@ namespace Phanes::Core::Math { * @return Cross product of v1 and v2 */ - template - TVector3 Lerp(const TVector3& start, const TVector3& dest, T t) + template + TVector3 Lerp(const TVector3& start, const TVector3& dest, T t) { t = Clamp(t, (T)0.0, (T)1.0); return ((1 - t) * start) + (t * dest); @@ -1067,10 +983,10 @@ namespace Phanes::Core::Math { * @note Does not clamp t between 0.0 and 1.0. */ - template - TVector3 LerpUnclamped(const TVector3& start, const TVector3& dest, T t) + template + TVector3 LerpUnclamped(const TVector3& start, const TVector3& dest, T t) { - return (1 - t) * start + t * dest; + return (((T)1.0 - t) * start) + (t * dest); } /** @@ -1082,13 +998,8 @@ namespace Phanes::Core::Math { * @return Vector of componentwise max */ - template - TVector3 Max(const TVector3& v1, const TVector3& v2) - { - return TVector3((v1.x > v2.x) ? v1.x : v2.x, - (v1.y > v2.y) ? v1.y : v2.y, - (v1.z > v2.z) ? v1.z : v2.z); - } + template + TVector3 Max(const TVector3& v1, const TVector3& v2); /** * Creates a new Vector by the componentwise min of both vectors @@ -1099,13 +1010,8 @@ namespace Phanes::Core::Math { * @return Vector of componentwise min */ - template - TVector3 Min(const TVector3& v1, const TVector3& v2) - { - return TVector3((v1.x < v2.x) ? v1.x : v2.x, - (v1.y < v2.y) ? v1.y : v2.y, - (v1.z < v2.z) ? v1.z : v2.z); - } + template + TVector3 Min(const TVector3& v1, const TVector3& v2); /** * Gets reversed vector. @@ -1115,25 +1021,10 @@ namespace Phanes::Core::Math { * @note result is stored in v1. */ - template - TVector3 Negate(const TVector3& v1) + template + TVector3 Negate(const TVector3& v1) { - return TVector3(-v1.x, -v1.y, -v1.z); - } - - /** - * Multiplies vector componentwise. - * - * @param(v1) Vector one - * @param(v2) Vector two - * - * @return Vector with componentwise products - */ - - template - TVector3 Scale(const TVector3& v1, const TVector3& v2) - { - return TVector3(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z); + return (T)0.0 - v1; } /** @@ -1146,8 +1037,8 @@ namespace Phanes::Core::Math { * @return Clamped vector */ - template - TVector3 ClampToMagnitude(const TVector3& v1, T min, T max) + template + TVector3 ClampToMagnitude(const TVector3& v1, T min, T max) { T magnitude = Magnitude(v1); @@ -1167,15 +1058,8 @@ namespace Phanes::Core::Math { * @result Vector clamped in cube. */ - template - TVector3 ClampToCube(const TVector3& v1, T cubeRadius) - { - return TVector3( - Clamp(v1.x, -cubeRadius, cubeRadius), - Clamp(v1.y, -cubeRadius, cubeRadius), - Clamp(v1.z, -cubeRadius, cubeRadius) - ); - }; + template + TVector3 ClampToCube(const TVector3& v1, T cubeRadius); /** * Scales vector two specific magnitude. @@ -1185,8 +1069,8 @@ namespace Phanes::Core::Math { * @note It's faster to use operator* or operator*= for naturaly normalized vectors. */ - template - TVector3 ScaleToMagnitude(const TVector3& v1, T magnitude) + template + TVector3 ScaleToMagnitude(const TVector3& v1, T magnitude) { return Normalize(v1) * magnitude; } @@ -1199,10 +1083,10 @@ namespace Phanes::Core::Math { * @result Vector with inverted components. */ - template - TVector3 CompInverse(const TVector3& v1) + template + TVector3 CompInverse(const TVector3& v1) { - return TVector3((T)1.0f / v1.x, (T)1.0f / v1.y, (T)1.0f / v1.z); + return (T)1.0 / v1; } /** @@ -1215,8 +1099,8 @@ namespace Phanes::Core::Math { * @note Calculates vector rotation with Rodrigues-Rotation */ - template - TVector3 RotateAroundAxis(const TVector3& v1, const TVector3& axisNormal, T angle) + template + TVector3 RotateAroundAxis(const TVector3& v1, const TVector3& axisNormal, T angle) { T sinAngle = sin(angle); T cosAngle = cos(angle); @@ -1234,8 +1118,8 @@ namespace Phanes::Core::Math { * @return Vector triple product */ - template - TVector3 VectorTriple(const TVector3& v1, const TVector3& v2, const TVector3& v3) + template + TVector3 VectorTriple(const TVector3& v1, const TVector3& v2, const TVector3& v3) { return CrossP(CrossP(v1, v2), v3); } @@ -1249,8 +1133,8 @@ namespace Phanes::Core::Math { * @return Projected vector */ - template - TVector3 Project(const TVector3& v1, const TVector3& v2) + template + TVector3 Project(const TVector3& v1, const TVector3& v2) { return (DotP(v1, v2) / DotP(v2, v2)) * v2; } @@ -1264,8 +1148,8 @@ namespace Phanes::Core::Math { * @return Rejected vector */ - template - TVector3 Reject(const TVector3& v1, const TVector3& v2) + template + TVector3 Reject(const TVector3& v1, const TVector3& v2) { return v1 - (DotP(v1, v2) / DotP(v2, v2)) * v2; } @@ -1280,8 +1164,8 @@ namespace Phanes::Core::Math { * @return Interpolated unit vector */ - template - TVector3 Slerp(const TVector3& v1, const TVector3& v2, T t) {}; + template + TVector3 Slerp(const TVector3& v1, const TVector3& v2, T t) {}; /** * Interpolate vector v1 to desitnation v2 using v1 constant s. The magnitude of the vector stays the same throughout the interpolation. @@ -1294,8 +1178,8 @@ namespace Phanes::Core::Math { * @note Does not clamp s between 0.0 and 1.0. */ - template - TVector3 SlerpUnclamped(const TVector3& v1, const TVector3& v2, T t) {}; + template + TVector3 SlerpUnclamped(const TVector3& v1, const TVector3& v2, T t) {}; } // phanes diff --git a/Engine/Source/Runtime/Core/public/Math/Vector3.inl b/Engine/Source/Runtime/Core/public/Math/Vector3.inl index bdd0589..665dcd2 100644 --- a/Engine/Source/Runtime/Core/public/Math/Vector3.inl +++ b/Engine/Source/Runtime/Core/public/Math/Vector3.inl @@ -45,56 +45,56 @@ namespace Phanes::Core::Math template - TVector3 operator+=(TVector3& v1, const TVector3& v2) + TVector3& operator+=(TVector3& v1, const TVector3& v2) { Detail::compute_vec3_add::map(v1, v1, v2); return v1; } template - TVector3 operator+=(TVector3& v1, T s) + TVector3& operator+=(TVector3& v1, T s) { Detail::compute_vec3_add::map(v1, v1, s); return v1; } template - TVector3 operator-=(TVector3& v1, const TVector3& v2) + TVector3& operator-=(TVector3& v1, const TVector3& v2) { Detail::compute_vec3_sub::map(v1, v1, v2); return v1; } template - TVector3 operator-=(TVector3& v1, T s) + TVector3& operator-=(TVector3& v1, T s) { Detail::compute_vec3_sub::map(v1, v1, s); return v1; } template - TVector3 operator*=(TVector3& v1, const TVector3& v2) + TVector3& operator*=(TVector3& v1, const TVector3& v2) { Detail::compute_vec3_mul::map(v1, v1, v2); return v1; } template - TVector3 operator*=(TVector3& v1, T s) + TVector3& operator*=(TVector3& v1, T s) { Detail::compute_vec3_mul::map(v1, v1, s); return v1; } template - TVector3 operator/=(TVector3& v1, const TVector3& v2) + TVector3& operator/=(TVector3& v1, const TVector3& v2) { Detail::compute_vec3_div::map(v1, v1, v2); return v1; } template - TVector3 operator/=(TVector3& v1, T s) + TVector3& operator/=(TVector3& v1, T s) { Detail::compute_vec3_div::map(v1, v1, s); return v1; @@ -132,6 +132,14 @@ namespace Phanes::Core::Math return r; } + template + TVector3 operator-(T s, const TVector3& v1) + { + TVector3 r; + Detail::compute_vec3_sub::map(r, s, v1); + return r; + } + template TVector3 operator*(const TVector3& v1, const TVector3& v2) { @@ -164,6 +172,14 @@ namespace Phanes::Core::Math return r; } + template + TVector3 operator/(T s, const TVector3& v1) + { + TVector3 r; + Detail::compute_vec3_div::map(r, s, v1); + return r; + } + // Comparision template @@ -221,10 +237,78 @@ namespace Phanes::Core::Math } template - TVector3 CrossPV(TVector3& v1, const TVector3& v2) + TVector3& CrossPV(TVector3& v1, const TVector3& v2) { Detail::compute_vec3_cross_p::map(v1, v1, v2); return v1; } + template + inline T Magnitude(const TVector3& v1) + { + return Detail::compute_vec3_mag::map(v1); + } + + template + inline T SqrMagnitude(const TVector3& v1) + { + return Detail::compute_vec3_dotp::map(v1, v1); + } + + template + inline T DotP(const TVector3& v1, const TVector3& v2) + { + return Detail::compute_vec3_dotp::map(v1, v2); + } + + template + TVector3& MaxV(TVector3& v1, const TVector3& v2) + { + Detail::compute_vec3_max::map(v1, v1, v2); + return v1; + } + + template + TVector3 Max(TVector3& v1, const TVector3& v2) + { + TVector3 r; + Detail::compute_vec3_max::map(r, v1, v2); + return r; + } + + template + TVector3& MinV(TVector3& v1, const TVector3& v2) + { + Detail::compute_vec3_min::map(v1, v1, v2); + return v1; + } + + template + TVector3 Min(TVector3& v1, const TVector3& v2) + { + TVector3 r; + Detail::compute_vec3_min::map(r, v1, v2); + return r; + } + + template + TVector3& Set(TVector3& v1, T x, T y, T z) + { + Detail::compute_vec3_set::map(v1, x, y, z); + } + + template + TVector3& ClampToCubeV(TVector3 v1, T cubeRadius) + { + Detail::compute_vec3_clamp::map(v1, v1, cubeRadius); + return v1; + } + + template + TVector3 ClampToCube(const TVector3& v1, T cubeRadius) + { + TVector3 r; + Detail::compute_vec3_clamp::map(r, v1, cubeRadius); + return r; + } } \ No newline at end of file diff --git a/Engine/Source/Runtime/Core/public/Math/Vector4.hpp b/Engine/Source/Runtime/Core/public/Math/Vector4.hpp index 8b2e82f..72b1546 100644 --- a/Engine/Source/Runtime/Core/public/Math/Vector4.hpp +++ b/Engine/Source/Runtime/Core/public/Math/Vector4.hpp @@ -17,7 +17,7 @@ namespace Phanes::Core::Math /// 4D Vector defined with x, y, z, w. /// Alignment allows for possible simd optimization. - template + template struct TVector4 { public: @@ -51,8 +51,8 @@ namespace Phanes::Core::Math /// union { - typename SIMD::Storage<4, Real, SIMD::use_simd::value>::type comp; - typename SIMD::Storage<4, Real, SIMD::use_simd::value>::type data; + typename SIMD::Storage<4, Real, SIMD::use_simd::value>::type comp; + typename SIMD::Storage<4, Real, SIMD::use_simd::value>::type data; }; }; @@ -61,7 +61,7 @@ namespace Phanes::Core::Math TVector4() = default; /// Copy constructor - TVector4(const TVector4& v); + TVector4(const TVector4& v); /// /// Construct vector from one scalar. @@ -86,7 +86,7 @@ namespace Phanes::Core::Math /// /// TVector2 one /// TVector2 two - TVector4(const TVector2& v1, const TVector2& v2); + TVector4(const TVector2& v1, const TVector2& v2); /// /// Construct vector from array of components @@ -110,8 +110,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Copy of v1. - template - TVector4 operator+= (TVector4& v1, const TVector4& v2); + template + TVector4& operator+= (TVector4& v1, const TVector4& v2); /// /// Vector - scalar addition. @@ -121,8 +121,8 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Copy of v1. - template - TVector4 operator+= (TVector4& v1, T s); + template + TVector4& operator+= (TVector4& v1, T s); /// /// Vector substraction. @@ -132,8 +132,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Copy of v1. - template - TVector4 operator-= (TVector4& v1, const TVector4& v2); + template + TVector4& operator-= (TVector4& v1, const TVector4& v2); /// /// Vector - scalar substraction. @@ -143,8 +143,8 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Copy of v1. - template - TVector4 operator-= (TVector4& v1, T s); + template + TVector4& operator-= (TVector4& v1, T s); /// /// Vector - scalar multiplication. @@ -154,8 +154,8 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Copy of v1. - template - TVector4 operator*= (TVector4& v1, T s); + template + TVector4& operator*= (TVector4& v1, T s); /// /// Scale vector by another vector componentwise. @@ -165,8 +165,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Copy of v1. - template - TVector4 operator*= (TVector4& v1, const TVector4& v2); + template + TVector4& operator*= (TVector4& v1, const TVector4& v2); /// /// Vector - scalar division. @@ -176,8 +176,8 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Copy of v1. - template - TVector4 operator/= (TVector4& v1, T s); + template + TVector4& operator/= (TVector4& v1, T s); /// /// Coponentwise vector division. @@ -187,8 +187,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Copy of v1. - template - TVector4 operator/= (TVector4& v1, const TVector4& v2); + template + TVector4& operator/= (TVector4& v1, const TVector4& v2); @@ -202,8 +202,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Computed vector. - template - TVector4 operator+ (const TVector4& v1, const TVector4& v2); + template + TVector4 operator+ (const TVector4& v1, const TVector4& v2); /// /// Vector - scalar addition. @@ -213,8 +213,8 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Computed vector. - template - TVector4 operator+ (const TVector4& v1, T s); + template + TVector4 operator+ (const TVector4& v1, T s); /// /// Vector substraction. @@ -224,8 +224,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Computed vector. - template - TVector4 operator- (const TVector4& v1, const TVector4& v2); + template + TVector4 operator- (const TVector4& v1, const TVector4& v2); /// /// Vector - scalar substraction. @@ -235,8 +235,11 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Computed vector. - template - TVector4 operator- (const TVector4& v1, T s); + template + TVector4 operator- (const TVector4& v1, T s); + + template + TVector4 operator- (T s, const TVector4& v1); /// /// Vector - scalar multiplication. @@ -246,11 +249,11 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Computed vector. - template - TVector4 operator* (const TVector4& v1, T s); + template + TVector4 operator* (const TVector4& v1, T s); - template - FORCEINLINE TVector4 operator* (T s, const TVector4& v1) { return v1 * s; }; + template + FORCEINLINE TVector4 operator* (T s, const TVector4& v1) { return v1 * s; }; /// /// Scale vector by another vector componentwise. @@ -260,8 +263,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Computed vector. - template - TVector4 operator* (const TVector4& v1, const TVector4& v2); + template + TVector4 operator* (const TVector4& v1, const TVector4& v2); /// /// Vector - scalar division. @@ -271,11 +274,11 @@ namespace Phanes::Core::Math /// Vector /// Scalar /// Computed vector. - template - TVector4 operator/ (const TVector4& v1, T s); + template + TVector4 operator/ (const TVector4& v1, T s); - template - FORCEINLINE TVector4 operator/ (T s, const TVector4& v1) { return v1 / s; }; + template + FORCEINLINE TVector4 operator/ (T s, const TVector4& v1); /// /// Componentwise vector division. @@ -285,8 +288,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Computed vector. - template - TVector4 operator/ (const TVector4& v1, const TVector4& v2); + template + TVector4 operator/ (const TVector4& v1, const TVector4& v2); @@ -300,8 +303,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// True, if equal and false if not. - template - bool operator==(const TVector4& v1, const TVector4& v2); + template + bool operator==(const TVector4& v1, const TVector4& v2); /// @@ -312,8 +315,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// True, if inequal and false if equal. - template - bool operator!=(const TVector4& v1, const TVector4& v2); + template + bool operator!=(const TVector4& v1, const TVector4& v2); @@ -328,8 +331,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Copy of v1. - template - TVector4& operator++(TVector4& v1); + template + TVector4& operator++(TVector4& v1); /// /// Decrement vector by one @@ -338,8 +341,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// v1 - template - TVector4& operator--(TVector4& v1); + template + TVector4& operator--(TVector4& v1); /// /// Increment vector by one @@ -348,8 +351,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// v1 - template - TVector4 operator++(TVector4& v1, int); + template + TVector4 operator++(TVector4& v1, int); /// /// Decrement vector by one @@ -358,8 +361,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Copy of v1. - template - TVector4 operator--(TVector4& v1, int); + template + TVector4 operator--(TVector4& v1, int); @@ -371,15 +374,27 @@ namespace Phanes::Core::Math // TVector4 functions // // ====================== // - template - void Set(TVector4& v1, TVector4& v2) + template + TVector4& Set(TVector4& v1, const TVector4& v2) { - v1.x = v2.x; - v1.y = v2.y; - v1.z = v2.z; - v1.w = v2.w; + v1 = v2; + return v1; } + /// + /// Set vector to values. + /// + /// Type of vector + /// Vector is aligned? + /// Vector + /// X Component + /// Y Component + /// Z Component + /// W Component + /// + template + TVector4& Set(TVector4& v1, T x, T y, T z, T w); + /// /// Get magnitude of vector. /// @@ -387,11 +402,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Magnitude of vector. - template - T Magnitude(const TVector4& v) - { - return sqrt(DotP(v, v)); - } + template + T Magnitude(const TVector4& v); /// /// Get square of magnitude of vector. @@ -400,11 +412,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Square of magnitude of vector. - template - T SqrMagnitude(const TVector4& v) - { - return DotP(v, v); - } + template + T SqrMagnitude(const TVector4& v); /// /// Get magnitude of vector. @@ -413,8 +422,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Magnitude of vector. - template - constexpr T Length(const TVector4& v) { return Magnitude(v); } + template + constexpr T Length(const TVector4& v) { return Magnitude(v); } /// /// Get square of magnitude of vector. @@ -423,8 +432,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Square of magnitude of vector. - template - constexpr T SqrLength(const TVector4& v) { return SqrMagnitude(v); } + template + constexpr T SqrLength(const TVector4& v) { return SqrMagnitude(v); } /// /// Angle between two vectors. @@ -434,8 +443,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// - template - T Angle(const TVector4& v1, const TVector4& v2) + template + T Angle(const TVector4& v1, const TVector4& v2) { return acos(DotP(v1, v2) / (Magnitude(v1) * Magnitude(v2))); } @@ -448,8 +457,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// - template - T CosineAngle(const TVector4& v1, const TVector4& v2) + template + T CosineAngle(const TVector4& v1, const TVector4& v2) { return DotP(v1, v2) / (Magnitude(v1) * Magnitude(v2)); } @@ -461,8 +470,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Normalized vector - template - TVector4 Normalize(const TVector4& v1) + template + TVector4 Normalize(const TVector4& v1) { T vecNorm = Magnitude(v1); @@ -478,8 +487,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Copy of v1. - template - TVector4 NormalizeV(TVector4& v1) + template + TVector4& NormalizeV(TVector4& v1) { T vecNorm = Magnitude(v1); @@ -498,8 +507,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Normalized vector - template - TVector4 UnsafeNormalize(const TVector4& v1) + template + TVector4 UnsafeNormalize(const TVector4& v1) { return v1 / Magnitude(v1); } @@ -512,8 +521,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Copy of v1. - template - TVector4 UnsafeNormalizeV(TVector4& v1) + template + TVector4& UnsafeNormalizeV(TVector4& v1) { v1 /= Magnitude(v1); return v1; @@ -527,11 +536,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Dot product between vectors. - template - T DotP(const TVector4& v1, const TVector4& v2) - { - return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w; - } + template + T DotP(const TVector4& v1, const TVector4& v2); /// /// Gets componentwise max of both vectors. @@ -541,16 +547,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Vector with componentwise max of both vectors. - template - TVector4 Max(const TVector4& v1, const TVector4& v2) - { - return TVector4( - (v1.x > v2.x) ? v1.x : v2.x, - (v1.y > v2.y) ? v1.y : v2.y, - (v1.z > v2.z) ? v1.z : v2.z, - (v1.w > v2.w) ? v1.w : v2.w - ); - } + template + TVector4 Max(const TVector4& v1, const TVector4& v2); /// /// Gets componentwise max of both vectors. @@ -560,16 +558,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Copy of v1. - template - TVector4 MaxV(TVector4& v1, const TVector4& v2) - { - v1.x = (v1.x > v2.x) ? v1.x : v2.x; - v1.y = (v1.y > v2.y) ? v1.y : v2.y; - v1.z = (v1.z > v2.z) ? v1.z : v2.z; - v1.w = (v1.w > v2.w) ? v1.w : v2.w; - - return v1; - } + template + TVector4& MaxV(TVector4& v1, const TVector4& v2); /// /// Gets componentwise min of both vectors. @@ -579,16 +569,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Vector with componentwise max of both vectors. - template - TVector4 Min(const TVector4& v1, const TVector4& v2) - { - return TVector4( - (v1.x < v2.x) ? v1.x : v2.x, - (v1.y < v2.y) ? v1.y : v2.y, - (v1.z < v2.z) ? v1.z : v2.z, - (v1.w < v2.w) ? v1.w : v2.w - ); - } + template + TVector4 Min(const TVector4& v1, const TVector4& v2); /// /// Gets componentwise min of both vectors. @@ -598,16 +580,8 @@ namespace Phanes::Core::Math /// Vector one /// Vector two /// Copy of v1. - template - TVector4 MinV(TVector4& v1, const TVector4& v2) - { - v1.x = (v1.x < v2.x) ? v1.x : v2.x; - v1.y = (v1.y < v2.y) ? v1.y : v2.y; - v1.z = (v1.z < v2.z) ? v1.z : v2.z; - v1.w = (v1.w < v2.w) ? v1.w : v2.w; - - return v1; - } + template + TVector4& MinV(TVector4& v1, const TVector4& v2); /// /// Inverses vector. @@ -616,15 +590,10 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Inverted vector - template - TVector4 Negate(const TVector4& v1) + template + TVector4 Negate(const TVector4& v1) { - return TVector4( - -v1.x, - -v1.y, - -v1.z, - -v1.w - ); + return (T)0.0 - v1; } /// @@ -634,15 +603,10 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Copy of v1. - template - TVector4 NegateV(TVector4& v1) + template + TVector4& NegateV(TVector4& v1) { - v1.x = -v1.x; - v1.y = -v1.y; - v1.z = -v1.z; - v1.w = -v1.w; - - return v1; + return (v1 = (T)0.0 - v1); } /// @@ -652,15 +616,10 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Vector with reciprocal of components. - template - TVector4 CompInverse(const TVector4& v1) + template + TVector4 CompInverse(const TVector4& v1) { - return TVector4( - (T)1.0 / v1.x, - (T)1.0 / v1.y, - (T)1.0 / v1.z, - (T)1.0 / v1.w - ); + return (T)1.0 / v1; } /// @@ -670,15 +629,10 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Copy of v1. - template - TVector4 CompInverseV(TVector4& v1) + template + TVector4& CompInverseV(TVector4& v1) { - v1.x = (T)1.0 / v1.x; - v1.y = (T)1.0 / v1.y; - v1.z = (T)1.0 / v1.z; - v1.w = (T)1.0 / v1.w; - - return v1; + return (v1 = (T)1.0 / v1); } /// @@ -689,12 +643,12 @@ namespace Phanes::Core::Math /// /// /// Vector with magnitude clamped to s. - template - TVector4 ClampToMagnitude(const TVector4& v1, T min, T max) + template + TVector4 ClampToMagnitude(const TVector4& v1, T min, T max) { T magnitude = Magnitude(v1); - TVector4 unitVec; + TVector4 unitVec; unitVec = (magnitude > P_FLT_INAC) ? v1 / magnitude : PZeroVector4(T, false); magnitude = Clamp(magnitude, min, max); @@ -710,8 +664,8 @@ namespace Phanes::Core::Math /// Vector /// Magnitude /// Copy of v1. - template - TVector4 ClampToMagnitudeV(TVector4& v1, T min, T max) + template + TVector4& ClampToMagnitudeV(TVector4& v1, T min, T max) { T magnitude = Magnitude(v1); @@ -730,8 +684,8 @@ namespace Phanes::Core::Math /// Vector /// Magnitude /// Vector with scaled magnitude. - template - TVector4 ScaleToMagnitude(const TVector4& v1, T s) + template + TVector4 ScaleToMagnitude(const TVector4& v1, T s) { return Normalize(v1) * s; } @@ -744,8 +698,8 @@ namespace Phanes::Core::Math /// Vector /// Magnitude /// Copy of v1. - template - TVector4 ScaleToMagnitudeV(TVector4& v1, T s) + template + TVector4& ScaleToMagnitudeV(TVector4& v1, T s) { NormalizeV(v1); v1 *= s; @@ -760,10 +714,10 @@ namespace Phanes::Core::Math /// Vector /// Planes normal /// Reflected vector - template - TVector4 Reflect(const TVector4& v1, const TVector4 normal) + template + TVector4 Reflect(const TVector4& v1, const TVector4 normal) { - return (2 * DotP(v1, normal) * normal) - v1; + return ((T)2.0 * DotP(v1, normal) * normal) - v1; } /// @@ -774,10 +728,10 @@ namespace Phanes::Core::Math /// Vector /// Planes normal /// Copy of v1. - template - TVector4 ReflectV(TVector4& v1, const TVector4 normal) + template + TVector4& ReflectV(TVector4& v1, const TVector4 normal) { - v1 = (2 * DotP(v1, normal) * normal) - v1; + v1 = ((T)2.0 * DotP(v1, normal) * normal) - v1; return v1; } @@ -789,8 +743,8 @@ namespace Phanes::Core::Math /// Vector to project /// Vector to project on /// Projected vector. - template - TVector4 Project(const TVector4& v1, const TVector4 v2) + template + TVector4 Project(const TVector4& v1, const TVector4 v2) { return (DotP(v1, v2) / DotP(v2, v2)) * v2; } @@ -803,8 +757,8 @@ namespace Phanes::Core::Math /// Vector to project /// Vector to project on /// Copy of v1. - template - TVector4 ProjectV(TVector4& v1, const TVector4 v2) + template + TVector4& ProjectV(TVector4& v1, const TVector4 v2) { v1 = (DotP(v1, v2) / DotP(v2, v2)) * v2; @@ -819,8 +773,8 @@ namespace Phanes::Core::Math /// Vector to reject /// Vector to reject from /// Rejected vector. - template - TVector4 Reject(const TVector4& v1, const TVector4 v2) + template + TVector4 Reject(const TVector4& v1, const TVector4 v2) { return v1 - (DotP(v1, v2) / DotP(v2, v2)) * v2; } @@ -833,8 +787,8 @@ namespace Phanes::Core::Math /// Vector to reject /// Vector to reject from /// Copy of v1. - template - TVector4 RejectV(TVector4& v1, const TVector4 v2) + template + TVector4& RejectV(TVector4& v1, const TVector4 v2) { v1 = v1 - (DotP(v1, v2) / DotP(v2, v2)) * v2; @@ -848,17 +802,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Perspective divided vector. - template - TVector4 PerspectiveDivide(const TVector4& v1) - { - float _1_w = (T)1.0 / v1.w; - return TVector4( - v1.x * _1_w, - v1.y * _1_w, - v1.z * _1_w, - (T)0.0 - ); - } + template + TVector4 PerspectiveDivide(const TVector4& v1); /// /// Perspective divide vector. @@ -867,18 +812,8 @@ namespace Phanes::Core::Math /// Vector is aligned? /// Vector /// Copy of v1. - template - TVector4 PerspectiveDivideV(TVector4& v1) - { - float _1_w = (T)1.0 / v1.w; - - v1.x *= _1_w; - v1.y *= _1_w; - v1.z *= _1_w; - v1.w = (T)0.0; - - return v1; - } + template + TVector4& PerspectiveDivideV(TVector4& v1); /// /// Tests if vector is normalized. @@ -887,8 +822,8 @@ namespace Phanes::Core::Math /// Vector /// Threshold to vector magnitude of 1.0 /// True if vector is normalized, false if not. - template - FORCEINLINE bool IsNormalized(const TVector4& v1, T threshold = P_FLT_INAC) + template + FORCEINLINE bool IsNormalized(const TVector4& v1, T threshold = P_FLT_INAC) { return (SqrMagnitude(v1) - (T)1.0) < threshold; } @@ -901,8 +836,8 @@ namespace Phanes::Core::Math /// Vector /// Allowed T inaccuracy from one (e.g. 0.98f) /// True if parallel, false if not. - template - FORCEINLINE bool IsParallel(const TVector4& v1, const TVector4& v2, T threshold = 1.0f - P_FLT_INAC) + template + FORCEINLINE bool IsParallel(const TVector4& v1, const TVector4& v2, T threshold = 1.0f - P_FLT_INAC) { return (abs(DotP(v1, v2)) > threshold); } @@ -915,8 +850,8 @@ namespace Phanes::Core::Math /// Vector /// Allowed T inaccuracy from one (e.g. 0.98f) /// True if coincident, false if not. - template - FORCEINLINE bool IsCoincident(const TVector4& v1, const TVector4& v2, T threshold = 1.0f - P_FLT_INAC) + template + FORCEINLINE bool IsCoincident(const TVector4& v1, const TVector4& v2, T threshold = 1.0f - P_FLT_INAC) { return (DotP(v1, v2) > threshold); } diff --git a/Engine/Source/Runtime/Core/public/Math/Vector4.inl b/Engine/Source/Runtime/Core/public/Math/Vector4.inl index 51ece7c..7444d94 100644 --- a/Engine/Source/Runtime/Core/public/Math/Vector4.inl +++ b/Engine/Source/Runtime/Core/public/Math/Vector4.inl @@ -17,7 +17,7 @@ namespace Phanes::Core::Math } template - TVector4::TVector4(Real _x, Real _y, Real _z, Real _w) + TVector4::TVector4(Real _x, Real _y, Real _z, Real _w) { Detail::construct_vec4::map(*this, _x, _y, _z, _w); } @@ -42,56 +42,56 @@ namespace Phanes::Core::Math template - TVector4 operator+=(TVector4& v1, const TVector4& v2) + TVector4& operator+=(TVector4& v1, const TVector4& v2) { Detail::compute_vec4_add::map(v1, v1, v2); return v1; } template - TVector4 operator+=(TVector4& v1, T s) + TVector4& operator+=(TVector4& v1, T s) { Detail::compute_vec4_add::map(v1, v1, s); return v1; } template - TVector4 operator-=(TVector4& v1, const TVector4& v2) + TVector4& operator-=(TVector4& v1, const TVector4& v2) { Detail::compute_vec4_sub::map(v1, v1, v2); return v1; } template - TVector4 operator-=(TVector4& v1, T s) + TVector4& operator-=(TVector4& v1, T s) { Detail::compute_vec4_sub::map(v1, v1, s); return v1; } template - TVector4 operator*=(TVector4& v1, const TVector4& v2) + TVector4& operator*=(TVector4& v1, const TVector4& v2) { Detail::compute_vec4_mul::map(v1, v1, v2); return v1; } template - TVector4 operator*=(TVector4& v1, T s) + TVector4& operator*=(TVector4& v1, T s) { Detail::compute_vec4_mul::map(v1, v1, s); return v1; } template - TVector4 operator/=(TVector4& v1, const TVector4& v2) + TVector4& operator/=(TVector4& v1, const TVector4& v2) { Detail::compute_vec4_div::map(v1, v1, v2); return v1; } template - TVector4 operator/=(TVector4& v1, T s) + TVector4& operator/=(TVector4& v1, T s) { Detail::compute_vec4_div::map(v1, v1, s); return v1; @@ -100,7 +100,7 @@ namespace Phanes::Core::Math template TVector4 operator+(const TVector4& v1, const TVector4& v2) { - TVector4 r; + TVector4 r; Detail::compute_vec4_add::map(r, v1, v2); return r; } @@ -129,6 +129,14 @@ namespace Phanes::Core::Math return r; } + template + TVector4 operator-(T s, const TVector4& v1) + { + TVector4 r; + Detail::compute_vec4_sub::map(r, s, v1); + return r; + } + template TVector4 operator*(const TVector4& v1, const TVector4& v2) { @@ -161,6 +169,14 @@ namespace Phanes::Core::Math return r; } + template + TVector4 operator/(T s, const TVector4& v1) + { + TVector4 r; + Detail::compute_vec4_div::map(r, s, v1); + return r; + } + // Comparision template @@ -175,8 +191,8 @@ namespace Phanes::Core::Math return Detail::compute_vec4_ieq::map(v1, v2); } - - + + // Inc- / Decrement @@ -206,9 +222,72 @@ namespace Phanes::Core::Math return --v1; } - template - T DotP(const TVector4& v1, const TVector4& v2) + template + T DotP(const TVector4& v1, const TVector4& v2) { - return vec4_dot_cvtf32(v1.data, v2.data); + return Detail::compute_vec4_dotp ::map(v1, v2); + } + + template + TVector4& Set(TVector4& v1, T x, T y, T z, T w) + { + Detail::compute_vec4_set::map(v1, x, y, z, w); + } + + template + T Magnitude(const TVector4& v) + { + return Detail::compute_vec4_mag::map(v); + } + + template + T SqrMagnitude(const TVector4& v) + { + return Detail::compute_vec4_dotp::map(v, v); + } + + template + TVector4 Max(const TVector4& v1, const TVector4& v2) + { + TVector4 r; + Detail::compute_vec4_max::map(r, v1, v2); + return r; + } + + template + TVector4& MaxV(TVector4& v1, const TVector4& v2) + { + Detail::compute_vec4_max::map(v1, v1, v2); + return v1; + } + + template + TVector4 Min(const TVector4& v1, const TVector4& v2) + { + TVector4 r; + Detail::compute_vec4_min::map(r, v1, v2); + return r; + } + + template + TVector4& MinV(TVector4& v1, const TVector4& v2) + { + Detail::compute_vec4_min::map(v1, v1, v2); + return v1; + } + + template + TVector4 PerspectiveDivide(const TVector4& v1) + { + TVector4 r; + Detail::compute_vec4_pdiv::map(r, v1); + return r; + } + + template + TVector4& PerspectiveDivideV(TVector4& v1) + { + Detail::compute_vec4_pdiv::map(v1, v1); + return v1; } } \ No newline at end of file