--- /dev/null
+#!/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
+