-- ImageMagick is used to scale the frames back down to size; if ImageMagick
-- is not installed, the resulting frames will end up bigger than they should
-- be and the aliasing problem will not be fixed.
-local supersample = 4
+local supersample = 2
-- Set the width and height of the viewport.
local size = {w = 640, h = 480}
-- Set the number of concurrent renderings (for multi-core machines).
local jobs = 6
+-- Set the options to be passed directly to ffmpeg.
+local ffmpeg_opts = "-b 1024k"
-- end of configuration
---------------------------------------------------------------------------
-local fmt = string.format
-local write = function(...) return io.write(fmt(...)) end
-local run = function(...) return os.execute(fmt(...)) end
-
function vec_new(x, y, z)
return {x = x, y = y, z = z}
end
return vec_new(v.x * s, v.y * s, v.z * s)
end
+local fmt = string.format
+local write = function(...) io.write(fmt(...)) io.flush() end
+local run = function(...) return os.execute(fmt(...)) end
+
function render(i)
while i do
local w, h = size.w, size.h
local out = io.popen(command, "w")
local e = eye(i)
local l = look(i)
- write("\27[80D\27[2Kframe\t %4d / %d", i + 1, frames)
+ write("\27[80D\27[2Kframe\t %4d / %d", i, frames)
out:write(fmt([[
U3
%d %d
end
end
-print("Animating scene...")
-
-local threads = {}
-for i = 1,jobs do
- table.insert(threads, coroutine.wrap(render))
+function renderings()
+ local t = {}
+ for i = 1,jobs do
+ table.insert(t, coroutine.wrap(render))
+ end
+ local iterations = frames + jobs
+ local frame = 0
+ return function()
+ frame = frame + 1
+ if frame <= iterations then
+ local i = frame
+ if frames < i then i = null end
+ return t[1 + frame % jobs], i
+ end
+ end
end
+print("Animating scene...")
+
run("rm -rf frames && mkdir frames >/dev/null 2>&1")
-for i = 0,(frames-1) do
- threads[1 + (i % jobs)](i)
-end
-for _,thread in ipairs(threads) do thread(null) end
+for render,frame in renderings() do render(frame) end
+
print()
-if run("ffmpeg -i frames/anim%04d.bmp -b 1024k -y -an scene.avi") == 0 then
+if run("ffmpeg -i frames/anim%%04d.bmp %s -y -an scene.avi", ffmpeg_opts) == 0 then
print("Animation written to scene.avi.")
end