mirror of https://github.com/zeldaret/botw.git
math/Vector: Add Vector3 rotation
This commit is contained in:
parent
cb6b94aab4
commit
1a419d0497
|
@ -131,10 +131,14 @@ struct Vector3 : public Policies<T>::Vec3Base
|
||||||
bool equals(const Vector3& rhs, T epsilon = 0) const;
|
bool equals(const Vector3& rhs, T epsilon = 0) const;
|
||||||
|
|
||||||
void add(const Vector3& a);
|
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);
|
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);
|
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);
|
void multScalar(T t);
|
||||||
|
|
||||||
T normalize();
|
T normalize();
|
||||||
|
@ -144,6 +148,8 @@ struct Vector3 : public Policies<T>::Vec3Base
|
||||||
void setScaleAdd(T t, const Vector3<T>& a, const Vector3<T>& b);
|
void setScaleAdd(T t, const Vector3<T>& a, const Vector3<T>& b);
|
||||||
void setMul(const Mtx33& m, const Vector3& a);
|
void setMul(const Mtx33& m, const Vector3& a);
|
||||||
void setMul(const Mtx34& 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 zero;
|
||||||
static const Vector3 ex;
|
static const Vector3 ex;
|
||||||
|
|
|
@ -173,6 +173,18 @@ inline void Vector3<T>::mul(const Mtx34& m)
|
||||||
setMul(m, *this);
|
setMul(m, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void Vector3<T>::rotate(const Mtx33& m)
|
||||||
|
{
|
||||||
|
setRotated(m, *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void Vector3<T>::rotate(const Mtx34& m)
|
||||||
|
{
|
||||||
|
setRotated(m, *this);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void Vector3<T>::multScalar(T t)
|
inline void Vector3<T>::multScalar(T t)
|
||||||
{
|
{
|
||||||
|
@ -221,6 +233,18 @@ inline void Vector3<T>::setMul(const Mtx34& m, const Vector3<T>& a)
|
||||||
Vector3CalcCommon<T>::mul(*this, m, a);
|
Vector3CalcCommon<T>::mul(*this, m, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void Vector3<T>::setRotated(const Mtx33& m, const Vector3<T>& a)
|
||||||
|
{
|
||||||
|
Vector3CalcCommon<T>::rotate(*this, m, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void Vector3<T>::setRotated(const Mtx34& m, const Vector3<T>& a)
|
||||||
|
{
|
||||||
|
Vector3CalcCommon<T>::rotate(*this, m, a);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline Vector4<T>::Vector4(T x_, T y_, T z_, T w_)
|
inline Vector4<T>::Vector4(T x_, T y_, T z_, T w_)
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,10 +28,16 @@ public:
|
||||||
|
|
||||||
static void add(Base& o, const Base& a, const Base& b);
|
static void add(Base& o, const Base& a, const Base& b);
|
||||||
static void sub(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);
|
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);
|
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 void cross(Base& o, const Base& a, const Base& b);
|
||||||
static T dot(const Base& a, const Base& b);
|
static T dot(const Base& a, const Base& b);
|
||||||
static T squaredLength(const Base& v);
|
static T squaredLength(const Base& v);
|
||||||
|
|
|
@ -95,6 +95,21 @@ inline void Vector3CalcCommon<T>::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];
|
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 <typename T>
|
||||||
|
inline void Vector3CalcCommon<T>::rotate(Base& o, const Mtx33& m, const Base& a)
|
||||||
|
{
|
||||||
|
mul(o, m, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void Vector3CalcCommon<T>::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 <typename T>
|
template <typename T>
|
||||||
inline void Vector3CalcCommon<T>::cross(Base& o, const Base& a, const Base& b)
|
inline void Vector3CalcCommon<T>::cross(Base& o, const Base& a, const Base& b)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue