Files
orisys-sdk/examples/gui/mesh_render_worker.py
T
ykcheungab 2e5c047d1e 1. tuned arrow mesh drawing
2. centralixzed arrow config in layout.py
3. seperate mesh render and display resolution to speed up (~40 fps)
2026-06-19 14:28:28 +08:00

75 lines
2.3 KiB
Python

"""Background Open3D mesh rendering for the Qt dashboard."""
from __future__ import annotations
import numpy as np
from PyQt5.QtCore import QMutex, QMutexLocker, QThread, pyqtSignal
class MeshRenderWorker(QThread):
"""Render finger mesh off the GUI thread; drops stale frames."""
rgb_ready = pyqtSignal(object)
def __init__(self, parent=None):
super().__init__(parent)
self._mutex = QMutex()
self._stop = False
self._wake = False
self._renderer = None
self._pending: dict | None = None
def set_renderer(self, renderer) -> None:
with QMutexLocker(self._mutex):
self._renderer = renderer
def clear_renderer(self) -> None:
with QMutexLocker(self._mutex):
self._renderer = None
self._pending = None
def submit(self, *, flow, scalar_map, centroid, centroid_found, fnormal) -> None:
with QMutexLocker(self._mutex):
self._pending = {
"flow": flow,
"scalar_map": scalar_map,
"centroid": centroid,
"centroid_found": centroid_found,
"fnormal": fnormal,
}
self._wake = True
if not self.isRunning():
self.start()
def stop_worker(self) -> None:
with QMutexLocker(self._mutex):
self._stop = True
self._wake = True
self.wait(2000)
def run(self) -> None:
while True:
with QMutexLocker(self._mutex):
if self._stop:
break
if not self._wake or self._renderer is None or self._pending is None:
self.msleep(1)
continue
job = self._pending
self._pending = None
self._wake = False
renderer = self._renderer
rgb = renderer.render(
flow=job["flow"],
scalar_map=job["scalar_map"],
centroid=job["centroid"],
centroid_found=job["centroid_found"],
fnormal=job["fnormal"],
)
self.rgb_ready.emit(np.ascontiguousarray(rgb))
with QMutexLocker(self._mutex):
if self._pending is not None:
self._wake = True