Skip to content
Voro
  1. Geometry
  2. Render

Font

Font turns text into geometry. Type a word, pick a font, and give the letters depth and a bevel. It also builds outlines, stroke centre lines and convex collider pieces. Switch Source to SVG to work with a logo or drawing instead.

Place Font under Render in the Geometry view of the Voro menu.

  1. Enter Text on the Font page. Use \n for a new line.
  2. Pick an installed Font and Style, or leave Font empty for the bundled Roboto Flex. Font File loads a .ttf, .otf, .ttc or .otc and overrides those menus.
  3. Set Size on the Layout page, then adjust Depth and Bevel Width on Solid.
  4. Wire mesh into Geometry, give it a Material, and add the Geometry to your Scene.

For separate letters, wire glyphs into Place’s geometry input and rows into its rows input. Place spells the text with one copy per character. Edit the rows to move, turn or scale the letters independently.

For longer text, use Text DAT. A nonempty DAT replaces Text and preserves its line breaks. Pulse Reload after editing the DAT. Text itself updates as you type.

For a drawing, set Source to SVG and choose SVG File. Font reads shapes, transforms, fill rules and strokes. Size becomes the drawing’s height, centred on the origin. SVG colours do not carry over; give the mesh a Material.

Font has no inputs and six outputs.

  • mesh is the solid text or drawing, already laid out.
  • glyphs holds each distinct glyph once, centred on its pivot, for Place.
  • rows holds one point per character, with its position and the variant that picks its glyph.
  • outline gives line segments around each filled boundary. u runs from 0 to 1 around each ring.
  • skeleton follows the centre of each stroke. width gives the local stroke width; draw runs from 0 to 1 through each glyph in pen order for draw-on effects.
  • colliders gives closed convex prisms. body groups pieces by character; piece numbers them.

The solid mesh carries line, word, order and ramp attributes for looks and material selection. To colour words separately, set Geometry’s Attribute to word and add Matched Materials rows.

Layout sets spacing, wrapping and alignment. Box Width wraps the text. Fit Width sizes the whole block to its widest line, Box fits wrapped text inside Box Width and Box Height, and Lines sizes each line separately for a poster stack.

Variable changes a variable font’s Weight, Width, Slant and Optical Size. Variations accepts other axes by tag, such as GRAD=50. Ramp varies axes across characters, words or lines. Choose Wave and animate Phase to send the change through the text.

Solid shapes the mesh. Depth adds thickness; Bevel rounds or chamfers the edges. Inflate puffs the faces instead of bevelling them. Stroke makes hollow letters with a band around the outline. Depth, bevel and stroke widths are fractions of the text’s em size.

Detail controls curve accuracy and the extra outputs. Raise Tolerance for fewer points. Turn off Build Colliders and Build Skeleton when you do not use them, especially while animating font axes.

  • Font keeps the face’s kerning and ligatures. Features accepts OpenType tags such as tnum for even-width digits or -liga to disable ligatures. Fallback supplies missing characters; Direction sets the paragraph’s reading direction.
  • Font builds in the background. In TouchDesigner, the outputs can update on different frames after an edit.
  • Collider pieces span the full depth and ignore the bevel. They describe the shape; using them in physics also depends on the solver’s mesh-collider support.
  • Skeletons work best on letter strokes. A filled square gets a diagonal centre line.

Inputs

None

Outputs

  • mesh mesh
  • glyphs mesh
  • rows mesh
  • outline mesh
  • skeleton mesh
  • colliders mesh

Font

Source (Source) Menu op('font').par.Source

Font draws Text in a face; SVG reads the shapes of an SVG file.

Default:
0
Options:
Font, SVG
Text (Text) Str op('font').par.Text

What to write. \n starts a new line. Changes rebuild only the glyphs not yet seen.

Default:
voro
Text DAT (Textdat) Str op('font').par.Textdat

A DAT whose text, when it has any, replaces Text: several lines as typed. Reload reads an edited DAT.

Default:
"" (Empty String)
Font (Font) Str op('font').par.Font

An installed font family. Empty uses Roboto Flex, the face Voro ships.

Default:
"" (Empty String)
Style (Style) Str op('font').par.Style

The family's style: Regular, Medium, Bold Italic, ...

Default:
"" (Empty String)
Font File (Fontfile) Str op('font').par.Fontfile

A .ttf, .otf, .ttc or .otc file; overrides Font and Style.

Default:
"" (Empty String)
SVG File (Svgfile) Str op('font').par.Svgfile

An SVG file: paths, rects, circles, polygons; transforms, fill rules and strokes.

Default:
"" (Empty String)
Reload (Reload) Pulse op('font').par.Reload

Read the font, SVG file or Text DAT again.

Default:
None
Fallback (Fallback) Str op('font').par.Fallback

Families, separated by commas, for characters the font lacks. Empty: the system's; none: off.

Default:
"" (Empty String)
Features (Features) Str op('font').par.Features

OpenType features: ss01, tnum (even digits), smcp, -liga, ...

Default:
"" (Empty String)
Direction (Direction) Menu op('font').par.Direction

Each paragraph's base direction. Auto follows its first strong character; mixed scripts are ordered either way.

Default:
0
Options:
Auto, Left to Right, Right to Left

Layout

Size (Size) Float op('font').par.Size

The em size of text, or the height of an SVG drawing, in world units. Depth, bevel and tolerances are in these units' fractions.

Default:
1
Range:
0.0001 to 1000
Tracking (Tracking) Float op('font').par.Tracking

Extra space after each glyph, in em.

Default:
0
Range:
-1 to 2
Line Spacing (Linespacing) Float op('font').par.Linespacing

A multiple of the face's own line height.

Default:
1
Range:
0.1 to 5
Box Width (Boxwidth) Float op('font').par.Boxwidth

Wrap lines at this width, in world units. Zero: lines break only at new lines.

Default:
0
Range:
0 to 1000
Box Height (Boxheight) Float op('font').par.Boxheight

The box's height, in world units, for Fit.

Default:
0
Range:
0 to 1000
Fit (Fit) Menu op('font').par.Fit

Width: the widest line fills Box Width (and stays within Box Height). Box: the largest size whose wrapped text fits the box; Size is ignored. Lines: each line sized to fill Box Width and stacked by its ink, a poster stack; Line Spacing scales the gap; lengths in em follow Size.

Default:
0
Options:
Off, Width, Box, Lines
Align X (Alignx) Menu op('font').par.Alignx

Justify spreads the spaces of every line but a paragraph's last over the box, or the widest line. Justify All spreads every line, over its letters when it has no spaces.

Default:
1
Options:
Left, Center, Right, Justify, Justify All
Align Y (Aligny) Menu op('font').par.Aligny
Default:
2
Options:
Baseline, Top, Center, Bottom
Pivot (Pivot) Menu op('font').par.Pivot

Where each glyph's row sits and what Glyphs is centred on: its ink centre or its pen origin on the baseline.

Default:
0
Options:
Center, Origin

Variable

Weight (Weight) Float op('font').par.Weight

The wght axis of a variable font. Zero: the face's own.

Default:
0
Range:
0 to 1000
Width (Axiswidth) Float op('font').par.Axiswidth

The wdth axis, percent of normal. Zero: the face's own.

Default:
0
Range:
0 to 200
Slant (Slant) Float op('font').par.Slant

The slnt axis, degrees.

Default:
0
Range:
-20 to 20
Optical Size (Opticalsize) Float op('font').par.Opticalsize

The opsz axis. Zero: the face's own.

Default:
0
Range:
0 to 144
Variations (Variations) Str op('font').par.Variations

Other axes by tag: GRAD=50 XTRA=400. The font's axes are listed in status.

Default:
"" (Empty String)
Ramp (Ramp) Menu op('font').par.Ramp

Move the axes toward the Ramp values across characters, words or lines.

Default:
0
Options:
Off, Characters, Words, Lines
Ramp Shape (Rampshape) Menu op('font').par.Rampshape

Linear runs start to end once. Wave rises and falls; animate Phase to make it travel.

Default:
0
Options:
Linear, Wave
Ramp Weight (Rampweight) Float op('font').par.Rampweight

Weight at the ramp's far end. Zero: weight does not ramp.

Default:
0
Range:
0 to 1000
Ramp Width (Rampwidth) Float op('font').par.Rampwidth

Width at the ramp's far end. Zero: width does not ramp.

Default:
0
Range:
0 to 200
Ramp Slant (Rampslant) Float op('font').par.Rampslant

Slant at the ramp's far end. Zero: slant does not ramp.

Default:
0
Range:
-20 to 20
Ramp Variations (Rampvariations) Str op('font').par.Rampvariations

Other axes at the ramp's far end, by tag.

Default:
"" (Empty String)
Frequency (Rampfrequency) Float op('font').par.Rampfrequency

Wave: cycles across the text.

Default:
1
Range:
0 to 10
Phase (Rampphase) Float op('font').par.Rampphase

Wave: offset in cycles.

Default:
0
Range:
-10 to 10

Solid

Depth (Depth) Float op('font').par.Depth

Front to back, bevels included, in em. Zero gives a flat double-sided face.

Default:
0.2
Range:
0 to 10
Bevel Width (Bevelwidth) Float op('font').par.Bevelwidth

How far the face is inset from the outline, in em. Limited per point to under half the stroke.

Default:
0.02
Range:
0 to 0.5
Bevel Depth (Beveldepth) Float op('font').par.Beveldepth

How far the bevel reaches along the depth on each side, in em.

Default:
0.02
Range:
0 to 1
Bevel Segments (Bevelsegments) Int op('font').par.Bevelsegments
Default:
3
Range:
1 to 16
Bevel Profile (Bevelprofile) Menu op('font').par.Bevelprofile

Round is a quarter circle, smooth into the face and the side. Chamfer is one flat cut.

Default:
0
Options:
Round, Chamfer
Inflate (Inflate) Float op('font').par.Inflate

Puff the faces into rounded pillows this high, in em. Replaces the bevel.

Default:
0
Range:
0 to 2
Inflate Radius (Inflateradius) Float op('font').par.Inflateradius

Distance from the edge at which the puff is full, in em. Zero: the shape's widest point.

Default:
0
Range:
0 to 2
Smooth Angle (Smoothangle) Float op('font').par.Smoothangle

Side-wall corners sharper than this keep a crisp edge.

Default:
30
Range:
0 to 180
Stroke (Stroke) Float op('font').par.Stroke

Outline the letters with a band this wide, in em, instead of filling them. Zero: filled.

Default:
0
Range:
0 to 0.5
Stroke Align (Strokealign) Menu op('font').par.Strokealign

The band centred on the outline, inside it or outside it.

Default:
0
Options:
Center, Inside, Outside
Stroke Join (Strokejoin) Menu op('font').par.Strokejoin
Default:
0
Options:
Round, Miter
Front (Front) Toggle op('font').par.Front
Default:
On
Options:
Off, On
Back (Back) Toggle op('font').par.Back
Default:
On
Options:
Off, On

Detail

Tolerance (Tolerance) Float op('font').par.Tolerance

Curve accuracy: the largest gap between curve and mesh, in em.

Default:
0.001
Range:
0.00001 to 0.05
Collider Tolerance (Collidertolerance) Float op('font').par.Collidertolerance

How far a collider piece may stand off the shape, in em. Zero gives exact convex pieces, more of them.

Default:
0.01
Range:
0 to 0.5
Skeleton Prune (Skeletonprune) Float op('font').par.Skeletonprune

Drops skeleton spurs shorter than this many stroke widths.

Default:
1
Range:
0 to 10
Build Colliders (Buildcolliders) Toggle op('font').par.Buildcolliders

Off skips the convex pieces: faster rebuilds while axes animate.

Default:
On
Options:
Off, On
Build Skeleton (Buildskeleton) Toggle op('font').par.Buildskeleton

Off skips the stroke skeleton: faster rebuilds while axes animate.

Default:
On
Options:
Off, On