diff --git a/flax/Show.py b/flax/Show.py new file mode 100644 --- /dev/null +++ b/flax/Show.py @@ -0,0 +1,102 @@ +from Timeline import * +from Submaster import Submasters, sub_maxes + +class Show: + def __init__(self, timelines, submasters): + self.timelines = dict([(timeline.name, timeline) + for timeline in timelines]) + self.submasters = submasters + self.current_timeline = None + self.current_time = 0 + def calc_active_submaster(self): + "get levels from the current timeline at the current time" + if not (self.current_timeline or self.current_time): + return {} + tl = self.current_timeline + tl.set_time(self.current_time) + levels = tl.get_levels() + scaledsubs = [self.submasters.get_sub_by_name(sub) * level \ + for sub, level in levels.items()] + maxes = sub_maxes(*scaledsubs) + + return maxes + def set_timeline(self, name): + "select a timeline" + self.current_timeline = self.timelines.get(name) + if not self.current_timeline: + print "Show: '%s' is not the name of a timeline." % name + else: + self.set_time(0) + def set_time(self, time): + "set time of current timeline" + self.current_time = time + if not self.current_timeline: + return + self.current_timeline.set_time(time) + def get_timelines(self): + "Get names of all timelines" + return self.timelines.keys() + +# this is the default blender +linear = LinearBlender() +def T(time, level, **kw): + """This used to be a synonym for TimedEvent: + + T = TimedEvent + + It now acts in a similar way, except that it will fill in a default + blender if you don't. The default blender is a LinearBlender. It also + sets frame to MISSING so the track can fill it in.""" + if 'blender' not in kw: + global linear + kw['blender'] = linear + + return TimedEvent(time, level=level, frame=MISSING, **kw) + +def translate_tracks_from_file(timelinename): + try: + f = open('timelines/' + timelinename) + except IOError: + return [] + + events = {} + current_sub = None + current_time = None + lines = f.readlines() + alltext = ' '.join(lines) + + for token in alltext.split(): + # print 't', token + if token.endswith(':'): + # print 'sub' + current_sub = token[:-1] + current_time = None + else: + if not current_sub: + raise "invalid file format", line + if current_time is not None: # we now have a level + # print 'level' + try: + level = float(token) + except: + print "bad level token", token + level = 0 + # time to write + events.setdefault(current_sub, []) + events[current_sub].append((current_time, level)) + current_time = None + else: + # print 'time' + try: + current_time = float(token) + except ValueError: + print "bad time token", token + current_time = 0 + + tracks = [] + for sub, timelevels in events.items(): + tracks.append(TimelineTrack(sub, default_frame=sub, + *[T(time, level) for time, level in timelevels])) + + return tracks +