Skip to content

Commit 69b820c

Browse files
authored
Merge branch 'rewrite' into array-compound
2 parents 55baeee + d5b438e commit 69b820c

File tree

5 files changed

+471
-30
lines changed

5 files changed

+471
-30
lines changed

packages/math/math.kai

+296
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
// TODO: @overloading
2+
#foreign llvm #callconv "c" {
3+
4+
pow :: fn(x, power: f32) -> f32 #linkname "llvm.pow.f32"
5+
// pow :: fn(x, power: f64) -> f64 #linkname "llvm.pow.f64"
6+
7+
// pow :: fn(x: f32, power: i32) -> f32 #linkname "llvm.powi.f32"
8+
// pow :: fn(x: f64, power: i32) -> f32 #linkname "llvm.powi.f64"
9+
10+
sqrt :: fn(x: f32) -> f32 #linkname "llvm.sqrt.f32"
11+
// sqrt :: fn(x: f64) -> f64 #linkname "llvm.sqrt.f64"
12+
13+
exp :: fn(x: f32) -> f32 #linkname "llvm.exp.f32"
14+
// exp :: fn(x: f64) -> f64 #linkname "llvm.exp.f64"
15+
16+
exp2 :: fn(x: f32) -> f32 #linkname "llvm.exp2.f32"
17+
// exp2 :: fn(x: f64) -> f64 #linkname "llvm.exp2.f64"
18+
19+
log :: fn(x: f32) -> f32 #linkname "llvm.log.f32"
20+
// log :: fn(x: f64) -> f64 #linkname "llvm.log.f64"
21+
22+
log10 :: fn(x: f32) -> f32 #linkname "llvm.log10.f32"
23+
// log10 :: fn(x: f64) -> f64 #linkname "llvm.log10.f64"
24+
25+
log2 :: fn(x: f32) -> f32 #linkname "llvm.log2.f32"
26+
// log2 :: fn(x: f64) -> f64 #linkname "llvm.log2.f64"
27+
28+
sin :: fn(x: f32) -> f32 #linkname "llvm.sin.f32"
29+
// sin :: fn(x: f64) -> f64 #linkname "llvm.sin.f64"
30+
31+
cos :: fn(x: f32) -> f32 #linkname "llvm.cos.f32"
32+
// cos :: fn(x: f64) -> f64 #linkname "llvm.cos.f64"
33+
34+
fma :: fn(a, b, c: f32) -> f32 #linkname "llvm.fma.f32"
35+
// fma :: fn(a, b, c: f64) -> f64 #linkname "llvm.fma.f64"
36+
37+
fabs :: fn(x: f32) -> f32 #linkname "llvm.fabs.f32"
38+
// fabs :: fn(x: f64) -> f64 #linkname "llvm.fabs.f64"
39+
40+
min :: fn(x: f32) -> f32 #linkname "llvm.minnum.f32"
41+
// min :: fn(x: f64) -> f64 #linkname "llvm.minnum.f64"
42+
43+
max :: fn(x: f32) -> f32 #linkname "llvm.maxnum.f32"
44+
// max :: fn(x: f64) -> f64 #linkname "llvm.maxnum.f64"
45+
46+
sign :: fn(x: f32) -> f32 #linkname "llvm.copysign.f32"
47+
// sign :: fn(x: f64) -> f64 #linkname "llvm.copysign.f64"
48+
49+
floor :: fn(x: f32) -> f32 #linkname "llvm.floor.f32"
50+
// floor :: fn(x: f64) -> f64 #linkname "llvm.floor.f64"
51+
52+
ceil :: fn(x: f32) -> f32 #linkname "llvm.ceil.f32"
53+
// ceil :: fn(x: f64) -> f64 #linkname "llvm.ceil.f64"
54+
55+
trunc :: fn(x: f32) -> f32 #linkname "llvm.trunc.f32"
56+
// trunc :: fn(x: f64) -> f64 #linkname "llvm.trunc.f64"
57+
58+
rint :: fn(x: f32) -> f32 #linkname "llvm.rint.f32"
59+
// rint :: fn(x: f64) -> f64 #linkname "llvm.rint.f64"
60+
61+
nearbyint :: fn(x: f32) -> f32 #linkname "llvm.nearbyint.f32"
62+
// nearbyint :: fn(x: f64) -> f64 #linkname "llvm.nearbyint.f64"
63+
64+
round :: fn(x: f32) -> f32 #linkname "llvm.round.f32"
65+
// round :: fn(x: f64) -> f64 #linkname "llvm.round.f64"
66+
67+
// MARK: Specialized Arithmetic Intrinsics
68+
69+
canonicalize :: fn(f32) -> f32 #linkname "llvm.canonicalize.f32"
70+
// canonicalize :: fn(f64) -> f64 #linkname "llvm.canonicalize.f64"
71+
72+
fmuladd32 :: fn(a, b, c: f32) -> f32 #linkname "llvm.fmuladd.f32"
73+
// fmuladd64 :: fn(a, b, c: f64) -> f64 #linkname "llvm.fmuladd.f64"
74+
75+
// TODO: Arithmetic with Overflow Intrinsics
76+
}
77+
78+
tau :: 6.28318530717958647692528676655900576
79+
pi :: 3.14159265358979323846264338327950288
80+
81+
e :: 2.71828182845904523536
82+
83+
epsilon :: 1.19209290e-7
84+
85+
Vec3 :: #vector(3)f32
86+
Vec4 :: #vector(4)f32
87+
Mat4 :: [4][4]f32
88+
89+
tan :: fn(x: f32) -> f32 { return sin(x) / cos(x) }
90+
91+
dot :: fn(a, b: Vec3) -> f32 {
92+
c := a * b
93+
return c.x + c.y + c.z
94+
}
95+
96+
dot_4 :: fn(a, b: Vec4) -> f32 {
97+
c := a * b
98+
return c.x + c.y + c.z + c.w
99+
}
100+
101+
mag :: fn(v: Vec3) -> f32 {
102+
return sqrt(dot(v, v))
103+
}
104+
105+
mag_4 :: fn(v: Vec4) -> f32 {
106+
return sqrt(dot_4(v, v))
107+
}
108+
109+
norm :: fn(v: Vec3) -> Vec3 {
110+
m := mag(v)
111+
mv := Vec3 { m, m, m }
112+
return v / mv
113+
}
114+
115+
norm_4 :: fn(v: Vec4) -> Vec4 {
116+
m := mag_4(v)
117+
mv := Vec4 { m, m, m, m }
118+
return v / mv
119+
}
120+
121+
cross :: fn(x, y: Vec3) -> Vec3 {
122+
a := x.yzx * y.zxy
123+
b := x.zxy * y.yzx
124+
return a - b
125+
}
126+
127+
identity_mat :: fn() -> Mat4 {
128+
return Mat4 {
129+
{1, 0, 0, 0},
130+
{0, 1, 0, 0},
131+
{0, 0, 1, 0},
132+
{0, 0, 0, 1}
133+
}
134+
}
135+
136+
transpose :: fn(m: Mat4) -> Mat4 {
137+
for j := 0; j < 4; j += 1 {
138+
for i := 0; i < 4; i += 1 {
139+
m[i][j], m[j][i] = m[j][i], m[i][j]
140+
}
141+
}
142+
return m
143+
}
144+
145+
mul :: fn(a,b: Mat4) -> Mat4 {
146+
c: Mat4
147+
for j := 0; j < 4; j += 1 {
148+
for i := 0; i < 4; i += 1 {
149+
c[j][i] = a[0][i] * b[j][0] +
150+
a[1][i] * b[j][1] +
151+
a[2][i] * b[j][2] +
152+
a[3][i] * b[j][3]
153+
}
154+
}
155+
return c
156+
}
157+
158+
inverse :: fn(m: Mat4) -> Mat4 {
159+
o: Mat4
160+
161+
sf00 := m[2][2] * m[3][3] - m[3][2] * m[2][3]
162+
sf01 := m[2][1] * m[3][3] - m[3][1] * m[2][3]
163+
sf02 := m[2][1] * m[3][2] - m[3][1] * m[2][2]
164+
sf03 := m[2][0] * m[3][3] - m[3][0] * m[2][3]
165+
sf04 := m[2][0] * m[3][2] - m[3][0] * m[2][2]
166+
sf05 := m[2][0] * m[3][1] - m[3][0] * m[2][1]
167+
sf06 := m[1][2] * m[3][3] - m[3][2] * m[1][3]
168+
sf07 := m[1][1] * m[3][3] - m[3][1] * m[1][3]
169+
sf08 := m[1][1] * m[3][2] - m[3][1] * m[1][2]
170+
sf09 := m[1][0] * m[3][3] - m[3][0] * m[1][3]
171+
sf10 := m[1][0] * m[3][2] - m[3][0] * m[1][2]
172+
sf11 := m[1][1] * m[3][3] - m[3][1] * m[1][3]
173+
sf12 := m[1][0] * m[3][1] - m[3][0] * m[1][1]
174+
sf13 := m[1][2] * m[2][3] - m[2][2] * m[1][3]
175+
sf14 := m[1][1] * m[2][3] - m[2][1] * m[1][3]
176+
sf15 := m[1][1] * m[2][2] - m[2][1] * m[1][2]
177+
sf16 := m[1][0] * m[2][3] - m[2][0] * m[1][3]
178+
sf17 := m[1][0] * m[2][2] - m[2][0] * m[1][2]
179+
sf18 := m[1][0] * m[2][1] - m[2][0] * m[1][1]
180+
181+
o[0][0] = +(m[1][1] * sf00 - m[1][2] * sf01 + m[1][3] * sf02)
182+
o[0][1] = -(m[1][0] * sf00 - m[1][2] * sf03 + m[1][3] * sf04)
183+
o[0][2] = +(m[1][0] * sf01 - m[1][1] * sf03 + m[1][3] * sf05)
184+
o[0][3] = -(m[1][0] * sf02 - m[1][1] * sf04 + m[1][2] * sf05)
185+
o[1][0] = -(m[0][1] * sf00 - m[0][2] * sf01 + m[0][3] * sf02)
186+
o[1][1] = +(m[0][0] * sf00 - m[0][2] * sf03 + m[0][3] * sf04)
187+
o[1][2] = -(m[0][0] * sf01 - m[0][1] * sf03 + m[0][3] * sf05)
188+
o[1][3] = +(m[0][0] * sf02 - m[0][1] * sf04 + m[0][2] * sf05)
189+
o[2][0] = +(m[0][1] * sf06 - m[0][2] * sf07 + m[0][3] * sf08)
190+
o[2][1] = -(m[0][0] * sf06 - m[0][2] * sf09 + m[0][3] * sf10)
191+
o[2][2] = +(m[0][0] * sf11 - m[0][1] * sf09 + m[0][3] * sf12)
192+
o[2][3] = -(m[0][0] * sf08 - m[0][1] * sf10 + m[0][2] * sf12)
193+
o[3][0] = -(m[0][1] * sf13 - m[0][2] * sf14 + m[0][3] * sf15)
194+
o[3][1] = +(m[0][0] * sf13 - m[0][2] * sf16 + m[0][3] * sf17)
195+
o[3][2] = -(m[0][0] * sf14 - m[0][1] * sf16 + m[0][3] * sf18)
196+
o[3][3] = +(m[0][0] * sf15 - m[0][1] * sf17 + m[0][2] * sf18)
197+
198+
ood := 1.0 / (m[0][0] * o[0][0] +
199+
m[0][1] * o[0][1] +
200+
m[0][2] * o[0][2] +
201+
m[0][3] * o[0][3])
202+
203+
o[0][0] *= ood
204+
o[0][1] *= ood
205+
o[0][2] *= ood
206+
o[0][3] *= ood
207+
o[1][0] *= ood
208+
o[1][1] *= ood
209+
o[1][2] *= ood
210+
o[1][3] *= ood
211+
o[2][0] *= ood
212+
o[2][1] *= ood
213+
o[2][2] *= ood
214+
o[2][3] *= ood
215+
o[3][0] *= ood
216+
o[3][1] *= ood
217+
o[3][2] *= ood
218+
o[3][3] *= ood
219+
220+
return o
221+
}
222+
223+
translate_mat :: fn(v: Vec3) -> Mat4 {
224+
m := identity_mat()
225+
m[3][0] = v.x
226+
m[3][1] = v.y
227+
m[3][2] = v.z
228+
m[3][3] = 1
229+
return m
230+
}
231+
232+
//rotate_mat :: fn(v: Vec3, rads: f32) -> Mat4 {
233+
// c := cos(rads)
234+
// s := sin(rads)
235+
//
236+
// a := norm(v)
237+
// b := 1.0 - c
238+
// vc := Vec3 { b, b, b }
239+
// t := a * vc
240+
//
241+
// rot := identity_mat()
242+
//
243+
// rot[0][0] = c + t.x * a.x
244+
// rot[0][1] = 0.0 + t.x * a.y + s * a.z
245+
// rot[0][2] = 0.0 + t.x * a.z - s * a.y
246+
// rot[0][3] = 0.0
247+
//
248+
// rot[1][0] = 0.0 + t.y * a.x - s * a.z
249+
// rot[1][1] = c + t.y * a.y
250+
// rot[1][2] = 0.0 + t.y * a.z + s * a.x
251+
// rot[1][3] = 0.0
252+
//
253+
// rot[2][0] = 0.0 + t.z * a.x + s * a.y
254+
// rot[2][1] = 0.0 + t.z * a.y - s * a.x
255+
// rot[2][2] = c + t.z * a.z
256+
// rot[2][3] = 0.0
257+
//
258+
// return rot
259+
//}
260+
261+
scale :: fn(m: Mat4, s: f32) -> Mat4 {
262+
m[0][0] *= s
263+
m[1][1] *= s
264+
m[2][2] *= s
265+
return m
266+
}
267+
268+
look_at :: fn(eye, centre, up: Vec3) -> Mat4 {
269+
f := norm(centre - eye)
270+
s := norm(cross(f, up))
271+
u := cross(s, f)
272+
273+
return Mat4 {
274+
{ s.x, u.x, -f.x, 0 },
275+
{ s.y, u.y, -f.y, 0 },
276+
{ s.z, u.z, -f.z, 0 },
277+
{ -dot(s, eye), -dot(u, eye), dot(f, eye), 1}
278+
}
279+
}
280+
281+
perspective :: fn(fovy, aspect, near, far: f32) -> Mat4 {
282+
m := Mat4 {
283+
{0, 0, 0, 0},
284+
{0, 0, 0, 0},
285+
{0, 0, 0, 1},
286+
{0, 0, 0, 0}
287+
}
288+
tan_half_fovy := tan(0.5 * fovy)
289+
290+
m[0][0] = 1.0 / (aspect * tan_half_fovy)
291+
m[1][1] = 1.0 / (tan_half_fovy)
292+
m[2][2] = -(far + near) / (far - near)
293+
m[2][3] = -1.0
294+
m[3][2] = -2.0 * far * near / (far - near)
295+
return m
296+
}

0 commit comments

Comments
 (0)