UNPKG

@threepipe/plugin-assimpjs

Version:
1 lines 8.3 kB
{"version":3,"file":"index.mjs","sources":["../src/AssimpJsPlugin.ts"],"sourcesContent":["import {\n AViewerPluginSync,\n ThreeViewer,\n getUrlQueryParam,\n createScriptFromURL,\n IObject3D,\n ExportFileOptions, uiButton, uiToggle, PickingPlugin, uiFolderContainer,\n} from 'threepipe'\n\ninterface AssimpJsInterface{\n [key: string]: any\n}\n\n/**\n * AssimpJsPlugin\n *\n * Helper plugin to load the assimp.js library from a CDN and provide a method to convert files using Assimp.js.\n *\n * Assimpjs - https://github.com/kovacsv/assimpjs\n * Fork with a custom build to support fbx export - https://github.com/repalash/assimpjs\n */\n@uiFolderContainer('Assimp')\nexport class AssimpJsPlugin extends AViewerPluginSync {\n public static readonly PluginType: string = 'SamplePlugin'\n enabled = true\n dependencies = []\n\n initOnAdd: boolean\n\n // public static LIBRARY_PATH = `https://cdn.jsdelivr.net/npm/assimpjs@${getUrlQueryParam('assimpjs', '0.0.10')}/`\n // adds fbx export support\n public static LIBRARY_PATH = `https://cdn.jsdelivr.net/gh/repalash/assimpjs@${getUrlQueryParam('assimpjs', 'main')}/`\n\n constructor(initOnAdd = true) {\n super()\n this.initOnAdd = initOnAdd\n }\n\n protected _scriptElement?: HTMLScriptElement\n private _initing: Promise<void>|undefined\n\n async init() {\n if (!this._initing) this._initing = this._init()\n await this._initing\n return this.ajs\n }\n private async _init() {\n if (!(window as any).assimpjs) {\n this._scriptElement = await createScriptFromURL(AssimpJsPlugin.LIBRARY_PATH + 'dist/assimpjs.js')\n }\n const ctor = (window as any).assimpjs\n const ajs = ctor ? await ctor({\n locateFile: (file: string) => AssimpJsPlugin.LIBRARY_PATH + 'dist/' + file,\n // print: (text: string) => console.log(text),\n // printErr: (text: string) => console.error(text),\n // onRuntimeInitialized: () => {\n // console.log('Assimp.js initialized')\n // this.viewer?.emit('assimpjs-initialized', ajs)\n // },\n // noExitRuntime: true,\n }) : null\n if (!ajs) {\n this._initing = undefined\n this._scriptElement?.remove()\n throw new Error('Failed to load Assimp.js library')\n }\n this.ajs = ajs\n\n }\n ajs?: AssimpJsInterface\n\n onAdded(viewer: ThreeViewer) {\n super.onAdded(viewer)\n if (this.initOnAdd) this.init()\n }\n\n // todo add ui config to export the scene, selected object as fbx or glb2 etc. or interface with the AssetExporter.\n\n convertFiles(files: Record<string, ArrayBuffer>, format: 'fbx'|'gltf2'|'glb2'|'assjson' = 'glb2') {\n const ajs = this.ajs\n if (!ajs) {\n console.error('Assimp.js is not initialized, wait for the promise like - `await assimpPlugin.init()`')\n return\n }\n const fileList = new ajs.FileList()\n for (const [name, content] of Object.entries(files)) {\n fileList.AddFile(name, new Uint8Array(content))\n }\n\n // convert file list to assimp json\n const result = ajs.ConvertFileList(fileList, format)\n\n // check if the conversion succeeded\n if (!result.IsSuccess() || result.FileCount() == 0) {\n // resultDiv.innerHTML = result.GetErrorCode()\n console.error(result.GetErrorCode())\n console.error(result)\n return\n }\n\n // get the result file, and convert to blob\n const resultFile = result.GetFile(0)\n const blob = new Blob([resultFile.GetContent()], {type: 'application/octet-stream'})\n return blob\n }\n\n async exportModel(format: 'fbx'|'gltf2'|'glb2'|'assjson' = 'glb2', object?: IObject3D, options: ExportFileOptions = {embedUrlImages: true}) {\n if (!this._viewer) {\n console.error('AssimpJsPlugin - No viewer attached, please add the plugin to a viewer instance.')\n return\n }\n const initing = this.init()\n const selected = this.exportSelected ? this._viewer.getPlugin(PickingPlugin)?.getSelectedObject() : undefined\n object = object || selected || this._viewer.scene.modelRoot\n\n // export to glb\n const blob = await this._viewer.export(object, options)\n if (!blob || blob.ext !== 'glb') {\n console.error('AssimpJsPlugin - Unable to export model, no blob returned.')\n return\n }\n await initing // wait for assimp.js to be initialized\n const blob2 = this.convertFiles({['file.glb']: await blob.arrayBuffer()}, format)\n if (!blob2) {\n console.error('AssimpJsPlugin - Unable to convert model to format:', format)\n return\n }\n // convert to ArrayBuffer\n return new File([blob2], 'model.' + format.replace(/2$/, ''), {type: 'application/octet-stream'})\n }\n\n @uiToggle('Export Selected')\n exportSelected = true\n\n @uiButton('Download FBX')\n async exportAsFbx(object?: IObject3D) {\n if (!object?.isObject3D) object = undefined\n const blob = await this.exportModel('fbx', object)\n if (blob) {\n await this._viewer?.exportBlob(blob, blob.name)\n }\n }\n @uiButton('Download Assimp JSON')\n async exportAsGlb(object?: IObject3D) {\n if (!object?.isObject3D) object = undefined\n const blob = await this.exportModel('assjson', object)\n if (blob) {\n await this._viewer?.exportBlob(blob, blob.name)\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBa,IAAA,iBAAN,cAA6B,kBAAkB;AAAA,EAWlD,YAAY,YAAY,MAAM;AACpB,UAAA;AAVA,SAAA,UAAA;AACV,SAAA,eAAe,CAAC;AA2GK,SAAA,iBAAA;AAjGjB,SAAK,YAAY;AAAA,EAAA;AAAA,EAMrB,MAAM,OAAO;AACT,QAAI,CAAC,KAAK,SAAe,MAAA,WAAW,KAAK,MAAM;AAC/C,UAAM,KAAK;AACX,WAAO,KAAK;AAAA,EAAA;AAAA,EAEhB,MAAc,QAAQ;;AACd,QAAA,CAAE,OAAe,UAAU;AAC3B,WAAK,iBAAiB,MAAM,oBAAoB,eAAe,eAAe,kBAAkB;AAAA,IAAA;AAEpG,UAAM,OAAQ,OAAe;AACvB,UAAA,MAAM,OAAO,MAAM,KAAK;AAAA,MAC1B,YAAY,CAAC,SAAiB,eAAe,eAAe,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQzE,CAAA,IAAI;AACL,QAAI,CAAC,KAAK;AACN,WAAK,WAAW;AAChB,iBAAK,mBAAL,mBAAqB;AACf,YAAA,IAAI,MAAM,kCAAkC;AAAA,IAAA;AAEtD,SAAK,MAAM;AAAA,EAAA;AAAA,EAKf,QAAQ,QAAqB;AACzB,UAAM,QAAQ,MAAM;AAChB,QAAA,KAAK,UAAW,MAAK,KAAK;AAAA,EAAA;AAAA;AAAA,EAKlC,aAAa,OAAoC,SAAyC,QAAQ;AAC9F,UAAM,MAAM,KAAK;AACjB,QAAI,CAAC,KAAK;AACN,cAAQ,MAAM,uFAAuF;AACrG;AAAA,IAAA;AAEE,UAAA,WAAW,IAAI,IAAI,SAAS;AAClC,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,eAAS,QAAQ,MAAM,IAAI,WAAW,OAAO,CAAC;AAAA,IAAA;AAIlD,UAAM,SAAS,IAAI,gBAAgB,UAAU,MAAM;AAGnD,QAAI,CAAC,OAAO,UAAA,KAAe,OAAO,eAAe,GAAG;AAExC,cAAA,MAAM,OAAO,cAAc;AACnC,cAAQ,MAAM,MAAM;AACpB;AAAA,IAAA;AAIE,UAAA,aAAa,OAAO,QAAQ,CAAC;AAC7B,UAAA,OAAO,IAAI,KAAK,CAAC,WAAW,WAAW,CAAC,GAAG,EAAC,MAAM,4BAA2B;AAC5E,WAAA;AAAA,EAAA;AAAA,EAGX,MAAM,YAAY,SAAyC,QAAQ,QAAoB,UAA6B,EAAC,gBAAgB,QAAO;;AACpI,QAAA,CAAC,KAAK,SAAS;AACf,cAAQ,MAAM,kFAAkF;AAChG;AAAA,IAAA;AAEE,UAAA,UAAU,KAAK,KAAK;AACpB,UAAA,WAAW,KAAK,kBAAiB,UAAK,QAAQ,UAAU,aAAa,MAApC,mBAAuC,sBAAsB;AACpG,aAAS,UAAU,YAAY,KAAK,QAAQ,MAAM;AAGlD,UAAM,OAAO,MAAM,KAAK,QAAQ,OAAO,QAAQ,OAAO;AACtD,QAAI,CAAC,QAAQ,KAAK,QAAQ,OAAO;AAC7B,cAAQ,MAAM,4DAA4D;AAC1E;AAAA,IAAA;AAEE,UAAA;AACN,UAAM,QAAQ,KAAK,aAAa,EAAC,CAAC,UAAU,GAAG,MAAM,KAAK,cAAa,GAAG,MAAM;AAChF,QAAI,CAAC,OAAO;AACA,cAAA,MAAM,uDAAuD,MAAM;AAC3E;AAAA,IAAA;AAGJ,WAAO,IAAI,KAAK,CAAC,KAAK,GAAG,WAAW,OAAO,QAAQ,MAAM,EAAE,GAAG,EAAC,MAAM,4BAA2B;AAAA,EAAA;AAAA,EAOpG,MAAM,YAAY,QAAoB;;AAC9B,QAAA,EAAC,iCAAQ,YAAqB,UAAA;AAClC,UAAM,OAAO,MAAM,KAAK,YAAY,OAAO,MAAM;AACjD,QAAI,MAAM;AACN,cAAM,UAAK,YAAL,mBAAc,WAAW,MAAM,KAAK;AAAA,IAAI;AAAA,EAClD;AAAA,EAGJ,MAAM,YAAY,QAAoB;;AAC9B,QAAA,EAAC,iCAAQ,YAAqB,UAAA;AAClC,UAAM,OAAO,MAAM,KAAK,YAAY,WAAW,MAAM;AACrD,QAAI,MAAM;AACN,cAAM,UAAK,YAAL,mBAAc,WAAW,MAAM,KAAK;AAAA,IAAI;AAAA,EAClD;AAER;AAhIa,eACc,aAAqB;AADnC,eASK,eAAe,iDAAiD,iBAAiB,YAAY,MAAM,CAAC;AAqG9G,gBAAA;AAAA,EADH,SAAS,iBAAiB;AAAA,GA7GlB,eA8GL,WAAA,kBAAA,CAAA;AAGE,gBAAA;AAAA,EADL,SAAS,cAAc;AAAA,GAhHf,eAiHH,WAAA,eAAA,CAAA;AAQA,gBAAA;AAAA,EADL,SAAS,sBAAsB;AAAA,GAxHvB,eAyHH,WAAA,eAAA,CAAA;AAzHG,iBAAN,gBAAA;AAAA,EADN,kBAAkB,QAAQ;AAAA,GACd,cAAA;"}