From e2f9952867f7c8fd08177db051a7e923b2e67c02 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 13 Oct 2026 13:53:54 +0400 Subject: [PATCH] fix(street-level): a click picks in a 9 px window, so a thin line is hit a few pixels off Coverage lines are 2.5 px wide and there is no hover cue any more: with the default 3 px pick window a click just beside a line selected nothing. Co-Authored-By: Claude Fable 5.1 --- src/layers/streetLevel/policy.js | 6 ++++++ src/layers/streetLevel/selection.js | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/layers/streetLevel/policy.js b/src/layers/streetLevel/policy.js index c1d54b6cd..34a9400b6 100644 --- a/src/layers/streetLevel/policy.js +++ b/src/layers/streetLevel/policy.js @@ -13,6 +13,12 @@ export const MAPILLARY_SOURCE_METHODS = Object.freeze([ 'getSequenceImages', ]); +/** + * The pixel window a click picks in: coverage lines are 2.5 px wide and there + * is no hover cue, so a click a few pixels off still finds the line. + */ +export const CLICK_PICK_WINDOW_PX = 9; + /** Pick id of the viewer position marker. */ export const POSITION_PICK_ID = 'sl:pos'; diff --git a/src/layers/streetLevel/selection.js b/src/layers/streetLevel/selection.js index 388c378ad..dbc97137f 100644 --- a/src/layers/streetLevel/selection.js +++ b/src/layers/streetLevel/selection.js @@ -1,5 +1,5 @@ import * as Cesium from 'cesium'; -import { STREET_LEVEL_LAYER_ID } from './policy.js'; +import { CLICK_PICK_WINDOW_PX, STREET_LEVEL_LAYER_ID } from './policy.js'; /** One click handler for every provider's lines and cones, and the marker. */ export function createSelection({ state, parts }) { @@ -10,7 +10,11 @@ export function createSelection({ state, parts }) { const viewer = state.viewer; if (!viewer || !state.enabled) return; if (input?.isPointerFree && !input.isPointerFree()) return; - const picked = viewer.scene.pick(click.position); + const picked = viewer.scene.pick( + click.position, + CLICK_PICK_WINDOW_PX, + CLICK_PICK_WINDOW_PX, + ); const id = picking?.resolvePickId ? picking.resolvePickId(picked) : picked?.id;