@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.
@@ -1,22 +1,40 @@
1
- import { Object3D, Plane, Vector3 } from "three";
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 plane: Plane;
8
- protected planeCenter: Object3D;
9
- protected planeHelper: PlaneHelper2;
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, normal: Vector3);
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 Line {
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
- helper: Mesh;
5
- constructor(size?: number, color?: number);
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.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.2",
39
- "@inweb/eventemitter2": "~27.2.2",
40
- "@inweb/markup": "~27.2.2",
41
- "@inweb/viewer-core": "~27.2.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; // fraction of half-size
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)) this.update();
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 { Object3D, Plane, Vector3 } from "three";
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 plane: Plane;
33
- protected planeCenter: Object3D;
34
- protected planeHelper: PlaneHelper2;
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, normal: Vector3) {
44
+ constructor(viewer: Viewer) {
39
45
  super(viewer);
40
46
 
41
- const extentsSize = viewer.extents.getSize(new Vector3()).length() || 1;
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.plane = new Plane(normal, constant);
49
+ this.clippingPlanes = viewer.renderer.clippingPlanes;
50
+ this.clippingPlanes.forEach((plane) => this.addHelper(plane));
46
51
 
47
- if (!viewer.renderer.clippingPlanes) viewer.renderer.clippingPlanes = [];
48
- viewer.renderer.clippingPlanes.push(this.plane);
52
+ const extentsSize = viewer.extents.getSize(new Vector3()).length() || 1;
49
53
 
50
- this.planeCenter = new Object3D();
51
- this.planeCenter.position.copy(extentsCenter);
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.planeHelper = new PlaneHelper2(extentsSize);
56
- this.planeCenter.add(this.planeHelper);
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.planeHelper.removeFromParent();
112
- this.planeHelper.dispose();
113
-
114
- this.planeCenter.removeFromParent();
115
-
116
- // this.viewer.renderer.clippingPlanes = this.viewer.renderer.clippingPlanes.filter((plane) => plane !== this.plane);
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
- this.plane.normal.copy(new Vector3(0, 0, -1)).applyQuaternion(this.planeCenter.quaternion);
124
- this.plane.constant = -this.planeCenter.position.dot(this.plane.normal);
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
- this.planeHelper.size = this.viewer.extents.getSize(new Vector3()).length() || 1;
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
- event.stopPropagation();
213
+ if (!this.activeHelper) return;
158
214
 
159
- this.planeCenter.rotateOnAxis(new Vector3(0, 1, 0), Math.PI);
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, new Vector3(-1, 0, 0));
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, new Vector3(0, -1, 0));
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, new Vector3(0, 0, -1));
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 Line {
36
+ export class PlaneHelper2 extends Object3D {
37
+ public plane: Plane;
35
38
  public size: number;
36
- public helper: Mesh;
39
+ public outline: Line;
40
+ public mesh: Mesh;
37
41
 
38
- constructor(size = 1, color = 0xc0c0c0) {
39
- const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];
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
- super(geometry, new LineBasicMaterial({ color, toneMapped: false }));
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.helper = new Mesh(
60
+ this.mesh = new Mesh(
58
61
  geometry2,
59
62
  new MeshBasicMaterial({
60
63
  color,
61
- opacity: 0.2,
64
+ opacity,
62
65
  transparent: true,
63
66
  depthWrite: false,
64
67
  toneMapped: false,
65
68
  side: DoubleSide,
66
69
  })
67
70
  );
68
- this.add(this.helper);
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 any).dispose();
74
- (this.helper as any).geometry.dispose();
75
- (this.helper as any).material.dispose();
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
  }