#ifndef UTIL_QUAT_H
#define UTIL_QUAT_H

/**
 * Quaternion class.
 */
class Quat
{

public:

    Quat();
    Quat(float x, float y, float z, float w);
    Quat(const float angles[3]);
    Quat(const float xAxis[3], const float yAxis[3], const float zAxis[3]);
    Quat(float angle, const float axis[3]);

    /**
     * For a unit quaternion, the conjugate is the inverse.
     */
    Quat Conjugate() const;

    Quat Unit() const;

    void GetVectors(float xAxis[3], float yAxis[3], float zAxis[3]) const;

	void GetAngles(float outAngles[3]) const;

public:

    float x;
    float y;
    float z;
    float w;

};

Quat operator*(const Quat& q1, const Quat& q2);

Quat ConstantRateLerp(const Quat& src, const Quat& dst, float amount);

#endif