#pragma once #include #include #include #include #include namespace sead { template struct Quat : public Policies::QuatBase { private: typedef Quat Self; typedef Vector3 Vec3; public: Quat() {} Quat(const Quat& other) = default; Quat(T w, T x, T y, T z); Quat& operator=(const Quat& other) { this->w = other.w; this->x = other.x; this->y = other.y; this->z = other.z; return *this; } friend Quat operator*(const Quat& a, T t) { auto result = a; result *= t; return result; } friend Quat operator*(const Quat& a, const Quat& b) { auto result = a; result *= b; return result; } friend Quat operator*(T t, const Quat& a) { return operator*(a, t); } Quat& operator*=(const Quat& t); Quat& operator*=(T t) { this->w *= t; this->x *= t; this->y *= t; this->z *= t; return *this; } bool operator==(const Quat& rhs) const { return this->x == rhs.x && this->y == rhs.y && this->z == rhs.z && this->w == rhs.w; } T length() const; T normalize(); T dot(const Self& q); void inverse(Self* q); void makeUnit(); bool makeVectorRotation(const Vec3& from, const Vec3& to); void set(T w, T x, T y, T z); void setRPY(T roll, T pitch, T yaw); void calcRPY(Vec3& rpy) const; static const Quat unit; }; using Quatf = Quat; template <> const Quatf Quatf::unit; } // namespace sead #define SEAD_MATH_QUAT_H_ #include #undef SEAD_MATH_QUAT_H_