diff --git a/src/models.py b/src/models.py index d5de638..98b955c 100644 --- a/src/models.py +++ b/src/models.py @@ -161,9 +161,6 @@ class Keyframe: time: Decimal """Point of time of the keyframe. Stored as decimal for high precision.""" - parameter: Parameter - """Parameter targeted by frame value.""" - value: KeyframeValue = None """Targeted state value reached by reaching the keyframe.""" @@ -175,27 +172,17 @@ class Keyframe: class EngineKeyframe: """A keyframe for engine use during rendering.""" - keyframes: list[Keyframe] - """Reference keyframes.""" + frame: Keyframe + """Reference keyframe.""" delta: Decimal """Remaining time in seconds relative to previous keyframes.""" - def __iter__(self) -> Iterator[Keyframe]: - return iter(self.keyframes) - - def get(self, parameter: Parameter) -> Keyframe: - """Get keyframe for parameter found among the keyframes. Assumed to exist only once. Exception raised, if parameter not defined by keyframes.""" - for k in self.keyframes: - if k.parameter == parameter: - return k - raise ValueError(f"Parameter [{parameter}] not given among keyframes.") - @dataclass_json @dataclass class Track: - """Contains a sequence of keyframes for specified fixtures.""" + """Contains a sequence of keyframes for specified fixtures and parameter.""" id: str """Unique identifier for track.""" @@ -203,6 +190,9 @@ class Track: name: str """Human readable name.""" + parameter: Parameter + """Parameter targeted by frame value.""" + fixture_ids: list[str] """Fixtures by ids targeted by track.""" @@ -218,10 +208,10 @@ class EngineTrack: """Reference track.""" keyframes: list[EngineKeyframe] = field(default_factory=list) - """Relative keyframes of track.""" + """Relative engine keyframes of track.""" current: EngineKeyframe | None = None - """Keyframes before the next keyframes. Trigger time has been reached.""" + """Keyframe before the next keyframe. Trigger time has been reached.""" @property def next(self) -> EngineKeyframe | None: @@ -238,20 +228,12 @@ class EngineTrack: def __post_init__(self): # Calculate relative keyframes sorted_keyframes = sorted(self.track.keyframes, key=lambda k: k.time) - prev_time: Decimal = Decimal.from_float(0) - curr_time: Decimal = Decimal.from_float(0) - keyframes = [] - for k, next in zip(sorted_keyframes, [*sorted_keyframes[1:], None]): - curr_time = k.time - keyframes.append(k) - - if next is None or k.time != next.time: - self.keyframes.append(EngineKeyframe(keyframes, curr_time - prev_time)) - - if next is not None: - keyframes = [] - prev_time = curr_time - curr_time = next.time + # Make keyframe time relative for engine use + for previous, current in zip([None, *sorted_keyframes[1:]], sorted_keyframes): + delta = current.time + if previous: + delta -= previous.time + self.keyframes.append(EngineKeyframe(current, delta)) def step(self, step_size: Decimal): """Step keyframes forward by given step.""" @@ -340,8 +322,9 @@ if __name__ == "__main__": Track( "89idf", "Ceiling flicker", + Parameter.BRIGHTNESS, ["98iwd"], - [Keyframe(Decimal.from_float(0), Parameter.BRIGHTNESS, 1)], + [Keyframe(Decimal.from_float(0), 1)], ) ], )