fork of Panim for macOS
  • C 98%
  • C++ 1.7%
  • TeX 0.3%
Find a file
2026-03-24 12:39:05 +01:00
assets Add the tsoding animation 2025-11-24 19:45:58 +07:00
panim modify to compile on macos 2026-03-24 12:36:41 +01:00
plugs modify to compile on macos 2026-03-24 12:36:41 +01:00
thirdparty modify to compile on macos 2026-03-24 12:36:41 +01:00
.gitignore modify to compile on macos 2026-03-24 12:36:41 +01:00
nob.c modify to compile on macos 2026-03-24 12:36:41 +01:00
nob.h Upgrade nob.h v1.9.0 -> v1.25.0 2025-11-03 10:15:55 +07:00
README.md better wording 2026-03-24 12:39:05 +01:00
TODO.md Update TODO 2024-05-13 21:32:34 +07:00

Note

This is a fork of tsoding's Panim animation engine modified to compile and run on macOS.

Panim

Programming Animation Engine. Heavily inspired by (but not based on) Manim

Quick Start

$ cc -o nob nob.c
$ ./nob
$ ./build/panim ./build/libplug.so

Architecture

The whole engine consists of two parts:

  1. panim executable - the engine itself
  2. the animation dynamic library (a.k.a. libplug.so) that you as the user of Panim develops

Panim the Executable enables you to control your animation: pause it, replay it, and, most importantly, render it into the final video with FFmpeg. It also allows you to dynamically reload the animation library without restarting the whole Engine which improves the feedback loop during the development of the animation.

Assets vs State

While developing your animation dynamic library it's good to separate your things into 2 lifetimes:

  1. Assets - things that never change throughout the animation, but reloaded when the libplug.so is reloaded
  2. State - things that survive the libplug.so reload, but are reset on plug_reset().

You can safely assume that string literals reside in the Assets lifetime. So if a string literal cross a "lifetime boundary" from Asset to State it has to be copied to an appropriet region of memory. Something like an arena works well here.