Mercurial > code > home > repos > light9
diff blender/time_sync/time_from_graph.py @ 2457:d94480bfb179
more work on blender time sync. Might be working, aside from blender play-button
author | drewp@bigasterisk.com |
---|---|
date | Tue, 20 May 2025 13:48:07 -0700 |
parents | 2d454737a916 |
children | 0e27ba33118c |
line wrap: on
line diff
--- a/blender/time_sync/time_from_graph.py Tue May 20 09:25:18 2025 -0700 +++ b/blender/time_sync/time_from_graph.py Tue May 20 13:48:07 2025 -0700 @@ -3,12 +3,14 @@ import time from typing import Coroutine +from attr import dataclass from rdfdb.patch import Patch from rdfdb.syncedgraph.syncedgraph import SyncedGraph from rdflib import Literal from light9 import networking, showconfig from light9.ascoltami.graph_context import ascoltamiContext +from light9.ascoltami.play_state import AscoPlayState from light9.namespaces import L9 from light9.newtypes import decimalLiteral from light9.run_local import log @@ -24,23 +26,17 @@ ) - - - class Sync: """asco is the authority on playback status. Sync maintains a copy of the state""" lock = threading.Lock() - # these are written ONLY by bg thread - duration: float = 1 - wallStartTime: float | None = None - pausedSongTime: float | None = None - latestSongTime: float - playing = False + # this is edited ONLY by bg thread + ascoPlayState: AscoPlayState def __init__(self): # main thread - self.blenderTime = BlenderTime(self.onEvent) + self.ascoPlayState = AscoPlayState(None, None, False, False, 1.0) + self.blenderTime = BlenderTime(self.onBlenderEvent, self.ascoPlayState) self.blenderTime.start() self.ctx = ascoltamiContext(showconfig.showUri()) @@ -48,12 +44,12 @@ self._loop = startLoopInThread(self.connectGraph()) log.info('🚋10 Sync initd') - def onEvent(self, event: _TimeEvent): + def onBlenderEvent(self, event: _TimeEvent): # main thread match event: case SceneLoaded(): - if hasattr(self, "latestSongTime"): - self.blenderTime.setBlenderTime(self.latestSongTime, self.duration) + self.blenderTime.setRange(self.ascoPlayState.duration) + self.blenderTime.setCurrentTime(self.ascoPlayState.getCurrentSongTime() or 0.0) case PausedGotoTime(t): self.runInBackgroundLoop(self.setInGraph(t, False)) case PlayingGotoTime(t): @@ -73,20 +69,18 @@ # bg thread with self.lock: asco = L9['ascoltami'] - self.wallStartTime = typedValue(float | None, self.graph, asco, L9['wallStartTime']) - self.pausedSongTime = typedValue(float | None, self.graph, asco, L9['pausedSongTime']) - self.duration = typedValue(float | None, self.graph, asco, L9['duration']) or 1.0 - self.playing = typedValue(bool | None, self.graph, asco, L9['playing']) or False - - def currentTime(self) -> float | None: - if self.wallStartTime is not None: - return time.time() - self.wallStartTime - if self.pausedSongTime is not None: - return self.pausedSongTime - log.warn('no time data') - return None + + self.ascoPlayState.wallStartTime = typedValue(float | None, self.graph, asco, L9['wallStartTime']) + self.ascoPlayState.pausedSongTime = typedValue(float | None, self.graph, asco, L9['pausedSongTime']) + self.ascoPlayState.duration = typedValue(float | None, self.graph, asco, L9['duration']) or 1.0 + self.blenderTime.durationDirty = True # todo: called too often + self.ascoPlayState.playing = typedValue(bool | None, self.graph, asco, L9['playing']) or False + self.ascoPlayState.endOfSong = typedValue(bool | None, self.graph, asco, L9['endOfSong']) or False + log.info(f'🍇 syncFromGraph {self.ascoPlayState=}') + self.blenderTime.curFrameDirty = True async def setGraphPlaying(self, isBlenderPlaying: bool): + return # bg thread log.info(f'set graph playing to {isBlenderPlaying}') self.graph.patchObject(self.ctx, L9['ascoltami'], L9['playing'], Literal(isBlenderPlaying))