MathUtil.inl 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. namespace gameplay
  2. {
  3. inline void MathUtil::addMatrix(const float* m, float scalar, float* dst)
  4. {
  5. dst[0] = m[0] + scalar;
  6. dst[1] = m[1] + scalar;
  7. dst[2] = m[2] + scalar;
  8. dst[3] = m[3] + scalar;
  9. dst[4] = m[4] + scalar;
  10. dst[5] = m[5] + scalar;
  11. dst[6] = m[6] + scalar;
  12. dst[7] = m[7] + scalar;
  13. dst[8] = m[8] + scalar;
  14. dst[9] = m[9] + scalar;
  15. dst[10] = m[10] + scalar;
  16. dst[11] = m[11] + scalar;
  17. dst[12] = m[12] + scalar;
  18. dst[13] = m[13] + scalar;
  19. dst[14] = m[14] + scalar;
  20. dst[15] = m[15] + scalar;
  21. }
  22. inline void MathUtil::addMatrix(const float* m1, const float* m2, float* dst)
  23. {
  24. dst[0] = m1[0] + m2[0];
  25. dst[1] = m1[1] + m2[1];
  26. dst[2] = m1[2] + m2[2];
  27. dst[3] = m1[3] + m2[3];
  28. dst[4] = m1[4] + m2[4];
  29. dst[5] = m1[5] + m2[5];
  30. dst[6] = m1[6] + m2[6];
  31. dst[7] = m1[7] + m2[7];
  32. dst[8] = m1[8] + m2[8];
  33. dst[9] = m1[9] + m2[9];
  34. dst[10] = m1[10] + m2[10];
  35. dst[11] = m1[11] + m2[11];
  36. dst[12] = m1[12] + m2[12];
  37. dst[13] = m1[13] + m2[13];
  38. dst[14] = m1[14] + m2[14];
  39. dst[15] = m1[15] + m2[15];
  40. }
  41. inline void MathUtil::subtractMatrix(const float* m1, const float* m2, float* dst)
  42. {
  43. dst[0] = m1[0] - m2[0];
  44. dst[1] = m1[1] - m2[1];
  45. dst[2] = m1[2] - m2[2];
  46. dst[3] = m1[3] - m2[3];
  47. dst[4] = m1[4] - m2[4];
  48. dst[5] = m1[5] - m2[5];
  49. dst[6] = m1[6] - m2[6];
  50. dst[7] = m1[7] - m2[7];
  51. dst[8] = m1[8] - m2[8];
  52. dst[9] = m1[9] - m2[9];
  53. dst[10] = m1[10] - m2[10];
  54. dst[11] = m1[11] - m2[11];
  55. dst[12] = m1[12] - m2[12];
  56. dst[13] = m1[13] - m2[13];
  57. dst[14] = m1[14] - m2[14];
  58. dst[15] = m1[15] - m2[15];
  59. }
  60. inline void MathUtil::multiplyMatrix(const float* m, float scalar, float* dst)
  61. {
  62. dst[0] = m[0] * scalar;
  63. dst[1] = m[1] * scalar;
  64. dst[2] = m[2] * scalar;
  65. dst[3] = m[3] * scalar;
  66. dst[4] = m[4] * scalar;
  67. dst[5] = m[5] * scalar;
  68. dst[6] = m[6] * scalar;
  69. dst[7] = m[7] * scalar;
  70. dst[8] = m[8] * scalar;
  71. dst[9] = m[9] * scalar;
  72. dst[10] = m[10] * scalar;
  73. dst[11] = m[11] * scalar;
  74. dst[12] = m[12] * scalar;
  75. dst[13] = m[13] * scalar;
  76. dst[14] = m[14] * scalar;
  77. dst[15] = m[15] * scalar;
  78. }
  79. inline void MathUtil::multiplyMatrix(const float* m1, const float* m2, float* dst)
  80. {
  81. // Support the case where m1 or m2 is the same array as dst.
  82. float product[16];
  83. product[0] = m1[0] * m2[0] + m1[4] * m2[1] + m1[8] * m2[2] + m1[12] * m2[3];
  84. product[1] = m1[1] * m2[0] + m1[5] * m2[1] + m1[9] * m2[2] + m1[13] * m2[3];
  85. product[2] = m1[2] * m2[0] + m1[6] * m2[1] + m1[10] * m2[2] + m1[14] * m2[3];
  86. product[3] = m1[3] * m2[0] + m1[7] * m2[1] + m1[11] * m2[2] + m1[15] * m2[3];
  87. product[4] = m1[0] * m2[4] + m1[4] * m2[5] + m1[8] * m2[6] + m1[12] * m2[7];
  88. product[5] = m1[1] * m2[4] + m1[5] * m2[5] + m1[9] * m2[6] + m1[13] * m2[7];
  89. product[6] = m1[2] * m2[4] + m1[6] * m2[5] + m1[10] * m2[6] + m1[14] * m2[7];
  90. product[7] = m1[3] * m2[4] + m1[7] * m2[5] + m1[11] * m2[6] + m1[15] * m2[7];
  91. product[8] = m1[0] * m2[8] + m1[4] * m2[9] + m1[8] * m2[10] + m1[12] * m2[11];
  92. product[9] = m1[1] * m2[8] + m1[5] * m2[9] + m1[9] * m2[10] + m1[13] * m2[11];
  93. product[10] = m1[2] * m2[8] + m1[6] * m2[9] + m1[10] * m2[10] + m1[14] * m2[11];
  94. product[11] = m1[3] * m2[8] + m1[7] * m2[9] + m1[11] * m2[10] + m1[15] * m2[11];
  95. product[12] = m1[0] * m2[12] + m1[4] * m2[13] + m1[8] * m2[14] + m1[12] * m2[15];
  96. product[13] = m1[1] * m2[12] + m1[5] * m2[13] + m1[9] * m2[14] + m1[13] * m2[15];
  97. product[14] = m1[2] * m2[12] + m1[6] * m2[13] + m1[10] * m2[14] + m1[14] * m2[15];
  98. product[15] = m1[3] * m2[12] + m1[7] * m2[13] + m1[11] * m2[14] + m1[15] * m2[15];
  99. memcpy(dst, product, MATRIX_SIZE);
  100. }
  101. inline void MathUtil::negateMatrix(const float* m, float* dst)
  102. {
  103. dst[0] = -m[0];
  104. dst[1] = -m[1];
  105. dst[2] = -m[2];
  106. dst[3] = -m[3];
  107. dst[4] = -m[4];
  108. dst[5] = -m[5];
  109. dst[6] = -m[6];
  110. dst[7] = -m[7];
  111. dst[8] = -m[8];
  112. dst[9] = -m[9];
  113. dst[10] = -m[10];
  114. dst[11] = -m[11];
  115. dst[12] = -m[12];
  116. dst[13] = -m[13];
  117. dst[14] = -m[14];
  118. dst[15] = -m[15];
  119. }
  120. inline void MathUtil::transposeMatrix(const float* m, float* dst)
  121. {
  122. float t[16] = {
  123. m[0], m[4], m[8], m[12],
  124. m[1], m[5], m[9], m[13],
  125. m[2], m[6], m[10], m[14],
  126. m[3], m[7], m[11], m[15]
  127. };
  128. memcpy(dst, t, MATRIX_SIZE);
  129. }
  130. inline void MathUtil::transformVector4(const float* m, float x, float y, float z, float w, float* dst)
  131. {
  132. dst[0] = x * m[0] + y * m[4] + z * m[8] + w * m[12];
  133. dst[1] = x * m[1] + y * m[5] + z * m[9] + w * m[13];
  134. dst[2] = x * m[2] + y * m[6] + z * m[10] + w * m[14];
  135. }
  136. inline void MathUtil::transformVector4(const float* m, const float* v, float* dst)
  137. {
  138. // Handle case where v == dst.
  139. float x = v[0] * m[0] + v[1] * m[4] + v[2] * m[8] + v[3] * m[12];
  140. float y = v[0] * m[1] + v[1] * m[5] + v[2] * m[9] + v[3] * m[13];
  141. float z = v[0] * m[2] + v[1] * m[6] + v[2] * m[10] + v[3] * m[14];
  142. float w = v[0] * m[3] + v[1] * m[7] + v[2] * m[11] + v[3] * m[15];
  143. dst[0] = x;
  144. dst[1] = y;
  145. dst[2] = z;
  146. dst[3] = w;
  147. }
  148. inline void MathUtil::crossVector3(const float* v1, const float* v2, float* dst)
  149. {
  150. float x = (v1[1] * v2[2]) - (v1[2] * v2[1]);
  151. float y = (v1[2] * v2[0]) - (v1[0] * v2[2]);
  152. float z = (v1[0] * v2[1]) - (v1[1] * v2[0]);
  153. dst[0] = x;
  154. dst[1] = y;
  155. dst[2] = z;
  156. }
  157. }