1// Copyright 2009-2021 Intel Corporation
2// SPDX-License-Identifier: Apache-2.0
3
4#ifndef __EMBREE_QUATERNION_ISPH__
5#define __EMBREE_QUATERNION_ISPH__
6
7/*
8 * Structure for transformation respresentation as a matrix decomposition using
9 * a quaternion
10 */
11struct RTC_ALIGN(16) RTCQuaternionDecomposition
12{
13  float scale_x;
14  float scale_y;
15  float scale_z;
16  float skew_xy;
17  float skew_xz;
18  float skew_yz;
19  float shift_x;
20  float shift_y;
21  float shift_z;
22  float quaternion_r;
23  float quaternion_i;
24  float quaternion_j;
25  float quaternion_k;
26  float translation_x;
27  float translation_y;
28  float translation_z;
29};
30
31RTC_FORCEINLINE void rtcInitQuaternionDecomposition(uniform RTCQuaternionDecomposition* uniform qdecomp)
32{
33  qdecomp->scale_x = 1.f;
34  qdecomp->scale_y = 1.f;
35  qdecomp->scale_z = 1.f;
36  qdecomp->skew_xy = 0.f;
37  qdecomp->skew_xz = 0.f;
38  qdecomp->skew_yz = 0.f;
39  qdecomp->shift_x = 0.f;
40  qdecomp->shift_y = 0.f;
41  qdecomp->shift_z = 0.f;
42  qdecomp->quaternion_r = 1.f;
43  qdecomp->quaternion_i = 0.f;
44  qdecomp->quaternion_j = 0.f;
45  qdecomp->quaternion_k = 0.f;
46  qdecomp->translation_x = 0.f;
47  qdecomp->translation_y = 0.f;
48  qdecomp->translation_z = 0.f;
49}
50
51RTC_FORCEINLINE void rtcInitQuaternionDecomposition(uniform RTCQuaternionDecomposition* varying qdecomp)
52{
53  qdecomp->scale_x = 1.f;
54  qdecomp->scale_y = 1.f;
55  qdecomp->scale_z = 1.f;
56  qdecomp->skew_xy = 0.f;
57  qdecomp->skew_xz = 0.f;
58  qdecomp->skew_yz = 0.f;
59  qdecomp->shift_x = 0.f;
60  qdecomp->shift_y = 0.f;
61  qdecomp->shift_z = 0.f;
62  qdecomp->quaternion_r = 1.f;
63  qdecomp->quaternion_i = 0.f;
64  qdecomp->quaternion_j = 0.f;
65  qdecomp->quaternion_k = 0.f;
66  qdecomp->translation_x = 0.f;
67  qdecomp->translation_y = 0.f;
68  qdecomp->translation_z = 0.f;
69}
70
71RTC_FORCEINLINE void rtcQuaternionDecompositionSetQuaternion(
72  uniform RTCQuaternionDecomposition* uniform qdecomp,
73  uniform float r, uniform float i, uniform float j, uniform float k)
74{
75  qdecomp->quaternion_r = r;
76  qdecomp->quaternion_i = i;
77  qdecomp->quaternion_j = j;
78  qdecomp->quaternion_k = k;
79}
80
81RTC_FORCEINLINE void rtcQuaternionDecompositionSetQuaternion(
82  uniform RTCQuaternionDecomposition* varying qdecomp,
83  varying float r, varying float i, varying float j, varying float k)
84{
85  qdecomp->quaternion_r = r;
86  qdecomp->quaternion_i = i;
87  qdecomp->quaternion_j = j;
88  qdecomp->quaternion_k = k;
89}
90
91RTC_FORCEINLINE void rtcQuaternionDecompositionSetScale(
92  uniform RTCQuaternionDecomposition* uniform qdecomp,
93  uniform float scale_x, uniform float scale_y, uniform float scale_z)
94{
95  qdecomp->scale_x = scale_x;
96  qdecomp->scale_y = scale_y;
97  qdecomp->scale_z = scale_z;
98}
99
100RTC_FORCEINLINE void rtcQuaternionDecompositionSetScale(
101  uniform RTCQuaternionDecomposition* varying qdecomp,
102  varying float scale_x, varying float scale_y, varying float scale_z)
103{
104  qdecomp->scale_x = scale_x;
105  qdecomp->scale_y = scale_y;
106  qdecomp->scale_z = scale_z;
107}
108
109RTC_FORCEINLINE void rtcQuaternionDecompositionSetSkew(
110  uniform RTCQuaternionDecomposition* uniform qdecomp,
111  uniform float skew_xy, uniform float skew_xz, uniform float skew_yz)
112{
113  qdecomp->skew_xy = skew_xy;
114  qdecomp->skew_xz = skew_xz;
115  qdecomp->skew_yz = skew_yz;
116}
117
118RTC_FORCEINLINE void rtcQuaternionDecompositionSetSkew(
119  uniform RTCQuaternionDecomposition* varying qdecomp,
120  varying float skew_xy, varying float skew_xz, varying float skew_yz)
121{
122  qdecomp->skew_xy = skew_xy;
123  qdecomp->skew_xz = skew_xz;
124  qdecomp->skew_yz = skew_yz;
125}
126
127RTC_FORCEINLINE void rtcQuaternionDecompositionSetShift(
128  uniform RTCQuaternionDecomposition* uniform qdecomp,
129  uniform float shift_x, uniform float shift_y, uniform float shift_z)
130{
131  qdecomp->shift_x = shift_x;
132  qdecomp->shift_y = shift_y;
133  qdecomp->shift_z = shift_z;
134}
135
136RTC_FORCEINLINE void rtcQuaternionDecompositionSetShift(
137  uniform RTCQuaternionDecomposition* varying qdecomp,
138  varying float shift_x, varying float shift_y, varying float shift_z)
139{
140  qdecomp->shift_x = shift_x;
141  qdecomp->shift_y = shift_y;
142  qdecomp->shift_z = shift_z;
143}
144
145RTC_FORCEINLINE void rtcQuaternionDecompositionSetTranslation(
146  uniform RTCQuaternionDecomposition* uniform qdecomp,
147  uniform float translation_x, uniform float translation_y, uniform float translation_z)
148{
149  qdecomp->translation_x = translation_x;
150  qdecomp->translation_y = translation_y;
151  qdecomp->translation_z = translation_z;
152}
153
154RTC_FORCEINLINE void rtcQuaternionDecompositionSetTranslation(
155  uniform RTCQuaternionDecomposition* varying qdecomp,
156  varying float translation_x, varying float translation_y, varying float translation_z)
157{
158  qdecomp->translation_x = translation_x;
159  qdecomp->translation_y = translation_y;
160  qdecomp->translation_z = translation_z;
161}
162
163#endif
164