Official Build - 2023.10000 Series
Check out our 2023 Official Release Annoucement!
Release Highlights
OAK-D AI Sensors
OAK-D cameras offer a range of high-resolution cameras with depth vision and on-chip machine learning. OAK-D can run computer vision tasks on-device and send the processed images or data to TouchDesigner on both Windows and macOS. For example, an OAK camera can compute human skeleton landmarks for a live RGB image and send both the landmarks and image to TouchDesigner. OAK is short for the OpenCV AI Kit, which originated through online crowd-funding. Luxonis has expanded the line of OAK hardware and also released several open-source libraries such as DepthAI that run on the OAK.
The aim of integrating TouchDesigner with OAK cameras is to facilitate novel interactions with the rest of the TouchDesigner environment while providing low-latency, high throughput performance with the OAK hardware. If you think a pure Python example that doesn't involve TouchDesigner is running faster than one which does, please let us know. For example, we aim for the frames-per-second of an OAK's RGB camera received in TouchDesigner to be at least as fast as what you would receive in pure Python with DepthAI and OpenCV.
Three new OAK-D operators work together to implement the OAK functionality: The OAK Device CHOP is the main interface to the camera devices. The OAK Select CHOP extracts channel and dictionary data from the camera results of a OAK Device CHOP. The OAK Select TOP extracts processed images from the camera. Each DepthAI model running on each camera will have one OAK Device CHOP plus one or more of the OAK Select OPs.
Machine Learning
The following features utilize machine learning models in their operation and are only supported on Windows OS. If you do not have the devices required to use them, you can save bandwidth and time by using the new Web Installer which does not include the models in the initial download, allowing you to select only the features you need.
- Body Track CHOP - This new CHOP uses Nvidia Maxine AR SDK to perform body pose estimation on any video or camera input. It can track bounding boxes and 34 key points of one or more human bodies, with optional joint angles, in 2D or 3D.
- ZED - Major overhaul including an SDK update and the addition of body tracking support in the ZED CHOP and a 'Neural' depth camera mode in the ZED TOP.
- Orbbec - Body tracking in the Kinect Azure CHOP now also works with Orbbec Kinect-compatible-cameras (Femto Mega, Femto Bolt). Furthermore, general support for color/depth/pointcloud has been added for a wider range of Orbbec cameras via the Orbbec TOP.
- Nvidia Upscaler TOP - This new TOP uses Nvidia Maxine Video Effects SDK to upscale the resolution of an input video. The Upscale mode is faster and offers a 'Strength' parameter. The Super Resolution mode is higher quality and doesn't offer a Strength parameter, but it does have an optional 'Artifact Reduction' toggle.
Timecode Tools
Numerous Timecode tools have been woven into TouchDesigner. A new Timecode CHOP can create and manage SMTPE timecode and a large selection of OPs in TouchDesigner that deal with time have been updated to be driven by timecode or include a timecode member so they can be managed effectively. For a full list of these operators, refer to the Timecode page.
- Timecode CHOP - A new CHOP for managing Timecode
- Added custom length parameters and extra countdown field to Info DAT.
- Added countdown output channels.
- Check out the new OP Snippets for this operator.
- Timeline CHOP - Added a new parameter to drive timeline time with a timecode object.
- LTC Out CHOP - Added a parameter to drive the LTC Out timecode with a Timecode Object/CHOP/DAT.
- Timer CHOP - Added option in the 'Time Control' parameter to drive the Timer CHOP directly with timecode.
- Timecode Class - A new class to access timecode features via python throughout TouchDesigner.
- Many operators that can use timecode now have new timecode members to access their timecode directly via python.
Apple ProRes
Full support for Apple ProRes in TouchDesigner on both Windows and macOS.
- Movie File In TOP - Support for ProRes decoding. Uses hardware decoding on macOS when available.
- Movie File Out TOP - Support for ProRes encoding. Uses hardware encoding on macOS. TouchDesigner's ProRes encoding has been certified by Apple for correct implementation of the format.
- ProRes is equally supported across TouchDesigner, TouchPlayer and TouchEngine.
Laser Control
- Laser Device CHOP - The Laser Device CHOP can send laser points to supported laser devices: EtherDream, Helios, and ShowNET. ShowNET support comes to TouchDesigner for the first time! The devices can be connected to a laser using an ILDA cable, except in the case of ShowNET when an onboard DAC is used. Applications of the Laser Device CHOP include displaying computer-generated shape animations or other special effects of a light show. The Laser Device CHOP replaces the deprecated EtherDream CHOP and Helios DAC CHOP.
- Laser CHOP - Added look-up CHOP for vertex hold min/max angles and added 'Blank State Channel' for help with debugging.
New Operators
Hardware Device Operators
- MoSys CHOP / MoSys TOP - The MoSys CHOP receives data from a MoSys camera tracking system. The channels can be used to control a virtual camera and to implement lens distortion via the MoSys TOP as part of a virtual production system.
- Orbbec TOP - Support for color, depth, and pointcloud capture has been added for a wide range of Orbbec cameras. Furthermore Kinect-compatible Orbbec camera such as the Femto Mega and Femto Bolt models also support Kinect body tracking through the Kinect Azure CHOP.
- SICK TOP - This new TOP can be used to retrieve point cloud data from a SICK LIDAR sensor. Sensor results are packed into a floating point texture where each pixel represents one point of data and each color channel stores one field such as x, y or z position. The TOP utilizes the 'sick_scan_xd' SDK and supported sensors are listed on the project's GitHub page.
- Audio Devices DAT / Video Devices DAT - Two new DATs which list all input and output audio/video devices. Callbacks are included to create actions when devices are added or removed.
Micellaneous Operators
- Bloom TOP - The Bloom TOP creates an intensity gain and glow effect around brighter parts of the image.
- GLSL COMP - The new GLSL COMP uses GLSL shaders to render an image in a panel directly to the screen. It is useful for rendering pixel accurate UIs as the resolution will automatically adapt to the DPI scaling of the screen it is displayed on.
Engine COMP Overhaul
- Engine COMP - New features and improvements.
- Enabled OP Viewer parameter on Common parameter page to show a selected viewer.
- Added 'Asset Paths' parameter to make relative paths based on the Project .toe file or the External .tox file.
- Added TouchEngine process parameters on the Advanced parameter page. This allows you to quit or launch the process independently from loading your component.
- Added 'On Engine COMP Create' parameter which determines what happens when a .tox is loaded (also affects when a new Engine COMP is created through copy & paste).
- Errors on the loaded component are now reported in the pop-up info text via middle-mouse button .
- Added a new onError() callback to the Callback DAT.
- Allow use of user selected operator colors (use color palette to set).
- New Init Start parameter page modelled after Init Start on the Timer CHOP including a similar set of core control parameters.
- Added “Ready when” parameter to specify when the transition to Ready state happens.
- Added onInitialize() callback.
- Added 'Go To Done' parameter and 'On Done' parameter to determine behavior. This include extras like an onDone() callback, a "done" channel, and "goToDone()" Python command similar to a Timer CHOP.
- Added a 'Pre-Roll' parameter that will run the component for the specified amount of time before setting it to Initialized state.
- Added a docked Info CHOP
- More channels added in 'General' Info Type.
- Added “Initialize Start” Info Type group of channels reporting on the Status of the Init Start features mentioned above.
- Added 'TouchEngine Status' Info Type group of channels for process and component state to better understand the TouchEngine process lifetime.
- Renamed Engine Perform to 'TouchEngine Perform'.
- Added Info CHOP channels output_cook_abs_frame, engine_absolute_frame, engine_absolute_seconds, and initialize_fail.
- Added a docked Info DAT
- Added “engine_pid” to Info DAT.
Lightweight Web Installer for Windows
The best option for installing TouchDesigner on Windows is our new lightweight web installer. This installer packages the core elements of TouchDesigner into a significantly smaller download. During installation you can select the features of TouchDesigner you require and it will download them on-the-fly. If you don't have hardware like a Kinect Azure camera, ZED camera, or Nvidia GPU on your system, save time and bandwidth by skipping these items. With the addition of more devices, SDKs, and features using machine learning models, the full installer is now over 2.4GB and will continue to grow. The web installer is a great option for anyone working with a reliable internet connection. The download size is smaller, the installation goes more quickly, and TouchDesigner uses less space on your system. Only install what you need!
Add additional features after the initial installation by going to Settings > Add or Remove Programs and locating your TouchDesigner application. Then select Modify from the options menu and the Modify installation dialog will open allowing you to select the features you'd like to add.
We will always continue to maintain a full installer for those who need everything or need to install TouchDesigner on machines where there is no internet connection.
For info on how to use the web installer see Install_TouchDesigner#Dealing_with_Installer_Components_of_the_Web_Installer
More New Features
Python 3.11
- Python upgraded to 3.11 - Runs 10-60% faster for everything, better error messages, more new and shiny!
- Full update details What’s New In Python 3.11 and What’s New In Python 3.10. (TouchDesigner's previous python version was 3.9.5)
Custom Sequential Parameters
Sequential Parameters are sets of parameters that can be dynamically repeated multiple times, grown and shrunk using the +/- buttons in the parameter dialog. We have revamped their naming and added support to custom parameters so users can now define their own sequential parameters. These can defined directly with python or through the Component Editor Dialog.
All sequential parameter sequences (both built-in and custom) now start with a new sequence parameter. The name of this sequence parameter defines the prefix of all the following parameters in that sequence block.
The new naming format is: <sequence name><block index><parName>.
Every sequence now has a "sequence name" which is added as a prefix to every parameter that is part of the sequence. This is followed by a "block index", which is the index of the block (set of associated parameters) within the sequence.
For example, the name/value pars in a Constant CHOP used to be called name0/value0, name1/value1, etc. The new names are: const0name/const0value, const1name/const1value etc. Other notable examples are extensions (sequence name "ext") and internal operators (sequence name "iop") TouchDesigner will attempt to understand the old names as aliases, but there may be backwards compatibility issues in some cases.
- TouchEngine and Engine COMP also fully support sequential parameters now.
- TouchEngine - Added a the new sequence parameter type, added a function to change sequence block count.
- TouchEngine - For hosts using older library versions, expose sequences as a series of regular parameters.
- Engine COMP - Correctly display, edit and update parameter sequences, including changes to block count.
Working with External Files
- New parameters on the Common page of all Components offer better control of managing external file locations and paths.
- New parameter 'Relative File Path Behavior' allows you to use relative paths that are local to the Project (.toe file) or to the location of the External COMP (.tox file).
- We invite you to read our article introducing some changes and new features.
macOS Hardware Decoding
- Movie File In TOP and Video Stream In TOP now supports hardware decoding when available (this is depends on the Mac's hardware). To enable on the Movie File In TOP, turn on the 'Hardware Decode' parameter toggle on the Tune page.
- Supported codecs vary by hardware, potentially works for Apple ProRes, H.264, HEVC (H.265), P-JPEG, VP9, AV1.
- When possible it does direct-to-texture decode - image memory is always on the GPU.
Nvidia 40-series GPU Improved Support
- The machine learning models for Nvidia operators using Maxine SDKs have been updated to include models for the 40-series Geforce and Professional A-series Ada generation GPUs.
COMP Features
- Text COMP - Added new 'Drop Shadow' parameter to draw a drop shadow under the text.
- Engine COMP and TouchEngine - Fully support sequential parameters now.
- TouchEngine - Added a the new sequence parameter type, added a function to change sequence block count.
- TouchEngine - For hosts using older library versions, expose sequences as a series of regular parameters.
- Engine COMP - Correctly display, edit and update parameter sequences, including changes to block count.
TOP Features
- Video Stream Out TOP - Now works with Non-Commercial licenses.
- Movie File Out TOP - Added a new 'Limit Length' parameter to automatically stop recording when the output reaches a set length.
- Noise TOP - Added 'Derivative (slope)' toggle to get the gradient of the noise in the RGB channels. Only works in monochrome mode.
- Render TOP - The 'Image Output' feature has been reworked. Multiple can now be created, with custom names, array sizes and formats. This is found on the new 'Image' page.
- Spectrum TOP - Revamped the Spectrum TOP to use Vulkan via the VkFFT library, deprecating the CUDA and OpenCV usage. It results in much faster performance and cross platform support for both Windows and macOS.
- Text COMP / Text TOP - New options for selecting fonts via a new 'Typeface' parameter instead of the previous 'Bold' and 'Italics' parameters.
- Video Device Out TOP - On Deltacast devices we added support for 12-bit output and custom resolution output for HDMI/Displayport output.
CHOP Features
- Audio Device In CHOP - Added 'Rate Mode' parameter for ASIO devices that can pull the sample rate from the device rather than manually override it.
- Audio VST CHOP - Added support for custom bus layouts and new parameters for controlling the VST plugin's playhead.
- Bind CHOP - New 'Exclusive Hold' parameter. Locks out remaining inputs for this period when change detected.
- FreeD In CHOP - Added 'Camera ID' parameter to allow filtering of camera packets and receiving date from multiple cameras.
- Leap Motion TOP / Leap Motion CHOP - Gemini v5 tracking is now supported on macOS Apple Silicon. Go to the Leap Motion CHOP help page to locate the downloads required and instructions for installation. The Gemini v5 SDK was also updated for Windows.
- OptiTrack In CHOP - Previously named the NatNet In CHOP, we renamed it for clarity.
- Pattern CHOP - Added a new 'Cyclic Ramp' ramp type.
- Pulse CHOP improvements
- Added a second input to specify custom pulse indices.
- Multiple channels now supported.
- Options to set minimum spacing values for pulses if they overlap.
- Pulse height determined by the number of repeated indices.
- Option to specify units for the pulse indices in samples, frames, or seconds.
- Added 'Connect' option to Interpolate parameter menu which gives true linear interpolation.
- Timer CHOP - Numerous improvements
- Active toggle expanded to: Never / Always / While Running / While Playing. 'While Playing' only cooks if any timers are active and 'Play' is enabled.
- New 'Defer Parm Changes' parameter controls whether or not parameter changes take affect immediately or after the next init/start cycle.
- Transform CHOP - Added 'Xform Matrix/CHOP/DAT' parameter to apply a matrix transform directly.
- Trigger CHOP - Added menu option 'Update once per Cycle' to update trigger shape parameters only once each cycle.
DAT Features
- Insert DAT - You can now add rows and cols via cell expressions and added a new 'Replace if Duplicate Name' toggle to replace existing column/row names if new ones have the same name.
- Keyboard In DAT - Overhaul to how characters are handled with the goal to improve international language support and offer a more consistent interface with keyboard input.
- BACKWARDS COMPATIBILITY ISSUE - The 'key' column will no longer return special characters such as !@#$%^&*(). These will now be 1234567890 for better consistency with other shortcut workflows.
- New optional 'web_codes' column, which matches the key code names that Chromium expects.
- Reworked callback to take a namedtuple, add 'webCode' as a new value.
New Python
Python Version 3.11
- Python 3.11 - Runs 10-60% faster for everything!
- Create better error messages with Exception.add_note().
- PEP 678: Exceptions can be enriched with notes
- Full update details here: What’s New In Python 3.11
- Python 3.10 - New "match" statements. Similar to "switch" in C++ and other languages. Full update details here: What’s New In Python 3.10
opex() Method Instead of op()
- OP Class / td Module - New opex() method that works identically to op(), except it will raise an exception if it fails to find the node instead of returning None as op() does. This is the new recommended way to get nodes in parameter expressions, as the error will be more useful than 'NoneType has no attribute 'par', that is often seen when using op(), for example.
Reset Parameters via Python
- Par Class - reset()
- ParGroup Class - reset()
- Page Class - resetPars()
- OP Class - resetPars(parNames='*', parGroupNames='*', pageNames='*', includeBuiltin=True, includeCustom=True)
reset() -> bool - Resets the associated parameters to its default state, returns true if anything was changed.
op('geo1').par.tx.reset() op('geo1').parGroup.t.reset() op('geo1').pages[0].resetPars() op('player').customPages['Setup'].resetPars() op('player').resetPars(includeBuiltin=False) # only reset custom
Default Parameters via Python
- Par Class / ParGroup Class.defaultBindExpr .defaultExpr - Get or set the default bind expression on custom parameters.
n.par.Float1.defaultBindExpr = 'me.par.Float2' n.par.Float1.defaultExpr = 'me.time.frame'
- Par Class / ParGroup Class.defaultMode - For custom parameters get or set the default evaluation mode. Resetting the parameter sets it to .defaultExpr expression, so using the previous example n.par.Float1.defaultExpr = 'me.time.frame', then the expression would be set to me.time.frame.
n.par.Float1.defaultMode = ParMode.EXPRESSION
- Component Editor Dialog - Added features for default parameter modes.
- TDJSON - Updated to work with default parameter modes.
General Python Additions and Improvements
- App Class.systemFolder - A new member that contains the installation folder for TouchDesigner system files.
- App Class.processId - A new member reporting the current process's ID.
- App Class.tempFolder - New member which reports the temporary files location.
- AudiofileinCHOP Class.timecode - Gets the timecode of the audio file read index.
- ClockCHOP Class - Added a new timecode member.
- COMP Class.delTD() method is now properly called on extensions when operator is deleted.
- DAT Class - row(),col(),rows(),cols() have a new bool argument `val`. `val=True` returns list of just cell entries instead of list of cells.
- Dependency Class.setVal(val, setInfo=None) .setInfo(Keyword, Optional) - Optional information passed to the modified callback. Allows users to give more specific information when setting a value.
- ListCOMP Class - Added .dropRow .dropCol members. The current row/col about to be dropped over.
- MidiinCHOP Class.timecode - A new getter that grabs the timecode representation of the last set of quarter frame messages.
- OakdeviceCHOP Class - Changed masterTimecode/runningTimecode to return a tdu.Timecode rather than a string. Also added a timecode getter that simply returns masterTimecode, similar to the Timer CHOP.
- OakselectCHOP Class / OakselectTOP Class - Added a timecode member that returns the referenced OAK Device CHOP's master timecode.
- OP Class received a number of updates to work with the updated Sequential Parameters features.
For example:
n.seq['Color'] # returns None if not found n.seq.Color # raises exception if not found
- OP Class.curBlock - The SequenceBlock of the currently evaluated parameter.
For example:
me.curBlock.par.B # use in parameter A of each block
- Page Class.sort() - Allows Par and ParGroups as arguments (in addition to strings).
- Page Class.appendMenu(size=1) - Now supports up to 4 menus in a single ParGroup.
- Page Class / Cell Class - Comparisons to 'None' vs None now work properly.
- PanelCOMP Class - Added .dropReady for the current state of the drop operation. True when the drop will be accepted.
- PanelCOMP Class - BACKWARDS COMPATIBLITY ISSUE - Panel.interactMouse/interactTouch will respect 'Enable' parameter toggle.
- Par Class - Custom parameter order attribute is now a float and no longer limited to integers.
- Par_Class - .defaultMode .mode undoable when changed in script.
- Project Class.quit() - Added exitCode keyword argument, to manually specify an exit code on quitting.
- Sequence Class.blocks - This now returns a list of SequenceBlock Class not list of tuples of Pars.
BACKWARD COMPATIBILITY sequence[3] sequence.blocks[6] etc now returns a block, whose elements are now ParGroup objects, not Par objects.
- Sequence Class - New par and parGroup members which return a list (one from each block) or None.
For example:
n.seq.Info.parGroup.T # entire list n.seq.Info.parGroup.T[3] # ParGroup from 4th block. n.seq.Info.parGroup['T'] # None if not found, else entire list
n.seq.Info.par.Tx # entire list n.seq.Info.par.Tx[3] # ParGroup from 4th block.
- SequenceBlock Class - For working with a block of parameters in a sequence.
Can be accessed via:
- Sequence.blocks
- Sequence[index]
- Iterating through Sequence
Block members include .index .owner .sequence .par .parGroup
For example:
for p in Block (iterating) len(Block) (number of pars) Block[index] (each par)
- Timecode Class improvements
- Timecode Class.cycle - A new member for getting/setting whether the timecode will cycle once it reaches its max (default value: True)
- Timecode Class.setLength - A new method for setting a custom length.
- Timecode Class.countdown - A new member of the Timecode object that is the difference between the current timecode value and the length.
- TimerCHOP Class.playingTimecode/cumulativeTimecode - Has been changed to return a tdu.Timecode object rather than a string
- TOP Class improvements
- TOP Class - cudaMemory() now supports a 'stream' keyword argument. Use this to make use of a cudaStream_t/CUstream stream to do the work on.
- TOP Class - Added newestSliceWOffset member for use with Texture 3D TOP generated textures in Python.
- TOP Class.pixelFormat - New member that returns the pixel format as a string.
- scriptTOP Class - copyCUDAMemory() now supports a 'stream' keyword argument. Use this to make use of a cudaStream_t/CUstream stream to do the work on.
- run function. The first argument can now be an optional function instead of a string. This can be easier to work with rather than constructing an executable line of code with embedded quotes.
run( lambda: print('A') ) run( lambda x: print(x), 'B' ) run( print, 'C', 'D', 'E')
-
- run(func) now accepts keywords. ie. run( myfunc, 'C', a=1, stop=True)
- tdu_Module.match - BACKWARDS COMPATIBILITY ISSUE - Now supports space separated patterns and single ^ terms properly. tdu.match interprets spaces in the pattern argument as separators.
eg:
tdu.match( "^foo", ["bar"] ) # ["bar"] tdu.match( "* foo", ["bar"] ) # ["bar"]
- TDJSON - BACKWARD COMPATIBILITY ISSUE Including 'eval' in extraAttrs argument list will now create a new "eval" entry in the JSON instead of replacing the value in "val".
- Parameter members .expr, .bindExpr, .defaultExpr, .defaultBindExpr assigned to None in scripts will now be empty string instead of the string 'None'. BACKWARDS COMPATIBILITY ISSUE
- When Python parameter expression is blank, return None, not empty string. BACKWARDS COMPATIBILITY ISSUE
New Palette
- TDBitwig - TDBitwig is a set of TouchDesigner components that allow for communication between Bitwig Studio and TouchDesigner. For more information read our announcement here.
- TDBitwig - About TDBitwig, a summary explanation and full list of the components available in the system.
- TDBitwig User Guide - In-depth user guide covering installation usage and troubleshooting.
- TDAbleton v2.3 - Added Change Global OP Shortcut feature to allow multiple instances, which allows you to connect to multiple Ableton Lives in one project.
- v2.1.1 - Fixed defaults on the TDA package.
- v2.2.0 - Currently playing arrangement clip info is now reflected in abletonTrack parameters
- v2.2.0 - RunRemoteCode extension functions will no longer work when Listen Only is set on tdaMaster component. This can be overridden with an "overrideListenOnly=True" argument.
- v2.2.0 - Added "Back To Arrangement" toggle on abletonSong - return tracks to arrangement control
- Palette:cameraViewport - v0.39.0 - Added comments to help explain setup.
- Palette:camSchnappr - Inverted UI interaction: ctrl+LMB will add points and ctrl+RMB will remove them. Interaction directly with the mouse (using no modifier keys) will control the camera now. Also upgraded P, Cd etc. identifiers in shaders.
- Palette:debugControl - Version 1.4.0 - Added ability to print timestamp.
- Palette:depthProjection - Fixed the direction of the XY axes.
- Palette:kantanMapper - All wireframe materials use Topology mode now. Removed tscript from Window COMP parameter and fixing typo in page name of KantanUVHelper.
- Palette:kinectPointcloud - v1.0.2 - Updated to use the latest pointRender and cameraViewport components.
- Palette:logger - v2.2.5 - A new palette component wrapping around the Python Logging Library and interface to add additional Loggers easily in your TouchDesigner projects.
- The logger COMP follows the propagation rules of the python library.
- A Stream Handler was added to handle Textport log items. Therefore, when interacting with the logger COMP or the logger object directly, it will in most cases have an impact on both handlers (if used simultaneously). For example, when the setting changed is impacting the Logger object rather than an handler, such as the log level, or propagation. Status Bar is not using an handler.
- Palette:particlesGpu
- Life can be randomized or derived of an Effector input. Particles with alpha=0 will not be rendered.
- New 'Lifemodifier' parameter to multiply remaining lifetime with effector value.
- Fixed source interpolation disabled when source input provided.
- Particles are not created from source points that have alpha 0.
- Simulation now stays stopped when timeline is paused and viewer is tumbled.
- New default compositing setting (Discard Alpha) and fixed source only creating particles if source alpha greater 0.
- Palette:pointRender - v1.2.2 - Updated to use the latest cameraViewport component.
- Palette:popMenu - Fixed issue where title width wasn't incorporated into menu window width. Other cosmetics. Menu updates size when pars change.
- Palette:quadReproject - v0.1.7 - Added support for multiple lights in the 'Lights' parameter.
- Palette:recorder - A new folder called TDVS for general video server components. The first component is the recorder component which wraps a Movie File Out TOP for easier recording and encoding of videos.
- Palette:searchReplace - Now searches the evaluated value of parameters as well as val, expr, bindExpr.
- Palette:sickEngine - A new component to wrap the SICK TOP in an Engine COMP for connecting to more than one sensor in the same project.
- Palette:stoner - Fixed Grid Warp mode not properly adjusting bezier surface weights.
- palette:lister and palette:treeLister - Bug fixes and improvements
- Fixed a bug where reordering rows in lister can mangle a sync'd input table if not all Table DAT cols are displayed in lister.
- Added defaultAutoColDefine and exposed 'Word Wrap' parameter in config components.
- Fixed bug where SetCellLookName function would override striping.
- palette:treeLister - Further improvements
- Optimized row selection and selection reporting. Exposed more inner members: IDObjDict, ObjIDDict, GetObjectFromID, GetIDFromObj (see Palette:treeLister for details).
- Added 'Alphabetize Tree' parameter (default True) in case you don't want to alpahabetize, which was forced in previous versions. Also fixes a bug where treeLister could sometimes sort twice when it only needs to sort once.
- Added scrollbar controls to Tree parameter page.
- Added 'Expand All' pulse button and ExpandAll function to expose all tree nodes.
- Fixed bug where FromPathsSelectRows would miss the first row.
- Fixed bug where input mode with wirePath and parentPath columns would fail.
- Fixed error messages on initial load.
- Palette:webBrowser - Improvements
- Added multitouch input to utilize the newly added multitouch input support in the Web Render TOP.
- Added a Crop page and parameters for an additional cropped output (new second TOP output called Output 1).
- Palette:webRTC - Fixes and tweaks to the signaling components and webRTC components.
- Internal loggers are all updated to the latest version of the Logger COMP.
- TransitMap removed (before eventual replacement).
Bug Fixes and Improvements
SDK Updates
- Upgrade to Nvidia Optical Flow to 4.0.11 - Optical Flow TOP
- Upgrade to Nvidia Video Effects to 0.7.2 - Nvidia Background TOP / Nvidia Denoise TOP / Nvidia Upscaler TOP
- Upgrade to Nvidia AR SDK to 0.8.2 - Face Track CHOP
- Upgrade to JUCE v7.0.2 - Audio VST CHOP]
- Upgrade to Kinect Body Tracking SDK to 1.1.2 Kinect Azure CHOP
- Upgrade to Ableton Link SDK v3.0.6 - Ableton Link CHOP
- Upgrade to Leap Motion SDK Windows v5.13.2 and MacOS v5.14.0 - Leap Motion TOP / Leap Motion TOP
- Upgrade to DepthAI 2.22.0 - OAK-D
- Upgrade to OpenCV 4.8.0.
- Upgrade to R3D SDK 8.4.0, used in the Movie File In TOP for decoding RED Camera codec in .r3d file format.
- Upgrade to RealSense SDK 2.54.2 - RealSense TOP / RealSense CHOP
- Upgrade to Substance SDK v9.0.1, this enables the use of E.6 Materials - Substance TOP -> PBR MAT
- Upgraded to ZED SDK 4.0.7 - ZED TOP / ZED CHOP / ZED SOP
COMP Improvements
- Container COMP - Fixed a problem with the positioning of popup windows when panel opacity is below one.
- List COMP - Don't edit cells if modifier (shift/ctrl/alt/etc) keys are used. Also fixed an out-of-bounds issue calling rollover with (max_row, max_col) instead of (-1,-1).
- Text COMP - Improvements and bug fixes
- Fixed an issue where text members were out of date if the view hadn't been displayed yet.
- onTextEditEnd() callback is now inside the Text Value Change undo block to allow additional events to be added to the undo step.
- UI Events are now flushed before the OP Viewer TOP captures a panel viewer to ensure it is up to date with the latest cook which fixed a case where Text COMP data might be a frame behind.
- Annotate COMP - New 'Utility' parameter access to utility flag (when On, hides from searches).
- Camera Blend COMP - Fixed the Line MAT using incorrect aspect ratio values when rendering with a blended camera.
- Engine COMP - Tox files now have the external tox settings disabled on load.
- Slider COMP - Fixed default component to accept changes to u and v via script.
- Text COMP - Added a new parameter to parse escape sequences like '\n' and '\t' when using the Specification DAT. Also fixed vertical alignment when using the Specification DAT.
- Geo Text COMP - Fixed 'Font Color' not working.
- Engine COMP - Fixed an issue which caused a Python error for old-style onInitialize callbacks which don't return a value.
- Text COMP - Fixed a bug when loading custom font files and added a warning message when the font fails to load.
TOP Improvements
- TOP - Channel mask on the Common page now works correctly for Mono and Alpha Textures.
- TOP - Pixel inspector tool now gives pixel-centered UV values.
- CHOP to TOP - Fixed 16-bit float formats not working.
- Movie File Out TOP - NotchLC - Fixed bug in NotchLC encoder that caused files to end up larger than expected.
- Video Device In TOP - Info DAT no longer includes output devices.
- GLSL TOP - Added 'TOPs' parameter to reference other inputs via parameter instead of a wired input.
- Leap Motion TOP / Leap Motion CHOP - Added SDK version to the info popup, updated v5 Gemini SDK for both Windows and macOS
- Lookup TOP - Dark/Light UV values will no longer be clamped at 0 on the low end.
- Noise TOP - Fixed Simplex2D noise so that when the 'Derivative (Slope) parameter is toggled On, RGB channels get the XYZ noise derivatives.
- Normal Map TOP - Fixed bug that could case NaN output values when using inputs textures with values greater than 1.
- Nvidia Background TOP / Nvidia Denoise TOP / Nvidia Upscaler TOP - Fixed handling of 32-bit input textures. Note: output will still be 8 bit fixed.
- Optical Flow TOP - Improvments
- Adding new 'Pre-Shrink' parameter.
- BACKWARD COMPATIBILITY ISSUE - 'Cost Output' values are now normalized to 0-1, instead of 0-255.
- Point File In TOP / Point File Select TOP - Multiple changes that are backward compatibility issues
- BACKWARD COMPATIBILITY ISSUE - Altered how the output texture size is determined based on the number of points. Might result in different texture sizes than previous versions.
- BACKWARD COMPATIBILITY ISSUE - Field parameters are now stored as strings rather than indices.
- Video Device In TOP - Improved AJA support to work with dual UHD inputs for Kona HDMI devices.
- Video Stream In TOP - Added 'Active' parameter.
- Web Render TOP - Added support for H264 playback and multitouch input and fixed a crash which could occur when loading a project.
CHOP Improvements
- Audio File In CHOP - Added support for driving the audio file index with a timecode reference.
- Audio VST CHOP - Added timestamp argument to onReceiveMidi() callback.
- AudiovstCHOP Class.send/sendExclusive - Added timestamp keyword argument.
- Info CHOP - Added "All" info type to display all info available.
- Logic CHOP - 'Convert Input' menu indexing fixed.
- Lookup CHOP - Added 'Extend Condition' menus with options for 'Use Input' and the standard extend options found elsewhere ie. (Hold, Cycle, etc).
- Body Track CHOP - Static input images are now reprocessed when the parameters change.
- DMX Out CHOP - Fixed bug with sACN/KiNET/ArtNet where only the first channel might be sent in Packet Per Channel mode.
- Face Track CHOP - Face mesh is now included in the Config/Models folder and the 'Mesh' parameter now defaults to the included mesh file. Also made sure that static input images are reprocessed when the parameters change.
- LTC Out CHOP - Added 'High FPS Behavior' menu with the options to cycle or duplicate frames for high frame rate scenarios.
- Timer CHOP - Various Improvements
- Next Segment / Prev Segment now updates masterSeconds properly.
- Stop resetting masterSeconds each cycle.
- Fixed dropped pulse values.
- Audio Device In CHOP - Added the option to select device by index rather than name for ASIO and CoreAudio.
- Clock CHOP - Fixed 'Since Program Start' mode having incorrect start time.
- Transform CHOP - Fixed Quaternion Lerp and Slerp input blend behaviour.
- Audio Stream In CHOP - Added an 'Active' parameter.
- Body Track CHOP / Face Track CHOP - Fixed tracking issues when using a floating point input texture.
- Lag CHOP - Clamp 'Lag' and 'Overshoot' parameters to never be less than zero
- Timecode CHOP - Added 'Cycle' toggle.
DAT Improvements
- MQTT Client DAT - Added topic argument to onPublish callback.
- OP Find DAT - 'Include Utility Off' no longer includes children of utility nodes.
- UDP In DAT / TCP/IP DAT / Touch In DAT / Touch Out DAT / OSC In CHOP - Updated the way TCP and UDP sockets bind to ports. We now can issue more warnings depending on the status of the port and how the binding of the socket went, for example, if the port is already in use or not. Windows only.
- Art-Net DAT - Removed local port parameter as it is redundant and can conflict with the receiving socket.
- Folder DAT - Improved performance by optimizing filesystem check and fixed a crash which could occur loading a project.
- This optimization also improves performance when a file changes in any File In operators.
- Render Pick DAT - Now works without any DAT input connected, so the Python pick() method can be used without a dummy input.
- Web Server DAT - Fixed onServerStop callback not triggered when 'Restart' parameter is pulsed. Furthermore, an optimization to shut down the web server when its parent component cooking is disabled was added.
- Parameter DAT - Added page name filtering and a toggle to output a column with the page that each parameter belongs to.
MAT Improvements
- Line MAT - Now supports draw vectors for point primitives.
- PBR MAT - Can take advantage of the upgrades to the Substance TOP SDK which supports the latest Substance Designer .sbsar materials.
SOP Improvements
- SOP operators now support saving their contents as the following formats dae, 3ds, dxf, obj (in addtion to fbx).
- Add SOP - Fixed bug that prevented the point sequence parameters from working.
- Blend SOP - Fixed crash when blend weights reached 0.
- Text SOP - Fixed crash in some cases when using a font file.
- Point SOP - Fixed incorrect new attribute values in some cases when an attribute is deleted.
- Texture SOP - BACKWARD COMPATIBILITY ISSUE - Fixed UV stretching and shearing of 'Face' type mapping. This changes the behaviour of 'Face' type option.
Other Improvements
- Search / Replace Dialog now searches the evaluated value of parameters as well as val, expr, and bindExpr.
- Improved accuracy of GPU timing calculations.
- Fixed password dialog sometimes not opening on top of other windows.
- Fixed floating network editors sometimes being always on top.
- Fixed parameter dialog to not show default parameters in non-default mode (eg: './help' and 'repositioncomp' in containers)
- Fixed Global OP shortcuts not registering properly on external tox files.
- Fixed spurious errors when using Page.appendPar()
- TOP viewer pixel value picking (when viewer is active) now works correctly for 3D textures and Cube Map textures.
- Added definitions for media keys on keyboards i.e. AudioVolumeUp, BrowserBack, etc
- Added drag and drop support for FLAC audio files.
- dragEnd callback 'droppedOn' now distinguishes between Par and ParGroup.
- Custom Operators - Added 'cookCount' member to the OP_NodeInfo class.
- Privacy - Improved support for nested private components. A private component's children now have access to their parents, even if those parents have their own privacy.
- Network Utilities: Comments, Network Boxes, Annotates - Comments, Network Boxes and Annotates now have a 'Utility' parameter for turning on and off utility mode.
- Fixed incomplete panel layouts when parents employ children scaling.
- Tox files are now saved with the external tox parameter turned off.
- Fixed being able to use backspace or delete in input boxes are are not editable.
- Improved the behavior of the value ladder on Remote Desktop/VNC/Synergy/Parsec etc.
- Fixed dialog window (ie. colorpicker) sizes slowly getting larger when repeatedly opened.
- Fixed a case where unicode characters in a external file's filepath could cause a crash.
- Stopped auto-connecting of component inputs or outputs when drag and dropping or pasting a component into the network editor.
Licensing
- On Windows, TouchDesigner's License System Codes are now generated differently to reduce the chance of a system code change when applying Windows Updates. Old keys will work in this 2023.10k branch, however, new keys created in this 2023.10k branch will not work with older versions of TouchDesigner. We also have release an update to 2022.20k branch so any builds released after July 10 2023 will also work with the new keys created in this 2023 version. In summary - If you want to use 2022 and 2023 versions with the same key, either a) create your key using 2022 builds, or b) use a 2022 build released after July 10 2023.
- Errors are now provided when Floating Cloud and Dongle licenses are expired for the current build.
- Floating Cloud licenses won't be consumed anymore if a better Dongle license is present on the system. Furthermore, floating cloud or dongle licenses won't be used if a higher level local license is installed through the Key Manager Dialog.
Panel Layout Optimization
- Lots of work was done to speed up internal panel layout code resulting in many control panels performing significantly faster. If you discover regressions or control panels that are still extremely slow, please contact us via the bugs forum.
Operator Snippets
- New snippets for Body Track CHOP, Timecode CHOP, Bloom TOP and numerous updates to other OPs.
Backward Compatibility
Change for keys on Windows systems
- TouchDesigner's License System Codes are now generated differently to reduce the chance of a system code change when applying Windows Updates. Old keys will work in this 2023.10k branch, however, new keys created in this 2023.10k branch will not work with older versions of TouchDesigner.
- We have released an update to 2022.20k branch so any builds released after July 10 2023 will also work with the new keys created in this 2023 version. In summary - If you want to use 2022 and 2023 versions with the same key, either a) create your key using 2022 builds, or b) use a 2022 build released after July 10 2023 (yet to be released).
File Compatibility
⚠️ Project .toe files saved in 2023 Official builds can not be loaded back into previous versions of TouchDesigner such as 2022 or 2021 builds.
Backward Compatibility Changes
We try to make upgrading to new TouchDesigner branches as painless as possible, but sometimes changes are made that are not compatible with the feature set in older builds. These are difficult decisions and we do not take them lightly, but we move forward with such changes when it is clear that they will benefit the TouchDesigner platform in the long term.
- BACKWARD COMPATIBILITY ISSUE - tdu.match interprets spaces in the pattern argument as separators.
- BACKWARD COMPATIBILITY ISSUE - The Keyboard In DAT's 'key' column will no longer return special characters such as !@#$%^&*(). These will now be 1234567890 for better consistency with other shortcut workflows.
- BACKWARD COMPATIBILITY ISSUE - Parameter expressions assigned to None in scripts will now be empty string instead of the string 'None'.
- BACKWARD COMPATIBILITY ISSUE - When Python parameter expression is blank, return None, not empty string.
- BACKWARD COMPATIBILITY ISSUE - Panel.interactMouse/interactTouch will respect a panel's 'Enable' parameter toggle.
- BACKWARD COMPATIBILITY ISSUE- Optical Flow TOP - 'Cost Output' values are now normalized to 0-1, instead of 0-255.
- BACKWARD COMPATIBILITY ISSUE - TDJSON - Including 'eval' in extraAttrs argument list will now create a new "eval" entry in the JSON instead of replacing the value in "val".
- BACKWARD COMPATIBILITY ISSUE - Point File In TOP / Point File Select TOP - Altered how the output texture size is determined based on the number of points. Might result in different texture sizes than previous versions.
- BACKWARD COMPATIBILITY ISSUE - Point File In TOP / Point File Select TOP - Field parameters are now stored as strings rather than indices.
- BACKWARD COMPATIBILITY ISSUE - Sequence Class.blocks - This now returns a list of SequenceBlock Class not list of tuples of Pars. sequence[3] sequence.blocks[6] etc now returns a block, whose elements are now ParGroup objects, not Par objects.
- BACKWARD COMPATIBILITY ISSUE - Several built-in parameters have been renamed for consistency, starting with index 0, etc. Older files will load correctly and get updated when saved, but note that files saved in 2023.10k builds will cause issues if loaded into any previous builds.
- BACKWARD COMPATIBILITY ISSUE - Texture SOP - Fixed UV stretching and shearing of 'Face' type mapping. This changes the behaviour of 'Face' type option.
- BACKWARD COMPATIBILITY ISSUE - Parameter order gets overridden when changing a Parameter's page member.
Known Issues
Please report all issues to the Bugs Forum, remember to include build number.
- Bloom TOP - 'Bloom Alpha' toggle is not calculating alpha correctly, look for an update soon.
- Body Track CHOP - Can sometimes crash if parameters are manipulated too quickly.