First 099 Experimental
Release Notes 
Sept 27, 2017
Python and Performance Optimizations
This version has substantial optimizations to general TouchDesigner speed, plus further speed-up on startup, and yet further speedup where you use many python expressions in parameters.
  • Python expression parser to speed up commonly used python expressions.
  • Caching expression results so they don’t need to recalculate. If a node needs to cook, only the parameters that *may* have changed will be re-evaluated.
  • Optimized startup and launch process.
New Features
  • GPU performance monitoring
    • The amount of time an OP spends getting executed on the GPU can now be seen in the info popup (MMB on the node or info icon in parameter dialog).
    • Python members for GPU timing.
  • TDAbleton - The new Ableton Live - TouchDesigner environment is now included in the Palette. Using Ableton Link to sync the applications, TDAbleton exposes all the parts of your Ableton Live session in TouchDesigner and lets you control them bidirectionally.
  • Layout TOP - New TOP that allows quick layout of input TOPs in row, column, or grid format.
  • PBR MAT - Can now send specular/metallic/roughness/.. maps to any of the color buffers, on the Advanced parameter page.
  • GLSL MAT - Added TDCreateTBNMatrix() function.
  • Substance TOP - Added support for input images which allow swapping the material's Input Image if the Substance material author used them in Substance Designer.
  • GLSL TOP / GLSL Multi TOP - Added support for atomic counters.
  • Alembic SOP - loads Alembic geometry.
  • CPlusPlus SOP - Can load a mesh with normal and color (currently for Point Attribute) and get input parameters from TOP, DAT, and CHOP. Can output to SOP to CHOP and SOP to DAT.
    • includes a SimpleShapes example C++ SOP project which can draw a triangle or a cube and resize the cube with CHOP input values.
  • Geometry COMP - Added option for SOPs to be used as the points input for instancing.
  • Geometry COMP - Added the ability to change the order of Rotate To Vector to be Post and Pre Rotation.
  • Light COMP - Added more texture controls for Projector Map, available in the ">>" menu options to the right of the parameter.
  • Render Pick CHOP / Render Pick DAT - Added priority check to pick.
  • OpenVR CHOP - Added battery_level channel for devices.
  • Event CHOP - A Callback DAT has been added for onCreate() and onDestroy() callbacks.
    • Added the Active parameter to allow you to shut down cooking while the timer is not being used: When Active is off, the CHOP stops cooking and it holds the output channels at a constant value at frame 1 (i.e. it turns off Time Slicing).
    • Added max and countdown columns for each timer* and running row values for both serial and parallel timers.
  • Info CHOP - Now includes warnings and errors channels.
  • List COMP - Added rowIndent attribute which shifts an entire row of specified pixels. Can be used to more easily create hierarchical tree browsers.
  • Select COMP - Numerous improvements
    • New 'Match Size' parameter which when enabled uses the source's final layout size as its own size.
    • New 'Follow Selections' recursively evaluates select source (previous behavior).
  • Ray SOP - New additions
  • Video Device In TOP, Video Device Out TOP - Add support for GPU Direct for Video for AJA devices. This greatly reduces latency, resulting a 1-2 frame latency on input and 1-2 frame latency on output.
    • Added bouncing feature for reflection.
    • Added a menu to allow point intersections to be reflected.
New Python
  • OP Class.curPar returns the parameter currently being evaluated. Can be used in a parameter expression to reference itself.
  • TOP Class.curPass returns the current cooking pass iteration, beginning at 0. The total can be set with the 'Passes' parameter on the operator's common page.
  • windowCOMP Class - setForegound() activates the window and sets it to the foreground, sets focus and increases process priority. Can only be called by a foreground process or a child of a foreground process. Returns True if successful.
  • App Class - app.launchTime is the total time required to launch and begin playing the toe file, measured in seconds.
  • There are two new types of custom parameters:
    • Page Class - appendPython() for Python-type parameters which are expression mode only. This can be used to more efficiently hold lists or dictionaries containing constant values.
    • Page Class - appendMomentary() method now produces a button parameter that is value 1 while selected and 0 when released. Par returns 'Momentary'.
    • You can assign a list of 9 or 16 floats to the .vals member of the matrix to set its entries.
    • Matrix rows and columns can now accessed using rows and cols methods. They will be displayed as a list of lists.
    • The other way of accessing a column or a row is to use this format: a[:,1] for the second column and a[1,:] for the second row.
    • Matrices can now use the operator @ to do matrix multiplication specifically.
    • 3x3 matrices can now be constructed from passing in either 9 arguments, a list of 9 values, or 3 3-tuples.
    • A matrix can also be constructed from 4 lists of 4 numbers. This also works for both Vector and Position arguments.
    • Matrices can now be constructed from a 4x4 or 3x3 Table DAT of numbers, 9 channel or 16 channel CHOPs. For CHOPs the first value of each channel is taken.
    • Matrix data can be pushed to Table DATs using filltable method on a matrix object. The output will be of size 4x4.
  • Added Quaternion Class and new methods for vector and matrix classes
    • Quaternion Class - New class to manipulate rotations using quaternions.
    • Matrix Class - Can now be constructed and rotated using quaternions.
    • Vector Class - Added new utility functions.
  • Par Class.displayOnly member
  • DAT Class new members: .isText and .isTable to determine format
  • Project Class .stack() Formatted contents of current cook and parameter evaluation stack. (Formerly called project.evalStackInfo())
  • tdu.printErrors() has been removed, and replaced with op.errors(recurse=True)
  • tdu.printStack() is replaced with new print(project.pythonStack())
  • ext.parentshortcut is deprecated: Do not use this form any more. Use parent.parentshortcut.
Bug Fixes and Improvements
  • Private Components can now save any children, without protection, since they are visible to the private components and their scripts.
  • OP shortcuts are now always globally visible even if the component itself has cooking flag disabled.
  • Movie File In TOP - Will now try to re-use memory automatically when the movie is changed (using preload() or not). This avoids the need to call unload(cacheMemory=True) on a Movie File In TOP before changing its target to avoid re-allocating new texture memory for the new movie file.
  • Composite TOP - Fixed a bug where the same node being connected twice the Composite TOP can result in incorrect extend conditions.
  • NDI In TOP - Added num_source to Info CHOP, reports number of NDI sources found on the network.
  • Panel Components now display by drawing a scaled texture instead of always rendering at native resolution. This improves behavior for scaling panels to different sizes. NON-BACKWARD COMPATIBLE
  • TOP to CHOP - Improved performance by only downloading the required section of the image instead of the whole image.
  • OP Execute DAT - Fixed crash on extension change, when node goes missing.
  • Constant MAT - Fixed wireframe not working.
  • GLSL MAT - Added default pixel/vertex shaders.
  • Sort SOP - Fixed the behavior of Sort by Neighbour, where it was causing crashes and removing points.
  • DMX Out CHOP sACN, Art-Net. Removed restriction that net, subnet, universe must be unique since different IPs can be used.
  • OSC In CHOP - 'Queued' parameter to turn off queuing and just take most-recent values.
  • DATs info popup (middle-mouse button on the node) now displays first few classes/methods (if they exist) under section called 'Classes:' otherwise displays first few lines under 'Content:' as before.
  • Support system wide DPI awareness on windows 7 and fixed calculation of DPU / UI layout on Windows 7.
  • Fixed Perform Mode starting up or switching to 'Automatic from COMP/TOP' setting even when set to use 'Custom Size' or 'Fill'.
  • Window COMP - Reorganized and cleaned up parameters.
    • Removed unused Ignore Task Bar.
    • Removed Keep Window Aspect as it can be grabbed from the operator size.
    • Renamed Read Current Settings and fixed to work with native, dpi and also offsets.
    • Added warning for vsync on macOS.
  • Panel Components now include x, y, w, h info in popup help.
  • Fixed panel sides not showing background color when background TOPs not set to stretch.
  • Cloning Improvements
    • Object.clones now includes clones that are currently disabled.
    • Fixed issue where pulsing disabled master clone the first time didn't update children.
    • Fixed crash when re-cloning the current node with custom parameters.
  • Replicator COMP - Replicants are now laid out in the network in template table order, *not* alphabetically as previously.
  • Video Device In TOP - Updated Point Grey Spinnaker version to
  • Updated Oculus SDK to 1.16.0
Backwards Compatibility Issues
  • BACKWARDS COMPATIBILITY WARNING - Parent Shortcuts - ext.parentshortcut is deprecated: Do not use this form. Instead use parent.parentshortcut. A warning is issued now.
  • BACKWARDS COMPATIBILITY WARNING - The seed for the Sort DAT is now floating point vs integers. You can use integers but the random ordering for 2. is different now vs 2 before, for example.