Monado OpenXR Runtime
Loading...
Searching...
No Matches
mat.h
Go to the documentation of this file.
1// Copyright 2019, Philipp Zabel
2// Copyright 2026, Beyley Cardellio
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief Matrix operations, specialized for P3P solving.
7 * @author Philipp Zabel <philipp.zabel@gmail.com>
8 * @author Beyley Cardellio <ep1cm1n10n123@gmail.com>
9 * @ingroup xrt_iface
10 */
11
12#pragma once
13
14
15/* invert a row-major 3x3 matrix */
16static inline void
17mat3_invert(double *a)
18{
19 const double a00 = a[0];
20 const double a01 = a[1];
21 const double a02 = a[2];
22 const double a10 = a[3];
23 const double a11 = a[4];
24 const double a12 = a[5];
25 const double a20 = a[6];
26 const double a21 = a[7];
27 const double a22 = a[8];
28
29 const double M00 = a11 * a22 - a12 * a21;
30 const double M01 = a02 * a21 - a01 * a22;
31 const double M02 = a01 * a12 - a02 * a11;
32 const double M10 = a12 * a20 - a10 * a22;
33 const double M11 = a00 * a22 - a02 * a20;
34 const double M12 = a02 * a10 - a00 * a12;
35 const double M20 = a10 * a21 - a11 * a20;
36 const double M21 = a01 * a20 - a00 * a21;
37 const double M22 = a00 * a11 - a01 * a10;
38
39 const double idet = 1.0 / (a00 * M00 + a01 * M10 + a02 * M20);
40
41 a[0] = M00 * idet;
42 a[1] = M01 * idet;
43 a[2] = M02 * idet;
44 a[3] = M10 * idet;
45 a[4] = M11 * idet;
46 a[5] = M12 * idet;
47 a[6] = M20 * idet;
48 a[7] = M21 * idet;
49 a[8] = M22 * idet;
50}
51
52/* multiply two row-major 3x3 matrices */
53static inline void
54mat3_mul(double *ret, const double *a, const double *b)
55{
56 ret[0] = a[0] * b[0] + a[1] * b[3] + a[2] * b[6];
57 ret[1] = a[0] * b[1] + a[1] * b[4] + a[2] * b[7];
58 ret[2] = a[0] * b[2] + a[1] * b[5] + a[2] * b[8];
59 ret[3] = a[3] * b[0] + a[4] * b[3] + a[5] * b[6];
60 ret[4] = a[3] * b[1] + a[4] * b[4] + a[5] * b[7];
61 ret[5] = a[3] * b[2] + a[4] * b[5] + a[5] * b[8];
62 ret[6] = a[6] * b[0] + a[7] * b[3] + a[8] * b[6];
63 ret[7] = a[6] * b[1] + a[7] * b[4] + a[8] * b[7];
64 ret[8] = a[6] * b[2] + a[7] * b[5] + a[8] * b[8];
65}
66
67/* multiply a 3x3 row-major matrix and a column 3-vector */
68static inline void
69mat3vec3_mul(double *ret, const double *m, const double *v)
70{
71 ret[0] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2];
72 ret[1] = m[3] * v[0] + m[4] * v[1] + m[5] * v[2];
73 ret[2] = m[6] * v[0] + m[7] * v[1] + m[8] * v[2];
74}