Shapes
A character is a drawing: one body outline, plus optional extras such as ears, leaves and antennae. Click any of them below to enlarge it.
Round
Rounded rectangle
Polygon
Petal
Garden
Fruit
Figure
Sea
Critter
People
The default shape is mochi. Under each heading is one family, in the order of SHAPE_FAMILIES in the engine. A character is filed in exactly one family, so when the engine gains one, this page grows with it.
What a drawing holds
Each character has an entry in the engine's shapes/characters/, one file per family (round.ts, critter.ts, …):
- The body: one closed outline. An SVG path that was good as drawn goes in as is; a dense outline is sampled into a ring of points and rebuilt with a Catmull-Rom spline.
- Where the face goes: when the body's mass is not at the centre of its bounding box (a character with ears sits low), the entry says where to put the face.
- Parts (optional): ears, leaves, antennae. See the next section.
A shape is derived the first time it is used: the outline is scaled to 228.44 units on its longer side and re-centred. Registering a shape gets you far more than an outline.
| shape | radius | beltRadius | tiltScale | face.eye | parts |
|---|---|---|---|---|---|
mochi | 118.1 | 114.2 | 1.00 | 0.87 | — |
circle | 114.2 | 114.2 | 1.00 | 1.00 | — |
blob | 125.5 | 112.1 | 1.00 | 0.87 | — |
pebble | 115.9 | 114.2 | 0.88 | 0.89 | — |
egg | 114.2 | 103.9 | 1.00 | 1.00 | — |
bun | 121.2 | 114.2 | 1.00 | 0.85 | 3 |
tofu | 129.5 | 114.2 | 0.15 | 0.86 | — |
pill | 114.2 | 114.2 | 0.36 | 0.85 | — |
hex | 114.4 | 114.1 | 0.98 | 1.00 | — |
onigiri | 136.4 | 114.2 | 0.16 | 0.85 | — |
gem | 119.1 | 114.2 | 1.00 | 0.85 | 1 |
cloud | 120.9 | 113.9 | 0.15 | 0.85 | — |
drop | 115.3 | 93.7 | 1.00 | 0.85 | — |
leaf | 149.3 | 103.5 | 1.00 | 0.85 | 1 |
flower | 114.2 | 114.1 | 1.00 | 0.94 | — |
clover | 130.5 | 102.8 | 0.32 | 0.85 | 1 |
sprout | 127.4 | 109.8 | 1.00 | 0.85 | 2 |
mushroom | 115.2 | 114.2 | 0.99 | 0.85 | — |
acorn | 110.3 | 114.2 | 1.00 | 0.85 | 3 |
cactus | 110.8 | 114.2 | 0.28 | 0.85 | 2 |
pear | 114.2 | 80.7 | 1.00 | 0.85 | 2 |
apple | 114.4 | 114.2 | 1.00 | 0.85 | 2 |
strawberry | 115.4 | 114.2 | 1.00 | 0.85 | 10 |
cherry | 130.5 | 114.2 | 1.00 | 0.86 | 4 |
star | 126.6 | 114.2 | 0.15 | 0.85 | — |
heart | 126.1 | 114.2 | 1.00 | 0.85 | — |
flame | 114.7 | 86.2 | 1.00 | 0.85 | — |
bell | 138.7 | 114.1 | 0.15 | 0.85 | 1 |
ghost | 151.2 | 110.7 | 0.17 | 1.00 | — |
bot | 145.4 | 108.5 | 0.15 | 0.85 | 2 |
crescent | 125.3 | 110.7 | 1.00 | 0.85 | — |
boba | 120.5 | 94.3 | 0.24 | 0.85 | 6 |
fish | 114.2 | 114.2 | 1.00 | 0.92 | 1 |
octopus | 100.5 | 114.2 | 1.00 | 0.85 | 4 |
cat | 137.8 | 114.2 | 1.00 | 0.85 | — |
bunny | 124.4 | 103.1 | 0.99 | 0.85 | 4 |
bear | 123.4 | 114.2 | 1.00 | 0.86 | 4 |
chick | 100.6 | 114.2 | 1.00 | 0.88 | 6 |
penguin | 102.3 | 114.2 | 1.00 | 0.88 | 3 |
pig | 119.1 | 114.2 | 1.00 | 0.89 | 3 |
fox | 124.9 | 114.2 | 0.99 | 0.85 | 7 |
bob | 102.9 | 114.2 | 1.00 | 0.85 | 1 |
topknot | 114.2 | 88.0 | 1.00 | 0.85 | 2 |
spiky | 114.2 | 92.5 | 1.00 | 0.85 | 1 |
curly | 103.9 | 114.2 | 1.00 | 0.85 | 1 |
twinbuns | 87.4 | 114.2 | 1.00 | 0.85 | 3 |
Parts
Ears, leaves and antennae stay out of the body's main ring. ring (96 points) is the only basis for morphing, face fitting, belts and spanAt; the extras live in ShapeDef.parts and share the body's normalisation (the box is the union of body and parts, the area is the body's alone), so a part never pushes into the margin the animation needs.
Parts ride the body's pose and never morph. When the shape changes, the old parts fade out and the new ones fade in, so an ear does not vanish halfway through a morph.
Each part is painted one of four ways:
hair also steers the face fitter: no eye goes where the bangs are, so a person's face always sits below the hairline.
Every vector variant draws parts: outline and glass merge them into the body outline and stroke it once, with no seam; the sticker border and the paper hard shadow wrap them too. The pixel series rasterises them onto the same grid.
defineShape takes a parts option too, with the same four tones. See Custom shapes.
Why flat-bottomed shapes barely tilt
A flat-bottomed shape looks wrong when it tips — the base lifts and the sense of weight goes with it. So tiltScale is measured from the outline, not configured: tofu, cloud, star, bell and bot come out at 0.15 and rock rather than topple; ghost and onigiri land just above, and mochi and blob come out at 1 and tilt freely; no shape carries a hand-set tilt coefficient. How it is measured: Shape derivation.
Adding your own
Register a function that returns points with defineShape, and everything in the table above is derived for you. The full walkthrough is in Custom shapes.
Next
- Shape derivation — from outline to face position
- Custom shapes — register your own outline
- Cast — the named character for every shape