The document describes a node-based scene graph and data flow system. It discusses representing nodes as objects that contain ports, parameters and bindings to operator functions. Connecting ports automatically generates dependencies between nodes and binds operators. This abstracts away the underlying core data flow graph. Later sections provide examples of node types for importing assets, instancing geometry, deforming objects and rendering in a viewport. The system aims to provide an intuitive and flexible way to construct scenes and simulations through a node-based visual programming paradigm.
4. Node Type A
Node Type B
Port inPort(Node Type A)
def __onConnectInPort(self, otherNode):
if disconnecting:
dgnode.removeDependency(‘otherNode’)
elif connecting:
dgnode.setDependency(‘otherNode’,
otherDGNode)
●
○
○
●
○
●
●
Parameter foo(Scalar)
Parameter bar(Integer)
6. ●
●
●
● Most DCCs follow this model
○ e.g. ICE, Maya, Houdini, Nuke...
7. Node A
Node B
OutPort of ‘Value Type A’
InPort of ‘Value Type A’
OutPort of ‘Value Type B’
InPort of ‘Value Type C’
● Merge Parameters and Ports into a single concept.
● OutPorts of a data type connect to InPorts of that data type
● Dependencies and Operator Bindings are generated from the
Node’s InPorts
○
Connecting ports sets dependencies, and generates bindings.
8. Node A
TypeA aVar
Node B
TypeA a
TypeB result
Node A
TypeA aVar
Node B
TypeA a
TypeB result
operator myOp(
in TypeA a,
io TypeC result)
{
result = a.get();
}
operator myOp(
in TypeA a,
io TypeC result)
{
result = a.get();
}
parameterLayout = [
self.a,
self.result
]
parameterLayout = [
nodeA.aVar,
self.result
]
11. class MyNode(SceneGraphNode):
def __init__():
dgnode = self.constructDGNode()
dgnode.addMember('toggle', 'Boolean')
self.addMemberParameter(dgnode,'toggle', True)
# Explicit construction of DGNodes
# Explicit member management
# Expose values on the UI.
self.bindDGOperator(dgnode.bindings, # Explicit binding of operators #
name = 'myOp',
fileName = 'MyNode.kl',
layout = [
'self.toggle,
'otherNode.geometry',
]
)
self.addInPort('inport', NodeType, …, self.__callback) # Ports with callbacks
def __callback(data):
# to set dependencies.
if disconnecting:
self.getDGNode().removeDependency('otherNode’)
if connecting:
self.getDGNode().setDependency('otherNode’, data.getDGNode())
12. class MyNode(SceneGraphNode):
def __init__():
self.addInPort('
toggle', 'Boolean', …)
self.addInPort('inGeom', 'Geometry', …)
self.addOutPort('result', 'Geometry', …)
self.bindOperator(
name = 'myOp',
fileName = 'MyNode.kl',
)
●
●
●
MyNode exposes 2 inputs, 1 output, and binds an operator
The operator bindings are generated automatically when the
ports are connected.
The Core DG is completely abstracted.