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;