TouchDesigner

Making an Output

Build a TouchDesigner output for your install — fixture wiring, geometry, pixel-mapping, and how Lightpath consumes it.

Outputs are the core building block in Lightpath. An output is an individually addressable part of your installation — a video wall, an LED strip, a projector, a screen, anything you want to drive content to. Each output is a .tox file living in your project's outputs/ directory; Lightpath loads it into TouchDesigner at runtime and routes content to it from the UI.

Adding an output

You need to be logged in as an admin to access this page.

  1. Go to Configure → Outputs in the Lightpath UI.
  2. Click + New Output in the top left.
  3. Choose a name and an icon. To use a custom icon, upload a .png file into your project's outputs/ folder — it will appear in the Custom icons selector. We recommend a simple white-on-transparent outline of the output's shape.
  4. Choose whether to build from one of the bundled templates or from an existing .tox file.

Templates

Lightpath ships with five output templates. Each gives you a working .tox to start from — extend or replace anything inside.

Driving fixtures and surfaces

  • LED — Addressable fixtures driven from 3D geometry. You give it a point per LED; it ranks them into wiring order, addresses them as fixtures, and renders the look at each point's real position. This is the template that runs shader sources, so a chase can follow the cable and a sweep can cross the venue in metres. It sends its fixtures as Art-Net itself: set Network Address and Local Address on the output, and the addressing — net, subnet, universe, channel — on its fixtures.
  • Surface — A 3D surface: a screen, a monitor, a projection surface. The camera fits itself to the geometry, so the image frames the surface exactly however you move or resize it, and you never set a camera by hand. Use it for a screen that isn't a flat rectangle facing front, or for any surface whose pixels you want addressed in 3D. It opens its own window on a monitor, with the same window settings as Window.

Showing and moving textures

  • Window — The look, full-frame, in a window on a monitor: a projector, an attached display, or an LED screen driven over HDMI or DisplayPort. There is no geometry. Its Config page chooses the Monitor, sizes the window to the whole display (Fill) or to the output's resolution, and flips or rotates the image for how the display is mounted.
  • Send — Send the texture out via Spout or NDI for another piece of software to consume. Useful when integrating Lightpath with projection mapping software.
  • Receive — Receive a texture from another piece of software via Spout or NDI. Receive-type outputs show a simplified look editor since content isn't being generated inside Lightpath. You can automatically send OSC or HTTP when content is selected to switch the source software in lockstep — see Devices for the bidirectional binding setup.

LED and Surface arrive with no geometry — their preview is empty until you set Geometry to the points or surface this output drives.

These templates are starting points. You can do anything you want inside the output component, leveraging the open-ended power of TouchDesigner.

Which sources an output is offered

Each output's settings on the Outputs page have a Source Types section with two toggles, Offer 1D sources and Offer 3D sources. They control which shader sources appear in the look editor for this output.

A 1D source travels along the order the cable was run, so it means nothing on a screen and renders as one flat colour — turn it off there. A 3D source reads each pixel's real position, which needs this output's world space set to be meaningful. Both are on by default, and sources that declare no entry point are always offered.

How your output receives content

Lightpath can hand an output its content two ways, and it decides which by looking at what your component exposes. Both are supported permanently — output .tox files are yours to author and upload, so neither is going away.

A texture input

Add an In TOP and Lightpath renders the look to a texture and wires it to that input. Your component receives a finished frame, and needs nothing else from Lightpath — any TOP network works.

This is the simple way, and the right one when your output is a destination for an image — an NDI or Spout sender, a capture, a network you already have. The Send and Receive templates work this way.

The trade is worth knowing: the look is flattened to an image before it reaches you, so a source that reads position is sampled from that image rather than evaluated at each fixture, and Lightpath keeps a renderer for your output that cooks every frame.

A Material parameter

Add a MAT parameter named Material on a page named Managed, and Lightpath points it at the active look's material. Lightpath renders nothing for you on this path: your output draws the material itself, so the look is evaluated at each point — at every LED, at every pixel of a surface. That is what lets a source read a fixture's real position in metres or its place in the wiring order, so 1D and 3D shader sources do something meaningful.

The material only draws correctly on geometry built for it. It reads four attributes from the points it is drawn on: Worldpos (the point's position in the room), Tex (its UV), Layout (its place in the wiring order) and Pixelcount. Assign it to ordinary geometry and it still compiles, but every attribute it can't find reads as zero, so a 3D or 1D source renders as one flat colour.

There are three ways to put a material to use, and each template is a working example. Start from the one that matches rather than wiring the material to geometry yourself:

Your outputStart fromWhat it does
Points — fixtures, pixels in spaceLEDSetup_Geometry and Calculate_UVs write the attributes onto a POP of fixture points. Apply_Content lays each point into one texel and renders the material, and Output_DMX reads the result back and sends it.
A 3D surfaceSurfaceCalculate_UVs writes the attributes onto the mesh. Render_Content frames it with a camera fit or a UV unwrap and renders it to a texture.
A flat frameWindowShader_To_TOP renders the material full-frame at the output's resolution. Past that it is an ordinary texture.

If your component has both, the Material parameter wins and the texture input is left unconnected.

Custom parameters

Outputs follow the standard Lightpath custom-parameter contract — any parameter on a page named Look is exposed per-look (e.g. LED pixel-mapping method, input texture fit, per-look effects); any parameter on a page named Config is exposed at the install level (e.g. target network address for DMX, the monitor a Window output opens on, Spout sender name for a Send output).

Outputs can also expose a Status page — read-only parameters that stream live to the TouchDesigner device on the Integrations page and feed the Alerts system — and a Managed page for the params Lightpath drives rather than the operator. Add a Thumbnail Toggle on Managed if your output template should render differently when Lightpath captures its preview thumbnail.

A Feed page is for viewing controls. Its parameters appear beside the video when an operator expands this output's previs — which camera the previs looks through, framing, an overlay toggle. Keep install-time setup on Config and viewing controls on Feed; see TouchDesigner Overview → Feed parameters.

See TouchDesigner Overview → Custom parameters for the full pattern.

Resolution

If your output renders at a pixel size — a window, a texture it sends on — add a Resolution parameter to its Managed page, either one Int parameter with two values or a Width/Height pair. Lightpath keeps it equal to the Resolution set for the output on the Outputs page, so the operator sets it in one place and every part of Lightpath agrees on it. Don't put it on Config: the Outputs page already has a Resolution field, and a second one there would let the two disagree.

A Resolution parameter on any page other than Managed belongs to your template, and Lightpath leaves it alone.

The Enable toggle

Every output should expose an Enable toggle on its Config page. Lightpath uses it to mark whether a given copy of your output is the live one.

Lightpath sometimes runs more than one copy of an output at the same time. When you edit a look without pushing it live, a separate copy renders the preview; short-lived copies are also spun up to capture thumbnails. Only the live copy should reach the real world — if a preview or thumbnail copy keeps sending, it fights your primary output: two copies driving the same DMX universe, a second window opening, or a duplicate NDI stream going out.

Enable is how those copies are told apart — Lightpath turns it off on preview and thumbnail copies and leaves it on for the live one. It doesn't stop anything on its own, though — it's up to you to wire it up. Make anything in your output that reaches the real world (lighting data, a window, an NDI send) act only while Enable is on.

The simplest way is an expression on that operator's active parameter. For example, on a DMX Out's Active parameter:

parent().par.Enable

Now it only transmits while the output is enabled. Do the same for anything else in the output that drives hardware or the network.

Windows are the same story. If your output opens a window — a projector or screen feed, say — open it from an OnLoad lifecycle hook and only while Enable is on. Otherwise every preview and thumbnail copy pops its own window on top of the live one. The built-in Window and Surface templates both follow this pattern.

Accessing project files

3D models, fixture XMLs, lookup tables, custom icons — store them in your project folder and reference them via the project path shortcut. See TouchDesigner Overview → Accessing project files.

On this page