@inweb/viewer-three 27.2.2 → 27.2.3
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/viewer-three.js +622 -317
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +3 -3
- package/dist/viewer-three.module.js +624 -319
- package/dist/viewer-three.module.js.map +1 -1
- package/lib/Viewer/draggers/CuttingPlaneDragger.d.ts +23 -5
- package/lib/Viewer/helpers/PlaneHelper2.d.ts +8 -4
- package/lib/Viewer/measurement/Snapper.d.ts +1 -1
- package/package.json +5 -5
- package/src/Viewer/components/SelectionComponent.ts +1 -1
- package/src/Viewer/controls/WalkControls.ts +10 -2
- package/src/Viewer/draggers/CuttingPlaneDragger.ts +191 -31
- package/src/Viewer/draggers/CuttingPlaneXAxis.ts +2 -3
- package/src/Viewer/draggers/CuttingPlaneYAxis.ts +2 -3
- package/src/Viewer/draggers/CuttingPlaneZAxis.ts +2 -3
- package/src/Viewer/draggers/index.ts +2 -0
- package/src/Viewer/helpers/PlaneHelper2.ts +30 -17
- package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +413 -189
- package/src/Viewer/measurement/Snapper.ts +13 -5
|
@@ -1,22 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Plane, 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
|
+
import { Snapper } from "../measurement/Snapper";
|
|
5
6
|
import { OrbitDragger } from "./OrbitDragger";
|
|
6
7
|
export declare class CuttingPlaneDragger extends OrbitDragger {
|
|
7
|
-
protected
|
|
8
|
-
protected
|
|
9
|
-
protected
|
|
8
|
+
protected clippingPlanes: Plane[];
|
|
9
|
+
protected helpers: PlaneHelper2[];
|
|
10
|
+
protected activeHelper: PlaneHelper2;
|
|
11
|
+
protected snapper: Snapper;
|
|
12
|
+
protected downPosition: Vector2;
|
|
13
|
+
protected position0: Vector3;
|
|
14
|
+
protected quaternion0: Quaternion;
|
|
10
15
|
protected translate: TransformControls;
|
|
11
16
|
protected rotate: TransformControls;
|
|
12
|
-
constructor(viewer: Viewer
|
|
17
|
+
constructor(viewer: Viewer);
|
|
13
18
|
dispose(): void;
|
|
14
19
|
transformChange: () => void;
|
|
15
20
|
translateDrag: (event: any) => void;
|
|
16
21
|
rotateDrag: (event: any) => void;
|
|
17
22
|
updatePlaneSize: () => void;
|
|
18
23
|
updateTransformCamera: () => void;
|
|
24
|
+
clearHelpers: () => void;
|
|
19
25
|
onKeyDown: (event: KeyboardEvent) => void;
|
|
20
26
|
onKeyUp: (event: KeyboardEvent) => void;
|
|
27
|
+
onPointerDown: (event: PointerEvent) => void;
|
|
28
|
+
onPointerUp: (event: PointerEvent) => void;
|
|
29
|
+
onPointerCancel: (event: PointerEvent) => void;
|
|
21
30
|
onDoubleClick: (event: PointerEvent) => void;
|
|
31
|
+
private addHelper;
|
|
32
|
+
private setActiveHelper;
|
|
33
|
+
private saveState;
|
|
34
|
+
private reset;
|
|
35
|
+
addPlane(normal: Vector3): void;
|
|
36
|
+
addPlaneX(): void;
|
|
37
|
+
addPlaneY(): void;
|
|
38
|
+
addPlaneZ(): void;
|
|
39
|
+
deleteActivePlane(): void;
|
|
22
40
|
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { Line, Mesh } from "three";
|
|
2
|
-
export declare class PlaneHelper2 extends
|
|
1
|
+
import { Line, LineBasicMaterial, Mesh, MeshBasicMaterial, Object3D, Plane } from "three";
|
|
2
|
+
export declare class PlaneHelper2 extends Object3D {
|
|
3
|
+
plane: Plane;
|
|
3
4
|
size: number;
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
outline: Line;
|
|
6
|
+
mesh: Mesh;
|
|
7
|
+
constructor(size?: number, color?: number, opacity?: number);
|
|
6
8
|
dispose(): void;
|
|
7
9
|
updateMatrixWorld(force: boolean): void;
|
|
10
|
+
getLineMaterial(): LineBasicMaterial;
|
|
11
|
+
getMeshMaterial(): MeshBasicMaterial;
|
|
8
12
|
}
|
|
@@ -10,7 +10,7 @@ export declare class Snapper {
|
|
|
10
10
|
constructor(camera: Camera, renderer: WebGLRenderer, canvas: HTMLCanvasElement);
|
|
11
11
|
isMobile(): boolean;
|
|
12
12
|
getMousePosition(event: MouseEvent, target: Vector2): Vector2;
|
|
13
|
-
getPointerIntersects(mouse: Vector2, objects: Object3D[]): Array<Intersection<Object3D>>;
|
|
13
|
+
getPointerIntersects(mouse: Vector2, objects: Object3D[], recursive?: boolean, clip?: boolean): Array<Intersection<Object3D>>;
|
|
14
14
|
getDetectRadius(point: Vector3): number;
|
|
15
15
|
getSnapPoint(mouse: Vector2, objects: Object3D[]): Vector3;
|
|
16
16
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inweb/viewer-three",
|
|
3
|
-
"version": "27.2.
|
|
3
|
+
"version": "27.2.3",
|
|
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.2.
|
|
39
|
-
"@inweb/eventemitter2": "~27.2.
|
|
40
|
-
"@inweb/markup": "~27.2.
|
|
41
|
-
"@inweb/viewer-core": "~27.2.
|
|
38
|
+
"@inweb/client": "~27.2.3",
|
|
39
|
+
"@inweb/eventemitter2": "~27.2.3",
|
|
40
|
+
"@inweb/markup": "~27.2.3",
|
|
41
|
+
"@inweb/viewer-core": "~27.2.3"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@streamparser/json": "^0.0.22",
|
|
@@ -58,7 +58,7 @@ export class SelectionComponent implements IComponent {
|
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
onPointerUp = (event: PointerEvent) => {
|
|
61
|
-
if (!event.isPrimary) return;
|
|
61
|
+
if (!event.isPrimary || event.button !== 0) return;
|
|
62
62
|
|
|
63
63
|
const upPosition = this.getMousePosition(event, new Vector2());
|
|
64
64
|
if (upPosition.distanceTo(this.downPosition) !== 0) return;
|
|
@@ -42,7 +42,7 @@ export class WalkControls extends Controls<WalkControlsEventMap> {
|
|
|
42
42
|
private groundFollowingSkippedFrames = 0;
|
|
43
43
|
|
|
44
44
|
readonly GROUND_BOX_HALF_SIZE = 20;
|
|
45
|
-
readonly GROUND_BOX_REFRESH_THRESHOLD = 0.3;
|
|
45
|
+
readonly GROUND_BOX_REFRESH_THRESHOLD = 0.3;
|
|
46
46
|
|
|
47
47
|
private raycaster: Raycaster;
|
|
48
48
|
private groundObjects: Object3D[];
|
|
@@ -74,6 +74,9 @@ export class WalkControls extends Controls<WalkControlsEventMap> {
|
|
|
74
74
|
for (const obj of groundObjects) {
|
|
75
75
|
this._groundObjectBoxes.set(obj, new Box3().setFromObject(obj));
|
|
76
76
|
}
|
|
77
|
+
const pos = this.object.position;
|
|
78
|
+
this._rebuildGroundBox(pos);
|
|
79
|
+
|
|
77
80
|
this.raycaster = new Raycaster();
|
|
78
81
|
this.raycaster.near = 0;
|
|
79
82
|
this.raycaster.far = this.EYE_HEIGHT + this.FAILING_DISTANCE;
|
|
@@ -185,7 +188,12 @@ export class WalkControls extends Controls<WalkControlsEventMap> {
|
|
|
185
188
|
};
|
|
186
189
|
|
|
187
190
|
onKeyUp = (event: KeyboardEvent) => {
|
|
188
|
-
if (this.moveKeys.delete(event.code))
|
|
191
|
+
if (this.moveKeys.delete(event.code)) {
|
|
192
|
+
if (this.moveKeys.size === 0) {
|
|
193
|
+
this._rebuildGroundBox(this.object.position);
|
|
194
|
+
}
|
|
195
|
+
this.update();
|
|
196
|
+
}
|
|
189
197
|
};
|
|
190
198
|
|
|
191
199
|
private _rebuildGroundBox(center: Vector3) {
|
|
@@ -21,46 +21,49 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import {
|
|
24
|
+
import { Plane, Quaternion, Vector2, Vector3 } from "three";
|
|
25
25
|
import { TransformControls } from "three/examples/jsm/controls/TransformControls.js";
|
|
26
26
|
|
|
27
27
|
import type { Viewer } from "../Viewer";
|
|
28
|
+
import { STATE } from "../controls/OrbitControls.js";
|
|
28
29
|
import { PlaneHelper2 } from "../helpers/PlaneHelper2";
|
|
30
|
+
import { Snapper } from "../measurement/Snapper";
|
|
29
31
|
import { OrbitDragger } from "./OrbitDragger";
|
|
30
32
|
|
|
31
33
|
export class CuttingPlaneDragger extends OrbitDragger {
|
|
32
|
-
protected
|
|
33
|
-
protected
|
|
34
|
-
protected
|
|
34
|
+
protected clippingPlanes: Plane[];
|
|
35
|
+
protected helpers: PlaneHelper2[] = [];
|
|
36
|
+
protected activeHelper: PlaneHelper2 = null;
|
|
37
|
+
protected snapper: Snapper;
|
|
38
|
+
protected downPosition: Vector2;
|
|
39
|
+
protected position0: Vector3;
|
|
40
|
+
protected quaternion0: Quaternion;
|
|
35
41
|
protected translate: TransformControls;
|
|
36
42
|
protected rotate: TransformControls;
|
|
37
43
|
|
|
38
|
-
constructor(viewer: Viewer
|
|
44
|
+
constructor(viewer: Viewer) {
|
|
39
45
|
super(viewer);
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
const extentsCenter = viewer.extents.getCenter(new Vector3());
|
|
43
|
-
const constant = -extentsCenter.dot(normal);
|
|
47
|
+
if (!viewer.renderer.clippingPlanes) viewer.renderer.clippingPlanes = [];
|
|
44
48
|
|
|
45
|
-
this.
|
|
49
|
+
this.clippingPlanes = viewer.renderer.clippingPlanes;
|
|
50
|
+
this.clippingPlanes.forEach((plane) => this.addHelper(plane));
|
|
46
51
|
|
|
47
|
-
|
|
48
|
-
viewer.renderer.clippingPlanes.push(this.plane);
|
|
52
|
+
const extentsSize = viewer.extents.getSize(new Vector3()).length() || 1;
|
|
49
53
|
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
52
|
-
this.planeCenter.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), normal);
|
|
53
|
-
this.viewer.helpers.add(this.planeCenter);
|
|
54
|
+
this.snapper = new Snapper(viewer.camera, viewer.renderer, viewer.canvas);
|
|
55
|
+
this.snapper.threshold = extentsSize / 10000;
|
|
54
56
|
|
|
55
|
-
this.
|
|
56
|
-
this.
|
|
57
|
+
this.downPosition = new Vector2();
|
|
58
|
+
this.position0 = new Vector3();
|
|
59
|
+
this.quaternion0 = new Quaternion();
|
|
57
60
|
|
|
58
61
|
this.translate = new TransformControls(viewer.camera, viewer.canvas);
|
|
62
|
+
this.translate.setMode("translate");
|
|
59
63
|
this.translate.setSpace("local");
|
|
60
64
|
this.translate.showX = false;
|
|
61
65
|
this.translate.showY = false;
|
|
62
66
|
this.translate.showZ = true;
|
|
63
|
-
this.translate.attach(this.planeCenter);
|
|
64
67
|
this.translate.addEventListener("change", this.transformChange);
|
|
65
68
|
this.translate.addEventListener("dragging-changed", this.translateDrag);
|
|
66
69
|
this.viewer.helpers.add(this.translate.getHelper());
|
|
@@ -71,15 +74,20 @@ export class CuttingPlaneDragger extends OrbitDragger {
|
|
|
71
74
|
this.rotate.showX = true;
|
|
72
75
|
this.rotate.showY = true;
|
|
73
76
|
this.rotate.showZ = false;
|
|
74
|
-
this.rotate.attach(this.planeCenter);
|
|
75
77
|
this.rotate.addEventListener("change", this.transformChange);
|
|
76
78
|
this.rotate.addEventListener("dragging-changed", this.rotateDrag);
|
|
77
79
|
this.viewer.helpers.add(this.rotate.getHelper());
|
|
78
80
|
|
|
81
|
+
this.setActiveHelper(this.helpers[this.helpers.length - 1]);
|
|
82
|
+
|
|
79
83
|
this.viewer.addEventListener("explode", this.updatePlaneSize);
|
|
80
84
|
this.viewer.addEventListener("show", this.updatePlaneSize);
|
|
81
85
|
this.viewer.addEventListener("showall", this.updatePlaneSize);
|
|
82
86
|
this.viewer.addEventListener("changecameramode", this.updateTransformCamera);
|
|
87
|
+
this.viewer.addEventListener("clearslices", this.clearHelpers);
|
|
88
|
+
this.viewer.canvas.addEventListener("pointerdown", this.onPointerDown, true);
|
|
89
|
+
this.viewer.canvas.addEventListener("pointerup", this.onPointerUp, true);
|
|
90
|
+
this.viewer.canvas.addEventListener("pointercancel", this.onPointerCancel, true);
|
|
83
91
|
this.viewer.canvas.addEventListener("dblclick", this.onDoubleClick, true);
|
|
84
92
|
window.addEventListener("keydown", this.onKeyDown);
|
|
85
93
|
window.addEventListener("keyup", this.onKeyUp);
|
|
@@ -92,6 +100,10 @@ export class CuttingPlaneDragger extends OrbitDragger {
|
|
|
92
100
|
this.viewer.removeEventListener("show", this.updatePlaneSize);
|
|
93
101
|
this.viewer.removeEventListener("showall", this.updatePlaneSize);
|
|
94
102
|
this.viewer.removeEventListener("changecameramode", this.updateTransformCamera);
|
|
103
|
+
this.viewer.removeEventListener("clearslices", this.clearHelpers);
|
|
104
|
+
this.viewer.canvas.removeEventListener("pointerdown", this.onPointerDown, true);
|
|
105
|
+
this.viewer.canvas.removeEventListener("pointerup", this.onPointerUp, true);
|
|
106
|
+
this.viewer.canvas.removeEventListener("pointercancel", this.onPointerCancel, true);
|
|
95
107
|
this.viewer.canvas.removeEventListener("dblclick", this.onDoubleClick, true);
|
|
96
108
|
window.removeEventListener("keydown", this.onKeyDown);
|
|
97
109
|
window.removeEventListener("keyup", this.onKeyUp);
|
|
@@ -108,21 +120,26 @@ export class CuttingPlaneDragger extends OrbitDragger {
|
|
|
108
120
|
this.rotate.detach();
|
|
109
121
|
this.rotate.dispose();
|
|
110
122
|
|
|
111
|
-
this.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
// this.viewer.update();
|
|
123
|
+
this.helpers.forEach((helper) => {
|
|
124
|
+
helper.removeFromParent();
|
|
125
|
+
helper.dispose();
|
|
126
|
+
});
|
|
127
|
+
this.helpers = [];
|
|
128
|
+
this.activeHelper = null;
|
|
118
129
|
|
|
119
130
|
super.dispose();
|
|
120
131
|
}
|
|
121
132
|
|
|
122
133
|
transformChange = () => {
|
|
123
|
-
|
|
124
|
-
|
|
134
|
+
if (!this.activeHelper) return;
|
|
135
|
+
|
|
136
|
+
const plane = this.activeHelper.plane;
|
|
137
|
+
plane.normal.copy(new Vector3(0, 0, -1)).applyQuaternion(this.activeHelper.quaternion);
|
|
138
|
+
plane.constant = -this.activeHelper.position.dot(plane.normal);
|
|
139
|
+
|
|
125
140
|
this.viewer.update();
|
|
141
|
+
|
|
142
|
+
this.changed = true; // <- cancel context menu
|
|
126
143
|
};
|
|
127
144
|
|
|
128
145
|
translateDrag = (event) => {
|
|
@@ -136,27 +153,170 @@ export class CuttingPlaneDragger extends OrbitDragger {
|
|
|
136
153
|
};
|
|
137
154
|
|
|
138
155
|
updatePlaneSize = () => {
|
|
139
|
-
|
|
156
|
+
const extentsSize = this.viewer.extents.getSize(new Vector3()).length() || 1;
|
|
157
|
+
this.helpers.forEach((planeHelper) => (planeHelper.size = extentsSize));
|
|
140
158
|
this.viewer.update();
|
|
141
159
|
};
|
|
142
160
|
|
|
143
161
|
updateTransformCamera = () => {
|
|
144
162
|
this.translate.camera = this.viewer.camera;
|
|
145
163
|
this.rotate.camera = this.viewer.camera;
|
|
164
|
+
this.snapper.camera = this.viewer.camera;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
clearHelpers = () => {
|
|
168
|
+
this.setActiveHelper();
|
|
169
|
+
|
|
170
|
+
this.helpers.forEach((helper) => {
|
|
171
|
+
helper.removeFromParent();
|
|
172
|
+
helper.dispose();
|
|
173
|
+
});
|
|
174
|
+
this.helpers = [];
|
|
175
|
+
|
|
176
|
+
this.viewer.update();
|
|
146
177
|
};
|
|
147
178
|
|
|
148
179
|
onKeyDown = (event: KeyboardEvent) => {
|
|
149
180
|
if (event.key === "Shift") this.rotate.setRotationSnap(Math.PI / 4);
|
|
181
|
+
if (event.key === "Delete" || event.key === "Backspace") this.deleteActivePlane();
|
|
182
|
+
if (event.key === "Escape" && (this.translate.dragging || this.rotate.dragging)) this.reset();
|
|
150
183
|
};
|
|
151
184
|
|
|
152
185
|
onKeyUp = (event: KeyboardEvent) => {
|
|
153
186
|
if (event.key === "Shift") this.rotate.setRotationSnap(null);
|
|
154
187
|
};
|
|
155
188
|
|
|
189
|
+
onPointerDown = (event: PointerEvent) => {
|
|
190
|
+
if (event.button !== 0 || !event.isPrimary) return;
|
|
191
|
+
|
|
192
|
+
this.snapper.getMousePosition(event, this.downPosition);
|
|
193
|
+
this.saveState();
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
onPointerUp = (event: PointerEvent) => {
|
|
197
|
+
if (event.button !== 0) return;
|
|
198
|
+
|
|
199
|
+
const upPosition = this.snapper.getMousePosition(event, new Vector2());
|
|
200
|
+
if (upPosition.distanceTo(this.downPosition) !== 0) return;
|
|
201
|
+
|
|
202
|
+
const intersects = this.snapper.getPointerIntersects(upPosition, this.helpers, true, false);
|
|
203
|
+
if (intersects.length === 0) return;
|
|
204
|
+
|
|
205
|
+
this.setActiveHelper(intersects[0].object.parent as PlaneHelper2);
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
onPointerCancel = (event: PointerEvent) => {
|
|
209
|
+
this.viewer.canvas.dispatchEvent(new PointerEvent("pointerup", event));
|
|
210
|
+
};
|
|
211
|
+
|
|
156
212
|
onDoubleClick = (event: PointerEvent) => {
|
|
157
|
-
|
|
213
|
+
if (!this.activeHelper) return;
|
|
158
214
|
|
|
159
|
-
this.
|
|
215
|
+
const mousePosition = this.snapper.getMousePosition(event, new Vector2());
|
|
216
|
+
|
|
217
|
+
const intersects = this.snapper.getPointerIntersects(mousePosition, [this.activeHelper], true, false);
|
|
218
|
+
if (intersects.length === 0) return;
|
|
219
|
+
|
|
220
|
+
this.activeHelper.rotateOnAxis(new Vector3(0, 1, 0), Math.PI);
|
|
160
221
|
this.transformChange();
|
|
222
|
+
|
|
223
|
+
event.stopPropagation();
|
|
161
224
|
};
|
|
225
|
+
|
|
226
|
+
private addHelper(plane: Plane): PlaneHelper2 {
|
|
227
|
+
const extentsSize = this.viewer.extents.getSize(new Vector3()).length() || 1;
|
|
228
|
+
const extentsCenter = this.viewer.extents.getCenter(new Vector3());
|
|
229
|
+
|
|
230
|
+
const helper = new PlaneHelper2(extentsSize);
|
|
231
|
+
helper.plane = plane;
|
|
232
|
+
helper.position.copy(plane.projectPoint(extentsCenter, new Vector3()));
|
|
233
|
+
helper.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), plane.normal);
|
|
234
|
+
|
|
235
|
+
this.helpers.push(helper);
|
|
236
|
+
this.viewer.helpers.add(helper);
|
|
237
|
+
|
|
238
|
+
return helper;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
private setActiveHelper(helper?: PlaneHelper2) {
|
|
242
|
+
if (helper === this.activeHelper) return;
|
|
243
|
+
|
|
244
|
+
if (this.activeHelper) {
|
|
245
|
+
this.activeHelper.getLineMaterial().color.setHex(0xf0f0f0);
|
|
246
|
+
this.activeHelper.getMeshMaterial().opacity = 0.15;
|
|
247
|
+
|
|
248
|
+
this.translate.detach();
|
|
249
|
+
this.rotate.detach();
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
this.activeHelper = helper;
|
|
253
|
+
|
|
254
|
+
if (this.activeHelper) {
|
|
255
|
+
this.activeHelper.getLineMaterial().color.setHex(0xd0d0d0);
|
|
256
|
+
this.activeHelper.getMeshMaterial().opacity = 0.3;
|
|
257
|
+
|
|
258
|
+
this.translate.attach(this.activeHelper);
|
|
259
|
+
this.rotate.attach(this.activeHelper);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
this.viewer.update();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
private saveState() {
|
|
266
|
+
if (!this.activeHelper) return;
|
|
267
|
+
|
|
268
|
+
this.position0.copy(this.activeHelper.position);
|
|
269
|
+
this.quaternion0.copy(this.activeHelper.quaternion);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
private reset() {
|
|
273
|
+
if (!this.activeHelper) return;
|
|
274
|
+
|
|
275
|
+
this.translate.dragging = false;
|
|
276
|
+
this.rotate.dragging = false;
|
|
277
|
+
this.orbit.state = STATE.NONE;
|
|
278
|
+
|
|
279
|
+
this.activeHelper.position.copy(this.position0);
|
|
280
|
+
this.activeHelper.quaternion.copy(this.quaternion0);
|
|
281
|
+
|
|
282
|
+
this.transformChange();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
addPlane(normal: Vector3) {
|
|
286
|
+
const extentsCenter = this.viewer.extents.getCenter(new Vector3());
|
|
287
|
+
const constant = -extentsCenter.dot(normal);
|
|
288
|
+
|
|
289
|
+
const plane = new Plane(normal, constant);
|
|
290
|
+
this.clippingPlanes.push(plane);
|
|
291
|
+
|
|
292
|
+
const helper = this.addHelper(plane);
|
|
293
|
+
this.setActiveHelper(helper);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
addPlaneX() {
|
|
297
|
+
this.addPlane(new Vector3(-1, 0, 0));
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
addPlaneY() {
|
|
301
|
+
this.addPlane(new Vector3(0, -1, 0));
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
addPlaneZ() {
|
|
305
|
+
this.addPlane(new Vector3(0, 0, -1));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
deleteActivePlane() {
|
|
309
|
+
if (!this.activeHelper) return;
|
|
310
|
+
|
|
311
|
+
const helper = this.activeHelper;
|
|
312
|
+
|
|
313
|
+
const index = this.clippingPlanes.indexOf(helper.plane);
|
|
314
|
+
if (index !== -1) this.clippingPlanes.splice(index, 1);
|
|
315
|
+
|
|
316
|
+
this.helpers = this.helpers.filter((x) => x !== helper);
|
|
317
|
+
helper.removeFromParent();
|
|
318
|
+
helper.dispose();
|
|
319
|
+
|
|
320
|
+
this.setActiveHelper(this.helpers[this.helpers.length - 1]);
|
|
321
|
+
}
|
|
162
322
|
}
|
|
@@ -21,13 +21,12 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { Vector3 } from "three";
|
|
25
|
-
|
|
26
24
|
import type { Viewer } from "../Viewer";
|
|
27
25
|
import { CuttingPlaneDragger } from "./CuttingPlaneDragger";
|
|
28
26
|
|
|
29
27
|
export class CuttingPlaneXAxisDragger extends CuttingPlaneDragger {
|
|
30
28
|
constructor(viewer: Viewer) {
|
|
31
|
-
super(viewer
|
|
29
|
+
super(viewer);
|
|
30
|
+
this.addPlaneX();
|
|
32
31
|
}
|
|
33
32
|
}
|
|
@@ -21,13 +21,12 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { Vector3 } from "three";
|
|
25
|
-
|
|
26
24
|
import type { Viewer } from "../Viewer";
|
|
27
25
|
import { CuttingPlaneDragger } from "./CuttingPlaneDragger";
|
|
28
26
|
|
|
29
27
|
export class CuttingPlaneYAxisDragger extends CuttingPlaneDragger {
|
|
30
28
|
constructor(viewer: Viewer) {
|
|
31
|
-
super(viewer
|
|
29
|
+
super(viewer);
|
|
30
|
+
this.addPlaneY();
|
|
32
31
|
}
|
|
33
32
|
}
|
|
@@ -21,13 +21,12 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { Vector3 } from "three";
|
|
25
|
-
|
|
26
24
|
import type { Viewer } from "../Viewer";
|
|
27
25
|
import { CuttingPlaneDragger } from "./CuttingPlaneDragger";
|
|
28
26
|
|
|
29
27
|
export class CuttingPlaneZAxisDragger extends CuttingPlaneDragger {
|
|
30
28
|
constructor(viewer: Viewer) {
|
|
31
|
-
super(viewer
|
|
29
|
+
super(viewer);
|
|
30
|
+
this.addPlaneZ();
|
|
32
31
|
}
|
|
33
32
|
}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
import { IDraggersRegistry, draggersRegistry } from "@inweb/viewer-core";
|
|
25
25
|
|
|
26
|
+
import { CuttingPlaneDragger } from "./CuttingPlaneDragger";
|
|
26
27
|
import { CuttingPlaneXAxisDragger } from "./CuttingPlaneXAxis";
|
|
27
28
|
import { CuttingPlaneYAxisDragger } from "./CuttingPlaneYAxis";
|
|
28
29
|
import { CuttingPlaneZAxisDragger } from "./CuttingPlaneZAxis";
|
|
@@ -84,6 +85,7 @@ draggers.registerDragger("Pan", (viewer) => new PanDragger(viewer));
|
|
|
84
85
|
draggers.registerDragger("Orbit", (viewer) => new OrbitDragger(viewer));
|
|
85
86
|
draggers.registerDragger("Zoom", (viewer) => new ZoomDragger(viewer));
|
|
86
87
|
draggers.registerDragger("MeasureLine", (viewer) => new MeasureLineDragger(viewer));
|
|
88
|
+
draggers.registerDragger("CuttingPlane", (viewer) => new CuttingPlaneDragger(viewer));
|
|
87
89
|
draggers.registerDragger("CuttingPlaneXAxis", (viewer) => new CuttingPlaneXAxisDragger(viewer));
|
|
88
90
|
draggers.registerDragger("CuttingPlaneYAxis", (viewer) => new CuttingPlaneYAxisDragger(viewer));
|
|
89
91
|
draggers.registerDragger("CuttingPlaneZAxis", (viewer) => new CuttingPlaneZAxisDragger(viewer));
|
|
@@ -29,54 +29,67 @@ import {
|
|
|
29
29
|
LineBasicMaterial,
|
|
30
30
|
Mesh,
|
|
31
31
|
MeshBasicMaterial,
|
|
32
|
+
Object3D,
|
|
33
|
+
Plane,
|
|
32
34
|
} from "three";
|
|
33
35
|
|
|
34
|
-
export class PlaneHelper2 extends
|
|
36
|
+
export class PlaneHelper2 extends Object3D {
|
|
37
|
+
public plane: Plane;
|
|
35
38
|
public size: number;
|
|
36
|
-
public
|
|
39
|
+
public outline: Line;
|
|
40
|
+
public mesh: Mesh;
|
|
37
41
|
|
|
38
|
-
constructor(size = 1, color =
|
|
39
|
-
|
|
42
|
+
constructor(size = 1, color = 0xf0f0f0, opacity = 0.15) {
|
|
43
|
+
super();
|
|
44
|
+
|
|
45
|
+
(this as any).type = "PlaneHelper2";
|
|
46
|
+
this.size = size;
|
|
40
47
|
|
|
48
|
+
const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];
|
|
41
49
|
const geometry = new BufferGeometry();
|
|
42
50
|
geometry.setAttribute("position", new Float32BufferAttribute(positions, 3));
|
|
43
51
|
geometry.computeBoundingSphere();
|
|
44
52
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
(this as any).type = "PlaneHelper2";
|
|
48
|
-
|
|
49
|
-
this.size = size;
|
|
53
|
+
this.outline = new Line(geometry, new LineBasicMaterial({ color, toneMapped: false }));
|
|
50
54
|
|
|
51
55
|
const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];
|
|
52
|
-
|
|
53
56
|
const geometry2 = new BufferGeometry();
|
|
54
57
|
geometry2.setAttribute("position", new Float32BufferAttribute(positions2, 3));
|
|
55
58
|
geometry2.computeBoundingSphere();
|
|
56
59
|
|
|
57
|
-
this.
|
|
60
|
+
this.mesh = new Mesh(
|
|
58
61
|
geometry2,
|
|
59
62
|
new MeshBasicMaterial({
|
|
60
63
|
color,
|
|
61
|
-
opacity
|
|
64
|
+
opacity,
|
|
62
65
|
transparent: true,
|
|
63
66
|
depthWrite: false,
|
|
64
67
|
toneMapped: false,
|
|
65
68
|
side: DoubleSide,
|
|
66
69
|
})
|
|
67
70
|
);
|
|
68
|
-
|
|
71
|
+
|
|
72
|
+
this.add(this.outline);
|
|
73
|
+
this.add(this.mesh);
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
dispose() {
|
|
72
|
-
this.geometry.dispose();
|
|
73
|
-
(this.material as
|
|
74
|
-
|
|
75
|
-
(this.
|
|
77
|
+
this.outline.geometry.dispose();
|
|
78
|
+
(this.outline.material as LineBasicMaterial).dispose();
|
|
79
|
+
this.mesh.geometry.dispose();
|
|
80
|
+
(this.mesh.material as MeshBasicMaterial).dispose();
|
|
76
81
|
}
|
|
77
82
|
|
|
78
83
|
override updateMatrixWorld(force: boolean) {
|
|
79
84
|
this.scale.set(0.5 * this.size, 0.5 * this.size, 1);
|
|
80
85
|
super.updateMatrixWorld(force);
|
|
81
86
|
}
|
|
87
|
+
|
|
88
|
+
getLineMaterial(): LineBasicMaterial {
|
|
89
|
+
return this.outline.material as LineBasicMaterial;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
getMeshMaterial(): MeshBasicMaterial {
|
|
93
|
+
return this.mesh.material as MeshBasicMaterial;
|
|
94
|
+
}
|
|
82
95
|
}
|