Merge remote-tracking branch 'origin/main' into feat/paint-slots

# Conflicts:
#	packages/core/src/store/use-scene.ts
#	packages/editor/src/components/editor/index.tsx
This commit is contained in:
Wassim SAMAD
2026-06-18 12:22:26 -04:00
415 changed files with 22805 additions and 1414 deletions
+1 -1
View File
@@ -163,7 +163,7 @@ export const ceilingDefinition: NodeDefinition<typeof CeilingNode> = {
presentation: {
label: 'Ceiling',
description: 'A polygon-bounded ceiling surface that hosts ceiling-mounted items.',
icon: { kind: 'url', src: '/icons/ceiling.png' },
icon: { kind: 'url', src: '/icons/ceiling.webp' },
paletteSection: 'structure',
paletteOrder: 40,
},
+3 -2
View File
@@ -9,6 +9,7 @@ import {
polygonAnchors,
resolveAlignment,
sceneRegistry,
snapScalar,
useLiveTransforms,
useScene,
} from '@pascal-app/core'
@@ -36,10 +37,10 @@ import { BufferGeometry, DoubleSide, Path, Shape, ShapeGeometry, Vector3 } from
* mesh's X/Z position on rebuild (`mesh.position.x = 0`,
* `mesh.position.z = 0`) so the visual transitions smoothly.
*
* 0.5m grid snap (matches legacy).
* Snaps to the editor's configured grid step (Shift bypasses).
*/
function snap(value: number) {
return Math.round(value * 2) / 2
return snapScalar(value, useEditor.getState().gridSnapStep)
}
/** Figma-style alignment-snap threshold (meters), matching the other tools. */
+1 -1
View File
@@ -147,7 +147,7 @@ export function CeilingPanel() {
return (
<PanelWrapper
icon="/icons/ceiling.png"
icon="/icons/ceiling.webp"
onClose={handleClose}
title={node.name || 'Ceiling'}
width={320}
+4 -3
View File
@@ -6,6 +6,7 @@ import {
type GridEvent,
type LevelNode,
snapPointAlongAngleRay,
snapPointToGrid,
useScene,
} from '@pascal-app/core'
import {
@@ -93,9 +94,9 @@ export const CeilingTool: React.FC = () => {
if (!(cursorRef.current && gridCursorRef.current)) return
const rawPoint: [number, number] = [event.localPosition[0], event.localPosition[2]]
const bypassSnap = shiftPressed.current || event.nativeEvent?.shiftKey === true
const gridX = Math.round(rawPoint[0] * 2) / 2
const gridZ = Math.round(rawPoint[1] * 2) / 2
const gridPosition: [number, number] = bypassSnap ? rawPoint : [gridX, gridZ]
const gridPosition: [number, number] = bypassSnap
? rawPoint
: [...snapPointToGrid(rawPoint, useEditor.getState().gridSnapStep)]
setCursorPosition(gridPosition)
setLevelY(event.localPosition[1])
const ceilingY = event.localPosition[1] + CEILING_HEIGHT