UNPKG

threepipe

Version:

A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.

41 lines (35 loc) 1.73 kB
import {type GLTF, GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader' import {ILoader} from '../IImporter' import {LoadingManager} from 'three' import {ImportAddOptions} from '../AssetManager' import {PhysicalMaterial, UnlitLineMaterial, UnlitMaterial} from '../../core' export class PolyhavenMaterialGLTFLoader extends GLTFLoader implements ILoader<GLTF, PhysicalMaterial|undefined> { constructor(manager: LoadingManager) { super(manager) // GLTFLoader.ObjectConstructors.DirectionalLight = DirectionalLight2 as any // GLTFLoader.ObjectConstructors.PointLight = PointLight2 as any // GLTFLoader.ObjectConstructors.SpotLight = SpotLight2 as any GLTFLoader.ObjectConstructors.MeshStandardMaterial = PhysicalMaterial as any GLTFLoader.ObjectConstructors.MeshBasicMaterial = UnlitMaterial as any GLTFLoader.ObjectConstructors.MeshPhysicalMaterial = PhysicalMaterial as any GLTFLoader.ObjectConstructors.LineBasicMaterial = UnlitLineMaterial as any // GLTFLoader.ObjectConstructors.PointsMaterial = PointsMaterial2 } /** * This is run post parse to extract the result material from the GLTF object * @param res * @param _ */ transform(res: GLTF, _: ImportAddOptions): PhysicalMaterial|undefined { // find the first PhysicalMaterial in the gltf and return it, if none found return undefined let material: PhysicalMaterial|undefined res.scene.traverse(o => { if (material) return const mat = (o as any).material if (mat && mat.isPhysicalMaterial) { material = mat as PhysicalMaterial } }) return material } }