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))