Improve warning in AssetManager, Create MaterialManager.copyMaterialProps, fix camera aspect when canvas has height 0, add undo for some buttons, changes/fixes for ui, handle InteractionPromptPlugin in CameraViewPlugin, support async onStop and onComplete in PopmotionPlugin, allow resetting geometry in BaseGroundPlugin, add pluginListeners, forPlugin in ThreeViewer, add SwitchNodeBasePlugin.snapIcons, fixes in InteractionPromptPlugin, add isEditor, LS_DEFAULT_LOGO in LoadingScreenPlugin, add isEditor in FrameFadePlugin.
1 год назад |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670 |
- import {ImportAssetOptions, ImportResult, ProcessRawOptions, RootSceneImportResult} from './IAssetImporter'
- import {
- BaseEvent,
- Cache as threeCache,
- Camera,
- EventDispatcher,
- Light,
- LinearFilter,
- LinearMipmapLinearFilter,
- LoadingManager,
- Object3D,
- PerspectiveCamera,
- TextureLoader,
- } from 'three'
- import {ISerializedConfig, IViewerPlugin, ThreeViewer} from '../viewer'
- import {AssetImporter} from './AssetImporter'
- import {generateUUID, getTextureDataType, overrideThreeCache} from '../three'
- import {IAsset} from './IAsset'
- import {
- AddObjectOptions,
- AmbientLight2,
- DirectionalLight2,
- HemisphereLight2,
- ICamera,
- iCameraCommons,
- ILight,
- iLightCommons,
- IMaterial,
- iMaterialCommons,
- IObject3D,
- iObjectCommons,
- ISceneEventMap,
- ITexture,
- PerspectiveCamera2,
- PointLight2,
- RectAreaLight2,
- SpotLight2,
- upgradeTexture,
- } from '../core'
- import {Importer} from './Importer'
- import {MaterialManager} from './MaterialManager'
- import {
- DRACOLoader2,
- FBXLoader2,
- GLTFLoader2,
- JSONMaterialLoader,
- MTLLoader2,
- OBJLoader2,
- SVGTextureLoader,
- ZipLoader,
- } from './import'
- import {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader.js'
- import {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader.js'
- import {Class, ValOrArr} from 'ts-browser-helpers'
- import {ILoader} from './IImporter'
- import {AssetExporter} from './AssetExporter'
- import {IExporter} from './IExporter'
- import {GLTFExporter2, GLTFWriter2} from './export'
- import {legacySeparateMapSamplerUVFix} from '../utils/legacy'
- import type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader'
- import {GLTFExporterPlugin} from 'three/examples/jsm/exporters/GLTFExporter'
-
- export interface AssetManagerOptions{
- /**
- * simple memory based cache for downloaded files, default = false
- */
- simpleCache?: boolean
- /**
- * Cache Storage for downloaded files, can use with `caches.open`
- * When true and by default uses `caches.open('threepipe-assetmanager')`, set to false to disable
- * @default true
- */
- storage?: Cache | Storage | boolean
- }
-
- export interface AddAssetOptions extends AddObjectOptions{
- /**
- * Automatically set any loaded HDR, EXR file as the scene environment map
- * @default true
- */
- autoSetEnvironment?: boolean
- /**
- * Automatically set any loaded image(ITexture) file as the scene background
- */
- autoSetBackground?: boolean
- }
- export interface ImportAddOptions extends ImportAssetOptions, AddAssetOptions{}
- export interface AddRawOptions extends ProcessRawOptions, AddAssetOptions{}
-
- export interface AssetManagerEventMap{
- loadAsset: {data: ImportResult}
- processStateUpdate: object
- }
-
- /**
- * Asset Manager
- *
- * Utility class to manage import, export, and material management.
- * @category Asset Manager
- */
- export class AssetManager extends EventDispatcher<AssetManagerEventMap> {
- readonly viewer: ThreeViewer
- readonly importer: AssetImporter
- readonly exporter: AssetExporter
- readonly materials: MaterialManager
- private _storage?: Cache | Storage
- get storage() {
- return this._storage
- }
-
- constructor(viewer: ThreeViewer, {simpleCache = false, storage}: AssetManagerOptions = {}) {
- super()
- this._sceneUpdated = this._sceneUpdated.bind(this)
- this.addAsset = this.addAsset.bind(this)
- this.addRaw = this.addRaw.bind(this)
- this._loaderCreate = this._loaderCreate.bind(this)
- this.addImported = this.addImported.bind(this)
-
- this.importer = new AssetImporter(!!viewer.getPlugin('debug'))
- this.exporter = new AssetExporter()
- this.materials = new MaterialManager()
- this.viewer = viewer
- this.viewer.scene.addEventListener('addSceneObject', this._sceneUpdated)
- this.viewer.scene.addEventListener('materialChanged', this._sceneUpdated)
- this.viewer.scene.addEventListener('beforeDeserialize', this._sceneUpdated)
- this._initCacheStorage(simpleCache, storage ?? true)
-
- this._setupGltfExtensions()
- this._setupObjectProcess()
- this._setupProcessState()
- this._addImporters()
- this._addExporters()
-
- }
-
- async addAsset<T extends ImportResult = ImportResult>(assetOrPath?: string | IAsset | IAsset[] | File | File[], options?: ImportAddOptions): Promise<(T | undefined)[]> {
- if (!this.importer || !this.viewer) return []
- const imported = await this.importer.import<T>(assetOrPath, options)
- if (!imported) {
- const path = typeof assetOrPath === 'string' ? assetOrPath : (assetOrPath as IAsset)?.path
- if (path && !path.split('?')[0].endsWith('.vjson'))
- console.warn('Threepipe AssetManager - Unable to import', assetOrPath, imported)
- return []
- }
- return this.loadImported<(T | undefined)[]>(imported, options)
- }
-
- // materials: IMaterial[] = []
- // textures: ITexture[] = []
-
- // todo move this function to viewer
- async loadImported<T extends ValOrArr<ImportResult | undefined> = ImportResult>(imported: T, {
- autoSetEnvironment = true,
- autoSetBackground = false,
- ...options
- }: AddAssetOptions = {}): Promise<T | never[]> {
- const arr: (ImportResult | undefined)[] = Array.isArray(imported) ? imported : [imported]
- let ret: T = Array.isArray(imported) ? [] : undefined as any
-
- if (options?.importConfig !== false) {
- const config = arr.find(v => v?.assetType === 'config') || arr.find(v=>v && !!v.importedViewerConfig)?.importedViewerConfig
- if (config) legacySeparateMapSamplerUVFix(config, arr.filter(a=>a?.isObject3D) as Object3D[])
- }
-
- for (const obj of arr) {
- if (!obj) {
- if (Array.isArray(ret)) ret.push(undefined)
- continue
- }
-
- let r = obj
-
- switch (obj.assetType) {
- case 'material':
- this.materials.registerMaterial(<IMaterial>obj)
- break
- case 'texture':
- if (autoSetEnvironment && (
- obj.__rootPath?.endsWith('.hdr') || obj.__rootPath?.endsWith('.exr')
- )) this.viewer.scene.environment = <ITexture>obj
- if (autoSetBackground) this.viewer.scene.background = <ITexture>obj
- break
- case 'model':
- case 'light':
- case 'camera':
- r = await this.viewer.addSceneObject(<IObject3D | RootSceneImportResult>obj, options) // todo update references in scene update event
- break
- case 'config':
- if (options?.importConfig !== false) await this.viewer.importConfig(<ISerializedConfig>obj)
- break
- default:
-
- // legacy
- if (obj.type && typeof obj.type === 'string' && (Array.isArray((obj as any).plugins) ||
- (obj as any).type === 'ThreeViewer' || this.viewer.getPlugin((obj as any).type))) {
- await this.viewer.importConfig(<ISerializedConfig>obj)
- }
- break
- }
- this.dispatchEvent({type: 'loadAsset', data: obj})
- if (Array.isArray(ret)) ret.push(r)
- else ret = r as T
- }
-
- return ret || []
- }
-
- /**
- * same as {@link loadImported}
- * @param imported
- * @param options
- */
- async addProcessedAssets<T extends ImportResult | undefined = ImportResult>(imported: (T | undefined)[], options?: AddAssetOptions): Promise<(T | undefined)[]> {
- return this.loadImported(imported, options)
- }
-
- async addAssetSingle<T extends ImportResult = ImportResult>(asset?: string | IAsset | File, options?: ImportAssetOptions): Promise<T | undefined> {
- return !asset ? undefined : (await this.addAsset<T>(asset, options))?.[0]
- }
-
- // processAndAddObjects
- async addRaw<T extends (ImportResult | undefined) = ImportResult>(res: T | T[], options: AddRawOptions = {}): Promise<(T | undefined)[]> {
- const r = await this.importer.processRaw<T>(res, options)
- return this.loadImported<T[]>(r, options)
- }
-
- async addRawSingle<T extends ImportResult | undefined = ImportResult | undefined>(res: T, options: AddRawOptions = {}): Promise<T | undefined> {
- return (await this.addRaw<T>(res, options))?.[0]
- }
-
- private _sceneUpdated<T extends keyof ISceneEventMap>(ev: BaseEvent<T> & ISceneEventMap[T]) { // todo: check if objects are added some other way.
- if (ev.type === 'addSceneObject') {
- const event = ev as ISceneEventMap['addSceneObject']
- const target = event.object as ImportResult
- switch (target.assetType) {
- case 'material':
- this.materials.registerMaterial(<IMaterial>target)
- break
- case 'texture':
- break
- case 'model':
- case 'light':
- case 'camera':
- break
- default:
- break
- }
- } else if (ev.type === 'materialChanged') {
- const event = ev as ISceneEventMap['materialChanged']
- const target = event.material as IMaterial | IMaterial[] | undefined
- const targets = Array.isArray(target) ? target : target ? [target] : []
- for (const t of targets) {
- this.materials.registerMaterial(t)
- }
- } else if (ev.type === 'beforeDeserialize') {
- const event = ev as ISceneEventMap['beforeDeserialize']
- // object/material/texture to be deserialized
- const data = event.data as any
- const meta = event.meta
- if (!data.metadata) {
- console.warn('Invalid data(no metadata)', data)
- }
- if (event.material) {
- if (data.metadata?.type !== 'Material') {
- console.warn('Invalid material data', data)
- }
- JSONMaterialLoader.DeserializeMaterialJSON(data, this.viewer, meta, event.material).then(() => {
- //
- })
- }
-
- } else {
- console.error('Unexpected')
- }
- }
-
- dispose() {
- this.importer.dispose()
- this.materials.dispose()
- this.processState.clear()
- this.viewer.scene.removeEventListener('addSceneObject', this._sceneUpdated)
- this.viewer.scene.removeEventListener('materialChanged', this._sceneUpdated)
- this.exporter.dispose()
- }
-
- protected _addImporters() {
- const viewer = this.viewer
- if (!viewer) return
-
- // todo fix - loading manager getHandler matches backwards?
- const importers: Importer[] = [
- new Importer(SVGTextureLoader, ['svg', 'data:image/svg'], ['image/svg+xml'], false), // todo: use ImageBitmapLoader if supported (better performance)
-
- new Importer(TextureLoader, ['webp', 'png', 'jpeg', 'jpg', 'ico', 'data:image', 'avif', 'bmp', 'gif', 'tiff'], [
- 'image/webp', 'image/png', 'image/jpeg', 'image/gif', 'image/bmp', 'image/tiff', 'image/x-icon', 'image/avif',
- ], false), // todo: use ImageBitmapLoader if supported (better performance)
-
- new Importer<JSONMaterialLoader>(JSONMaterialLoader,
- ['mat', ...this.materials.templates.map(t => t.typeSlug!).filter(v => v)], // todo add others
- [], false, (loader) => {
- if (loader) loader.viewer = this.viewer
- return loader
- }),
-
- new Importer(class extends RGBELoader {
- constructor(manager: LoadingManager) {
- super(manager)
- this.setDataType(getTextureDataType(viewer.renderManager.renderer))
- }
- }, ['hdr'], ['image/vnd.radiance'], false),
-
- new Importer(class extends EXRLoader {
- constructor(manager: LoadingManager) {
- super(manager)
- this.setDataType(getTextureDataType(viewer.renderManager.renderer))
- }
- }, ['exr'], ['image/x-exr'], false),
-
- new Importer(FBXLoader2, ['fbx'], ['model/fbx'], true),
- new Importer(ZipLoader, ['zip', 'glbz', 'gltfz'], ['application/zip', 'model/gltf+zip', 'model/zip'], true), // gltfz and glbz are invented zip files with gltf/glb inside along with resources
-
- new Importer(OBJLoader2 as any as Class<ILoader>, ['obj'], ['model/obj'], true),
- new Importer(MTLLoader2 as any as Class<ILoader>, ['mtl'], ['model/mtl'], false),
-
- new Importer<GLTFLoader2>(GLTFLoader2, ['gltf', 'glb', 'data:model/gltf', 'data:model/glb'], ['model/gltf', 'model/gltf+json', 'model/gltf-binary', 'model/glb'], true, (l, _, i) => l?.setup(this.viewer, i.extensions)),
-
- new Importer(DRACOLoader2, ['drc'], ['model/mesh+draco', 'model/drc'], true),
- ]
-
- this.importer.addImporter(...importers)
-
- }
-
- private _gltfExporter = {
- ext: ['gltf', 'glb'],
- extensions: [] as (typeof GLTFExporter2.ExportExtensions)[number][],
- ctor: (_, exporter) => {
- const ex = new GLTFExporter2()
- // This should be added at the end.
- ex.setup(this.viewer, exporter.extensions)
- return ex
- },
- } satisfies IExporter
-
- protected _addExporters() {
- const exporters: IExporter[] = [this._gltfExporter]
-
- this.exporter.addExporter(...exporters)
- }
-
- private _initCacheStorage(simpleCache?: boolean, storage?: Cache | Storage | boolean) {
- if (storage === true && window?.caches) {
- window.caches.open?.('threepipe-assetmanager').then(c => {
- this._initCacheStorage(simpleCache, c)
- this._storage = c
- })
- return
- }
- if (simpleCache || storage) {
- // three.js built-in simple memory cache. used in FileLoader.js todo: use local storage somehow
- if (simpleCache) threeCache.enabled = true
-
- if (storage && window.Cache && typeof window.Cache === 'function' && storage instanceof window.Cache) {
- overrideThreeCache(storage)
- // todo: clear cache
- }
- }
- this._storage = typeof storage === 'boolean' ? undefined : storage
- }
-
-
- protected _setupObjectProcess() {
- this.importer.addEventListener('processRaw', (event) => {
- // console.log('preprocess mat', mat)
- const mat = event.data as IMaterial
- if (!mat || !mat.isMaterial || !mat.uuid) return
- if (this.materials?.findMaterial(mat.uuid)) {
- console.warn('imported material uuid already exists, creating new uuid')
- mat.uuid = generateUUID()
- if (mat.userData.uuid) mat.userData.uuid = mat.uuid
- }
- // todo: check for name exists also
- this.materials.registerMaterial(mat)
- })
-
- this.importer.addEventListener('processRawStart', (event) => {
- // console.log('preprocess mat', mat)
- const res = event.data!
- const options = event.options! as ProcessRawOptions
- // if (!res.assetType) {
- // if (res.isBufferGeometry) { // for eg stl todo
- // res = new Mesh(res, new MeshStandardMaterial())
- // }
- // if (res.isObject3D) {
- // }
- // }
- if (res.isObject3D) {
- const cameras: Camera[] = []
- const lights: Light[] = []
- res.traverse((obj: any) => {
- if (obj.material) {
- const materials = Array.isArray(obj.material) ? obj.material : [obj.material]
- const newMaterials = []
- for (const material of materials) {
- const mat = this.materials.convertToIMaterial(material, {createFromTemplate: options.replaceMaterials !== false}) || material
- mat.uuid = material.uuid
- mat.userData.uuid = material.uuid
- newMaterials.push(mat)
- }
- if (Array.isArray(obj.material)) obj.material = newMaterials
- else obj.material = newMaterials[0]
- }
- if (obj.isCamera) cameras.push(obj)
- if (obj.isLight) lights.push(obj)
- })
- for (const camera of cameras) {
- if ((camera as PerspectiveCamera2).assetType === 'camera') continue
- // todo: OrthographicCamera
- if (!(camera as PerspectiveCamera).isPerspectiveCamera || !camera.parent || options.replaceCameras === false) {
- iCameraCommons.upgradeCamera.call(camera)
- } else {
- const newCamera: ICamera = (camera as any).iCamera ??
- new PerspectiveCamera2('', this.viewer.canvas)
- if (camera === newCamera) continue
- camera.parent.children.splice(camera.parent.children.indexOf(camera), 1, newCamera)
- newCamera.parent = camera.parent as any
- newCamera.copy(camera as any)
- camera.parent = null
- ;(newCamera as any).uuid = camera.uuid
- newCamera.userData.uuid = camera.uuid
- ;(camera as any).iCamera = newCamera
- // console.log('replacing camera', camera, newCamera)
- }
- }
- for (const light of lights) {
- if ((light as ILight).assetType === 'light') continue
- if (!light.parent || options.replaceLights === false) {
- iLightCommons.upgradeLight.call(light)
- } else {
- const newLight: ILight | undefined = (light as any).iLight ??
- (light as any).isDirectionalLight ? new DirectionalLight2() :
- (light as any).isPointLight ? new PointLight2() :
- (light as any).isSpotLight ? new SpotLight2() :
- (light as any).isAmbientLight ? new AmbientLight2() :
- (light as any).isHemisphereLight ? new HemisphereLight2() :
- (light as any).isRectAreaLight ? new RectAreaLight2() :
- undefined
- if (light === newLight || !newLight) continue
- light.parent.children.splice(light.parent.children.indexOf(light), 1, newLight)
- newLight.parent = light.parent as any
- newLight.copy(light as any)
- light.parent = null
- ;(newLight as any).uuid = light.uuid
- newLight.userData.uuid = light.uuid
- ;(light as any).iLight = newLight
- }
- }
-
- iObjectCommons.upgradeObject3D.call(res)
- } else if (res.isMaterial) {
- iMaterialCommons.upgradeMaterial.call(res)
- // todo update res by generating new material?
- } else if (res.isTexture) {
- upgradeTexture.call(res)
-
- if (event?.options?.generateMipmaps !== undefined)
- res.generateMipmaps = event?.options.generateMipmaps
- if (!res.generateMipmaps && !res.isRenderTargetTexture) { // todo: do we need to check more?
- res.minFilter = res.minFilter === LinearMipmapLinearFilter ? LinearFilter : res.minFilter
- res.magFilter = res.magFilter === LinearMipmapLinearFilter ? LinearFilter : res.magFilter
- }
-
- }
- // todo other asset/object types?
- })
- }
-
- /**
- * State of download/upload/process/other processes in the viewer.
- * Subscribes to importer and exporter by default, more can be added by plugins like {@link FileTransferPlugin}
- */
- processState: Map<string, {state: string, progress?: number | undefined}> = new Map()
-
- /**
- * Set process state for a path
- * Progress should be a number between 0 and 100
- * Pass undefined in value to remove the state
- * @param path
- * @param value
- */
- setProcessState(path: string, value: {state: string, progress?: number | undefined} | undefined) {
- if (value === undefined) this.processState.delete(path)
- else this.processState.set(path, value)
- this.dispatchEvent({type: 'processStateUpdate'})
- }
-
- protected _setupProcessState() {
- this.importer.addEventListener('importFile', (data: any) => {
- this.setProcessState(data.path, data.state !== 'done' ? {
- state: data.state,
- progress: data.progress ? data.progress * 100 : undefined,
- } : undefined)
- })
- this.importer.addEventListener('processRawStart', (data: any) => {
- this.setProcessState(data.path, {
- state: 'processing',
- progress: undefined,
- })
- })
- this.importer.addEventListener('processRaw', (data: any) => {
- this.setProcessState(data.path, undefined)
- })
- this.exporter.addEventListener('exportFile', (data: any) => {
- this.setProcessState(data.obj.name, data.state !== 'done' ? {
- state: data.state,
- progress: data.progress ? data.progress * 100 : undefined,
- } : undefined)
- })
- }
-
- // region glTF extensions registration helpers
-
- gltfExtensions: {
- name: string
- import: (parser: GLTFParser) => GLTFLoaderPlugin,
- export: (parser: GLTFWriter2) => GLTFExporterPlugin,
- textures?: Record<string, string|number> // see GLTFDracoExportPlugin
- }[] = []
-
- protected _setupGltfExtensions() {
- this.importer.addEventListener('loaderCreate', this._loaderCreate as any)
- this.viewer.forPlugin('GLTFDracoExportPlugin', (p)=> {
- if (!p.addExtension) return
- for (const gltfExtension of this.gltfExtensions) {
- p.addExtension(gltfExtension.name, gltfExtension.textures)
- }
- })
- }
-
- protected _loaderCreate({loader}: {loader: GLTFLoader2}) {
- if (!loader.isGLTFLoader2) return
- for (const gltfExtension of this.gltfExtensions) {
- loader.register(gltfExtension.import)
- }
- }
-
- registerGltfExtension(ext: AssetManager['gltfExtensions'][number]) {
- const ext1 = this.gltfExtensions.findIndex(e => e.name === ext.name)
- if (ext1 >= 0) this.gltfExtensions.splice(ext1, 1)
- this.gltfExtensions.push(ext)
- this._gltfExporter.extensions.push(ext.export)
- const exporter2 = this.exporter.getExporter('gltf', 'glb')
- if (exporter2 && exporter2 !== this._gltfExporter)
- exporter2.extensions?.push(ext.export)
- }
-
- unregisterGltfExtension(name: string) {
- const ind = this.gltfExtensions.findIndex(e => e.name === name)
- if (ind < 0) return
- this.gltfExtensions.splice(ind, 1)
- const ind1 = this._gltfExporter.extensions.findIndex(e => e.name === name)
- if (ind1 >= 0) this._gltfExporter.extensions.splice(ind1, 1)
- const exporter2 = this.exporter.getExporter('gltf', 'glb')
- if (exporter2?.extensions && exporter2 !== this._gltfExporter) {
- const ind2 = exporter2.extensions.findIndex(e => e.name === name)
- if (ind2 >= 0) exporter2.extensions?.splice(ind2, 1)
- }
- }
-
- // endregion
-
-
- // region deprecated
-
- /**
- * @deprecated use addRaw instead
- * @param res
- * @param options
- */
- async addImported<T extends (ImportResult | undefined) = ImportResult>(res: T | T[], options: AddRawOptions = {}): Promise<(T | undefined)[]> {
- console.error('addImported is deprecated, use addRaw instead')
- return this.addRaw(res, options)
- }
-
- /**
- * @deprecated use addAsset instead
- * @param path
- * @param options
- */
- public async addFromPath(path: string, options: ImportAddOptions = {}): Promise<any[]> {
- console.error('addFromPath is deprecated, use addAsset instead')
- return this.addAsset(path, options)
- }
-
- /**
- * @deprecated use {@link ThreeViewer.exportConfig} instead
- * @param binary - if set to false, encodes all the array buffers to base64
- */
- exportViewerConfig(binary = true): Record<string, any> {
- if (!this.viewer) return {}
- console.error('exportViewerConfig is deprecated, use viewer.toJSON instead')
- return this.viewer.toJSON(binary, undefined)
- }
-
- /**
- * @deprecated use {@link ThreeViewer.exportPluginsConfig} instead
- * @param filter
- */
- exportPluginPresets(filter?: string[]) {
- console.error('exportPluginPresets is deprecated, use viewer.exportPluginsConfig instead')
- return this.viewer?.exportPluginsConfig(filter)
- }
-
- /**
- * @deprecated use {@link ThreeViewer.exportPluginConfig} instead
- * @param plugin
- */
- exportPluginPreset(plugin: IViewerPlugin) {
- console.error('exportPluginPreset is deprecated, use viewer.exportPluginConfig instead')
- return this.viewer?.exportPluginConfig(plugin)
- }
-
- /**
- * @deprecated use {@link ThreeViewer.importPluginConfig} instead
- * @param json
- * @param plugin
- */
- async importPluginPreset(json: any, plugin?: IViewerPlugin) {
- console.error('importPluginPreset is deprecated, use viewer.importPluginConfig instead')
- return this.viewer?.importPluginConfig(json, plugin)
- }
-
- // todo continue from here by moving functions to the viewer.
- /**
- * @deprecated use {@link ThreeViewer.importConfig} instead
- * @param viewerConfig
- */
- async importViewerConfig(viewerConfig: any) {
- return this.viewer?.importConfig(viewerConfig)
- }
-
- /**
- * @deprecated use {@link ThreeViewer.fromJSON} instead
- * @param viewerConfig
- */
- applyViewerConfig(viewerConfig: any, resources?: any) {
- console.error('applyViewerConfig is deprecated, use viewer.fromJSON instead')
- return this.viewer?.fromJSON(viewerConfig, resources)
- }
-
- /**
- * @deprecated moved to {@link ThreeViewer.loadConfigResources}
- * @param json
- * @param extraResources - preloaded resources in the format of viewer config resources.
- */
- async importConfigResources(json: any, extraResources?: any) {
- if (!this.importer) throw 'Importer not initialized yet.'
-
- if (json.__isLoadedResources) return json
-
- return this.viewer?.loadConfigResources(json, extraResources)
- }
-
- /**
- * @deprecated not a plugin anymore
- */
- static readonly PluginType = 'AssetManager'
- // endregion
-
- }
|