diff --git a/flax/Node.py b/flax/Node.py --- a/flax/Node.py +++ b/flax/Node.py @@ -6,7 +6,7 @@ NoChange = "NoChange" class NodeType: def __init__(self, iports=None, oports=None): make_attributes_from_args('iports', 'oports') - def process(self,iports,oports): + def process(self): pass # TODO: handle NoChange stuff @@ -34,10 +34,10 @@ class SumNode(NodeType): 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, iports, oports): + NodeType.__init__(self, iports={'in1' : Port, + 'scale1' : Port}, + oports={'out1' : Port}, + def process(self, ports): ports.out1 = ports.in1 * ports.scale1 class FadeConstellation(Constellation): @@ -75,106 +75,3 @@ class FadeConstellation(Constellation): | out | """ - -Persistence -node instance saves: - node name, id, and such - input ports: - any port details - what the port connects to - values: - maybe UI.Scale level - maybe group contents - - -p=InputPort(node=self,minconns=1,maxconns=2) # an input port to this node -p.connect(othernode) -print p.connections() -p.connect(yetanother) - -op=OutputPort(node=self) # an output port -print op.connections() # lists all the nodes that call us an input node -op.connect(n) # calls n.connect(self) - - - - -Ports - Port: "scalar" - MultiPort: "array of Port" - ^ all wrong - - Ports II: - min/max number of connections - (failure to fit these numbers means port is "deactivated") - "Normal" ports are min=1, max=1 - "Multiports" are min=0, max=None - "Binary" ports are min=2, max=2 - oh yeah, there are two totally different types of ports - - Input ports: min/max numbers of connections - store current connections - Output ports: nothing - store nothing! - -fake node persistence for subtract node - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8.3 - - 0 - 100 - - - - very high - 395 - 21 - - - - - diff --git a/flax/Timeline.py b/flax/Timeline.py --- a/flax/Timeline.py +++ b/flax/Timeline.py @@ -4,13 +4,10 @@ from time import time from __future__ import division # "I'm sending you back to future!" """ -Changelog: -Fri May 16 15:17:34 PDT 2003 - Project started (roughly). - -Mon May 19 17:56:24 PDT 2003 - Timeline is more or less working. Still bugs with skipping - FunctionFrames at random times. +Quote of the Build (from Ghostbusters II) +Dana: Okay, but after dinner, I don't want you putting any of your old cheap + moves on me. +Peter: Ohhhh no! I've got all NEW cheap moves. Timeline idea ============= @@ -177,15 +174,17 @@ class BounceFunction(FunctionFrame): class LoopFunction(FunctionFrame): def __call__(self, timeline, timedevent, node): timeline.set_time(0) - print 'looped!' + # print 'looped!' class DoubleTimeFunction(FunctionFrame): def __call__(self, timeline, timedevent, node): timeline.set_rate(2 * timeline.rate) + print 'doubled!', timeline.rate class HalfTimeFunction(FunctionFrame): def __call__(self, timeline, timedevent, node): timeline.set_rate(0.5 * timeline.rate) + print 'halved!', timeline.rate class TimedEvent: """Container for a Frame which includes a time that it occurs at, @@ -326,6 +325,8 @@ class TimelineTrack: be included. This is because this is used to find FunctionFrames and we assume that any function frames at the start point (which could be i or j) have been processed.""" + return [e for e in self.events if e >= i and e <= j] + if direction == FORWARD: return [e for e in self.events if e > i and e <= j] else: @@ -416,8 +417,6 @@ class Timeline: last_clock = clock_time diff = clock_time - last_clock new_time = (self.direction * self.rate * diff) + last_time - new_time = max(new_time, 0) - new_time = min(new_time, self.length()) # update the time self.last_clock_time = clock_time @@ -426,6 +425,7 @@ class Timeline: # now, find out if we missed any functions if self.fn_track.has_events(): lower_time, higher_time = last_time, new_time + if lower_time == higher_time: print "zarg!" if lower_time > higher_time: lower_time, higher_time = higher_time, lower_time @@ -436,6 +436,11 @@ class Timeline: # they better be FunctionFrames event.frame(self, event, None) # the None should be a Node, # but that part is coming later + + # now we make sure we're in bounds (we don't do this before, since it + # can cause us to skip events that are at boundaries. + self.current_time = max(self.current_time, 0) + self.current_time = min(self.current_time, self.length()) def reverse_direction(self): """Reverses the direction of play for this node""" self.direction = self.direction * -1 @@ -475,18 +480,20 @@ if __name__ == '__main__': T(10, scene3, blender=smoove), T(15, scene2)) # last TimedEvent doesn't need a blender - if 1: + halver = HalfTimeFunction('1/2x') + doubler = DoubleTimeFunction('2x') + if 0: # bounce is semiworking bouncer = BounceFunction('boing') - halver = HalfTimeFunction('1/2x') - doubler = DoubleTimeFunction('2x') tl = Timeline([track1], [T(0, bouncer), T(0, halver), T(15, bouncer), T(15, doubler)]) else: looper = LoopFunction('loop1') - tl = Timeline([track1], [T(14, looper)]) + tl = Timeline([track1], [T(0, doubler), + T(5, halver), + T(14, looper)]) tl.play() import Tix