about summary refs log tree commit diff stats
path: root/linux/raytracing/2.mu
diff options
context:
space:
mode:
Diffstat (limited to 'linux/raytracing/2.mu')
-rw-r--r--linux/raytracing/2.mu86
1 files changed, 86 insertions, 0 deletions
diff --git a/linux/raytracing/2.mu b/linux/raytracing/2.mu
new file mode 100644
index 00000000..e23ce3b4
--- /dev/null
+++ b/linux/raytracing/2.mu
@@ -0,0 +1,86 @@
+# Listing 7 of https://raytracing.github.io/books/RayTracingInOneWeekend.html
+#
+# To run (on Linux):
+#   $ git clone https://github.com/akkartik/mu
+#   $ cd mu
+#   $ ./translate_mu apps/raytracing/2.mu
+#   $ ./a.elf > 2.ppm
+
+fn main -> _/ebx: int {
+  print-string 0, "P3\n256 256\n255\n"
+  var _four/edx: int <- copy 4
+  var four/xmm1: float <- convert _four
+  var one-fourth/xmm1: float <- reciprocal four
+  var max/edx: int <- copy 0xff
+  var image-size/xmm2: float <- convert max
+  var j/ecx: int <- copy 0xff
+  {
+    compare j, 0
+    break-if-<
+    var i/eax: int <- copy 0
+    {
+      compare i, 0xff
+      break-if->
+      var c: rgb
+      # compute r
+      var tmp/xmm0: float <- convert i
+      tmp <- divide image-size
+      var r-addr/edx: (addr float) <- get c, r
+      copy-to *r-addr, tmp
+#?       var tmp2/ebx: int <- reinterpret *r-addr
+#?       print-int32-hex 0, tmp2
+#?       print-string 0, "\n"
+      # compute g
+      tmp <- convert j
+      tmp <- divide image-size
+      var g-addr/edx: (addr float) <- get c, g
+      copy-to *g-addr, tmp
+      # compute b
+      var b-addr/edx: (addr float) <- get c, b
+      copy-to *b-addr, one-fourth
+      # emit
+      var c-addr/edx: (addr rgb) <- address c
+      print-rgb 0, c-addr
+      i <- increment
+      loop
+    }
+    j <- decrement
+    loop
+  }
+  return 0
+}
+
+type rgb {
+  # components normalized to within [0.0, 1.0]
+  r: float
+  g: float
+  b: float
+}
+
+# print translating to [0, 256)
+fn print-rgb screen: (addr screen), _c: (addr rgb) {
+  var c/esi: (addr rgb) <- copy _c
+  var n/ecx: int <- copy 0xff  # turns out 255 works just as well as 255.999, which is lucky because we don't have floating-point literals
+  var xn/xmm1: float <- convert n
+  # print 255 * c->r
+  var result/xmm0: float <- copy xn
+  var src-addr/eax: (addr float) <- get c, r
+  result <- multiply *src-addr
+  var result-int/edx: int <- convert result
+  print-int32-decimal screen, result-int
+  print-string screen, " "
+  # print 255 * c->g
+  src-addr <- get c, g
+  result <- copy xn
+  result <- multiply *src-addr
+  result-int <- convert result
+  print-int32-decimal screen, result-int
+  print-string screen, " "
+  # print 255 * c->b
+  src-addr <- get c, b
+  result <- copy xn
+  result <- multiply *src-addr
+  result-int <- convert result
+  print-int32-decimal screen, result-int
+  print-string screen, "\n"
+}