Spaces:
Running
Running
| import { | |
| LoadingManager, | |
| MeshPhongMaterial, | |
| Mesh, | |
| Color, | |
| Object3D, | |
| Group, | |
| } from "three"; | |
| import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js"; | |
| import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; | |
| import { ColladaLoader } from "three/examples/jsm/loaders/ColladaLoader.js"; | |
| import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader.js"; | |
| /** | |
| * Loads mesh files of different formats | |
| * @param path The path to the mesh file | |
| * @param manager The THREE.js loading manager | |
| * @param done Callback function when loading is complete | |
| */ | |
| export const loadMeshFile = ( | |
| path: string, | |
| manager: LoadingManager, | |
| done: (result: Object3D | Group | Mesh | null, err?: Error) => void | |
| ) => { | |
| // First try to get extension from the original path | |
| let ext = path.split(/\./g).pop()?.toLowerCase(); | |
| // If the URL is a blob URL with a fragment containing the extension, use that | |
| if (path.startsWith("blob:") && path.includes("#.")) { | |
| const fragmentExt = path.split("#.").pop(); | |
| if (fragmentExt) { | |
| ext = fragmentExt.toLowerCase(); | |
| } | |
| } | |
| // If we can't determine extension, try to check Content-Type | |
| if (!ext) { | |
| console.error(`Could not determine file extension for: ${path}`); | |
| done(null, new Error(`Unsupported file format: ${path}`)); | |
| return; | |
| } | |
| switch (ext) { | |
| case "gltf": | |
| case "glb": | |
| new GLTFLoader(manager).load( | |
| path, | |
| (result) => done(result.scene), | |
| null, | |
| (err) => done(null, err as Error) | |
| ); | |
| break; | |
| case "obj": | |
| new OBJLoader(manager).load( | |
| path, | |
| (result) => done(result), | |
| null, | |
| (err) => done(null, err as Error) | |
| ); | |
| break; | |
| case "dae": | |
| new ColladaLoader(manager).load( | |
| path, | |
| (result) => done(result.scene), | |
| null, | |
| (err) => done(null, err as Error) | |
| ); | |
| break; | |
| case "stl": | |
| new STLLoader(manager).load( | |
| path, | |
| (result) => { | |
| const material = new MeshPhongMaterial(); | |
| const mesh = new Mesh(result, material); | |
| done(mesh); | |
| }, | |
| null, | |
| (err) => done(null, err as Error) | |
| ); | |
| break; | |
| default: | |
| done(null, new Error(`Unsupported file format: ${ext}`)); | |
| } | |
| }; | |
| /** | |
| * Creates a color in THREE.js format from a CSS color string | |
| * @param color The CSS color string | |
| * @returns A THREE.js Color | |
| */ | |
| export const createColor = (color: string): Color => { | |
| return new Color(color); | |
| }; | |