Files
2018-10-29 22:25:02 +10:00

67 lines
2.0 KiB
Python

# openscad will not adjust viewports set in code when rendering from the cmdline
# what a shame! so we do it here
import os
import subprocess
from math import floor, ceil
scad = 'C:\\Program Files\\OpenSCAD\\openscad.exe'
folder = 'outputs'
final_size = [800, 600]
render_size = [x*2 for x in final_size]
def quad_ease_inout(t):
return 2*t*t if t<.5 else -1+(4-2*t)*t
def interpolate(vec, index_float):
vec1 = vec[floor(index_float)]
vec2 = vec[ceil(index_float)]
percent = index_float % 1
return [percent*(high-low) + low for low, high in zip(vec1, vec2)]
def thread_call(args):
print(' '.join(args))
subprocess.check_output(args)
def gen_args():
interval = 2
percents = [i / 100.0 for i in range(0, 100+interval, interval)]
# vpt[3], vpr[3], vpd[1]
anim = [
[0, -65.9053, 71.5148, 30, 0, 0, 360],
[-16.5687, -50.6543, 84.6026, 66.5,0, -37.8, 550.777]
]
for p in percents:
camera = interpolate(anim, quad_ease_inout(p))
args = [
scad,
'-o', "{}/anim_{}.png".format(folder, p),
'-D', '$t={}'.format(p),
'--imgsize={}'.format(','.join(str(x) for x in render_size)),
'--camera={}'.format(','.join(str(x) for x in camera)),
'--colorscheme=Tomorrow',
'--projection=p',
'case.scad',
'-D', 'build="render"'
]
yield args
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
pool.map(thread_call, gen_args())
def call_and_log(cmd):
print(cmd)
os.system(cmd)
# openscad has no anti-aliasing so let's just do it ourselves
pngs = [arg[2] for arg in gen_args()]
pngs = ['-delay 200', pngs[0], '-delay 5'] + pngs[1:-1] + ['-delay 200', pngs[-1]]
call_and_log('bash -c "convert {pngs} -resize {img_size} \\"{folder}/render_animation.gif\\""'.format(
pngs=' '.join(pngs),
folder=folder,
img_size='x'.join(str(x) for x in final_size)))
call_and_log('bash -c "rm {folder}/anim_*.png"'.format(folder=folder))