summaryrefslogtreecommitdiff
path: root/src/lib/eina/eina_quaternion.h
blob: 156d12b2139de5a8111f1e47046fd8539ec07b0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
/* EINA - EFL data type library
 * Copyright (C) 2015 Cedric Bail
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library.
 * If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef EINA_QUATERNION_H_
#define EINA_QUATERNION_H_

typedef struct _Eina_Quaternion_F16p16 Eina_Quaternion_F16p16;
typedef struct _Eina_Quaternion Eina_Quaternion;
typedef struct _Eina_Point_3D Eina_Point_3D;
typedef struct _Eina_Point_3D_F16p16 Eina_Point_3D_F16p16;

struct _Eina_Quaternion
{
   double x;
   double y;
   double z;
   double w;
};

struct _Eina_Quaternion_F16p16
{
   Eina_F16p16 x;
   Eina_F16p16 y;
   Eina_F16p16 z;
   Eina_F16p16 w;
};

struct _Eina_Point_3D
{
   double x;
   double y;
   double z;
};

struct _Eina_Point_3D_F16p16
{
   Eina_F16p16 x;
   Eina_F16p16 y;
   Eina_F16p16 z;
};

EAPI void eina_quaternion_f16p16_set(Eina_Quaternion *out,
                                     Eina_F16p16 x, Eina_F16p16 y,
                                     Eina_F16p16 z, Eina_F16p16 w); /**< @since 1.15 */
EAPI Eina_F16p16 eina_quaternion_f16p16_norm(const Eina_Quaternion_F16p16 *q); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_negative(Eina_Quaternion_F16p16 *out,
                                          const Eina_Quaternion_F16p16 *in); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_add(Eina_Quaternion_F16p16 *out,
                                     const Eina_Quaternion_F16p16 *a,
                                     const Eina_Quaternion_F16p16 *b); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_mul(Eina_Quaternion_F16p16 *out,
                                     const Eina_Quaternion_F16p16 *a,
                                     const Eina_Quaternion_F16p16 *b); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_scale(Eina_Quaternion_F16p16 *out,
                                       const Eina_Quaternion_F16p16 *a,
                                       Eina_F16p16 b); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_conjugate(Eina_Quaternion_F16p16 *out,
                                           const Eina_Quaternion_F16p16 *in); /**< @since 1.15 */
EAPI Eina_F16p16 eina_quaternion_f16p16_dot(const Eina_Quaternion_F16p16 *a,
                                            const Eina_Quaternion_F16p16 *b); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_lerp(Eina_Quaternion_F16p16 *out,
                                      const Eina_Quaternion_F16p16 *a,
                                      const Eina_Quaternion_F16p16 *b,
                                      Eina_F16p16 pos); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_slerp(Eina_Quaternion_F16p16 *out,
                                       const Eina_Quaternion_F16p16 *a,
                                       const Eina_Quaternion_F16p16 *b,
                                       Eina_F16p16 pos); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_nlerp(Eina_Quaternion_F16p16 *out,
                                       const Eina_Quaternion_F16p16 *a,
                                       const Eina_Quaternion_F16p16 *b,
                                       Eina_F16p16 pos); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_rotate(Eina_Point_3D_F16p16 *p,
                                        const Eina_Point_3D_F16p16 *center,
                                        const Eina_Quaternion_F16p16 *q); /**< @since 1.15 */
EAPI void eina_quaternion_f16p16_rotation_matrix3_get(Eina_Matrix3_F16p16 *m,
                                                     const Eina_Quaternion_F16p16 *q); /**< @since 1.15 */

EAPI void eina_quaternion_set(Eina_Quaternion *q, double x,
                              double y, double z, double w);
EAPI double eina_quaternion_norm(const Eina_Quaternion *q); /**< @since 1.15 */
EAPI void eina_quaternion_negative(Eina_Quaternion *out,
                                   const Eina_Quaternion *in); /**< @since 1.15 */
EAPI void eina_quaternion_add(Eina_Quaternion *out,
                              const Eina_Quaternion *a,
                              const Eina_Quaternion *b); /**< @since 1.15 */
EAPI void eina_quaternion_mul(Eina_Quaternion *out,
                              const Eina_Quaternion *a,
                              const Eina_Quaternion *b); /**< @since 1.15 */
EAPI void eina_quaternion_scale(Eina_Quaternion *out,
                                const Eina_Quaternion *a,
                                double b); /**< @since 1.15 */
EAPI void eina_quaternion_conjugate(Eina_Quaternion *out,
                                    const Eina_Quaternion *in); /**< @since 1.15 */
EAPI double eina_quaternion_dot(const Eina_Quaternion *a,
                                const Eina_Quaternion *b); /**< @since 1.15 */
EAPI void eina_quaternion_normalized(Eina_Quaternion *out,
                                     const Eina_Quaternion *in); /**< @since 1.15 */
EAPI void eina_quaternion_lerp(Eina_Quaternion *out,
                               const Eina_Quaternion *a,
                               const Eina_Quaternion *b,
                               double pos); /**< @since 1.15 */
EAPI void eina_quaternion_slerp(Eina_Quaternion *out,
                                const Eina_Quaternion *a,
                                const Eina_Quaternion *b,
                                double pos); /**< @since 1.15 */
EAPI void eina_quaternion_nlerp(Eina_Quaternion *out,
                                const Eina_Quaternion *a,
                                const Eina_Quaternion *b,
                                double pos); /**< @since 1.15 */
EAPI void eina_quaternion_rotate(Eina_Point_3D *p,
                                 const Eina_Point_3D *center,
                                 const Eina_Quaternion *q); /**< @since 1.15 */
EAPI void eina_quaternion_rotation_matrix3_get(Eina_Matrix3 *m,
                                               const Eina_Quaternion *q); /**< @since 1.15 */
EAPI void eina_matrix3_quaternion_get(Eina_Quaternion *q,
                                      const Eina_Matrix3 *m); /**< @since 1.15 */
EAPI Eina_Bool eina_matrix4_quaternion_to(Eina_Quaternion *rotation,
                                          Eina_Quaternion *perspective,
                                          Eina_Point_3D *translation,
                                          Eina_Point_3D *scale,
                                          Eina_Point_3D *skew,
                                          const Eina_Matrix4 *m); /**< @since 1.16 */
EAPI void eina_quaternion_matrix4_to(Eina_Matrix4 *m,
                                     const Eina_Quaternion *rotation,
                                     const Eina_Quaternion *perspective,
                                     const Eina_Point_3D *translation,
                                     const Eina_Point_3D *scale,
                                     const Eina_Point_3D *skew); /**< @since 1.16 */
/**
 * @brief Compute the inverse of the given quaternion.
 *
 * @param out The quaternion to invert.
 * @param q The quaternion matrix.
 *
 * This function inverses the quaternion @p q and stores the result in
 * @p out.
 *
 * @since 1.17
 */
EAPI void eina_quaternion_inverse(Eina_Quaternion *out, const Eina_Quaternion *q);

/**
 * @brief Set array to quaternion.
 *
 * @param dst The result quaternion
 * @param v The the array[4] for set
 *
 * Set to quaternion first 4 elements from array
 *
 * @since 1.17
 */
EAPI void eina_quaternion_array_set(Eina_Quaternion *dst, const double *v);

/**
 * @brief Copy quternion.
 *
 * @param dst The quaternion copy
 * @param src The quaternion for copy.
 *
 * @since 1.17
 */
EAPI void eina_quaternion_copy(Eina_Quaternion *dst,
                               const Eina_Quaternion *src);

/**
 * @brief Homogeneous quaternion
 *
 * @param out The resulting quaternion
 * @param v The given quaternion
 *
 * @since 1.17
 */
EAPI void eina_quaternion_homogeneous_regulate(Eina_Quaternion *out,
                                               const Eina_Quaternion *v);

/**
 * @brief Subtract two quaternions
 *
 * @param out The resulting quaternion
 * @param a The first member of the subtract
 * @param b The second member of the subtract
 *
 * @since 1.17
 */
EAPI void eina_quaternion_subtract(Eina_Quaternion *out, const Eina_Quaternion *a,
                                   const Eina_Quaternion *b);

/**
 * @brief Return the length of the given quaternion.
 *
 * @param v The quaternion.
 * @return The length.
 *
 * @since 1.17
 */
EAPI double eina_quaternion_length_get(const Eina_Quaternion *v);

/**
 * @brief Return the length in square of the given quaternion.
 *
 * @param v The quaternion.
 * @return The length in square.
 *
 * @since 1.17
 */
EAPI double eina_quaternion_length_square_get(const Eina_Quaternion *v);

/**
 * @brief Return the distance between of two quaternions.
 *
 * @param a The first quaternion.
 * @param b The second quaternion.
 * @return The distance.
 *
 * @since 1.17
 */
EAPI double eina_quaternion_distance_get(const Eina_Quaternion *a,
                                         const Eina_Quaternion *b);
/**
 * @brief Return the distance in square between of two quaternions.
 *
 * @param a The first quaternion.
 * @param b The second quaternion.
 * @return The distance in square.
 *
 * @since 1.17
 */
EAPI double eina_quaternion_distance_square_get(const Eina_Quaternion *a,
                                                const Eina_Quaternion *b);

/**
 * @brief Transform quaternion.
 *
 * @param out The result quaternion.
 * @param v The quaternion for transform.
 * @param m The matrix for transform.
 *
 * @since 1.17
 */
EAPI void eina_quaternion_transform(Eina_Quaternion *out, const Eina_Quaternion *v,
                                    const Eina_Matrix4 *m);

/**
 * @brief Return the angle plains between of two quaternions.
 *
 * @param a The first quaternion.
 * @param b The second quaternion.
 * @return The angle.
 *
 * @since 1.17
 */
EAPI double eina_quaternion_angle_plains(Eina_Quaternion *a, Eina_Quaternion *b);

#endif