vvvv gamma 2021.4
released on 23 11 21
New & Changes
- Added a Hamburger menu for easy changing of settings and themes
- Adds auto document reload feature. Must be enabled in the settings.
- Added support for editor extensions
- Introduces user and editor runtimes
- Entry points of documents with the .HDE.vl extension will be run by the editor runtime where we can provide patch editor specific services.
- The editor runtime uses a cooperative mainloop, it's resolution is not as good as the one from the user runtime. However it runs in the editor thread and won't be stopped by a F8 command. Apart form that it behaves the same as the user runtime so patching in it should feel natural.
- Locally installed packages ending with .HDE will now be loaded by the editor. Allows to create packages solely for the editor.
- Adds Restart command (F9) and editor extension restart (Shift + F9)
- Couple of performance bottlenecks while patching have been addressed
- Pin values can be cleared (set to null) when deleting the value with backspace and committing to it with enter
- Simplified pin group keyboard shortcuts
Ctrl + +/-works again for nodes with only one input or output pin group (for example
- Now shipping with VL.Video.MediaFoundation package including VideoIn and VideoPlayer nodes that return a texture
- Methods marked with the
Obsoleteattribute will show up with a warning in VL
- Untyped pins and pads now come with a warning if a type is needed
- The compiler uses a different strategy which greatly reduces the compile and hotswap time in bigger projects. For details see discussion in the forums.
- Lifts all remaining restrictions on the
Thisnode. It can now be used in
Createas well as in generic patches. For details see dicussion in the VL Repo.
- Fields are written immediately inside of classes. For details see discussion in the VL Repo.
- Optional Explicit Type Parameters added. For details see dicussion in the VL Repo.
- Adds support for delegates other than
Func. For details see dicussion in the VL Repo.
- For delegate types other than Action and Func pins are aligned by name
Funcdelegate types the pins are aligned by index to avoid a breaking change
- The old code path for stateful regions is still in place (e.g.
Func<TState> create, Func<TState, Tuple<TState, TOutput>> update). We can slowly get rid of it by replacing those regions with the new approach and writing converters naming the pins accordingly (remember the old system aligned the pins by index)
- A node having a custom delegate type on one of its inputs results in a higher order region only
- Adds support for monadic values (e.g. the
GpuValue<T>of FUSE can be treated as such)
MonadicAttributeattribute to mark types as monadic
- Allows to connect
- The value of a pin of type
M<T>can be modified directly as long as an editor for
- Pins of type
M<T>can have default values
- Custom Regions API added. This allows to patch a stateful region with BorderControlPoints! See: ManageProcess for an example.
- New and much simpler ManageProcess region with output border control points
- New ForEach (Max) loop region taking the iteration count from the maximum of its inputs
- Adds new
Optional<T>type with serialization and editor support. An
Optional<T>IO box always represent the
HasNoValuestate can simply be achieved by not connecting at all.
- Added a TypeOf node
- LinearSpread now with a lot of more options, LinearSpread (Range) added
- Added RandomSpread (4D)
- Added GridSpread (2D/3D) nodes
- Added a TempPath node
- Added Determinant and ScalingVector to Matrix
- Added option for clock and ImagePlayer synchronization
- All operations on
ReadOnlyMemory<T>are now forwared
- Makes FSPickler aware of proxies as well as VL type names - fixes binary compatibility issues between emitted code of editor and exported apps. There's also a new nuget package called VL.CoreLib.Backports available, which backports the type name awareness to 2021.3. This allows to send records between instances running on different versions.
Deserialize (Binary ReadOnlyMemory)and makes Bson versions obsolete
- Paths are made relative on serialization and absolute on deserialization. This is now done in the Path's regular serializer by determining the base path using the current node context. Fixes
Spread<Path>not storing the paths relative, a
SaveAscommand will no longer change the relative paths and serializing a class or record containing paths will also make them relative and absolute again on deserialization.
- Resize node is reworked internally, Output Size pin is defined as Int2 instead of Vector2, switched from class to process node. The old node is moved to
- Resize node now using offscreen renderer - this improves the rendering performance of tooltips and IO boxes drastically (FPS going up from ~3 to stable 60)
- New: Resize (Relative), Crop, Crop (Relative)
- Added ImagePlayer node for .dds sequence playback
- All rendering is now done with Direct3D11 using ANGLE
Renderer (Offscreen)is now hardware accelerated and no longer experimental, removed
Renderer (Offscreen Accelerated)
- All Skia renderers share the same graphics context per thread - fixes super expensive context switches
- The default resource limit of a Skia graphics context has been increased from 96MB to 512MB
GRContextnode and type forward to give access to the graphics context on the current thread
- The lifetime of the output image of the
Renderer (Offscreen)is controlled by a
Producing (RefCount)node, while nodes such as
Using (RefCount)node - that combination allows for easy feedback loops of Skia images without having to copy them.
R16G16B16A16Fpixel format and whether the color channel is premultiplied with the alpha value
- Now shipping with TextureFX: sources, filters, mixer, and utilities
- New PostFX: Fog and Outline
- Reworked Buffer and Texture nodes
- All materials have ShaderFX inputs
- Shader node factory for ShaderFX nodes
- Shader nodes can have ShaderFX inputs
- Materials can be extended with custom shaders
- ShaderFX inputs of values and vectors can be connected directly to IOBoxes
- Shaders get
TimeStepautomatically set by the runtime
- High quality resize filters to scale textures
- Many new shader utils and functions
- ImagePlayer to play image sequences
- TextureWindow for eas texture preview
- Pipet node to sample texture pixels
- BufferReadback for non-blocking buffer value download to the CPU
- Mesh split nodes to read vertex data
- Width and Height pins are replaced with one Int2 Size pin
- Ambient occlusion works with an orthographic camera
- Fixes for Spout sender and receiver
- Stride windows move to the front on open
- Experimental multiple viewports support
- Experimental way to efficiently render from multiple perspectives into multiple textures
SkiaRenderernow uses ANGLE instead of
WGL_NV_DX_interop2. Fixes rendering not working at all on AMD hardware.
Gpu<T>as monadic unlocking features such as direct value manipulation and direct linking
- Many small improvements and fixes
API related Changes
- The register services method is only called when starting a patch, it will no longer be called while patching. This should save resources and make it much more predictable.
- The node path is now made out of unique (and persistent) ids. Elements can be identified across sessions. The old APIs are still in place for compatibility reasons. To make use of the new ones one needs to adjust the patches making use of it.
- Adds new nodes
Producing (RefCount)to reference count specific resources.
HoldLatestmake use of the
Using (RefCount)node. This for example allows to frame delay Skia images without having to clone them.
- Less strict value deserialization - allows to seemingly switch between single values and vectors. For example when turning a
float (+) (1f)into a
(1f)will be expanded to a
(1f, 1f)instead of going to zero.
- Adds extension methods
IVLObject.IsSupportedCollectionType(ported from VL.Elementa). The used traversal methods also support dictionaries now.
- Fixes null reference exception when calling GetFiles/GetDirectories/GetDescendants on empty path object (could be backported)
- Fixes some emit crashes when using special character or reserved keywords
- Fixes renaming of various elements. The rename will also only be applied after the user commits to it and not on every keystroke.
- Export will also work if runtime is stopped
- Reduces the amount of generated ad-hoc projects - fixes cases where shaders would overlap on export
- Fixes same shaders subfolder being copied to multiple exported projects
- Exporter will now add a package reference to the original nuget in case it generates the project belonging to that same package - ensures that all the build targets of the package get picked up / files get copied to the output folder
- Fixes serializer not preserving the runtime type of the root element
- Fixes slice states not getting disposed if used in nested loop and
Keepis false in first frame
- Fixes emit exception when the content of an adaptive implementation was inlined
- Documents can now be fully reloaded without the compiler crashing
- Render Windows that are "Bound To Document" will now always close the right document, even if the windows got wrapped in a helper node.
- Definitions in application patch get same categorization as the definitions in the definitions patch.
- Link tooltip comes with a delay as specified in the settings (if warning or error or Ctrl or Space)
- Fixes SKImageFilter and SKColorFilter tooltips
- Refinements on TextureViewer potentially showing the texture info before the content becomes available.
- Pinned tooltips are now less verbose
- Fixes PerspectiveLookAtRect. Scaling part now moved to ProjectionMatrix making a LookAtRectCam work with more shaders.
- Fixes crash when opening VL.Devices.uEye and not having VL.Elementa installed
- Fixes crash when loading documents with network paths (like file://) stored inside IO boxes
- Fixes identifiers not being escaped on export (like switch -> @switch, false -> @false etc.)
- Fixes error on link not visible in case it had a warning as well
- Fixes tags of factory nodes not getting picked up by system
- Fixes value tracing of process state output - was only working when connected
- Fixes crash when deserializing object graphs using generic patched types (was exposed by VL.Fuse.Control)
- Fixes experimental and obsolete warnings not showing up on plugins
- Fixes UI crash when opening a patch where the type of an iobox which stored min and max values changed
- Fixes help browser not reacting on first click
- Fixes backend crash after larger patch modifications and subsequent recompile
- Assemblies of newer frameworks (like net5 or netstandard 2.1) will no longer get picked up, avoiding confusion like here in the vvvv forums.