From 1a9aef323ac2ad2c5718d076316742668d6f5260 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Mon, 30 Jun 2025 16:59:27 +0530 Subject: [PATCH] feat: Add selectedWallAsset and selectedFloorAsset state management; implement corresponding setters in useBuilderStore --- .../Instances/Instances/wallAssetInstance.tsx | 40 +++++++++++++------ .../builder/wallAsset/wallAssetGroup.tsx | 23 ++++++++++- .../scene/postProcessing/postProcessing.tsx | 21 +++++++++- app/src/store/builder/useBuilderStore.ts | 32 +++++++++++++++ 4 files changed, 102 insertions(+), 14 deletions(-) diff --git a/app/src/modules/builder/wallAsset/Instances/Instances/wallAssetInstance.tsx b/app/src/modules/builder/wallAsset/Instances/Instances/wallAssetInstance.tsx index 6261be6..e8255e1 100644 --- a/app/src/modules/builder/wallAsset/Instances/Instances/wallAssetInstance.tsx +++ b/app/src/modules/builder/wallAsset/Instances/Instances/wallAssetInstance.tsx @@ -4,17 +4,21 @@ import { retrieveGLTF, storeGLTF } from '../../../../../utils/indexDB/idbUtils'; import { GLTF, GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'; import { Base, Geometry, Subtraction } from '@react-three/csg'; -import { useFrame } from '@react-three/fiber'; +import useModuleStore from '../../../../../store/useModuleStore'; import { useSceneContext } from '../../../../scene/sceneContext'; +import { useBuilderStore } from '../../../../../store/builder/useBuilderStore'; +import { useToggleView } from '../../../../../store/builder/store'; function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { const url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; const { wallStore } = useSceneContext(); const { walls, getWallById } = wallStore(); + const { togglView } = useToggleView(); + const { activeModule } = useModuleStore(); + const { selectedWallAsset, setSelectedWallAsset } = useBuilderStore(); const [gltfScene, setGltfScene] = useState(null); const [boundingBox, setBoundingBox] = useState(null); const groupRef = useRef(null); - const csgRef = useRef(null); const wall = useMemo(() => getWallById(wallAsset.wallUuid), [getWallById, wallAsset.wallUuid, walls]); useEffect(() => { @@ -90,12 +94,6 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { }, []); - useFrame(() => { - if (csgRef.current) { - csgRef.current.update(); - } - }) - if (!gltfScene || !boundingBox || !wall) { return null } const size = new THREE.Vector3(); boundingBox.getSize(size); @@ -114,17 +112,35 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { userData={wallAsset} > - + {gltfScene && ( { - console.log(wallAsset); + onClick={(e) => { + if (!togglView && activeModule === 'builder') { + if (e.object) { + e.stopPropagation(); + let currentObject = e.object as THREE.Object3D; + while (currentObject) { + if (currentObject.name === "Scene") { + break; + } + currentObject = currentObject.parent as THREE.Object3D; + } + setSelectedWallAsset(currentObject); + } + } }} + onPointerMissed={() => { + if (selectedWallAsset && selectedWallAsset.userData.modelUuid === wallAsset.modelUuid) { + setSelectedWallAsset(null); + } + }} + userData={wallAsset} > - + )} diff --git a/app/src/modules/builder/wallAsset/wallAssetGroup.tsx b/app/src/modules/builder/wallAsset/wallAssetGroup.tsx index d9ec309..ac55d01 100644 --- a/app/src/modules/builder/wallAsset/wallAssetGroup.tsx +++ b/app/src/modules/builder/wallAsset/wallAssetGroup.tsx @@ -1,8 +1,29 @@ +import { useEffect } from 'react'; +import { useToggleView } from '../../../store/builder/store'; +import { useBuilderStore } from '../../../store/builder/useBuilderStore'; +import { useVersionContext } from '../version/versionContext'; +import { useSceneContext } from '../../scene/sceneContext'; +import { useParams } from 'react-router-dom'; +import useModuleStore from '../../../store/useModuleStore'; import WallAssetCreator from './wallAssetCreator' import WallAssetInstances from './Instances/wallAssetInstances' function WallAssetGroup() { - + const { togglView } = useToggleView(); + const { setSelectedFloorAsset } = useBuilderStore(); + const { activeModule } = useModuleStore(); + const { selectedVersionStore } = useVersionContext(); + const { selectedVersion } = selectedVersionStore(); + const { wallAssetStore } = useSceneContext(); + const { setWallAssets } = wallAssetStore(); + const { projectId } = useParams(); + + useEffect(() => { + if (togglView || activeModule !== 'builder') { + setSelectedFloorAsset(null); + } + }, [togglView, activeModule]) + return ( <> diff --git a/app/src/modules/scene/postProcessing/postProcessing.tsx b/app/src/modules/scene/postProcessing/postProcessing.tsx index 4a222a5..e6ec6a2 100644 --- a/app/src/modules/scene/postProcessing/postProcessing.tsx +++ b/app/src/modules/scene/postProcessing/postProcessing.tsx @@ -15,7 +15,7 @@ export default function PostProcessing() { const { selectedWallItem } = useSelectedWallItem(); const { selectedFloorItem } = useSelectedFloorItem(); const { selectedEventSphere } = useSelectedEventSphere(); - const { selectedAisle, selectedWall, selectedDecal, selectedFloor } = useBuilderStore(); + const { selectedAisle, selectedWall, selectedDecal, selectedFloor, selectedWallAsset } = useBuilderStore(); function flattenChildren(children: any[]) { const allChildren: any[] = []; @@ -48,6 +48,10 @@ export default function PostProcessing() { // console.log('selectedFloor: ', selectedFloor); }, [selectedFloor]) + useEffect(() => { + // console.log('selectedWallAsset: ', selectedWallAsset); + }, [selectedWallAsset]) + return ( + {selectedWallAsset && ( + + )} {selectedAisle && ( void; setHoveredLine: (line: [Point, Point] | null) => void; + // Setters - Wall Asset + setSelectedWallAsset: (asset: Object3D | null) => void; + + // Setters - Floor Asset + setSelectedFloorAsset: (asset: Object3D | null) => void; + // Setters - Wall setSelectedWall: (wall: Object3D | null) => void; setWallThickness: (thickness: number) => void; @@ -100,6 +112,10 @@ export const useBuilderStore = create()( snappedPosition: null, hoveredLine: null, + selectedWallAsset: null, + + selectedFloorAsset: null, + selectedWall: null, wallThickness: 0.5, wallHeight: 7, @@ -156,6 +172,22 @@ export const useBuilderStore = create()( }) }, + // === Setters: Wall Asset === + + setSelectedWallAsset(asset: Object3D | null) { + set((state) => { + state.selectedWallAsset = asset; + }); + }, + + // === Setters: Floor Asset === + + setSelectedFloorAsset(asset: Object3D | null) { + set((state) => { + state.selectedFloorAsset = asset; + }); + }, + // === Setters: Wall === setSelectedWall: (wall: Object3D | null) => {