@inweb/viewer-three 27.1.0 → 27.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/extensions/components/InfoPanelComponent.js +7 -9
  2. package/dist/extensions/components/InfoPanelComponent.js.map +1 -1
  3. package/dist/extensions/components/InfoPanelComponent.min.js +1 -1
  4. package/dist/extensions/components/InfoPanelComponent.module.js +7 -9
  5. package/dist/extensions/components/InfoPanelComponent.module.js.map +1 -1
  6. package/dist/extensions/loaders/GLTFCloudLoader.js +1 -1
  7. package/dist/extensions/loaders/GLTFCloudLoader.js.map +1 -1
  8. package/dist/extensions/loaders/GLTFCloudLoader.min.js +1 -1
  9. package/dist/extensions/loaders/GLTFCloudLoader.module.js +1 -1
  10. package/dist/extensions/loaders/GLTFCloudLoader.module.js.map +1 -1
  11. package/dist/extensions/loaders/GLTFFileLoader.js +1 -1
  12. package/dist/extensions/loaders/GLTFFileLoader.js.map +1 -1
  13. package/dist/extensions/loaders/GLTFFileLoader.min.js +1 -1
  14. package/dist/extensions/loaders/GLTFFileLoader.module.js +1 -1
  15. package/dist/extensions/loaders/GLTFFileLoader.module.js.map +1 -1
  16. package/dist/extensions/loaders/IFCXLoader.js +2 -2
  17. package/dist/extensions/loaders/IFCXLoader.js.map +1 -1
  18. package/dist/extensions/loaders/IFCXLoader.min.js +1 -1
  19. package/dist/extensions/loaders/IFCXLoader.module.js +2 -2
  20. package/dist/extensions/loaders/IFCXLoader.module.js.map +1 -1
  21. package/dist/extensions/loaders/PotreeLoader.js +1 -1
  22. package/dist/extensions/loaders/PotreeLoader.js.map +1 -1
  23. package/dist/extensions/loaders/PotreeLoader.min.js +1 -1
  24. package/dist/extensions/loaders/PotreeLoader.module.js +1 -1
  25. package/dist/extensions/loaders/PotreeLoader.module.js.map +1 -1
  26. package/dist/viewer-three.js +35 -26
  27. package/dist/viewer-three.js.map +1 -1
  28. package/dist/viewer-three.min.js +2 -2
  29. package/dist/viewer-three.module.js +35 -26
  30. package/dist/viewer-three.module.js.map +1 -1
  31. package/extensions/components/InfoPanelComponent.ts +8 -11
  32. package/extensions/loaders/GLTFCloudLoader.ts +1 -1
  33. package/extensions/loaders/GLTFFileLoader.ts +1 -1
  34. package/extensions/loaders/IFCX/IFCXCloudLoader.ts +1 -1
  35. package/extensions/loaders/IFCX/IFCXFileLoader.ts +1 -1
  36. package/extensions/loaders/Potree/PotreeFileLoader.ts +1 -1
  37. package/lib/Viewer/Viewer.d.ts +1 -1
  38. package/lib/Viewer/commands/CreatePreview.d.ts +1 -1
  39. package/lib/Viewer/components/RenderLoopComponent.d.ts +1 -1
  40. package/lib/Viewer/draggers/FlyDragger.d.ts +1 -0
  41. package/lib/Viewer/draggers/WalkDragger.d.ts +1 -0
  42. package/lib/Viewer/loaders/index.d.ts +2 -1
  43. package/package.json +5 -5
  44. package/src/Viewer/Viewer.ts +28 -25
  45. package/src/Viewer/commands/CreatePreview.ts +2 -2
  46. package/src/Viewer/components/InfoComponent.ts +4 -4
  47. package/src/Viewer/components/RenderLoopComponent.ts +2 -2
  48. package/src/Viewer/draggers/FlyDragger.ts +8 -1
  49. package/src/Viewer/draggers/WalkDragger.ts +8 -1
  50. package/src/Viewer/loaders/GLTFCloudDynamicLoader.ts +2 -2
  51. package/src/Viewer/loaders/GLTFFileDynamicLoader.ts +2 -2
  52. package/src/Viewer/loaders/index.ts +2 -1
@@ -131,8 +131,8 @@ class PotreeFileLoader extends Loader {
131
131
  this.viewer.models.push(modelImpl);
132
132
  this.viewer.syncOptions();
133
133
  this.viewer.syncOverlay();
134
- this.viewer.update();
135
134
  this.viewer.emitEvent({ type: "databasechunk", data: pco, file });
135
+ this.viewer.update(true);
136
136
  return this;
137
137
  }
138
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PotreeLoader.module.js","sources":["../../../extensions/loaders/Potree/PotreeModelImpl.ts","../../../extensions/loaders/Potree/PotreeFileLoader.ts","../../../extensions/loaders/Potree/index.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\nimport { PointCloudOctree } from \"potree-core\";\nimport { IInfo, Info } from \"@inweb/viewer-core\";\nimport { ModelImpl } from \"@inweb/viewer-three\";\n\n// Potree model implementation.\n\nexport class PotreeModelImpl extends ModelImpl {\n public pco: PointCloudOctree;\n\n override getInfo(): IInfo {\n // ===================== AI-CODE-START ======================\n // Source: Claude Sonnet 4.5\n // Date: 2025-10-02\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5738\n\n let totalPoints = 0;\n let totalNodes = 0;\n let loadedGeometryBytes = 0;\n let estimatedTotalGeometryBytes = 0;\n let geometryBytes = 0;\n\n const bytesPerPoint = this.pco.pcoGeometry?.pointAttributes?.byteSize || 0;\n\n if (this.pco.pcoGeometry && this.pco.pcoGeometry.root) {\n this.pco.pcoGeometry.root.traverse((node: any) => {\n totalNodes++;\n\n const numPoints = node.numPoints || 0;\n totalPoints += numPoints;\n\n if (node.loaded && node.geometry) {\n if (node.geometry.attributes) {\n for (const name in node.geometry.attributes) {\n const attribute = node.geometry.attributes[name];\n if (attribute && attribute.array) {\n loadedGeometryBytes += attribute.array.byteLength;\n }\n }\n }\n\n if (node.geometry.index && node.geometry.index.array) {\n loadedGeometryBytes += node.geometry.index.array.byteLength;\n }\n }\n\n if (bytesPerPoint > 0 && numPoints > 0) {\n estimatedTotalGeometryBytes += numPoints * (bytesPerPoint * 2 - 1);\n }\n }, true);\n }\n\n geometryBytes = Math.max(loadedGeometryBytes, estimatedTotalGeometryBytes);\n\n // ===================== AI-CODE-END ======================\n\n const info = new Info();\n\n info.scene.objects = totalNodes;\n info.scene.points = totalPoints;\n info.scene.triangles = 0;\n info.scene.lines = 0;\n info.scene.edges = 0;\n\n info.memory.geometries = totalNodes;\n info.memory.geometryBytes = Math.floor(geometryBytes);\n info.memory.textures = 0;\n info.memory.textureBytes = 0;\n info.memory.materials = 1;\n info.memory.totalEstimatedGpuBytes = Math.floor(geometryBytes);\n\n info.optimizedScene.objects = info.scene.objects;\n info.optimizedScene.triangles = info.scene.triangles;\n info.optimizedScene.points = info.scene.points;\n info.optimizedScene.lines = info.scene.lines;\n info.optimizedScene.edges = info.scene.edges;\n\n return info;\n }\n\n override getExtents(target: Box3): Box3 {\n return target.union(this.pco.pcoGeometry.boundingBox);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Euler, Vector3 } from \"three\";\nimport { PointColorType, PointCloudOctree, PointSizeType, PointShape, Potree } from \"potree-core\";\nimport { Loader, LoadParams, Viewer } from \"@inweb/viewer-three\";\n\nimport { PotreeModelImpl } from \"./PotreeModelImpl\";\n\nexport type PotreeLoadParams = LoadParams & {\n path?: string;\n position?: Vector3;\n rotation?: Euler;\n scale?: Vector3;\n};\n\nexport class PotreeFileLoader extends Loader {\n public viewer: Viewer;\n public potree: Potree;\n public pointClouds: PointCloudOctree[];\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n\n this.potree = new Potree();\n this.pointClouds = [];\n\n this.viewer.addEventListener(\"render\", this.updatePointClouds);\n this.viewer.addEventListener(\"changecamera\", this.updatePointClouds);\n }\n\n override dispose() {\n this.pointClouds.forEach((pco) => pco.dispose());\n\n this.viewer.removeEventListener(\"render\", this.updatePointClouds);\n this.viewer.removeEventListener(\"changecamera\", this.updatePointClouds);\n }\n\n override isSupport(file: any, format?: string): boolean {\n return typeof file === \"string\" && /(cloud.js|metadata.json)$/i.test(file);\n }\n\n override async load(file: any, format?: string, params: PotreeLoadParams = {}): Promise<this> {\n const path = (params.path || \"\") + file;\n const index = path.lastIndexOf(\"/\");\n const baseUrl = path.slice(0, index + 1);\n const url = path.slice(index + 1);\n\n const pco = await this.potree.loadPointCloud(url, baseUrl);\n pco.material.size = 1.0;\n pco.material.shape = 2;\n pco.material.inputColorEncoding = 1;\n pco.material.outputColorEncoding = 1;\n pco.material.pointColorType = PointColorType.RGB; // RGB | DEPTH | HEIGHT | POINT_INDEX | LOD | CLASSIFICATION\n pco.material.pointSizeType = PointSizeType.ADAPTIVE; // ADAPTIVE | FIXED\n pco.material.shape = PointShape.CIRCLE; // CIRCLE | SQUARE\n\n if (params.position) pco.position.copy(params.position);\n if (params.rotation) pco.rotation.copy(params.rotation);\n if (params.scale) pco.scale.copy(params.scale);\n\n this.pointClouds.push(pco);\n\n const modelImpl = new PotreeModelImpl(pco);\n modelImpl.id = params.modelId || this.extractFileName(file);\n modelImpl.pco = pco;\n\n this.viewer.scene.add(pco);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: pco, file });\n\n return this;\n }\n\n updatePointClouds = () => {\n const result = this.potree.updatePointClouds(this.pointClouds, this.viewer.camera, this.viewer.renderer);\n if (result.exceededMaxLoadsToGPU || result.nodeLoadPromises.length > 0) this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { loaders } from \"@inweb/viewer-three\";\n\nimport { PotreeFileLoader } from \"./PotreeFileLoader\";\n\nloaders.registerLoader(\"potree-file\", (viewer: any) => new PotreeFileLoader(viewer));\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PotreeLoader.module.js","sources":["../../../extensions/loaders/Potree/PotreeModelImpl.ts","../../../extensions/loaders/Potree/PotreeFileLoader.ts","../../../extensions/loaders/Potree/index.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\nimport { PointCloudOctree } from \"potree-core\";\nimport { IInfo, Info } from \"@inweb/viewer-core\";\nimport { ModelImpl } from \"@inweb/viewer-three\";\n\n// Potree model implementation.\n\nexport class PotreeModelImpl extends ModelImpl {\n public pco: PointCloudOctree;\n\n override getInfo(): IInfo {\n // ===================== AI-CODE-START ======================\n // Source: Claude Sonnet 4.5\n // Date: 2025-10-02\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5738\n\n let totalPoints = 0;\n let totalNodes = 0;\n let loadedGeometryBytes = 0;\n let estimatedTotalGeometryBytes = 0;\n let geometryBytes = 0;\n\n const bytesPerPoint = this.pco.pcoGeometry?.pointAttributes?.byteSize || 0;\n\n if (this.pco.pcoGeometry && this.pco.pcoGeometry.root) {\n this.pco.pcoGeometry.root.traverse((node: any) => {\n totalNodes++;\n\n const numPoints = node.numPoints || 0;\n totalPoints += numPoints;\n\n if (node.loaded && node.geometry) {\n if (node.geometry.attributes) {\n for (const name in node.geometry.attributes) {\n const attribute = node.geometry.attributes[name];\n if (attribute && attribute.array) {\n loadedGeometryBytes += attribute.array.byteLength;\n }\n }\n }\n\n if (node.geometry.index && node.geometry.index.array) {\n loadedGeometryBytes += node.geometry.index.array.byteLength;\n }\n }\n\n if (bytesPerPoint > 0 && numPoints > 0) {\n estimatedTotalGeometryBytes += numPoints * (bytesPerPoint * 2 - 1);\n }\n }, true);\n }\n\n geometryBytes = Math.max(loadedGeometryBytes, estimatedTotalGeometryBytes);\n\n // ===================== AI-CODE-END ======================\n\n const info = new Info();\n\n info.scene.objects = totalNodes;\n info.scene.points = totalPoints;\n info.scene.triangles = 0;\n info.scene.lines = 0;\n info.scene.edges = 0;\n\n info.memory.geometries = totalNodes;\n info.memory.geometryBytes = Math.floor(geometryBytes);\n info.memory.textures = 0;\n info.memory.textureBytes = 0;\n info.memory.materials = 1;\n info.memory.totalEstimatedGpuBytes = Math.floor(geometryBytes);\n\n info.optimizedScene.objects = info.scene.objects;\n info.optimizedScene.triangles = info.scene.triangles;\n info.optimizedScene.points = info.scene.points;\n info.optimizedScene.lines = info.scene.lines;\n info.optimizedScene.edges = info.scene.edges;\n\n return info;\n }\n\n override getExtents(target: Box3): Box3 {\n return target.union(this.pco.pcoGeometry.boundingBox);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Euler, Vector3 } from \"three\";\nimport { PointColorType, PointCloudOctree, PointSizeType, PointShape, Potree } from \"potree-core\";\nimport { Loader, LoadParams, Viewer } from \"@inweb/viewer-three\";\n\nimport { PotreeModelImpl } from \"./PotreeModelImpl\";\n\nexport type PotreeLoadParams = LoadParams & {\n path?: string;\n position?: Vector3;\n rotation?: Euler;\n scale?: Vector3;\n};\n\nexport class PotreeFileLoader extends Loader {\n public viewer: Viewer;\n public potree: Potree;\n public pointClouds: PointCloudOctree[];\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n\n this.potree = new Potree();\n this.pointClouds = [];\n\n this.viewer.addEventListener(\"render\", this.updatePointClouds);\n this.viewer.addEventListener(\"changecamera\", this.updatePointClouds);\n }\n\n override dispose() {\n this.pointClouds.forEach((pco) => pco.dispose());\n\n this.viewer.removeEventListener(\"render\", this.updatePointClouds);\n this.viewer.removeEventListener(\"changecamera\", this.updatePointClouds);\n }\n\n override isSupport(file: any, format?: string): boolean {\n return typeof file === \"string\" && /(cloud.js|metadata.json)$/i.test(file);\n }\n\n override async load(file: any, format?: string, params: PotreeLoadParams = {}): Promise<this> {\n const path = (params.path || \"\") + file;\n const index = path.lastIndexOf(\"/\");\n const baseUrl = path.slice(0, index + 1);\n const url = path.slice(index + 1);\n\n const pco = await this.potree.loadPointCloud(url, baseUrl);\n pco.material.size = 1.0;\n pco.material.shape = 2;\n pco.material.inputColorEncoding = 1;\n pco.material.outputColorEncoding = 1;\n pco.material.pointColorType = PointColorType.RGB; // RGB | DEPTH | HEIGHT | POINT_INDEX | LOD | CLASSIFICATION\n pco.material.pointSizeType = PointSizeType.ADAPTIVE; // ADAPTIVE | FIXED\n pco.material.shape = PointShape.CIRCLE; // CIRCLE | SQUARE\n\n if (params.position) pco.position.copy(params.position);\n if (params.rotation) pco.rotation.copy(params.rotation);\n if (params.scale) pco.scale.copy(params.scale);\n\n this.pointClouds.push(pco);\n\n const modelImpl = new PotreeModelImpl(pco);\n modelImpl.id = params.modelId || this.extractFileName(file);\n modelImpl.pco = pco;\n\n this.viewer.scene.add(pco);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: pco, file });\n this.viewer.update(true);\n\n return this;\n }\n\n updatePointClouds = () => {\n const result = this.potree.updatePointClouds(this.pointClouds, this.viewer.camera, this.viewer.renderer);\n if (result.exceededMaxLoadsToGPU || result.nodeLoadPromises.length > 0) this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { loaders } from \"@inweb/viewer-three\";\n\nimport { PotreeFileLoader } from \"./PotreeFileLoader\";\n\nloaders.registerLoader(\"potree-file\", (viewer: any) => new PotreeFileLoader(viewer));\n"],"names":[],"mappings":"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"}
@@ -34934,11 +34934,13 @@ void main() {
34934
34934
  };
34935
34935
  this.viewerRender = () => {
34936
34936
  this.joyStickControls.update();
34937
- this.controls.update();
34938
34937
  };
34939
34938
  this.viewerZoom = () => {
34940
34939
  this.controls.rotateDelta.set(0, 0);
34941
34940
  };
34941
+ this.animate = () => {
34942
+ this.controls.update();
34943
+ };
34942
34944
  const meshOnlyGround = [];
34943
34945
  viewer.models.forEach((model) => model.getVisibleObjects().forEach((obj) => {
34944
34946
  if (obj instanceof Mesh) {
@@ -34951,12 +34953,14 @@ void main() {
34951
34953
  this.joyStickControls = new JoyStickControls(viewer.camera, viewer.canvas, viewer.canvas, meshOnlyGround);
34952
34954
  this.joyStickControls.addEventListener("change", this.controlsChange);
34953
34955
  this.viewer = viewer;
34956
+ this.viewer.addEventListener("animate", this.animate);
34954
34957
  this.viewer.addEventListener("render", this.viewerRender);
34955
34958
  this.viewer.addEventListener("zoom", this.viewerZoom);
34956
34959
  this.viewer.addEventListener("changecameramode", this.updateControlsCamera);
34957
34960
  this.updateControls();
34958
34961
  }
34959
34962
  dispose() {
34963
+ this.viewer.removeEventListener("animate", this.animate);
34960
34964
  this.viewer.removeEventListener("render", this.viewerRender);
34961
34965
  this.viewer.removeEventListener("zoom", this.viewerZoom);
34962
34966
  this.viewer.removeEventListener("changecameramode", this.updateControlsCamera);
@@ -35136,23 +35140,27 @@ void main() {
35136
35140
  };
35137
35141
  this.viewerRender = () => {
35138
35142
  this.joyStickControls.update();
35139
- this.controls.update();
35140
35143
  };
35141
35144
  this.viewerZoom = () => {
35142
35145
  this.controls.rotateDelta.set(0, 0);
35143
35146
  };
35147
+ this.animate = () => {
35148
+ this.controls.update();
35149
+ };
35144
35150
  this.controls = new FlyControls(viewer.camera, viewer.canvas);
35145
35151
  this.controls.addEventListener("change", this.controlsChange);
35146
35152
  this.controls.addEventListener("flyspeedchange", this.flyspeedChange);
35147
35153
  this.joyStickControls = new JoyStickControls(viewer.camera, viewer.canvas, viewer.canvas, []);
35148
35154
  this.joyStickControls.addEventListener("change", this.controlsChange);
35149
35155
  this.viewer = viewer;
35156
+ this.viewer.addEventListener("animate", this.animate);
35150
35157
  this.viewer.addEventListener("render", this.viewerRender);
35151
35158
  this.viewer.addEventListener("zoom", this.viewerZoom);
35152
35159
  this.viewer.addEventListener("changecameramode", this.updateControlsCamera);
35153
35160
  this.updateControls();
35154
35161
  }
35155
35162
  dispose() {
35163
+ this.viewer.removeEventListener("animate", this.animate);
35156
35164
  this.viewer.removeEventListener("render", this.viewerRender);
35157
35165
  this.viewer.removeEventListener("zoom", this.viewerZoom);
35158
35166
  this.viewer.removeEventListener("changecameramode", this.updateControlsCamera);
@@ -35202,9 +35210,9 @@ void main() {
35202
35210
  viewer.clearSlices();
35203
35211
  }
35204
35212
 
35205
- function createPreview(viewer, type = "image/jpeg", encoderOptions = 0.25) {
35213
+ function createPreview(viewer, type = "image/jpeg", quality = 0.25) {
35206
35214
  viewer.update(true);
35207
- return viewer.canvas.toDataURL(type, encoderOptions);
35215
+ return viewer.canvas.toDataURL(type, quality);
35208
35216
  }
35209
35217
 
35210
35218
  function explode(viewer, index = 0) {
@@ -35751,9 +35759,9 @@ void main() {
35751
35759
  console.log("File load time:", this.viewer.info.performance.loadTime, "ms");
35752
35760
  };
35753
35761
  this.resize = () => {
35754
- const rendererSize = this.viewer.renderer.getSize(new Vector2());
35755
- this.viewer.info.render.viewport.width = rendererSize.x;
35756
- this.viewer.info.render.viewport.height = rendererSize.y;
35762
+ const { width, height } = this.viewer.canvas;
35763
+ this.viewer.info.render.viewport.width = width;
35764
+ this.viewer.info.render.viewport.height = height;
35757
35765
  };
35758
35766
  this.render = () => {
35759
35767
  this.viewer.info.render.drawCalls = this.viewer.renderer.info.render.calls;
@@ -35802,13 +35810,13 @@ void main() {
35802
35810
 
35803
35811
  class RenderLoopComponent {
35804
35812
  constructor(viewer) {
35805
- this.animate = (time = 0) => {
35813
+ this.animate = (time) => {
35806
35814
  this.requestId = requestAnimationFrame(this.animate);
35807
35815
  this.viewer.render(time);
35808
35816
  this.viewer.emitEvent({ type: "animate", time });
35809
35817
  };
35810
35818
  this.viewer = viewer;
35811
- this.animate();
35819
+ this.requestId = requestAnimationFrame(this.animate);
35812
35820
  }
35813
35821
  dispose() {
35814
35822
  cancelAnimationFrame(this.requestId);
@@ -40225,13 +40233,13 @@ void main() {
40225
40233
  this.viewer.models.push(modelImpl);
40226
40234
  this.viewer.syncOptions();
40227
40235
  this.viewer.syncOverlay();
40228
- this.viewer.update();
40229
40236
  this.viewer.emitEvent({ type: "databasechunk", data: scene, file });
40237
+ this.viewer.update(true);
40230
40238
  });
40231
40239
  this.gltfLoader.addEventListener("geometryerror", (data) => {
40232
40240
  this.viewer.emitEvent({ type: "geometryerror", data, file });
40233
40241
  });
40234
- this.gltfLoader.addEventListener("update", (data) => {
40242
+ this.gltfLoader.addEventListener("update", () => {
40235
40243
  this.viewer.update();
40236
40244
  });
40237
40245
  const loadController = {
@@ -40313,13 +40321,13 @@ void main() {
40313
40321
  this.viewer.models.push(modelImpl);
40314
40322
  this.viewer.syncOptions();
40315
40323
  this.viewer.syncOverlay();
40316
- this.viewer.update();
40317
40324
  this.viewer.emitEvent({ type: "databasechunk", data: scene, file: model.file, model });
40325
+ this.viewer.update(true);
40318
40326
  });
40319
40327
  this.gltfLoader.addEventListener("geometryerror", (data) => {
40320
40328
  this.viewer.emitEvent({ type: "geometryerror", data, file: model.file, model });
40321
40329
  });
40322
- this.gltfLoader.addEventListener("update", (data) => {
40330
+ this.gltfLoader.addEventListener("update", () => {
40323
40331
  this.viewer.update();
40324
40332
  });
40325
40333
  const loadController = {
@@ -55456,11 +55464,13 @@ js: import "konva/skia-backend";
55456
55464
  this.syncOptions();
55457
55465
  this.syncOverlay();
55458
55466
  this._renderTime = performance.now();
55459
- this.render(this._renderTime);
55460
- if (typeof onProgress === "function")
55461
- onProgress(new ProgressEvent("progress", { lengthComputable: true, loaded: 1, total: 1 }));
55467
+ if (typeof onProgress === "function") {
55468
+ const event = new ProgressEvent("progress", { lengthComputable: true, loaded: 1, total: 1 });
55469
+ onProgress(event);
55470
+ }
55462
55471
  this.emitEvent({ type: "initializeprogress", data: 1, loaded: 1, total: 1 });
55463
55472
  this.emitEvent({ type: "initialize" });
55473
+ this.update(true);
55464
55474
  return Promise.resolve(this);
55465
55475
  }
55466
55476
  dispose() {
@@ -55524,8 +55534,8 @@ js: import "konva/skia-backend";
55524
55534
  }
55525
55535
  this.renderer.setSize(width, height, updateStyle);
55526
55536
  this.composer.setSize(width, height);
55527
- this.update(true);
55528
55537
  this.emitEvent({ type: "resize", width, height });
55538
+ this.update(true);
55529
55539
  }
55530
55540
  update(force = false) {
55531
55541
  const time = performance.now();
@@ -55535,11 +55545,11 @@ js: import "konva/skia-backend";
55535
55545
  this.render(time);
55536
55546
  this.emitEvent({ type: "update", force });
55537
55547
  }
55538
- render(time) {
55548
+ render(time, force = false) {
55539
55549
  var _a, _b;
55540
55550
  if (!this.renderer)
55541
55551
  return;
55542
- if (!this._renderNeeded)
55552
+ if (!this._renderNeeded && !force)
55543
55553
  return;
55544
55554
  if (!time)
55545
55555
  time = performance.now();
@@ -55601,6 +55611,7 @@ js: import "konva/skia-backend";
55601
55611
  throw error;
55602
55612
  }
55603
55613
  this.emitEvent({ type: "geometryend", file, model });
55614
+ this.update(true);
55604
55615
  return this;
55605
55616
  }
55606
55617
  openGltfFile(file, externalFiles, params = {}) {
@@ -55633,8 +55644,8 @@ js: import "konva/skia-backend";
55633
55644
  this.target.set(0, 0, 0);
55634
55645
  this.syncOptions();
55635
55646
  this.syncOverlay();
55636
- this.update(true);
55637
55647
  this.emitEvent({ type: "clear" });
55648
+ this.update(true);
55638
55649
  return this;
55639
55650
  }
55640
55651
  is3D() {
@@ -55822,7 +55833,7 @@ js: import "konva/skia-backend";
55822
55833
  this.syncOverlay();
55823
55834
  this.setActiveDragger(draggerName);
55824
55835
  this.emitEvent({ type: "drawviewpoint", data: viewpoint });
55825
- this.update();
55836
+ this.update(true);
55826
55837
  }
55827
55838
  createViewpoint() {
55828
55839
  if (!this.renderer)
@@ -55903,11 +55914,9 @@ js: import "konva/skia-backend";
55903
55914
  }
55904
55915
  return { x: intersectionPoint.x, y: intersectionPoint.y, z: intersectionPoint.z };
55905
55916
  }
55906
- else {
55907
- const point = new Vector3(x, y, -1);
55908
- point.unproject(this.camera);
55909
- return { x: point.x, y: point.y, z: point.z };
55910
- }
55917
+ const point = new Vector3(x, y, -1);
55918
+ point.unproject(this.camera);
55919
+ return { x: point.x, y: point.y, z: point.z };
55911
55920
  }
55912
55921
  worldToScreen(position) {
55913
55922
  if (!this.renderer)