Close

Release Notes/2025.30000/experimental

Current Experimental Build 2025.30060 - Jun 06 2025 - Download Here

Experimental builds include new features still in development and testing, features are subject to change or even be removed. For the stability and reliability required for performances and project deliveries, use the production ready Official Builds.

Known Issues and Backward Compatibility warnings below should be read carefully.

Download Here

Known Issues

Please report all issues to the Bugs Forum, remember to include build number.

  • macOS - Some POPs examples may not be working on macOS. We are currently working around Mac GPU architecture limitations and some bugs with respect to Vulkan-Metal (MoltenVK). If you experience a hard crash when using POPs, macOS's graphics driver may not recover and a system reboot will be required to get regular performance back in TouchDesigner.
  • POPs example files - Some examples in in the POPs Sample Package may not work as intended. There are some bugs in the POPs Guide examples. Fixes to these files will be released continuously, check back often.
  • Assigning new colors to operators, annotates, network boxes and comments via the color palette in the lower-left corner of the Network Editor is currently broken.
  • Palette:tdPyEnvManager - When running this tool you'll see empty command line shells opening. Let the process continue and confirm success using the 'Status' field of the component.
  • In geometry and POPs viewers we have a number of new display modes. POPs primitive attributes where the topology is on the GPU may not be working with these new display options yet.
Check the Experimental tabs in wiki
  • Experimental Documentation - While we are far along in documentation, there are still numerous features and new operators that are awaiting documentation. Note that when you are reading the wiki, if there is documentation for Experimental Builds it will be found in the articles "Experimental" tab.


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 these changes as preparation for moving your projects to 2025.30000.

  • 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.


Build 2025.30060 - Jun 06, 2024

Key Highlights

Point Operators - POPs

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 - always 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.


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 debug any such conflicts.

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, something that previously wasn't trivial using raw rotational values in CHOPs.


Hardware Device Operators

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 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)
    • New 'Closed Shape Overlap' parameter which 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.
    • New 'Interpolate Colors' parameter enables color interpolation between points.
ST2110
  • ST2110 In TOP / ST2110 Out TOP - New 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.
Other Devices
  • Serial Devices DAT - New DAT that lists the available serial ports and identifies if a port is in use or not.
  • ZED - Overhaul - CHOP and SOP now point to ZED TOP, etc.


3D Texture Support

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


Metadata support


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. 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 so ^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.


Color Space Workflow

Coming soon in the next release! The color space settings are not exposed yet but will become available in our next build in a couple of weeks time. For now you can disregard the new color space parameters you'll find, mostly in TOPs and other operators that have a color parameter.


Operator New Features

  • All Out operators now have an optional 'Select' parameter as an alternative to wired input.
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'.
  • Geo Text COMP - Added 'Face Camera' parm 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.
    • 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' 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 - Added 'Placeholder Text' that is displayed when the text contents are empty.
  • Window COMP - A new '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.
TOP Features
  • Movie File In TOP - New features.
    • Allow 'Index' parameter to 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.
  • Movie File Out TOP - New features.
    • Added support for VVC (Versatile Video Coding), also known as H.266.
    • 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.
  • Script TOP - Added parameter 'Modify Outside of Cook' which when 'On' allows the TOP's output to be updated by an external script.
  • Video Device In TOP - Extended device support and improvements.
    • 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 10-bit output 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 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 Out TOP - AAC audio, some tuning parameters and improvements.
    • Added support for AAC audio for RTMP and SRT modes, as such, the default audio codec has been changed to AAC.
    • Added parameters to force the Mux Size and the VBV Buffer Size.
CHOP Features
  • Audio Render CHOP - Added added a new 'Simulation' mode that supports multiple sources, scene meshes, and reflection.
  • Clock CHOP - Added '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.
  • DMX Out CHOP - Better support for serial and DMXKing devices.
  • Script CHOP - Added parameter 'Modify Outside of Cook' which when 'On' allows the CHOP's output to be updated by an external script.
  • 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
  • Multi Touch In DAT - New features
    • New parameter 'Occlude Panels by Hierarchy' - Enable 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.
  • Table DAT - Performance optimizations to make large tables cook significantly faster.
  • Table DAT - In the DAT viewer's right-click menu, there is now an option to toggle the 'Auto Resize Columns' behavior on/off.
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, the 'Screen Space Coordinates' option previous found under the 'Texture Coord' menu is now located in the 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.


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.
  • 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.
  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.
  • 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.
  • ParGroup.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.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.
  • 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.maxSize - Returns the maximum number of parameter elements for this ParGroup.
  • ParGroup.defaultSize - Returns default number of parameter elements for this ParGroup.
  • ParGroup.suffixes - Returns a list of suffixes used to name the parameter elements of this ParGroup.
  • isPar, isParGroup renamed to isSamePar, isSameParGroup
  • 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'
  • 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).
  • Sequence Class.Sequence[name or index] - Finds a block by its position or block name as described above.
  • Sequence Class.moveBlock - Now takes optional keyword 'num', describing number of blocks to move.
  • Sequence Class - moveBlock, insertBlock, deleteBlock arguments can be names, integers, or SequenceBlock objects.
  • sequenceBlock Class.moveBlock(blockFromIndex, blockToIndex) - Moves the specified blocks.
  • SequenceBlock Class.destroy() replaces Sequence Class.destroyBlock(index) which is now deprecated.


  • SysInfo Class - Added new members .GPUName, .GPUID, and .GPUPlatformID.
  • td Module / 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.
  • Tdu Module.tdu.isPointCloudFile() - Added to identify if a file is a point cloud file.
  • 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.messageBox() - No longer is called recursively from Execute DAT Frame Start/End callbacks.
  • UI Class.rolloverPage - Returns the parameter dialog 'page' currently under the mouse, or None. Similar to UI.rolloverParGroup below.
  • UI Class.rolloverParGroup - Returns ParGroup currently under the mouse, including parameter labels.
  • 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)
  • Extension changes
    • onDestroyTD called instead of __delTD__ when extension destroyed (still backward compatible).
    • onPostInit renamed to onInitTD


New Palette

  • Palette:cameraViewport - Improvements
    • 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.
  • 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.
  • Palette:lister - colDefine and look OPs now use "topFill" to define how TOPs in cells fill the cell.
  • Palette:lister - Fixed an issue where column headers didn't use justify setting provided in the colDefine table.
  • Palette:logger - v2.6.1 - 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.
  • Palette:particlesGpu - Looping time to avoid bad distribution of hash function upwards of 24 hour runtime.
  • Palette:pointRender - v2.0.0 - Updated to POPs workflow.
  • Palette:popDialog - Added text entry modes including password, float, and int. Available in parameters or Open command.
  • Palette:popMenu 1.3.1 - Submenus will now work when timeline is paused.
  • Palette:quadReproject - v1.0.0 - Complete rework. Component is now almost exclusively relying on parSequences and expressions.
  • TDAbleton - 2.5.3
    • 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.
  • Palette:tdPyEnvManager - Initial release. A component to sideload and manage third-party python and conda environments.
  • Thread Manager - First public release. A new system component and a set of palette components designed to facilitate Python threading in TouchDesigner.
  • 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.


Bug Fixes and Improvements


COMP

  • 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.
    • Fixed crash which could occur under GPU resource starvation.
  • FBX COMP / USD COMP - Added 'Import POPs' parameter which will use POPs in place of SOPs when importing.
  • FBX COMP - Normalize bone weights of the imported assets.
  • Geo Text COMP - New 'Face Camera' functionality.
    • 'Face Camera' behaviour changed such that it rotates about the anchor point of the layout box.
    • 'Width Affected by 'FOV' and 'Lift Towards Cam' parameter now works with Orthographic camera type.
    • Added 'Lift Towards Camera' parameter.
    • Make 'Depth Scale S Curve' parameter independent from 'Face Camera'.
    • Fixed 'Face Camera' and 'Depth Scaling' to work for all align modes and anchorUVs.
    • Fixed 'Face Camera' relative orientation of appended blocks.
    • 'Face Camera' parameter works properly with the 'Specification DAT's 'append' flag.
  • Panel COMPs - 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.
  • 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.
  • Window COMP - New features and improvements.
    • A new 'Prevent Display Sleep' toggle parameter has been added to keep your display from going to sleep.
    • Renamed "monitor" to "display" in parameters, menus and warnings.
    • 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.


TOP

  • 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.
  • Corner Pin TOP - Added 'Mapping' parameter to the 'Extract' page for option between Bilinear and Perspective extraction.
  • Displace TOP - 'Vertical Source' parameter default value changed to Green.
  • 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 - Bbug fixes.
    • 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.
  • Noise TOP - 'Derivative' now supported for Simplex 4D and Perlin 4D noise. For derivatives of 4D noise types, the 'Alpha' parameter will be disabled and the alpha channel will have the 4th component of the derivative.
  • OP Viewer TOP - Fixed cook dependency warnings when appending anything to an OP Viewer TOP.
  • 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.
  • Render Pass TOP - Can no longer have a different pixel format than the Render TOP it's downstream from.
  • Render Select TOP - Fixed crash that can occur when deleting this node in some cases.
  • 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'.
  • Syphon Spout In TOP / Syphon Spout Out TOP- Upgrade to SDK 2.007.014. Addws support for Sender FPS in Info CHOP when enabled in the Spout Settings dialog.
  • Video Stream In TOP - Improvements
    • 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.
  • 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.
  • ZED TOP - Added both support for SVO2 playback and support for network streaming data from another machine using ZED native streaming.
  • ZED Select TOP - Added this new operator to select different images from a ZED TOP.

CHOP

  • 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.
  • Count CHOP - Added 'Count Up' and 'Count Down' momentary parameters to allow counting with no input connected.
  • Count CHOP - 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.
  • Delay CHOP - Better queueing behavior when frames skipped / max delay setup incorrectly.
  • DMX Out CHOP / DMX In CHOP - Added better support for DMXking devices, re-categorized parameters.
  • Feedback CHOP - Reset on startup/initial cook similar to Feedback TOP.
  • 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, ...
  • 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.
  • Laser Device CHOP - Helios - Added support for full 16-bit color and position, as well up to 4 optional user channels (user1, user2, user3, user4).
  • Pangolin CHOP - Added support for using POPs an an input. Also added 'Zone' attribute override for POP inputs.
  • Parameter CHOP - New features and bug fixes.
    • Added 'Sequences' parameter to better parse Sequential Parameters.
    • 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.
  • Render Pick CHOP - Fixed a bug in the render pick event that caused a crash in the callback.
  • 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.
  • 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.
  • 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' 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.
  • ZED CHOP - Added a backwards compatibility warning for ZED on startup for older projects - BACKWARDS COMPATIBILITY ISSUE - ZED CHOP - Now needs to point to a ZED TOP to select it's camera source.

DAT

  • DATs - Since newlines are supported in DAT cells, display them as symbols and allow them to be selected/deleted/copied etc.
  • Audio Devices DAT / Video Devices DAT - Now refreshes properly with fewer redundant intermediate callbacks.
  • Folder DAT - When "All Extensions" is off, an empty value in the "Extensions" parameter matches files with no extension.
  • Media File Info DAT - 'valid' row added to indicate if the entries in the value columns are valid. Also added python members for 'seconds' row and 'valid' row.
  • OP Find DAT - Now supports different aliases for toggle values (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.
  • 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.

SOP

  • 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.


MAT

  • MAT - All MAT operators now have a bypass flag.
  • MAT - New 'Texture Sample Mode' menu found in all texture map's extended parameters to select between regular texture coordinates, screen space coordinates, or the new tri-planar mapping coordinates.
    • Added 'Texture Sampling Mode' menu to PBR MAT Metallic map, Roughness map, Ambient Occlusion map
    • Added 'Texture Sampling Mode' menu to PBR MAT Specular Level map
    • Added 'Texture Sampling Mode' menu to Alpha map
    • Added 'Texture Sampling Mode' menu to Height maps, Emit maps, Darkness Emit maps
    • Added 'Texture Sampling Mode' menu to Diffuse maps, Specular maps, Normal maps
    • Added parameter disabling for 'Texture Sampling Mode' menu of Multi-Texturing map.
  • Point Sprite MAT - New menu 'Sizing Model' allows the depth based scaling of the sprites to be either via the Constant/Attenuate parameters, or Perspective Correct scaling like most geo objects.
    • Added 'Size Affected by FOV/OrthoWidth' parameter to make scaling FOV independent or dependent.

Misc

  • Geometry Viewer - A number of new display options have been added for working with POPs. These options can be found in the viewer's right-click menu.
    • Toggle Hilite Dot Per Point - Displays an overlay dot for each point in the scene (POPs only).
    • 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 blue relative to the magnitude of the value. The smallest value in the scene appears as a solid red dot and the largest as a solid blue 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 'Misc' page. Here you'll now find settings for Scale Attribute Overlays, Scale in Screen Space, Thin Attribute Range, and Thin Attribute Percentage.
  • ZED - Now supports Blackwell GPUs (Geforce 5xxx), no longer supports Pascal GPUs (Geforce 1xxx, P-series Quadros).
  • 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 - Allow setting parameter values in the onSetupParameters() callback.
  • GLSL - TDCreateRotMatrix() is now available in all GLSL shaders.
  • Custom Operators - XYZW par type now supported.
  • Some changes to how .dmp files are created to obtain more information.
  • All In operators now have an optional 'OP' parameter as an alternative to wired input.
  • 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.
  • sys.executable now points to the included python executable, not TouchDesigner.


Operator Snippets

  • POPs Snippets coming soon!

Backward Compatibility Changes

  • 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.