From 16e3f51448e5d1773f9a649bfbfbcb9fc73c8403 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Thu, 29 May 2025 18:17:24 +0530 Subject: [PATCH] refactor: Introduce Point and ReferencePoint components for better point management in AisleCreator --- .../aisle/aisleCreator/aisleCreator.tsx | 28 +++---- app/src/modules/builder/point/point.tsx | 77 +++++++++++++++++++ .../modules/builder/point/referencePoint.tsx | 75 ++++++++++++++++++ 3 files changed, 162 insertions(+), 18 deletions(-) create mode 100644 app/src/modules/builder/point/point.tsx create mode 100644 app/src/modules/builder/point/referencePoint.tsx diff --git a/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx b/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx index fa25465..f8598fc 100644 --- a/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx +++ b/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx @@ -5,6 +5,8 @@ import { useActiveLayer, useSocketStore, useToggleView, useToolMode } from '../. import { useAisleStore } from '../../../../store/builder/useAisleStore'; import ReferenceAisle from './referenceAisle'; import { useBuilderStore } from '../../../../store/builder/useBuilderStore'; +import ReferencePoint from '../../point/referencePoint'; +import Point from '../../point/point'; function AisleCreator() { const { scene, camera, raycaster, gl, pointer } = useThree(); @@ -40,16 +42,8 @@ function AisleCreator() { }); }); - // Add temporary points - tempPoints.forEach(point => { - if (!seenUuids.has(point.uuid)) { - seenUuids.add(point.uuid); - points.push(point); - } - }); - return points; - }, [aisles, tempPoints]); + }, [aisles]); useEffect(() => { @@ -252,17 +246,15 @@ function AisleCreator() { return ( <> + + {tempPoints.map((point) => ( + + ))} + + {allPoints.map((point) => ( - - - - + ))} diff --git a/app/src/modules/builder/point/point.tsx b/app/src/modules/builder/point/point.tsx new file mode 100644 index 0000000..8160a9b --- /dev/null +++ b/app/src/modules/builder/point/point.tsx @@ -0,0 +1,77 @@ +import * as THREE from 'three'; +import * as Constants from '../../../types/world/worldConstants'; +import { useRef, useState, useEffect, useMemo } from 'react'; +import { useToolMode } from '../../../store/builder/store'; + +function Point({ point, userData }: { readonly point: Point, readonly userData: any }) { + const materialRef = useRef(null); + const [isHovered, setIsHovered] = useState(false); + const { toolMode } = useToolMode(); + + const boxScale: [number, number, number] = Constants.pointConfig.boxScale; + const defaultInnerColor = Constants.pointConfig.defaultInnerColor; + const borderColor = Constants.pointConfig.aisleOuterColor; + + useEffect(() => { + if (materialRef.current && toolMode === 'move') { + materialRef.current.uniforms.uInnerColor.value.set( + isHovered ? borderColor : defaultInnerColor + ); + materialRef.current.uniformsNeedUpdate = true; + } else if (materialRef.current && toolMode !== 'move') { + materialRef.current.uniforms.uInnerColor.value.set(defaultInnerColor); + materialRef.current.uniformsNeedUpdate = true; + } + }, [isHovered, borderColor, defaultInnerColor, toolMode]); + + const uniforms = useMemo(() => ({ + uColor: { value: new THREE.Color(borderColor) }, + uInnerColor: { value: new THREE.Color(defaultInnerColor) }, + }), [borderColor, defaultInnerColor]); + + if (!point) { + return null; + } + + return ( + setIsHovered(true)} + onPointerOut={() => setIsHovered(false)} + userData={userData} + > + + borderThickness && vUv.x < 1.0 - borderThickness && + vUv.y > borderThickness && vUv.y < 1.0 - borderThickness) { + gl_FragColor = vec4(uInnerColor, 1.0); // Inner square + } else { + gl_FragColor = vec4(uColor, 1.0); // Border + } + } + `} + /> + + ); +} + +export default Point; \ No newline at end of file diff --git a/app/src/modules/builder/point/referencePoint.tsx b/app/src/modules/builder/point/referencePoint.tsx new file mode 100644 index 0000000..88ea652 --- /dev/null +++ b/app/src/modules/builder/point/referencePoint.tsx @@ -0,0 +1,75 @@ +import * as THREE from 'three'; +import * as Constants from '../../../types/world/worldConstants'; +import { useRef, useState, useEffect, useMemo } from 'react'; +import { useToolMode } from '../../../store/builder/store'; + +function ReferencePoint({ point }: { readonly point: Point }) { + const materialRef = useRef(null); + const [isHovered, setIsHovered] = useState(false); + const { toolMode } = useToolMode(); + + const boxScale: [number, number, number] = Constants.pointConfig.boxScale; + const defaultInnerColor = Constants.pointConfig.defaultInnerColor; + const borderColor = Constants.pointConfig.aisleOuterColor; + + useEffect(() => { + if (materialRef.current && toolMode === 'move') { + materialRef.current.uniforms.uInnerColor.value.set( + isHovered ? borderColor : defaultInnerColor + ); + materialRef.current.uniformsNeedUpdate = true; + } else if (materialRef.current && toolMode !== 'move') { + materialRef.current.uniforms.uInnerColor.value.set(defaultInnerColor); + materialRef.current.uniformsNeedUpdate = true; + } + }, [isHovered, borderColor, defaultInnerColor, toolMode]); + + const uniforms = useMemo(() => ({ + uColor: { value: new THREE.Color(borderColor) }, + uInnerColor: { value: new THREE.Color(defaultInnerColor) }, + }), [borderColor, defaultInnerColor]); + + if (!point) { + return null; + } + + return ( + setIsHovered(true)} + onPointerOut={() => setIsHovered(false)} + > + + borderThickness && vUv.x < 1.0 - borderThickness && + vUv.y > borderThickness && vUv.y < 1.0 - borderThickness) { + gl_FragColor = vec4(uInnerColor, 1.0); // Inner square + } else { + gl_FragColor = vec4(uColor, 1.0); // Border + } + } + `} + /> + + ); +} + +export default ReferencePoint; \ No newline at end of file