Play SFX when placing doors and windows
Add audio feedback for item placement by importing sfxEmitter and emitting 'sfx:item-place' in DoorTool and WindowTool. This change triggers a placement sound when a door or window node is created, improving UX by confirming successful placement.
This commit is contained in:
@@ -19,6 +19,7 @@ import {
|
|||||||
snapToHalf,
|
snapToHalf,
|
||||||
} from '../item/placement-math'
|
} from '../item/placement-math'
|
||||||
import { clampToWall, hasWallChildOverlap, wallLocalToWorld } from './door-math'
|
import { clampToWall, hasWallChildOverlap, wallLocalToWorld } from './door-math'
|
||||||
|
import { sfxEmitter } from '../../../lib/sfx-bus'
|
||||||
|
|
||||||
const edgeMaterial = new LineBasicNodeMaterial({
|
const edgeMaterial = new LineBasicNodeMaterial({
|
||||||
color: 0xef4444,
|
color: 0xef4444,
|
||||||
@@ -219,6 +220,7 @@ export const DoorTool: React.FC = () => {
|
|||||||
useScene.getState().createNode(node, event.node.id as AnyNodeId)
|
useScene.getState().createNode(node, event.node.id as AnyNodeId)
|
||||||
useViewer.getState().setSelection({ selectedIds: [node.id] })
|
useViewer.getState().setSelection({ selectedIds: [node.id] })
|
||||||
useScene.temporal.getState().pause()
|
useScene.temporal.getState().pause()
|
||||||
|
sfxEmitter.emit('sfx:item-place')
|
||||||
|
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import {
|
|||||||
snapToHalf,
|
snapToHalf,
|
||||||
} from '../item/placement-math'
|
} from '../item/placement-math'
|
||||||
import { clampToWall, hasWallChildOverlap, wallLocalToWorld } from './window-math'
|
import { clampToWall, hasWallChildOverlap, wallLocalToWorld } from './window-math'
|
||||||
|
import { sfxEmitter } from '../../../lib/sfx-bus'
|
||||||
|
|
||||||
// Shared edge material — reuse across renders, just toggle color
|
// Shared edge material — reuse across renders, just toggle color
|
||||||
const edgeMaterial = new LineBasicNodeMaterial({
|
const edgeMaterial = new LineBasicNodeMaterial({
|
||||||
@@ -228,6 +229,7 @@ export const WindowTool: React.FC = () => {
|
|||||||
useScene.getState().createNode(node, event.node.id as AnyNodeId)
|
useScene.getState().createNode(node, event.node.id as AnyNodeId)
|
||||||
useViewer.getState().setSelection({ selectedIds: [node.id] })
|
useViewer.getState().setSelection({ selectedIds: [node.id] })
|
||||||
useScene.temporal.getState().pause()
|
useScene.temporal.getState().pause()
|
||||||
|
sfxEmitter.emit('sfx:item-place')
|
||||||
|
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user