Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions packages/editor/src/components/tools/wall/wall-drafting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,18 @@ export function snapWallDraftPoint(args: {
walls: WallNode[]
start?: WallPlanPoint
angleSnap?: boolean
freeSnap?: boolean
ignoreWallIds?: string[]
}): WallPlanPoint {
const { point, walls, start, angleSnap = false, ignoreWallIds } = args
const basePoint = start && angleSnap ? snapPointTo45Degrees(start, point) : snapPointToGrid(point)
const { point, walls, start, angleSnap = false, freeSnap = false, ignoreWallIds } = args
let basePoint: WallPlanPoint
if (freeSnap) {
basePoint = point
} else if (start && angleSnap) {
basePoint = snapPointTo45Degrees(start, point)
} else {
basePoint = snapPointToGrid(point)
}

return (
findWallSnapTarget(basePoint, walls, {
Expand Down
17 changes: 9 additions & 8 deletions packages/editor/src/components/tools/wall/wall-tool.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export const WallTool: React.FC = () => {
const endingPoint = useRef(new Vector3(0, 0, 0))
const buildingState = useRef(0)
const shiftPressed = useRef(false)
const ctrlPressed = useRef(false)

useEffect(() => {
let gridPosition: WallPlanPoint = [0, 0]
Expand All @@ -86,14 +87,15 @@ export const WallTool: React.FC = () => {
const walls = getCurrentLevelWalls()
// event.localPosition is building-local — consistent with stored wall start/end
const localPoint: WallPlanPoint = [event.localPosition[0], event.localPosition[2]]
gridPosition = snapWallDraftPoint({ point: localPoint, walls })
gridPosition = snapWallDraftPoint({ point: localPoint, walls, freeSnap: shiftPressed.current })

if (buildingState.current === 1) {
const snappedLocal = snapWallDraftPoint({
point: localPoint,
walls,
start: [startingPoint.current.x, startingPoint.current.z],
angleSnap: !shiftPressed.current,
freeSnap: ctrlPressed.current,
})
endingPoint.current.set(snappedLocal[0], event.localPosition[1], snappedLocal[1])
cursorRef.current.position.copy(endingPoint.current)
Expand All @@ -120,7 +122,7 @@ export const WallTool: React.FC = () => {
const localClick: WallPlanPoint = [event.localPosition[0], event.localPosition[2]]

if (buildingState.current === 0) {
const snappedStart = snapWallDraftPoint({ point: localClick, walls })
const snappedStart = snapWallDraftPoint({ point: localClick, walls, freeSnap: shiftPressed.current })
gridPosition = snappedStart
startingPoint.current.set(snappedStart[0], event.localPosition[1], snappedStart[1])
endingPoint.current.copy(startingPoint.current)
Expand All @@ -132,6 +134,7 @@ export const WallTool: React.FC = () => {
walls,
start: [startingPoint.current.x, startingPoint.current.z],
angleSnap: !shiftPressed.current,
freeSnap: ctrlPressed.current,
})
const dx = snappedEnd[0] - startingPoint.current.x
const dz = snappedEnd[1] - startingPoint.current.z
Expand All @@ -144,15 +147,13 @@ export const WallTool: React.FC = () => {
}

const onKeyDown = (e: KeyboardEvent) => {
if (e.key === 'Shift') {
shiftPressed.current = true
}
if (e.key === 'Shift') shiftPressed.current = true
if (e.key === 'Control') ctrlPressed.current = true
}

const onKeyUp = (e: KeyboardEvent) => {
if (e.key === 'Shift') {
shiftPressed.current = false
}
if (e.key === 'Shift') shiftPressed.current = false
if (e.key === 'Control') ctrlPressed.current = false
}

const onCancel = () => {
Expand Down