]> Dogcows Code - chaz/rasterize/blobdiff - rotate.lua
add geometry caching and a rotation script
[chaz/rasterize] / rotate.lua
diff --git a/rotate.lua b/rotate.lua
new file mode 100755 (executable)
index 0000000..ea38344
--- /dev/null
@@ -0,0 +1,83 @@
+#!/usr/bin/env lua
+
+-- Render a scene from different angles.
+
+local slices = 64
+local distance = 4
+local height = 1
+local look = {x = -2, y = -1, z = -2}
+local size = {w = 640, h = 480}
+local scene = [[
+g teapot2.raw
+c 1.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0
+t 0.0 0.0 0.0
+s 0.6 0.6 0.6
+g triangle.raw
+c 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1
+t 2.0 0.0 -2.0
+s 1.0 1.0 1.0
+g dragon.raw
+c 0.7 0.3 0.2 0.8 0.2 0.1 0.9 0.2 0.2
+t -2.0 -1.0 -2.0
+s 2.0 2.0 2.0
+g budda.raw
+c 0.1 0.2 0.7 0.1 0.3 0.9 0.2 0.1 0.8
+t 2.0 -1.5 2.0
+s 10.0 10.0 10.0
+g bunny.raw
+c 0.9 0.8 0.9 0.8 0.7 0.9 0.9 0.8 0.7
+t -2.0 -1.0 2.0
+s 10.0 10.0 10.0
+]]
+
+local concurrent = 3
+
+function vec_scale(v, s)
+    return {x = v.x * s, y = v.y * s, z = v.z * s}
+end
+
+function render(i, v)
+    while true do
+        local out = io.popen("./project2 -", "w")
+        out:write(string.format([[
+U3
+%d %d
+%f %f %f
+%f %f %f
+0.0 1.0 0.0
+1.57 %f 0.1 1000.0
+%s
+]], size.w, size.h, v.x, v.y, v.z, look.x, look.y, look.z, size.w/size.h, scene))
+        local a, b = coroutine.yield()
+        out:close()
+        os.rename("stdin.bmp", string.format("r/out%03d.bmp", i))
+        if a == null then
+            break
+        else
+            i = a
+            v = b
+        end
+    end
+end
+
+local threads = {}
+for i = 1,concurrent do
+    table.insert(threads, coroutine.wrap(render))
+end
+
+for i = 0,(slices-1) do
+    local t = 2 * i * math.pi / slices
+    local v = {
+        x = math.cos(t),
+        y = 0,
+        z = math.sin(t),
+    }
+    v = vec_scale(v, distance)
+    v.y = v.y + height
+    threads[(i % concurrent) + 1](i, v)
+end
+
+for k,v in ipairs(threads) do
+    v(null)     -- clear up any leftover work
+end
+
This page took 0.020324 seconds and 4 git commands to generate.