The absolute (CTRL_ABSOLUTE) and relative (CTRL_RELATIVE) options are used by both Control::GetValue() and Control::SetValue() in a similar way.
-
Control::GetValue()
-
- CTRL_RELATIVE means that we're passing in a data structure which already contains a value and the controller is supposed to modify that
value. In the case of position, rotation, scale, and TM controllers, this structure is a matrix. Note that not all controllers
work in this way. A Lookat constraint, for example, ignores the incoming transform, because the desired world orientation
is independent of the incoming orientation.
- CTRL_ABSOLUTE indicates that we want the absolute value directly from the controller.
- CTRL_RELATIVE means that we're passing in a data structure which already contains a value and the controller is supposed to modify that
value. In the case of position, rotation, scale, and TM controllers, this structure is a matrix. Note that not all controllers
work in this way. A Lookat constraint, for example, ignores the incoming transform, because the desired world orientation
is independent of the incoming orientation.
- CTRL_ABSOLUTE indicates that we want the absolute value directly from the controller.
-
Control::SetValue()
-
- CTRL_ABSOLUTE indicates that the given value should completely replace the current value in the controller.
- CTRL_RELATIVE indicates that the given value should be 'added' to the current value. For data types which operate in a multiplicative space
(rotation and scale) 'added' means 'multiply'.
- CTRL_ABSOLUTE indicates that the given value should completely replace the current value in the controller.
- CTRL_RELATIVE indicates that the given value should be 'added' to the current value. For data types which operate in a multiplicative space
(rotation and scale) 'added' means 'multiply'.
In the example of a position controller, CTRL_RELATIVE indicates that the val pointer passed in points to a matrix. Typically the position controller would then pre-multiply in its translation however
the controller could modify the matrix in other ways. For example the path controller overwrites the translation portion of
the matrix instead of pre-multiplying.
Note about Rotation Controllers
One other important issue is that rotation controllers expect different data types depending on whether Control::GetValue() or Control::SetValue() are called with CTRL_ABSOLUTE or CTRL_RELATIVE. In the CTRL_RELATIVE case, an angle/axis structure is used, and in the CTRL_ABSOLUTE case a quaternion is used. This allows for multiple revolutions to be tracked by the controller (which would have been lost
if the angle/axis was converted to a quaternion).