From a52d57ae6c64fb6ed820d7d928da6d8b460c246e Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Mon, 25 May 2026 01:28:25 +0200 Subject: [PATCH] fix: keep terrain collision during visual filtering --- src/components/ui/SceneLoadingOverlay.tsx | 18 ------------- src/index.css | 10 -------- src/world/GameMap.tsx | 31 ++++++++++++++++------- 3 files changed, 22 insertions(+), 37 deletions(-) diff --git a/src/components/ui/SceneLoadingOverlay.tsx b/src/components/ui/SceneLoadingOverlay.tsx index 9037d52..d5c66c9 100644 --- a/src/components/ui/SceneLoadingOverlay.tsx +++ b/src/components/ui/SceneLoadingOverlay.tsx @@ -9,7 +9,6 @@ export function SceneLoadingOverlay({ }: SceneLoadingOverlayProps): React.JSX.Element | null { const isReady = state.status === "ready"; const progress = Math.round(Math.max(0, Math.min(1, state.progress)) * 100); - const helperText = getLoadingHelperText(state.progress); return (
{state.currentStep} -

{helperText}

{progress}% @@ -27,19 +25,3 @@ export function SceneLoadingOverlay({
); } - -function getLoadingHelperText(progress: number): string { - if (progress >= 0.95) { - return "Finalisation de la scène et de la première frame."; - } - - if (progress >= 0.7) { - return "Préparation des collisions et du gameplay."; - } - - if (progress >= 0.25) { - return "Chargement progressif de la map autour du joueur."; - } - - return "Récupération des données et modèles nécessaires."; -} diff --git a/src/index.css b/src/index.css index 9a55a73..cd732fe 100644 --- a/src/index.css +++ b/src/index.css @@ -466,16 +466,6 @@ canvas { text-transform: uppercase; } -.scene-loading-overlay p { - max-width: 290px; - margin: -8px 0 0; - color: #64748b; - font-size: 12px; - font-weight: 500; - line-height: 1.45; - text-align: center; -} - .scene-loading-overlay__track { position: relative; overflow: hidden; diff --git a/src/world/GameMap.tsx b/src/world/GameMap.tsx index de446e2..aa579b7 100644 --- a/src/world/GameMap.tsx +++ b/src/world/GameMap.tsx @@ -111,10 +111,13 @@ export function GameMap({ const settledMapNodesRef = useRef(new Set()); const groups = useMapPerformanceStore((state) => state.groups); const models = useMapPerformanceStore((state) => state.models); - const [mapNodes, setMapNodes] = useState([]); + const [renderMapNodes, setRenderMapNodes] = useState([]); + const [collisionMapNodes, setCollisionMapNodes] = useState( + [], + ); const [mapLoaded, setMapLoaded] = useState(false); const [settledMapNodeCount, setSettledMapNodeCount] = useState(0); - const mapReady = mapLoaded && settledMapNodeCount >= mapNodes.length; + const mapReady = mapLoaded && settledMapNodeCount >= renderMapNodes.length; const handleMapNodeSettled = useCallback((index: number) => { if (settledMapNodesRef.current.has(index)) return; @@ -125,7 +128,8 @@ export function GameMap({ const showEmptyMap = useCallback( (currentStep: string) => { - setMapNodes([]); + setRenderMapNodes([]); + setCollisionMapNodes([]); setMapLoaded(true); settledMapNodesRef.current.clear(); setSettledMapNodeCount(0); @@ -174,6 +178,12 @@ export function GameMap({ const modelUrl = sceneData.models.get(node.name); return { node, modelUrl: modelUrl ?? null }; }); + const loadedCollisionNodes = sceneData.mapNodes + .filter((node) => node.name === "terrain") + .map((node) => { + const modelUrl = sceneData.models.get(node.name); + return { node, modelUrl: modelUrl ?? null }; + }); const missingModelCount = loadedMapNodes.filter( (mapNode) => mapNode.modelUrl === null, ).length; @@ -188,7 +198,8 @@ export function GameMap({ ); } - setMapNodes(loadedMapNodes); + setRenderMapNodes(loadedMapNodes); + setCollisionMapNodes(loadedCollisionNodes); setMapLoaded(true); settledMapNodesRef.current.clear(); setSettledMapNodeCount(0); @@ -209,21 +220,23 @@ export function GameMap({ }, [onLoadingStateChange, showEmptyMap]); useEffect(() => { - if (mapNodes.length === 0) return; + if (renderMapNodes.length === 0) return; const renderProgress = - mapNodes.length === 0 ? 1 : settledMapNodeCount / mapNodes.length; + renderMapNodes.length === 0 + ? 1 + : settledMapNodeCount / renderMapNodes.length; onLoadingStateChange?.({ currentStep: "Chargement des modèles de la map", progress: 0.25 + renderProgress * 0.45, status: "loading", }); - }, [mapNodes.length, onLoadingStateChange, settledMapNodeCount]); + }, [renderMapNodes.length, onLoadingStateChange, settledMapNodeCount]); return ( <> - {mapNodes.map((mapNode, index) => ( + {renderMapNodes.map((mapNode, index) => ( } @@ -251,7 +264,7 @@ export function GameMap({