]> Dogcows Code - chaz/rasterize/blob - rotate.lua
add geometry caching and a rotation script
[chaz/rasterize] / rotate.lua
1 #!/usr/bin/env lua
2
3 -- Render a scene from different angles.
4
5 local slices = 64
6 local distance = 4
7 local height = 1
8 local look = {x = -2, y = -1, z = -2}
9 local size = {w = 640, h = 480}
10 local scene = [[
11 g teapot2.raw
12 c 1.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0
13 t 0.0 0.0 0.0
14 s 0.6 0.6 0.6
15 g triangle.raw
16 c 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1
17 t 2.0 0.0 -2.0
18 s 1.0 1.0 1.0
19 g dragon.raw
20 c 0.7 0.3 0.2 0.8 0.2 0.1 0.9 0.2 0.2
21 t -2.0 -1.0 -2.0
22 s 2.0 2.0 2.0
23 g budda.raw
24 c 0.1 0.2 0.7 0.1 0.3 0.9 0.2 0.1 0.8
25 t 2.0 -1.5 2.0
26 s 10.0 10.0 10.0
27 g bunny.raw
28 c 0.9 0.8 0.9 0.8 0.7 0.9 0.9 0.8 0.7
29 t -2.0 -1.0 2.0
30 s 10.0 10.0 10.0
31 ]]
32
33 local concurrent = 3
34
35 function vec_scale(v, s)
36 return {x = v.x * s, y = v.y * s, z = v.z * s}
37 end
38
39 function render(i, v)
40 while true do
41 local out = io.popen("./project2 -", "w")
42 out:write(string.format([[
43 U3
44 %d %d
45 %f %f %f
46 %f %f %f
47 0.0 1.0 0.0
48 1.57 %f 0.1 1000.0
49 %s
50 ]], size.w, size.h, v.x, v.y, v.z, look.x, look.y, look.z, size.w/size.h, scene))
51 local a, b = coroutine.yield()
52 out:close()
53 os.rename("stdin.bmp", string.format("r/out%03d.bmp", i))
54 if a == null then
55 break
56 else
57 i = a
58 v = b
59 end
60 end
61 end
62
63 local threads = {}
64 for i = 1,concurrent do
65 table.insert(threads, coroutine.wrap(render))
66 end
67
68 for i = 0,(slices-1) do
69 local t = 2 * i * math.pi / slices
70 local v = {
71 x = math.cos(t),
72 y = 0,
73 z = math.sin(t),
74 }
75 v = vec_scale(v, distance)
76 v.y = v.y + height
77 threads[(i % concurrent) + 1](i, v)
78 end
79
80 for k,v in ipairs(threads) do
81 v(null) -- clear up any leftover work
82 end
83
This page took 0.040087 seconds and 5 git commands to generate.