Source/Nodes/Fields
Fields
A Field
represents a function that outputs a value based on an arbitrary number of inputs. The inputs for a specific field evaluation are provided by a FieldContext
.
A typical example is a field that computes a displacement vector for every vertex on a mesh based on its position. In this case the FieldContext
is the mesh with the position attribute.
Fields can be build, composed and evaluated at run-time. They are stored in a directed tree graph data structure, whereby each node is a FieldNode
and edges are dependencies. A FieldNode
has an arbitrary number of inputs and at least one output. A Field
is a specific output of a FieldNode
. The inputs of a FieldNode
are other fields. All fields are immutable once they are built.
There are two different types of field nodes:
FieldInput
: Has no input and exactly one output. It represents an input to the entire field when it is evaluated. During evaluation, the value of this input is based on aFieldContext
.FieldOperation
: Has an arbitrary number of field inputs and at least one output. Its main use is to compose multiple existing fields into new fields.
Given one or more fields and a FieldContext
, the fields can be evaluated using the FieldEvaluator
class.
Generic and Typed Fields
Most of the time, when working with fields, they have a specific type that is known at compile time. In this case, the Field<T>
class should be used. This class is a wrapper around a more generic GField
class (where G stands for "generic"). A GField
is a field whose type is only known at run-time. When converting from a GField
to a Field<T>
there is a run-time assert that makes sure that the conversion is valid.