3D Audio GSoC:
[blender.git] / intern / audaspace / intern / AUD_3DMath.h
index fc095ebaca7cb32c9c345204d4bdbd0f80115752..3a6abf811ce2b739cc473ce143ef545ec2b4cf40 100644 (file)
 #ifndef AUD_3DMATH
 #define AUD_3DMATH
 
-class AUD_Quaternion
+#include <cmath>
+
+class AUD_Vector3
 {
 private:
        union
        {
-               float m_v[4];
+               float m_v[3];
                struct
                {
-                       float m_w;
                        float m_x;
                        float m_y;
                        float m_z;
@@ -49,28 +50,18 @@ private:
 
 public:
        /**
-        * Creates a new quaternion.
-        * \param w The w component.
+        * Creates a new 3 dimensional vector.
         * \param x The x component.
         * \param y The y component.
         * \param z The z component.
         */
-       inline AUD_Quaternion(float w, float x, float y, float z) :
-               m_w(w), m_x(x), m_y(y), m_z(z)
-       {
-       }
-
-       /**
-        * Retrieves the w component of the quarternion.
-        * \return The w component.
-        */
-       inline const float& w() const
+       inline AUD_Vector3(float x = 0, float y = 0, float z = 0) :
+               m_x(x), m_y(y), m_z(z)
        {
-               return m_w;
        }
 
        /**
-        * Retrieves the x component of the quarternion.
+        * Retrieves the x component of the vector.
         * \return The x component.
         */
        inline const float& x() const
@@ -79,7 +70,7 @@ public:
        }
 
        /**
-        * Retrieves the y component of the quarternion.
+        * Retrieves the y component of the vector.
         * \return The y component.
         */
        inline const float& y() const
@@ -88,7 +79,7 @@ public:
        }
 
        /**
-        * Retrieves the z component of the quarternion.
+        * Retrieves the z component of the vector.
         * \return The z component.
         */
        inline const float& z() const
@@ -98,34 +89,80 @@ public:
 
        /**
         * Retrieves the components of the vector.
-        * \param destination Where the 4 float values should be saved to.
+        * \param destination Where the 3 float values should be saved to.
         */
        inline void get(float* destination) const
        {
-               destination[0] = m_w;
-               destination[1] = m_x;
-               destination[2] = m_y;
-               destination[3] = m_z;
+               destination[0] = m_x;
+               destination[1] = m_y;
+               destination[2] = m_z;
        }
 
        /**
         * Retrieves the components of the vector.
-        * \return The components as float[4].
+        * \return The components as float[3].
         */
        inline const float* get() const
        {
                return m_v;
        }
+
+       /**
+        * Retrieves the length of the vector.
+        * \return The length of the vector.
+        */
+       inline float length() const
+       {
+               return sqrt(m_x*m_x + m_y*m_y + m_z*m_z);
+       }
+
+       inline AUD_Vector3 cross(const AUD_Vector3& op) const
+       {
+               return AUD_Vector3(m_y * op.m_z - m_z * op.m_y,
+                                                  m_z * op.m_x - m_x * op.m_z,
+                                                  m_x * op.m_y - m_y * op.m_x);
+       }
+
+       /**
+        * Retrieves the dot product.
+        * \param op The second operand.
+        * \return The dot product of the two vectors.
+        */
+       inline float operator*(const AUD_Vector3& op) const
+       {
+               return m_x * op.m_x + m_y * op.m_y + m_z * op.m_z;
+       }
+
+       inline AUD_Vector3 operator*(const float& op) const
+       {
+               return AUD_Vector3(m_x * op, m_y * op, m_z * op);
+       }
+
+       inline AUD_Vector3 operator+(const AUD_Vector3& op) const
+       {
+               return AUD_Vector3(m_x + op.m_x, m_y + op.m_y, m_z + op.m_z);
+       }
+
+       inline AUD_Vector3 operator-(const AUD_Vector3& op) const
+       {
+               return AUD_Vector3(m_x - op.m_x, m_y - op.m_y, m_z - op.m_z);
+       }
+
+       inline AUD_Vector3 operator-() const
+       {
+               return AUD_Vector3(-m_x, -m_y, -m_z);
+       }
 };
 
-class AUD_Vector3
+class AUD_Quaternion
 {
 private:
        union
        {
-               float m_v[3];
+               float m_v[4];
                struct
                {
+                       float m_w;
                        float m_x;
                        float m_y;
                        float m_z;
@@ -134,18 +171,28 @@ private:
 
 public:
        /**
-        * Creates a new 3 dimensional vector.
+        * Creates a new quaternion.
+        * \param w The w component.
         * \param x The x component.
         * \param y The y component.
         * \param z The z component.
         */
-       inline AUD_Vector3(float x, float y, float z) :
-               m_x(x), m_y(y), m_z(z)
+       inline AUD_Quaternion(float w = 1, float x = 0, float y = 0, float z = 0) :
+               m_w(w), m_x(x), m_y(y), m_z(z)
        {
        }
 
        /**
-        * Retrieves the x component of the vector.
+        * Retrieves the w component of the quarternion.
+        * \return The w component.
+        */
+       inline const float& w() const
+       {
+               return m_w;
+       }
+
+       /**
+        * Retrieves the x component of the quarternion.
         * \return The x component.
         */
        inline const float& x() const
@@ -154,7 +201,7 @@ public:
        }
 
        /**
-        * Retrieves the y component of the vector.
+        * Retrieves the y component of the quarternion.
         * \return The y component.
         */
        inline const float& y() const
@@ -163,7 +210,7 @@ public:
        }
 
        /**
-        * Retrieves the z component of the vector.
+        * Retrieves the z component of the quarternion.
         * \return The z component.
         */
        inline const float& z() const
@@ -173,23 +220,38 @@ public:
 
        /**
         * Retrieves the components of the vector.
-        * \param destination Where the 3 float values should be saved to.
+        * \param destination Where the 4 float values should be saved to.
         */
        inline void get(float* destination) const
        {
-               destination[0] = m_x;
-               destination[1] = m_y;
-               destination[2] = m_z;
+               destination[0] = m_w;
+               destination[1] = m_x;
+               destination[2] = m_y;
+               destination[3] = m_z;
        }
 
        /**
         * Retrieves the components of the vector.
-        * \return The components as float[3].
+        * \return The components as float[4].
         */
        inline const float* get() const
        {
                return m_v;
        }
+
+       inline AUD_Vector3 getLookAt() const
+       {
+               return AUD_Vector3(-2 * (m_w * m_y + m_x * m_z),
+                                                       2 * (m_x * m_w - m_z * m_y),
+                                                       2 * (m_x * m_x + m_y * m_y) - 1);
+       }
+
+       inline AUD_Vector3 getUp() const
+       {
+               return AUD_Vector3(2 * (m_x * m_y - m_w * m_z),
+                                                       1 - 2 * (m_x * m_x + m_z * m_z),
+                                                       2 * (m_w * m_x + m_y * m_z));
+       }
 };
 
 #endif //AUD_3DMATH