Check out our 2022 Official Release Annoucement!
Release Highlights
Major Architectural Updates
Apple Silicon Support
Native Apple Silicon (arm64) support is now available for Apple M1 Macs. Download the installer labelled "Apple Silicon", the filename will include "arm64".
macOS systems that do not have Apple Silicon M1 chips should use the installer labelled "Intel".
Vulkan API
TouchDesigner's graphics API is now Vulkan, OpenGL has been completely removed. The port to Vulkan is part of our current efforts to modernize TouchDesigner's engine and enables the introduction of new features that are available through modern APIs such as Vulkan and Metal.
macOS uses MoltenVK, a portability project allowing Vulkan to be used on top of Apple's Metal framework ensuring we are developing with the latest API that Apple is focusing their resources on.
- Vulkan can significantly reduce driver overhead compared to openGL.
- Compute Shaders fully supported on all platforms including macOS now.
- GLSL continues to be fully supported in TouchDesigner. Furthermore, our previous OpenGL engine limited macOS to GLSL 3.30, but the switch to Vulkan enables GLSL 4.60 in macOS which improves compatibility for TouchDesigner projects that need to run on both operating systems.
Future exciting features will be possible with TouchDesigner's new Vulkan architecture:
- Many cross-vendor extensions coming to Vulkan, such as Vulkan Video, which will allow TouchDesigner to access the hardware video encoding/decoding of all GPUs with a single API in the future.
- Some operations can be further threaded to improve performance, such as video input and outputs.
- More operations within TouchDesigner can be done with compute shaders in the future. Some TOPs can be re-written using compute shaders for performance improvments. NotchLC codec encode/decode on macOS has already been added using compute shaders.
- Vulkan's better support of HDR color space outputs is another feature we can look forward to in the future.
Working in the Network Editor
Network Comments, Boxes, and Annotations
- Add Comments and Boxes to your networks to keep them organized and easy to understand. Leave notes, documentation or instructions to yourself and others.
- From the Network Editor RMB menu, select 'Add Comment' or 'Add Network Box' to add one to your network.
- Change color using the Color Swatch in the Network Editor (press c-key to display).
- Right-click to open the parameters.
- Comments and Network Boxes are referred to as 'Utility Nodes' and do not show up in OP Find, COMP Class.findChildren(), network list mode and other searches by default.
- Annotate COMP - Fully customizable network tools can be created with the Annotate COMP.
- Embed operator viewers and panels in the network editor background, control options for interaction and enclosing operators, and specify depth placement amongst network elements.
- Comes pre-configured but can also be built from scratch as a custom tool by resetting parameters and deleting its contents.
- Pre-configured Annotate COMP includes more settings for text, color, size, and OP Viewer in the background.
DAT Viewer Syntax Highlighting
- DAT Viewers now support syntax highlighting for the TouchDesigner languages python, GLSL, JSON, XML.
- The 'Language' parameter on DAT's Common page has been expanded to include settings for which language is in the DAT.
- SET LANGUAGE for your DATs - Under the Edit menu, Edit > Auto Set DAT Language will run through DATs in your project scanning the contents of each DAT, auto-detecting the language and then setting the correct language.
- Note - DATs have different language defaults now. For example, Execute type DATs default to python, JSON DAT defaults to JSON, DATs created with GLSL TOP/MAT default to GLSL, standard Text DATs default to plain text, etc.
- The DAT Viewers also now have custom zoom settings in the RMB menu of the viewer.
Search and Replace
- A new Search / Replace Dialog that also offers search & replace functionality either globally or per component. A massive time-saver to assist with refactoring, updating, or renaming anything in your large projects. The features of this dialog were modelled from an updated Palette component called Palette:searchReplace found in the Tools folder.
High DPI Panel Rendering
A complete overhaul of panel component rendering introduces panels that are no longer rendered with fixed sized textures. The change means panel contents are drawn directly to screen, enabling resolution independent rendering and crisp details in TouchDesigner UI and control panels at any zoom level.
- TouchDesigner's UI now takes advantage of hiDPI and high resolution monitors. Text, borders, and lines are now drawn directly to screen taking advantage of all the pixels available, without the internal scaling that previously made the UI soft and fuzzy on hiDPI monitors.
- Text COMP - A new component for rendering resolution independent text in panels, it uses the Slug Library and does everything on the GPU. Read more in 'New Operators' section below.
- Built-in UI text rendering was also changed to use Slug Library and panel direct rendering, you will see this in parameter dialogs, nodes viewers and names, and built-in menus and pop-ups, etc.
- DATs viewers have been updated to use this new rendering engine as well.
- The rest of the user interface has been updated to use Text COMPs internally, bringing this to dialogs, the palette, main menus, and timeline.
- Widgets - Upgraded all fields and labels to use new Text COMP.
- NDI - Updated to NDI 5.0
SDI and Video Pipeline Upgrades
New Device Support
- Deltacast support has been added, TouchDesigner supports both Deltacast PCI-e video cards and the Deltacast FLEX product line.
- Bluefish444 SDK updated adding support for the new Khronos line of cards, 10-bit YUV capture and capturing VITC timecode data from Bluefish444 devices.
12-bit workflows are now supported
- AJA devices can now capture at 12-bit RGB 4:4:4 and output 12-bit formats when the device supports it.
- Blackmagic Design devices can now capture and output 12-bit formats.
10-bit workflows have been improved
- Video Device Out TOP - AJA 10-bit capture and output now works when using firmware that does not support color space conversions.
- Video Device Out TOP - Fixed Blackmagic Design 10-bit RGB 4:4:4 output not working correctly.
- Added support for 10-bit Window output (using environment variable TOUCH_10_BIT_COLOR=1).
- Better performance when doing 10-bit input and output.
Improvements to Video In and Out
- Video Device In TOP
- New transfer modes for Vulkan implementation found under the 'Transfer Mode' parameter.
- New 'inputSignalFormat' member, which can be used to drive the 'Signal Format' menu on a Video Device Out TOP.
- New 'signal_fps' Info CHOP channel for Blackmagic Design and AJA devices which reports the frame rate of the input signal.
- New 'rgb_input' Info CHOP channel which reports when the input is RGB 4:4:4 instead of YUV 4:2:2.
- New 'frames_skipped', 'frame_queue_length' and 'last_dma_copy_time' Info CHOP channels for debugging input signal performance.
- Added new 'frame_timestamp' and 'frame_hw_queue_length' Info CHOP channels for Blackmagic devices.
- Added a new 'Reset Stats' pulse parameter.
- Video Device Out TOP
- Added new 'Reference Source' parameter for selecting genlock reference source on Deltacast cards to sync the signal timing coming out of the cards to a house sync.
- Added 'Reset Stats' pulse parameter.
Color Correction
- OpenColorIO TOP - Upgrade to SDK 2.1.0 which provides a better renderer able to read the latest .ocio config standard format. This offers new features such as built-in LUT referencing (for the most common LUTs) which can avoid having to reference lots of external LUTs.
Hap Codec Improvements
- Hap - Added support for new Hap HDR format. A 16-bit movie format that is just as fast to playback as other Hap formats. However, does take longer to encode which you can now do with the Movie File Out TOP.
- Movie File Out TOP - Added support for encoding Hap R at a much faster speed than previously possible. Hap R uses 8-bit color depth and has higher image quality than both Hap and Hap Q . It can include alpha.
Steinberg VST® (Virtual Studio Technology)
VST is a proprietary standard for audio plug-ins that has made it possible for hundreds of third-party software programmers to create and sell virtual instruments files in popular digital audio workstations (DAWs), and now, TouchDesigner!
TouchDesigner now supports VST3 plugins via the Audio VST CHOP. Our implementation uses the JUCE framework for VST3 plugins.
- Support for VST3 plugins
- Any parameter of the VST plugin can be exposed as a TouchDesigner parameter.
- The VST plugin's UI can be displayed in a floating window.
- Filters (take input channels), Instruments (no inputs) and MIDI plugin types are supported.
- Send MIDI Events to the VST plugin with the MIDI Event functions
- Capture the MIDI events the VST plugin generates using Audio VST CHOP's callbacks DAT.
- JUCE v6.1.6
WebRTC
- WebRTC DAT - Adds support for WebRTC to TouchDesigner. A WebRTC DAT represents a peer on one end of any number of WebRTC peer-to-peer connections.
- Extensive documentation for WebRTC in TouchDesigner can be access from this starting page: WebRTC
- WebRTC video and audio input/output is done via the Video Stream In TOP, Video Stream Out TOP, Audio Stream In CHOP, and Audio Stream Out CHOP with reference to a WebRTC DAT.
- For users that wish to test, review, or demo the technology, check out ther new Palette:signalingServer, Palette:signalingClient and Palette:webRTC COMPs in the WebRTC folder of the Palette. More details in the Palette section below.
Python and ParGroups
Python
- Python - The version of Python in TouchDesigner has been updated to 3.9.5. The previous version was Python 3.7.2. To discover 'What's New' in Python since then, refer to the Python 3.8 and Python 3.9 documentation.
- Par Class.lastScriptChange is a member which gives information about when a parameter was last modified by a script, helpful when troubleshooting parameter behavior.
- tdu.tryExcept(func1, func2 or value) - Offers new try/except function which lets you make some powerful single line expressions.
- Dependency Class now has a callbacks method for those of you leveraging dependencies in your projects.
For more details on the above additions see the Python section below.
ParGroups
A ParGroup is a group of related parameters offering a more natural way to work with the ParGroup as a whole instead of its individual parameters.
Often all parameters sharing the same line in a parameter dialog belong to the same ParGroup. For example, in the Transform TOP, Translate is a type of ParGroup, with two primary Par objects: tx, ty and a unit parameter. ParGroups with only single elements are also possible. For example, the Uniform Scale parameter of the Geometry COMP belongs to a ParGroup with only one parameter.
- ParGroup - A new python object that allows you to work with parameters at a higher level.
- ParGroup Execute DAT - A new DAT similar to Parameter Execute DAT but organized around ParGroup objects.
- ParGroup_Class - A python class for accessing ParGroup objects.
Custom OPs and Extending TouchDesigner
Custom Operators
- Custom Operators now support calling Python callbacks from the C++ code.
- Custom Operators can now use the CPython API to define a custom Python class for the node. This allows directly interacting with the C++ code via Python calls.
- The provided headers for Custom Operators are now put into the 'TD' namespace. Existing plugins will continue to work, but if you upgrade to the latest header files you'll likely need to add using namespace TD; in your code to find all the definitions when recompiling your plugin.
Custom Operator TOPs (CPlusPlus TOP)
Due to large changes in the switch to Vulkan, all Custom Operator TOPs (but not other node families) will need to be upgraded to a newer API. The API is much cleaner to work with and more powerful. Upgrading should be quick for cases other than TOPs written using OpenGL mode, which have no upgrade path yet, until we add a Vulkan mode. The CPU and CUDA modes are much cleaner to work in now though. New features that are now supported include:
- Support for downloading and creating many more pixel formats.
- Can now create 3D, 2D Array and Cube textures in CPUMem mode.
- Support for uploading to multiple color buffers, with different dimensions/resolutions/formats when in CPUMem mode.
New Operators
- Text COMP - The Text COMP is used to display text in panels for building user interfaces and control panels. It is a replacement for the Field COMP, completely replacing it and adding many new features not previously available.
- Works for both static and editable text.
- Modes for displaying strings and multiline text, float and integer numbers, password fields and more.
- Text formatting options include support for Python syntax, Custom C++ Fmt and Custom Python F-String syntax.
- Number formatting options for displaying timecode, scientific, percent, and currency values.
- Supports inline formatting directives in the text for things like color, strikeouts, underlines, smallcaps, subscript, gradients, etc. For example, the code {#color(255, 0, 0);} will turn all text that follows on that line red.
- Resolution independent text drawn directly to screen at the resolution required for the panel size, resulting in perfectly crisp text at all zoom levels.
- Specification DAT allows for individual strings to be positioned and styled independently through a table-spreadsheet format. Some additional attributes supported include font size, color, skew, tracking and stretch.
- A Specification CHOP allows for similar styling control as the Specification DAT through CHOP channels instead.
- Numerical formatting can be used for values in the specification DAT.
- GPU based using the Slug Library.
- Geo Text COMP - A new component that creates text geometry directly on the GPU using the Slug Library, similar to the 2D Text COMP.
- Specification DAT allows for individual strings to be positioned and styled independently in 3D. Each row represents a separate string, and the columns (that override parameters) can include tx, ty, tz, all rotate/scale channels (as per Transform Order), plus fontsize, fontcolor, tracking etc., plus all the layout box and alignment parameters. (font/bold/italic not supported as columns)
- A Specification CHOP allows for similar string manipulation as the Specification DAT but through a CHOP interface instead.
- Supports clipping text to to a defined layout box.
- Stype Out CHOP- A new CHOP that outputs Stype formatted camera tracking data.
- FreeD Out CHOP - A new CHOP that outputs FreeD formatted camera tracking data.
- ParGroup Execute DAT - A new DAT similar to Parameter Execute DAT but organized around ParGroup objects.
SDKs Updated
- AJA - Upgrade to SDK 16.2.0.9.
- CUDA 11.2
- NDI 5.0
- OpenColorIO 2.1.0
- OpenCV 4.5.2
- Scalable Display TOP - Upgraded to SDK v8.0
- Slug Library 6.2
- Substance SDK 8.3.0
- Blackmagic Design SDK 12.2.
- Material Design Icons SDK 5.4.55. Now includes a cheat-sheet in the installer.
- MQTT Client DAT - Upgraded SDK to v1.3.9.
- USD - Upgraded SDK to v22.03.
- ZED - Upgrade SDK to 3.7.
- CodeMeter runtime kit updated to 7.40b - Use this runtime if running older versions of TouchDesigner at the same time as 2022 versions.
New Features
Timer CHOP Improvements
- New 'Length Type' parameter offers an infinite running mode where a 'Length' does not need to be specified.
- Sub Range parameters let you loop anywhere within the full time range
- plus the callback onSubrangeStart() which lets you do whatever you need to do when the timer jumps back to the Sub Start time.
- 'Sub End Action' parameter to control whether subrange ends or pauses at end of subrange.
- When working with a segments table, new 'Segments End Time' menu parameter gives more control over total length.
- To help you manage initializations that take several frames to complete, callCount is passed to the onInitialize() callback incrementing each time. Info CHOP now includes a call_count channel.
- 'segment' argument in callbacks now contains new members: 'segment.row' describes table columns defining the segment that override parameters, 'segment.custom' is a dictionary of custom columns/values, as well as calculated start/delay/lengths in various units. avoids having to fish cells out of the segments table.
- Master Time - new measurement taking into account delay times, speed and play state and all types of segment modes. It's the time that cues and goTo() would use.
- New channel output option "Master Time Count" outputs the overall elapsed time
- New 'timecode_master' in Info DAT including timecodes for current master time, countdown timecode and timecode for total master length.
- New python members .masterSeconds .masterFrame .masterSample .masterFraction which gets or sets the overall time position of the timer.
- goTo() now works correctly with segments.
- New channel output option 'Playing Timer Count' is the total number of seconds in the Play state, after Starting and is not affected by Speed, and keeps counting up when you jump to Cues, run .goTo() calls, Cycle or loop with Sub Range.
- New channel output option 'Segment Length' outputs each segment length in specified units, or the entire length when segments are not used.
- Options to output timer, delay, running, cumulative in all time units simultaneously.
- 'On Done' menu has a new option "Re-Start without Initializing".
- Fixed manual 'Start' pulse sometimes being ignored.
Ouster Support
- Ouster now requires firmware v2.x and with this TouchDesigner now supports all Ouster models.
- Added option to not display incomplete frames.
- Added support for signal multiplier. Requires firmware version 2.1 or greater.
- Output now reverts to a default black texture when the active flag is disabled.
Interpolation and Mipmapping Controls
- Panel COMPs - All Panel COMPs now have 'TOP Smoothness' parameter which controls background TOP's viewer smoothness settings. In previous builds of TouchDesigner, this was always 'Mipmap Pixels', so old files will load with that setting whereas the default for new Panel COMP's is 'Interpolate Pixels'.
- Null TOP / Out TOP - And other all other TOPs can now select their 'Viewer Smoothness' and 'Fill Mode'. Previously this was not available on 'instance-style' TOPs ie. Nulls and Outs.
- TOP preference - Default values for 'Viewer Smoothness' and 'Fill Mode' can now be controlled by a preference.
Pre-Multiply by Alpha Overhaul
- The way TOPs and MATs deal with Pre-Multiplied Alpha has been overhauled. Now they will use Pre-Multiplied Alpha when generating colors, and the MATs assume incoming textures and colors are Pre-Multiplied Alpha.
- Camera COMP / Light COMP - You can now control Pre-Multiply by Alpha settings for background color. On by default for new nodes.
- Fit TOP, Corner Pin TOP, Layout TOP, Level TOP and Transform TOP - Added 'Pre-Multiply' controls for these operators.
Miscellaneous
- FBX COMP - Added 'Texture Directory' parameter which is used as an additional search location for external texture files if they can't be found at the default location specified inside the FBX file.
- Timer CHOP - Added a new menu 'Length Type' which specifies Fixed or Infinite length. When set to 'Infinite' length, time counts without limit. This is to enable Timer CHOP to drive for generative components that have no fixed length.
- Added information about SDK version used by the operator. MMB on an operator or click "i" Info icon in the parameter dialog to view in the pop-up info.
- New Search Dialog that also offers Search & Replace functionality. Available globally or per component. Massive time-saver and helps you gain insight in your large projects.
- Component Editor Dialog now allows you to enter help text for custom parameters. See the help by alt-hovering over parameter name.
New Operator Snippets
Lots of new examples highlighting the new features in Experimental. Open Help > Operator Snippets and press the 'Newest' button. (Note: Web Client DAT example 5 hangs)
New Python
- Python - 'packaging', 'pyparsing', 'jsonschema' modules are now included in default installation.
- Python - Fixed 'ctypes' modules not loading correctly.
- Camera Class.dir - A new member to get and set the direction of the camera as a vector.
- Camera Class.frameBounds() - Now returns a camera frame width that can be used for the Ortho Width parameter of an orthographic camera.
- Camera Class.blendCamera(targetCamera, blend) -> tdu.Camera() - New function to return a camera that is a blend between the current camera and the given target.
- COMP Class.reload(path, password=None) - Reloads the component from the given file path. This will replace its children as well as top level parameters and update flags, node width/height, storage, comments and inputs (but keep original node x,y).
- COMP.panel.scrollu .scrollv - Panel scrollbars can now be controlled via panel values.
- Connector Class.description - A description for this connection. Example: 'Color Image'
- DAT.detectLanguage(setLanguage=False) - Returns the language detected in the DAT's text.
- Dependency Class callbacks method
- A modifiable list of functions. When the Dependency object is modified, it calls each function on the list.
- The function is called with a single argument which is a dictionary containing the following:
- 'dependency'- The Dependency that was modified.
- 'prevVal' - The previous value if available.
- 'callback' - This callback function, which can be removed from the Dependency callbacks if needed.
- ListCOMP Class.displayAttribs[r,c] now provides the final displayed attribute in the cell.
- NetworkEditor.placeOPs method accepts opType for creating a node. This argument can be either a string or a type.
For example:ui.panes[0].placeOPs(opType='waveCHOP') or ui.panes[0].placeOPs(opType=waveCHOP)
- OP Class.currentPage - Get or set the currently displayed parameter page. It can be set by setting it to another page or even a specific label.
For example: n.currentPage = 'Common'
- OP Class.setInputs(list) - Simplified way of setting all an operator's inputs at once, without dealing with connector details. Entries in the list can be None to disconnect specific inputs. An empty list disconnects all inputs.
For example:op('geo1').setInputs( ops('box*') )op('merge1').setInputs( [] ) # disconnect all
- Par Class.lastScriptChange - A new member which gives information about when a parameter was last modified by a script, helpful when troubleshooting parameter behavior. This is now cleared when the parameter is updated manually.
- ParGroup_Class - A python class for accessing the new ParGroup objects.
- Project Class - Renamed members Project.saveOsName/Version to Project.saveOSName/Version
- Project.resetAudioOnDeviceChange member added which controls whether or not audio devices momentarily reset when devices are added or removed to the system.
- Script CHOP.clear will now set the CHOP to the global sample rate, not necessarily 60 frames per second.
- TDJSON - New setBuiltIns argument allows built-in parameter values to be set using this system.
- tdu.forceCrash() - This will force a crash for debugging and crash recovery testing.
- tdu.PathInfo - Added 'baseName' to extract the main portion of a filename.
- tdu.tryExcept(func1, func2 or value) -> result - A 1-line try-except syntax. Second parameter can be another callable function or a direct value.
For example:
tdu.tryExcept(lambda: 1/me.par.w, 0.0) # second argument is simply 0.0 tdu.tryExcept(lambda: 1/me.par.w, me.GetDefaultValue) # Good: me.GetDefaultValue not called until needed. tdu.tryExcept(lambda: 1/me.par.w, me.GetDefaultValue()) # >> INCORRECT <<. Always calls second function even if not needed.
- tdu.validName(str) - Returns a version of the string suitable for an operator name. Converts illegal characters to underscores. Slashes are converted to underscores, to preserve forward slashes use validPath() instead.
- Replaces tdu.legalName() which erroneously supported slashes.
- Example: tdu.validName('a#bc def') # returns 'a_bc_def'
- tdu.validPath(str) - Returns a version of the string suitable for an operator path, including slashes. Converts illegal characters to underscores.
- For example: tdu.validPath('/a#bc d/ef') #returns '/a_bc_d/ef'
- UI Class.rolloverPanel returns the latest panel to get a rollover event. Takes into account click through, depth order, and other panel settings.
- WebclientDAT Class.connections - List of current HTTP connection identifiers.
- WebclientDAT Class.closeConnection(id) - Close the connection associated with the given identifier.
- WebclientDAT Class.request - Added timeout keyword.
- Added support to assign a list of OPs to a multi-OP parameter in python.
- calling eval() on multi-op parameters will now return a single op if there is only 1 result, a list if there are more than 1, and none if there are no results.
New Palette
TDAbleton Linking TouchDesigner and Ableton Live Together
- TDAbleton - Version 1.33.4 Components are now available individually in the palette. TDAbleton now supports both Live 11 and Live 10.
- UPDATE REQUIRED - You must update your TDAbleton to this version for use in TouchDesigner 2022 20k+
- Parameter option to suppress disconnect error flag.
- Utility parameter options to load Live sessions directly from TDA.
- Better handling of duplicate parameter names.
- BACKWARD COMPATIBILITY CHANGE - cuePointNum in song callbacks now holds index into cuepoint table.
TDSynchro Syncing SDI/NDI between machines
- TDSynchro v.0.1.0 release - The new TDSynchro folder contains a group of components built to synchronize NDI and SDI streams across multiple computers. It consists of a set of components for the server side sending audio/video and sync out, and a set of components for the client side to receive, cache, and syncronize the content.
- Palette:synchroFrameOut - Server side - Sends a frame index using a Sync Out CHOP or a Touch Out CHOP.
- Palette:synchroVideoOut - Server side - Sends out a video stream encoded with a frame index using either SDI or NDI.
- Palette:synchroFrameIn - Client side - Receives the frame index for sync from SynchroFrameOut on the server computer. There is one SynchroFrameIn component per client TouchDesigner process.
- Palette:synchroNDIIn - Client side - Receives incoming NDI streams and extracts timecode which is converted to a frame index.
- Palette:synchroSDIIn - Client side - Receives incoming SDI streams and extracts timecode which is converted to a frame index.
- Palette:synchroCache - Client side - Incoming video is cached with a buffer and synced to the incoming frame_sync input.
WebRTC Toolkit
- WebRTC toolkit v1.0.1 - A set of tools to get started with WebRTC in TouchDesigner.
- Palette:signalingServer - The signalingServer COMP is a component that can be used to run a signaling server within TouchDesigner.
- Palette:signalingClient - The signalingClient COMP is a component that can be used to connect to a signaling server within TouchDesigner as well as exchange messages with other clients through the signaling server it is connected with.
- Palette:webRTC - The webRTC COMP is a component that can be used to initiate real-time conferencing (RTC) between TouchDesigner instances and TouchDesigner or WebRTC compatible devices such as most Web browser capable devices, including some IoT devices. It requires a signalingClient COMP connected to a supported signaling server.
- All COMPs support signaling messages validation with JSON Schema. More details at Palette:signalingServer#JSONSchema. WebRTC signaling message types also have matching schema files.
- webRTC COMP - Includes an example for CHOP data sent over a dataChannel. More details at Palette:webRTC#dataChannels.
Camera component which opens the door to an interactive render view
The cameraViewport component has recieved a major overhaul, we encourage you to try it out in place of using other cameras.
- Palette:cameraViewport - Many updates and improvements. This component should now be used in place of arcBallCamera.
- Added camera model for display in the geometry pane.
- Added Zoom parameter to control the distance from the camera to the pivot point.
- Updated Auto-Rotate so it only rotates on one axis at a time and uses a fixed starting point to prevent drifting. Adjusted how the auto-rotate speed is determined based on the mouse movement.
- New function to return a tdu.Camera object that is a blend between two cameraViewport components.
- CameraTransform property can now be used to get or set the current camera matrix.
- Added 2 preset positions with keyboard shortcuts and menu options.
- 'n' shortcut key sets the camera to a front look instead of home.
General Additions and Improvements
- Palette:arcBallCamera - arcBallCamera was removed in favor of the modern cameraViewport COMP.
- Palette:audioAnalysis - UI and speed overhaul.
- Palette:blendModes - UI improvements, adaptive to any panel size, use of Text COMP.
- Palette:camSchnappr - Fixed upside down labels.
- Palette:chromaKey - Cosmetic and minor improvements.
- Palette:feedbackEdge - 8.0.1: Standardization.
- Palette:firmata - Reporting of digital pins can be enabled by port, for analog pins by pin.
- Palette:gal - v36.0.0 - UI overhaul of legacy gadget library, now using Text COMPs, minor improvements & simplifications.
- Palette:gestureCapture - 6.0.3 - Output more motion attributes on the output SOP. Improved examples including simple freehand draw.
- Palette:graphPlot - v10.0.3 Faster performance and more color controls. Updated to use the Geo Text COMP.
- Palette:initializeStart - Streamlined with recent Timer CHOP improvements. Now handles non-zero 'Initialize Time'.
- Palette:kantanMapper - Freeshape automatically closes when switching tools.
- palette:kantanUVHelper - Fixed an issue where kantanUVHelper could fill GPU Memory considerably.
- palette:lister 1.11
- Now uses Text COMP in config and About page for Help.
- Row data dicts now include sourceIndex key holding index into source data for lister
- Sort/Filter/Select parameter page with new features for persistence and sort indicators
- textFormat row in column define table: full f-string style formatting
- Other new features: Word Wrap, Font File, sourceDataMode: sourceIndex
- palette:materialDesignIcons - New component replacing symbolPicker.
- palette:moviePlayer - v39.3 - Now fully-driven by Timer CHOPs. UI conversion to use Text COMPs. Other internal simplifications due to fully relying on Timer CHOPs, reducing performance overhead.
- Palette:moviePlayer - Added audio device menus and improved cosmetics.
- Palette:multiMix - Fixed this component not working due to a Vulkan related bug.
- Palette:multiTouch - Modernized internally.
- Palette:opBrowser - v1.81 - Converted to Text COMP and updated to new treeLister internally.
- palette:operatorPath - The operatorPath Component is a full-featured UI element for navigating operator paths in TouchDesigner networks. It is similar to the path bar at the top of editor panes.
- Palette:particlesGpu - Complete overhaul replacing the old particlesGPU component.
- Removed geometry shaders, now using Compute Shaders.
- Now compatible with macOS.
- Numerous feature additions and new parameters for more control over forces and particle attributes.
- Parameter added for controlling the absolute number of particles in the system. This effectively controls the resolution of the shader and can help in optimization on less powerful GPUs.
- Fixed for wrongly assigned resolution setting.
- Palette:pointField - A new component that generates weight per-point based on surface proximity.
- palette:popMenu - New features: shortcuts, title, scale
- palette:presets / Palette:particlesGpu - Fixed an issue where custom user presets wouldn't be recalled properly.
- General updates and tweaks
- Palette:probe - Node boxes now labelled with the node name.
- Palette:quadReproject - v0.1.2 - quadReproject is now relying on the new parGroup class in some places.
- palette:searchReplace - Addition of many new features, paralleled in the new Search/Replace Dialog including:
- OP Type and scriptable filters.
- Search comments/utility nodes.
- Include all searched operators in results.
- Palette:sopRender - Updated the viewer to use cameraViewport component and its new zoom parameter. Switched ortho blend to a toggle parameter. Parent parameters Camera Z and Camera FOV are now bound to child Camera COMP parameters.
- Palette:splitter - v0.1.3 - splitter was updated to use the Text COMP for UI elements.
- Palette:SVG - webSvg COMP was renamed to SVG COMP.
- Palette:SVG - v0.1.3 - SVG is now relying on the new parGroup class in some places. Performance improvements.
- palette:treeLister - Incorporates new lister features and updated to use Text COMP in Config and About page for Help. Other small upgrades.
- videoPlayer component - Deprecated and removed. Users should use the Palette:moviePlayer component instead.
- palette:vstHost - New component that loads VST3 plugins into the new Audio VST CHOP and adds examples for MIDI keyboard in, a MIDI sequencer, and VST automation using the Bind CHOP.
- Widgets - Many bug fixes and improvements
- TDUI updated to 0.56, fixed update and export errors, versioning changed to Major/Minor/Hotfix.
- Updates after testing on MacOS 12.1 / Apple Silicon. Cleaned up some defaults.
- ContextPath widget operator name changed to OperatorPath.
- Gadgets folder with PathBar Gadget was added.
- Fixed a wire connection issue in the list widget.
- Fixed an issue when updating the range of 'Bind Master' it wouldn't update the widget’s range.
- TextArea component now uses the Text COMP. Edit button was removed and a more complete edit mode menu replaces the edit toggle.
- Fix to the header component to make the close button work.
- Improved handling of relative paths for file and folder selection widget.
- New Relative paths menu.
- Use project.paths toggle to allow customizing of how paths are collapsed and expanded relative to the project folder.
Bug Fixes and Improvements
- Actor COMP - In Bullet simulations fixed a collision shape bug when 'Update Collision Shape' and 'Infinite Mass' are both enabled.
- Animation COMP - Preserve custom columns in keyframe DAT tables when editing keyframes.
- Button COMP / Slider COMP - Updated to use Text COMP internally and include 'Label' and 'Value' parameters.
- List COMP - Improvements
- Fractional font sizes are now allowed. Font sizes are no longer rounded down to the nearest integer. See Backward Compatibility below.
- Text offset now supports fractional floating point numbers.
- No longer wraps around negative indices when accessing cell attributes.
- str(ListCell) returns calculated text at that cell, or blank.
- Fixed dragging onto list components when their viewer has been resized/stretched.
- Fixed dropping to use python defined items.
- Callback DAT is now docked on the outside of the OP by default.
- Added support for custom fonts using Font File attribute.
- Dragging from the off cell area now controlled by attribute, draggable member if set.
- OP Viewer COMP - New 'Interactive' parameter controls interaction with mouse and keyboard. Turning off 'Interactive' blocks all panel values from viewed panels. Furthermore, turning off 'Interactive' only affects the viewed panel and leaves the OP Viewer's own panel behaviours active.
- Panel COMP - Improvements to all Panel-type Components.
- The Drag-and-Drop callback onStartHoverGetAccept now contains information as to where the mouse entered the panel in its info dictionary. Key name coords.
- Added a 'Justify Method' menu to justify children individually (new) or as a group (previous behavior).
- Added a 'Allow UI Shortcuts' parameter to let any panel pass shortcut keys to the network editor. Panels in network editor will have shortcuts passed up to the network editor and then to the application level. Panels in perform mode will pass shortcuts up to application level.
- Parameter COMP - 'Allow Expansion' parameter controls whether or not parameters can be expanded to reveal expression fields.
- GLSL MAT - All of the sTD* samplers are now wrapped in TD*() functions. These should be used instead of the samplers directly, for better compatibility with various GPUs.
- GLSL MAT - Point Sprites must now use TDPointCoord() instead of gl_PointCoord to obtain the texture coordinates for the sprite. See Backwards Compatibility section below.
- GLSL TOP - New 'Auto Dispatch Size' parameter will automatically set the dispatch size based on the compute shader's local size and the output texture resolution. Ensures at least one thread per pixel will execute.
- Level TOP - Defaults changed so floating point input values are no longer clamped.
- Luma Level TOP - Fixed alpha being effected by options other than 'Opacity'.
- Movie File In TOP - Added support for loading RG compressed .dds files.
- Movie File In TOP - Error behavior is more consistent now when a specified URL fails to download the file.
- Movie File Out TOP - Disabled unique suffix when using Type = Image Sequence.
- Ouster TOP - Fixed missing and skipped packet numbers incrementing incorrectly when using a partial azimuth window.
- Render TOP - The default material (when a MAT is not explicitly assigned to geometry) now has a small emissive added to help make it visible in an un-lit scene.
- Switch TOP - When in Blend mode, will no longer cook 2 inputs if the switch value is an integer.
- Text TOP
- Added smart quotes support.
- Added support for floating point positions offsets for non-bitmap fonts.
- Stroke rendering now looks a bit better, but still not as good as Scalable mode.
- Improved kerning for Bitmap fonts on Windows when using english text.
- Video Device In TOP - Reduce stalls that occur when the input signal format into Blackmagic devices changes.
- ZED TOP - Now outputs a blank image when there is an error or no camera found.
- Audio Device In CHOP - Allow any rate up to and including 192KHz without modification. Previously the CHOP would set the sample rate to 44.1KHz when it was above 96KHz.
- Audio VST CHOP - We found some plugins are unstable and crash when attempting to load their plugin's state (notably Tyrell N6 VST), so we've added a 'Load Plugin State' parameter which disables the loading of a plugin's state to work around this for affected plugins.
- Joystick CHOP - Added 'Active' toggle.
- Leap Motion CHOP / Leap Motion TOP - On Windows - Leap DLLs are no longer included with the TouchDesigner installer. The new 'Library Folder' parameter should be set to the location of the correct DLL for the selected API. See Help for installation instructions.
- On macOS - Leap Motion is currently disabled. We plan to reintroduce this features in upcoming builds.
- MIDI In CHOP - Option to 'Preserve Pulses' now exposed and fixed bugs causing erratic output.
- MIDI In CHOP - Much smoother timesliced channels especially when dealing with high frequency input.
- MIDI Out CHOP - Fixed issue with random values being generated when number of channels changed.
- OpenVR CHOP - Prevent TouchDesigner from closing on SteamVR shutdown.
- Panel CHOP - Fixed crash when target panel deleted.
- Select CHOP - New options to filter channel names by numeric suffix.
- Sync In CHOP - Warning when project still in Realtime mode.
- Sync Out CHOP - Include client real-time status in info.
- Sync In CHOP / Sync Out CHOP - 'Timeout' parameter now has a units menu to select between samples, frames, seconds, or milliseconds. See Backward Compatibility section below.
- Timer CHOP - Fixed calling initialization when called from onSegmentExit callback.
- Art-Net DAT - Fixed undercooking while polling and not visible in a network.
- CHOP to DAT - Large performance optimization when working with long channels.
- Examine DAT - Fixed missing entries with matching values but different keys.
- JSON DAT - Added Table option to 'Output Format' parameter and a 'Table Column Headers' parameter to specify column names.
- OP Execute DAT - Fixed onDelete() never being called.
- Parameter Execute DAT - Fixed failing to monitor changes when a parameter default is changed.
- Script DAT .appendRows() / .appendCols() - See BACKWARD COMPATIBILITY below - Now inserts the values in correct order, when specifying a starting index. Previously the values where inserted in reverse order.
- Change TOPs with transform parameters to be consistent in direction with the Transform TOP. Added a toggle parameter for 'legacy' behavior.
- Maintain input and component inputs on an operator when loading or reloading from an external .tox file.
- On the splash screen when starting TouchDesigner was/is a button TOUCH TIPS to give you a tip while-u-wait. Now you don't have to open it each time you start - it's persistent.
- Using floating point values in integer parameters will now round the value (either through expressions or exports), instead of truncate it. See Backwards Compatibility section below.
- Added information about the SDK version used by the operator. MMB on an operator or click "i" Info icon in the parameter dialog to view in the pop-up info.
- Kinect Azure TOP / Kinect Azure Select TOP / Kinect Azure CHOP - Added SDK version to the pop-up info.
- Nvidia Denoise TOP / Nvidia Background TOP / Face Track CHOP - Added SDK version to pop-up info.
- Automatically created parameters will no longer be classified as 'custom parameters'. This applies to Parameter DAT filters, dialog options, and python access. Affects following operators: C++/Custom Operators / Audio VST CHOP / Substance TOP / Notch TOP
- Many generator SOP anchor parameter behaviors have been flipped to be more sane, the old setting is now called 'Reverse Anchors'.
- File > Import File... now loads all file types supported in TouchDesigner, bringing it inline with Drag-and-Drop support.
- Added undo for python attribute binding.
- Added drag-drop support for .json file extensions
- Fixed color picker dialog parameter UI when dealing with ranges other than 0-1.
- Added wildcard dependency to ops function search so new nodes will trigger a recook.
- Fixed issue with self parameter dependency (me.X depending on me.Y) not getting updated when parameter Y is updated during cook.
- Using page scope on parameter dialogs will still result in consistent values for par.pageindex. Also a number of fixes to Par.pageindex updating.
- Allow binding to named object attributes. Expression format is 2 tuple: (object, attribute), example: (op('box1'), 'nodeY')
- Allow binding to python None value, which return blank string or 0. Allows binding expressions to evaluate to None, without error when source not available.
- Fixed Bind expressions involving 'me.curPar'
- Expressions on Toggle parameters that are put into constant mode are properly saved and loaded now.
- Fixed some issues with menu dropdown lists not updating correctly in custom parameters.
- ctrl+c now interrupts Python scripts in macOS. Try it for hangs.
- DATs no longer handle character input when alt is pressed.
- Refactoring panel layout for more efficiency and better performance.
- Reconnecting audio devices better handled by Audio CHOPs.
- Improvements to pop-up help performance and size for DATs.
- toecollapse/toeexpand now support duplicate operator names in which only case changes.
- Optimizations in cooking, data dependency improvements, updating parameter value optimizations, extension initialization improvements.
- Set all components of a parameter when using the popup menu after dropping a parameter onto a node.
- macOS - Fixed external editor launching when setting appropriate file extensions at the OS level. For example, setting .py file extensions to open with Sublime or VSCode in the OS means opening and external editor for DATs set to py language will open in the respective editor when not using Edit > Preferences > DATs explicit editor settings.
- Update to the Color Swatch for Nodes, Comments, Network Boxes, and Annotates. Old files will be transitioned to the new color palette on loading.
- DAT Viewer improvements for syntax highlighting and language support.
- DAT language interface relabelled to 'Parameter Language' and 'Contents Language' to better differentiate them.
- Renamed the 'Node' option for DAT language to 'From Parameter Language'.
- Added Execute Language to DAT Info popup to show which language scripts will be executed in.
- Enabled auto-indenting again for DATs.
- Improved how the home key in DATs handles indentations.
- Fixed automatic horizontal DAT scrolling not accounting for the line number width.
- Fixed clipping of DAT line numbers when the node is very small.
- Fixed a problem writing formatting codes into DATs that used syntax coloring.
- Added JSON syntax coloring for DATs.
- Added Tscript syntax coloring for DATs.
- DAT syntax colors are now defined in ui.colors.
- Fixed issue with color codes appearing when clicking in the opening message box.
- DAT language is now set based on the file extension when dragging text files into a network.
- 'Auto Set DAT Language' will now set the language for hidden DATs, ignore Tscript nodes, and better handle clones and readmes.
- Improvements to the default language for more DATs to properly support syntax highlighting.
- DAT language now defaults to plain text when set to input and nothing is connected.
- DATs now default to 100% zoom instead of Auto.
- Textport improvements and fixes.
- Fixed limit displaying very long DATs in the textport.
- Textport font size now updates immediately when the preferred font size changes.
- Fixed right-click history menu in the Textport.
- Updated EULA
Backward Compatibility
- BACKWARD COMPATIBILITY - wrnchAI CHOP - Has now been disabled due to the company no longer selling licenses.
- BACKWARD COMPATIBILITY - Sync In CHOP / Sync Out CHOP - 'Timeout' parameter now has a units menu to select between samples, frames, seconds, or milliseconds.
- BACKWARD COMPATIBILITY - GLSL MAT - shCoeffs is no longer part of the TDLight block, and is instead in a new buffer array named uTDEnvLightBuffers[].
- BACKWARD COMPATIBILITY - GLSL MAT - When working with Point Sprites, you must now use TDPointCoord() instead of gl_PointCoord to obtain the texture coordinates for the sprite.
- BACKWARD COMPATIBILITY - PBR MAT - Removed 'Mult Alpha by Light Luminance' feature, as it didn't work with the more alpha-correct-behavior of the shader now.
- BACKWARD COMPATIBILITY - The python object type for the Nvidia Flow Emitter COMP has been renamed to flowemitterCOMP from flowEmitterCOMP to be consistent with naming conventions.
- BACKWARD COMPATIBILITY - Light COMP - Removed defunct 'Shadow Mapping Projection' view type from projection menu.
- BACKWARD COMPATIBILITY - List COMP - Fractional font sizes are now allowed. Font sizes are no longer rounded down to the nearest integer. Example: Exporting 4.9 to an integer parameter will now be considered a value of 5, not 4.
- BACKWARD COMPATIBILITY - Shared Mem In TOP / Shared Mem Out TOP - These TOPs can only share memory with other TouchDesigner processes running 2022 builds, shared memory TOPs do not work between 2022 and 2021 or earlier builds. Shared memory CHOPs and COMPs do not have this restriction and work fine accross all builds.
- BACKWARD COMPATIBILITY - SVG TOP - Has been removed for now because the OpenGL feature it was based on does not exist in Vulkan. Please use Palette:webSvg to load SVG files in TouchDesigner.
- BACKWARD COMPATIBILITY - Script DAT .appendRows() / .appendCols() - Now inserts the values in correct order, when specifying a starting index. Previously the values were inserted in reverse order.
- BACKWARD COMPATIBILITY - Script OPs that were accessing the script methods outside the onCook callback must now be locked.
- For example, calling things like scriptCHOP.appendChan() from outside the scriptCHOP's onCook() method is no longer allowed since it causes random behavior. Now if those methods must be called, lock the Script CHOP first. This goes for any of script OP methods that modify operator content.
- BACKWARD COMPATIBILITY - Using floating point values in integer parameters (either through expressions or exports) will now round the value, instead of truncate it. This may cause different behavior for fractional values exported to menus or other integer parameters.
- BACKWARD COMPATIBILITY - The tscript command 'jpeg' has been removed. The 'quality' keyword in OP.save() can be used to control JPEG quality instead.
Known Issues
All Builds
- Some panel borders and buttons elements may not display correctly on hiDPI monitors.
macOS Specific
- Leap Motion CHOP / Leap Motion TOP - Currently disabled on macOS. We plan to reintroduce this features in upcoming builds.
macOS Apple Silicon Build Specific
- The following operators have not been ported yet
- Movie File In TOP / Movie File Out TOP - The Cineform codec SDK does not look like it will be updated for Apple Silicon, so it will not be an option in these builds.
Experimental Builds 2022.20000 - Apr 27, 2022
For experimental release notes in this branch refer to Experimental Release Notes
Official Builds 2021.10000 and earlier - Feb 07, 2022
For earlier Official Build release notes refer to Official 2021.10000 Release Notes