diff --git a/lib/sead/include/math/seadVector.h b/lib/sead/include/math/seadVector.h index 83778ff2..b7e25c9a 100644 --- a/lib/sead/include/math/seadVector.h +++ b/lib/sead/include/math/seadVector.h @@ -131,10 +131,14 @@ struct Vector3 : public Policies::Vec3Base bool equals(const Vector3& rhs, T epsilon = 0) const; void add(const Vector3& a); - /// Multiply m by this vector (self = m * self). + /// Apply a rotation `m` to this vector. void mul(const Mtx33& m); - /// Apply a transformation `m` (rotation + translation) to this vector. + /// Apply a transformation `m` (rotation then translation) to this vector. void mul(const Mtx34& m); + /// Apply a rotation `m` to this vector. + void rotate(const Mtx33& m); + /// Apply a rotation `m` to this vector. + void rotate(const Mtx34& m); void multScalar(T t); T normalize(); @@ -144,6 +148,8 @@ struct Vector3 : public Policies::Vec3Base void setScaleAdd(T t, const Vector3& a, const Vector3& b); void setMul(const Mtx33& m, const Vector3& a); void setMul(const Mtx34& m, const Vector3& a); + void setRotated(const Mtx33& m, const Vector3& a); + void setRotated(const Mtx34& m, const Vector3& a); static const Vector3 zero; static const Vector3 ex; diff --git a/lib/sead/include/math/seadVector.hpp b/lib/sead/include/math/seadVector.hpp index e32ac9a6..dacf4bcd 100644 --- a/lib/sead/include/math/seadVector.hpp +++ b/lib/sead/include/math/seadVector.hpp @@ -173,6 +173,18 @@ inline void Vector3::mul(const Mtx34& m) setMul(m, *this); } +template +inline void Vector3::rotate(const Mtx33& m) +{ + setRotated(m, *this); +} + +template +inline void Vector3::rotate(const Mtx34& m) +{ + setRotated(m, *this); +} + template inline void Vector3::multScalar(T t) { @@ -221,6 +233,18 @@ inline void Vector3::setMul(const Mtx34& m, const Vector3& a) Vector3CalcCommon::mul(*this, m, a); } +template +inline void Vector3::setRotated(const Mtx33& m, const Vector3& a) +{ + Vector3CalcCommon::rotate(*this, m, a); +} + +template +inline void Vector3::setRotated(const Mtx34& m, const Vector3& a) +{ + Vector3CalcCommon::rotate(*this, m, a); +} + template inline Vector4::Vector4(T x_, T y_, T z_, T w_) { diff --git a/lib/sead/include/math/seadVectorCalcCommon.h b/lib/sead/include/math/seadVectorCalcCommon.h index d8df14b2..4475dd19 100644 --- a/lib/sead/include/math/seadVectorCalcCommon.h +++ b/lib/sead/include/math/seadVectorCalcCommon.h @@ -28,10 +28,16 @@ public: static void add(Base& o, const Base& a, const Base& b); static void sub(Base& o, const Base& a, const Base& b); + /// Apply a rotation `m` to the vector `a`. static void mul(Base& o, const Mtx33& m, const Base& a); - /// Apply a transformation `m` (rotation + translation) to the vector `a`. + /// Apply a transformation `m` (rotation then translation) to the vector `a`. static void mul(Base& o, const Mtx34& m, const Base& a); + /// Apply a rotation `m` to the vector `a`. + static void rotate(Base& o, const Mtx33& m, const Base& a); + /// Apply a rotation `m` to the vector `a`. + static void rotate(Base& o, const Mtx34& m, const Base& a); + static void cross(Base& o, const Base& a, const Base& b); static T dot(const Base& a, const Base& b); static T squaredLength(const Base& v); diff --git a/lib/sead/include/math/seadVectorCalcCommon.hpp b/lib/sead/include/math/seadVectorCalcCommon.hpp index ecb74b0e..152a7e09 100644 --- a/lib/sead/include/math/seadVectorCalcCommon.hpp +++ b/lib/sead/include/math/seadVectorCalcCommon.hpp @@ -95,6 +95,21 @@ inline void Vector3CalcCommon::mul(Base& o, const Mtx34& m, const Base& a) o.z = m.m[2][0] * tmp.x + m.m[2][1] * tmp.y + m.m[2][2] * tmp.z + m.m[2][3]; } +template +inline void Vector3CalcCommon::rotate(Base& o, const Mtx33& m, const Base& a) +{ + mul(o, m, a); +} + +template +inline void Vector3CalcCommon::rotate(Base& o, const Mtx34& m, const Base& a) +{ + const Base tmp = a; + o.x = m.m[0][0] * tmp.x + m.m[0][1] * tmp.y + m.m[0][2] * tmp.z; + o.y = m.m[1][0] * tmp.x + m.m[1][1] * tmp.y + m.m[1][2] * tmp.z; + o.z = m.m[2][0] * tmp.x + m.m[2][1] * tmp.y + m.m[2][2] * tmp.z; +} + template inline void Vector3CalcCommon::cross(Base& o, const Base& a, const Base& b) {