refactor(map): add generated R3F model for ecole

This commit is contained in:
tom-boullay
2026-05-21 15:34:49 +02:00
parent 48c2b4f0cd
commit 26ddbebe14
4 changed files with 205 additions and 2 deletions
+14 -2
View File
@@ -12,6 +12,8 @@ import { useClonedObject } from "@/hooks/three/useClonedObject";
import { useLoggedGLTF } from "@/hooks/three/useLoggedGLTF";
import { TerrainModel } from "@/components/three/world/TerrainModel";
import { GameMapCollision } from "@/world/GameMapCollision";
import { GeneratedMapNodeInstance } from "@/world/map-generated/GeneratedMapNodeInstance";
import { isGeneratedMapModelName } from "@/world/map-generated/generatedMapModelConfig";
import { MapInstancingSystem } from "@/world/map-instancing/MapInstancingSystem";
import { isInstancedMapNodeName } from "@/world/map-instancing/mapInstancingConfig";
import { VegetationSystem } from "@/world/vegetation/VegetationSystem";
@@ -274,11 +276,21 @@ function MapNodeInstance({
modelUrl: string | null;
onSettled: () => void;
}): React.JSX.Element {
const isGeneratedModel = isGeneratedMapModelName(node.name);
useEffect(() => {
if (modelUrl !== null) return;
if (modelUrl !== null || isGeneratedModel) return;
onSettled();
}, [modelUrl, onSettled]);
}, [isGeneratedModel, modelUrl, onSettled]);
if (isGeneratedModel) {
return (
<Suspense fallback={<FallbackMapNode node={node} />}>
<GeneratedMapNodeInstance node={node} onLoaded={onSettled} />
</Suspense>
);
}
if (!modelUrl) {
return <FallbackMapNode node={node} />;
@@ -0,0 +1,25 @@
import { EcoleModel } from "@/components/three/models/generated/EcoleModel";
import type { MapNode } from "@/types/editor/editor";
interface GeneratedMapNodeInstanceProps {
node: MapNode;
onLoaded: () => void;
}
export function GeneratedMapNodeInstance({
node,
onLoaded,
}: GeneratedMapNodeInstanceProps): React.JSX.Element | null {
if (node.name === "ecole") {
return (
<EcoleModel
position={node.position}
rotation={node.rotation}
scale={node.scale}
onLoaded={onLoaded}
/>
);
}
return null;
}
@@ -0,0 +1,5 @@
const GENERATED_MAP_MODEL_NAMES = new Set(["ecole"]);
export function isGeneratedMapModelName(name: string): boolean {
return GENERATED_MAP_MODEL_NAMES.has(name);
}