threaded interpolator

This commit is contained in:
q
2025-08-18 15:39:41 +03:00
parent 6d2f5189b7
commit 73cf3a3d76

View File

@@ -21,7 +21,7 @@ PLUGIN_FOLDER = os.path.expanduser("~/.config/tsmark/plugins")
COLOR_PREPOST = (0, 128, 128)
COLOR_KEY = (60, 205, 60)
COLOR_KEY_OCCLUDED = (60, 96, 60)
COLOR_KEY_OCCLUDED = (50, 128, 50)
COLOR_INTERP = (192, 0, 192)
COLOR_INTERP_OCCLUDED = (128, 0, 128)
COLOR_HIDDEN = (60, 60, 60)
@@ -656,6 +656,11 @@ class World:
post: after any keyframes
"""
process = threading.Thread(target=self.interpolate_points_in_thread, args=(point_index,))
process.start()
def interpolate_points_in_thread(self, point_index=None):
if point_index is None:
point_index = self.point_index
@@ -671,15 +676,18 @@ class World:
if not point_index in self.points_interpolated:
self.points_interpolated[point_index] = {key: {} for key in range(self.frames)}
new_points = {k: v for k, v in self.points_interpolated[point_index].items()}
if len(self.points[point_index]) == 1: # only one point added
key = list(self.points[point_index].keys())[0]
vals = self.points[point_index][key]
for key in range(self.frames):
self.points_interpolated[point_index][key] = i_point()
self.points_interpolated[point_index][key].update(vals)
self.points_interpolated[point_index][key]["type"] = "pre"
new_points[key] = i_point()
new_points[key].update(vals)
new_points[key]["type"] = "pre" if key < self.nr else "post"
self.points_interpolated[point_index][self.nr]["type"] = "key"
new_points[self.nr]["type"] = "key"
self.points_interpolated[point_index] = new_points
else: # more points
point_keys = list(sorted(list(self.points[point_index].keys())))
@@ -691,14 +699,14 @@ class World:
t2 = np.arange(start_key, end_key)
# Pre points
for key in range(0, start_key):
self.points_interpolated[point_index][key]["type"] = "pre"
self.points_interpolated[point_index][key].update(self.points[point_index][start_key])
new_points[key]["type"] = "pre"
new_points[key].update(self.points[point_index][start_key])
# interpolated points
visible = self.points[point_index][start_key]["visible"]
for row in np.vstack((t2, spline(t2))).T:
if row[0] in point_keys:
visible = self.points[point_index][row[0]]["visible"]
self.points_interpolated[point_index][row[0]] = {
new_points[row[0]] = {
"type": "interp",
"x0": int(row[1]),
"y0": int(row[2]),
@@ -709,7 +717,7 @@ class World:
# post points
for key in range(end_key, self.frames + 1):
self.points_interpolated[point_index][key] = {
new_points[key] = {
"type": "post",
"x0": int(row[1]),
"y0": int(row[2]),
@@ -719,14 +727,16 @@ class World:
}
# clicked points (not necessary, could determine at draw time!)
for key in point_keys:
self.points_interpolated[point_index][key]["type"] = "key"
new_points[key]["type"] = "key"
age = 0
for key in self.points_interpolated[point_index]:
if self.points_interpolated[point_index][key]["type"] == "key":
for key in new_points:
if new_points[key]["type"] == "key":
age = 0
if self.points_interpolated[point_index][key]["type"] == "interp":
if new_points[key]["type"] == "interp":
age += 1
self.points_interpolated[point_index][key]["age"] = age
new_points[key]["age"] = age
self.points_interpolated[point_index] = new_points
def draw_help(self, frame):