WebToe
GitHub Open editor
Docs menu · TouchDesigner parity Documentation

WebToe Documentation Engine

TouchDesigner parity

What "toward TouchDesigner" means for a browser engine, how it is measured on 60 real projects, where WebToe stands, and what comes next.

WebToe aims at creative-semantics parity with TouchDesigner (networks, cooking, operators, expressions, rendering, interaction), not native-device parity. Progress is measured, not estimated: on a corpus of real projects, and against the official operator inventory.

How it is measured

The corpus is 60 real TouchDesigner projects from a daily generative-art practice, 2022–2026, sampled across eras from 199 available: 28,698 nodes, expanded with the official toeexpand and counted by operator type, parameter mode and expression. The analyzer lives outside this repository because it reads private files; only aggregate numbers are published.

The family mix of the corpus: TOP 7,536 · DAT 6,332 · COMP 5,417 · POP 3,148 · SOP 2,942 · CHOP 2,663 · MAT 660. 13,708 parameters carry live Python expressions, plus about 7,000 more in flagged expression modes.

| Step | What shipped | Corpus nodes runnable | |---|---|--:| | v1 | first release: core TOPs and CHOPs, importer | 32.3% | | Cycle 1 | expressions v2 (parent(), .par, Python conditionals), routing TOPs (switch, select, math, reorder, flip), CHOP switch/speed/parameter, DAT tables, parameter-mode bitfield | 47.1% | | R3 | the 3D pipeline: SOPs, MATs, Geometry/Camera/Light COMPs, Render TOP, instancing | 62.3% |

On a 213-node reference project the same steps took runnable nodes from 56 to 71 to 88. After R3, a 2022 sketch of a DNA helix went from 55% to 71% runnable and another from 65% to 74%; mapping POPs onto the SOP implementations took a POP-heavy 2025 project from 43% to 73%.

Operators against the official inventory

FamilyOfficialWebToeNote
TOP~14728
CHOP17214
SOP11521
MAT137
COMP455
DAT776
POP1060imported POPs run their geometry through the SOP implementations
Total~67581

The official counts come from the operator categories on docs.derivative.ca (crawled 2026-06-11). Not every official operator should exist in a browser; each one falls into one of four classes:

  • Portable: pure compute or render semantics (most TOPs, CHOPs, SOPs, POPs, MATs). Implementable as they are.
  • Web-equivalent: device or network I/O with a browser counterpart: Video Device In → getUserMedia (shipped as camera in), MIDI In → Web MIDI, Audio Device In/Out → Web Audio, Screen Grab → getDisplayMedia.
  • Web-equivalent through a local bridge: I/O with no browser primitive gets a small local process the user runs, the pattern of the import bridge. NDI in/out shipped this way; Art-Net, Syphon/Spout capture and serial would follow it.
  • Native-only, declared out of scope: DirectX/SDI/ST 2110, vendor SDKs (Kinect, ZED, Oculus), C++ operators, Notch and Substance hosts.

Fidelity: the same numbers as TouchDesigner

Op counts say what exists; fidelity says whether an imported network renders the same pixels and moves at the same pace. The behaviour below was measured black-box against TouchDesigner 2025 (known inputs in, outputs read back) in the author's own production web port of two TouchDesigner shows, and ported here by the author. CPU references for every formula are tested, and the real shaders are compared with them in Chrome.

OperatorWhat matches TouchDesignerMeasured tolerance
LevelTouchDesigner's order of operations, black level, ranges, low/high, post page; opacity scales RGB and alpha≤ 1e-3 (14 × 2 cases)
EdgeTouchDesigner's formula (√strength, black level, offset), Rec.709 luminance, edge over input≤ 1.2e-7 (65 cases)
Monochrome, LookupRec.709 luminance, TouchDesigner's channel menusexact formula
Rampwrapping keys (up to 32), phase/period rules, extend, interpolation, fit aspectmedian ≤ 1e-5 (35 cases); antialias not reproduced
Blurfull-width size, kernel integrated per texel, single-tap preshrink≤ 7.5e-7 (52 images)
NoiseGustavson Perlin/simplex 2D–4D, TouchDesigner's coordinates, transform page, seeds and octave count≤ 3.7e-3, 99.9% ≤ 6e-4
Compositepremultiplied, all 46 operations, transform page37 ops ≤ 1e-7, 9 fitted ≤ 3e-5
Cook clockfixed-rate steps at the project cook rate; per-step constants behave as in TouchDesigner on any displaydeterministic, tested
Lag, Speed, Feedbacklag = time to 90% (a = 1 − exp(−dt·ln10/lag)); speed outputs the sum before this step; feedback returns its Target TOP's previous steptested

Both GPU backends render these shaders identically within 1/255. The full table, with what is inferred or approximate, is in docs/TD-PARITY.md.

Engine concepts

ConceptStatus in WebToe
3D: geometry, materials, cameras, lights, Render TOP, instancingshipped (R3) on WebGL2; WebGPU scene pass pending
Multi-sample CHOPs and time slicingnot yet: channels are single-sample at control rate. The prerequisite for audio, trail, resample and wave
Audioplanned on Web Audio (AudioWorklet ↔ multi-sample CHOPs, AnalyserNode for spectra)
GLSL TOPspecified: TouchDesigner's injected contract (headerless GLSL, sTD2DInputs, vUV, uTD2DInfos, TDOutputSwizzle) shimmed onto GLSL ES 3.00. Used by 32 of the 60 corpus projects
POPsimport and run their geometry through the SOP implementations; dynamics (forces, solvers) are stubs. Native POPs are planned on WebGPU compute
Parameterspages and expressions shipped; pulse parameters, binding and custom COMP parameters to come
Panelsbutton, slider and container panels planned as a DOM overlay
Replicatorplanned with table-driven templates; COMP:replicator appears in all 60 corpus projects
Pythonpermanent boundary: imported Python is kept and shown, never executed. The planned answer is an opt-in JavaScript callback DAT with a TouchDesigner-shaped API

The loop

  1. Measure: run the corpus analyzer; read the coverage and the histogram of stubbed types.
  2. Pick: the highest projects affected × low effort, respecting prerequisites (multi-sample before audio, 3D before render-dependent TOPs).
  3. Implement on the public contracts: registerOp, shaders for both backends, importer tables, honest stubs for the rest.
  4. Verify: unit tests, fixture round-trips, and real sketches in the browser. Every bug a real project exposes gets a regression test.
  5. Record the new number in docs/ROADMAP.md, then measure again.

Next

In order: multi-sample CHOPs and time slicing → GLSL TOP → POPs on WebGPU compute → WebGPU 3D scene pass → replicator, tables and panels. The full reasoning and measured gates are in docs/ROADMAP.md and docs/TD-PARITY.md.

Edit this page on GitHub