import { memo, Suspense, useMemo } from "react"; import { Mesh } from "three"; import { useGLTF, useTexture } from "@react-three/drei"; import { BASE_URL, interiorTextureToUrl, interiorToUrl } from "../loaders"; import { ConsoleObject, getPosition, getProperty, getRotation, getScale, } from "../mission"; import { setupColor } from "../textureUtils"; const FALLBACK_URL = `${BASE_URL}/black.png`; /** * Load a .gltf file that was converted from a .dif, used for "interior" models. */ function useInterior(interiorFile: string) { const url = interiorToUrl(interiorFile); return useGLTF(url); } function InteriorTexture({ materialName }: { materialName: string }) { const url = interiorTextureToUrl(materialName, FALLBACK_URL); const texture = useTexture(url, (texture) => setupColor(texture)); return ; } function InteriorMesh({ node }: { node: Mesh }) { return ( {node.material ? ( } > {Array.isArray(node.material) ? ( node.material.map((mat, index) => ( )) ) : ( )} ) : null} ); } export const InteriorModel = memo( ({ interiorFile }: { interiorFile: string }) => { const { nodes } = useInterior(interiorFile); return ( {Object.entries(nodes) .filter( ([name, node]: [string, any]) => !node.material || !node.material.name.match(/\.\d+$/) ) .map(([name, node]: [string, any]) => ( ))} ); } ); function InteriorPlaceholder() { return ( ); } export const InteriorInstance = memo( ({ object }: { object: ConsoleObject }) => { const interiorFile = getProperty(object, "interiorFile").value; const position = useMemo(() => getPosition(object), [object]); const scale = useMemo(() => getScale(object), [object]); const q = useMemo(() => getRotation(object), [object]); return ( }> ); } );