@inweb/viewer-three 26.6.6 → 26.6.7

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 (75) hide show
  1. package/dist/plugins/components/AxesHelperComponent.js +5 -5
  2. package/dist/plugins/components/AxesHelperComponent.js.map +1 -1
  3. package/dist/plugins/components/AxesHelperComponent.min.js +1 -1
  4. package/dist/plugins/components/AxesHelperComponent.module.js +5 -5
  5. package/dist/plugins/components/AxesHelperComponent.module.js.map +1 -1
  6. package/dist/plugins/components/ExtentsHelperComponent.js +15 -7
  7. package/dist/plugins/components/ExtentsHelperComponent.js.map +1 -1
  8. package/dist/plugins/components/ExtentsHelperComponent.min.js +1 -1
  9. package/dist/plugins/components/ExtentsHelperComponent.module.js +15 -7
  10. package/dist/plugins/components/ExtentsHelperComponent.module.js.map +1 -1
  11. package/dist/plugins/components/LightHelperComponent.js +5 -5
  12. package/dist/plugins/components/LightHelperComponent.js.map +1 -1
  13. package/dist/plugins/components/LightHelperComponent.min.js +1 -1
  14. package/dist/plugins/components/LightHelperComponent.module.js +5 -5
  15. package/dist/plugins/components/LightHelperComponent.module.js.map +1 -1
  16. package/dist/plugins/loaders/GLTFCloudLoader.js +4840 -0
  17. package/dist/plugins/loaders/GLTFCloudLoader.js.map +1 -0
  18. package/dist/plugins/loaders/GLTFCloudLoader.min.js +1 -0
  19. package/dist/plugins/loaders/GLTFCloudLoader.module.js +49 -0
  20. package/dist/plugins/loaders/GLTFCloudLoader.module.js.map +1 -0
  21. package/dist/plugins/loaders/IFCXLoader.js +12 -6
  22. package/dist/plugins/loaders/IFCXLoader.js.map +1 -1
  23. package/dist/plugins/loaders/IFCXLoader.min.js +1 -1
  24. package/dist/plugins/loaders/IFCXLoader.module.js +13 -7
  25. package/dist/plugins/loaders/IFCXLoader.module.js.map +1 -1
  26. package/dist/viewer-three.js +3131 -459
  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 +2326 -264
  30. package/dist/viewer-three.module.js.map +1 -1
  31. package/lib/Viewer/Viewer.d.ts +6 -5
  32. package/lib/Viewer/components/HighlighterComponent.d.ts +4 -3
  33. package/lib/Viewer/components/SelectionComponent.d.ts +8 -5
  34. package/lib/Viewer/draggers/CuttingPlaneDragger.d.ts +1 -1
  35. package/lib/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.d.ts +20 -0
  36. package/lib/Viewer/loaders/GLTFCloudDynamicLoader.d.ts +15 -0
  37. package/lib/Viewer/model/IModelImpl.d.ts +27 -0
  38. package/lib/Viewer/model/ModelImpl.d.ts +30 -0
  39. package/lib/Viewer/model/index.d.ts +2 -0
  40. package/lib/index.d.ts +1 -0
  41. package/package.json +11 -7
  42. package/plugins/components/AxesHelperComponent.ts +5 -5
  43. package/plugins/components/ExtentsHelperComponent.ts +15 -7
  44. package/plugins/components/LightHelperComponent.ts +5 -5
  45. package/{src/Viewer/loaders/GLTFCloudModelLoader.ts → plugins/loaders/GLTFCloudLoader.ts} +15 -12
  46. package/plugins/loaders/{IFCXCloudFileLoader.ts → IFCXCloudLoader.ts} +8 -4
  47. package/plugins/loaders/IFCXFileLoader.ts +7 -3
  48. package/plugins/loaders/IFCXLoader.ts +2 -2
  49. package/src/Viewer/Viewer.ts +32 -36
  50. package/src/Viewer/commands/ClearSelected.ts +2 -3
  51. package/src/Viewer/commands/Explode.ts +1 -47
  52. package/src/Viewer/commands/GetModels.ts +1 -1
  53. package/src/Viewer/commands/GetSelected.ts +3 -1
  54. package/src/Viewer/commands/HideSelected.ts +3 -4
  55. package/src/Viewer/commands/IsolateSelected.ts +1 -7
  56. package/src/Viewer/commands/SelectModel.ts +9 -1
  57. package/src/Viewer/commands/SetSelected.ts +8 -10
  58. package/src/Viewer/commands/ShowAll.ts +1 -1
  59. package/src/Viewer/components/BackgroundComponent.ts +1 -0
  60. package/src/Viewer/components/ExtentsComponent.ts +5 -3
  61. package/src/Viewer/components/HighlighterComponent.ts +79 -48
  62. package/src/Viewer/components/SelectionComponent.ts +67 -21
  63. package/src/Viewer/draggers/CuttingPlaneDragger.ts +7 -3
  64. package/src/Viewer/draggers/MeasureLineDragger.ts +2 -0
  65. package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +1628 -0
  66. package/src/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.ts +102 -0
  67. package/src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js +450 -0
  68. package/src/Viewer/loaders/GLTFCloudDynamicLoader.ts +145 -0
  69. package/src/Viewer/loaders/GLTFFileLoader.ts +7 -2
  70. package/src/Viewer/loaders/index.ts +2 -2
  71. package/src/Viewer/model/IModelImpl.ts +67 -0
  72. package/src/Viewer/model/ModelImpl.ts +215 -0
  73. package/src/Viewer/model/index.ts +25 -0
  74. package/src/index.ts +1 -0
  75. package/lib/Viewer/loaders/GLTFCloudModelLoader.d.ts +0 -8
@@ -3,6 +3,7 @@ import { EventEmitter2 } from "@inweb/eventemitter2";
3
3
  import { Assembly, Client, Model, File } from "@inweb/client";
4
4
  import { CanvasEventMap, FileSource, IComponent, IDragger, ILoader, IOptions, IViewer, IViewpoint, Options, OptionsEventMap, ViewerEventMap } from "@inweb/viewer-core";
5
5
  import { IMarkup, IWorldTransform } from "@inweb/markup";
6
+ import { IModelImpl } from "./model";
6
7
  /**
7
8
  * 3D viewer powered by {@link https://threejs.org/ | Three.js}.
8
9
  */
@@ -16,9 +17,9 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
16
17
  helpers: Scene | undefined;
17
18
  camera: PerspectiveCamera | OrthographicCamera | undefined;
18
19
  renderer: WebGLRenderer | undefined;
19
- models: Array<Object3D>;
20
- loaders: Array<ILoader>;
21
- selected: Array<Object3D>;
20
+ loaders: ILoader[];
21
+ models: IModelImpl[];
22
+ selected: Object3D[];
22
23
  extents: Box3;
23
24
  target: Vector3;
24
25
  private _activeDragger;
@@ -44,9 +45,8 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
44
45
  initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent<EventTarget>) => void): Promise<this>;
45
46
  dispose(): this;
46
47
  isInitialized(): boolean;
47
- render(time: DOMHighResTimeStamp): void;
48
48
  update(force?: boolean): void;
49
- syncOptions(options?: IOptions): void;
49
+ render(time: DOMHighResTimeStamp): void;
50
50
  loadReferences(model: Model | File | Assembly): Promise<this>;
51
51
  /**
52
52
  * Loads a file into the viewer.
@@ -137,6 +137,7 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
137
137
  loadGltfFile(file: any, externalFiles: any, params?: any): Promise<this>;
138
138
  cancel(): this;
139
139
  clear(): this;
140
+ syncOptions(options?: IOptions): void;
140
141
  syncOverlay(): void;
141
142
  clearOverlay(): void;
142
143
  clearSlices(): void;
@@ -1,17 +1,18 @@
1
- import { LineBasicMaterial, MeshBasicMaterial } from "three";
1
+ import { LineBasicMaterial, MeshBasicMaterial, Object3D, WebGLRenderTarget } from "three";
2
2
  import { LineMaterial } from "three/examples/jsm/lines/LineMaterial.js";
3
3
  import { IComponent, ResizeEvent } from "@inweb/viewer-core";
4
4
  import { Viewer } from "../Viewer";
5
5
  export declare class HighlighterComponent implements IComponent {
6
6
  protected viewer: Viewer;
7
+ renderTarget: WebGLRenderTarget;
7
8
  highlightMaterial: MeshBasicMaterial;
8
9
  outlineMaterial: LineMaterial;
9
10
  highlightLineMaterial: LineBasicMaterial;
10
11
  highlightLineGlowMaterial: LineMaterial;
11
12
  constructor(viewer: Viewer);
12
13
  dispose(): void;
13
- highlight(object: any): void;
14
- unhighlight(object: any): void;
14
+ highlight(objects: Object3D | Object3D[]): void;
15
+ unhighlight(objects: Object3D | Object3D[]): void;
15
16
  geometryEnd: () => void;
16
17
  optionsChange: () => void;
17
18
  viewerResize(event: ResizeEvent): void;
@@ -1,7 +1,8 @@
1
1
  import { Intersection, Object3D, Raycaster, Vector2 } from "three";
2
- import { IComponent } from "@inweb/viewer-core";
3
- import { Viewer } from "../Viewer";
4
- import { HighlighterComponent } from "./HighlighterComponent";
2
+ import type { IComponent } from "@inweb/viewer-core";
3
+ import type { Viewer } from "../Viewer";
4
+ import type { IModelImpl } from "../model";
5
+ import type { HighlighterComponent } from "./HighlighterComponent";
5
6
  export declare class SelectionComponent implements IComponent {
6
7
  protected viewer: Viewer;
7
8
  protected raycaster: Raycaster;
@@ -13,8 +14,10 @@ export declare class SelectionComponent implements IComponent {
13
14
  onPointerUp: (event: PointerEvent) => void;
14
15
  onDoubleClick: (event: MouseEvent) => void;
15
16
  getMousePosition(event: MouseEvent, target: Vector2): Vector2;
16
- getPointerIntersects(mouse: Vector2): Array<Intersection<Object3D>>;
17
- select(object: any): void;
17
+ getPointerIntersects(mouse: Vector2, objects: Object3D[]): Array<Intersection<Object3D>>;
18
+ select(objects: Object3D | Object3D[], model?: IModelImpl): void;
19
+ deselect(objects: Object3D | Object3D[], model?: IModelImpl): void;
20
+ toggleSelection(objects: Object3D | Object3D[], model?: IModelImpl): void;
18
21
  clearSelection(): void;
19
22
  initHighlighter: () => void;
20
23
  }
@@ -12,6 +12,6 @@ export declare class CuttingPlaneDragger extends OrbitDragger {
12
12
  dispose(): void;
13
13
  transformChange: () => void;
14
14
  transformDrag: (event: any) => void;
15
- viewerExplode: () => void;
15
+ updatePlaneSize: () => void;
16
16
  onDoubleClick: (event: PointerEvent) => void;
17
17
  }
@@ -0,0 +1,20 @@
1
+ import { Box3, Object3D } from "three";
2
+ import { ModelImpl } from "../../model";
3
+ import { DynamicGltfLoader } from "./DynamicGltfLoader.js";
4
+ /**
5
+ * Dynamic model implementation.
6
+ */
7
+ export declare class DynamicModelImpl extends ModelImpl {
8
+ gltfLoader: DynamicGltfLoader;
9
+ getExtents(target: Box3): Box3;
10
+ getObjects(): Object3D[];
11
+ getVisibleObjects(): Object3D[];
12
+ hasObject(object: any): boolean;
13
+ getObjectsByHandles(handles: string | string[]): Object3D[];
14
+ hideObjects(objects: Object3D | Object3D[]): this;
15
+ isolateObjects(objects: Object3D | Object3D[]): this;
16
+ showObjects(objects: Object3D | Object3D[]): this;
17
+ showAllObjects(): this;
18
+ showOriginalObjects(objects: Object3D | Object3D[]): this;
19
+ hideOriginalObjects(objects: Object3D | Object3D[]): this;
20
+ }
@@ -0,0 +1,15 @@
1
+ import { Group } from "three";
2
+ import { ILoader, LoadParams } from "@inweb/viewer-core";
3
+ import { Viewer } from "../Viewer";
4
+ import { DynamicGltfLoader } from "./DynamicGltfLoader/DynamicGltfLoader.js";
5
+ export declare class GLTFCloudDynamicLoader implements ILoader {
6
+ viewer: Viewer;
7
+ scene: Group;
8
+ gltfLoader: DynamicGltfLoader;
9
+ requestId: number;
10
+ constructor(viewer: Viewer);
11
+ dispose(): void;
12
+ isSupport(file: any): boolean;
13
+ load(model: any, format?: string, params?: LoadParams): Promise<this>;
14
+ cancel(): void;
15
+ }
@@ -0,0 +1,27 @@
1
+ import { Box3, Object3D } from "three";
2
+ import { ILoader, IViewer } from "@inweb/viewer-core";
3
+ /**
4
+ * Model interface.
5
+ */
6
+ export interface IModelImpl {
7
+ handle: string;
8
+ scene: Object3D;
9
+ loader: ILoader;
10
+ viewer: IViewer;
11
+ dispose(): void;
12
+ getExtents(target: Box3): Box3;
13
+ getObjects(): Object3D[];
14
+ getVisibleObjects(): Object3D[];
15
+ hasObject(objects: Object3D): boolean;
16
+ getOwnObjects(objects: Object3D | Object3D[]): Object3D[];
17
+ getObjectsByHandles(handles: string | string[]): Object3D[];
18
+ getHandlesByObjects(objects: Object3D | Object3D[]): string[];
19
+ hideObjects(objects: Object3D | Object3D[]): this;
20
+ hideAllObjects(): this;
21
+ isolateObjects(objects: Object3D | Object3D[]): this;
22
+ showObjects(objects: Object3D | Object3D[]): this;
23
+ showAllObjects(): this;
24
+ showOriginalObjects(objects: Object3D | Object3D[]): this;
25
+ hideOriginalObjects(objects: Object3D | Object3D[]): this;
26
+ explode(scale: number, coeff?: number): this;
27
+ }
@@ -0,0 +1,30 @@
1
+ import { Box3, Object3D } from "three";
2
+ import { ILoader } from "@inweb/viewer-core";
3
+ import { IModelImpl } from "./IModelImpl";
4
+ import { Viewer } from "../Viewer";
5
+ /**
6
+ * Basic model implementation.
7
+ */
8
+ export declare class ModelImpl implements IModelImpl {
9
+ handle: string;
10
+ scene: Object3D;
11
+ loader: ILoader;
12
+ viewer: Viewer;
13
+ constructor(scene: Object3D);
14
+ dispose(): void;
15
+ getExtents(target: Box3): Box3;
16
+ getObjects(): Object3D[];
17
+ getVisibleObjects(): Object3D[];
18
+ hasObject(object: Object3D): boolean;
19
+ getOwnObjects(objects: Object3D | Object3D[]): Object3D[];
20
+ getObjectsByHandles(handles: string | string[]): Object3D[];
21
+ getHandlesByObjects(objects: Object3D | Object3D[]): string[];
22
+ hideObjects(objects: Object3D | Object3D[]): this;
23
+ hideAllObjects(): this;
24
+ isolateObjects(objects: Object3D | Object3D[]): this;
25
+ showObjects(objects: Object3D | Object3D[]): this;
26
+ showAllObjects(): this;
27
+ showOriginalObjects(objects: Object3D | Object3D[]): this;
28
+ hideOriginalObjects(objects: Object3D | Object3D[]): this;
29
+ explode(scale?: number, coeff?: number): this;
30
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./IModelImpl";
2
+ export * from "./ModelImpl";
package/lib/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export * from "./Viewer/commands";
3
3
  export * from "./Viewer/components";
4
4
  export * from "./Viewer/loaders";
5
5
  export * from "./Viewer/loaders/GLTFLoadingManager";
6
+ export * from "./Viewer/model";
6
7
  export * from "./Viewer/Viewer";
7
8
  export * from "@inweb/viewer-core";
8
9
  export * from "@inweb/markup";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inweb/viewer-three",
3
- "version": "26.6.6",
3
+ "version": "26.6.7",
4
4
  "description": "JavaScript library for rendering CAD and BIM files in a browser using Three.js",
5
5
  "homepage": "https://cloud.opendesign.com/docs/index.html",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -26,15 +26,19 @@
26
26
  "plugins"
27
27
  ],
28
28
  "scripts": {
29
- "build": "rollup -c rollup.config.js",
30
- "test": "karma start karma.conf.js",
29
+ "build": "npm run build:viewer && npm run build:plugins",
30
+ "build:viewer": "rollup -c rollup.config.js",
31
+ "build:plugins": "rollup -c rollup.plugins.config.js",
32
+ "test": "npm run test:viewer && npm run test:plugins",
33
+ "test:viewer": "karma start karma.conf.js",
34
+ "test:plugins": "karma start karma.plugins.conf.js",
31
35
  "docs": "typedoc"
32
36
  },
33
37
  "dependencies": {
34
- "@inweb/client": "~26.6.6",
35
- "@inweb/eventemitter2": "~26.6.6",
36
- "@inweb/markup": "~26.6.6",
37
- "@inweb/viewer-core": "~26.6.6"
38
+ "@inweb/client": "~26.6.7",
39
+ "@inweb/eventemitter2": "~26.6.7",
40
+ "@inweb/markup": "~26.6.7",
41
+ "@inweb/viewer-core": "~26.6.7"
38
42
  },
39
43
  "devDependencies": {
40
44
  "@types/three": "^0.173.0",
@@ -33,8 +33,8 @@ class AxesHelperComponent implements IComponent {
33
33
  this.axesHelper1 = new AxesHelper();
34
34
  this.axesHelper2 = new AxesHelper();
35
35
  this.viewer = viewer;
36
- this.viewer.addEventListener("geometryend", this.geometryEnd);
37
- this.viewer.addEventListener("clear", this.geometryEnd);
36
+ this.viewer.addEventListener("geometryend", this.syncHelper);
37
+ this.viewer.addEventListener("clear", this.syncHelper);
38
38
  }
39
39
 
40
40
  dispose() {
@@ -44,11 +44,11 @@ class AxesHelperComponent implements IComponent {
44
44
  this.axesHelper2.removeFromParent();
45
45
  this.axesHelper2.dispose();
46
46
 
47
- this.viewer.removeEventListener("geometryend", this.geometryEnd);
48
- this.viewer.removeEventListener("clear", this.geometryEnd);
47
+ this.viewer.removeEventListener("geometryend", this.syncHelper);
48
+ this.viewer.removeEventListener("clear", this.syncHelper);
49
49
  }
50
50
 
51
- geometryEnd = () => {
51
+ syncHelper = () => {
52
52
  this.axesHelper1.removeFromParent();
53
53
  this.axesHelper1.dispose();
54
54
 
@@ -31,21 +31,29 @@ class ExtentsHelperComponent implements IComponent {
31
31
  constructor(viewer: Viewer) {
32
32
  this.boxHelper = new Box3Helper(new Box3(), "#ff0000");
33
33
  this.viewer = viewer;
34
- this.viewer.on("geometryend", this.geometryEnd);
35
- this.viewer.on("explode", this.geometryEnd);
36
- this.viewer.on("clear", this.geometryEnd);
34
+ this.viewer.on("geometryend", this.syncHelper);
35
+ this.viewer.on("clear", this.syncHelper);
36
+ this.viewer.on("explode", this.syncHelper);
37
+ this.viewer.on("hide", this.syncHelper);
38
+ this.viewer.on("isolate", this.syncHelper);
39
+ this.viewer.on("show", this.syncHelper);
40
+ this.viewer.on("showall", this.syncHelper);
37
41
  }
38
42
 
39
43
  dispose() {
40
44
  this.boxHelper.removeFromParent();
41
45
  this.boxHelper.dispose();
42
46
 
43
- this.viewer.off("geometryend", this.geometryEnd);
44
- this.viewer.off("explode", this.geometryEnd);
45
- this.viewer.off("clear", this.geometryEnd);
47
+ this.viewer.off("geometryend", this.syncHelper);
48
+ this.viewer.off("clear", this.syncHelper);
49
+ this.viewer.off("explode", this.syncHelper);
50
+ this.viewer.off("hide", this.syncHelper);
51
+ this.viewer.off("isolate", this.syncHelper);
52
+ this.viewer.off("show", this.syncHelper);
53
+ this.viewer.off("showall", this.syncHelper);
46
54
  }
47
55
 
48
- geometryEnd = () => {
56
+ syncHelper = () => {
49
57
  this.boxHelper.removeFromParent();
50
58
 
51
59
  if (this.viewer.extents.isEmpty()) return;
@@ -31,8 +31,8 @@ class LightHelperComponent implements IComponent {
31
31
  constructor(viewer: Viewer) {
32
32
  this.lightHelpers = [];
33
33
  this.viewer = viewer;
34
- this.viewer.addEventListener("geometryend", this.geometryEnd);
35
- this.viewer.addEventListener("clear", this.geometryEnd);
34
+ this.viewer.addEventListener("geometryend", this.syncHelper);
35
+ this.viewer.addEventListener("clear", this.syncHelper);
36
36
  }
37
37
 
38
38
  dispose() {
@@ -42,11 +42,11 @@ class LightHelperComponent implements IComponent {
42
42
  });
43
43
  this.lightHelpers.length = 0;
44
44
 
45
- this.viewer.removeEventListener("geometryend", this.geometryEnd);
46
- this.viewer.removeEventListener("clear", this.geometryEnd);
45
+ this.viewer.removeEventListener("geometryend", this.syncHelper);
46
+ this.viewer.removeEventListener("clear", this.syncHelper);
47
47
  }
48
48
 
49
- geometryEnd = () => {
49
+ syncHelper = () => {
50
50
  this.lightHelpers.forEach((helper) => {
51
51
  helper.removeFromParent();
52
52
  helper.dispose();
@@ -22,12 +22,9 @@
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
24
  import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
25
- import { Loader } from "@inweb/viewer-core";
25
+ import { GLTFLoadingManager, Loader, loaders, ModelImpl, Viewer } from "@inweb/viewer-three";
26
26
 
27
- import { Viewer } from "../Viewer";
28
- import { GLTFLoadingManager } from "./GLTFLoadingManager";
29
-
30
- export class GLTFCloudModelLoader extends Loader {
27
+ class GLTFCloudLoader extends Loader {
31
28
  public viewer: Viewer;
32
29
 
33
30
  constructor(viewer: Viewer) {
@@ -35,12 +32,12 @@ export class GLTFCloudModelLoader extends Loader {
35
32
  this.viewer = viewer;
36
33
  }
37
34
 
38
- override isSupport(model: any): boolean {
35
+ override isSupport(file: any): boolean {
39
36
  return (
40
- typeof model === "object" &&
41
- typeof model.database === "string" &&
42
- typeof model.downloadResource === "function" &&
43
- /.gltf$/i.test(model.database)
37
+ typeof file === "object" &&
38
+ typeof file.database === "string" &&
39
+ typeof file.downloadResource === "function" &&
40
+ /.gltf$/i.test(file.database)
44
41
  );
45
42
  }
46
43
 
@@ -60,8 +57,12 @@ export class GLTFCloudModelLoader extends Loader {
60
57
  const gltf = await loader.loadAsync(url, progress);
61
58
  if (!this.viewer.scene) return this;
62
59
 
63
- this.viewer.scene.add(gltf.scene);
64
- this.viewer.models.push(gltf.scene);
60
+ const modelImpl = new ModelImpl(gltf.scene);
61
+ modelImpl.loader = this;
62
+ modelImpl.viewer = this.viewer;
63
+
64
+ this.viewer.scene.add(modelImpl.scene);
65
+ this.viewer.models.push(modelImpl);
65
66
 
66
67
  this.viewer.syncOptions();
67
68
  this.viewer.syncOverlay();
@@ -72,3 +73,5 @@ export class GLTFCloudModelLoader extends Loader {
72
73
  return this;
73
74
  }
74
75
  }
76
+
77
+ loaders.registerLoader("gltf-cloud", (viewer: any) => new GLTFCloudLoader(viewer));
@@ -21,10 +21,10 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
- import { Loader, Viewer } from "@inweb/viewer-three";
24
+ import { Loader, ModelImpl, Viewer } from "@inweb/viewer-three";
25
25
  import { parse, clear } from "./IFCX/render.js";
26
26
 
27
- export class IFCXCloudFileLoader extends Loader {
27
+ export class IFCXCloudLoader extends Loader {
28
28
  public viewer: Viewer;
29
29
 
30
30
  constructor(viewer: Viewer) {
@@ -61,8 +61,12 @@ export class IFCXCloudFileLoader extends Loader {
61
61
  handle++;
62
62
  });
63
63
 
64
- this.viewer.scene.add(scene);
65
- this.viewer.models.push(scene);
64
+ const modelImpl = new ModelImpl(scene);
65
+ modelImpl.loader = this;
66
+ modelImpl.viewer = this.viewer;
67
+
68
+ this.viewer.scene.add(modelImpl.scene);
69
+ this.viewer.models.push(modelImpl);
66
70
 
67
71
  this.viewer.syncOptions();
68
72
  this.viewer.syncOverlay();
@@ -21,7 +21,7 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
- import { GLTFLoadingManager, GLTFLoadParams, Loader, Viewer } from "@inweb/viewer-three";
24
+ import { GLTFLoadingManager, GLTFLoadParams, Loader, ModelImpl, Viewer } from "@inweb/viewer-three";
25
25
  import { IFCXLoader } from "./IFCX/IFCXLoader";
26
26
 
27
27
  export class IFCXFileLoader extends Loader {
@@ -62,8 +62,12 @@ export class IFCXFileLoader extends Loader {
62
62
  handle++;
63
63
  });
64
64
 
65
- this.viewer.scene.add(scene);
66
- this.viewer.models.push(scene);
65
+ const modelImpl = new ModelImpl(scene);
66
+ modelImpl.loader = this;
67
+ modelImpl.viewer = this.viewer;
68
+
69
+ this.viewer.scene.add(modelImpl.scene);
70
+ this.viewer.models.push(modelImpl);
67
71
 
68
72
  this.viewer.syncOptions();
69
73
  this.viewer.syncOverlay();
@@ -24,7 +24,7 @@
24
24
  import { loaders } from "@inweb/viewer-three";
25
25
 
26
26
  import { IFCXFileLoader } from "./IFCXFileLoader";
27
- import { IFCXCloudFileLoader } from "./IFCXCloudFileLoader";
27
+ import { IFCXCloudLoader } from "./IFCXCloudLoader";
28
28
 
29
29
  loaders.registerLoader("ifcx-file", (viewer: any) => new IFCXFileLoader(viewer));
30
- loaders.registerLoader("ifcx-cloud-file", (viewer: any) => new IFCXCloudFileLoader(viewer));
30
+ loaders.registerLoader("ifcx-cloud", (viewer: any) => new IFCXCloudLoader(viewer));
@@ -62,6 +62,7 @@ import { draggers } from "./draggers";
62
62
  import { commands } from "./commands";
63
63
  import { components } from "./components";
64
64
  import { loaders } from "./loaders";
65
+ import { IModelImpl } from "./model";
65
66
 
66
67
  /**
67
68
  * 3D viewer powered by {@link https://threejs.org/ | Three.js}.
@@ -82,14 +83,14 @@ export class Viewer
82
83
  public helpers: Scene | undefined;
83
84
  public camera: PerspectiveCamera | OrthographicCamera | undefined;
84
85
  public renderer: WebGLRenderer | undefined;
85
- public models: Array<Object3D>;
86
- public loaders: Array<ILoader>;
87
- public selected: Array<Object3D>;
86
+ public loaders: ILoader[];
87
+ public models: IModelImpl[];
88
+ public selected: Object3D[];
88
89
  public extents: Box3;
89
90
  public target: Vector3;
90
91
 
91
92
  private _activeDragger: IDragger | null;
92
- private _components: Array<IComponent>;
93
+ private _components: IComponent[];
93
94
 
94
95
  private renderNeeded: boolean;
95
96
  private renderTime: DOMHighResTimeStamp;
@@ -110,8 +111,8 @@ export class Viewer
110
111
  this.canvasEvents = CANVAS_EVENTS;
111
112
  this.canvaseventlistener = (event: Event) => this.emit(event);
112
113
 
113
- this.models = [];
114
114
  this.loaders = [];
115
+ this.models = [];
115
116
  this.selected = [];
116
117
  this.extents = new Box3();
117
118
  this.target = new Vector3();
@@ -154,6 +155,7 @@ export class Viewer
154
155
  this.scene = new Scene();
155
156
  this.helpers = new Scene();
156
157
 
158
+ const pixelRatio = window.devicePixelRatio;
157
159
  const rect = canvas.parentElement.getBoundingClientRect();
158
160
  const width = rect.width || 1;
159
161
  const height = rect.height || 1;
@@ -161,8 +163,15 @@ export class Viewer
161
163
  this.camera = new PerspectiveCamera(45, aspect, 0.01, 1000);
162
164
  this.camera.up.set(0, 0, 1);
163
165
 
164
- this.renderer = new WebGLRenderer({ canvas, antialias: true, preserveDrawingBuffer: true });
165
- this.renderer.setPixelRatio(window.devicePixelRatio);
166
+ this.renderer = new WebGLRenderer({
167
+ canvas,
168
+ antialias: true,
169
+ alpha: true,
170
+ preserveDrawingBuffer: true,
171
+ powerPreference: "high-performance",
172
+ logarithmicDepthBuffer: false,
173
+ });
174
+ this.renderer.setPixelRatio(pixelRatio);
166
175
  this.renderer.setSize(width, height);
167
176
  this.renderer.toneMapping = LinearToneMapping;
168
177
 
@@ -223,7 +232,13 @@ export class Viewer
223
232
  return !!this.renderer;
224
233
  }
225
234
 
226
- public render(time: DOMHighResTimeStamp): void {
235
+ update(force = false): void {
236
+ this.renderNeeded = true;
237
+ if (force) this.render(performance.now());
238
+ this.emitEvent({ type: "update", data: force });
239
+ }
240
+
241
+ render(time: DOMHighResTimeStamp): void {
227
242
  if (!this.renderNeeded) return;
228
243
  if (!this.renderer) return;
229
244
 
@@ -246,16 +261,6 @@ export class Viewer
246
261
  this.emitEvent({ type: "render", time, deltaTime });
247
262
  }
248
263
 
249
- public update(force = false): void {
250
- this.renderNeeded = true;
251
- if (force) this.render(performance.now());
252
- this.emitEvent({ type: "update", data: force });
253
- }
254
-
255
- public syncOptions(options: IOptions = this.options): void {
256
- // this.update();
257
- }
258
-
259
264
  loadReferences(model: Model | File | Assembly): Promise<this> {
260
265
  // todo: load reference as text fonts
261
266
  return Promise.resolve(this);
@@ -360,7 +365,7 @@ export class Viewer
360
365
  if (!format && typeof file === "string") format = file.split(".").pop();
361
366
  if (!format && file instanceof globalThis.File) format = file.name.split(".").pop();
362
367
 
363
- const loader = loaders.createLoader(this, model, format);
368
+ const loader: ILoader = loaders.createLoader(this, model, format);
364
369
  if (!loader) throw new Error(`Format not supported`);
365
370
  this.loaders.push(loader);
366
371
 
@@ -405,33 +410,20 @@ export class Viewer
405
410
  clear(): this {
406
411
  if (!this.renderer) return this;
407
412
 
408
- function disposeMaterial(material: any) {
409
- const materials = Array.isArray(material) ? material : [material];
410
- materials.forEach((material: any) => material.dispose());
411
- }
412
-
413
- function disposeObject(object: any) {
414
- if (object.geometry) object.geometry.dispose();
415
- if (object.material) disposeMaterial(object.material);
416
- }
417
-
418
413
  this.setActiveDragger();
419
414
  this.clearSlices();
420
415
  this.clearOverlay();
421
416
  this.clearSelected();
422
417
 
423
- this.helpers.traverse(disposeObject);
424
- this.helpers.clear();
418
+ this.loaders.forEach((loader) => loader.dispose());
419
+ this.loaders = [];
425
420
 
426
- this.models.forEach((model) => model.traverse(disposeObject));
427
- this.models.forEach((model) => model.removeFromParent());
421
+ this.models.forEach((model) => model.dispose());
428
422
  this.models = [];
429
423
 
424
+ this.helpers.clear();
430
425
  this.scene.clear();
431
426
 
432
- this.loaders.forEach((loader) => loader.dispose());
433
- this.loaders = [];
434
-
435
427
  this.syncOptions();
436
428
  this.syncOverlay();
437
429
  this.update(true);
@@ -441,6 +433,10 @@ export class Viewer
441
433
  return this;
442
434
  }
443
435
 
436
+ syncOptions(options: IOptions = this.options): void {
437
+ // this.update();
438
+ }
439
+
444
440
  syncOverlay(): void {
445
441
  if (!this.renderer) return;
446
442
 
@@ -22,11 +22,10 @@
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
24
  import type { Viewer } from "../Viewer";
25
+ import type { SelectionComponent } from "../components/SelectionComponent";
25
26
 
26
27
  export function clearSelected(viewer: Viewer): void {
27
- const selection: any = viewer.getComponent("SelectionComponent");
28
- if (!selection) return;
29
-
28
+ const selection = viewer.getComponent("SelectionComponent") as SelectionComponent;
30
29
  selection.clearSelection();
31
30
 
32
31
  viewer.update();