In that sense all nodes in vvvv were potentially stateful but there wasn’t any simple way to find out whether they actually were or not.
The reason for why it is important to distinguish is that it greatly improves the way you can build your patches by making deliberate decisions about which parts of your patch holds state and which do not. This improves readability and most of all simplifies debugging as certain types of problems can only occur with state involved. So with a runtime/logic problem at hand it is always wise to first start looking into Process nodes.
Naming conventions have slightly changed and are now as follows:
Name (Version1 Version2 ..) [Category.Subcategory]
when in vvvv it was:
Name (Category Version1 Version2)
IOBoxes vs Pins
In vvvv an IOBox can be used to set or display values. By giving an IOBox a descriptive name you turn it into an input- or output-pin of its patch. In VL we distinguish between IOBoxes and Pins. While IOBoxes can still be used to set or display values you now use explicit Pin elements to specify Inlets and Outlets for operations.
Image:IOBox vs. Pin
Image:Configuring a Pin or IOBox
In vvvv there is only one numerical type. It is called simply "Value" and it is internally represented by a Float64 (which you as a user hardly ever have to worry about). Any output of type Value can be connected to any input of type value even though they may have different subtypes, like Integer, Boolean, or Bang.
In VL there are many different types for values:
and for now you can only connect from lower to higher precision, eg. from Integer32 to Float32 (or Float64) but not the other way round.
In vvvv there is no difference between a 2/3/4-dimensional vector and a spread with 2/3/4 slices. In VL we have explicit types for vectors, ie: Vector2, Vector3 and Vector4.
In vvvv there are spread generators (like LinearSpread,…) spread operators (like GetSlice, Zip,…) and spread sinks (like Bounds, Mean, …). The same and more are available in VL with the additional advantage that in VL all spread operations are always available for all datatypes without adding more nodes to the NodeBrowser. See Generics.
In VL this is more defined: You need to understand a few things:
There is a difference between a single value and a spread with a single value.
A Spread is only one type of collection. Another common type of collection would be a Dictionary or a HashSet, but we can imagine many different types of collections. Anyway for a start you’ll mostly use Spreads.
TODO: Link to Collections.Spreads docu!
In vvvv every node can automatically be spreaded, meaning the node is executed for every slice on its inputs. This convenience feature is not (yet) available in VL. We’re still thinking about implementing something similar though.
Image:Loop around a vl node vs. imlicit spreading in vvvv
Bin Sizes are vvvv’s workaround to no having multi-dimensional spreads. As with a Bin Size pin associated with a spreaded pin you can specify how the spreads individual bins are to be interpreted by a node. Since in VL spreads can now contain other spreads the concept of Bin Sizes is no longer necessary.
In vvvv there were two reasons to use framedelays
to make sure one thing happens after the other
to store a value for the next frame