Release Notes/2023.30000/next
Build 2023.31592 - xxx xx, 2024
Note: Experimental builds no longer support Non-commercial licenses.
New Features
TDILibrary
- TriPlanar texturing ...
- PBR MAT / Phong MAT - Added new menu 'Texture Sampling Mode' to PBR MAT and Phong MAT with options Regular, Screen Space Coordinates and Triplanar.
- Screen Space Coordinates backwards compatibility working with the old 'Texture Coordinates' menu.
- Triplanar texture mapping working with the 'Triplanar' menu option, where the Triplanar texture attribs need to be generated first via the Texture Map POP or Texture SOP
- describe all the features added to MATs and texture OPs
- TOP To CHOP working with 3DTextures or 2D Arrays
- All Out operators now have an optional 'Select' parameter as an alternative to wired input.
- Serial Devices DAT - New DAT that lists the available serial ports and identifies if a port is in use or not.
- Script CHOP - Added parameter 'Modify Outside of Cook' which when true allows the CHOP's output to be updated by an external script.
- Script TOP - Added parameter 'Modify Outside of Cook' which when true allows the TOP's output to be updated by an external script.
- Individual parameter disabling within a ParGroup
- Thread Manager - See also...
- macOS - Minimum OS version supported now macOS 12.0 Monterey.
- DMX Out CHOP - Better support for serial and for DMXKing devices.
New Python
- Individual parameter disabling within a ParGroup
- AbsTime Class - .frame .seconds now pause with main timeline.
- Camera Class.frameBounds - Added a new 'padding' keyword expressed as a fraction of the viewport height e.g. 0.1 puts a minimum 10% padding around all sides.
- Camera Class / ArcBall Class - Added errors for unexpected arguments and keywords.
- COMP Class - layout(ops, horizontal=False, vertical=False, gridRows=0) - Addede a method to automatically layout operators.
- DAT Class.csv - Get or set the contents as csv format. Unlike .text supports newlines in cells.
- datexecuteDAT Class - sizeChanged added to info argument.
- datexecuteDAT Class - onRow(Col)HeadersChange now provides prevDAT
- datexecuteDAT Class - onTableChanged(dat, prevDAT, info) now includes DAT in its previous state as well as a description of which rows/columns were removed/added.
- datexecuteDAT Class - onTableChanged() info argument now contains:
rowsChanged - a list of row indices with different contents rowsAdded - the list of added *header* indices (in dat) rowsRemoved - the list of removed *header* indices (in prevDAT) colsChanged - a list of col indices with different contents colsAdded - the list of added *header* indices (in dat) colsRemoved - the list of removed *header* indices (in prevDAT) cellsChanged - the list of cells that have changed content sizeChanged - bool, true if number of rows or columns changed
- listCOMP Class - Rolling outside cells now shows popup help defined in table attribute.
- mediafileinfoDAT Class - Added a python member for all the information rows of the DAT.
- Page Class / Cell Class - Comparisons to 'None' vs None now work properly.
- Par Class - Comparisons now use parameter evaluations in all cases. BACKWARD COMPATIBILITY par1 == par2 would previously only return true if it were the same parameter object, now it compares their evaluation results.
- Par Class - enablePar Get or set the single parameter's enable state within the ParGroup. For the entire ParGroup use ParGroup.enable or Par.enable. Can only be set on Custom Parameters.
- ParGroup - enableExpr now supports lambda format to enable individual Par enabling within the ParGroup. Example: n.parGroup.enableExpr = 'lambda x: x==2'. #only enables third component
- ParGroup - .enable member now returns a tuple of values instead of a single value, as Par's are now individually enablable.
- BACKWARD COMPATIBILITY - The return type of ParGroup.enable is now a tuple, not a single bool.
- Par Class / ParGroup Class - .readOnly can now be set per Par, not just the entire ParGroup as a whole.
- BACKWARD COMPATIBILITY - ParGroup.readOnly now returns a tuple of individual values, not a single bool.
- Par Class - isPar(x)
- ParGroup Class - isParGroup(x) - Returns True if argument passed refers to same parameter as object does. For example: n.par.tx.isPar(p) returns True if p is the same parameter as n.par.tx
- isPar, isParGroup renamed to isSamePar, isSameParGroup
- Par Class / ParGroup Class - .sequenceBlock returns the sequenceBlock Class the object belongs to, or None.
- Run Class when executed from a DAT, Cell, or td, now remains persistent. Allows you to check the state after its completed.
- Properly setup context 'me', when executing a run() command. In some cases 'me' value was set to root instead of the location the run command originated from. This could lead to permission errors trying to access neighbouring content within a private component for example. BACKWARD COMPATIBILITY - 'me' context no longer wrongly set to root in some cases.
- ParCollection Class / ParGroupCollection Class is now iterable. You can iterate through all the parameters of an operator, a sequence or even a block:
debug(list(n.par)) debug(list(n.par.S.sequence.blockPars)) debug(list(n.par.S.sequence[1].par)) debug(list(n.parGroup)) debug(list(n.par.S.sequence.blockParGroups)) debug(list(n.par.S.sequence[1].parGroup))
- Sequence Class - reorderBlocks(index1, index2..) - Reorder the specified blocks, leaving the rest in place.
- Sequence Class - sortBlocks(key=lambda block: (block.namePar or block[0]).eval(), baseName=, reverse=False)
- key - A function that is passed every block in the sequence to return a sortable value. By default it evaluates the blocks main name parameters, if defined, else the first parameter of the block.
- baseName - If specified, uses the parameter of each block with that baseName as the sort value.
- reverse - If True, reverses the order of the sort.
For Example: .sortBlocks(baseName='value', reverse=True) # sort on reverse *value parameters in the sequence .sortBlocks(key=lambda block: block.par.value) # same as above .sortBlocks(key=lambda block: block.par.x + block.par.y) # sort on combined x+y value of each block
- Sequence Class - blockName - Gets the base name of the block name parameters. By default this is 'blockname'.
- Sequence Class - moveBlock now takes optional keyword 'num', describing number of blocks to move.
- SequenceBlock Class - destroy() as Sequence Class destroyBlock(index) is now deprecated.
- SequenceBlock Class - namePar. Returns Par defining name of block (or None).
- Sequence Class - moveBlock, insertBlock, deleteBlock arguments can be names, integers, or SequenceBlock objects.
- Sequence Class - Sequence[name or index] find a block by its position or block name.
- sequenceBlock Class - moveBlock(blockFromIndex, blockToIndex) move the specified blocks.
- sequenceBlock Class - name # get or set block name (if parameter exists).
- UI Class - rolloverParGroup returns ParGroup currently under the mouse, including parameter labels.
- Optional keyword argument alwaysOnTop added to several UI elements
OP.openViewer(alwaysOnTop=False) OP.openParameters(alwaysOnTop=False) UI.openBookmarks(alwaysOnTop=False) UI.openTextport(alwaysOnTop=False) UI.openWindowPlacement(alwaysOnTop=False) UI.openPaletteBrowser(alwaysOnTop=False) UI.openMIDIDeviceMapper(alwaysOnTop=False) UI.openNewProject(alwaysOnTop=False) UI.openKeyManager(alwaysOnTop=False) UI.openErrors(alwaysOnTop=False) UI.openVersion(alwaysOnTop=False) UI.openPreferences(alwaysOnTop=False) UI.openBeat(alwaysOnTop=False)
- Extension changes
onDestroyTD
called instead of __delTD__ when extension destroyed (still backward compatible)onPostInit
renamed toonInitTD
New Palette
- Palette:cameraViewport - 1.0.4 - Pivot position is now saved to file. Fixed Pivot Distance parameter default.
- Palette:cameraViewport - Nodes tagged with 'cameraViewportExcludeBounds' are now excluded from bounding box calculations used for framing and homing.
- Palette:cameraViewport - Version 1.0.2 - Added instance Id and custom attributes to pick callback.
- Palette:cameraViewport - Version 1.0.3 - New parameter to add padding around an object when framing.
- Palette:cameraViewport - Callback return value can now be used to indicate the event was handled and camera movement should not be initiated.
- Palette:cppParsTemplateGen - 0.1.2 - Fixed namespace issue that was occurring with the latest CPlusPlus Custom OPs API.
- Palette:logger - v2.6.1 - Major overall.
- The logger object (self.Logger) is now always initialized. This prevents possible error where logging would fail because the logger was not initialized. This can however cause cases of silent logging, where the messages are added to a queue and not dequeued. See following point.
- The logger is now initialized with a QueueHandler. The QueueHandler allow for messages to be queued and dequeued overtime. Messages can be queued safely from additional threads, and dequeued on the main TouchDesigner thread. When dequeued, messages are eventually passed to the extra handlers such as the StreamHandler (textport) or FileHandler.
- A new dictionnary ExtraHandler is holding the handlers managed by the Logger COMP. When any of the managed handlers is updated, a new QueueListener is created to handle the future log messages and changes.
- New methods to Add or Remove Extra Handlers are exposed. They should be used when a user want to add a custom handler and the log messages should be passed to this handler when dequeued.
- New defaults and measures to avoid a case where a new Logger COMP reuse a logger instance caused by a perfect name match in the Logger name and hierarchy. This could happen in the past if a Logger was named “ABC” and pointing to a parent “project1”. The resulting logger name would be “project1.ABC” and this match could exist in another component when using multiple loggers. This should be mitigated by new defaults, but this is not entirely avoidable. Try to name your loggers without generic names.
- Adding support for File rotation settings.
- Code cleanup, removing unnecessary methods, various fixes.
- Palette:popMenu 1.3.1 - Submenus will now work when timeline is paused.
- Palette:quadReproject - v1.0.0 - Complete rework. COMP is now almost exclusively relying on parSequences and expressions.
- Palette:threadManager - v1.0.2 - First public release. A new system component and a set of palette components designed to facilitate Python threading in TouchDesigner.
- Palette:threadManagerClient - v1.0.3 - Fixed an issue with the docked callback DAT parameter not being set after drag n drop.
- Widgets - v2.1.109
- Removed fraction scaling for dropmenu which was broken anyway. Now there is just Pixel or Point where Point should be the default.
- Widgets - v2.1.108
- Fix to fieldTextArea widget binding
Bug Fixes and Improvements
- Upgraded to Deltacast SDK/Driver 6.24.1. - Deltacast
- Upgraded to depthai 2.25.1. - OAK-D
- Upgraded to Spout SDK 2.007.014.
- Upgraded to ZED SDK 4.1.2. - ZED
COMP
- Button COMP - New text parameters exposed.
- Engine COMP - Fixed connected multi-input OPs (eg Merge) losing connections during reload.
- FBX COMP / USD COMP - Added 'Import POPs' parameter.
- FBX COMP - Normalize bone weights of the imported assets.
- Geo Text COMP - Fixed'Face Cam' relative orientation of appended blocks
- Geo Text COMP - 'Face Camera' parameter now works properly with the specDAT 'append' flag.
- 'Width Affected by 'FOV' and 'Lift Towards Cam' parameter now works with Orthographic camera type.
- Geo Text COMP - 'Face Camera' behaviour changed such that it rotates about the anchor point of the layout box.
- Added 'Lift Towards Camera' parameter.
- Make 'Depth Scale S Curve' parm independent from 'Face Camera'.
- Improvements to 'Depth Scaling'. Some erroneous translations fixed. Major code refactor.
- Fixed 'Face Camera' and 'Depth Scaling' to work for all align modes and anchorUVs.
- Geo Text COMP - Added 'Face Camera' parm to make text face the camera regardless of orientation.
- Added depth Scaling parms, similar to the Line MAT, to change the scaling of the text based on the distance.
- Added 'Width Affected by FOV/OrthoWidth' parm, similar to the Line MAT, to make sizing FOV independent
- All of the above new features, work independently for each camera. So, for instance, with the 'Face Camera' parm toggled, the text will face each loaded camera op.
- Panel COMP - All Panel COMPs have new Fill option: 'Fill Outside' (covers available area without distorting).
- Text COMP - Added placeholder text that is displayed when the text contents are empty.
- Text COMP - Copying text when in 'Select Only' mode no longer includes hidden formatting directives.
- Text COMP - Fixed cursor movement and selection with formatting directives when using 'Select Only' mode.
- Window COMP - 'Prevent monitor sleep' toggle upgrades.
- Window COMP - Renamed "monitor" to "display" in parameters, menus and warnings.
- Window COMP - Added a warning if the specified monitor doesn't exist while the window is opened in perform mode.
- Window COMP - Fixed issue which could cause the wrong OP to be used in Perform Mode after using Open as Perform Window from a Window COMP's parameter dialog.
- Window COMP - on macOS, when a window is sized to exactly fill one or all monitors and has no borders, it will open as a full-screen window, matching behaviour on Windows.
TOP
- Chroma Key TOP - Fixed a hang that can occur with this operator.
- Corner Pin TOP - Added 'Mapping' parameter to the 'Extract' page for option between Bilinear and Perspective extraction.
- Movie File In TOP - Fixed issue that can occur with 2 channel .exr files.
- Movie File In TOP / Video Stream In TOP - 'Hardware Decode' now defaults to On.
- Movie File Out TOP - Header DAT parameter is now disabled for formats that don't support it.
- Movie File Out TOP - Added support for AAC audio output.
- Movie File Out TOP - Added 'Stereo Mode' and 'Spherical Mode' parameters, to write out metadata for stereo and spherical video content.
- Noise TOP - 'Derivative' now supported for Simplex 4D and Perlin 4D noise.
- OP Viewer TOP - Fixed cook dependency warnings when appending anything to an OP Viewer TOP.
- Render TOP - Added new pulse parameter to render one frame when render toggle is turned off.
- Render Pass TOP - Can no longer have a different pixel format than the Render TOP it's downstream from.
- Render Select TOP - Fixed crash that can occur when deleting this node in some cases.
- Syphon Spout In TOP / Syphon Spout Out TOP- Upgrade to SDK 2.007.014. Add support for Sender FPS in Info CHOP. When enabled in the Spout Settings dialog.
- Video Device In TOP - Improvied performance when using 'Media Foundation' library and the pixel format of the data stream is NV12.
- Video Device In TOP - AJA devices can now use the Sync to Input Frame with multiple inputs.
- Video Device In TOP - Now supports capturing up to 16 audio channels for Deltacast devices.
- Video Stream Out TOP - Added support for AAC audio for RTMP and SRT modes.
- ZED TOP - Added support for network streaming the data from another machine using ZED native streaming.
- ZED Select TOP - Added this new operator to select different images from a ZED TOP.
CHOP
- Audio File Out CHOP - Added support for big-endian .aiff formats.
- Blob Track CHOP - Internal ID counting behavior improved. The final effect is that IDs ramp up in a much more controlled manner.
- Count CHOP - Added 'Count Up' and 'Count Down' momentary parameters to allow counting with no input connected.
- Delay CHOP - Better queueing behavior when frames skipped / max delay setup incorrectly.
- DMX Out CHOP / DMX In CHOP - Added better support for DMXking devices, re-categorized parameters.
- Perform CHOP - Enabled GPU temperature for NVIDIA GPUs.
- Speed CHOP - New 'Speed' parameter that allows generating values when no inputs are connected.
- Stretch CHOP / Resample CHOP - New interpolation method 'Repeat Samples' that provides better spaced results when lengths are integer multiples of original.
- Timer CHOP - Fixed bug where Timer CHOP's python object didn't update after hitting the done state and returning to zero.
- Trigger CHOP - Added option to remap total length to a new value.
- ZED CHOP - Added a backwards compatibility warning for ZED on startup for older projects - BACKWARDS COMPATIBILITY ISSUE - ZED CHOP - Now needs to point to a ZED TOP to select it's camera source.
DAT
- Audio Devices DAT / Video Devices DAT - Now refreshes properly with fewer redundant intermediate callbacks.
- Folder DAT - When "All Extensions" is off, an empty value in the "Extensions" parameter matches files with no extension.
- Media File Info DAT - Added stand in values for the table.
- Media File Info DAT - 'valid' row added to indicate if the entries in the value columns are valid.
- Python members for 'seconds' row, and 'valid' row.
- OP Find DAT - Now supports different aliases for toggle values (on/1/True off/0/False)
SOP
- ZED SOP - Added a backwards compatibility warning for ZED on startup for older projects - BACKWARDS COMPATIBILITY ISSUE - ZED SOP - Now needs to point to a ZED TOP to select it's camera source.
MAT
- Added proper parm disabling for 'Texture Sampling Mode' menu of Multitex map
- Add 'Texture Sampling Mode' menu to PBR MAT Metallic map, Roughness map, Ambient Occlusion map
- Add 'Texture Sampling Mode' menu to PBR MAT Specular Level map
- Add 'Texture Sampling Mode' menu to Alpha map
- Add 'Texture Sampling Mode' menu to Height maps, Emit maps, Darkness Emit maps
- Add 'Texture Sampling Mode' menu to Diffuse maps, Specular maps, Normal maps
Misc
- Custom Operators - XYZW par type now supported.
- Some changes to how .dmp files are created to obtain more information.
- Panels: 'Fixed Aspect : Vertical' option fixed.
- Fixed aligning a row of children with simultaneous Fill and Fixed Aspect ratios.
- All In operators now have an optional 'OP' parameter as an alternative to wired input.
- Fixed re-opening a minimized parameter dialog, view etc, instead of doing nothing.
- DATs - Since newlines are supported in DAT cells, display them as symbols and allow them to be selected/deleted/copied etc.
- Fixed bug where Undo shortcuts were blocked when the mouse was over an active DAT, CHOP or TOP.
- Fixed problem displaying UTF8 characters in the Textport when it is closed.
- macOS - stop playback during system sleep.
Operator Snippets
Backward Compatibility Changes
BACKWARD COMPATIBILITY ISSUE
BACKWARDS COMPATIBILITY ISSUE - ZED SOP - Now needs to point to a ZED TOP to select it's camera source. BACKWARDS COMPATIBILITY ISSUE - ZED CHOP - Now needs to point to a ZED TOP to select it's camera source. BACKWARD COMPATIBILITY - Par Class - Comparisons now use parameter evaluations in all cases. par1 == par2 would previously only return true if it were the same parameter object, now it compares their evaluation results.
BACKWARD COMPATIBILITY - 'me' context no longer wrongly set to root in some cases. When executing a run() command, in some cases 'me' value was set to root instead of the location the run command originated from. This could lead to permission errors trying to access neighbouring content within a private component for example.