b3Quat.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef B3_QUAT_H
  2. #define B3_QUAT_H
  3. #include "Bullet3Common/shared/b3PlatformDefinitions.h"
  4. #include "Bullet3Common/shared/b3Float4.h"
  5. #ifdef __cplusplus
  6. #include "Bullet3Common/b3Quaternion.h"
  7. #include "Bullet3Common/b3Transform.h"
  8. #define b3Quat b3Quaternion
  9. #define b3QuatConstArg const b3Quaternion&
  10. inline b3Quat b3QuatInverse(b3QuatConstArg orn)
  11. {
  12. return orn.inverse();
  13. }
  14. inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)
  15. {
  16. b3Transform tr;
  17. tr.setOrigin(translation);
  18. tr.setRotation(orientation);
  19. return tr(point);
  20. }
  21. #else
  22. typedef float4 b3Quat;
  23. #define b3QuatConstArg const b3Quat
  24. inline float4 b3FastNormalize4(float4 v)
  25. {
  26. v = (float4)(v.xyz, 0.f);
  27. return fast_normalize(v);
  28. }
  29. inline b3Quat b3QuatMul(b3Quat a, b3Quat b);
  30. inline b3Quat b3QuatNormalized(b3QuatConstArg in);
  31. inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);
  32. inline b3Quat b3QuatInvert(b3QuatConstArg q);
  33. inline b3Quat b3QuatInverse(b3QuatConstArg q);
  34. inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)
  35. {
  36. b3Quat ans;
  37. ans = b3Cross3(a, b);
  38. ans += a.w * b + b.w * a;
  39. // ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);
  40. ans.w = a.w * b.w - b3Dot3F4(a, b);
  41. return ans;
  42. }
  43. inline b3Quat b3QuatNormalized(b3QuatConstArg in)
  44. {
  45. b3Quat q;
  46. q = in;
  47. //return b3FastNormalize4(in);
  48. float len = native_sqrt(dot(q, q));
  49. if (len > 0.f)
  50. {
  51. q *= 1.f / len;
  52. }
  53. else
  54. {
  55. q.x = q.y = q.z = 0.f;
  56. q.w = 1.f;
  57. }
  58. return q;
  59. }
  60. inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)
  61. {
  62. b3Quat qInv = b3QuatInvert(q);
  63. float4 vcpy = vec;
  64. vcpy.w = 0.f;
  65. float4 out = b3QuatMul(b3QuatMul(q, vcpy), qInv);
  66. return out;
  67. }
  68. inline b3Quat b3QuatInverse(b3QuatConstArg q)
  69. {
  70. return (b3Quat)(-q.xyz, q.w);
  71. }
  72. inline b3Quat b3QuatInvert(b3QuatConstArg q)
  73. {
  74. return (b3Quat)(-q.xyz, q.w);
  75. }
  76. inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)
  77. {
  78. return b3QuatRotate(b3QuatInvert(q), vec);
  79. }
  80. inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)
  81. {
  82. return b3QuatRotate(orientation, point) + (translation);
  83. }
  84. #endif
  85. #endif //B3_QUAT_H