@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.
- package/dist/extensions/components/AxesHelperComponent.js +3 -0
- package/dist/extensions/components/AxesHelperComponent.js.map +1 -1
- package/dist/extensions/components/AxesHelperComponent.min.js +1 -1
- package/dist/extensions/components/AxesHelperComponent.module.js +3 -0
- package/dist/extensions/components/AxesHelperComponent.module.js.map +1 -1
- package/dist/extensions/components/ExtentsHelperComponent.js +6 -2
- package/dist/extensions/components/ExtentsHelperComponent.js.map +1 -1
- package/dist/extensions/components/ExtentsHelperComponent.min.js +1 -1
- package/dist/extensions/components/ExtentsHelperComponent.module.js +6 -2
- package/dist/extensions/components/ExtentsHelperComponent.module.js.map +1 -1
- package/dist/extensions/components/GridHelperComponent.js +1 -0
- package/dist/extensions/components/GridHelperComponent.js.map +1 -1
- package/dist/extensions/components/GridHelperComponent.min.js +1 -1
- package/dist/extensions/components/GridHelperComponent.module.js +1 -0
- package/dist/extensions/components/GridHelperComponent.module.js.map +1 -1
- package/dist/extensions/components/LightHelperComponent.js +1 -0
- package/dist/extensions/components/LightHelperComponent.js.map +1 -1
- package/dist/extensions/components/LightHelperComponent.min.js +1 -1
- package/dist/extensions/components/LightHelperComponent.module.js +1 -0
- package/dist/extensions/components/LightHelperComponent.module.js.map +1 -1
- package/dist/viewer-three.js +1765 -438
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +4 -4
- package/dist/viewer-three.module.js +1302 -403
- package/dist/viewer-three.module.js.map +1 -1
- package/extensions/components/AxesHelperComponent.ts +3 -0
- package/extensions/components/ExtentsHelperComponent.ts +5 -2
- package/extensions/components/GridHelperComponent.ts +1 -0
- package/extensions/components/LightHelperComponent.ts +1 -0
- package/lib/Viewer/Viewer.d.ts +5 -7
- package/lib/Viewer/components/CameraComponent.d.ts +1 -1
- package/lib/Viewer/components/ClippingPlaneComponent.d.ts +8 -0
- package/lib/Viewer/components/HighlighterComponent.d.ts +2 -2
- package/lib/Viewer/components/InfoComponent.d.ts +1 -1
- package/lib/Viewer/components/SectionsComponent.d.ts +15 -0
- package/lib/Viewer/components/WCSHelperComponent.d.ts +2 -2
- package/lib/Viewer/draggers/CuttingPlaneDragger.d.ts +6 -6
- package/lib/Viewer/draggers/OrbitDragger.d.ts +1 -1
- package/lib/Viewer/measurement/Snapper.d.ts +3 -3
- package/package.json +5 -5
- package/src/Viewer/Viewer.ts +50 -37
- package/src/Viewer/commands/index.ts +1 -1
- package/src/Viewer/components/BackgroundComponent.ts +1 -0
- package/src/Viewer/components/CameraComponent.ts +5 -6
- package/src/Viewer/{scenes/Helpers.ts → components/ClippingPlaneComponent.ts} +22 -12
- package/src/Viewer/components/HighlighterComponent.ts +9 -5
- package/src/Viewer/components/InfoComponent.ts +4 -4
- package/src/Viewer/components/SectionsComponent.ts +119 -0
- package/src/Viewer/components/SelectionComponent.ts +1 -1
- package/src/Viewer/components/WCSHelperComponent.ts +8 -6
- package/src/Viewer/components/index.ts +4 -0
- package/src/Viewer/draggers/CuttingPlaneDragger.ts +57 -34
- package/src/Viewer/draggers/MeasureLineDragger.ts +1 -1
- package/src/Viewer/draggers/OrbitDragger.ts +3 -3
- package/src/Viewer/helpers/SectionsHelper.js +1065 -0
- package/src/Viewer/helpers/WCSHelper.ts +24 -0
- package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +417 -92
- package/src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js +75 -9
- package/src/Viewer/loaders/GLTFCloudDynamicLoader.ts +3 -2
- package/src/Viewer/loaders/GLTFFileDynamicLoader.ts +4 -2
- package/src/Viewer/measurement/Snapper.ts +4 -5
- package/src/Viewer/models/ModelImpl.ts +27 -3
- package/lib/Viewer/scenes/Helpers.d.ts +0 -7
- 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
|
|
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
|
|
package/lib/Viewer/Viewer.d.ts
CHANGED
|
@@ -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 "
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
17
|
+
syncOptions: () => void;
|
|
18
18
|
syncHighlightColors(): void;
|
|
19
|
-
viewerResize(event: ResizeEvent)
|
|
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
|
-
|
|
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
|
-
|
|
8
|
+
syncHelper: () => void;
|
|
9
9
|
viewerRender: () => void;
|
|
10
10
|
updateHelperCamera: () => void;
|
|
11
11
|
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
1
|
+
import { Camera, Intersection, Object3D, Plane, Vector2, Vector3 } from "three";
|
|
2
2
|
export declare class Snapper {
|
|
3
3
|
camera: Camera;
|
|
4
|
-
|
|
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,
|
|
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.
|
|
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.
|
|
39
|
-
"@inweb/eventemitter2": "~27.
|
|
40
|
-
"@inweb/markup": "~27.
|
|
41
|
-
"@inweb/viewer-core": "~27.
|
|
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",
|
package/src/Viewer/Viewer.ts
CHANGED
|
@@ -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 "
|
|
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:
|
|
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
|
-
|
|
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(
|
|
208
|
+
this.ssaaRenderPass = new SSAARenderPass(this.scene, this.camera);
|
|
207
209
|
this.ssaaRenderPass.unbiased = true;
|
|
208
210
|
this.outputPass = new OutputPass();
|
|
209
211
|
|
|
210
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
529
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
|
@@ -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.
|
|
36
|
-
this.viewer.addEventListener("initialize", this.
|
|
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.
|
|
42
|
-
this.viewer.removeEventListener("initialize", this.
|
|
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
|
-
|
|
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 {
|
|
24
|
+
import { IComponent } from "@inweb/viewer-core";
|
|
25
|
+
import type { Viewer } from "../Viewer";
|
|
25
26
|
|
|
26
|
-
export class
|
|
27
|
-
|
|
28
|
-
private oldClippingPlanes = [];
|
|
27
|
+
export class ClippingPlaneComponent implements IComponent {
|
|
28
|
+
protected viewer: Viewer;
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
this.
|
|
32
|
-
this.oldClippingPlanes = renderer.clippingPlanes;
|
|
30
|
+
constructor(viewer: Viewer) {
|
|
31
|
+
this.viewer = viewer;
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
this.viewer.addEventListener("geometryend", this.applyClippingPlanes);
|
|
34
|
+
this.viewer.addEventListener("changecuttingplanes", this.applyClippingPlanes);
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
}
|