rtcore_quaternion.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "rtcore_common.h"
  5. RTC_NAMESPACE_BEGIN
  6. /*
  7. * Structure for transformation representation as a matrix decomposition using
  8. * a quaternion
  9. */
  10. struct RTC_ALIGN(16) RTCQuaternionDecomposition
  11. {
  12. float scale_x;
  13. float scale_y;
  14. float scale_z;
  15. float skew_xy;
  16. float skew_xz;
  17. float skew_yz;
  18. float shift_x;
  19. float shift_y;
  20. float shift_z;
  21. float quaternion_r;
  22. float quaternion_i;
  23. float quaternion_j;
  24. float quaternion_k;
  25. float translation_x;
  26. float translation_y;
  27. float translation_z;
  28. };
  29. RTC_FORCEINLINE void rtcInitQuaternionDecomposition(struct RTCQuaternionDecomposition* qdecomp)
  30. {
  31. qdecomp->scale_x = 1.f;
  32. qdecomp->scale_y = 1.f;
  33. qdecomp->scale_z = 1.f;
  34. qdecomp->skew_xy = 0.f;
  35. qdecomp->skew_xz = 0.f;
  36. qdecomp->skew_yz = 0.f;
  37. qdecomp->shift_x = 0.f;
  38. qdecomp->shift_y = 0.f;
  39. qdecomp->shift_z = 0.f;
  40. qdecomp->quaternion_r = 1.f;
  41. qdecomp->quaternion_i = 0.f;
  42. qdecomp->quaternion_j = 0.f;
  43. qdecomp->quaternion_k = 0.f;
  44. qdecomp->translation_x = 0.f;
  45. qdecomp->translation_y = 0.f;
  46. qdecomp->translation_z = 0.f;
  47. }
  48. RTC_FORCEINLINE void rtcQuaternionDecompositionSetQuaternion(
  49. struct RTCQuaternionDecomposition* qdecomp,
  50. float r, float i, float j, float k)
  51. {
  52. qdecomp->quaternion_r = r;
  53. qdecomp->quaternion_i = i;
  54. qdecomp->quaternion_j = j;
  55. qdecomp->quaternion_k = k;
  56. }
  57. RTC_FORCEINLINE void rtcQuaternionDecompositionSetScale(
  58. struct RTCQuaternionDecomposition* qdecomp,
  59. float scale_x, float scale_y, float scale_z)
  60. {
  61. qdecomp->scale_x = scale_x;
  62. qdecomp->scale_y = scale_y;
  63. qdecomp->scale_z = scale_z;
  64. }
  65. RTC_FORCEINLINE void rtcQuaternionDecompositionSetSkew(
  66. struct RTCQuaternionDecomposition* qdecomp,
  67. float skew_xy, float skew_xz, float skew_yz)
  68. {
  69. qdecomp->skew_xy = skew_xy;
  70. qdecomp->skew_xz = skew_xz;
  71. qdecomp->skew_yz = skew_yz;
  72. }
  73. RTC_FORCEINLINE void rtcQuaternionDecompositionSetShift(
  74. struct RTCQuaternionDecomposition* qdecomp,
  75. float shift_x, float shift_y, float shift_z)
  76. {
  77. qdecomp->shift_x = shift_x;
  78. qdecomp->shift_y = shift_y;
  79. qdecomp->shift_z = shift_z;
  80. }
  81. RTC_FORCEINLINE void rtcQuaternionDecompositionSetTranslation(
  82. struct RTCQuaternionDecomposition* qdecomp,
  83. float translation_x, float translation_y, float translation_z)
  84. {
  85. qdecomp->translation_x = translation_x;
  86. qdecomp->translation_y = translation_y;
  87. qdecomp->translation_z = translation_z;
  88. }
  89. RTC_NAMESPACE_END