fix: preload repair mission assets
This commit is contained in:
@@ -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 ?? []),
|
||||||
|
]),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user