# Magma 2 Nodes

Available in Krakatoa MX v2.0.0 and higher.

For a list of Krakatoa v.1.6.x and earlier Magma nodes, see here.

The following page list all currently available Magma 2 nodes.

## Arithmetic Category

### Abs

- The Abs operator has one inputs and one output.
- The input can be a Scalar (Float or Integer) and has no default value when unconnected.
- The output is the Absolute value (without sign) of the input value.

### Add

- The Add operator has two inputs and one output.
- The first input can be an Integer, a Float or a Vector.
- The second input must match the type of the first input.
- Both inputs have Float default values of 0.0 when unconnected and the type of the Defaults can be switched to Integers or Vectors.
- The output is the sum of the two inputs.

### Ceil

- The Ceil operator has one input and one output.
- The input must be a Float and has no default value when unconnected.
- The output is the closest whole number that is greater or equal to the input (rounding up)

### Divide

- The Divide operator has two inputs and one output.
- The first input can be a Vector, a Float or an Integer.
- The second input can be a Float when the first input is a Vector of Float, and Integer if the first input is Integer.
- Both inputs have Float defaults with a value of 1.0 when unconnected.
- The output is the quotient of the two inputs.

### Floor

- The Floor operator has one input and one output.
- The input must be a Float and has no default value when unconnected.
- The output is the closest whole number that is less than or equal to the input (rounding down)

### Log

- The Log operator has one input and one output.
- The input must be a Float and has no default value when unconnected..
- The output is the Natural Logarithm of the input value.
**NOTE**that Krakatoa ships with two pre-defined BlackOps found under BLOP\Logarithms: LogBase and Log10 for calculating the logarithm with a user-defined base or base of 10.

### Modulo

- The Modulo operator has two inputs and one output.
- The first input must be a Scalar and defaults to Integer 0 when unconnected.
- The second input must match the type of the first input and defaults to Integer 1 when unconnected.
- The output is the whole part of the division.

### Multiply

- The Multiply operator has two inputs and one output.
- The two inputs can be of type Vector, Float or Integer.
- Vectors and Floats can be freely multiplied, Integers can only be multiplied with other integers.
- Both inputs have default Float values of 1.0 when unconnected, the default value type can be switched to Vector or Integer.
- The output is the product of the two inputs.

### Negate

- The Negate operator has one input and one output.
- The input can be of type Vector, Float or Integer and has no default value when unconnected.
- The output is the input with inverse sign.

### Power

- The Power operator has two inputs and one output.
- The first input can be of type Vector or Float and has a default value of 1.0
- The second input must be of type Float and has a default value of 2.0
- The output is the first inputmultiplied by itself second input times

### Sqrt

- The Sqrt operator has one input and one output.
- The input must be of type Float and does not have a default value when unconnected.
- The output is the positive square root of the input.

### Subtract

- The Subtract operator has two inputs and one output.
- The first input can be a Vector, a Float or an Integer and has a Float default value of 1.0 when unconnected.
- The second input must match the first input's type and has a default value of 0.0 when unconnected.
- The default type can be switched between Vector, Float and Integer.
- The output is the difference between the two inputs.

## BLOP Category

### BLOP

- The BLOP operator is a container for user-defined sub-flows, also known as Compound operators.
- A BLOP (Short for BlackOp) operator can have an arbitrary number of user-defined inputs and outputs.
- The inputs do not have default values when unconnected.
- The outputs depend on the content of the BLOP.

### Saved BLOPs and Optional Categories

- The BLOP Category can show the saved MagmaBLOP files saved in the default BLOP folder and its sub-folders, one level deep.
- These saved BLOPs appear as custom operators and can be dropped into the flow and used as built-in operators.
- The BLOPs can be optionally ordered in categories based on the sub-folders they were loaded from - the Depot's "Show BlackOp Categories In Depot" right-click menu option controls this.

## Convert Category

### Breakout

- The Breakout operator has one input and three outputs.
- The input can be a Vector, Float or Integer and has no default value when unconnected.
- The outputs represent the first, second and third components of the input value if it is a Vector.
- If the input is a Float or an Integer, the first ouput will pass through the input without change, the second and third will cause an error.

### QuatToVectors

- The QuatToVectors operator has one input and three outputs.
- The input must be a Quat and has no default value when unconnected.
- The three outputs represent the orthonormal X, Y and Z axes of the Quaternion taken as a 3x3 Rotation matrix

### ToFloat

- The ToFloat operator has one input and one output.
- The input must be a Scalar (usually an Integer) and has no default value when unconnected.
- The output is the input converted to Float if the input is Integer, or the input itself if it is already a Float.

### ToInt

- The ToInteger operator has one input and one output.
- The input must be a Scalar (usually a Float) and has no default value when unconnected.
- The output is the input converted to an Integer if the input is Float, or the input itself passed through if it is already an Integer.

### ToVector

- The ToVector operator has three inputs and one output.
- The three inputs must be Floats and have a default value of 0.0 when unconnected.
- The output is a Vector value comprised of the three inputs as its components.

### VectorsToQuat

- The VectorsToQuat operator has three inputs and one output.
- The three inputs define the X, Y and Z orthonormal axes of a 3x3 Rotation matrix
- The output is the Quat value describing the oritnation of that matrix.

## Function Category

### Blend

- The Blend operator has three inputs and one output.
- The first and second inputs must be of the same type - either Vector or Float. They have no default values when unconnected.
- The third input defines the blend amount and has a default value of 0.0 which causes the first input to be output.
- The output is the blended value of the two inputs based on the third input's value which should be in the range from 0.0 to 1.0.

### Clamp

- The Clamp operator has three inputs and one output.
- The first input is the value to be clamped and must be a Float.
- The second input is the min. range value and has a default of 0.0 when unconnected.
- The third input is the max. range value and has a default of 1.0 when unconnected.
- The output is the first input clamped in the range of the second and third inputs.

### Curve

- The Curve operator has one input and one output.
- The input must be a Float and has no default value when unconnected.
- The output will be the input mapped by the custom curve into another value.
- The operator provides a button to open a dedicated Curve Editor dialog.

### Noise

- The Noise operatror has one input and one output.
- The input must be a Float or a Vector and has no default value when unconnected.
- The operator exposes three internal properties not controllable via inputs - Num.Octaves, Lacunarity and Normalize.
- The output is a Float noise value calculated based on the input value and the Octaves and Lacunarity parameters.
- If the Normalize option is checked, the output will be normalized in the range from -1.0 to 1.0.

### VecNoise

- The VecNoise operatror has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The operator exposes three internal properties not controllable via inputs - Num.Octaves, Lacunarity and Normalize.
- The output is a Vector noise value calculated based on the input value and the Octaves and Lacunarity parameters.
- If the Normalize option is checked, the output will be normalized in the range from -1.0 to 1.0.

## Input Category

### InputChannel

- The InputChannel operator has no inputs and one output.
- The output is the value of a specified existing channels from the particle stream being edited.
- The type of the output value depends on the type of the selected Channel.

### InputGeometry

- The InputGeometry operator has no inputs and one output.
- The operator provides a list of scene geometry objects which can be added and removed by the user.
- The output of the operator is acceptable only by dedicated Geometry input sockets of Geometry-related operators like IntersectRay, NearestPoint and InVolume.
- The InputGeometry operator has an Exposed option - it can be exposed to the UI of the Magma Modifier inside the 3ds Max Command Panel to provide geometry picking outside of the MagmaFlow Editor.

### InputObject

- The InputObject operator has no inputs and one output.
- The operator provides a single pick button for selecting one scene object that can only be added but not removed by the user.
- The output of the operator is acceptable only by dedicated Object input sockets in Object-related operators like PropertyQuery.
- The InputObject operator has an Exposed option - it can be exposed to the UI of the Magma Modifier inside the 3ds Max Command Panel to provide geometry picking outside of the MagmaFlow Editor.

### InputParticles

- The InputParticles operator has no inputs and one output.
- The operator provides a single pick button for selecting one scene particle object that can only be added but not removed by the user.
- The output of the operator is acceptable only by dedicated Particles input sockets in Particle-related operators like ParticleQuery.
- The InputParticles operator has an Exposed option - it can be exposed to the UI of the Magma Modifier inside the 3ds Max Command Panel to provide geometry picking outside of the MagmaFlow Editor.

### InputScript

- The InputScript operator has no inputs and one output.
- The operator provides a text field that can contain arbitrary MAXScript expressions.
- The output is the final result of the MAXscript expression evaluation.

### InputTexmap

- The InputTexmap operator has a variable number of inputs and one output.
- The operator provides a map button for selecting a 3ds Max texture map
- Optional inputs include Position, Normal, TextureCoord, Color, Mapping2 to 99.
- If an optional input is not present but needed by the texture map, it will be looked for implicitly in the incoming particle's channels.
- It has an option to select the output value type.
- Supported output types are Color (Pixel Color Vector), Mono (Monochrome value Float) and Perturb (Normal Perturbation Vector)

### InputValue

- The InputValue operator has no inputs and one output.
- The operator has UI parameters to select the value type (Vector, Float, Integer) and set the value for the chosen value type.
- The value is stored in a 3ds Max animation controller of the given type.
- The output is the value of the animation controller at the current time.

## Logic Category

### Equal

- The Equal operator has two inputs and one output.
- The two inputs must be of the same type to be compared.
- The first input has no default value when unconnected.
- The second input has a default Float value of 0.0. The default value type can be switched to Vector or Integer.
- The output is Integer 1 if the values of the two inputs are equal, Integer 0 if not equal.

### Greater

- The Greater operator has two inputs and one output.
- The two inputs must be of compativle types to be compared - both Scalars or both Vectors.
- The first input has no default value when unconnected.
- The second input has a default Float value of 0.0. The default value type cannot be changed.
- The output is Integer 1 if the first input's values is greater than the value of the second input, Integer 0 if equal or less.

### GreaterOrEqual

- The GreaterOrEqual operator has two inputs and one output.
- The two inputs must be of the same Scalar type to be compared - both Floats or both Integers.
- The second input has a default Float value of 0.0. The default value type cannot be changed.
- The output is Integer 1 if the first input's values is greater than or equal to the value of the second input, Integer 0 if less.

### Less

- The Less operator has two inputs and one output.
- The two inputs must be of the same Scalar type to be compared - both Floats or both Integers.
- The second input has a default Float value of 0.0. The default value type cannot be changed.
- The output is Integer 1 if the first input's values is less than the value of the second input, Integer 0 if equal or greater.

### LessOrEqual

- The LessOrEqual operator has two inputs and one output.
- The two inputs must be of the same type to be compared.
- The output is Integer 1 if the first input's values is less than or equal to the value of the second input, Integer 0 if greater.

### LogicalAnd

- The LogicalAnd operator has two inputs and one output.
- The two inputs must be of Integer type where 0 represents FALSE and any non-zero value represents TRUE.
- The output is Integer 1 if both inputs have non-zero values, 0 if one of them has a zero value.

### LogicalNot

- The LogicalAnd operator has one input and one output.
- The input must be of Integer type where 0 represents FALSE and any non-zero value represents TRUE.
- The output is Integer 1 if the input is 0, 0 if the input is not 0.

**LogicalOr**

- The LogicalOr operator has two inputs and one output.
- The two inputs must be of Integer type where 0 represents FALSE and any non-zero value represents TRUE.
- The output is Integer 1 if at least one of the input is not zero, 0 if both inputs are zero.

**LogicalXor**

- The LogicalXor operator has two inputs and one output.
- The two inputs must be of Integer type where 0 represents FALSE and any non-zero value represents TRUE.
- The output is Integer 1 if exactly one one of the two input is not zero, 0 if both inputs are zero or both inputs are not zero.

### Mux

- The Mux operator has a variable number of inputs and one output.
- The number of inputs is controlled by a property in the operator's UI, defaults to 3 and cannot be less than 3.
- The last input is always the Selector input and must be of type Integer between 0 and the number of inputs minus 2.
- The other inputs can be of any type, prefereably of the same type to ensure consistent output type.
- The output is the value of the input selected by the last input's zero-based integer value. If the last input is 0, the first input is output, if the input is 1 the second input is sent out and so on.
- If the last input's value is less than 0, the output will be the first input's value.
- If the last input's value is greater than the number of inputs minus 2, the second-to-last input's value will be sent out.

### Switch

- The Switch operator has three inputs and one output.
- The first two inputs values can be of any type, preferably of the same type to ensure consistent output type.
- The third input must be of Integer type where a value of 0 is considered FALSE and any non-zero value is TRUE.
- The output of the operator will be the first input's value if the third input is non-zero (TRUE), and the second input's value if the third input is 0 (FALSE).

## Object Category

### FaceQuery

- The FaceQuery operator has four inputs and a variable number of outputs.
- The first input must be connected directly to an InputGeometry operator with at least one geometry object picked.
- The second input is the zero-based object index (Integer) corresponding to the order of geometry objects on the InputGeometry's list. It defaults to 0 when unconnected.
- The third input is the zero-based face index (Integer) within the specified geometry object. It defaults to 0 when unconnected.
- The fourth input is the barycentric coordinate (Vector) within the specified face. It defaults to [0.3333,0.3333,0.3333] when unconnected.
- The default output is Position. It can be disabled via the operator's UI.
- Additional outputs can be added to get other face-related values, including the Interpolated (Smooth) Normal, the Selection channel, all 99 mapping channels and the Vertex Color channel.

### InVolume

- The InVolume operator has two inputs and one output.
- The first input must be connected directly to an Input Geometry operator with at least one geometry object picked.
- The second input provides the world space position to check against the provided geometry volumes.
- The output is a Boolean which will be 1 (True) if the point is in at least one of the specified volumes, or 0 (False) if it is outside.
- See the "Using the InVolume Magma Operator" topic for a practical demonstration.

### IntersectRay

- The IntersectRay operator has three inputs and seven outputs.
- The first input must be connected directly to an InputGeometry operator with at least one geometry object picked.
- Dragging a wire into an empty area of the Editor will create an InputGeometry operator automatically.
- Holding Ctrl while releasing the mouse the the above case will pop up the full operators menu

- The second input must provide the ray origin in world space.
- Dragging a wire into an empty area of the Editor will create a Position InputChannel node connected via a ToWorld Transform opertator.
- Holding Ctrl while releasing the mouse the the above case will pop up the full operators menu

- The third input must provide the ray direction in world space.
- Dragging a wire into an empty area of the Editor will create a Vector InputValue node set to [0,0,-1].
- Holding Ctrl while releasing the mouse the the above case will pop up the full operators menu

- The first output returns the Position of the intersection, or [0,0,0] if no intersection was found.
- The second output returns an Integer with a value of 1 (TRUE) if the intersection is valid, 0 (FALSE) if not valid.
- The third output returns the zero-based Object Index, matching the order of objects on the InputGeometry node's list.
- The fourth output returns the zero-based index of the face that was hit.
- The fifth output returns the signed distance to the intersection point - positive if the point is seeing the front side of the face (outside), negative if seeing the backside (inside)
- The sixth output returns the face (unsmoothed) normal at the intersection point.
- The seventh output returns the barycentric coordinates of the intersection point within the face.
**NOTE:**Using the ObjectIndex, FaceIndex and Barycentric Coordinates together with the same InputGeometry operator as inputs into a FaceQuery operator, you can access additional surface data.

### MeshQuery

- The MeshQuery operator has two inputs and one output.
- The first input must be connected directly to an InputGeometry operator with at least one geometry object picked.
- The second input is the zero-based object index (Integer) corresponding to the order of geometry objects on the InputGeometry's list. It defaults to 0 when unconnected.
- The output is the Face Count of the specified mesh.
**NOTE:**More outputs might be added in the future to access other geometry object properties.

### NearestParticle

- The NearestParticle operator has two inputs and three outputs.
- The first input must be connected to an InputParticles operator.
- The second input must provide the world space position to check for neatest particles from.
- A control in the operator's UI defines which particle to return. It defaults to 1 (meaning the closest), but it can be set to return the second-closest, third-closest and so on.
- The first output returns the Position of the closest particle.
- The second output returns Integer 1 (TRUE) if a closest particle was found, 0 (FALSE) if not.
- The third output returns the Particle Index within the particle system.
**NOTE:**Using the Particle Index and the same InputParticles node, a ParticleQuery operator could be used to acquire additonal information about the particle like Velocity, Color etc.

### NearestPoint

- The NearestPoint operator has two inputs and seven outputs.
- The first input must be connected directly to an InputGeometry operator with at least one geometry object picked.
- Dragging a wire into an empty area of the Editor will create an InputGeometry operator automatically.
- Holding Ctrl while releasing the mouse the the above case will pop up the full operators menu

- The second input must provide the lookup point in world space.
- Dragging a wire into an empty area of the Editor will create a Position InputChannel node connected via a ToWorld Transform opertator.
- Holding Ctrl while releasing the mouse the the above case will pop up the full operators menu

- The first output returns the Position of the nearest point, or [0,0,0] if no valid nearest point could be found.
- The second output returns an Integer with a value of 1 (TRUE) if the point is valid, 0 (FALSE) if not valid.
- The third output returns the zero-based Object Index, matching the order of objects on the InputGeometry node's list.
- The fourth output returns the zero-based index of the face the point belongs to.
- The fifth output returns the signed distance to the nearest point - positive if the point is seeing the front side of the face (outside), negative if seeing the backside (inside)
- The sixth output returns the face (unsmoothed) normal at the nearest point.
- The seventh output returns the barycentric coordinates of the nearest point within the face.
**NOTE:**Using the ObjectIndex, FaceIndex and Barycentric Coordinates together with the same InputGeometry operator as inputs into a FaceQuery operator, you can access additional surface data.

### ParticleQuery

- The ParticleQuery operator has two inputs and an arbitrary number of outputs.
- The first input must be connected directly to an InputParticles operator with a PRT object selected.
- The second input defines the particle index within the particle system. It has no default value when unconnected and is typically connected to the Particle Index output of a NeatestParticle operator.
- The outputs are defined via the UI of the operator.
- By default, the Position channel is exposed as the only output, but any number of particle channels can be added as outputs to query any data available in the stream.

### ParticleSumCount

- The ParticleSumCount operator has two inputs and at least two outputs.
- The first input must be connected directly to an InputParticles operator with a PRT object selected.
- The second input must provide the world space lookup position to search particles from.
- The operator's UI provides a Num.Neighbors property which defaults to 2 but can be set to another value and defines how many particles to look for.
- The Falloff Power property in the UI controls how the distance to the particle affects its accumulation into the final value.
- The first output is the Max. Distance (the distance to the farthest particle found)
- The second output is the Total Weight which can be used to divide the resulting channel values by to get an Average value.
- Any number of particle channels can be added as outputs and their channels will be accumulated by the operator, outputting their sum. The sum can be then divided by the Total Weight to produce an Average.

### ParticleSumRadius

- The ParticleSumRadius operator has two inputs and at least two outputs.
- The first input must be connected directly to an InputParticles operator with a PRT object selected.
- The second input must provide the world space lookup position to search particles from.
- The operator's UI provides a Radius property which defaults to 1.0 and defines the radius of the spherical region to search within.
- The Falloff Power property in the UI controls how the distance to the particle affects its accumulation into the final value.
- The first output returns the number of particles found inside the spherical region.
- The second output is the Total Weight which can be used to divide the resulting channel values by to get an Average value.
- Any number of particle channels can be added as outputs and their channels will be accumulated by the operator, outputting their sum. The sum can be then divided by the Total Weight to produce an Average.

### PropertyQuery

- The PropertyQuery operator has one input and an arbitrary number of outputs.
- The input must be connected to an InputObject operator.
- By default, the Pos property (alias of Position) is exposed as the only output.
- Any number of outputs can be added to the operator via its UI by entering any valid MAXScript Expressions that access properties inside the object.
- Examples include "material.diffusemap.coords.blur" to access the blur value of a bitmap texture in the diffuse slot of the object's material, "bend.angle" to access the angle of a bend modifier applied to the object and so on.

## System Category

### Elbow

- The Elbow operator has one input and one output.
- The operator has no function except for guiding complex wiring within the flow - it is equivalent to a regular operator set to Pass Through (Disabled).
- The shape of the node is round and its size can be controlled independently via the Display Options.

### Missing

- The Missing operator is meant to be used in the future as a stand-in for missing operators.
- Its inputs and outputs counts will match the counts of the original operator.

### Output

- The Output operator has only one input and no outputs.
- The Output operator's position is handled by the Editor and cannot be edited by the user.
- The Output channel is specified using the UI controls.
- If the MagmaFlow is part of a Custom Render Element, only one Output node can be created.

## Transform Category

### FromCamera

- The FromCamera operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The UI controls define the transform mode - Point for Position vectors (applies orientation, scaling and translation), Vector for Vectors (applies orientation and scaling but no translation) and Normal for Normals (orientation only, no scaling and translation).
- The output returns the Vector transformed from Camera to World space.

### FromSpace

- The FromSpace operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The UI controls define the transform mode - Point for Position vectors (applies orientation, scaling and translation), Vector for Vectors (applies orientation and scaling but no translation) and Normal for Normals (orientation only, no scaling and translation).
- Another control allows the picking of the reference object.
- The output returns the Vector transformed from the reference object's space to World space.

### FromWorld

- The FromWorld operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The UI controls define the transform mode - Point for Position vectors (applies orientation, scaling and translation), Vector for Vectors (applies orientation and scaling but no translation) and Normal for Normals (orientation only, no scaling and translation).
- The output returns the Vector transformed from World space into object space.

### ToCamera

- The ToCamera operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The output returns the Vector transformed into Camera space.

### ToSpace

- The ToSpace operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- Another control allows the picking of the reference object.
- The output returns the Vector transformed from World space into the reference object's space.

### ToWorld

- The ToWorld operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The output returns the Vector transformed from object space into World space.

### TransformByQuat

- The TransformByQuat operator has two inputs and one output.
- The first input defines the Quat value to transform by and defaults to Quat 0,0,0,1 when not connected.
- The second input defines a Quat or Vector value to be transformed. It defaults to a Vector of 0,0,0 when not connected.
- The output is the Quat or Vector value from the second input transformed by the Quat value in the first input.

## Trigonometry Category

### ACos

- The ACos operator has one input and one output.
- The input must be a Float value in the range from -1.0 to 1.0.
- The output is inverse of the Cosine function as angle in degrees in the range from 0 to pi.

### ASin

- The ASin operator has one input and one output.
- The input must be a Float value in the range from -1.0 to 1.0.
- The output is the inverse of the Sine function as an angle in radians.
- The Result is in the range from -pi/2 to pi/2.

### ATan

- The ATan operator has one input and one output.
- The input must be a Float value.
- The output is the inverse of the Tangent function as angle in radians.
- The result is in the range from -pi/2 to pi/2.

### ATan2

- The ATan2 operator has two inputs and one output.
- The two inputs must be Float values.
- The output is the inverse of the Tangent function of the quotient of the two inputs as an angle in radians.
- The output uses the sign of each input to choose the appropiate quadrant.
- The Result is in the range from -pi to pi.

### Cos

- The Cos operator has one input and one output.
- The input must be a Float value representing the angle in radians.
- The output is the Cosine function for the given angle.

### Sin

- The Sin operator has one input and one output.
- The input must be a Float value representing the angle in radians.
- The output is the Sine function for the given angle.

### Tan

- The Tan operator has one input and one output.
- The input must be a Float value representing the angle in radians.
- The output is the Tangent function (sin(X)/cos(X)) for the given angle.

## Vector Category

### ComponentSum

- The ComponentSum operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The output is the sum of its components.

### Magnitude

- The Magnitude operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The output is a Float value representing the length (magnitude) of the Vector.

### MatrixMulVec

- The MatrixMulVec operator has four inputs and one output.
- The first input is the Vector and defaults to 0,0,0 when unconnected.
- The second, third and fourth inputs are the columns of the Matrix and default to [1,0,0], [0,1,0] and [0,0,1] when unconnected.
- The output is a Vector representing the matrix multiplied by the first input's vector.

### Normalize

- The Normalize operator has one input and one output.
- The input must be a Vector and has no default value when unconnected.
- The output is the normalized (lenght 1.0) vector with the same direction as the input.

### VectorCross

- The VectorCross operator has two inputs and one output.
- The two inputs must be Vector values and have no default values when unconnected.
- The output is the vector cross product of the two inputs - a vector perpendicular to the two vectors and with length equal to the area of the parallelogram defined by the two vectors.

### VectorDot

- The VectorDot operator has two inputs and one output.
- The two inputs must be Vectors and have no default values when unconnected.
- NOTE that the VectorDot result only makes sense when the two inputs are Normalized.
- The output is a Float representing the length of the projection of the one vector onto the other.