@inweb/viewer-three 27.4.6 → 27.5.0

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 (64) hide show
  1. package/dist/extensions/components/AxesHelperComponent.js +3 -0
  2. package/dist/extensions/components/AxesHelperComponent.js.map +1 -1
  3. package/dist/extensions/components/AxesHelperComponent.min.js +1 -1
  4. package/dist/extensions/components/AxesHelperComponent.module.js +3 -0
  5. package/dist/extensions/components/AxesHelperComponent.module.js.map +1 -1
  6. package/dist/extensions/components/ExtentsHelperComponent.js +6 -2
  7. package/dist/extensions/components/ExtentsHelperComponent.js.map +1 -1
  8. package/dist/extensions/components/ExtentsHelperComponent.min.js +1 -1
  9. package/dist/extensions/components/ExtentsHelperComponent.module.js +6 -2
  10. package/dist/extensions/components/ExtentsHelperComponent.module.js.map +1 -1
  11. package/dist/extensions/components/GridHelperComponent.js +1 -0
  12. package/dist/extensions/components/GridHelperComponent.js.map +1 -1
  13. package/dist/extensions/components/GridHelperComponent.min.js +1 -1
  14. package/dist/extensions/components/GridHelperComponent.module.js +1 -0
  15. package/dist/extensions/components/GridHelperComponent.module.js.map +1 -1
  16. package/dist/extensions/components/LightHelperComponent.js +1 -0
  17. package/dist/extensions/components/LightHelperComponent.js.map +1 -1
  18. package/dist/extensions/components/LightHelperComponent.min.js +1 -1
  19. package/dist/extensions/components/LightHelperComponent.module.js +1 -0
  20. package/dist/extensions/components/LightHelperComponent.module.js.map +1 -1
  21. package/dist/viewer-three.js +1765 -438
  22. package/dist/viewer-three.js.map +1 -1
  23. package/dist/viewer-three.min.js +4 -4
  24. package/dist/viewer-three.module.js +1302 -403
  25. package/dist/viewer-three.module.js.map +1 -1
  26. package/extensions/components/AxesHelperComponent.ts +3 -0
  27. package/extensions/components/ExtentsHelperComponent.ts +5 -2
  28. package/extensions/components/GridHelperComponent.ts +1 -0
  29. package/extensions/components/LightHelperComponent.ts +1 -0
  30. package/lib/Viewer/Viewer.d.ts +5 -7
  31. package/lib/Viewer/components/CameraComponent.d.ts +1 -1
  32. package/lib/Viewer/components/ClippingPlaneComponent.d.ts +8 -0
  33. package/lib/Viewer/components/HighlighterComponent.d.ts +2 -2
  34. package/lib/Viewer/components/InfoComponent.d.ts +1 -1
  35. package/lib/Viewer/components/SectionsComponent.d.ts +15 -0
  36. package/lib/Viewer/components/WCSHelperComponent.d.ts +2 -2
  37. package/lib/Viewer/draggers/CuttingPlaneDragger.d.ts +6 -6
  38. package/lib/Viewer/draggers/OrbitDragger.d.ts +1 -1
  39. package/lib/Viewer/measurement/Snapper.d.ts +3 -3
  40. package/package.json +5 -5
  41. package/src/Viewer/Viewer.ts +50 -37
  42. package/src/Viewer/commands/index.ts +1 -1
  43. package/src/Viewer/components/BackgroundComponent.ts +1 -0
  44. package/src/Viewer/components/CameraComponent.ts +5 -6
  45. package/src/Viewer/{scenes/Helpers.ts → components/ClippingPlaneComponent.ts} +22 -12
  46. package/src/Viewer/components/HighlighterComponent.ts +9 -5
  47. package/src/Viewer/components/InfoComponent.ts +4 -4
  48. package/src/Viewer/components/SectionsComponent.ts +119 -0
  49. package/src/Viewer/components/SelectionComponent.ts +1 -1
  50. package/src/Viewer/components/WCSHelperComponent.ts +8 -6
  51. package/src/Viewer/components/index.ts +4 -0
  52. package/src/Viewer/draggers/CuttingPlaneDragger.ts +57 -34
  53. package/src/Viewer/draggers/MeasureLineDragger.ts +1 -1
  54. package/src/Viewer/draggers/OrbitDragger.ts +3 -3
  55. package/src/Viewer/helpers/SectionsHelper.js +1065 -0
  56. package/src/Viewer/helpers/WCSHelper.ts +24 -0
  57. package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +417 -92
  58. package/src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js +75 -9
  59. package/src/Viewer/loaders/GLTFCloudDynamicLoader.ts +3 -2
  60. package/src/Viewer/loaders/GLTFFileDynamicLoader.ts +4 -2
  61. package/src/Viewer/measurement/Snapper.ts +4 -5
  62. package/src/Viewer/models/ModelImpl.ts +27 -3
  63. package/lib/Viewer/scenes/Helpers.d.ts +0 -7
  64. package/src/Viewer/postprocessing/SSAARenderPass.js +0 -245
@@ -76,12 +76,14 @@ class AxesHelperComponent implements IComponent {
76
76
  this.axesHelper1.position.set(0, 0, 0);
77
77
  this.axesHelper1.scale.setScalar(extentsSize * 1.5);
78
78
  this.viewer.helpers.add(this.axesHelper1);
79
+ this.viewer.update();
79
80
 
80
81
  if (this.viewer.models.length < 1) return;
81
82
 
82
83
  this.axesHelper2.position.copy(extentsCenter);
83
84
  this.axesHelper2.scale.setScalar(extentsSize);
84
85
  this.viewer.helpers.add(this.axesHelper2);
86
+ this.viewer.update();
85
87
 
86
88
  if (this.viewer.models.length < 2) return;
87
89
 
@@ -95,6 +97,7 @@ class AxesHelperComponent implements IComponent {
95
97
 
96
98
  this.modelHelpers.push(helper);
97
99
  this.viewer.helpers.add(helper);
100
+ this.viewer.update();
98
101
  });
99
102
  };
100
103
  }
@@ -74,17 +74,20 @@ class ExtentsHelperComponent implements IComponent {
74
74
 
75
75
  this.boxHelper.box = this.viewer.extents.clone();
76
76
  this.viewer.helpers.add(this.boxHelper);
77
+ this.viewer.update();
77
78
 
78
79
  if (this.viewer.models.length < 2) return;
79
80
 
80
- this.viewer.models.forEach((model) => {
81
+ for (const model of this.viewer.models) {
81
82
  const extents = model.getExtents(new Box3());
83
+ if (extents.isEmpty()) continue;
82
84
 
83
85
  const helper = new Box3Helper(extents, "#ff0000");
84
86
 
85
87
  this.modelHelpers.push(helper);
86
88
  this.viewer.helpers.add(helper);
87
- });
89
+ }
90
+ this.viewer.update();
88
91
  };
89
92
  }
90
93
 
@@ -59,6 +59,7 @@ class GridHelperComponent implements IComponent {
59
59
  this.gridHelper.quaternion.setFromUnitVectors(upY, up);
60
60
 
61
61
  this.viewer.helpers.add(this.gridHelper);
62
+ this.viewer.update();
62
63
  };
63
64
  }
64
65
 
@@ -66,6 +66,7 @@ class LightHelperComponent implements IComponent {
66
66
  if (helper) {
67
67
  this.lightHelpers.push(helper);
68
68
  this.viewer.helpers.add(helper);
69
+ this.viewer.update();
69
70
  }
70
71
  });
71
72
  };
@@ -1,16 +1,15 @@
1
- import { Box3, Object3D, OrthographicCamera, PerspectiveCamera, Scene, Vector3, WebGLRenderer } from "three";
1
+ import { Box3, Group, Object3D, OrthographicCamera, PerspectiveCamera, Plane, Scene, Vector3, WebGLRenderer } from "three";
2
2
  import { EffectComposer } from "three/examples/jsm/postprocessing/EffectComposer.js";
3
3
  import { RenderPass } from "three/examples/jsm/postprocessing/RenderPass.js";
4
4
  import { FXAAPass } from "three/examples/jsm/postprocessing/FXAAPass.js";
5
5
  import { SMAAPass } from "three/examples/jsm/postprocessing/SMAAPass.js";
6
- import { SSAARenderPass } from "./postprocessing/SSAARenderPass.js";
6
+ import { SSAARenderPass } from "three/examples/jsm/postprocessing/SSAARenderPass.js";
7
7
  import { OutputPass } from "three/examples/jsm/postprocessing/OutputPass.js";
8
8
  import { EventEmitter2 } from "@inweb/eventemitter2";
9
9
  import { Assembly, Client, Model, File } from "@inweb/client";
10
10
  import { CanvasEventMap, FileSource, IComponent, IDragger, IInfo, ILoader, IOptions, IViewer, IViewpoint, OptionsEventMap, ViewerEventMap } from "@inweb/viewer-core";
11
11
  import { IMarkup, IWorldTransform } from "@inweb/markup";
12
12
  import { IModelImpl } from "./models/IModelImpl";
13
- import { Helpers } from "./scenes/Helpers";
14
13
  /**
15
14
  * 3D viewer powered by {@link https://threejs.org/ | Three.js}.
16
15
  */
@@ -24,11 +23,10 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
24
23
  info: IInfo;
25
24
  private canvaseventlistener;
26
25
  scene: Scene | undefined;
27
- helpers: Helpers | undefined;
26
+ helpers: Group | undefined;
28
27
  camera: PerspectiveCamera | OrthographicCamera | undefined;
29
28
  renderer: WebGLRenderer | undefined;
30
29
  renderPass: RenderPass | undefined;
31
- helpersPass: RenderPass | undefined;
32
30
  fxaaPass: FXAAPass | undefined;
33
31
  smaaPass: SMAAPass | undefined;
34
32
  ssaaRenderPass: SSAARenderPass | undefined;
@@ -37,9 +35,9 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
37
35
  selected: Object3D[];
38
36
  extents: Box3;
39
37
  target: Vector3;
38
+ clippingPlanes: Plane[];
40
39
  private _activeDragger;
41
40
  private _components;
42
- private _updateDelay;
43
41
  private _renderNeeded;
44
42
  private _renderTime;
45
43
  private _markup;
@@ -61,7 +59,7 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
61
59
  dispose(): this;
62
60
  isInitialized(): boolean;
63
61
  setSize(width: number, height: number, updateStyle?: boolean): void;
64
- update(force?: boolean): void;
62
+ update(force?: boolean | number): void;
65
63
  render(time?: DOMHighResTimeStamp, force?: boolean): void;
66
64
  loadReferences(model: Model | File | Assembly): Promise<this>;
67
65
  /**
@@ -7,6 +7,6 @@ export declare class CameraComponent implements IComponent {
7
7
  getCameraMode(camera: any): CameraMode;
8
8
  switchCamera(camera: any): void;
9
9
  switchCameraMode(mode: CameraMode): void;
10
- optionsChange: () => void;
10
+ syncOptions: () => void;
11
11
  geometryEnd: () => void;
12
12
  }
@@ -0,0 +1,8 @@
1
+ import { IComponent } from "@inweb/viewer-core";
2
+ import type { Viewer } from "../Viewer";
3
+ export declare class ClippingPlaneComponent implements IComponent {
4
+ protected viewer: Viewer;
5
+ constructor(viewer: Viewer);
6
+ dispose(): void;
7
+ applyClippingPlanes: () => void;
8
+ }
@@ -14,7 +14,7 @@ export declare class HighlighterComponent implements IComponent {
14
14
  highlight(objects: Object3D | Object3D[]): void;
15
15
  unhighlight(objects: Object3D | Object3D[]): void;
16
16
  geometryEnd: () => void;
17
- optionsChange: () => void;
17
+ syncOptions: () => void;
18
18
  syncHighlightColors(): void;
19
- viewerResize(event: ResizeEvent): void;
19
+ viewerResize: (event: ResizeEvent) => void;
20
20
  }
@@ -10,7 +10,7 @@ export declare class InfoComponent implements IComponent {
10
10
  dispose(): void;
11
11
  initialize: () => void;
12
12
  clear: () => void;
13
- optionsChange: ({ data: options }: {
13
+ syncOptions: ({ data: options }: {
14
14
  data: any;
15
15
  }) => void;
16
16
  geometryStart: () => void;
@@ -0,0 +1,15 @@
1
+ import { IComponent, ResizeEvent } from "@inweb/viewer-core";
2
+ import type { Viewer } from "../Viewer";
3
+ export declare class SectionsComponent implements IComponent {
4
+ private viewer;
5
+ private sectionsHelper;
6
+ private updateTimerId;
7
+ private updateDelay;
8
+ constructor(viewer: Viewer);
9
+ dispose(): void;
10
+ syncOptions: () => void;
11
+ syncHelper: () => void;
12
+ syncSections: () => void;
13
+ viewerResize: (event: ResizeEvent) => void;
14
+ updateSections: () => void;
15
+ }
@@ -1,11 +1,11 @@
1
1
  import { IComponent } from "@inweb/viewer-core";
2
2
  import type { Viewer } from "../Viewer";
3
3
  export declare class WCSHelperComponent implements IComponent {
4
- private wcsHelper;
5
4
  private viewer;
5
+ private wcsHelper;
6
6
  constructor(viewer: Viewer);
7
7
  dispose(): void;
8
- geometryEnd: () => void;
8
+ syncHelper: () => void;
9
9
  viewerRender: () => void;
10
10
  updateHelperCamera: () => void;
11
11
  }
@@ -1,13 +1,12 @@
1
- import { Plane, Quaternion, Vector2, Vector3 } from "three";
1
+ import { Quaternion, Vector2, Vector3 } from "three";
2
2
  import { TransformControls } from "three/examples/jsm/controls/TransformControls.js";
3
3
  import type { Viewer } from "../Viewer";
4
4
  import { PlaneHelper2 } from "../helpers/PlaneHelper2";
5
5
  import { Snapper } from "../measurement/Snapper";
6
6
  import { OrbitDragger } from "./OrbitDragger";
7
7
  export declare class CuttingPlaneDragger extends OrbitDragger {
8
- protected clippingPlanes: Plane[];
9
8
  protected helpers: PlaneHelper2[];
10
- protected activeHelper: PlaneHelper2;
9
+ protected activeHelper: PlaneHelper2 | undefined;
11
10
  protected snapper: Snapper;
12
11
  protected downPosition: Vector2;
13
12
  protected position0: Vector3;
@@ -16,18 +15,19 @@ export declare class CuttingPlaneDragger extends OrbitDragger {
16
15
  protected rotate: TransformControls;
17
16
  constructor(viewer: Viewer);
18
17
  dispose(): void;
18
+ transformUpdate: () => void;
19
19
  transformChange: () => void;
20
20
  translateDrag: (event: any) => void;
21
21
  rotateDrag: (event: any) => void;
22
- updatePlaneSize: () => void;
23
- updateTransformCamera: () => void;
22
+ syncHelpers: () => void;
24
23
  clearHelpers: () => void;
24
+ updateTransformCamera: () => void;
25
25
  onKeyDown: (event: KeyboardEvent) => void;
26
26
  onKeyUp: (event: KeyboardEvent) => void;
27
27
  onPointerDown: (event: PointerEvent) => void;
28
28
  onPointerUp: (event: PointerEvent) => void;
29
29
  onPointerCancel: (event: PointerEvent) => void;
30
- onDoubleClick: (event: PointerEvent) => void;
30
+ onDoubleClick: (event: MouseEvent) => void;
31
31
  private addHelper;
32
32
  private setActiveHelper;
33
33
  private saveState;
@@ -9,7 +9,7 @@ export declare class OrbitDragger implements IDragger {
9
9
  dispose(): void;
10
10
  updateControls: () => void;
11
11
  updateControlsCamera: () => void;
12
- optionsChange: ({ data: options }: {
12
+ updateZoomSpeed: ({ data: options }: {
13
13
  data: any;
14
14
  }) => void;
15
15
  controlsStart: () => void;
@@ -1,13 +1,13 @@
1
- import { Camera, Intersection, Object3D, Vector2, Vector3, WebGLRenderer } from "three";
1
+ import { Camera, Intersection, Object3D, Plane, Vector2, Vector3 } from "three";
2
2
  export declare class Snapper {
3
3
  camera: Camera;
4
- renderer: WebGLRenderer;
4
+ clippingPlanes: Plane[];
5
5
  canvas: HTMLCanvasElement;
6
6
  threshold: number;
7
7
  private raycaster;
8
8
  private detectRadiusInPixels;
9
9
  private edgesCache;
10
- constructor(camera: Camera, renderer: WebGLRenderer, canvas: HTMLCanvasElement);
10
+ constructor(camera: Camera, clippingPlanes: Plane[], canvas: HTMLCanvasElement);
11
11
  isMobile(): boolean;
12
12
  getMousePosition(event: MouseEvent, target: Vector2): Vector2;
13
13
  getPointerIntersects(mouse: Vector2, objects: Object3D[], recursive?: boolean, clip?: boolean): Array<Intersection<Object3D>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inweb/viewer-three",
3
- "version": "27.4.6",
3
+ "version": "27.5.0",
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",
@@ -35,10 +35,10 @@
35
35
  "docs": "typedoc"
36
36
  },
37
37
  "dependencies": {
38
- "@inweb/client": "~27.4.6",
39
- "@inweb/eventemitter2": "~27.4.6",
40
- "@inweb/markup": "~27.4.6",
41
- "@inweb/viewer-core": "~27.4.6"
38
+ "@inweb/client": "~27.5.0",
39
+ "@inweb/eventemitter2": "~27.5.0",
40
+ "@inweb/markup": "~27.5.0",
41
+ "@inweb/viewer-core": "~27.5.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@streamparser/json": "^0.0.22",
@@ -23,6 +23,7 @@
23
23
 
24
24
  import {
25
25
  Box3,
26
+ Group,
26
27
  LinearSRGBColorSpace,
27
28
  // LinearToneMapping,
28
29
  Object3D,
@@ -34,12 +35,13 @@ import {
34
35
  Vector2,
35
36
  Vector3,
36
37
  WebGLRenderer,
38
+ WebGLRenderTarget,
37
39
  } from "three";
38
40
  import { EffectComposer } from "three/examples/jsm/postprocessing/EffectComposer.js";
39
41
  import { RenderPass } from "three/examples/jsm/postprocessing/RenderPass.js";
40
42
  import { FXAAPass } from "three/examples/jsm/postprocessing/FXAAPass.js";
41
43
  import { SMAAPass } from "three/examples/jsm/postprocessing/SMAAPass.js";
42
- import { SSAARenderPass } from "./postprocessing/SSAARenderPass.js";
44
+ import { SSAARenderPass } from "three/examples/jsm/postprocessing/SSAARenderPass.js";
43
45
  import { OutputPass } from "three/examples/jsm/postprocessing/OutputPass.js";
44
46
 
45
47
  import { EventEmitter2 } from "@inweb/eventemitter2";
@@ -72,7 +74,6 @@ import { commands } from "./commands";
72
74
  import { components } from "./components";
73
75
  import { loaders } from "./loaders";
74
76
  import { IModelImpl } from "./models/IModelImpl";
75
- import { Helpers } from "./scenes/Helpers";
76
77
 
77
78
  /**
78
79
  * 3D viewer powered by {@link https://threejs.org/ | Three.js}.
@@ -92,11 +93,10 @@ export class Viewer
92
93
  private canvaseventlistener: (event: any) => void;
93
94
 
94
95
  public scene: Scene | undefined;
95
- public helpers: Helpers | undefined;
96
+ public helpers: Group | undefined;
96
97
  public camera: PerspectiveCamera | OrthographicCamera | undefined;
97
98
  public renderer: WebGLRenderer | undefined;
98
99
  public renderPass: RenderPass | undefined;
99
- public helpersPass: RenderPass | undefined;
100
100
  public fxaaPass: FXAAPass | undefined;
101
101
  public smaaPass: SMAAPass | undefined;
102
102
  public ssaaRenderPass: SSAARenderPass | undefined;
@@ -105,11 +105,11 @@ export class Viewer
105
105
  public selected: Object3D[];
106
106
  public extents: Box3;
107
107
  public target: Vector3;
108
+ public clippingPlanes: Plane[];
108
109
 
109
110
  private _activeDragger: IDragger | null;
110
111
  private _components: IComponent[];
111
112
 
112
- private _updateDelay: number;
113
113
  private _renderNeeded: boolean;
114
114
  private _renderTime: DOMHighResTimeStamp;
115
115
 
@@ -134,11 +134,11 @@ export class Viewer
134
134
  this.selected = [];
135
135
  this.extents = new Box3();
136
136
  this.target = new Vector3(0, 0, 0);
137
+ this.clippingPlanes = [];
137
138
 
138
139
  this._activeDragger = null;
139
140
  this._components = [];
140
141
 
141
- this._updateDelay = 1000;
142
142
  this._renderNeeded = false;
143
143
  this._renderTime = 0;
144
144
 
@@ -171,7 +171,10 @@ export class Viewer
171
171
  this.addEventListener("optionschange", (event) => this.syncOptions(event.data));
172
172
 
173
173
  this.scene = new Scene();
174
- this.helpers = new Helpers();
174
+
175
+ this.helpers = new Group();
176
+ this.helpers.name = "Helpers";
177
+ this.scene.add(this.helpers);
175
178
 
176
179
  const pixelRatio = window.devicePixelRatio;
177
180
  const rect = canvas.parentElement.getBoundingClientRect();
@@ -191,25 +194,26 @@ export class Viewer
191
194
  alpha: true,
192
195
  preserveDrawingBuffer: true,
193
196
  powerPreference: "high-performance",
194
- logarithmicDepthBuffer: true,
197
+ logarithmicDepthBuffer: true, // <- required for sections filling
195
198
  });
196
199
  this.renderer.setPixelRatio(pixelRatio);
197
200
  this.renderer.setSize(width, height);
198
201
  this.renderer.outputColorSpace = LinearSRGBColorSpace;
199
202
  // this.renderer.toneMapping = LinearToneMapping;
203
+ this.renderer.localClippingEnabled = true;
200
204
 
201
205
  this.renderPass = new RenderPass(this.scene, this.camera);
202
- this.helpersPass = new RenderPass(this.helpers, this.camera);
203
- this.helpersPass.clear = false;
204
206
  this.fxaaPass = new FXAAPass();
205
207
  this.smaaPass = new SMAAPass();
206
- this.ssaaRenderPass = new SSAARenderPass([this.scene, this.helpers], this.camera);
208
+ this.ssaaRenderPass = new SSAARenderPass(this.scene, this.camera);
207
209
  this.ssaaRenderPass.unbiased = true;
208
210
  this.outputPass = new OutputPass();
209
211
 
210
- this.composer = new EffectComposer(this.renderer);
212
+ const renderTarget = new WebGLRenderTarget(1, 1, { samples: 4 });
213
+ renderTarget.texture.name = "EffectComposer.rt1";
214
+
215
+ this.composer = new EffectComposer(this.renderer, renderTarget);
211
216
  this.composer.addPass(this.renderPass);
212
- this.composer.addPass(this.helpersPass);
213
217
  this.composer.addPass(this.smaaPass);
214
218
  this.composer.addPass(this.fxaaPass);
215
219
  this.composer.addPass(this.ssaaRenderPass);
@@ -252,9 +256,12 @@ export class Viewer
252
256
  this.setActiveDragger();
253
257
 
254
258
  this._components.forEach((component: IComponent) => component.dispose());
255
- this._components = [];
259
+ this._components.length = 0;
256
260
 
257
- this._markup.dispose();
261
+ if (this._markup) {
262
+ this._markup.dispose();
263
+ this._markup = undefined;
264
+ }
258
265
 
259
266
  if (this.canvas) {
260
267
  this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));
@@ -263,7 +270,6 @@ export class Viewer
263
270
 
264
271
  if (this.composer) this.composer.dispose();
265
272
  if (this.renderPass) this.renderPass.dispose();
266
- if (this.helpersPass) this.helpersPass.dispose();
267
273
  if (this.fxaaPass) this.fxaaPass.dispose();
268
274
  if (this.smaaPass) this.smaaPass.dispose();
269
275
  if (this.ssaaRenderPass) this.ssaaRenderPass.dispose();
@@ -275,7 +281,6 @@ export class Viewer
275
281
  this.camera = undefined;
276
282
  this.renderer = undefined;
277
283
  this.renderPass = undefined;
278
- this.helpersPass = undefined;
279
284
  this.fxaaPass = undefined;
280
285
  this.smaaPass = undefined;
281
286
  this.ssaaRenderPass = undefined;
@@ -312,14 +317,14 @@ export class Viewer
312
317
  this.update(true);
313
318
  }
314
319
 
315
- update(force = false): void {
320
+ update(force: boolean | number = false): void {
316
321
  const time = performance.now();
317
- force = force || time - this._renderTime >= this._updateDelay;
322
+ if (typeof force === "number" && time - this._renderTime >= force) force = true;
318
323
 
319
324
  this._renderNeeded = true;
320
325
  if (force) this.render(time);
321
326
 
322
- this.emitEvent({ type: "update", force });
327
+ this.emitEvent({ type: "update", force: !!force });
323
328
  }
324
329
 
325
330
  // Internal render routines
@@ -337,12 +342,7 @@ export class Viewer
337
342
  this.renderer.info.autoReset = false;
338
343
  this.renderer.info.reset();
339
344
 
340
- if (this.options.antialiasing === true || this.options.antialiasing === "msaa") {
341
- this.renderer.render(this.scene, this.camera);
342
- this.renderer.render(this.helpers, this.camera);
343
- } else {
344
- this.composer.render(deltaTime);
345
- }
345
+ this.composer.render(deltaTime);
346
346
 
347
347
  this.emitEvent({ type: "render", time, deltaTime });
348
348
  }
@@ -495,14 +495,16 @@ export class Viewer
495
495
  this.clearSelected();
496
496
 
497
497
  this.loaders.forEach((loader) => loader.dispose());
498
- this.loaders = [];
498
+ this.loaders.length = 0;
499
499
 
500
500
  this.models.forEach((model) => model.dispose());
501
- this.models = [];
501
+ this.models.length = 0;
502
502
 
503
- this.scene.clear();
504
503
  this.helpers.clear();
505
504
 
505
+ this.scene.clear();
506
+ this.scene.add(this.helpers);
507
+
506
508
  this.extents.makeEmpty();
507
509
 
508
510
  this.syncOptions();
@@ -524,9 +526,19 @@ export class Viewer
524
526
  this.fxaaPass.enabled = options.antialiasing === "fxaa";
525
527
  this.smaaPass.enabled = options.antialiasing === "smaa";
526
528
  this.ssaaRenderPass.enabled = options.antialiasing === "ssaa";
529
+ this.renderPass.enabled = options.antialiasing !== "ssaa";
530
+
531
+ const samples = options.antialiasing === true || options.antialiasing === "msaa" ? 4 : 0;
532
+
533
+ if (this.composer.renderTarget1.samples !== samples) {
534
+ const size = this.renderer.getSize(new Vector2());
535
+
536
+ const newRenderTarget = new WebGLRenderTarget(1, 1, { samples });
537
+ newRenderTarget.texture.name = "EffectComposer.rt1";
527
538
 
528
- this.renderPass.enabled = !this.ssaaRenderPass.enabled;
529
- this.helpersPass.enabled = !this.ssaaRenderPass.enabled;
539
+ this.composer.reset(newRenderTarget);
540
+ this.composer.setSize(size.x, size.y);
541
+ }
530
542
 
531
543
  this.update();
532
544
  }
@@ -550,8 +562,9 @@ export class Viewer
550
562
  clearSlices(): void {
551
563
  if (!this.renderer) return;
552
564
 
553
- this.renderer.clippingPlanes = [];
565
+ this.clippingPlanes.length = 0;
554
566
 
567
+ this.emitEvent({ type: "changecuttingplanes" });
555
568
  this.emitEvent({ type: "clearslices" });
556
569
  this.update();
557
570
  }
@@ -666,7 +679,6 @@ export class Viewer
666
679
 
667
680
  this.camera = camera;
668
681
  this.renderPass.camera = camera;
669
- this.helpersPass.camera = camera;
670
682
  this.ssaaRenderPass.camera = camera;
671
683
 
672
684
  this.options.cameraMode = "orthographic";
@@ -694,7 +706,6 @@ export class Viewer
694
706
 
695
707
  this.camera = camera;
696
708
  this.renderPass.camera = camera;
697
- this.helpersPass.camera = camera;
698
709
  this.ssaaRenderPass.camera = camera;
699
710
 
700
711
  this.options.cameraMode = "perspective";
@@ -711,8 +722,10 @@ export class Viewer
711
722
  getVector3FromPoint3d(clipping_plane.location)
712
723
  );
713
724
 
714
- this.renderer.clippingPlanes.push(plane);
725
+ this.clippingPlanes.push(plane);
715
726
  });
727
+
728
+ this.emitEvent({ type: "changecuttingplanes" });
716
729
  }
717
730
  };
718
731
 
@@ -725,8 +738,8 @@ export class Viewer
725
738
  this.setActiveDragger();
726
739
  this.clearSlices();
727
740
  this.clearOverlay();
728
-
729
741
  this.clearSelected();
742
+
730
743
  this.showAll();
731
744
  this.explode();
732
745
 
@@ -777,7 +790,7 @@ export class Viewer
777
790
 
778
791
  const getClippingPlanes = (): IClippingPlane[] => {
779
792
  const clipping_planes = [];
780
- this.renderer.clippingPlanes.forEach((plane: Plane) => {
793
+ this.clippingPlanes.forEach((plane: Plane) => {
781
794
  const clipping_plane = {
782
795
  location: getPoint3dFromVector3(plane.coplanarPoint(new Vector3())),
783
796
  direction: getPoint3dFromVector3(plane.normal),
@@ -110,8 +110,8 @@ commands.registerCommand("left", (viewer) => setDefaultViewPosition(viewer, "lef
110
110
  commands.registerCommand("right", (viewer) => setDefaultViewPosition(viewer, "right"));
111
111
  commands.registerCommand("front", (viewer) => setDefaultViewPosition(viewer, "front"));
112
112
  commands.registerCommand("back", (viewer) => setDefaultViewPosition(viewer, "back"));
113
- commands.registerCommand("sw", (viewer) => setDefaultViewPosition(viewer, "sw"));
114
113
  commands.registerCommand("se", (viewer) => setDefaultViewPosition(viewer, "se"));
114
+ commands.registerCommand("sw", (viewer) => setDefaultViewPosition(viewer, "sw"));
115
115
  commands.registerCommand("ne", (viewer) => setDefaultViewPosition(viewer, "ne"));
116
116
  commands.registerCommand("nw", (viewer) => setDefaultViewPosition(viewer, "nw"));
117
117
 
@@ -48,5 +48,6 @@ export class BackgroundComponent implements IComponent {
48
48
  syncOptions = () => {
49
49
  this.backgroundColor.setHex(0xffffff);
50
50
  this.viewer.renderer.setClearColor(this.backgroundColor);
51
+ this.viewer.update();
51
52
  };
52
53
  }
@@ -32,14 +32,14 @@ export class CameraComponent implements IComponent {
32
32
  constructor(viewer: Viewer) {
33
33
  this.viewer = viewer;
34
34
  this.viewer.addEventListener("databasechunk", this.geometryEnd);
35
- this.viewer.addEventListener("optionschange", this.optionsChange);
36
- this.viewer.addEventListener("initialize", this.optionsChange);
35
+ this.viewer.addEventListener("optionschange", this.syncOptions);
36
+ this.viewer.addEventListener("initialize", this.syncOptions);
37
37
  }
38
38
 
39
39
  dispose() {
40
40
  this.viewer.removeEventListener("databasechunk", this.geometryEnd);
41
- this.viewer.removeEventListener("optionschange", this.optionsChange);
42
- this.viewer.removeEventListener("initialize", this.optionsChange);
41
+ this.viewer.removeEventListener("optionschange", this.syncOptions);
42
+ this.viewer.removeEventListener("initialize", this.syncOptions);
43
43
  }
44
44
 
45
45
  getCameraMode(camera: any): CameraMode {
@@ -67,7 +67,6 @@ export class CameraComponent implements IComponent {
67
67
 
68
68
  this.viewer.camera = camera;
69
69
  this.viewer.renderPass.camera = camera;
70
- this.viewer.helpersPass.camera = camera;
71
70
  this.viewer.ssaaRenderPass.camera = camera;
72
71
 
73
72
  this.viewer.update();
@@ -114,7 +113,7 @@ export class CameraComponent implements IComponent {
114
113
  this.viewer.emitEvent({ type: "changecameramode", mode });
115
114
  }
116
115
 
117
- optionsChange = () => {
116
+ syncOptions = () => {
118
117
  this.switchCameraMode(this.viewer.options.cameraMode);
119
118
  };
120
119
 
@@ -21,22 +21,32 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
- import { Scene, WebGLRenderer } from "three";
24
+ import { IComponent } from "@inweb/viewer-core";
25
+ import type { Viewer } from "../Viewer";
25
26
 
26
- export class Helpers extends Scene {
27
- private oldAutoClear = false;
28
- private oldClippingPlanes = [];
27
+ export class ClippingPlaneComponent implements IComponent {
28
+ protected viewer: Viewer;
29
29
 
30
- override onBeforeRender(renderer: WebGLRenderer): void {
31
- this.oldAutoClear = renderer.autoClear;
32
- this.oldClippingPlanes = renderer.clippingPlanes;
30
+ constructor(viewer: Viewer) {
31
+ this.viewer = viewer;
33
32
 
34
- renderer.autoClear = false;
35
- renderer.clippingPlanes = [];
33
+ this.viewer.addEventListener("geometryend", this.applyClippingPlanes);
34
+ this.viewer.addEventListener("changecuttingplanes", this.applyClippingPlanes);
36
35
  }
37
36
 
38
- override onAfterRender(renderer: WebGLRenderer): void {
39
- renderer.clippingPlanes = this.oldClippingPlanes;
40
- renderer.autoClear = this.oldAutoClear;
37
+ dispose() {
38
+ this.viewer.removeEventListener("geometryend", this.applyClippingPlanes);
39
+ this.viewer.removeEventListener("changecuttingplanes", this.applyClippingPlanes);
41
40
  }
41
+
42
+ applyClippingPlanes = () => {
43
+ this.viewer.models.forEach((model) => {
44
+ model.scene.traverse((object: any) => {
45
+ if (object.material) {
46
+ const materials = Array.isArray(object.material) ? object.material : [object.material];
47
+ materials.forEach((material) => (material.clippingPlanes = this.viewer.clippingPlanes));
48
+ }
49
+ });
50
+ });
51
+ };
42
52
  }