Understanding ICE Trees


This section provides some general concepts that should help when building ICE trees using the basic Tool and other nodes.

Each connection in a tree represents a set of data, with one value per element of the set. For example, if you get Self.PointPosition, the set consists of one 3D vector per point of the "Self" object (the object with the ICE tree).

A data set is not an array, or at least, it's not exposed as an array in ICE. Traditional programming concepts related to arrays do not apply. You do not need to use the nodes in the Array category to work with data sets (unless your data set actually contains arrays, for example Self.PointNeighbors — for more about that, see Working with Arrays in ICE Trees). You do not need to iterate on the members of the data set. Just plug the data into another node, such as a Math node, to process the data.

When tracing the logic and connections of an ICE tree, you can think of the nodes as working on all members of the data set at once, or you can concentrate on what happens to a single representative of that set.

When you combine a single constant value (or something else in the singleton context) with a data set, it gets combined with every member of the set. For example, you can add the same value to all members of a set, or you can multiply them all by the same number, and so on.

When you combine two data sets, the corresponding members of the set are combined. For example, if you add Self.PointPosition and Self.PointNormal as you might do in a Push-type deformation, then each point's position vector is added to its own normal vector. This is why component contexts must be the same when you combine them — there must be the same number of elements and there must be a correspondence between the members.