https://github.com/akkartik/mu/blob/main/linux/raytracing/3.mu
1
2
3
4
5
6
7
8
9 fn ray-color _in: (addr ray), _out: (addr rgb) {
10 var in/esi: (addr ray) <- copy _in
11 var out/edi: (addr rgb) <- copy _out
12 var dir/eax: (addr vec3) <- get in, dir
13
14
15
16 var unit-storage: vec3
17 var unit/ecx: (addr vec3) <- address unit-storage
18 vec3-unit dir, unit
19
20
21
22 var y-addr/eax: (addr float) <- get unit, y
23
24 var t/xmm0: float <- copy *y-addr
25 var one/eax: int <- copy 1
26 var one-f/xmm1: float <- convert one
27 t <- add one-f
28 var two/eax: int <- copy 2
29 var two-f/xmm2: float <- convert two
30 t <- divide two-f
31
32
33
34
35 var whitening-storage: rgb
36 var whitening/ecx: (addr rgb) <- address whitening-storage
37 rgb-white whitening
38 var one-minus-t/xmm3: float <- copy one-f
39 one-minus-t <- subtract t
40 rgb-scale-up whitening, one-minus-t
41
42
43
44
45 var dest/eax: (addr float) <- get out, r
46 fill-in-rational dest, 5, 0xa
47 dest <- get out, g
48 fill-in-rational dest, 7, 0xa
49 dest <- get out, b
50 copy-to *dest, one-f
51 rgb-scale-up out, t
52
53
54
55
56 rgb-add-to out, whitening
57
58
59
60 }
61
62 fn main -> _/ebx: int {
63
64
65
66
67 var aspect: float
68 var aspect-addr/eax: (addr float) <- address aspect
69 fill-in-rational aspect-addr, 0x10, 9
70
71
72
73
74
75
76
77
78
79
80
81
82 var tmp/eax: int <- copy 2
83 var two-f/xmm4: float <- convert tmp
84 var viewport-height/xmm7: float <- copy two-f
85
86
87
88
89
90
91
92
93
94
95
96 var viewport-width/xmm6: float <- convert tmp
97 viewport-width <- multiply aspect
98
99
100
101
102
103
104
105
106
107
108
109 tmp <- copy 1
110 var focal-length/xmm5: float <- convert tmp
111
112
113 var origin-storage: vec3
114 var origin/edi: (addr vec3) <- address origin-storage
115
116 var horizontal-storage: vec3
117 var dest/eax: (addr float) <- get horizontal-storage, x
118 copy-to *dest, viewport-width
119 var horizontal/ebx: (addr vec3) <- address horizontal-storage
120
121 var vertical-storage: vec3
122 dest <- get vertical-storage, y
123 copy-to *dest, viewport-height
124 var vertical/edx: (addr vec3) <- address vertical-storage
125
126
127 var lower-left-corner-storage: vec3
128 var lower-left-corner/esi: (addr vec3) <- address lower-left-corner-storage
129 copy-object origin, lower-left-corner
130
131 var tmp2: vec3
132 var tmp2-addr/eax: (addr vec3) <- address tmp2
133 copy-object horizontal, tmp2-addr
134 vec3-scale-down tmp2-addr, two-f
135 vec3-subtract-from lower-left-corner, tmp2-addr
136
137 copy-object vertical, tmp2-addr
138 vec3-scale-down tmp2-addr, two-f
139 vec3-subtract-from lower-left-corner, tmp2-addr
140
141 var dest2/ecx: (addr float) <- get lower-left-corner, z
142 var tmp3/xmm0: float <- copy *dest2
143 tmp3 <- subtract focal-length
144 copy-to *dest2, tmp3
145
146
147
148
149
150
151
152
153
154
155 print-string 0, "P3\n400 225\n255\n"
156 var tmp/eax: int <- copy 0x18f
157 var image-width-1/xmm7: float <- convert tmp
158 tmp <- copy 0xe0
159 var image-height-1/xmm6: float <- convert tmp
160
161 var j/ecx: int <- copy 0xe0
162 {
163 compare j, 0
164 break-if-<
165 var i/eax: int <- copy 0
166 {
167 compare i, 0x190
168 break-if->=
169
170 var u/xmm0: float <- convert i
171 u <- divide image-width-1
172
173
174
175
176 var v/xmm1: float <- convert j
177 v <- divide image-height-1
178
179 var r-storage: ray
180
181
182
183 {
184
185 var r/eax: (addr ray) <- address r-storage
186 var dest/ecx: (addr vec3) <- get r, orig
187 copy-object origin, dest
188
189 dest <- get r, dir
190 copy-object lower-left-corner, dest
191
192 var tmp-vec3: vec3
193 var tmp/eax: (addr vec3) <- address tmp-vec3
194 copy-object horizontal, tmp
195 vec3-scale-up tmp, u
196 vec3-add-to dest, tmp
197
198 copy-object vertical, tmp
199 vec3-scale-up tmp, v
200 vec3-add-to dest, tmp
201
202 vec3-subtract-from dest, origin
203
204
205
206 }
207
208 var c-storage: rgb
209 var c/ecx: (addr rgb) <- address c-storage
210 {
211 var r/eax: (addr ray) <- address r-storage
212 ray-color r, c
213
214 print-rgb 0, c
215
216
217 }
218 i <- increment
219 loop
220 }
221 j <- decrement
222 loop
223 }
224 return 0
225 }
226
227 type ray {
228 orig: vec3
229 dir: vec3
230 }
231
232
233
234
235 fn initialize-ray _self: (addr ray), o: (addr vec3), d: (addr vec3) {
236 var self/esi: (addr ray) <- copy _self
237 var dest/eax: (addr vec3) <- get self, orig
238 copy-object o, dest
239 dest <- get self, dir
240 vec3-unit d, dest
241 }
242
243 fn ray-at _self: (addr ray), t: float, out: (addr vec3) {
244 var self/esi: (addr ray) <- copy _self
245 var src/eax: (addr vec3) <- get self, dir
246 copy-object src, out
247 vec3-scale-up out, t
248 src <- get self, orig
249 vec3-add-to out, src
250 }
251
252 type rgb {
253
254 r: float
255 g: float
256 b: float
257 }
258
259
260 fn print-rgb screen: (addr screen), _c: (addr rgb) {
261 var c/esi: (addr rgb) <- copy _c
262 var xn: float
263 var xn-addr/ecx: (addr float) <- address xn
264 fill-in-rational xn-addr, 0x3e7ff, 0x3e8
265
266 var result/xmm0: float <- copy xn
267 var src-addr/eax: (addr float) <- get c, r
268 result <- multiply *src-addr
269 var result-int/edx: int <- truncate result
270 print-int32-decimal screen, result-int
271 print-string screen, " "
272
273 src-addr <- get c, g
274 result <- copy xn
275 result <- multiply *src-addr
276 result-int <- truncate result
277 print-int32-decimal screen, result-int
278 print-string screen, " "
279
280 src-addr <- get c, b
281 result <- copy xn
282 result <- multiply *src-addr
283 result-int <- truncate result
284 print-int32-decimal screen, result-int
285 print-string screen, "\n"
286 }
287
288 fn print-rgb-raw screen: (addr screen), _v: (addr rgb) {
289 var v/esi: (addr rgb) <- copy _v
290 print-string screen, "("
291 var tmp/eax: (addr float) <- get v, r
292 print-float-hex screen, *tmp
293 print-string screen, ", "
294 tmp <- get v, g
295 print-float-hex screen, *tmp
296 print-string screen, ", "
297 tmp <- get v, b
298 print-float-hex screen, *tmp
299 print-string screen, ")"
300 }
301
302 fn rgb-white _c: (addr rgb) {
303 var c/esi: (addr rgb) <- copy _c
304 var one/eax: int <- copy 1
305 var one-f/xmm0: float <- convert one
306 var dest/edi: (addr float) <- get c, r
307 copy-to *dest, one-f
308 dest <- get c, g
309 copy-to *dest, one-f
310 dest <- get c, b
311 copy-to *dest, one-f
312 }
313
314 fn rgb-add-to _c1: (addr rgb), _c2: (addr rgb) {
315 var c1/edi: (addr rgb) <- copy _c1
316 var c2/esi: (addr rgb) <- copy _c2
317
318 var arg1/eax: (addr float) <- get c1, r
319 var arg2/ecx: (addr float) <- get c2, r
320 var result/xmm0: float <- copy *arg1
321 result <- add *arg2
322 copy-to *arg1, result
323
324 arg1 <- get c1, g
325 arg2 <- get c2, g
326 result <- copy *arg1
327 result <- add *arg2
328 copy-to *arg1, result
329
330 arg1 <- get c1, b
331 arg2 <- get c2, b
332 result <- copy *arg1
333 result <- add *arg2
334 copy-to *arg1, result
335 }
336
337 fn rgb-scale-up _c1: (addr rgb), f: float {
338 var c1/edi: (addr rgb) <- copy _c1
339
340 var dest/eax: (addr float) <- get c1, r
341 var result/xmm0: float <- copy *dest
342 result <- multiply f
343 copy-to *dest, result
344
345 dest <- get c1, g
346 result <- copy *dest
347 result <- multiply f
348 copy-to *dest, result
349
350 dest <- get c1, b
351 result <- copy *dest
352 result <- multiply f
353 copy-to *dest, result
354 }
355
356 type vec3 {
357 x: float
358 y: float
359 z: float
360 }
361
362 fn print-vec3 screen: (addr screen), _v: (addr vec3) {
363 var v/esi: (addr vec3) <- copy _v
364 print-string screen, "("
365 var tmp/eax: (addr float) <- get v, x
366 print-float-hex screen, *tmp
367 print-string screen, ", "
368 tmp <- get v, y
369 print-float-hex screen, *tmp
370 print-string screen, ", "
371 tmp <- get v, z
372 print-float-hex screen, *tmp
373 print-string screen, ")"
374 }
375
376 fn vec3-add-to _v1: (addr vec3), _v2: (addr vec3) {
377 var v1/edi: (addr vec3) <- copy _v1
378 var v2/esi: (addr vec3) <- copy _v2
379
380 var arg1/eax: (addr float) <- get v1, x
381 var arg2/ecx: (addr float) <- get v2, x
382 var result/xmm0: float <- copy *arg1
383 result <- add *arg2
384 copy-to *arg1, result
385
386 arg1 <- get v1, y
387 arg2 <- get v2, y
388 result <- copy *arg1
389 result <- add *arg2
390 copy-to *arg1, result
391
392 arg1 <- get v1, z
393 arg2 <- get v2, z
394 result <- copy *arg1
395 result <- add *arg2
396 copy-to *arg1, result
397 }
398
399 fn vec3-subtract-from v1: (addr vec3), v2: (addr vec3) {
400 var tmp-storage: vec3
401 var tmp/eax: (addr vec3) <- address tmp-storage
402 copy-object v2, tmp
403 vec3-negate tmp
404 vec3-add-to v1, tmp
405 }
406
407 fn vec3-negate v: (addr vec3) {
408 var negative-one/eax: int <- copy -1
409 var negative-one-f/xmm0: float <- convert negative-one
410 vec3-scale-up v, negative-one-f
411 }
412
413 fn vec3-scale-up _v: (addr vec3), f: float {
414 var v/edi: (addr vec3) <- copy _v
415
416 var dest/eax: (addr float) <- get v, x
417 var result/xmm0: float <- copy *dest
418 result <- multiply f
419 copy-to *dest, result
420
421 dest <- get v, y
422 result <- copy *dest
423 result <- multiply f
424 copy-to *dest, result
425
426 dest <- get v, z
427 result <- copy *dest
428 result <- multiply f
429 copy-to *dest, result
430 }
431
432 fn vec3-scale-down _v: (addr vec3), f: float {
433 var v/edi: (addr vec3) <- copy _v
434
435 var dest/eax: (addr float) <- get v, x
436 var result/xmm0: float <- copy *dest
437 result <- divide f
438 copy-to *dest, result
439
440 dest <- get v, y
441 result <- copy *dest
442 result <- divide f
443 copy-to *dest, result
444
445 dest <- get v, z
446 result <- copy *dest
447 result <- divide f
448 copy-to *dest, result
449 }
450
451 fn vec3-unit in: (addr vec3), out: (addr vec3) {
452 var len/xmm0: float <- vec3-length in
453
454
455
456 copy-object in, out
457 vec3-scale-down out, len
458 }
459
460 fn vec3-length v: (addr vec3) -> _/xmm0: float {
461 var result/xmm0: float <- vec3-length-squared v
462 result <- square-root result
463 return result
464 }
465
466 fn vec3-length-squared _v: (addr vec3) -> _/xmm0: float {
467 var v/esi: (addr vec3) <- copy _v
468
469 var src/eax: (addr float) <- get v, x
470 var tmp/xmm1: float <- copy *src
471 tmp <- multiply tmp
472 var result/xmm0: float <- copy tmp
473
474 src <- get v, y
475 tmp <- copy *src
476 tmp <- multiply tmp
477 result <- add tmp
478
479 src <- get v, z
480 tmp <- copy *src
481 tmp <- multiply tmp
482 result <- add tmp
483 return result
484 }