Lua Observers
New Lua observers and additional callbacks for existing observers.
Transform Node Observer
There is a new type of observer that can be registered from Lua, which observes changes in internal scenegraph nodes dealing with world and local transforms, as well as world and local enabled states.
Difference from property observer
A transform observer differs from a normal property observer because it only observes the Enabled
and Transform
properties, and is also notified in response to changes of state on any ancestor of the node being observed.
When an assembly node is disabled, all of its descendants are also considered to be disabled in terms of application systems traversing the tree to process child nodes. However, a normal property observer on an Enabled
property of one of these descendants would not be notified of this change because the property of that node hasn't actually changed.
Equally when an assembly node is moved, all of its descendants world transform change due to the nature of the transform hierarchy. A property observer on a Transform
property of one of these descendants would not be notified of this change because the local transforms on these assemblies does not actually change when an ancestor transform changes.
This is the problem solved by the transform node observer.
Example
A transform observer is added using the vrAddTransformNodeObserver function.
Consider this hierarchy of assembly nodes in the Scenes tree:
Scenes
- A
- B
- C
The following code snippet, executed in the console, will add a transform observer to the C
assembly node, providing callback functions for transform and enabled state changes that print out a message that show the state notification was successful.
vrAddTransformNodeObserver("myObserver",
function(node, matrix) print("transform changed") end,
function(node, enabled) print("enabled state changed") end,
vrTreeRoot().Scenes.A.B.C
)
After running this example code, changing the transform or enabled property of any of
A
,
B
, or
C
will trigger the print messages.
The observer can also be removed using the vrRemoveObserver function, by providing the name (in this case "myObserver").
Changes to Node and MetaNode Observers
vrAddNodeObserver and vrAddMetaNodeObserver have been extended to support additional callbacks.
Node Observer
You can now specify a callback for when the observed node is destroyed.
vrAddNodeObserver("myObserver",
function(node) print("node property changed") end,
vrTreeRoot().Scenes.A,
nil,
function(node) print("node destroying") end
)
MetaNode Observer
You can now specify callbacks for parent change, renaming, and destroying.
vrAddMetaNodeObserver("myObserver",
function(meta, node) print("node instance created") end,
"Assembly",
nil,
function(meta, node, old, new) print("node parent changed from old to new") end,
function(meta, node) print("node instance renamed") end,
function(meta, node) print("node instance destroying") end
)