From 9bfbcc9f01a5dab1dc00f72c57f21f883a85effd Mon Sep 17 00:00:00 2001 From: Wassim SAMAD Date: Mon, 22 Jun 2026 11:09:02 -0400 Subject: [PATCH] editor: add resize SFX triggered while dragging resize handles Register a `resize` sound effect (three round-robin variations with pitch/pan jitter and an 80ms gap) and emit it from the linear/radial resize drag handler whenever the snapped+clamped value steps, so width / length / depth / radius / height drags tick as the size changes. Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/editor/public/audios/sfx/resize_0.mp3 | Bin 0 -> 25984 bytes apps/editor/public/audios/sfx/resize_1.mp3 | Bin 0 -> 25984 bytes apps/editor/public/audios/sfx/resize_2.mp3 | Bin 0 -> 25984 bytes .../components/editor/node-arrow-handles.tsx | 9 +++++++++ packages/editor/src/lib/sfx-bus.ts | 2 ++ packages/editor/src/lib/sfx-player.ts | 10 ++++++++++ 6 files changed, 21 insertions(+) create mode 100644 apps/editor/public/audios/sfx/resize_0.mp3 create mode 100644 apps/editor/public/audios/sfx/resize_1.mp3 create mode 100644 apps/editor/public/audios/sfx/resize_2.mp3 diff --git a/apps/editor/public/audios/sfx/resize_0.mp3 b/apps/editor/public/audios/sfx/resize_0.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7743b81cecd33f10c326f396b3864f228afcac5d GIT binary patch literal 25984 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 literal 0 HcmV?d00001 diff --git a/apps/editor/public/audios/sfx/resize_2.mp3 b/apps/editor/public/audios/sfx/resize_2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..aa86b4cbbc36789fdf609eade2ba3dbdeb6c48e6 GIT binary patch literal 25984 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 U$^Sq8|E$128~soI|Fi!856}ml761SM literal 0 HcmV?d00001 diff --git a/packages/editor/src/components/editor/node-arrow-handles.tsx b/packages/editor/src/components/editor/node-arrow-handles.tsx index 515dc0480..622034cdc 100644 --- a/packages/editor/src/components/editor/node-arrow-handles.tsx +++ b/packages/editor/src/components/editor/node-arrow-handles.tsx @@ -668,6 +668,11 @@ function LinearArrow({ ? 1 : -1 + // Last value an emitted resize tick fired at — a new tick fires only + // when the (snapped + clamped) value actually changes, so the cue + // tracks real size steps instead of every sub-pixel pointer jitter. + let lastTickValue = initialValue + return { overrideId, onBegin: () => { @@ -695,6 +700,10 @@ function LinearArrow({ ? snapScalar(rawNext, gridSnapStep) : rawNext const next = Math.min(maxBound, Math.max(minBound, snappedNext)) + if (next !== lastTickValue) { + lastTickValue = next + sfxEmitter.emit('sfx:resize') + } const patch = descriptor.apply(initialNode as never, next, sceneApi) as Partial // Let the kind publish live guides for the edge being resized. onDrag?.({ ...(initialNode as object), ...patch } as AnyNode, sceneApi) diff --git a/packages/editor/src/lib/sfx-bus.ts b/packages/editor/src/lib/sfx-bus.ts index 262525d56..a4551410d 100644 --- a/packages/editor/src/lib/sfx-bus.ts +++ b/packages/editor/src/lib/sfx-bus.ts @@ -10,6 +10,7 @@ type SFXEvents = { 'sfx:item-pick': undefined 'sfx:item-place': undefined 'sfx:item-rotate': undefined + 'sfx:resize': undefined 'sfx:structure-build-start': undefined 'sfx:structure-build': undefined 'sfx:structure-delete': undefined @@ -40,6 +41,7 @@ export function initSFXBus() { sfxEmitter.on('sfx:item-pick', () => playSFX('itemPick')) sfxEmitter.on('sfx:item-place', () => playSFX('itemPlace')) sfxEmitter.on('sfx:item-rotate', () => playSFX('itemRotate')) + sfxEmitter.on('sfx:resize', () => playSFX('resize')) sfxEmitter.on('sfx:structure-build-start', () => playSFX('structureBuildStart')) sfxEmitter.on('sfx:structure-build', () => playSFX('structureBuildEnd')) sfxEmitter.on('sfx:structure-delete', () => playSFX('structureDelete')) diff --git a/packages/editor/src/lib/sfx-player.ts b/packages/editor/src/lib/sfx-player.ts index f4d12e65f..e50538d01 100644 --- a/packages/editor/src/lib/sfx-player.ts +++ b/packages/editor/src/lib/sfx-player.ts @@ -59,6 +59,16 @@ export const SFX: Record = { volumeRange: [0.92, 1.0], panJitter: 0.15, }, + // Ticks as a resize handle is dragged across snap steps. Fires in rapid + // succession, so it mirrors gridSnap: three variations cycled round-robin + // with pitch/pan jitter and a gap so the run reads as texture, not a tone. + resize: { + src: ['/audios/sfx/resize_0.mp3', '/audios/sfx/resize_1.mp3', '/audios/sfx/resize_2.mp3'], + rateRange: [0.98, 1.02], + volumeRange: [0.26, 0.34], + panJitter: 0.15, + minIntervalMs: 80, + }, // Fired when a structure draft begins (first click of a wall/slab/etc). structureBuildStart: { src: '/audios/sfx/structure_build_start.mp3',