Skip to content

Commit 2e44b15

Browse files
committed
Implement more essential NON-SIMD functions
1 parent ce13dc9 commit 2e44b15

File tree

8 files changed

+221
-53
lines changed

8 files changed

+221
-53
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
//
2+
// adjugate.swift
3+
//
4+
//
5+
// Created by Christian Treffs on 02.09.20.
6+
//
7+
8+
public func adjugate(_ inMat: Mat4x4f) -> Mat4x4f {
9+
var out = Mat4x4f.identity
10+
11+
out[0, 0] = inMat[1, 1] * inMat[2, 2] * inMat[3, 3] - inMat[1, 1] * inMat[2, 3] * inMat[3, 2]
12+
out[0, 0] += -inMat[2, 1] * inMat[1, 2] * inMat[3, 3] + inMat[2, 1] * inMat[1, 3] * inMat[3, 2]
13+
out[0, 0] += inMat[3, 1] * inMat[1, 2] * inMat[2, 3] - inMat[3, 1] * inMat[1, 3] * inMat[2, 2]
14+
15+
out[1, 0] = -inMat[1, 0] * inMat[2, 2] * inMat[3, 3] + inMat[1, 0] * inMat[2, 3] * inMat[3, 2]
16+
out[1, 0] += inMat[2, 0] * inMat[1, 2] * inMat[3, 3] - inMat[2, 0] * inMat[1, 3] * inMat[3, 2]
17+
out[1, 0] += -inMat[3, 0] * inMat[1, 2] * inMat[2, 3] + inMat[3, 0] * inMat[1, 3] * inMat[2, 2]
18+
19+
out[2, 0] = inMat[1, 0] * inMat[2, 1] * inMat[3, 3] - inMat[1, 0] * inMat[2, 3] * inMat[3, 1]
20+
out[2, 0] += -inMat[2, 0] * inMat[1, 1] * inMat[3, 3] + inMat[2, 0] * inMat[1, 3] * inMat[3, 1]
21+
out[2, 0] += inMat[3, 0] * inMat[1, 1] * inMat[2, 3] - inMat[3, 0] * inMat[1, 3] * inMat[2, 1]
22+
23+
out[3, 0] = -inMat[1, 0] * inMat[2, 1] * inMat[3, 2] + inMat[1, 0] * inMat[2, 2] * inMat[3, 1]
24+
out[3, 0] += inMat[2, 0] * inMat[1, 1] * inMat[3, 2] - inMat[2, 0] * inMat[1, 2] * inMat[3, 1]
25+
out[3, 0] += -inMat[3, 0] * inMat[1, 1] * inMat[2, 2] + inMat[3, 0] * inMat[1, 2] * inMat[2, 1]
26+
27+
out[0, 1] = -inMat[0, 1] * inMat[2, 2] * inMat[3, 3] + inMat[0, 1] * inMat[2, 3] * inMat[3, 2]
28+
out[0, 1] += inMat[2, 1] * inMat[0, 2] * inMat[3, 3] - inMat[2, 1] * inMat[0, 3] * inMat[3, 2]
29+
out[0, 1] += -inMat[3, 1] * inMat[0, 2] * inMat[2, 3] + inMat[3, 1] * inMat[0, 3] * inMat[2, 2]
30+
31+
out[1, 1] = inMat[0, 0] * inMat[2, 2] * inMat[3, 3] - inMat[0, 0] * inMat[2, 3] * inMat[3, 2]
32+
out[1, 1] += -inMat[2, 0] * inMat[0, 2] * inMat[3, 3] + inMat[2, 0] * inMat[0, 3] * inMat[3, 2]
33+
out[1, 1] += inMat[3, 0] * inMat[0, 2] * inMat[2, 3] - inMat[3, 0] * inMat[0, 3] * inMat[2, 2]
34+
35+
out[2, 1] = -inMat[0, 0] * inMat[2, 1] * inMat[3, 3] + inMat[0, 0] * inMat[2, 3] * inMat[3, 1]
36+
out[2, 1] += inMat[2, 0] * inMat[0, 1] * inMat[3, 3] - inMat[2, 0] * inMat[0, 3] * inMat[3, 1]
37+
out[2, 1] += -inMat[3, 0] * inMat[0, 1] * inMat[2, 3] + inMat[3, 0] * inMat[0, 3] * inMat[2, 1]
38+
39+
out[3, 1] = inMat[0, 0] * inMat[2, 1] * inMat[3, 2] - inMat[0, 0] * inMat[2, 2] * inMat[3, 1]
40+
out[3, 1] += -inMat[2, 0] * inMat[0, 1] * inMat[3, 2] + inMat[2, 0] * inMat[0, 2] * inMat[3, 1]
41+
out[3, 1] += inMat[3, 0] * inMat[0, 1] * inMat[2, 2] - inMat[3, 0] * inMat[0, 2] * inMat[2, 1]
42+
43+
out[0, 2] = inMat[0, 1] * inMat[1, 2] * inMat[3, 3] - inMat[0, 1] * inMat[1, 3] * inMat[3, 2]
44+
out[0, 2] += -inMat[1, 1] * inMat[0, 2] * inMat[3, 3] + inMat[1, 1] * inMat[0, 3] * inMat[3, 2]
45+
out[0, 2] += inMat[3, 1] * inMat[0, 2] * inMat[1, 3] - inMat[3, 1] * inMat[0, 3] * inMat[1, 2]
46+
47+
out[1, 2] = -inMat[0, 0] * inMat[1, 2] * inMat[3, 3] + inMat[0, 0] * inMat[1, 3] * inMat[3, 2]
48+
out[1, 2] += inMat[1, 0] * inMat[0, 2] * inMat[3, 3] - inMat[1, 0] * inMat[0, 3] * inMat[3, 2]
49+
out[1, 2] += -inMat[3, 0] * inMat[0, 2] * inMat[1, 3] + inMat[3, 0] * inMat[0, 3] * inMat[1, 2]
50+
51+
out[2, 2] = inMat[0, 0] * inMat[1, 1] * inMat[3, 3] - inMat[0, 0] * inMat[1, 3] * inMat[3, 1]
52+
out[2, 2] += -inMat[1, 0] * inMat[0, 1] * inMat[3, 3] + inMat[1, 0] * inMat[0, 3] * inMat[3, 1]
53+
out[2, 2] += inMat[3, 0] * inMat[0, 1] * inMat[1, 3] - inMat[3, 0] * inMat[0, 3] * inMat[1, 1]
54+
55+
out[3, 2] = -inMat[0, 0] * inMat[1, 1] * inMat[3, 2] + inMat[0, 0] * inMat[1, 2] * inMat[3, 1]
56+
out[3, 2] += inMat[1, 0] * inMat[0, 1] * inMat[3, 2] - inMat[1, 0] * inMat[0, 2] * inMat[3, 1]
57+
out[3, 2] += -inMat[3, 0] * inMat[0, 1] * inMat[1, 2] + inMat[3, 0] * inMat[0, 2] * inMat[1, 1]
58+
59+
out[0, 3] = -inMat[0, 1] * inMat[1, 2] * inMat[2, 3] + inMat[0, 1] * inMat[1, 3] * inMat[2, 2]
60+
out[0, 3] += inMat[1, 1] * inMat[0, 2] * inMat[2, 3] - inMat[1, 1] * inMat[0, 3] * inMat[2, 2]
61+
out[0, 3] += -inMat[2, 1] * inMat[0, 2] * inMat[1, 3] + inMat[2, 1] * inMat[0, 3] * inMat[1, 2]
62+
63+
out[1, 3] = inMat[0, 0] * inMat[1, 2] * inMat[2, 3] - inMat[0, 0] * inMat[1, 3] * inMat[2, 2]
64+
out[1, 3] += -inMat[1, 0] * inMat[0, 2] * inMat[2, 3] + inMat[1, 0] * inMat[0, 3] * inMat[2, 2]
65+
out[1, 3] += inMat[2, 0] * inMat[0, 2] * inMat[1, 3] - inMat[2, 0] * inMat[0, 3] * inMat[1, 2]
66+
67+
out[2, 3] = -inMat[0, 0] * inMat[1, 1] * inMat[2, 3] + inMat[0, 0] * inMat[1, 3] * inMat[2, 1]
68+
out[2, 3] += inMat[1, 0] * inMat[0, 1] * inMat[2, 3] - inMat[1, 0] * inMat[0, 3] * inMat[2, 1]
69+
out[2, 3] += -inMat[2, 0] * inMat[0, 1] * inMat[1, 3] + inMat[2, 0] * inMat[0, 3] * inMat[1, 1]
70+
71+
out[3, 3] = inMat[0, 0] * inMat[1, 1] * inMat[2, 2] - inMat[0, 0] * inMat[1, 2] * inMat[2, 1]
72+
out[3, 3] += -inMat[1, 0] * inMat[0, 1] * inMat[2, 2] + inMat[1, 0] * inMat[0, 2] * inMat[2, 1]
73+
out[3, 3] += inMat[2, 0] * inMat[0, 1] * inMat[1, 2] - inMat[2, 0] * inMat[0, 2] * inMat[1, 1]
74+
75+
return out
76+
}
77+
78+
public func adjugate(_ inMat: Mat4x4d) -> Mat4x4d {
79+
var out = Mat4x4d.identity
80+
81+
out[0, 0] = inMat[1, 1] * inMat[2, 2] * inMat[3, 3] - inMat[1, 1] * inMat[2, 3] * inMat[3, 2]
82+
out[0, 0] += -inMat[2, 1] * inMat[1, 2] * inMat[3, 3] + inMat[2, 1] * inMat[1, 3] * inMat[3, 2]
83+
out[0, 0] += inMat[3, 1] * inMat[1, 2] * inMat[2, 3] - inMat[3, 1] * inMat[1, 3] * inMat[2, 2]
84+
85+
out[1, 0] = -inMat[1, 0] * inMat[2, 2] * inMat[3, 3] + inMat[1, 0] * inMat[2, 3] * inMat[3, 2]
86+
out[1, 0] += inMat[2, 0] * inMat[1, 2] * inMat[3, 3] - inMat[2, 0] * inMat[1, 3] * inMat[3, 2]
87+
out[1, 0] += -inMat[3, 0] * inMat[1, 2] * inMat[2, 3] + inMat[3, 0] * inMat[1, 3] * inMat[2, 2]
88+
89+
out[2, 0] = inMat[1, 0] * inMat[2, 1] * inMat[3, 3] - inMat[1, 0] * inMat[2, 3] * inMat[3, 1]
90+
out[2, 0] += -inMat[2, 0] * inMat[1, 1] * inMat[3, 3] + inMat[2, 0] * inMat[1, 3] * inMat[3, 1]
91+
out[2, 0] += inMat[3, 0] * inMat[1, 1] * inMat[2, 3] - inMat[3, 0] * inMat[1, 3] * inMat[2, 1]
92+
93+
out[3, 0] = -inMat[1, 0] * inMat[2, 1] * inMat[3, 2] + inMat[1, 0] * inMat[2, 2] * inMat[3, 1]
94+
out[3, 0] += inMat[2, 0] * inMat[1, 1] * inMat[3, 2] - inMat[2, 0] * inMat[1, 2] * inMat[3, 1]
95+
out[3, 0] += -inMat[3, 0] * inMat[1, 1] * inMat[2, 2] + inMat[3, 0] * inMat[1, 2] * inMat[2, 1]
96+
97+
out[0, 1] = -inMat[0, 1] * inMat[2, 2] * inMat[3, 3] + inMat[0, 1] * inMat[2, 3] * inMat[3, 2]
98+
out[0, 1] += inMat[2, 1] * inMat[0, 2] * inMat[3, 3] - inMat[2, 1] * inMat[0, 3] * inMat[3, 2]
99+
out[0, 1] += -inMat[3, 1] * inMat[0, 2] * inMat[2, 3] + inMat[3, 1] * inMat[0, 3] * inMat[2, 2]
100+
101+
out[1, 1] = inMat[0, 0] * inMat[2, 2] * inMat[3, 3] - inMat[0, 0] * inMat[2, 3] * inMat[3, 2]
102+
out[1, 1] += -inMat[2, 0] * inMat[0, 2] * inMat[3, 3] + inMat[2, 0] * inMat[0, 3] * inMat[3, 2]
103+
out[1, 1] += inMat[3, 0] * inMat[0, 2] * inMat[2, 3] - inMat[3, 0] * inMat[0, 3] * inMat[2, 2]
104+
105+
out[2, 1] = -inMat[0, 0] * inMat[2, 1] * inMat[3, 3] + inMat[0, 0] * inMat[2, 3] * inMat[3, 1]
106+
out[2, 1] += inMat[2, 0] * inMat[0, 1] * inMat[3, 3] - inMat[2, 0] * inMat[0, 3] * inMat[3, 1]
107+
out[2, 1] += -inMat[3, 0] * inMat[0, 1] * inMat[2, 3] + inMat[3, 0] * inMat[0, 3] * inMat[2, 1]
108+
109+
out[3, 1] = inMat[0, 0] * inMat[2, 1] * inMat[3, 2] - inMat[0, 0] * inMat[2, 2] * inMat[3, 1]
110+
out[3, 1] += -inMat[2, 0] * inMat[0, 1] * inMat[3, 2] + inMat[2, 0] * inMat[0, 2] * inMat[3, 1]
111+
out[3, 1] += inMat[3, 0] * inMat[0, 1] * inMat[2, 2] - inMat[3, 0] * inMat[0, 2] * inMat[2, 1]
112+
113+
out[0, 2] = inMat[0, 1] * inMat[1, 2] * inMat[3, 3] - inMat[0, 1] * inMat[1, 3] * inMat[3, 2]
114+
out[0, 2] += -inMat[1, 1] * inMat[0, 2] * inMat[3, 3] + inMat[1, 1] * inMat[0, 3] * inMat[3, 2]
115+
out[0, 2] += inMat[3, 1] * inMat[0, 2] * inMat[1, 3] - inMat[3, 1] * inMat[0, 3] * inMat[1, 2]
116+
117+
out[1, 2] = -inMat[0, 0] * inMat[1, 2] * inMat[3, 3] + inMat[0, 0] * inMat[1, 3] * inMat[3, 2]
118+
out[1, 2] += inMat[1, 0] * inMat[0, 2] * inMat[3, 3] - inMat[1, 0] * inMat[0, 3] * inMat[3, 2]
119+
out[1, 2] += -inMat[3, 0] * inMat[0, 2] * inMat[1, 3] + inMat[3, 0] * inMat[0, 3] * inMat[1, 2]
120+
121+
out[2, 2] = inMat[0, 0] * inMat[1, 1] * inMat[3, 3] - inMat[0, 0] * inMat[1, 3] * inMat[3, 1]
122+
out[2, 2] += -inMat[1, 0] * inMat[0, 1] * inMat[3, 3] + inMat[1, 0] * inMat[0, 3] * inMat[3, 1]
123+
out[2, 2] += inMat[3, 0] * inMat[0, 1] * inMat[1, 3] - inMat[3, 0] * inMat[0, 3] * inMat[1, 1]
124+
125+
out[3, 2] = -inMat[0, 0] * inMat[1, 1] * inMat[3, 2] + inMat[0, 0] * inMat[1, 2] * inMat[3, 1]
126+
out[3, 2] += inMat[1, 0] * inMat[0, 1] * inMat[3, 2] - inMat[1, 0] * inMat[0, 2] * inMat[3, 1]
127+
out[3, 2] += -inMat[3, 0] * inMat[0, 1] * inMat[1, 2] + inMat[3, 0] * inMat[0, 2] * inMat[1, 1]
128+
129+
out[0, 3] = -inMat[0, 1] * inMat[1, 2] * inMat[2, 3] + inMat[0, 1] * inMat[1, 3] * inMat[2, 2]
130+
out[0, 3] += inMat[1, 1] * inMat[0, 2] * inMat[2, 3] - inMat[1, 1] * inMat[0, 3] * inMat[2, 2]
131+
out[0, 3] += -inMat[2, 1] * inMat[0, 2] * inMat[1, 3] + inMat[2, 1] * inMat[0, 3] * inMat[1, 2]
132+
133+
out[1, 3] = inMat[0, 0] * inMat[1, 2] * inMat[2, 3] - inMat[0, 0] * inMat[1, 3] * inMat[2, 2]
134+
out[1, 3] += -inMat[1, 0] * inMat[0, 2] * inMat[2, 3] + inMat[1, 0] * inMat[0, 3] * inMat[2, 2]
135+
out[1, 3] += inMat[2, 0] * inMat[0, 2] * inMat[1, 3] - inMat[2, 0] * inMat[0, 3] * inMat[1, 2]
136+
137+
out[2, 3] = -inMat[0, 0] * inMat[1, 1] * inMat[2, 3] + inMat[0, 0] * inMat[1, 3] * inMat[2, 1]
138+
out[2, 3] += inMat[1, 0] * inMat[0, 1] * inMat[2, 3] - inMat[1, 0] * inMat[0, 3] * inMat[2, 1]
139+
out[2, 3] += -inMat[2, 0] * inMat[0, 1] * inMat[1, 3] + inMat[2, 0] * inMat[0, 3] * inMat[1, 1]
140+
141+
out[3, 3] = inMat[0, 0] * inMat[1, 1] * inMat[2, 2] - inMat[0, 0] * inMat[1, 2] * inMat[2, 1]
142+
out[3, 3] += -inMat[1, 0] * inMat[0, 1] * inMat[2, 2] + inMat[1, 0] * inMat[0, 2] * inMat[2, 1]
143+
out[3, 3] += inMat[2, 0] * inMat[0, 1] * inMat[1, 2] - inMat[2, 0] * inMat[0, 2] * inMat[1, 1]
144+
145+
return out
146+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//
2+
// determinant.swift
3+
//
4+
//
5+
// Created by Christian Treffs on 02.09.20.
6+
//
7+
8+
#if FRB_MATH_USE_SIMD
9+
import func simd.simd_determinant
10+
#endif
11+
12+
public func determinant(_ mat: Mat4x4f) -> Float {
13+
#if FRB_MATH_USE_SIMD
14+
return simd.simd_determinant(mat.storage)
15+
#else
16+
return mat[0, 0]*mat[1, 1]*mat[2, 2]*mat[3, 3] - mat[1, 0]*mat[0, 1]*mat[2, 2]*mat[3, 3] + mat[0, 2]*mat[0, 1]*mat[1, 2]*mat[3, 3]
17+
- mat[0, 0]*mat[2, 1]*mat[1, 2]*mat[3, 3] + mat[1, 0]*mat[2, 1]*mat[0, 2]*mat[3, 3] - mat[0, 2]*mat[1, 1]*mat[0, 2]*mat[3, 3]
18+
+ mat[0, 2]*mat[1, 1]*mat[3, 2]*mat[0, 3] - mat[1, 0]*mat[2, 1]*mat[3, 2]*mat[0, 3] + mat[3, 0]*mat[2, 1]*mat[1, 2]*mat[0, 3]
19+
- mat[0, 2]*mat[3, 1]*mat[1, 2]*mat[0, 3] + mat[1, 0]*mat[3, 1]*mat[2, 2]*mat[0, 3] - mat[3, 0]*mat[1, 1]*mat[2, 2]*mat[0, 3]
20+
+ mat[3, 0]*mat[0, 1]*mat[2, 2]*mat[1, 3] - mat[0, 0]*mat[3, 1]*mat[2, 2]*mat[1, 3] + mat[0, 2]*mat[3, 1]*mat[0, 2]*mat[1, 3]
21+
- mat[3, 0]*mat[2, 1]*mat[0, 2]*mat[1, 3] + mat[0, 0]*mat[2, 1]*mat[3, 2]*mat[1, 3] - mat[0, 2]*mat[0, 1]*mat[3, 2]*mat[1, 3]
22+
+ mat[1, 0]*mat[0, 1]*mat[3, 2]*mat[2, 3] - mat[0, 0]*mat[1, 1]*mat[3, 2]*mat[2, 3] + mat[3, 0]*mat[1, 1]*mat[0, 2]*mat[2, 3]
23+
- mat[1, 0]*mat[3, 1]*mat[0, 2]*mat[2, 3] + mat[0, 0]*mat[3, 1]*mat[1, 2]*mat[2, 3] - mat[3, 0]*mat[0, 1]*mat[1, 2]*mat[2, 3]
24+
#endif
25+
}
26+
27+
public func determinant(_ mat: Mat3x3f) -> Float {
28+
#if FRB_MATH_USE_SIMD
29+
return simd.simd_determinant(mat.storage)
30+
#else
31+
return (mat[0, 0] * mat[1, 1] * mat[2, 2] + mat[0, 1] * mat[1, 2] * mat[2, 0] + mat[0, 2] * mat[1, 0] * mat[2, 1])
32+
- (mat[0, 2] * mat[1, 1] * mat[2, 0] + mat[0, 0] * mat[1, 2] * mat[2, 1] + mat[0, 1] * mat[1, 0] * mat[2, 2])
33+
#endif
34+
}
35+
36+
public func determinant(_ mat: Mat4x4d) -> Double {
37+
#if FRB_MATH_USE_SIMD
38+
return simd.simd_determinant(mat.storage)
39+
#else
40+
return mat[0, 0]*mat[1, 1]*mat[2, 2]*mat[3, 3] - mat[1, 0]*mat[0, 1]*mat[2, 2]*mat[3, 3] + mat[0, 2]*mat[0, 1]*mat[1, 2]*mat[3, 3]
41+
- mat[0, 0]*mat[2, 1]*mat[1, 2]*mat[3, 3] + mat[1, 0]*mat[2, 1]*mat[0, 2]*mat[3, 3] - mat[0, 2]*mat[1, 1]*mat[0, 2]*mat[3, 3]
42+
+ mat[0, 2]*mat[1, 1]*mat[3, 2]*mat[0, 3] - mat[1, 0]*mat[2, 1]*mat[3, 2]*mat[0, 3] + mat[3, 0]*mat[2, 1]*mat[1, 2]*mat[0, 3]
43+
- mat[0, 2]*mat[3, 1]*mat[1, 2]*mat[0, 3] + mat[1, 0]*mat[3, 1]*mat[2, 2]*mat[0, 3] - mat[3, 0]*mat[1, 1]*mat[2, 2]*mat[0, 3]
44+
+ mat[3, 0]*mat[0, 1]*mat[2, 2]*mat[1, 3] - mat[0, 0]*mat[3, 1]*mat[2, 2]*mat[1, 3] + mat[0, 2]*mat[3, 1]*mat[0, 2]*mat[1, 3]
45+
- mat[3, 0]*mat[2, 1]*mat[0, 2]*mat[1, 3] + mat[0, 0]*mat[2, 1]*mat[3, 2]*mat[1, 3] - mat[0, 2]*mat[0, 1]*mat[3, 2]*mat[1, 3]
46+
+ mat[1, 0]*mat[0, 1]*mat[3, 2]*mat[2, 3] - mat[0, 0]*mat[1, 1]*mat[3, 2]*mat[2, 3] + mat[3, 0]*mat[1, 1]*mat[0, 2]*mat[2, 3]
47+
- mat[1, 0]*mat[3, 1]*mat[0, 2]*mat[2, 3] + mat[0, 0]*mat[3, 1]*mat[1, 2]*mat[2, 3] - mat[3, 0]*mat[0, 1]*mat[1, 2]*mat[2, 3]
48+
#endif
49+
}
50+
51+
public func determinant(_ mat: Mat3x3d) -> Double {
52+
#if FRB_MATH_USE_SIMD
53+
return simd.simd_determinant(mat.storage)
54+
#else
55+
return (mat[0, 0] * mat[1, 1] * mat[2, 2] + mat[0, 1] * mat[1, 2] * mat[2, 0] + mat[0, 2] * mat[1, 0] * mat[2, 1])
56+
- (mat[0, 2] * mat[1, 1] * mat[2, 0] + mat[0, 0] * mat[1, 2] * mat[2, 1] + mat[0, 1] * mat[1, 0] * mat[2, 2])
57+
#endif
58+
}

Sources/FirebladeMath/Functions/inverse.swift

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,50 +9,22 @@
99
import func simd.simd_inverse
1010
#endif
1111

12-
public func inverse(_ matrix: Mat3x3f) -> Mat3x3f {
13-
#if FRB_MATH_USE_SIMD
14-
return Mat3x3f(storage: simd.simd_inverse(matrix.storage))
15-
#else
16-
fatalError("implementation missing \(#function)")
17-
#endif
18-
}
19-
20-
public func inverse(_ matrix: Mat3x3d) -> Mat3x3d {
21-
#if FRB_MATH_USE_SIMD
22-
return Mat3x3d(storage: simd.simd_inverse(matrix.storage))
23-
#else
24-
fatalError("implementation missing \(#function)")
25-
#endif
26-
}
27-
2812
public func inverse(_ matrix: Mat4x4f) -> Mat4x4f {
2913
#if FRB_MATH_USE_SIMD
3014
return Mat4x4f(storage: simd.simd_inverse(matrix.storage))
3115
#else
32-
fatalError("implementation missing \(#function)")
16+
let adj: Mat4x4f = adjugate(matrix)
17+
let value: Float = 1.0 / determinant(adj)
18+
return multiply(value, adj)
3319
#endif
3420
}
3521

3622
public func inverse(_ matrix: Mat4x4d) -> Mat4x4d {
3723
#if FRB_MATH_USE_SIMD
3824
return Mat4x4d(storage: simd.simd_inverse(matrix.storage))
3925
#else
40-
fatalError("implementation missing \(#function)")
41-
#endif
42-
}
43-
44-
public func inverse(_ quat: Quat4f) -> Quat4f {
45-
#if FRB_MATH_USE_SIMD
46-
return Quat4f(storage: simd_inverse(quat.storage))
47-
#else
48-
fatalError("implementation missing \(#function)")
49-
#endif
50-
}
51-
52-
public func inverse(_ quat: Quat4d) -> Quat4d {
53-
#if FRB_MATH_USE_SIMD
54-
return Quat4d(storage: simd_inverse(quat.storage))
55-
#else
56-
fatalError("implementation missing \(#function)")
26+
let adj: Mat4x4d = adjugate(matrix)
27+
let value: Double = 1.0 / determinant(adj)
28+
return multiply(value, adj)
5729
#endif
5830
}

Sources/FirebladeMath/Functions/quaternion.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,21 @@ public func quaternion(from: SIMD3<Float>, to: SIMD3<Float>) -> Quat4f {
3737
#if FRB_MATH_USE_SIMD
3838
return Quat4f(storage: simd.simd_quaternion(from, to))
3939
#else
40-
fatalError("implementation missing \(#function)")
40+
let half = normalize(from + to)
41+
let img = cross(from, half)
42+
let real = dot(from, half)
43+
return Quat4f(img.x, img.y, img.z, real)
4144
#endif
4245
}
4346

4447
public func quaternion(from: SIMD3<Double>, to: SIMD3<Double>) -> Quat4d {
4548
#if FRB_MATH_USE_SIMD
4649
return Quat4d(storage: simd.simd_quaternion(from, to))
4750
#else
48-
fatalError("implementation missing \(#function)")
51+
let half = normalize(from + to)
52+
let img = cross(from, half)
53+
let real = dot(from, half)
54+
return Quat4d(img.x, img.y, img.z, real)
4955
#endif
5056
}
5157

Sources/FirebladeMath/Matrix/Mat3x3f.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ extension Mat3x3f {
2626
)
2727
}
2828

29-
@inlinable public var inverted: Mat3x3f {
30-
inverse(self)
31-
}
32-
3329
@inlinable public var transposed: Mat3x3f {
3430
transpose(self)
3531
}

Sources/FirebladeMath/Matrix/Mat4x4f.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ extension Mat4x4f {
4242
let sz = storage.columns.2.length
4343
return SIMD3<Float>(sx, sy, sz)
4444
}
45-
set {
46-
fatalError("CAN NOT SET SCALE YET")
47-
}
4845
}
4946

5047
public init(upperLeft matrix3x3: Mat3x3f) {
@@ -77,9 +74,6 @@ extension Mat4x4f {
7774
get {
7875
SIMD4<Float>(Quat4f(rotation: self))
7976
}
80-
set {
81-
fatalError("CAN NOT SET ROTATION YET")
82-
}
8377
}
8478

8579
public init(translation tVec: SIMD3<Float> = .zero, scale sVec: SIMD3<Float> = .one) {

Sources/FirebladeMath/Quat/Quat4f.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ extension Quat4f {
2424
FirebladeMath.angle(self)
2525
}
2626

27-
@inlinable public var inverse: Quat4f {
28-
FirebladeMath.inverse(self)
29-
}
30-
3127
@inlinable public var conjugate: Quat4f {
3228
FirebladeMath.conjugate(self)
3329
}

Sources/FirebladeMath/Quat/Quaternion+Multiplication.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,20 @@ public func multiply(_ lhs: Float, _ rhs: Quat4f) -> Quat4f {
1616
#if FRB_MATH_USE_SIMD
1717
return Quat4f(storage: simd.simd_mul(lhs, rhs.storage))
1818
#else
19-
fatalError("not implemented yet")
19+
return Quat4f(lhs * SIMD4<Float>(rhs.storage))
2020
#endif
2121
}
2222

2323
public func multiply(_ lhs: Quat4f, _ rhs: Float) -> Quat4f {
2424
#if FRB_MATH_USE_SIMD
2525
return Quat4f(storage: simd.simd_mul(lhs.storage, rhs))
2626
#else
27-
fatalError("not implemented yet")
27+
return Quat4f(SIMD4<Float>(lhs.storage) * rhs)
2828
#endif
2929
}
3030

3131
/// Returns the product of two quaternions.
32-
public func multiply (_ lhs: Quat4f, _ rhs: Quat4f) -> Quat4f {
32+
public func multiply(_ lhs: Quat4f, _ rhs: Quat4f) -> Quat4f {
3333
#if FRB_MATH_USE_SIMD
3434
return Quat4f(storage: simd.simd_mul(lhs.storage, rhs.storage))
3535
#else

0 commit comments

Comments
 (0)