Path: blob/master/thirdparty/jolt_physics/Jolt/Math/Vector.h
9913 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56JPH_NAMESPACE_BEGIN78/// Templatized vector class9template <uint Rows>10class [[nodiscard]] Vector11{12public:13/// Constructor14inline Vector() = default;15inline Vector(const Vector &) = default;1617/// Dimensions18inline uint GetRows() const { return Rows; }1920/// Vector with all zeros21inline void SetZero()22{23for (uint r = 0; r < Rows; ++r)24mF32[r] = 0.0f;25}2627inline static Vector sZero() { Vector v; v.SetZero(); return v; }2829/// Copy a (part) of another vector into this vector30template <class OtherVector>31void CopyPart(const OtherVector &inV, uint inSourceRow, uint inNumRows, uint inDestRow)32{33for (uint r = 0; r < inNumRows; ++r)34mF32[inDestRow + r] = inV[inSourceRow + r];35}3637/// Get float component by index38inline float operator [] (uint inCoordinate) const39{40JPH_ASSERT(inCoordinate < Rows);41return mF32[inCoordinate];42}4344inline float & operator [] (uint inCoordinate)45{46JPH_ASSERT(inCoordinate < Rows);47return mF32[inCoordinate];48}4950/// Comparison51inline bool operator == (const Vector &inV2) const52{53for (uint r = 0; r < Rows; ++r)54if (mF32[r] != inV2.mF32[r])55return false;56return true;57}5859inline bool operator != (const Vector &inV2) const60{61for (uint r = 0; r < Rows; ++r)62if (mF32[r] != inV2.mF32[r])63return true;64return false;65}6667/// Test if vector consists of all zeros68inline bool IsZero() const69{70for (uint r = 0; r < Rows; ++r)71if (mF32[r] != 0.0f)72return false;73return true;74}7576/// Test if two vectors are close to each other77inline bool IsClose(const Vector &inV2, float inMaxDistSq = 1.0e-12f) const78{79return (inV2 - *this).LengthSq() <= inMaxDistSq;80}8182/// Assignment83inline Vector & operator = (const Vector &) = default;8485/// Multiply vector with float86inline Vector operator * (const float inV2) const87{88Vector v;89for (uint r = 0; r < Rows; ++r)90v.mF32[r] = mF32[r] * inV2;91return v;92}9394inline Vector & operator *= (const float inV2)95{96for (uint r = 0; r < Rows; ++r)97mF32[r] *= inV2;98return *this;99}100101/// Multiply vector with float102inline friend Vector operator * (const float inV1, const Vector &inV2)103{104return inV2 * inV1;105}106107/// Divide vector by float108inline Vector operator / (float inV2) const109{110Vector v;111for (uint r = 0; r < Rows; ++r)112v.mF32[r] = mF32[r] / inV2;113return v;114}115116inline Vector & operator /= (float inV2)117{118for (uint r = 0; r < Rows; ++r)119mF32[r] /= inV2;120return *this;121}122123/// Add two float vectors (component wise)124inline Vector operator + (const Vector &inV2) const125{126Vector v;127for (uint r = 0; r < Rows; ++r)128v.mF32[r] = mF32[r] + inV2.mF32[r];129return v;130}131132inline Vector & operator += (const Vector &inV2)133{134for (uint r = 0; r < Rows; ++r)135mF32[r] += inV2.mF32[r];136return *this;137}138139/// Negate140inline Vector operator - () const141{142Vector v;143for (uint r = 0; r < Rows; ++r)144v.mF32[r] = -mF32[r];145return v;146}147148/// Subtract two float vectors (component wise)149inline Vector operator - (const Vector &inV2) const150{151Vector v;152for (uint r = 0; r < Rows; ++r)153v.mF32[r] = mF32[r] - inV2.mF32[r];154return v;155}156157inline Vector & operator -= (const Vector &inV2)158{159for (uint r = 0; r < Rows; ++r)160mF32[r] -= inV2.mF32[r];161return *this;162}163164/// Dot product165inline float Dot(const Vector &inV2) const166{167float dot = 0.0f;168for (uint r = 0; r < Rows; ++r)169dot += mF32[r] * inV2.mF32[r];170return dot;171}172173/// Squared length of vector174inline float LengthSq() const175{176return Dot(*this);177}178179/// Length of vector180inline float Length() const181{182return sqrt(LengthSq());183}184185/// Check if vector is normalized186inline bool IsNormalized(float inToleranceSq = 1.0e-6f)187{188return abs(LengthSq() - 1.0f) <= inToleranceSq;189}190191/// Normalize vector192inline Vector Normalized() const193{194return *this / Length();195}196197/// To String198friend ostream & operator << (ostream &inStream, const Vector &inV)199{200inStream << "[";201for (uint i = 0; i < Rows - 1; ++i)202inStream << inV.mF32[i] << ", ";203inStream << inV.mF32[Rows - 1] << "]";204return inStream;205}206207float mF32[Rows];208};209210JPH_NAMESPACE_END211212213