Upload
fabric-software-inc
View
658
Download
1
Embed Size (px)
DESCRIPTION
Details on the new Python scene graph that will be released with Fabric Engine 2.0 in Spring 2014. You can see a video presentation of this deck here: https://vimeo.com/84300368
Citation preview
●○
●
○●●
Scene Graph Node(Python)
DGNode OtherDGNodeInteger foo; Scalar bar<>;
String strings<>;
●○
●○
●
Node Type A Node Type BPort inPort(Node Type A)
●○○
●○
● Parameter foo(Scalar)● Parameter bar(Integer)def __onConnectInPort(self, otherNode):
if disconnecting: dgnode.removeDependency(‘otherNode’) elif connecting: dgnode.setDependency(‘otherNode’, otherDGNode)
●
○●
○○
●●
●
● Most DCCs follow this model○ e.g. ICE, Maya, Houdini, Nuke...
Node A Node BInPort of ‘Value Type A’OutPort of ‘Value Type A’
OutPort of ‘Value Type B’
● 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.
InPort of ‘Value Type C’
Node A Node BTypeA aTypeA aVar
operator myOp( in TypeA a, io TypeC result){ result = a.get();}
Node ATypeA aVar TypeB result
Node BTypeA a TypeB result
parameterLayout = [ self.a, self.result]
parameterLayout = [ nodeA.aVar, self.result]
operator myOp( in TypeA a, io TypeC result){ result = a.get();}
Viewport
viewportParams RenderSequenceDataViewportParamsviewportParamsWidth
HeightWidthHeight RenderSequenceData
Core:(KL, DGNodes, dependencies, operators, bindings)
Scene Graph:(Nodes, Ports, Parameters)
Core:(KL)
Data-flow Graph:(Nodes, Ports, Operators)
Scene Graph:(Node presets, operator code, custom classes)
class MyNode(SceneGraphNode): def __init__(): dgnode = self.constructDGNode() # Explicit construction of DGNodes dgnode.addMember('toggle', 'Boolean') # Explicit member management self.addMemberParameter(dgnode,'toggle', True) # 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())
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.
●○
●○
InPortScalarArray[]
Scalar
ScalarArray[]
Scalar
Port merges inputs into a single array which is bound to operators.
○■
Geometry Instance
material
Transform
geometry
GeometryGeometry
TransformglobalXfo
MaterialRenderParams
GeometryInstance
●●
○○○
Alembic ImporterGeometries[]
filters[]
fileLocation
GeometryInstances[]
●●●
Alembic ImporterGeometries[]
filters[]
fileLocation
GeometryInstances[]
Instancer
GeometryInstances[]
Transforms[] GeometryInstances[]
Transform LibraryTransforms[]
RenderData
ViewportrenderData
Geometry InstanceGeometry
Transform
Material ViewportrenderDataImporter
geometryInstances renderData
MyPrim Twist DeformerinGeomgeometryWidth
Height twist
outGeom
●●
○
●○
●○
●●
●●●
○●
●●●●●