From fc730f58543805742dc6b1e799980bd18a081520 Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 13 May 2026 17:12:33 +0200 Subject: [PATCH 1/3] feat: bump default fixed overlay seg limit --- src/skeleton/segment_overlay.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/skeleton/segment_overlay.ts b/src/skeleton/segment_overlay.ts index 2d07645de3..91cb56c6c8 100644 --- a/src/skeleton/segment_overlay.ts +++ b/src/skeleton/segment_overlay.ts @@ -144,7 +144,7 @@ export function buildSpatiallyIndexedSkeletonOverlayGeometry( }; } -export const DEFAULT_MAX_RETAINED_OVERLAY_SEGMENTS = 4; +export const DEFAULT_MAX_RETAINED_OVERLAY_SEGMENTS = 16; function normalizeSegmentId(segmentId: number) { const normalizedSegmentId = Math.round(Number(segmentId)); From aa3844940798a5de0c38d22ae5264a4b04ffb1bf Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 13 May 2026 17:20:40 +0200 Subject: [PATCH 2/3] fix: check for source changes for invalidation previously the layer was just checking for if the layer changed away from having spatial skels. But if you change the source, then it never knew and would render stale data and have a stale history which doesn't apply to the source. --- src/layer/segmentation/index.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/layer/segmentation/index.ts b/src/layer/segmentation/index.ts index 28b7df3a29..e4b6fda2a7 100644 --- a/src/layer/segmentation/index.ts +++ b/src/layer/segmentation/index.ts @@ -1007,6 +1007,8 @@ export class SegmentationUserLayer extends Base { readonly spatialSkeletonState = this.registerDisposer( new SpatialSkeletonState(), ); + private _currentSpatialSkeletonSource: + SpatiallyIndexedSkeletonSource | undefined = undefined; readonly selectedSpatialSkeletonNodeId = new WatchableValue< number | undefined >(undefined); @@ -1563,12 +1565,13 @@ export class SegmentationUserLayer extends Base { break; } } - if (!hasSpatialSkeletonLayer) { + const newSource = this.getSpatialSkeletonCommandHistorySource(); + const sourceChanged = newSource !== this._currentSpatialSkeletonSource; + this._currentSpatialSkeletonSource = newSource; + if (!hasSpatialSkeletonLayer || sourceChanged) { this.spatialSkeletonState.clearInspectedSkeletonCache(); } - this.spatialSkeletonState.updateCommandHistorySource( - this.getSpatialSkeletonCommandHistorySource(), - ); + this.spatialSkeletonState.updateCommandHistorySource(newSource); } private getSpatialSkeletonCommandHistorySource() { From 1b64eb6acfb207842073fcaefcbdcd8aa63b5170 Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 13 May 2026 17:22:37 +0200 Subject: [PATCH 3/3] fix: when removing all nodes from a seg, remove in overlay retained seg --- src/datasource/catmaid/spatial_skeleton_commands.ts | 3 +++ src/skeleton/frontend.ts | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/datasource/catmaid/spatial_skeleton_commands.ts b/src/datasource/catmaid/spatial_skeleton_commands.ts index de45323945..f9af10437e 100644 --- a/src/datasource/catmaid/spatial_skeleton_commands.ts +++ b/src/datasource/catmaid/spatial_skeleton_commands.ts @@ -846,6 +846,9 @@ function applyDeleteNodeToCache( if (remainingSegmentNodes.length === 0) { removeVisibleSegment(layer, node.segmentId, { deselect: true }); } + layer + .getSpatiallyIndexedSkeletonLayer() + ?.removeRetainedOverlaySegmentIfEmpty(node.segmentId); layer.markSpatialSkeletonNodeDataChanged({ invalidateFullSkeletonCache: false, }); diff --git a/src/skeleton/frontend.ts b/src/skeleton/frontend.ts index 4867bf1a56..f549d3df24 100644 --- a/src/skeleton/frontend.ts +++ b/src/skeleton/frontend.ts @@ -2222,6 +2222,17 @@ export class SpatiallyIndexedSkeletonLayer return true; } + removeRetainedOverlaySegmentIfEmpty(segmentId: number) { + const nodes = this.inspectionState?.getCachedSegmentNodes(segmentId); + if (nodes === undefined || nodes.length > 0) return; + const next = this.retainedOverlaySegmentIds.filter( + (id) => id !== segmentId, + ); + if (next.length === this.retainedOverlaySegmentIds.length) return; + this.retainedOverlaySegmentIds = next; + this.redrawNeeded.dispatch(); + } + suppressBrowseSegment(segmentId: number) { const normalizedSegmentId = Math.round(Number(segmentId)); if (