Moved Parameter definition from keyframe to track

This commit is contained in:
Maximilian Giller 2025-09-21 16:50:34 +02:00
parent 4b598679f6
commit 5970b70d7e

View file

@ -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)],
)
],
)