@needle-tools/engine
Version:
Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.
87 lines • 3.79 kB
JavaScript
/** @internal */
export const registeredModelLoaderCallbacks = [];
/** @internal */
export const registeredMimetypeCallbacks = [];
/**
* NeedleEngineModelLoader is a namespace that provides functions to register custom model loaders and mimetype callbacks.
* It allows you to create custom loaders for specific file types and determine the mimetype of files based on their content.
* @example
* ```ts
* import { NeedleEngineModelLoader } from "@needle-tools/engine";
* import { STLLoader } from "three/examples/jsm/loaders/STLLoader";
*
* NeedleEngineModelLoader.onCreateCustomModelLoader(args => {
* if (args.mimetype === "model/stl") {
* return new STLLoader();
* }
* });
*
* NeedleEngineModelLoader.onDetermineModelMimetype((args) => {
* // detect stl mimetype
* const bytes = args.bytes;
* if (bytes[0] === 0x73 && bytes[1] === 0x74 && bytes[2] === 0x6c) {
* return "model/stl";
* }
* return null;
* });
* ```
*/
export var NeedleEngineModelLoader;
(function (NeedleEngineModelLoader) {
// export type Plugin = {
// readonly name: string;
// canLoad: (mimetype: string, url: string) => boolean,
// createLoader: (url: string, mimetype: string) => Promise<CustomLoader>,
// }
/**
* Register a custom loader callback. For every file that is requested this callback is called with the url and mimetype. It should return a custom loader or null if it does not want to handle the file.
* @param callback The callback to register
* @param opts Optional options for the loader (e.g. name, priority)
* @returns A function to unregister the callback
* @example
* ```ts
* import { onCreateModelLoader } from "@needle-tools/engine";
* const unregister = onCreateModelLoader((url, mimetype) => {
* if (mimetype === "application/vnd.usdz+zip") {
* return new CustomLoader();
* }
* return null;
* });
*/
function onCreateCustomModelLoader(callback, opts) {
const entry = { name: opts?.name, priority: opts?.priority ?? 0, callback };
registeredModelLoaderCallbacks.push(entry);
// sort plugins by priority. Higher priority first
registeredModelLoaderCallbacks.sort((a, b) => {
if (a.priority === b.priority)
return 0;
if (a.priority > b.priority)
return -1;
return 1;
});
return () => {
const index = registeredModelLoaderCallbacks.indexOf(entry);
if (index >= 0) {
registeredModelLoaderCallbacks.splice(index, 1);
}
};
}
NeedleEngineModelLoader.onCreateCustomModelLoader = onCreateCustomModelLoader;
/**
* Register a callback to determine the mimetype of a file. This is to support custom loaders. The callback will provide the URL of the file to load + a range request response with the first few bytes of the file. The callback should return a mimetype or null if it does not want to handle the file.
* @param callback The callback to register
* @returns A function to unregister the callback
*
*/
function onDetermineModelMimetype(callback) {
registeredMimetypeCallbacks.push(callback);
return () => {
const index = registeredMimetypeCallbacks.indexOf(callback);
if (index >= 0) {
registeredMimetypeCallbacks.splice(index, 1);
}
};
}
NeedleEngineModelLoader.onDetermineModelMimetype = onDetermineModelMimetype;
})(NeedleEngineModelLoader || (NeedleEngineModelLoader = {}));
//# sourceMappingURL=engine_loaders.callbacks.js.map