/common_src/Math.hpp

https://github.com/kondrak/oculusvr_samples · C++ Header · 208 lines · 159 code · 35 blank · 14 comment · 0 complexity · 36d23cf95f66b978ea92fa024fa98094 MD5 · raw file

  1. #ifndef MATH_INCLUDED
  2. #define MATH_INCLUDED
  3. #include <math.h>
  4. /*
  5. * Basic math structures (vectors, quaternions, matrices)
  6. */
  7. #define PI 3.141592653589f
  8. #define PIdiv180inv 57.29577951308f
  9. #define PIdiv180 0.01745329251f
  10. #define PIdiv2 1.57079632679f
  11. namespace Math
  12. {
  13. // 2D vector
  14. struct Vector2f
  15. {
  16. Vector2f() : m_x(0.0f), m_y(0.0f)
  17. {
  18. }
  19. Vector2f(float x, float y) : m_x(x), m_y(y)
  20. {
  21. }
  22. float m_x;
  23. float m_y;
  24. };
  25. // 3D vector
  26. class Vector3f
  27. {
  28. public:
  29. Vector3f() : m_x(0.0f), m_y(0.0f), m_z(0.0f)
  30. {
  31. }
  32. Vector3f(float x, float y, float z) : m_x(x), m_y(y), m_z(z)
  33. {
  34. }
  35. Vector3f(const Vector3f &v2) : m_x(v2.m_x), m_y(v2.m_y), m_z(v2.m_z)
  36. {
  37. }
  38. float Length()
  39. {
  40. return sqrtf(m_x*m_x + m_y*m_y + m_z*m_z);
  41. }
  42. void Normalize();
  43. void QuickNormalize(); // normalize with Q_rsqrt
  44. Vector3f CrossProduct(const Vector3f &v2) const;
  45. float DotProduct(const Vector3f &v2) const;
  46. float m_x;
  47. float m_y;
  48. float m_z;
  49. Vector3f operator+ (const Vector3f &v2) const;
  50. Vector3f operator- (const Vector3f &v2) const;
  51. Vector3f operator* (float r) const; // scale the vector by r
  52. Vector3f operator/ (float r) const; // added for completeness with *
  53. };
  54. // 4D vector
  55. struct Vector4f
  56. {
  57. Vector4f() : m_x(0.0f), m_y(0.0f), m_z(0.0f), m_w(1.0f)
  58. {
  59. }
  60. Vector4f(float x, float y, float z, float w) : m_x(x), m_y(y), m_z(z), m_w(w)
  61. {
  62. }
  63. float m_x;
  64. float m_y;
  65. float m_z;
  66. float m_w;
  67. };
  68. struct Matrix4f
  69. {
  70. Matrix4f()
  71. {
  72. Identity();
  73. }
  74. Matrix4f(float m0, float m1, float m2, float m3,
  75. float m4, float m5, float m6, float m7,
  76. float m8, float m9, float m10, float m11,
  77. float m12, float m13, float m14, float m15)
  78. {
  79. m_m[0] = m0;
  80. m_m[1] = m1;
  81. m_m[2] = m2;
  82. m_m[3] = m3;
  83. m_m[4] = m4;
  84. m_m[5] = m5;
  85. m_m[6] = m6;
  86. m_m[7] = m7;
  87. m_m[8] = m8;
  88. m_m[9] = m9;
  89. m_m[10] = m10;
  90. m_m[11] = m11;
  91. m_m[12] = m12;
  92. m_m[13] = m13;
  93. m_m[14] = m14;
  94. m_m[15] = m15;
  95. }
  96. // construct matrix from raw array of floats
  97. Matrix4f(float *mData)
  98. {
  99. m_m[0] = mData[0];
  100. m_m[1] = mData[1];
  101. m_m[2] = mData[2];
  102. m_m[3] = mData[3];
  103. m_m[4] = mData[4];
  104. m_m[5] = mData[5];
  105. m_m[6] = mData[6];
  106. m_m[7] = mData[7];
  107. m_m[8] = mData[8];
  108. m_m[9] = mData[9];
  109. m_m[10] = mData[10];
  110. m_m[11] = mData[11];
  111. m_m[12] = mData[12];
  112. m_m[13] = mData[13];
  113. m_m[14] = mData[14];
  114. m_m[15] = mData[15];
  115. }
  116. void Identity();
  117. void Zero();
  118. void One();
  119. void Transpose();
  120. void Invert();
  121. float m_m[16];
  122. Vector3f operator* (const Vector3f &v) const;
  123. Vector4f operator* (const Vector4f &v) const;
  124. Matrix4f operator* (const Matrix4f &m) const;
  125. float& operator[](unsigned int i){ return m_m[i]; }
  126. const float& operator[](unsigned int i)const{ return m_m[i]; }
  127. };
  128. // quaternion
  129. class Quaternion
  130. {
  131. public:
  132. Quaternion() : m_x(0.0f), m_y(0.0f), m_z(0.0f), m_w(0.0f)
  133. {
  134. }
  135. // create based on standard parameters
  136. Quaternion(float x, float y, float z, float w) : m_x(x), m_y(y), m_z(z), m_w(w)
  137. {
  138. }
  139. // create from axis/angle representaiton
  140. Quaternion(const Vector3f &axis, float angle) : m_x( axis.m_x * sinf(angle/2) ),
  141. m_y( axis.m_y * sinf(angle/2) ),
  142. m_z( axis.m_z * sinf(angle/2) ),
  143. m_w( cosf(angle/2) )
  144. {
  145. }
  146. Quaternion(const Quaternion &q2) : m_x(q2.m_x), m_y(q2.m_y), m_z(q2.m_z), m_w(q2.m_w)
  147. {
  148. }
  149. Quaternion GetConjugate() const;
  150. void Normalize();
  151. void QuickNormalize(); // normalize with Q_rsqrt
  152. float m_x;
  153. float m_y;
  154. float m_z;
  155. float m_w;
  156. Vector3f operator*(const Vector3f &vec) const; // apply quat-rotation to vec
  157. Quaternion operator*(const Quaternion &q2) const;
  158. };
  159. /* ************** */
  160. // general purpose functions
  161. enum PointPlanePosition
  162. {
  163. PointBehindPlane,
  164. PointInFrontOfPlane
  165. };
  166. // quick inverse square root
  167. float QuickInverseSqrt( float number );
  168. // determine whether a point is in front of or behind a plane (based on its normal vector)
  169. int PointPlanePos(float normalX, float normalY, float normalZ, float intercept, const Math::Vector3f &point);
  170. void Translate(Matrix4f &matrix, float x, float y=0.0f, float z=0.0f);
  171. void Scale(Matrix4f &matrix, float x, float y=1.0f, float z=1.0f);
  172. }
  173. #endif