Blender
Behind the scenes, Coldtype uses the Skia library to rasterize two-dimensional vectors. But what if we want to rasterize three-dimensional graphics? One option is to use Blender.
Because Blender has an incredible Python API, it’s not too difficult to use it programmatically — i.e. to write a normal Coldtype script, mark a few things (with metadata specific to Blender), and then let Blender & Coldtype take care of the translation to three dimensions. Here’s an example:
from coldtype.blender import *
fnt = Font.Find("SwearCilatiVariable")
@b3d_animation(timeline=60)
def varfont(f):
return (Glyphwise("Vari", lambda g:
Style(fnt, 325,
opsz=f.adj(-g.i*5).e("seio", 1, rng=(0.98, 0)),
wght=f.adj(-g.i*15).e("seio", 1, rng=(0.98, 0))
))
.align(f.a.r)
.mapv(lambda i, p: p
.ch(b3d(lambda bp: bp
.extrude(f.adj(-i*5)
.e("ceio", 1, rng=(0.015, 3)))))))
Running Code in Blender
First off, your virtual environment needs to be built with the same version of Python as the Blender version you’re targeting.
Behind the scenes, Coldtype uses a tool called b3denv
to communicate with Blender, and b3denv
— installed as a dependency of Coldtype — makes it easy to create a virtual environment using the Python bundled with Blender.
b3denv python -m venv benv
Now you’ll have a blender-specific virtual environment named benv
, which you can activate the usual way, source benv/scripts/activate
on Mac.
To get a Blender window to show up, all you need to do is use the @b3d_animation
decorator in place of the standard @animation decorator, and add -bw 1
to the command-line invocation. Or, if you want a set of sensible CLI defaults, try -p b3d
instead, which stands for --profile=b3d
and sets -bw 1
as part of some other settings in the b3d profile.
So, to use an example from the Coldtype repo, you could save the code from above and run:
coldtype examples/blender/varfont.py -p b3d
This should launch both a standard Coldtype window (with a 2D Skia renderer) and a Blender GUI window, which should automatically render the same thing as the 2D window, except in 3D. Put another way: you do not need to open Blender yourself, since Coldtype launches it as a background process (necessary to connect the live-code-reloading part of Coldtype to Blender). To quit both Coldtype and Blender, just hit ctrl-c in the terminal.
What’s different in Blender is that the contents of the scene aren’t re-created from scratch every time you render; instead, you annotate specific elements in your returned result, then those annotated results are displayed in Blender, as persistent objects. This means you can use Blender in a hybrid fashion, creating objects using the GUI, saving the file, and then re-saving your Coldtype source file for automatic updates in Blender itself.
If you’d like to skip seeing the 2D Coldtype window, you can use --b3dlo
instead.