# super rough code # The magic value NoChange = "NoChange" class NodeType: def __init__(self, iports=None, oports=None): make_attributes_from_args('iports', 'oports') def process(self): pass # TODO: handle NoChange stuff class AddNode(NodeType): """Adds two nodes together""" def __init__(self): NodeType.__init__(self, iports={'in1' : Port, 'in2' : Port}, oports={'out1' : Port}) def process(self, ports): ports.out1 = ports.in1 + ports.in2 class SumNode(NodeType): """Adds any number of nodes together""" def __init__(self, empty_val=0): NodeType.__init__(self, iports={'in1' : MultiPort}, oports={'out1' : Port}) self.empty_val = 0 def process(self, ports): val = self.empty_val for p in ports.in1: val += p ports.out1 = val class FadeNode(NodeType): """Provides a UI scaler to let you fade a value""" def __init__(self): NodeType.__init__(self, iports={'in1' : Port, 'scale1' : Port}, oports={'out1' : Port}, def process(self, ports): ports.out1 = ports.in1 * ports.scale1 class FadeConstellation(Constellation): """This somehow describes the following: [ ] [ UI.Scale ] | | | in | scale | ____ / | | [ FadeNode ] | | out | [ ] Maybe this is a group (I like this more): | | in | FadeGroup - - - - - - - - - - - - -- - - | | | | [ UI.Scale ] | | | | | in | scale | | ____ / | | | | [ FadeNode ] | | | | out | | \ - - - - - - - - - - - -- - - / | | out | """