mathlib.cpp.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /***
  2. *
  3. * Copyright (c) 1998, Valve LLC. All rights reserved.
  4. *
  5. * This product contains software technology licensed from Id
  6. * Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
  7. * All Rights Reserved.
  8. *
  9. ****/
  10. #pragma warning( disable : 4244 )
  11. #ifndef true
  12. #define true 1
  13. #endif /* true */
  14. #ifndef false
  15. #define false 0
  16. #endif /* false */
  17. #include "mathlib.h"
  18. void ClearBounds (vec3_t mins, vec3_t maxs)
  19. {
  20. mins[0] = mins[1] = mins[2] = 99999;
  21. maxs[0] = maxs[1] = maxs[2] = -99999;
  22. }
  23. void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs)
  24. {
  25. int i;
  26. vec_t val;
  27. for (i=0 ; i<3 ; i++)
  28. {
  29. val = v[i];
  30. if (val < mins[i])
  31. mins[i] = val;
  32. if (val > maxs[i])
  33. maxs[i] = val;
  34. }
  35. }
  36. void AngleMatrix (const vec3_t angles, float (*matrix)[4] )
  37. {
  38. float angle;
  39. float sr, sp, sy, cr, cp, cy;
  40. angle = angles[2];
  41. sy = sin(angle);
  42. cy = cos(angle);
  43. angle = angles[1];
  44. sp = sin(angle);
  45. cp = cos(angle);
  46. angle = angles[0];
  47. sr = sin(angle);
  48. cr = cos(angle);
  49. // matrix = (Z * Y) * X
  50. matrix[0][0] = cp*cy;
  51. matrix[1][0] = cp*sy;
  52. matrix[2][0] = -sp;
  53. matrix[0][1] = sr*sp*cy+cr*-sy;
  54. matrix[1][1] = sr*sp*sy+cr*cy;
  55. matrix[2][1] = sr*cp;
  56. matrix[0][2] = (cr*sp*cy+-sr*-sy);
  57. matrix[1][2] = (cr*sp*sy+-sr*cy);
  58. matrix[2][2] = cr*cp;
  59. matrix[0][3] = 0.0;
  60. matrix[1][3] = 0.0;
  61. matrix[2][3] = 0.0;
  62. }
  63. void R_ConcatTransforms (const float in1[3][4], const float in2[3][4], float out[3][4])
  64. {
  65. out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] +
  66. in1[0][2] * in2[2][0];
  67. out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] +
  68. in1[0][2] * in2[2][1];
  69. out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] +
  70. in1[0][2] * in2[2][2];
  71. out[0][3] = in1[0][0] * in2[0][3] + in1[0][1] * in2[1][3] +
  72. in1[0][2] * in2[2][3] + in1[0][3];
  73. out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] +
  74. in1[1][2] * in2[2][0];
  75. out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] +
  76. in1[1][2] * in2[2][1];
  77. out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] +
  78. in1[1][2] * in2[2][2];
  79. out[1][3] = in1[1][0] * in2[0][3] + in1[1][1] * in2[1][3] +
  80. in1[1][2] * in2[2][3] + in1[1][3];
  81. out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] +
  82. in1[2][2] * in2[2][0];
  83. out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] +
  84. in1[2][2] * in2[2][1];
  85. out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] +
  86. in1[2][2] * in2[2][2];
  87. out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] +
  88. in1[2][2] * in2[2][3] + in1[2][3];
  89. }
  90. void VectorRotate (const vec3_t in1, const float in2[3][4], vec3_t out)
  91. {
  92. out[0] = DotProduct(in1, in2[0]);
  93. out[1] = DotProduct(in1, in2[1]);
  94. out[2] = DotProduct(in1, in2[2]);
  95. }
  96. // rotate by the inverse of the matrix
  97. void VectorIRotate (const vec3_t in1, const float in2[3][4], vec3_t out)
  98. {
  99. out[0] = in1[0]*in2[0][0] + in1[1]*in2[1][0] + in1[2]*in2[2][0];
  100. out[1] = in1[0]*in2[0][1] + in1[1]*in2[1][1] + in1[2]*in2[2][1];
  101. out[2] = in1[0]*in2[0][2] + in1[1]*in2[1][2] + in1[2]*in2[2][2];
  102. }
  103. void VectorTransform (const vec3_t in1, const float in2[3][4], vec3_t out)
  104. {
  105. out[0] = DotProduct(in1, in2[0]) + in2[0][3];
  106. out[1] = DotProduct(in1, in2[1]) + in2[1][3];
  107. out[2] = DotProduct(in1, in2[2]) + in2[2][3];
  108. }
  109. void VectorITransform (const vec3_t in1, const float in2[3][4], vec3_t out)
  110. {
  111. vec3_t tmp;
  112. tmp[0] = in1[0] - in2[0][3];
  113. tmp[1] = in1[1] - in2[1][3];
  114. tmp[2] = in1[2] - in2[2][3];
  115. VectorIRotate(tmp, in2, out);
  116. }
  117. void AngleQuaternion( const vec3_t angles, vec4_t quaternion )
  118. {
  119. float angle;
  120. float sr, sp, sy, cr, cp, cy;
  121. // rescale the inputs to 1/2 angle
  122. angle = angles[2] * 0.5;
  123. sy = sin(angle);
  124. cy = cos(angle);
  125. angle = angles[1] * 0.5;
  126. sp = sin(angle);
  127. cp = cos(angle);
  128. angle = angles[0] * 0.5;
  129. sr = sin(angle);
  130. cr = cos(angle);
  131. quaternion[0] = sr*cp*cy-cr*sp*sy; // X
  132. quaternion[1] = cr*sp*cy+sr*cp*sy; // Y
  133. quaternion[2] = cr*cp*sy-sr*sp*cy; // Z
  134. quaternion[3] = cr*cp*cy+sr*sp*sy; // W
  135. }
  136. void QuaternionMatrix( const vec4_t quaternion, float (*matrix)[4] )
  137. {
  138. matrix[0][0] = 1.0 - 2.0 * quaternion[1] * quaternion[1] - 2.0 * quaternion[2] * quaternion[2];
  139. matrix[1][0] = 2.0 * quaternion[0] * quaternion[1] + 2.0 * quaternion[3] * quaternion[2];
  140. matrix[2][0] = 2.0 * quaternion[0] * quaternion[2] - 2.0 * quaternion[3] * quaternion[1];
  141. matrix[0][1] = 2.0 * quaternion[0] * quaternion[1] - 2.0 * quaternion[3] * quaternion[2];
  142. matrix[1][1] = 1.0 - 2.0 * quaternion[0] * quaternion[0] - 2.0 * quaternion[2] * quaternion[2];
  143. matrix[2][1] = 2.0 * quaternion[1] * quaternion[2] + 2.0 * quaternion[3] * quaternion[0];
  144. matrix[0][2] = 2.0 * quaternion[0] * quaternion[2] + 2.0 * quaternion[3] * quaternion[1];
  145. matrix[1][2] = 2.0 * quaternion[1] * quaternion[2] - 2.0 * quaternion[3] * quaternion[0];
  146. matrix[2][2] = 1.0 - 2.0 * quaternion[0] * quaternion[0] - 2.0 * quaternion[1] * quaternion[1];
  147. }
  148. void QuaternionSlerp( const vec4_t p, vec4_t q, float t, vec4_t qt )
  149. {
  150. int i;
  151. float omega, cosom, sinom, sclp, sclq;
  152. // decide if one of the quaternions is backwards
  153. float a = 0;
  154. float b = 0;
  155. for (i = 0; i < 4; i++) {
  156. a += (p[i]-q[i])*(p[i]-q[i]);
  157. b += (p[i]+q[i])*(p[i]+q[i]);
  158. }
  159. if (a > b) {
  160. for (i = 0; i < 4; i++) {
  161. q[i] = -q[i];
  162. }
  163. }
  164. cosom = p[0]*q[0] + p[1]*q[1] + p[2]*q[2] + p[3]*q[3];
  165. if ((1.0 + cosom) > 0.00000001) {
  166. if ((1.0 - cosom) > 0.00000001) {
  167. omega = acos( cosom );
  168. sinom = sin( omega );
  169. sclp = sin( (1.0 - t)*omega) / sinom;
  170. sclq = sin( t*omega ) / sinom;
  171. }
  172. else {
  173. sclp = 1.0 - t;
  174. sclq = t;
  175. }
  176. for (i = 0; i < 4; i++) {
  177. qt[i] = sclp * p[i] + sclq * q[i];
  178. }
  179. }
  180. else {
  181. qt[0] = -p[1];
  182. qt[1] = p[0];
  183. qt[2] = -p[3];
  184. qt[3] = p[2];
  185. sclp = sin( (1.0 - t) * 0.5 * Q_PI);
  186. sclq = sin( t * 0.5 * Q_PI);
  187. for (i = 0; i < 3; i++) {
  188. qt[i] = sclp * p[i] + sclq * qt[i];
  189. }
  190. }
  191. }