import { TextureLoader } from 'three' import { useLoadingManager } from './useLoadingManager' export interface PBRMaterialOptions { maps: string[] ext: 'png' | 'jpg' } export function useTextures() { const { loadingManager } = useLoadingManager() const textureLoader = new TextureLoader(loadingManager) const loadTexture = (url: string) => { return new Promise((resolve, reject) => { textureLoader.load( url, texture => resolve(texture), () => {}, () => { reject(new Error('[useTextures] - Failed to load texture')) }, ) }) } const getPbrMaterial = async (path: string, options: PBRMaterialOptions = { maps: ['albedo'], ext: 'png' }) => { const [albedoMap, normalMap, roughnessMap, metalnessMap] = await Promise.all( options.maps.map(map => loadTexture(`${path}${map}.${options.ext}`)), ) } /* return new MeshStandardMaterial({ map: albedoMap, normalMap, roughnessMap, metalnessMap, }) } */ return { textureLoader, loadTexture, getPbrMaterial } }