diff --git a/packages/core/src/store/actions/node-actions.ts b/packages/core/src/store/actions/node-actions.ts index f4503c25..f6e64a7d 100644 --- a/packages/core/src/store/actions/node-actions.ts +++ b/packages/core/src/store/actions/node-actions.ts @@ -173,7 +173,14 @@ function buildWallMergePlans( continue } - const [primary, secondary] = candidates + const sortedCandidates = [...candidates].sort((a, b) => { + const attachmentDiff = (b.children?.length ?? 0) - (a.children?.length ?? 0) + if (attachmentDiff !== 0) { + return attachmentDiff + } + return a.id.localeCompare(b.id) + }) + const [primary, secondary] = sortedCandidates if ( !primary || !secondary || diff --git a/packages/viewer/src/components/renderers/door/door-renderer.tsx b/packages/viewer/src/components/renderers/door/door-renderer.tsx index 9d87eba1..6c978f3e 100644 --- a/packages/viewer/src/components/renderers/door/door-renderer.tsx +++ b/packages/viewer/src/components/renderers/door/door-renderer.tsx @@ -1,5 +1,5 @@ -import { type DoorNode, useRegistry } from '@pascal-app/core' -import { useMemo, useRef } from 'react' +import { type DoorNode, useRegistry, useScene } from '@pascal-app/core' +import { useLayoutEffect, useMemo, useRef } from 'react' import type { Mesh } from 'three' import { useNodeEvents } from '../../../hooks/use-node-events' import { createMaterial, DEFAULT_DOOR_MATERIAL } from '../../../lib/materials' @@ -8,6 +8,9 @@ export const DoorRenderer = ({ node }: { node: DoorNode }) => { const ref = useRef(null!) useRegistry(node.id, 'door', ref) + useLayoutEffect(() => { + useScene.getState().markDirty(node.id) + }, [node.id]) const handlers = useNodeEvents(node, 'door') const isTransient = !!(node.metadata as Record | null)?.isTransient diff --git a/packages/viewer/src/components/renderers/wall/wall-renderer.tsx b/packages/viewer/src/components/renderers/wall/wall-renderer.tsx index f4e3fab9..ef6f70cf 100644 --- a/packages/viewer/src/components/renderers/wall/wall-renderer.tsx +++ b/packages/viewer/src/components/renderers/wall/wall-renderer.tsx @@ -42,7 +42,7 @@ export const WallRenderer = ({ node }: { node: WallNode }) => { {node.children.map((childId) => ( - + ))} ) diff --git a/packages/viewer/src/components/renderers/window/window-renderer.tsx b/packages/viewer/src/components/renderers/window/window-renderer.tsx index 1f5c2c8e..c953812f 100644 --- a/packages/viewer/src/components/renderers/window/window-renderer.tsx +++ b/packages/viewer/src/components/renderers/window/window-renderer.tsx @@ -1,5 +1,5 @@ -import { useRegistry, type WindowNode } from '@pascal-app/core' -import { useMemo, useRef } from 'react' +import { useRegistry, useScene, type WindowNode } from '@pascal-app/core' +import { useLayoutEffect, useMemo, useRef } from 'react' import type { Mesh } from 'three' import { useNodeEvents } from '../../../hooks/use-node-events' import { createMaterial, DEFAULT_WINDOW_MATERIAL } from '../../../lib/materials' @@ -8,6 +8,9 @@ export const WindowRenderer = ({ node }: { node: WindowNode }) => { const ref = useRef(null!) useRegistry(node.id, 'window', ref) + useLayoutEffect(() => { + useScene.getState().markDirty(node.id) + }, [node.id]) const handlers = useNodeEvents(node, 'window') const isTransient = !!(node.metadata as Record | null)?.isTransient