Files
MobileGL/intro-video/paper

MobileGL intro — paper-cutout video

A ~4:50 explainer of what MobileGL is and how it works, in a handmade paper-cutout / origami style: hand-cut shapes with paper grain and layered shadows, stop-motion "boil" at 12 fps, torn-paper wipes, a procedural ukulele-and-marimba soundtrack, burned-in captions plus .srt files. English and Chinese versions are rendered from the same code.

Everything is plain Python on the CPU (Pillow + numpy + scipy), deterministic, and rendered in parallel worker processes.

Files

file what
paper.py the paper engine: palette, fonts and mixed Latin/CJK text runs, hand-cut polygon roughening, periodic paper grain, sprites with inner/drop shadows, stop-motion jitter, torn-paper wipes, translation lookup (T())
video.py the twelve scenes (title, the problem, meet MobileGL, why it works, frontend, shaders, records, backends, anywhere, perks, platforms, outro), their captions, and the stills / meta / render entry points
music.py the soundtrack: Karplus-Strong ukulele, marimba, bass and light percussion (120 BPM, I-V-vi-IV in C), plus paper swooshes on wipes; reads the scene timings written by video.py meta
zh.py the Chinese strings (MGL_LANG=zh)
cover.py a 16:9 thumbnail whose centred 4:3 crop keeps everything important
fetch_fonts.py downloads the fonts into fonts/

Setup

pip install -r requirements.txt
python fetch_fonts.py        # Fredoka, Patrick Hand, ZCOOL KuaiLe, LXGW WenKai, Cascadia Mono (all SIL OFL)

ffmpeg must be on PATH.

Render

python video.py stills 3.0 45.5         # spot-check frames -> out/still_*.png
python video.py render ffmpeg           # out/video_noaudio.mp4 + out/mobilegl_intro.json/.srt (scene timings)
python music.py out/mobilegl_intro.json out/music.wav
ffmpeg -i out/video_noaudio.mp4 -i out/music.wav -c:v copy -c:a aac -b:a 192k -shortest out/mobilegl_intro.mp4

Chinese version: set MGL_LANG=zh for the video.py and cover.py steps; output goes to out_zh/ (video_noaudio_zh.mp4, mobilegl_intro_zh.srt). The scene timings are identical, so the same music.wav is used:

MGL_LANG=zh python video.py render ffmpeg
ffmpeg -i out_zh/video_noaudio_zh.mp4 -i out/music.wav -c:v copy -c:a aac -b:a 192k -shortest out_zh/mobilegl_intro_zh.mp4

Cover: python cover.py writes out/cover.png and a 1280×720 JPEG; --guides also writes a preview with the 4:3 crop lines and the cropped image.

The full render uses every core but two; expect a few minutes per language.