-- installed, the frames will also be combined into a video file. This script
-- must be called from the same directory where the rasterize program is.
--- Set the width and height of the viewport.
-local size = {w = 640, h = 480}
-
-- Set the number of frames to be rendered for the animation.
local frames = 360
s 10 10 10
]]
+-- Set the number of samples for supersampling. If this is set to a value of
+-- two or greater, each frame will be rendered larger by the factor specified.
+-- 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
+
+-- 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
---------------------------------------------------------------------------
local fmt = string.format
-local write = function(...) io.write(fmt(...)) end
+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}
function render(i)
while i do
+ local w, h = size.w, size.h
+ if 1 < supersample then
+ w = w * supersample
+ h = h * supersample
+ end
local filename = fmt("frames/anim%04d.bmp", i)
local command = fmt("./rasterize -o %s >/dev/null", filename)
local out = io.popen(command, "w")
1.57 %f 0.1 1000
%s
X
-]], size.w, size.h, e.x, e.y, e.z, l.x, l.y, l.z, size.w/size.h, scene))
+]], w, h, e.x, e.y, e.z, l.x, l.y, l.z, size.w/size.h, scene))
i = coroutine.yield()
out:close()
+ if 1 < supersample then
+ run("convert %s -scale %dx%d %s", filename, size.w, size.h, filename)
+ end
end
end
table.insert(threads, coroutine.wrap(render))
end
-os.execute("rm -rf frames && mkdir frames >/dev/null 2>&1")
+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
print()
-if os.execute("ffmpeg -i frames/anim%04d.bmp -b 1024k -y -an scene.avi") == 0 then
+if run("ffmpeg -i frames/anim%04d.bmp -b 1024k -y -an scene.avi") == 0 then
print("Animation written to scene.avi.")
end