Close

Release Notes

Current Official Build 2025.31550 Download - Oct 30 2025 - Release Notes

See our 2025 Official Announcement for an overview of new features.

Known Issues

  • When using HDR Window Pixel Formats (see Color Space), displaying HDR content as TOP backdrop can result in parts of the network editor being hard to view due to bad alpha blending. Turning off 'Display > Backdrop TOPs' in the network's right-clickmenu avoids this issue.

Please report all issues to the Bugs Forum.

Backward Compatibility

We try to make upgrading to new TouchDesigner branches as painless as possible, but sometimes changes are made that are not compatible with the features in older builds. Please review all Backward Compatibility Issues as preparation for moving your projects to 2025.30000.


Build 2025.31550 Oct 30, 2025

Release Highlights

Point Operators - POPs

Introduction to POPs - 3D Geometry on the GPU

Introducing POPs, aka Point Operators! POPs are a new family of operators that run on the GPU and create or modify 3D data. Points are the building blocks of polygons, lines, line strips, spline curves, point clouds, particle systems, any 3D geometrical shape and any form of data points.

Every POP contains a set of points with a set of Point Attributes. The most common attribute is Position (P), the position in 3D space of the points. The POP may have other attributes like Color (Color - with a red, green, blue and alpha component) and Normal (N - a direction vector with 3 components). The points can also have extra user-defined attributes or can get attributes automatically-generated from certain POP operators.

To learn about POPs, please visit our Learning About POPs article here for an in-depth look at what's behind this exciting new OP family. Download the POPs Examples Package to learn and try out a bunch of examples.

Import/Export Geometry and Points

We have many ways to get your data into POPs. The File In POP loads simple geometry in .obj and .classic/.bhclassic formats and the Point File In POP handles common point cloud file formats (.obj, .ply, .fits, .exr, .xyz, .pts, .csv, .txt). You can also use the FBX COMP, USD COMP, and new Alembic In POP to bring those formats into POPs, including any animation in the files.

The new File Out POP allows you to write out POP contents either as a single file or as file sequences! This includes point, geometry and scene file types. You can record a sequence of .obj or .exr files by setting the 'Type' parameter to 'File Sequence'. Some file formats have fixed attributes that the File Out POP looks for such as the .spz and .obj file formats, while other files types allow arbitrary attribute writing of attributes such as .exr and .ply formats.

Geometry and POP node viewers)

The Geometry Viewer and POP Node Viewers have a number of new display options added for working with POPs and geometry in general. These options can be found in the viewer's right-click menu.

  • POP Points - Display an overlay dot for each point in the scene (POPs only), keyboard shortcut 'd' to toggle this on and off.
  • Display Attribute Text - Display attribute data or indices as text overlayed on the geometry (POPs only).
  • Display Attribute Vector - Display multi-dimension attribute data as vector arrows overlayed on the geometry (POPs only). If the selected attribute is less than 3 dimensions, the missing dimensions will be assumed as 0. Attribute values are normalized so that vectors with smaller magnitudes will appear as smaller arrows.
  • Display Attribute Dots - Display single dimension attributes as a colored dot with a ring of red relative to the magnitude of the value. The smallest value in the scene appears as a solid blue dot and the largest value as a solid red dot.
  • Display Attribute Colors - Display multi-dimension attribute data as a colored dot (POPs only). The attribute is not normalized to preserve the color value which means attributes greater than one will appear solid white on most monitors.
  • The Display Options dialog also has new options on the 'POP Overlays' page. Here you'll now find settings for Scale Attribute Overlays, Scale in Screen Space, Thin Attribute Range, and Thin Attribute Percentage.
  • In the 'Grids & Overlays' submenu, you'll find a collection of helpful new overlays, such as bounding box, axis and plane bounding projections, axis scale, and a toggle for grid.


Hardware Device Support

New DMX Workflows with POPs

Data can also flow from POPs directly to other operator families, like Channel Operators (CHOPs) and then on to lasers, DMX or other external systems. While DMX was previously handled in TouchDesigner exclusively by the DMX In and Out CHOPs, we have introduced a set of new DMX POP operators enabling powerful new workflows for lighting, LEDs and anything operating on DMX.

First we introduce the DMX Fixture POP which lets you setup all the channels in your fixture's profile. Each point and primitive in the DMX Fixture POP's input will represent a copy of this fixture, inherently giving you a position in 3D space for every fixture in your setup. From here, the DMX Fixture POP will construct all the channels and universes required to address all your fixtures. Second, the new DMX Out POP takes one or more DMX Fixture POPs, merges all the universes and sends the data out to your DMX, Art-Net, sACN, KiNET, or FTDI devices. A third new operator, the DMX Map DAT, is useful for visualizing DMX universe and channel layouts and can be helpful for troubleshooting channel conflicts between DMX fixtures. You'll find a DMX Map DAT docked to every DMX Out POP ready to help.

Last but not least, a new Pan Tilt CHOP has been introduced to make it easier to control lighting fixture's pan and tilt controls directly, something that previously wasn't trivial using raw rotational values in CHOPs.


Laser Upgrades
  • Laser CHOP - For this release the laser point generation process was overhauled, with improvements to blanking calculations, image sharpness/uniformity, point repeating, general stability, and taking input directly from POPs. The Laser CHOP was developed with the help of LaserAnimation Sollinger who guided us in speccing and implementing the necessary parameters, especially in regards of the blanking timing settings.
    • The new Laser CHOP introduces the notion of Corner Points. Previously, everything could've been considered a "Corner Point", but now with the use of input attributes/channels (LasCorner and lascorner), corner points can be selected. In contrast, all non-Corner Points are considered Guide Points. Corner Points are repeatable to enable sharper and more defined lines. Guide Points are never repeated and only serve to guide the laser along a desired path, while at the same time not consuming extra points from the laser device's point buffer because they do not follow the same repeating rules as Corner Points.
    • Additionally, there are extra input attributes/channels that allow for extra per-Corner Point control on point repeating: "LasCornerHoldAdd" (SOP/POP) or "lascornerholdadd" (CHOP) and "LasCornerHoldLookupFactor" (SOP/POP) or "lascornerholdlookupfactor" (CHOP)
    • A new 'Closed Shape Overlap' parameter adds overlapping points at the start/end of a shape to create a more uniform shape by removing hot-spots (like those introduced by start point hold time for example) via color interpolation.
    • A new 'Interpolate Colors' parameter enables color interpolation between points.
  • Pangolin CHOP - Added support for using POPs an an input. Also added 'Zone' attribute override for POP inputs.
  • Laser Device CHOP - Helios SDK Updated - Added an Info CHOP channel that reports whether the device supports extended frames. If extended frames are supported on the device, then there is now support for full 16-bit color and position, as well up to 4 optional user channels (user1, user2, user3, user4).


Stereolabs ZED Cameras

ZED Operators received an SDK Update and an overhaul to their workflow to make it more consistent with other camera devices.

  • ZED - ZED CHOP, ZED POP and ZED SOP now must point to a ZED TOP to access the camera, this is a Backward Compatibility Issue in which old files will need to be updated to this new setup that leverages the ZED TOP. A new ZED Select TOP let's you select different image streams from a ZED TOP so you can work with multiple streams at once.
  • ZED - Updated the SDK to 5.0.2 and added access to a number of new features. This now supports Blackwell NVIDIA GPUs (Geforce 5xxx), but no longer supports Pascal NVIDIA GPUs (Geforce 1xxx, P-series Quadros).
  • ZED TOP - New Features
    • Support for new image type called 'Mask', that provides a single mask from detection bodies with tracking ID as pixel value.
    • Added support for SVO2/SVO file playback via 'File' parameter. SVO2/SVO are Stereolabs ZED file formats which let you record data from ZED cameras and play it back later with full access to all the data and image types.
    • Added support for network streaming data from another machine using ZED native streaming.
    • Added a new parameter 'Disable Self Calibration' that disables automatic self-calibration process that occurs when opening the camera by default.
  • ZED CHOP - New Features
    • Added support for 38 joint body tracking.
    • Support for 2D, 3D and head 3D bounding boxes in ZED CHOP by turning on the 'Bounding Boxes' toggle.


Orbbec Cameras
  • Orbbec TOP - Upgraded the Orbbec SDK to 1.10.16 which this is compatible with Orbbec Femto Mega firmware v1.3.0+.
    • Upgraded Kinect Azure wrapper (K4A) to 1.10.3.
    • Orbbec SDK now has support for Intel-based Macs, previously it was for Apple Silicon only.


ST2110

ST2110 is a set of industry standards defining professional media over an IP network, delivering uncompressed video and audio streams, timing data, and ancillary data streams using existing network infrastructure technology.

  • ST2110 In TOP / ST2110 Out TOP - New input/output TOPs for ST2110 devices such as the Blackmagic IP range and Deltacast DELTA-ip-ST2110.
  • ST2110 Device CHOP - A new CHOP used to configure the ST2110 NIC (DHCP/IP Settings). The ST2110 TOPs reference this node to determine the available channels to send data out of the configured NIC.


Serial Devices
  • Serial Devices DAT - A new DAT that lists the available serial ports and identifies if a port is in use or not.


Color Space Workflow

  • Color Space Workflows - A new 'Color' tab in the Preferences Dialog exposes Color Space controls. These settings are saved per-project, so a change in any settings on this page requires saving the project.toe file and restarting the project. See articles Color Space and Color Space Workflows for details and usage.
    • Set the project's working color space between sRGB Linear, ACEScg, DCI-P3 Linear, Rec. 2020 Linear, or ACES 2065-1. Passthrough is the default which doesn't change anything in TouchDesigner's color behavior from older versions, this will keep old projects working the same as before.
    • Set the Window Pixel format to SDR 8-bit, SDR 10-bit, HDR 10-bit, or HDR 16-bit Float.
    • Separate settings for 'Reference White Nits' for both SDR and HDR.
    • A setting for 'UI Reference White' controls TouchDesigner's interface and more generally Panel COMPs to set their reference white brightness.
    • When working with HDR Window Pixel Formats, all content viewers, node viewers etc. will be displayed in HDR making if easy to preview your work.


3D Texture Support

  • Most TOPs now natively support 3D Textures and 2D Arrays. Feeding one of the following TOPs a 3D Texture source will now perform that operation on the 3D Texture.
    • List of TOPs - Add, Blur, Channel Mix, Chroma Key, Composite, Constant, Convolve, Cross, Difference, Displace, Edge, Emboss, Feedback, Flip, Function, HSV Adjust, HSV to RGB, Inside, Lens Distort, Level, Limit, Luma Blur, Luma Level, Math, Matte, Mirror, Mono, Multiply, Noise, Outside, Over, Remap, Reorder, Screen, Slope, Subtract, Reorder, Threshold, Under.
    • TOP to CHOP and TOP to POP also work with 3D Textures or 2D Arrays.


New Operators

New Operators not mentioned above are highlighted here.

  • Layer Mix TOP - The new Layer Mix TOP lets you composite unlimited image layers in a layer stack with individual adjustment controls for each layer. To avoid clutter and unneeded parameters, you can select only the adjustment controls you want by enabling them. You can also specify a background plate to composite your layers over.
  • Render Simple TOP - A new TOP to render geometry without needing extra scene objects like a camera or lights.
  • NVIDIA RTX Video TOP - A new TOP that leverages the NVIDIA RTX Video SDK for AI-enhanced video processing. This custom TOP enables RTX Video Super Resolution and RTX Video HDR effects to improve sharpness, clarity, and automatically convert SDR video to HDR within TouchDesigner workflows.


Pattern Matching

Some parameters in TouchDesigner are used to specify multiple operators, multiple channels, multiple points, etc. For example, the Render TOP allows for multiple lights, geometry COMPs and cameras to be specified in its parameters. The Join CHOP and Composite TOP accept multiple CHOPs and TOPs respectively. A parameter that is a "pattern" allows you to specify several names and/or specify "wild cards" which will match all or parts of the names of operators, channels, point indexes etc. Some examples, 1) r[xyz] matches channels rx, ry and rz, 2) *foot* matches each channel that has "foot" in it, with anything or nothing before or after it.

We are introducing an new update to Pattern Matching that is consistent throughout the product. Refer to the Pattern Matching documentation for details on the usage. Note: There is a 'Legacy Features' section below. Some uses of it are obsolete but we have legacy modes that allow older patterns and files to continue to work as-is.

The new Pattern Matching includes many improvements outlined here:

  • String patterns
    • Now all string patterns use the same pattern matching so you get consistent results. Previously, some nodes would be able to match geo[2-3,5] while others couldn't (ie. Render TOP), now they all can.
    • Any string pattern can now use Set Notation for matching (if shown as supported this table).
      • Now space separated patterns are consistently treated as OR, whereas previously these was different for different parameters.
      • Recommended: Use "&" and "|" symbols for more explicit syntax, for example: ^fit5 & ^fit5 and ^fit5 | ^fit6 are more explicit and preferred versus ^fit5 ^fit6
  • Index patterns - Functionally index pattern matching works similar to the previous notation except ranges are now surrounded by a brackets, not should use ^, improvements to take notation, and now supports set matching for non ordered.
    • Index patterns used to be differentiated by not having any square brackets, i.e. 0-10:2,3. Now they also use brackets which is more consistent with string patterns, ie. [0-10:2] would be valid for both a new index and string pattern.
    • Using ^ instead of ! for not, for example: ^5 versus !5 (in SOPs you were even able to use ! and ^ together, i.e. ^!50-70, not possible in new matching).
    • 'Take' notation has changed. We used to say 0-15:2,3 for "Take the first 2 of every 3 points, i.e. 0,1,3,4,6,7...), now we use [0-15:2:4]
    • Take notation now supports [*:2] notation, take every second entry from "*" which ranges from 0-maximum number of points (similarly for ordered ranges from 0-10 in that order).
    • POPs indices exclusively use the new syntax. Set matching is supported for non ordered ranges (such as those in Primitive POP).
  • Set Matching - The pattern matching rules above can be used in conjunction with set operator notation for more expressive selection. Basic, Operator and Index Patterns (i.e. /project/geo1, t?, chan*, blend[2-6:2]) create sets and |, &, ~ can apply set operations between them.
  • Additional Notes
    • Any string pattern should have been updated (except those that were old/deprecated).
    • POPs all use the new index pattern matching described above.
    • The Delete CHOP, Reorder CHOP and Sort CHOP have a 'Legacy Pattern Matching' toggle for using older style index pattern matching for backward compatibility.
    • SOPs Index pattern matching have been left unchanged.


Metadata support


Operator New Features

There are over 100 additional new features added to TouchDesigner operators in this release. Below we list everything ordered by OP family.


COMP Features
  • Button COMP - New parameters to adjust the text on the button's label, including 'Scale Text to Fit', 'Font Size', 'Line Spacing', and 'Text Padding'.
  • Engine COMP - Added new "Allow UI" parameter which controls the ability of components (.tox files) loaded in the Engine COMP to open floating windows (using Window COMPs).
  • FBX COMP / USD COMP - Added an 'Import POPs' parameter which will create POPs in place of SOPs when importing geometry. The default is 'On' to import using POPs.
  • Geo Text COMP - New 'Face Camera' parameter to make text face the camera regardless of orientation.
    • Added depth-based scaling parameters (similar to the Line MAT) to control text scaling based on distance from the camera.
    • Added 'Width Affected by FOV/OrthoWidth' parameter (similar to the Line MAT) to make sizing field-of-view independent.
    • Added 'Lift Towards Camera' parameter.
    • 'Width Affected by FOV' and 'Lift Towards Cam' parameters work with Orthographic camera type.
    • 'Face Camera' behavior rotates about the anchor point of the layout box.
    • All of the above new features work independently for each camera. For example, with the 'Face Camera' parameter toggled on, the text will face each camera it is viewer from.


  • List COMP - New attribute topFill controls the way a Background TOP will fill: fillMode.STRETCH, HORIZONTAL, VERTICAL, BEST, NATIVE, OUTSIDE

For example

def onInitRow(comp, row, attribs):
	attribs.top = op('out1')
	if (row%2 == 0):
		attribs.topFill = FillMode.VERTICAL
	else:
		attribs.topFill = FillMode.HORIZONTAL
	return
  • Panel COMPs - All Panel Components received these updates.
    • On the Look parameter page, a new 'TOP Fill' menu option 'Fill Outside' fills the available area by cropping rather than stretching the image.
    • On the Drag/Drop parameter page you'll find:
      • In the 'When Dragging This' parameter menu there is now an option to 'Fill Custom Parameter' to easily fill a single parameter without need of setting up a callback.
      • 'Built-In Drop Options' toggle controls whether or not built-in options are included when dropping onto this node.
  • Text COMP - New Features
    • Added 'Placeholder Text' that is displayed when the text contents are empty.
    • Added new parameters adjusting drop shadows, including control over color, alpha, and offset.
  • Window COMP - New features
    • Added parameters to control 'Output Color Space' and 'Output Reference White' when Working Color Space is set to a color space other than 'Passthrough'.
    • A 'Prevent Display Sleep' toggle parameter has been added to keep your display from going to sleep regardless of power saving modes set on the system.
    • Renamed "monitor" to "display" in parameters, menus and warnings.


TOP Features
  • Composite TOPs can now use Justify Horizontal and/or Justify Vertical parameters when 'Pre-Fit Overlay' is set to Fit Vertical, Fit Horizontal or Fit Best modes. Which justify parameters are enabled depends on the mode selected, for example Fit Vertical can only be justified horizontally and Fit Horizontal can only be justified vertically. This has been added to the following TOPs: Composite TOP / Over TOP / Cross TOP / Difference TOP / Add TOP / Inside TOP / Multiply TOP / Screen TOP / Subtract TOP / Under TOP / Outside TOP
  • Corner Pin TOP - Added 'Mapping' parameter to the 'Extract' page for option between Bilinear and Perspective extraction.
  • CPlusPlus TOP - Added TOP_Output::getSuggestedOutputDesc() to help decide what resolution the node should output based on the 'Common' page parameters.
  • Displace TOP - New 'Aspect Correct' parameter added for mapping the displace weights to be aspect correct.
  • Math TOP - A new 'Fix Invalid Values' menu was added to handle bad pixel values, allowing for conversion of NaNs to Zero and Infs to One.
  • Movie File In TOP - New features.
    • The 'Index' parameter can now be a negative number. When negative the index will cycle back through the movie.
    • Added 'Pre-Download HTTP Addresses' parameter. This was the default behavior before, but now can be turned off.
    • Added support for reading some forms of .ktx files.
    • Added 'HLG Peak Nits' parameter to control the peak nits for HLG encoded content.
    • 'Hardware Decode' now defaults to On.
  • Movie File Out TOP - New features.
    • Added support for VVC (Versatile Video Coding), also known as H.266.
    • Added support for encoding AV1 codec video (on newer NVIDIA GPUs).
    • Added support for encoding AAC codec audio.
    • Added support for encoding Opus codec audio.
    • Added 'Stereo Mode' and 'Spherical Mode' parameters to write out metadata for stereo and spherical video content.
    • Added 'Leading Zeros Digits' parameter to specify the minimum number of suffix digits that the filename will have. If the sequence number is less than this number, then leading zeros are appended so that the total number of suffix digits is at least this value.
  • Noise TOP - Derivatives are now supported for Simplex 4D and Perlin 4D noise by turning on the 'Gradient' toggle on the Output page. For derivatives of 4D noise types, the 'Alpha' parameter will be disabled and the alpha channel will have the 4th component of the derivative.
  • NVIDIA Background TOP / NVIDIA Denoise TOP / NVIDIA Upscaler TOP - Upgraded to latest version of NVIDIA Maxine SDK. Adds support for Blackwell GPUs ie. 50-series Geforce GPUs. Requires Video Effects SDK for your GPU to be installed from https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/.
  • OpenVR TOP - Is now Color Space aware when used in a project with working color space set.
  • Point File In TOP - Is now Color Space aware when used in a project with working color space set.
  • Render TOP - A few new parameters have been added.
    • Added a new 'Render' pulse parameter to render one frame when the 'Render' toggle parameter is turned off.
    • Added a new 'Background Color' parameter, which is combined with the Camera COMP's Background Color to determine the final Background Color of the render.
    • For working with UV Unwrap workflows with POPs, a new 'UV Unwrap POP Coord Attribute' parameter has been added.
  • Video Device In TOP - Extended device support and improvements.
    • Added support for Timecode over HDMI on Blackmagic Design cards, to access this timecode use an Info CHOP on the Video Device In TOP.
    • Added support for the IDS Peak SDK, to support newer IDS cameras.
    • AJA devices can now use the 'Sync to Input Frame' with multiple inputs.
    • Now possible to capture up to 16 audio channels for Deltacast devices.
    • Added support for Deltacast cards that don't have bi-directional connectors and fixed enumeration of these Deltacast boards.
    • Added support for 10-bit input on Bluefish444 devices, you'll also find this support in the Video Device Out TOP.
    • Added 'frames_displayed' Info CHOP channel.
    • Improved performance when using 'Media Foundation' library and the pixel format of the data stream is NV12.
  • Video Device Out TOP - Improved device support.
    • Added support for Timecode over HDMI on Blackmagic Design cards using the 'Timecode Object/CHOP/DAT' parameter.
    • Added support for synchronized output for Blackmagic Design devices.
    • Added support for 10-bit output on Bluefish444 devices.
    • Device selection is now more portable between machines, using a device index if the exact device can't be found.
  • Video Stream In TOP - 'Hardware Decode' now defaults to On.
  • Video Stream Out TOP - Some tuning parameters and improvements.
    • New 'Ultra High Quality' option in the 'Quality' menu.
    • Added support for AAC audio codec for RTMP and SRT modes, as such, the default audio codec has been changed to AAC.
    • Added support for AV1 codec for RTMP output.
    • Added support for H265/HEVC codec for Enhanced RTMP.
    • Added support for Opus audio codec when using SRT output.
    • Added parameters to force the 'Mux Size' and the 'VBV Buffer Size'.
    • Reduced audio dropouts when connection is unstable.
  • Web Render TOP - updates and improvements.
    • Updated to Chromium 132.0
    • The option to 'Use Shared Textures' in chromium (cef) on windows is back.
    • New parameter for 'DPI Scaling'.
    • New parameter to specify a table to 'Modify Request Headers'.
    • Backward Compatibility Issue - Using the same cache with 2 Web Render TOPs is no longer supported, the second one will error.


CHOP Features
  • Audio File Out CHOP - Added support for big-endian .aiff formats.
  • Audio Movie CHOP - Added a 'Volume' parameter for convenience.
  • Audio Render CHOP - Added added a new 'Simulation' mode that supports multiple sources and scene meshes. Scene meshes have properties for absorption, scattering and transmission all of which is fed into the simulation which calculates air absorption, occlusion, and reflections.
    • On the Meshes parameter page, the static 'Mesh Objects/POPs/SOPs' parameter now supports multiple OPs.
    • Added 'Auto' mode for baking reflections which will automatically rebake when any parameter change occurs that necessitates it.
    • Added 'Baked Data Variation' parameter to switch simulation modes between 'Static Listener' and 'Static Source', where baked reflection data is calculated in reference to whichever objects are set to be static.
    • Added new parameters for attenuation (note this only works when reflections are disabled).
  • Body Track CHOP - Upgraded to latest version of NVIDIA Maxine SDK. Adds support for Blackwell GPUs ie. 50-series Geforce GPUs. Requires AR SDK for your GPU to be installed from https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/.
  • Clock CHOP - Added a 'Countdown' mode. For the first input, any missing values are assumed to be midnight January 1st of specified year. The second input is entirely optional, missing values are taken from current time.
  • Count CHOP - Improvements
    • Added 'Count Up' and 'Count Down' momentary parameters to allow counting with no input connected.
    • Non-timesliced mode now uses all channels of the Increment input, not just the first. This allows you to specify separate count increments for channels on the first input by supplying multiple channels into the Increment input.
  • DMX In CHOP / DMX Out CHOP - Better support for serial and DMXKing devices.
  • DMX Out CHOP - Added 'ArtSync Timeout' parameter to specify the time in milliseconds that ArtSync will wait for all ArtDmx packets to complete sending before sending the ArtSync packet. If they have not all been sent when the timeout is reached, then ArtSync will terminate and the ArtSync packet will not be sent. Additionally, a new frame of ArtDmx packets will be sent and a new ArtSync will be initiated.
  • Face Track CHOP - Upgraded to latest version of NVIDIA Maxine SDK. Adds support for Blackwell GPUs ie. 50-series Geforce GPUs. Requires AR SDK for your GPU to be installed from https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/.
  • File In CHOP - Channel names now preserved when reading a .chan file into a CHOP. ** BACKWARD COMPATIBILITY **  Chan files now preserve channel names instead of always defaulting to chan1, chan2, chan3, ...
  • Hokuyo CHOP - Added new 'Local Address' parameter, helpful for when a system has multiple network interface cards.
  • Parameter CHOP - Added 'Sequences' parameter to better parse Sequential Parameters.
  • Render Pick CHOP - Added 'Name Format' and 'Type Suffix' parameters to provide POP friendly naming.
  • RenderStream In CHOP - Added support for multiple Scenes and Schemas.
  • Resample CHOP - Added new parameter 'Use Last Frame Only' to trim to the input's last frame and perform the resample on that.
  • Script CHOP - Added parameter 'Modify Outside of Cook' which when 'On' allows the CHOP's output to be updated by an external script.
  • Speed CHOP - New 'Speed' parameter that allows generating values when no inputs are connected.
  • Stretch CHOP / Resample CHOP - New interpolation method 'Repeat Samples' that provides better spaced results when lengths are integer multiples of original.
  • Timecode CHOP - Added an option to set custom length from a Timecode Class object. Also added 'Extend Left' parameter and changed the Cycle toggle to be a menu named 'Extend Right'.
  • Trigger CHOP - Added 'Enable Remap Length' and 'Remap Length' parameters which will re-time the total length of the envelope to the specified length. Note that held sustain length is not remapped, only Delay, Attack, Peak, and Release lengths are remapped.


DAT Features
  • DATs - Since newlines are supported in DAT cells, display them as symbols and allow them to be selected/deleted/copied etc.
  • DAT Execute DAT - A new onTableChange method does everything now, the other 4 legacy methods (onRowChange, onColChange, onCellChange, and onSizeChange) are now deprecated.
  • Multi Touch In DAT - New features
    • New parameter 'Occlude Panels by Hierarchy' - Enables filtering out multitouch events by Panel Depth Layer.
    • New parameter 'Occlude Panels by Depth Layer' - Only children of the specified panel will receive multitouch events. Touches on parent and sibling panels are ignored.
    • New parameter 'Occlude Panels Above Depth' - Multitouch events from panels with a Depth Layer larger than this value will be ignored.
  • Render Pick DAT - Added 'Name Format' and 'Type Suffix' parameters to provide POP friendly naming.
  • Table DAT - Performance optimizations to make large tables cook significantly faster. As well, in the DAT viewer's right-click menu you'll find a new option to toggle the 'Auto Resize Columns' behavior on/off.
  • Web Client DAT - Added 'Web Form' toggle that enables construction of MIME-formatted request, similar to using mimeParts in WebclientDAT Class.request. When enabled, the second input will be interpreted as MIME parts rather than the request body.


MAT Features
  • TriPlanar texturing ...
    • PBR MAT / Phong MAT - Added new menu 'Texture Sampling Mode' to PBR MAT and Phong MAT with options Regular, Screen Space Coordinates and Triplanar.
    • For backward compatibility, a new 'Texture Sample Mode' menu found in all texture map's extended parameters has been added to select between regular texture coordinates, screen space coordinates, or the new tri-planar mapping coordinates. The 'Screen Space Coordinates' option previously found under the 'Texture Coord' menu is now located in this new 'Texture Sampling Mode' menu.
    • Triplanar texture mapping can be selected using the 'Triplanar Mapping' option in the new mode menu. When using this mode, first triplanar texture attributes need to be generated via the Texture Map POP.
    • Texture Map POP - The option 'Triplanar Coordinates (Point)' found in the 'Texture Type' menu will generate triplanar texture attributes on the geometry for use with triplanar mapping in the MATs above.
  • MAT - All MAT operators now have a bypass flag.
  • Point Sprite MAT - New menu 'Sizing Model' allows the depth based scaling of the sprites to be either via the 'Constant/Attenuate' model's 'Attenuate Point Scale' parameter or 'Perspective Correct' scaling like most geo objects.
    • Added 'Size Affected by FOV/OrthoWidth' parameter for 'Perspective Correct' mode to make scaling FOV independent or dependent.
  • GLSL MAT - Added TDImageStore_*() / TDImageLoad_*() functions to work with Image Outputs from the Render TOP. Required for color correct values when using a working Color Space.
  • Line MAT - New auto-cleanup of memory used by the Line MAT when it's not used for a while.


Operating System Specific

  • macOS - Minimum requirements now macOS 12.0 Monterey.
  • macOS - Added support for hardware accelerated H.264 and HEVC/H.265 encoding with the Movie File Out TOP.
  • Windows and macOS - A minimum of 4GB GPU memory is required, we recommend 8GB or more.


Python Tools

  • TouchDesigner's Python version has been updated to 3.11.10
Python Autocomplete and Help in VScode
  • TDI Library - The TDI Library enables popup help and code-completion when working with python in Microsoft Visual Studio Code (VS Code). It contains the help documentation and Python description of all built-in TouchDesigner objects, classes and functions. In addition to help and auto-completion, using TDI library will eliminate error and warning indicators when using VS Code to edit TouchDesigner Python.
Tool Components for working with Python in TouchDesigner
  • Depth Anything V2 Tutorial - Depth Anything V2 is a machine learning library that can create depth information for images and videos. Check out this tutorial which uses both the ThreadManager and the TDPyEnvManager to get Depth Anything V2 running in TouchDesigner.
  • Palette:logger - v2.6.1 - Major overall. Improved by always initializing a Logger object reducing initialization issues and now including a QueueHandler to work in conjunction with the Thread Manager mentioned above.


New Python

  • Python version updated to 3.11.10
    • Updated all extra Python packages we ship with to the latest versions.
    • Upgraded to NumPy 2.1.2.
  • Individual parameter disabling within a ParGroup
  • AbsTime Class - .frame .seconds now pause with main timeline.
  • Camera Class.frameBounds - Added a new 'padding' keyword expressed as a fraction of the viewport height e.g. 0.1 puts a minimum 10% padding around all sides.
  • Camera Class / ArcBall Class - Added errors for unexpected arguments and keywords.
  • Color Class.colorSpacePrimaries(workingColorSpace) -> ColorSpacePrimaries - This is a static function which can be called without a Color instance. It returns a ColorSpacePrimaries named tuple, for the given WorkingColorSpace.
   Args:
           workingColorSpace - One of the 'WorkngColorSpace' enum values.
   Example:
           Color.workingColorSpace(WorkingColorSpace.ACES_CG)
  • COMP Class.progressiveUnload() - Now errors if no argument provided for splitting the unload over multiple frames.
  • COMP Class.progressiveUnloader - This member is of type ProgressiveUnload Class.
  • COMP Class.findChildren() now updates properly when searching by value.
  • COMP Class.layout(ops, horizontal=False, vertical=False, gridRows=0) - Added a method to automatically layout operators.
  • COMP Class.findChildren(renamed=True) - Returns a list of children whose names have been edited, ie. any non-default name.
  • COMP Class.collapseSelected() returns a reference to the created Base COMP.
  • COMP Class.progressiveUnload() - A new method to progressively unload the COMP's children over multiple frames. All 'PerFrame' options can be specified together. Unloading will move to next frame when one of the criteria gets met.
    • Additionally a COMP Class.progressiveUnloader member has been added to query the progress of the progressiveUnload operation. See ProgressiveUnload Class below.
    • ProgressiveUnload Class - This new class describes a specific instance of the COMP.progressiveUnload() method. Methods and members of this class are used to obtain progress information about the underway progressive unload operation, or modify it.
  • geometryCOMP Class.bounds / SOP_Class.bounds - New functions for returning the bounds of the contained geometry. The 'render' and 'display' now default to False in contrast to the legacy computeBounds function. For example, calling OP.bounds() with no keywords will now always return bounds regardless of the state of the render. The legacy computeBounds function has been deprecated.
  • geometryCOMP Class.computeBounds - COMPs that are not 3D Objects (ie. Base COMP, Panel COMPs, etc) are no longer included in bounds when the recurse keyword is used.
  • geotextCOMP Class.layoutText() - This function now creates a dependency so that OPs using it will automatically recook when the Geo Text COMP changes.
  • geotextCOMP Class.layoutText() - Returned positions now include vertical alignment and padding.
  • DAT Class / Cell Class - Added boolean option wallTime to .run() method to specify if the delay options are to be based on elapsed frames or elapsed time.
  • DAT Class.csv - Get or set the contents as csv format. Unlike .text format, .csv supports newlines in cells.
  • DAT Class - Removed textFormat member from DAT class and moved to textDAT Class and scriptDAT Class.
  rowsChanged - a list of row indices with different contents
  rowsAdded   - the list of added *header* indices (in dat)
  rowsRemoved - the list of removed *header* indices (in prevDAT)
  colsChanged - a list of col indices with different contents
  colsAdded   - the list of added *header* indices (in dat)
  colsRemoved - the list of removed *header* indices (in prevDAT)
  cellsChanged - the list of cells that have changed content
  sizeChanged - bool, true if number of rows or columns changed
  • Dependency Class - Using deepcopy on a tdu.Dependency() will now also copy over its .callbacks member.
  • listCOMP Class - Rolling outside cells now shows popup help defined in table attribute.
  • listCOMP Class - New members displayColWidth and displayRowHeight that return the actual row or height of a cell including any resizing.
  • Monitor Class - Added new .connectedGPUName and .connectedGPUIndex members.
  • OP Class.enclosedBy - List of all Annotate COMPs enclosing this operator.
  • OP Class.asType(<OP class> class, checkType=False) - A new wrapper function overridden in TDI type checking. Returns itself.
  class - Expected type of this operator.
  checkType - (Optional) If True, raise an exception if this operator is not a member or subtype of class.
  • Par Class - Comparisons now use parameter evaluations in all cases. BACKWARD COMPATIBILITY par1 == par2 would previously only return true if it were the same parameter object, now it compares their evaluation results.
  • Par Class.enablePar - Get or set the single parameter's enable state within the ParGroup. For the entire ParGroup use ParGroup.enable or Par.enable. Can only be set on Custom Parameters.
  • Par Class / ParGroup Class.readOnly - This member can now be set per parameter, not just the entire ParGroup as a whole.
    • BACKWARD COMPATIBILITY - ParGroup.readOnly now returns a tuple of individual values, not a single bool.
  • Par Class.isSamePar(x) / ParGroup Class.isSameParGroup(x) - Returns True if argument passed refers to same parameter as object does. For example: n.par.tx.isSamePar(p) returns True if p is the same parameter as n.par.tx. Note this is different from using == which compares the parameter's evaluated values.
  • ParGroup Class.enableExpr - Now supports lambda format to enable individual parameter enabling within the ParGroup. Example: n.parGroup.enableExpr = 'lambda x: x==2'. #only enables third component
  • ParGroup Class.enable - This member now returns a tuple of values instead of a single value, as parameters are now individually enable-able.
    • BACKWARD COMPATIBILITY - The return type of ParGroup.enable is now a tuple, not a single bool.
  • ParGroup Class.maxSize - Returns the maximum number of parameter elements for this ParGroup.
  • ParGroup Class.defaultSize - Returns default number of parameter elements for this ParGroup.
  • ParGroup Class.suffixes - Returns a list of suffixes used to name the parameter elements of this ParGroup.
  • Par Class / ParGroup Class.sequenceBlock - Returns the sequenceBlock Class the object belongs to, or None.
  • POP Class.save() - Method added for saving POP geometry, similar to SOP.save().
  • Project Class.defaultParameterColorSpace - A new member that can be used to set the color space for newly created nodes.
  • Timecode Class.setLength - Fixed setting by tdu.Timecode so it accounts for potential differences in FPS.
  • TOP Class.pixelFormatName member added to get the pixel format menuName. For all python handling and parameter interactions this should be used instead of pixelFormat.
  • TOP Class.save() now returns FileSaveStatus Class python object which has methods and members for querying info regarding the save task. In particular, isCompleted() returns true if saving finished, useful for asynchronous mode.
  • Run Class when executed from a DAT, Cell, or td, now remains persistent. Allows you to check the state after its completed.
  • Properly setup context 'me', when executing a run() command. In some cases 'me' value was set to root instead of the location the run command originated from. This could lead to permission errors trying to access neighboring content within a private component for example. BACKWARD COMPATIBILITY - 'me' context no longer wrongly set to root in some cases.
   debug(list(n.par))
   debug(list(n.par.S.sequence.blockPars))
   debug(list(n.par.S.sequence[1].par))
   debug(list(n.parGroup))
   debug(list(n.par.S.sequence.blockParGroups))
   debug(list(n.par.S.sequence[1].parGroup))
  • Sequence Class.reorderBlocks(index1, index2..) - Reorder the specified blocks leaving the rest in place.
  • Sequence Class.sortBlocks(key=lambda block: (block.namePar or block[0]).eval(), baseName=, reverse=False)
    • key - A function that is passed to every block in the sequence to return a sortable value. By default it evaluates the block's main name parameters, if defined, else the first parameter of the block.
    • baseName - If specified, uses the parameter of each block with that baseName as the sort value.
    • reverse - If True, reverses the order of the sort.
For Example:
 .sortBlocks(baseName='value', reverse=True)  # sort on reverse *value parameters in the sequence
 .sortBlocks(key=lambda block: block.par.value)  # same as above
 .sortBlocks(key=lambda block: block.par.x + block.par.y)  # sort on combined x+y value of each block
  • Sequence Class.blockName - Gets the basename of the parameter used to name each block. By default this would be 'Blockname'
  • Sequence Class.Sequence[name or index] - Finds a block by its position or block name as described above.
  • sequence Class.moveBlock(blockFromIndex, blockToIndex, num=1) - Moves the specified blocks, takes optional keyword 'num' describing number of blocks to move.
  • Sequence Class - moveBlock, insertBlock arguments can be names, integers, or SequenceBlock objects.
  • sequenceBlock Class.name - Get the name of a particular block. This is the value of the parameter in the block with basename 'Blockname'. When blocks are added this parameter gets automatically updated with a unique value. This means, in addition to accessing a block by index (example: n.seq.MySequence[3]) you can also access it by name (example: n.seq.MySequence['SectorJ']).
  • SequenceBlock Class.namePar - Returns parameter defining name of block, or None. (As opposed to .name which returns that parameter's value).
  • SequenceBlock Class.destroy() replaces Sequence Class.destroyBlock(index) which is now deprecated.
  • SequenceCollection Class - Is now iterable. For example [s for s in op('geo1').seq] to iterate through all sequences of a particular OP.
  • SysInfo Class - Added new members .GPUName, .GPUID, and .GPUPlatformID.
  • textCOMP Class.evalTextSize now takes optional keywords wordWrap and pageWidth that can override the parameter values during this call.
  • TOP Class - Improvements for 3D texture support.
    • Added support for .numpyArray() to download 3D textures.
    • .numpyArray() now downloads full Cube Maps.
    • .cudaMemory() now supports outputting data from 3D/2DArray/Cube textures.
  • UI Class - New rollover members return the object currently being rolled over. One of: ui.rolloverPar, ui.rolloverParGroup, ui.rolloverPage, ui.rolloverOp, ui.rolloverPanel in that order.
    • UI Class.rolloverPar / .rolloverParGroup - Returns Par/ParGroup currently under the mouse, including parameter labels.
    • UI Class.rolloverPage - Returns the parameter dialog 'page' currently under the mouse, or None.
  • UI Class.messageBox() - No longer is called recursively from Execute DAT Frame Start/End callbacks.
  • Optional keyword argument alwaysOnTop added to several UI elements
   OP.openViewer(alwaysOnTop=False)
   OP.openParameters(alwaysOnTop=False)
   UI.openBookmarks(alwaysOnTop=False)
   UI.openTextport(alwaysOnTop=False)
   UI.openWindowPlacement(alwaysOnTop=False)
   UI.openPaletteBrowser(alwaysOnTop=False)
   UI.openMIDIDeviceMapper(alwaysOnTop=False)
   UI.openNewProject(alwaysOnTop=False)
   UI.openKeyManager(alwaysOnTop=False)
   UI.openErrors(alwaysOnTop=False)
   UI.openVersion(alwaysOnTop=False)
   UI.openPreferences(alwaysOnTop=False)
   UI.openBeat(alwaysOnTop=False)
  • WebclientDAT Class.request - Added formParts keyword argument that accepts a list of WebFormPart namedtuples. formParts enables construction of a MIME-formatted request, allowing for multipart and form requests.


  • TDStoreTools - Improved error messaging and behavior of DependList and DependDict
  • TDFunctions - Improved error messaging and behavior of createProperty. Backwards Compatibility - using delattr to delete a property created by createProperty will now only set the value to None
  • TDFunctions - Fixed an issue with applyParInfo when source has a bind expression. Added raiseExceptions argument to that and applyParDefaults.
  • td Module - Added boolean option wallTime to .run() method to specify if the delay options are to be based on elapsed frames or elapsed time.
  • Tdu Module.parSummary(opType) - Outputs a detailed summary of the built-in parameters.
  • Tdu Module.tdu.isPointCloudFile() - Added to identify if a file is a point cloud file.
  • Fixed hang when executing help() or other python commands that waited on user input to continue.
  • Fixed parent() expressions not updating on renames.
  • Extension changes
    • onDestroyTD called instead of __delTD__ when extension destroyed (still backward compatible).
    • onPostInit renamed to onInitTD
  • NOTE: These Python preferences are now off by default.
    • "Add Externally Installed Python Site-Packages to Search Path"
    • "Add Python User Site-Packages to Search Path"
  • Optimized Python Expressions - Optimized Pattern CHOP's .chanIndex and .sampleIndex.


New Palette

  • Palette:callbacksHelper - A new component in the Tools folder, simply drop this into your custom component to easily create a callback system for it.
  • Palette:cameraViewport - Version 1.2.2 - New parameter to externalize the transform into a DAT so it can be immune from cloning.
    • New preset sequences and a button to stop auto rotation.
    • Added 'Go' pulse button to jump to preset position. Removed unneeded reference to numpy.
    • Updated built-in lights and helpers to use POPs.
    • Added instance Id and custom attributes to pick callback.
    • New parameter to add padding around an object when framing.
    • Callback return value can now be used to indicate the event was handled and camera movement should not be initiated.
    • Pivot position is now saved to file. Fixed the 'Pivot Distance' parameter default.
    • Nodes tagged with 'cameraViewportExcludeBounds' are now excluded from bounding box calculations used for framing and homing.
    • New parameters to set the homing bounds manually.
    • Fixed a bug with updating the external camera transform.
    • Fixed Transform DAT being overwritten by storage on load.
  • Palette:cppParsTemplateGen - v0.1.3 - Fixed parameter variable name formatting when parameter name uses numbers or symbols.
    • v0.1.2 - Fixed namespace issue that was occurring with the latest CPlusPlus Custom OPs API.
  • Palette:domeViewer - v0.5.0 - Initial release. A new COMP inspired from Fred Tretout's InsideDome. Can be used to previz content for domes as well as easily generate the dome POP to design content with.
  • Palette:gestureCapture - v10.0.0 - Converted to use and output POPs.
  • Palette:lister - Added drag-to-size column headers.
    • Controlled by Sizeable Cols and Save Col Resizes parameters.
    • colDefine now has a "sizeable" row for every column.
    • Works best with a maximum of 1 stretchy column.
    • Includes a cleanup of the Select/Sort/Filter parameter page.
    • sizeable: old listers will require setting the "sizeable" row in the colDefine table for this feature to work.
    • Column border: listers using old listerConfig components will not have a border between column headers. This is controlled by the border settings on the header component in listerConfig. Change Right Border to Border A, then set color on Border A. Gray 0.4 is the default.
    • colDefine and look OPs now use "topFill" to define how TOPs in cells fill the cell.
    • Fixed an issue where column headers didn't use justify setting provided in the colDefine table.
  • Palette:logger - v2.6.4 - Major overall.
    • The logger object (self.Logger) is now always initialized. This prevents possible error where logging would fail because the logger was not initialized. This can however cause cases of silent logging, where the messages are added to a queue and not dequeued. See following point.
    • The logger is now initialized with a QueueHandler. The QueueHandler allow for messages to be queued and dequeued overtime. Messages can be queued safely from additional threads, and dequeued on the main TouchDesigner thread. When dequeued, messages are eventually passed to the extra handlers such as the StreamHandler (textport) or FileHandler.
    • A new dictionnary ExtraHandler is holding the handlers managed by the Logger COMP. When any of the managed handlers is updated, a new QueueListener is created to handle the future log messages and changes.
    • New methods to Add or Remove Extra Handlers are exposed. They should be used when a user want to add a custom handler and the log messages should be passed to this handler when dequeued.
    • New defaults and measures to avoid a case where a new Logger COMP reuse a logger instance caused by a perfect name match in the Logger name and hierarchy. This could happen in the past if a Logger was named “ABC” and pointing to a parent “project1”. The resulting logger name would be “project1.ABC” and this match could exist in another component when using multiple loggers. This should be mitigated by new defaults, but this is not entirely avoidable. Try to name your loggers without generic names.
    • Adding support for File rotation settings.
    • Code cleanup, removing unnecessary methods, various fixes.


  • TDAbleton - Version 2.6.3
    • Added separate MPE MIDI devices. The abletonMIDI component now has a default pitchbend channel option.
    • MIDI m4l devices now work with MPE.
    • Better arrangement clip information in abletonTrack Component output CHOP.
    • Added 'Arm for Recording' toggle to abletonTrack
    • Added looping info to clips
    • Fixed lingering errors when using "Update All Components"
    • Fixed long cooks in abletonTrack when a Live set has a long arrangement
    • Fixed demo to use "Auto Filter Legacy"
    • Fixed a single frame error on abletonTrack when going from arrangement clip to none. Increased OSC buffer size and improved log messages.
    • Ableton Component's sendOSC functions no longer work when 'Connect' parameter is off. If you need to override this in script, call sendOSC directly on the TDAbleton master component.
    • Firing an empty clip slot (from abletonClipSlot component) on a record-armed track will start recording a new clip.



  • Thread Manager - First public release. A new system component and a set of palette components designed to facilitate Python threading in TouchDesigner. Read our Introduction to the ThreadManager for more information.
  • Palette:threadManagerClient - A component which works with the Thread Manager COMP, the ThreadManagerClient is designed around it's callback DAT. Users should review the template code and adapt it to their own cases. The customized methods implemented in the ThreadManagerClient Callback are generating a TDTask that gets passed to the Thread Manager TDTask queue. While experienced developers can rely on the Thread Manager directly using op.TDResources.ThreadManager, users not familiar with threading should consider using the ThreadManager Client instead.


  • Palette:treeLister - Has the new lister topFill and sizable columns features.
  • Palette:webBrowser - Better support for inputing unicode characters in languages like German and Japanese.
  • Widgets - v2.2.6 - New masterRadioMenu widget. Similar the Radio button but is a menu base type and operates with string values. Also includes ability to disable and hide items.
    • v2.2.5 - Button widget now uses Text COMP multiline mode offering better support for button names that require 2 lines.


Bug Fixes and Improvements

SDK Updates


COMP Improvements

  • Engine COMP - Improvements and bug fixes.
    • Improved the performance of TOP outputs.
    • Fixed connected multi-input OPs (eg Merge) losing connections during reload.
    • Fixed options for the 'Asset Paths' parameter functioning the wrong way around.
    • Change to Info CHOP channels so component_none is 0 when component_error is 1 (eg after a failed load).
    • Fixed 'Ready When' = 'Component Running' mode so the output is updated when in the ready state.
    • Fixed issue which could leave an Engine COMP in an error state after loading a .tox failed.
    • Fixed a potential hang or crash when some errors occurred.
    • Fixed crash which could occur under GPU resource starvation.
  • FBX COMP - General improvements
    • Fixed Info CHOP not cooking when using an animation, unless 'Children Cook Time' was enabled.
    • Fixed a bug where animation would not play forward when 'Extend Left' was set to "Hold".
    • Normalize bone weights of the imported assets.
  • Geometry COMP - Fixed a crash which could happen when the parent's Geometry COMP was being disabled. Additionally fixed a crash related to the viewer bounding box and instancing.
  • Geo Text COMP - Fixed top and bottom text padding when using a Specification DAT/CHOP. Also added warnings when Specification DAT append mode is used with incompatible features.
  • Panel COMPs - Fixed bugs
    • Fixed an issue with the 'Use Vertical' option in 'Fixed Aspect' menu parameter. Also addressed aligning a row of children with simultaneous Fill and Fixed Aspect ratios.
    • Fixed 'Opacity' giving in darker results than expected.
  • Parameter COMP - 'Labels' toggle to turn on/off parameter labels leaving only the active part of the parameter to the right of the label ie. the slider, toggle, button, field, etc.
  • Text COMP - Improvements and bug fixes.
    • Improved layout of text when both 'Scale Text to Fit' and 'Word Wrap' are enabled together.
    • Copying text when in 'Select Only' mode no longer includes hidden formatting directives.
    • Fixed cursor movement and selection with formatting directives when using 'Select Only' mode.
    • Fixed a bug that removed leading line breaks in multi-line mode.
    • Fixed a bug selecting strings using python in single line mode.
  • Window COMP - Improvements and bug fixes.
    • Added a warning if the specified monitor doesn't exist while the window is opened in perform mode.
    • Fixed issue which could cause the wrong OP to be used in Perform Mode after using Open as Perform Window from a Window COMP's parameter dialog.
    • On macOS, when a window is sized to exactly fill one or all monitors and has no borders, it will open as a full-screen window, matching behaviour on Windows.
    • Removed notion of 'Stereo' from Window COMP and underlaying classes.


POP Improvements For a history of previous POPs development, you can refer to POPs sections in the Experimental Release Notes.


TOP Improvements

  • Blur TOP - Fixed mipmaps not getting re-generated when it cooks. Fixed an issue that broke output when the output resolution was different than the input, this also fixes the Bloom COMP in the palette not working due to that.
  • Convolve TOP - A Coefficients DAT has been docked for ease of use.
  • Cache TOP - Bug fixes
    • Fixed a case where 'Reset' would create a (0,0,0,1) texture instead of (0,0,0,0).
    • Fixed 'Output Index' not returning correct index if the cache isn't full due to 'Replace Single' being used.
    • Fixed 'Pre-Fill' sometimes filling the wrong resolution.
  • Chroma Key TOP - Fixed a hang that can occur with this operator.
  • Displace TOP - 'Vertical Source' parameter default value changed to Green.
  • GLSL TOP - Fixed an issue where changing the texture dimension of the input didn't trigger the shader to recompile. Also improved errors when array uniforms are incorrectly assigned on the 'Vectors' page.
  • Movie File In TOP - Bug fixes.
    • Fixed issue that can occur with 2 channel .exr files.
    • Fixed some cases where compressed format .dds files wouldn't be read properly.
  • Movie File Out TOP - Bug fixes.
    • Fixed GPU memory leak when using the Nvidia H.264 and HEVC/H.265 encoders.
    • Header DAT parameter is now disabled for formats that don't support it.
    • Fixed H264/H265 files producing artifacts when seeking.
    • Fixed an issue which prevented some third-party applications from recognizing the alpha channel in exported ProRes 4444.
    • Selecting YUV 4:4:4 (10-Bit) when exporting ProRes 4444 correctly allows the encoder to discard the alpha channel on macOS 13 and above.
  • NDI In TOP / NDI Out TOP - Upgraded to NDI 6.2.0.
  • Noise TOP - Fixed this node always using it's input Pixel Format. Also the 'Derivative' parameter was renamed to 'Gradient'.
  • OP Viewer TOP - Fixed cook dependency warnings when appending anything to an OP Viewer TOP.
  • OpenColorIO TOP - Fixed crash that occurred when choosing 'Working Color Space' but no Working Color Space was set in the project.
  • Resolution TOP - Don't allow mipmap filtering on the input when 'High Quality Resize' is used.
  • Script TOP - copyNumpyArray and cudaCUDAMemory() now support 3D, 2D Texture Array and Cube Map textures.
  • Slope TOP - Default for 'Green' parameter changed to 'Vertical Luminance' and default for 'Blue' parameter changed to 'Neutral'.
  • Video Device In TOP - Fixed some issues with 8192x4320 resolution capture on Deltacast cards. Also fixed an issue where some input formats would not be converted correctly to RGBA.
  • Video Device Out TOP - Bug Fixes
    • Fixed Deltacast output not working correctly, including issues with 8K output.
    • Fixed Deltacast device output not working correctly.
    • Fixed hang that occurs when turning on 'Sync Group' for Blackmagic Design devices and fixed older Blackmagic devices not working correctly.
  • Video Stream In TOP - Improvements and bug fixes
    • Improved re-buffering behavior and added a new 'Force Re-buffer' pulse parameter to be able to force a re-buffer.
    • Avoid truncating the end of the file when streaming a non-realtime file source (ie. a complete file not a live-stream).
    • Added 'sample_rate' and 'true_length' Info CHOP channels.
    • Fixed a bug that caused extra frame drops in some cases.
  • Video Stream Out TOP - Fixed cases where 'Keyframe Interval' and 'B-Frame' parameters were ignored.
  • Added color space information to the TOP viewer's pixel color inspector.


CHOP Improvements

  • CHOP = Simplified CHOP Viewer 'Scope Tools' to a single string field for scope. Supports Pattern Matching.
  • Blob Track CHOP - Internal ID counting behavior improved. The final effect is that IDs ramp up in a much more controlled manner.
  • Copy CHOP - Fixed overcooking and crashing issues when copy/stamping parameters.
  • CPlusPlus CHOP - Fixed the OP_TimeInfo structure not having useful deltaFrames when in non-timeslice mode.
  • Delay CHOP - Better queueing behavior when frames skipped / max delay setup incorrectly.
  • Feedback CHOP - Reset on startup/initial cook similar to Feedback TOP.
  • Info CHOP - Now updates more accurately when monitoring nodes controlled by scripts.
  • Join CHOP - Changed behaviour such that the first input to the CHOP doesn't need to be non-empty for the rest of the inputs to be joined.
  • MIDI In CHOP - While using the CHOP with 'Simplified Output' = Off (ie. using non-simplified output), 1-based Index parameter was fixed for Note type MIDI messages by adding 1 to the index of the note, controller, velocity, aftertouch. This doesn't affect the channel number.Backward Compatibility - When loading older files, channel index for Note midi messages may be incremented by one if the 1 Based Index parameter was saved toggled to On in those older files.
  • Noise CHOP - Reset parameters now affect Random and Brownian ('Num of Integrals' = 0) modes as expected.
  • Parameter CHOP - Bug fixes
    • Fixed 'Rename' parameter menu issue where the menu would display names inconsistent with actual channel names.
    • Fixed 'pageindex' not returning a label nor updating on change.
  • Timer CHOP - Improvements and bug fixes.
    • New 'Run Values' parameter controls a subtle behavior of what the counters are on the frame when Start is pulsed and the running channel goes from 0 to 1. If the menu is set to Zero, the channels timer_frames, timer_samples and timer_fraction will be 0 when Start is pulsed. If set to One, timer_frames and timer_samples will be at one frame, and timer_fraction will also have stepped forward by a frame. These channels are always 0 when you Initialize.
    • Better spacing of Timer CHOP output in first timeslice to work better with non-timesliced OPs (such as the Movie File Out TOP).
    • Fixed bug where Timer CHOP's python object didn't update after reaching the done state and returning to zero.
    • Fixed bad behavior when spaces were in Info DAT names.
    • Fixed growing cook delays when external time runs past timer length.
    • 'Defer Par Changes' parameter now defaults to off.
    • Round values to the nearest sample when units are seconds. (Fixes cases of 1 2/3 seconds not being over 100 frames).
    • Timer CHOP - BACKWARD COMPATIBILITY - The first segment was always one sample short, but has now been fixed.
  • TOP to CHOP - Fixed 'Output as Single Channel Set' not working.
  • Touch In CHOP / Touch Out CHOP - The Touch In and Touch Out CHOPs work in non-timeslice mode now, sending multisample data.
  • Added menu with toggling behavior to CHOP Viewer scope tools.


DAT Improvements

  • Folder DAT - Fixed issue which caused files in subdirectories to be missed in some circumstances. Futhermore, when "All Extensions" is off, an empty value in the "Extensions" parameter matches files with no extension now.
  • Media File Info DAT - Added 'Pixel Aspect Ratio' to the list of information displayed and added a 'valid' row added to indicate if the entries in the value columns are valid. Also added python members for 'seconds' row and 'valid' row.
  • NDI DAT - Fixed a crash when used with cloning.
  • Null DAT - Fixed a bug that could cause text to disappear from read-only text DATs after clicking inside to select text.
  • OP Find DAT - Now supports different aliases for toggle values (dor example: on/1/True off/0/False).
  • Parameter DAT - Fixed 'pageindex' not returning a label nor updating on change.
  • Perform DAT - Added 'Clear' parameter that lets you clear the DAT contents.
  • Video Devices DAT - Fixed output not working for some drivers.
  • Web Client DAT - In the onResponse callback, change "set-cookies" in the header to be a list instead of a single value.
  • Web Server DAT - Fixed onWebSocketClose callback not triggered on server de-activation or restart and also made a fix to WebSocket closing so that it correctly sends a 'Close Frame' to the client.
  • Web Server DAT - Fixed a hang using 'Restart' pulse with active WebSocket connections. Also fixed onWebSocketClose callback not being triggered in some cases.
  • WebSocket DAT - Fixed a crash when a message is received but there is no 'Callbacks DAT' referenced.
  • Fixed multiple issues with the cursor position in DATs after pressing shift-TAB.


MAT Improvements

  • GLSL MAT - Improved errors when array uniforms are incorrectly assigned on the 'Vectors' page.


SOP Improvements

  • Alembic SOP - Fixed velocity attribute import for point primitives and fixed a crash that could occur dealing with velocities.
  • Copy SOP / LSystem SOP - Fixed overcooking and crashing issues when copy/stamping parameters.
  • Skin SOP - Fixed a crash when input is invalid.
  • Sphere SOP - The w texture coordinate is now zero when creating Equirectangular coordinates.
  • ZED SOP - Added a backwards compatibility warning for ZED on startup for older projects - BACKWARDS COMPATIBILITY ISSUE - ZED SOP - Now needs to point to a ZED TOP to select it's camera source.


Other Improvements

  • Custom Operators - Bug fixes and improvements
    • New opHelpURL string member exposed, allowing the operator help page to point to a custom website
    • Custom Operators now support requesting TOP data on the CPU in different color spaces, when there is a working color space defined.
    • Added query for working color space primaries. TD::getWorkingColorSpacePrimaries().
    • XYZW par type now supported.
    • Fixed issue with Custom Operators loading. POP plugins now are loaded as Custom Operators too.
    • Fixed new crash that will occur if a custom operator is loaded from ProjectDir/Plugins.
  • Script Operators Script CHOP / Script DAT / Script TOP / Script SOP - New callback onGetCookLevel added to manually specify the cook behaviour of the operator.
  • Script Operators - Bug Fixes and improvements
    • Allow setting parameter values in the onSetupParameters() callback.
    • Added query for working color space primaries. TD::getWorkingColorSpacePrimaries().
  • All Out operators now have an optional 'Select' parameter as an alternative to wired input.
  • GLSL - TDCreateRotMatrix() is now available in all GLSL shaders.
  • New console for Windows and macOS which captures low level messages more reliably, including error messages and output from subprocesses. The Environment Variable TOUCH_TEXT_CONSOLE no longer needed except to display messages before the TouchDesigner editor launches.
  • Oculus Rift folder and components in the Palette renamed to use MetaQuest as base name.
  • Some changes to how .dmp files are created to obtain more information.
  • Horizontal camera tumble direction is now correctly flipped when the camera is upside down. This applies to built-in viewers, tdu.Camera class and the cameraViewport component.
  • Fixed re-opening a minimized parameter dialog, view etc, instead of doing nothing.
  • Fixed bug where Undo shortcuts were blocked when the mouse was over an active DAT, CHOP or TOP.
  • Fixed problem displaying UTF8 characters in the Textport when it is closed.
  • macOS - Stop playback during system sleep.
  • macOS - Folder parameters and ui.chooseFolder() now display a 'New Folder' button in the open dialog.
  • Timecode - On macOS, fixed setting timecode from string when there are leading zeroes (eg. '08:08:08:08').
  • sys.executable now points to the included python executable, not TouchDesigner.
  • Fixed an issue where a python expression error in the 'Clone Master' parameter would prevent saving a component.
  • TouchDesigner and TouchPlayer now always begin with the timeline playing *unless* it is explicitly stopped in a startup script.
  • New Touch Tips added.


Operator Snippets

Introducing OP Snippets for POPs and more. There are snippets for almost all POPs and related inter-family operators, along with a bunch of new ones for other parts of TouchDesigner.

Recall there are three way to get to Snippets - right-click on names in the OP Create dialog, right-click -> Operator Snippets on any node, and the top menu bar Help -> Operator Snippets.


Backward Compatibility Issues

  • BACKWARD COMPATIBILITY ISSUE - File In CHOP - .chan files now preserve channel names instead of always defaulting to chan1, chan2, chan3, ...
  • BACKWARD COMPATIBILITY ISSUE - Timer CHOP - The first segment was always one sample short, this has now been fixed.
  • BACKWARD COMPATIBILITY ISSUE - ZED CHOP - Now needs to point to a ZED TOP to select it's camera source.
  • BACKWARD COMPATIBILITY ISSUE - ZED SOP - Now needs to point to a ZED TOP to select it's camera source.
  • BACKWARD COMPATIBILITY ISSUE - ZED - Upgraded to ZED SDK 5.0.1, this update means Pascal GPUs are no longer supported with ZED.
  • BACKWARD COMPATIBILITY ISSUE - Par Class - Comparisons now use parameter evaluations in all cases. par1 == par2 would previously only return true if it were the same parameter object, now it compares their evaluation results.
  • BACKWARD COMPATIBILITY ISSUE - ParGroup.enable and .readOnly members now returns a tuple of values instead of a single bool value, as Par's are now individually enable-able.
  • BACKWARD COMPATIBILITY ISSUE - Par Class / ParGroup Class - .readOnly can now be set per Par, not just the entire ParGroup as a whole.
  • BACKWARD COMPATIBILITY ISSUE - 'me' context no longer wrongly set to root in some cases. When executing a run() command, in some cases 'me' value was set to root instead of the location the run command originated from. This could lead to permission errors trying to access neighbouring content within a private component for example.
  • BACKWARD COMPATIBILITY WARNING - DMX Fixture POP / DMX Map DAT - Changed channel values to go from range 1-512 rather than 0-511 to match the DMX512 addressing standard.
  • BACKWARD COMPATIBILITY WARNING - MIDI In CHOP - While using the CHOP with 'Simplified Output' = Off (ie. using non-simplified output, 1-based Index parameter was fixed for Note type midi messages by adding 1 to the index of the note, controller, velocity, aftertouch. This doesn't affect the channel number. When loading older files, channel index for Note midi messages may be incremented by one if the 1 Based Index parameter was saved toggled to On in those older files.
  • BACKWARD COMPATIBILITY WARNING - DMX Fixture POP - DMX Channel Names must not include spaces now.
  • BACKWARD COMPATIBILITY WARNING - POP - A number of POP parameters were renamed and extended in size. This may affect loaded values or expressions in previous toe or tox files.
    For example some Random POP parameters (Amplitude, A, B, etc) were extended to have per-axis parameters (controlled by the size parameter), similar to the Noise POP. This required updating the RoyTimWorkshop file in the Examples folder. Please redownload the examples or be aware of these changes.
  • BACKWARD COMPATIBILITY WARNING - TDFunctions - Improved error messaging and behavior of createProperty. However, using delattr to delete a property created by createProperty will now only set the value to None.
  • BACKWARD COMPATIBILITY WARNING - ui.rolloverPanel now reverts back to None when no panel is currently being rolled over. Previously it would remain pointing to the last panel.
  • BACKWARD COMPATIBILITY WARNING - Video Device Out TOP - Using 'Sync Outputs' feature requires a Pro license.

Experimental Builds 2025.30000 - Oct 08, 2025

For experimental release notes in this branch refer to Experimental Release Notes


Official Builds 2023.10000 and earlier - Sep 22, 2025

For earlier Official Build release notes refer to Official 2023.10000 Release Notes