fix: add temporary lite map reducer
This commit is contained in:
@@ -4,6 +4,7 @@ import { parseMapNodes } from "@/utils/map/mapNodeValidation";
|
|||||||
const MAP_JSON_PATH = "/map.json";
|
const MAP_JSON_PATH = "/map.json";
|
||||||
const MODEL_FILE_NAMES = ["model.glb", "model.gltf"];
|
const MODEL_FILE_NAMES = ["model.glb", "model.gltf"];
|
||||||
const HTML_CONTENT_TYPE = "text/html";
|
const HTML_CONTENT_TYPE = "text/html";
|
||||||
|
const MAP_STRUCTURE_NODE_NAMES = new Set(["Scene", "blocking"]);
|
||||||
type ModelEntry = [modelName: string, modelUrl: string];
|
type ModelEntry = [modelName: string, modelUrl: string];
|
||||||
|
|
||||||
export async function loadMapSceneData(): Promise<SceneData | null> {
|
export async function loadMapSceneData(): Promise<SceneData | null> {
|
||||||
@@ -26,7 +27,13 @@ async function createSceneData(mapNodes: MapNode[]): Promise<SceneData> {
|
|||||||
async function loadMapModelUrls(
|
async function loadMapModelUrls(
|
||||||
mapNodes: MapNode[],
|
mapNodes: MapNode[],
|
||||||
): Promise<Map<string, string>> {
|
): Promise<Map<string, string>> {
|
||||||
const uniqueModelNames = [...new Set(mapNodes.map((node) => node.name))];
|
const uniqueModelNames = [
|
||||||
|
...new Set(
|
||||||
|
mapNodes
|
||||||
|
.filter((node) => !MAP_STRUCTURE_NODE_NAMES.has(node.name))
|
||||||
|
.map((node) => node.name),
|
||||||
|
),
|
||||||
|
];
|
||||||
const modelEntries = await Promise.all(
|
const modelEntries = await Promise.all(
|
||||||
uniqueModelNames.map((modelName) => loadModelEntry(modelName)),
|
uniqueModelNames.map((modelName) => loadModelEntry(modelName)),
|
||||||
);
|
);
|
||||||
|
|||||||
+41
-1
@@ -22,6 +22,16 @@ interface LoadedMapNode {
|
|||||||
modelUrl: string | null;
|
modelUrl: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MAP_STRUCTURE_NODE_NAMES = new Set(["Scene", "blocking"]);
|
||||||
|
const LITE_MAP_SKIPPED_NODE_NAMES = new Set([
|
||||||
|
"arbre",
|
||||||
|
"buissons",
|
||||||
|
"champdeble",
|
||||||
|
"champdesoja",
|
||||||
|
"champsdetournesol",
|
||||||
|
"sapin",
|
||||||
|
]);
|
||||||
|
|
||||||
interface ErrorBoundaryProps {
|
interface ErrorBoundaryProps {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
fallback: ReactNode;
|
fallback: ReactNode;
|
||||||
@@ -133,7 +143,17 @@ export function GameMap({
|
|||||||
status: "loading",
|
status: "loading",
|
||||||
});
|
});
|
||||||
|
|
||||||
const loadedMapNodes = sceneData.mapNodes.map((node) => {
|
const visibleMapNodes = sceneData.mapNodes.filter(liteMap);
|
||||||
|
const skippedMapNodeCount =
|
||||||
|
sceneData.mapNodes.length - visibleMapNodes.length;
|
||||||
|
|
||||||
|
if (skippedMapNodeCount > 0) {
|
||||||
|
logger.warn("GameMap", "Lite map skipped heavy map nodes", {
|
||||||
|
skippedMapNodeCount,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadedMapNodes = visibleMapNodes.map((node) => {
|
||||||
const modelUrl = sceneData.models.get(node.name);
|
const modelUrl = sceneData.models.get(node.name);
|
||||||
return { node, modelUrl: modelUrl ?? null };
|
return { node, modelUrl: modelUrl ?? null };
|
||||||
});
|
});
|
||||||
@@ -214,6 +234,26 @@ export function GameMap({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temporary development-only map reducer.
|
||||||
|
*
|
||||||
|
* TODO: replace this with a real map performance pass: merged static geometry,
|
||||||
|
* instancing for repeated props, LOD, and/or zone-based loading. For now this
|
||||||
|
* keeps the app usable on local machines by not rendering the densest exported
|
||||||
|
* nodes from map.json.
|
||||||
|
*/
|
||||||
|
function liteMap(node: MapNode): boolean {
|
||||||
|
if (MAP_STRUCTURE_NODE_NAMES.has(node.name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.type === "Mesh") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !LITE_MAP_SKIPPED_NODE_NAMES.has(node.name);
|
||||||
|
}
|
||||||
|
|
||||||
function MapNodeInstance({
|
function MapNodeInstance({
|
||||||
node,
|
node,
|
||||||
modelUrl,
|
modelUrl,
|
||||||
|
|||||||
Reference in New Issue
Block a user