fix: preload repair mission assets

This commit is contained in:
Tom Boullay
2026-05-11 11:47:20 +02:00
parent 105fdac0ca
commit e8fefe411e
+38 -2
View File
@@ -1,4 +1,5 @@
import { Suspense, useEffect, useState } from "react"; import { Suspense, useEffect, useMemo, useState } from "react";
import { useGLTF } from "@react-three/drei";
import { ExplodableModel } from "@/components/three/models/ExplodableModel"; import { ExplodableModel } from "@/components/three/models/ExplodableModel";
import type { RepairCasePlaceholder } from "@/components/three/gameplay/RepairCaseModel"; import type { RepairCasePlaceholder } from "@/components/three/gameplay/RepairCaseModel";
import { RepairCompletionStep } from "@/components/three/gameplay/RepairCompletionStep"; import { RepairCompletionStep } from "@/components/three/gameplay/RepairCompletionStep";
@@ -10,8 +11,12 @@ import {
RepairScanSequence, RepairScanSequence,
type RepairScannedBrokenPart, type RepairScannedBrokenPart,
} from "@/components/three/gameplay/RepairScanSequence"; } from "@/components/three/gameplay/RepairScanSequence";
import { REPAIR_CASE_MODEL_PATH } from "@/data/gameplay/repairCaseConfig";
import { REPAIR_FRAGMENTATION_SEQUENCE_SECONDS } from "@/data/gameplay/repairGameConfig"; import { REPAIR_FRAGMENTATION_SEQUENCE_SECONDS } from "@/data/gameplay/repairGameConfig";
import { REPAIR_MISSIONS } from "@/data/gameplay/repairMissions"; import {
REPAIR_MISSIONS,
type RepairMissionConfig,
} from "@/data/gameplay/repairMissions";
import { useRepairFragmentationInput } from "@/hooks/gameplay/useRepairFragmentationInput"; import { useRepairFragmentationInput } from "@/hooks/gameplay/useRepairFragmentationInput";
import { useRepairMissionStep } from "@/hooks/gameplay/useRepairMissionStep"; import { useRepairMissionStep } from "@/hooks/gameplay/useRepairMissionStep";
import type { RepairMissionId } from "@/types/gameplay/repairMission"; import type { RepairMissionId } from "@/types/gameplay/repairMission";
@@ -27,6 +32,23 @@ interface RepairGameProps extends Required<
scale?: ModelTransformProps["scale"]; scale?: ModelTransformProps["scale"];
} }
interface RepairMissionAssetPreloaderProps {
config: RepairMissionConfig;
}
function RepairMissionAssetPreloader({
config,
}: RepairMissionAssetPreloaderProps): null {
const modelPaths = useMemo(
() => getRepairMissionModelPaths(config),
[config],
);
useGLTF(modelPaths);
return null;
}
export function RepairGame({ export function RepairGame({
mission, mission,
position, position,
@@ -71,6 +93,9 @@ export function RepairGame({
return ( return (
<group position={position} rotation={rotation} scale={parsedScale}> <group position={position} rotation={rotation} scale={parsedScale}>
<Suspense fallback={null}>
<RepairMissionAssetPreloader config={config} />
</Suspense>
<Suspense fallback={null}> <Suspense fallback={null}>
{step === "waiting" ? ( {step === "waiting" ? (
<RepairInspectionObject <RepairInspectionObject
@@ -124,3 +149,14 @@ export function RepairGame({
</group> </group>
); );
} }
function getRepairMissionModelPaths(config: RepairMissionConfig): string[] {
return [
...new Set([
REPAIR_CASE_MODEL_PATH,
config.modelPath,
...config.brokenParts.flatMap((part) => part.modelPath ?? []),
...config.replacementParts.flatMap((part) => part.modelPath ?? []),
]),
];
}