Restore item controls and guard placement asset bounds

This commit is contained in:
sudhir
2026-05-13 22:45:58 +05:30
parent ce69433a1a
commit 1ffa3d2d73
3 changed files with 14 additions and 8 deletions
@@ -607,7 +607,7 @@ const ViewerSceneContent = memo(function ViewerSceneContent({
<ThumbnailGenerator onThumbnailCapture={onThumbnailCapture} /> <ThumbnailGenerator onThumbnailCapture={onThumbnailCapture} />
<PresetThumbnailGenerator /> <PresetThumbnailGenerator />
{!isFirstPersonMode && <SiteEdgeLabels />} {!isFirstPersonMode && <SiteEdgeLabels />}
{isFirstPersonMode && <InteractiveSystem />} <InteractiveSystem />
</> </>
) )
}) })
@@ -1,10 +1,10 @@
import type { AssetInput } from '@pascal-app/core'
import { sfxEmitter } from '../../../lib/sfx-bus' import { sfxEmitter } from '../../../lib/sfx-bus'
import useEditor from '../../../store/use-editor' import useEditor from '../../../store/use-editor'
import { useDraftNode } from './use-draft-node' import { useDraftNode } from './use-draft-node'
import { usePlacementCoordinator } from './use-placement-coordinator' import { usePlacementCoordinator } from './use-placement-coordinator'
export const ItemTool: React.FC = () => { function ItemPlacementContent({ selectedItem }: { selectedItem: AssetInput }) {
const selectedItem = useEditor((state) => state.selectedItem)
const draftNode = useDraftNode() const draftNode = useDraftNode()
const cursor = usePlacementCoordinator({ const cursor = usePlacementCoordinator({
@@ -21,6 +21,12 @@ export const ItemTool: React.FC = () => {
}, },
}) })
if (!selectedItem) return null
return <>{cursor}</> return <>{cursor}</>
} }
export const ItemTool: React.FC = () => {
const selectedItem = useEditor((state) => state.selectedItem)
if (!selectedItem) return null
return <ItemPlacementContent selectedItem={selectedItem} />
}
@@ -116,10 +116,10 @@ function expandBoundsToGrid(
function getFallbackPreviewBounds( function getFallbackPreviewBounds(
item: import('@pascal-app/core').ItemNode | null, item: import('@pascal-app/core').ItemNode | null,
asset: AssetInput, asset: AssetInput | null | undefined,
attachTo: AssetInput['attachTo'], attachTo: AssetInput['attachTo'] | null | undefined,
): PreviewBounds { ): PreviewBounds {
const dims = item ? getScaledDimensions(item) : (asset.dimensions ?? DEFAULT_DIMENSIONS) const dims = item ? getScaledDimensions(item) : (asset?.dimensions ?? DEFAULT_DIMENSIONS)
return { return {
min: [-dims[0] / 2, 0, attachTo === 'wall-side' ? -dims[2] : -dims[2] / 2], min: [-dims[0] / 2, 0, attachTo === 'wall-side' ? -dims[2] : -dims[2] / 2],
max: [dims[0] / 2, dims[1], attachTo === 'wall-side' ? 0 : dims[2] / 2], max: [dims[0] / 2, dims[1], attachTo === 'wall-side' ? 0 : dims[2] / 2],
@@ -1341,7 +1341,7 @@ export function usePlacementCoordinator(config: PlacementCoordinatorConfig): Rea
const dims = getGridAlignedDimensions(rawDims, initialAttachTo, gridSnapStep) const dims = getGridAlignedDimensions(rawDims, initialAttachTo, gridSnapStep)
const wallSideZOffset = initialAttachTo === 'wall-side' ? -dims[2] / 2 : 0 const wallSideZOffset = initialAttachTo === 'wall-side' ? -dims[2] / 2 : 0
const initialDimensionBounds = expandBoundsToGrid( const initialDimensionBounds = expandBoundsToGrid(
getFallbackPreviewBounds(initialDraft, config.asset!, initialAttachTo), getFallbackPreviewBounds(initialDraft, config.asset, initialAttachTo),
initialAttachTo, initialAttachTo,
gridSnapStep, gridSnapStep,
) )