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); | |
}; | |