Constimport { Loader, loaders, Viewer } from "@inweb/viewer-visualize";
class MyLoader extends Loader {
public viewer: Viewer;
constructor(viewer: Viewer) {
super();
this.viewer = viewer;
}
override isSupport(file, format): Boolean {
// check if this loader supports the file source and format
return type file === "string" && format === "myformat";
}
override load(file, format, params): Promise<this> {
// load VSFX data from file (custom loading logic)
const data = await fetch(file).then((result) => result.arrayBuffer());
const modelImpl = new ModelImpl();
modelImpl.id = params.modelId;
this.viewer.visViewer().parseVsfx(new Uint8Array(data));
this.viewer.models.push(modelImpl);
this.viewer.syncOptions();
this.viewer.syncOverlay();
this.viewer.emitEvent({ type: "geometryprogress", data: 1, file });
this.viewer.emitEvent({ type: "databasechunk", data, file });
this.viewer.update(true);
return Promise.resove(this);
};
}
loaders.registerLoader("MyLoader", (viewer) => new MyLoader(viewer));
Viewer loaders registry. Use this registry to register custom loaders.
To implement custom loader:
Define a loader class implements ILoader.
Define a constructor with a
viewerparameter.Override ILoader.isSupport and check if the loader can load the specified file.
Override ILoader.load and define the logic for loading the model from the file.
The loader should do:
VSFXformat.VisualizeJSviewer instance.ModelImplinstance with unique model ID add it to the viewermodelslist.The loader must emit events:
geometryprogress- during loading (or once at 100% when complete).databasechunk- when model is loaded and ready to render.Override ILoader.dispose and release loader resources, if required.
Use
this.abortController(defined inLoaderclass) to abort loading raw data.Register loader provider in the loaders registry by calling the loaders.registerLoader.