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