@inweb/viewer-three 25.9.8 → 25.11.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 (110) hide show
  1. package/README.md +26 -18
  2. package/dist/viewer-three.js +9963 -6031
  3. package/dist/viewer-three.js.map +1 -1
  4. package/dist/viewer-three.min.js +3 -2
  5. package/dist/viewer-three.module.js +2648 -353
  6. package/dist/viewer-three.module.js.map +1 -1
  7. package/lib/Viewer/IDisposable.d.ts +6 -0
  8. package/lib/Viewer/Viewer.d.ts +119 -14
  9. package/lib/Viewer/commands/ApplyModelTransform.d.ts +1 -0
  10. package/lib/Viewer/commands/ClearMarkup.d.ts +1 -0
  11. package/lib/Viewer/commands/ClearSelected.d.ts +1 -0
  12. package/lib/Viewer/commands/ClearSlices.d.ts +1 -0
  13. package/lib/Viewer/commands/CreatePreview.d.ts +1 -0
  14. package/lib/Viewer/commands/Explode.d.ts +1 -0
  15. package/lib/Viewer/commands/GetDefaultViewPositions.d.ts +1 -0
  16. package/lib/Viewer/commands/GetModels.d.ts +1 -0
  17. package/lib/Viewer/commands/GetSelected.d.ts +1 -0
  18. package/lib/Viewer/commands/HideSelected.d.ts +1 -0
  19. package/lib/Viewer/commands/IsolateSelected.d.ts +1 -0
  20. package/lib/Viewer/commands/RegenerateAll.d.ts +1 -0
  21. package/lib/Viewer/commands/ResetView.d.ts +1 -0
  22. package/lib/Viewer/commands/SelectModel.d.ts +1 -0
  23. package/lib/Viewer/commands/SetActiveDragger.d.ts +1 -0
  24. package/lib/Viewer/commands/SetDefaultViewPosition.d.ts +13 -0
  25. package/lib/Viewer/commands/SetMarkupColor.d.ts +1 -0
  26. package/lib/Viewer/commands/SetSelected.d.ts +1 -0
  27. package/lib/Viewer/commands/ShowAll.d.ts +1 -0
  28. package/lib/Viewer/commands/ZoomToExtents.d.ts +1 -0
  29. package/lib/Viewer/commands/ZoomToObjects.d.ts +1 -0
  30. package/lib/Viewer/commands/ZoomToSelected.d.ts +1 -0
  31. package/lib/Viewer/commands/index.d.ts +22 -0
  32. package/lib/Viewer/components/AxesHelperComponent.d.ts +10 -0
  33. package/lib/Viewer/components/BackgroundComponent.d.ts +4 -4
  34. package/lib/Viewer/components/{DefaultCameraPositionComponent.d.ts → DefaultPositionComponent.d.ts} +3 -2
  35. package/lib/Viewer/components/ExtentsComponent.d.ts +8 -0
  36. package/lib/Viewer/components/ExtentsHelperComponent.d.ts +9 -0
  37. package/lib/Viewer/components/LightComponent.d.ts +5 -5
  38. package/lib/Viewer/components/RenderLoopComponent.d.ts +3 -3
  39. package/lib/Viewer/components/ResizeCanvasComponent.d.ts +2 -2
  40. package/lib/Viewer/components/SelectionComponent.d.ts +19 -0
  41. package/lib/Viewer/components/ViewPositionComponent.d.ts +31 -0
  42. package/lib/Viewer/components/WCSHelperComponent.d.ts +9 -0
  43. package/lib/Viewer/controls/WalkControls.d.ts +26 -0
  44. package/lib/Viewer/draggers/CuttingPlaneDragger.d.ts +17 -0
  45. package/lib/Viewer/draggers/CuttingPlaneXAxis.d.ts +5 -0
  46. package/lib/Viewer/draggers/CuttingPlaneYAxis.d.ts +5 -0
  47. package/lib/Viewer/draggers/CuttingPlaneZAxis.d.ts +5 -0
  48. package/lib/Viewer/draggers/OrbitDragger.d.ts +10 -6
  49. package/lib/Viewer/draggers/WalkDragger.d.ts +7 -33
  50. package/lib/Viewer/helpers/PlaneHelper.d.ts +11 -0
  51. package/lib/Viewer/helpers/WCSHelper.d.ts +10 -0
  52. package/lib/Viewer/loaders/GLTFLoadingManager.d.ts +3 -3
  53. package/lib/index.d.ts +1 -0
  54. package/package.json +6 -5
  55. package/src/Viewer/IDisposable.ts +29 -0
  56. package/src/Viewer/Viewer.ts +240 -49
  57. package/src/Viewer/commands/ApplyModelTransform.ts +33 -0
  58. package/src/Viewer/commands/ClearMarkup.ts +29 -0
  59. package/src/Viewer/commands/ClearSelected.ts +38 -0
  60. package/src/Viewer/commands/ClearSlices.ts +32 -0
  61. package/src/Viewer/commands/CreatePreview.ts +32 -0
  62. package/src/Viewer/commands/Explode.ts +83 -0
  63. package/src/Viewer/commands/GetDefaultViewPositions.ts +31 -0
  64. package/src/Viewer/commands/GetModels.ts +32 -0
  65. package/src/Viewer/commands/GetSelected.ts +31 -0
  66. package/src/Viewer/commands/HideSelected.ts +40 -0
  67. package/src/Viewer/commands/IsolateSelected.ts +50 -0
  68. package/src/Viewer/commands/RegenerateAll.ts +32 -0
  69. package/src/Viewer/commands/ResetView.ts +41 -0
  70. package/src/Viewer/commands/SelectModel.ts +32 -0
  71. package/src/Viewer/commands/SetActiveDragger.ts +29 -0
  72. package/src/Viewer/commands/SetDefaultViewPosition.ts +83 -0
  73. package/src/Viewer/commands/SetMarkupColor.ts +30 -0
  74. package/src/Viewer/commands/SetSelected.ts +44 -0
  75. package/src/Viewer/commands/ShowAll.ts +34 -0
  76. package/src/Viewer/commands/ZoomToExtents.ts +47 -0
  77. package/src/Viewer/commands/ZoomToObjects.ts +55 -0
  78. package/src/Viewer/commands/ZoomToSelected.ts +51 -0
  79. package/src/Viewer/commands/index.ts +45 -0
  80. package/src/Viewer/components/AxesHelperComponent.ts +70 -0
  81. package/src/Viewer/components/BackgroundComponent.ts +9 -7
  82. package/src/Viewer/components/{DefaultCameraPositionComponent.ts → DefaultPositionComponent.ts} +11 -22
  83. package/src/Viewer/components/ExtentsComponent.ts +54 -0
  84. package/src/Viewer/components/ExtentsHelperComponent.ts +58 -0
  85. package/src/Viewer/components/LightComponent.ts +14 -10
  86. package/src/Viewer/components/RenderLoopComponent.ts +6 -6
  87. package/src/Viewer/components/ResizeCanvasComponent.ts +2 -2
  88. package/src/Viewer/components/SelectionComponent.ts +132 -0
  89. package/src/Viewer/components/ViewPositionComponent.ts +165 -0
  90. package/src/Viewer/components/WCSHelperComponent.ts +46 -0
  91. package/src/Viewer/controls/OrbitControls.js +1007 -0
  92. package/src/Viewer/controls/WalkControls.ts +222 -0
  93. package/src/Viewer/draggers/CuttingPlaneDragger.ts +110 -0
  94. package/src/Viewer/draggers/CuttingPlaneXAxis.ts +33 -0
  95. package/src/Viewer/draggers/CuttingPlaneYAxis.ts +33 -0
  96. package/src/Viewer/draggers/CuttingPlaneZAxis.ts +33 -0
  97. package/src/Viewer/draggers/OrbitDragger.ts +70 -23
  98. package/src/Viewer/draggers/PanDragger.ts +4 -3
  99. package/src/Viewer/draggers/WalkDragger.ts +27 -216
  100. package/src/Viewer/draggers/ZoomDragger.ts +4 -3
  101. package/src/Viewer/helpers/PlaneHelper.ts +99 -0
  102. package/src/Viewer/helpers/WCSHelper.ts +119 -0
  103. package/src/Viewer/loaders/GLTFLoadingManager.ts +6 -6
  104. package/src/index.ts +2 -0
  105. package/lib/Viewer/IComponent.d.ts +0 -3
  106. package/lib/Viewer/components/ObjectSelectionComponent.d.ts +0 -16
  107. package/lib/Viewer/draggers/ClippingPlaneDragger.d.ts +0 -17
  108. package/src/Viewer/IComponent.ts +0 -3
  109. package/src/Viewer/components/ObjectSelectionComponent.ts +0 -105
  110. package/src/Viewer/draggers/ClippingPlaneDragger.ts +0 -120
@@ -21,240 +21,51 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
- import { RenderEvent } from "@inweb/viewer-core";
25
- import * as THREE from "three";
24
+ import { Vector3 } from "three";
25
+
26
26
  import type { Viewer } from "../Viewer";
27
+ import { WalkControls } from "../controls/WalkControls";
27
28
 
28
29
  export class WalkDragger {
29
30
  protected viewer: Viewer;
30
- protected camera: THREE.Camera;
31
- protected canvas: HTMLCanvasElement;
32
- protected _target: THREE.Vector3;
33
- protected quaternion: THREE.Quaternion;
34
- protected mouseStart: THREE.Vector2;
35
- protected mouseDelta: THREE.Vector2;
36
- protected xAxis: THREE.Vector3;
37
- protected yAxis: THREE.Vector3;
38
- protected zAxis: THREE.Vector3;
39
- protected speed: THREE.Vector3;
40
- protected _maxDistance: number;
41
- protected xRotation: THREE.Quaternion;
42
- protected yRotation: THREE.Quaternion;
43
- protected yRotationAxis: THREE.Vector3;
44
- protected touchStartDistance: number;
45
-
46
- public walkSpeed: number;
47
- public boostSpeed: number;
31
+ public controls: WalkControls;
48
32
 
49
33
  constructor(viewer: Viewer) {
34
+ this.controls = new WalkControls(viewer.camera, viewer.canvas);
35
+ this.controls.addEventListener("change", this.controlsChange);
36
+ this.controls.addEventListener("walkspeedchange", this.walkspeedChange);
50
37
  this.viewer = viewer;
51
-
52
- this._target = new THREE.Vector3();
53
-
54
- this.quaternion = this.viewer.camera.quaternion.clone();
55
- this.xRotation = new THREE.Quaternion();
56
- this.yRotation = new THREE.Quaternion();
57
-
58
- this.mouseStart = new THREE.Vector2();
59
- this.mouseDelta = new THREE.Vector2();
60
-
61
- this.xAxis = new THREE.Vector3();
62
- this.yAxis = new THREE.Vector3();
63
- this.zAxis = new THREE.Vector3();
64
- this.yRotationAxis = new THREE.Vector3(1, 0, 0);
65
- this.walkSpeed = 1;
66
- this.boostSpeed = 5;
67
- this.speed = new THREE.Vector3();
68
- this._maxDistance = 1;
69
-
70
- this.touchStartDistance = 0;
71
-
72
- this.viewer.addEventListener("render", this.onRender);
73
-
74
- this.viewer.addEventListener("contextmenu", this.onContextMenu);
75
-
76
- this.viewer.addEventListener("mousedown", this.onMouseDown);
77
- this.viewer.addEventListener("mouseup", this.onMouseUp);
78
-
79
- this.viewer.addEventListener("touchstart", this.onTouchStart);
80
- this.viewer.addEventListener("touchmove", this.onTouchMove);
81
- this.viewer.addEventListener("touchend", this.onTouchEnd);
82
-
83
- this.viewer.addEventListener("wheel", this.onMouseWheel);
84
-
85
- document.addEventListener("keydown", this.onKeyDown);
86
- document.addEventListener("keyup", this.onKeyUp);
38
+ this.viewer.on("render", this.viewerRender);
39
+ this.viewer.on("zoom", this.viewerZoom);
40
+ this.updateControls();
87
41
  }
88
42
 
89
- dispose(): void {
90
- this.viewer.removeEventListener("render", this.onRender);
91
-
92
- this.viewer.removeEventListener("contextmenu", this.onContextMenu);
93
-
94
- this.viewer.removeEventListener("mousedown", this.onMouseDown);
95
- this.viewer.removeEventListener("mouseup", this.onMouseUp);
96
- this.viewer.removeEventListener("mousemove", this.onMouseMove);
97
-
98
- this.viewer.removeEventListener("touchstart", this.onTouchStart);
99
- this.viewer.removeEventListener("touchmove", this.onTouchMove);
100
- this.viewer.removeEventListener("touchend", this.onTouchEnd);
101
-
102
- this.viewer.removeEventListener("wheel", this.onMouseWheel);
103
-
104
- document.removeEventListener("keydown", this.onKeyDown);
105
- document.removeEventListener("keyup", this.onKeyUp);
43
+ dispose() {
44
+ this.viewer.off("render", this.viewerRender);
45
+ this.viewer.off("zoom", this.viewerZoom);
46
+ this.controls.removeEventListener("walkspeedchange", this.walkspeedChange);
47
+ this.controls.removeEventListener("change", this.controlsChange);
48
+ this.controls.dispose();
106
49
  }
107
50
 
108
- onKeyDown = (event: KeyboardEvent) => {
109
- switch (event.code) {
110
- case "KeyW": // Forward
111
- if (event.shiftKey) {
112
- this.speed.z = this.walkSpeed * this.boostSpeed;
113
- } else {
114
- this.speed.z = this.walkSpeed;
115
- }
116
- break;
117
- case "KeyS": // Backward
118
- if (event.shiftKey) {
119
- this.speed.z = -this.walkSpeed * this.boostSpeed;
120
- } else {
121
- this.speed.z = -this.walkSpeed;
122
- }
123
- break;
124
- case "KeyA": // Left
125
- if (event.shiftKey) {
126
- this.speed.x = this.walkSpeed * this.boostSpeed;
127
- } else {
128
- this.speed.x = this.walkSpeed;
129
- }
130
- break;
131
- case "KeyD": // Right
132
- if (event.shiftKey) {
133
- this.speed.x = -this.walkSpeed * this.boostSpeed;
134
- } else {
135
- this.speed.x = -this.walkSpeed;
136
- }
137
- break;
138
- default:
139
- break;
140
- }
141
- };
142
-
143
- onKeyUp = (event: KeyboardEvent) => {
144
- switch (event.code) {
145
- case "KeyW":
146
- this.speed.z = 0;
147
- break;
148
- case "KeyS":
149
- this.speed.z = 0;
150
- break;
151
- case "KeyA":
152
- this.speed.x = 0;
153
- break;
154
- case "KeyD":
155
- this.speed.x = 0;
156
- break;
157
- default:
158
- break;
159
- }
160
- };
161
-
162
- onMouseDown = (event: PointerEvent) => {
163
- const { clientX, clientY } = event;
164
- this.mouseStart.set(clientX, clientY);
165
- this.mouseDelta.set(0, 0);
166
- this.quaternion.copy(this.viewer.camera.quaternion);
167
- this.viewer.addEventListener("mousemove", this.onMouseMove);
168
- };
169
-
170
- onMouseMove = (event: MouseEvent) => {
171
- const { clientX, clientY } = event;
172
- this.mouseDelta.set(this.mouseStart.x - clientX, this.mouseStart.y - clientY);
173
- this.rotateCamera(this.mouseDelta);
174
- };
175
-
176
- onMouseUp = (event: PointerEvent) => {
177
- this.speed.set(0, 0, 0);
178
- this.mouseStart.set(0, 0);
179
- this.mouseDelta.set(0, 0);
180
- this.quaternion.copy(this.viewer.camera.quaternion);
181
- this.viewer.removeEventListener("mousemove", this.onMouseMove);
182
- };
183
-
184
- onMouseWheel = (event: WheelEvent) => {
185
- event.preventDefault();
186
-
187
- if (-event.deltaY < 0) {
188
- this.walkSpeed = Math.max(0.001, this.walkSpeed - 1);
189
- } else if (-event.deltaY > 0) {
190
- this.walkSpeed++;
191
- }
51
+ updateControls = () => {
52
+ const size = this.viewer.extents.getSize(new Vector3());
53
+ this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;
192
54
  };
193
55
 
194
- onContextMenu = (event: MouseEvent) => {
195
- console.log(event);
196
- event.preventDefault();
197
- event.stopImmediatePropagation();
56
+ controlsChange = () => {
57
+ this.viewer.update();
198
58
  };
199
59
 
200
- onTouchStart = (event: TouchEvent) => {
201
- if (event.touches.length > 1) {
202
- this.touchStartDistance = this.getTouchsDistance(event.touches);
203
- } else {
204
- const { clientX, clientY } = event.touches[0];
205
- this.mouseStart.set(clientX, clientY);
206
- this.mouseDelta.set(0, 0);
207
- this.quaternion.copy(this.viewer.camera.quaternion);
208
- }
60
+ walkspeedChange = (event: any) => {
61
+ this.viewer.emitEvent(event);
209
62
  };
210
63
 
211
- onTouchEnd = (event: TouchEvent) => {
212
- if (event.touches.length === 0) {
213
- this.touchStartDistance = 0;
214
- }
215
- this.speed.set(0, 0, 0);
216
- this.mouseStart.set(0, 0);
217
- this.mouseDelta.set(0, 0);
218
- this.quaternion.copy(this.viewer.camera.quaternion);
64
+ viewerRender = () => {
65
+ this.controls.update();
219
66
  };
220
67
 
221
- onTouchMove = (event: TouchEvent) => {
222
- if (event.touches.length === 1 && this.touchStartDistance === 0) {
223
- const { clientX, clientY } = event.touches[0];
224
- this.mouseDelta.set(this.mouseStart.x - clientX, this.mouseStart.y - clientY);
225
- this.rotateCamera(this.mouseDelta);
226
- }
227
- if (event.touches.length === 2) {
228
- const distance = this.getTouchsDistance(event.touches);
229
- this.speed.z = (distance - this.touchStartDistance) / 2;
230
- }
68
+ viewerZoom = () => {
69
+ this.controls.rotateDelta.set(0, 0);
231
70
  };
232
-
233
- getTouchsDistance(touches) {
234
- const [start, end] = touches;
235
- const dx = start.clientX - end.clientX;
236
- const dy = start.clientY - end.clientY;
237
- const distance = Math.sqrt(dx * dx + dy * dy);
238
- return distance;
239
- }
240
-
241
- onRender = (event: RenderEvent) => {
242
- this.viewer.camera.matrix.extractBasis(this.xAxis, this.yAxis, this.zAxis);
243
- this.viewer.camera.position.add(this.zAxis.multiplyScalar(-event.deltaTime * this.speed.z));
244
- this.viewer.camera.position.add(this.xAxis.multiplyScalar(-event.deltaTime * this.speed.x));
245
- };
246
-
247
- update() {}
248
-
249
- rotateCamera(delta: THREE.Vector2) {
250
- const rotateX = (Math.PI * delta.x) / this.viewer.canvas.clientWidth;
251
- const rotateY = (Math.PI * delta.y) / this.viewer.canvas.clientHeight;
252
-
253
- const quaternion = this.quaternion.clone();
254
- this.xRotation.setFromAxisAngle(this.viewer.camera.up, rotateX);
255
- this.yRotation.setFromAxisAngle(this.yRotationAxis, rotateY);
256
- quaternion.premultiply(this.xRotation).multiply(this.yRotation).normalize();
257
-
258
- this.viewer.camera.setRotationFromQuaternion(quaternion);
259
- }
260
71
  }
@@ -21,14 +21,15 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
- import * as THREE from "three";
24
+ import { MOUSE } from "three";
25
+
25
26
  import { OrbitDragger } from "./OrbitDragger";
26
27
  import type { Viewer } from "../Viewer";
27
28
 
28
29
  export class ZoomDragger extends OrbitDragger {
29
30
  constructor(viewer: Viewer) {
30
31
  super(viewer);
31
- this.mouseButtons = { LEFT: THREE.MOUSE.DOLLY, MIDDLE: THREE.MOUSE.PAN, RIGHT: THREE.MOUSE.PAN };
32
- this.touches = { ONE: THREE.TOUCH.DOLLY_PAN, TWO: THREE.TOUCH.DOLLY_PAN };
32
+ this.orbit.mouseButtons = { LEFT: MOUSE.DOLLY, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };
33
+ // this.controls.touches = { ONE: TOUCH.DOLLY_PAN, TWO: TOUCH.DOLLY_PAN };
33
34
  }
34
35
  }
@@ -0,0 +1,99 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2002-2024, Open Design Alliance (the "Alliance").
3
+ // All rights reserved.
4
+ //
5
+ // This software and its documentation and related materials are owned by
6
+ // the Alliance. The software may only be incorporated into application
7
+ // programs owned by members of the Alliance, subject to a signed
8
+ // Membership Agreement and Supplemental Software License Agreement with the
9
+ // Alliance. The structure and organization of this software are the valuable
10
+ // trade secrets of the Alliance and its suppliers. The software is also
11
+ // protected by copyright law and international treaty provisions. Application
12
+ // programs incorporating this software must include the following statement
13
+ // with their copyright notices:
14
+ //
15
+ // This application incorporates Open Design Alliance software pursuant to a
16
+ // license agreement with Open Design Alliance.
17
+ // Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.
18
+ // All rights reserved.
19
+ //
20
+ // By use of this software, its documentation or related materials, you
21
+ // acknowledge and accept the above terms.
22
+ ///////////////////////////////////////////////////////////////////////////////
23
+
24
+ import {
25
+ BufferGeometry,
26
+ DoubleSide,
27
+ Float32BufferAttribute,
28
+ Line,
29
+ LineBasicMaterial,
30
+ Mesh,
31
+ MeshBasicMaterial,
32
+ Object3D,
33
+ Plane,
34
+ Vector3,
35
+ } from "three";
36
+
37
+ class PlaneHelper extends Line {
38
+ public plane: Plane;
39
+ public size: number;
40
+ public offset: Vector3;
41
+ public helper: Object3D;
42
+
43
+ constructor(plane: Plane, size = 1, color = 0xffff00, offset: Vector3 = new Vector3()) {
44
+ // const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];
45
+ const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];
46
+
47
+ const geometry = new BufferGeometry();
48
+ geometry.setAttribute("position", new Float32BufferAttribute(positions, 3));
49
+ geometry.computeBoundingSphere();
50
+
51
+ super(geometry, new LineBasicMaterial({ color, toneMapped: false }));
52
+
53
+ (this as any).type = "PlaneHelper";
54
+
55
+ this.plane = plane;
56
+ this.size = size;
57
+ this.offset = offset;
58
+
59
+ const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];
60
+
61
+ const geometry2 = new BufferGeometry();
62
+ geometry2.setAttribute("position", new Float32BufferAttribute(positions2, 3));
63
+ geometry2.computeBoundingSphere();
64
+
65
+ this.helper = new Mesh(
66
+ geometry2,
67
+ new MeshBasicMaterial({
68
+ color,
69
+ opacity: 0.2,
70
+ transparent: true,
71
+ depthWrite: false,
72
+ toneMapped: false,
73
+ side: DoubleSide,
74
+ })
75
+ );
76
+ this.add(this.helper);
77
+ }
78
+
79
+ dispose() {
80
+ this.geometry.dispose();
81
+ (this.material as any).dispose();
82
+ (this.children[0] as any).geometry.dispose();
83
+ (this.children[0] as any).material.dispose();
84
+ }
85
+
86
+ override updateMatrixWorld(force: boolean) {
87
+ this.position.set(0, 0, 0);
88
+ this.lookAt(this.plane.normal);
89
+
90
+ this.position.copy(this.offset);
91
+ this.translateZ(-(this.offset.dot(this.plane.normal) + this.plane.constant));
92
+
93
+ this.scale.set(0.5 * this.size, 0.5 * this.size, 1);
94
+
95
+ super.updateMatrixWorld(force);
96
+ }
97
+ }
98
+
99
+ export { PlaneHelper };
@@ -0,0 +1,119 @@
1
+ import {
2
+ Camera,
3
+ CylinderGeometry,
4
+ CanvasTexture,
5
+ Color,
6
+ Mesh,
7
+ MeshBasicMaterial,
8
+ Object3D,
9
+ OrthographicCamera,
10
+ Sprite,
11
+ SpriteMaterial,
12
+ SRGBColorSpace,
13
+ Vector4,
14
+ WebGLRenderer,
15
+ } from "three";
16
+
17
+ export class WCSHelper extends Object3D {
18
+ private camera: Camera;
19
+ private orthoCamera: OrthographicCamera;
20
+ public size: number;
21
+
22
+ constructor(camera: Camera) {
23
+ super();
24
+
25
+ this.camera = camera;
26
+ this.size = 160;
27
+
28
+ this.orthoCamera = new OrthographicCamera(-2, 2, 2, -2, 0, 4);
29
+ this.orthoCamera.position.set(0, 0, 2);
30
+
31
+ const matRed = new MeshBasicMaterial({ toneMapped: false, color: "#aa0000" });
32
+ const matGreen = new MeshBasicMaterial({ toneMapped: false, color: "#00aa00" });
33
+ const matBlue = new MeshBasicMaterial({ toneMapped: false, color: "#0000aa" });
34
+
35
+ const spriteRed = this.getSpriteMaterial(matRed.color, "X");
36
+ const spriteGreen = this.getSpriteMaterial(matGreen.color, "Y");
37
+ const spriteBlue = this.getSpriteMaterial(matBlue.color, "Z");
38
+
39
+ const lineGeometry = new CylinderGeometry(0.01, 0.01, 1, 3);
40
+ lineGeometry.translate(0, 0.5, 0);
41
+
42
+ const arrowGeometry = new CylinderGeometry(0, 0.1, 0.25, 12);
43
+ arrowGeometry.translate(0, 0.625, 0);
44
+
45
+ const axesMap = {
46
+ X: [
47
+ [new Mesh(arrowGeometry, matRed), [0.5, 0, 0], [0, 0, -Math.PI / 2]],
48
+ [new Mesh(lineGeometry, matRed), [0, 0, 0], [0, 0, -Math.PI / 2]],
49
+ [new Sprite(spriteRed), [1.55, 0, 0]],
50
+ ],
51
+ Y: [
52
+ [new Mesh(arrowGeometry, matGreen), [0, 0.5, 0], null],
53
+ [new Mesh(lineGeometry, matGreen), null, null],
54
+ [new Sprite(spriteGreen), [0, 1.55, 0]],
55
+ ],
56
+ Z: [
57
+ [new Mesh(arrowGeometry, matBlue), [0, 0, 0.5], [Math.PI / 2, 0, 0]],
58
+ [new Mesh(lineGeometry, matBlue), null, [Math.PI / 2, 0, 0]],
59
+ [new Sprite(spriteBlue), [0, 0, 1.55]],
60
+ ],
61
+ };
62
+
63
+ Object.keys(axesMap).forEach((key) => {
64
+ axesMap[key].forEach((objects: any) => {
65
+ const object = objects[0];
66
+ const position = objects[1];
67
+ const rotation = objects[2];
68
+
69
+ object.name = key;
70
+ if (position) object.position.set(position[0], position[1], position[2]);
71
+ if (rotation) object.rotation.set(rotation[0], rotation[1], rotation[2]);
72
+ object.updateMatrixWorld();
73
+
74
+ this.add(object);
75
+ });
76
+ });
77
+ }
78
+
79
+ dispose() {
80
+ this.traverse((object: any) => {
81
+ if (object.geometry) object.geometry.dispose();
82
+ if (object.material) object.material.dispose();
83
+ });
84
+ }
85
+
86
+ getSpriteMaterial(color: Color, text: string) {
87
+ const canvas = document.createElement("canvas");
88
+ canvas.width = 64;
89
+ canvas.height = 64;
90
+
91
+ const context = canvas.getContext("2d");
92
+ context.clearRect(0, 0, 64, 64);
93
+ context.font = "24px Arial";
94
+ context.textAlign = "center";
95
+ context.fillStyle = color.getStyle();
96
+ context.fillText(text, 32, 41);
97
+
98
+ const texture = new CanvasTexture(canvas);
99
+ texture.colorSpace = SRGBColorSpace;
100
+
101
+ return new SpriteMaterial({ map: texture, toneMapped: false });
102
+ }
103
+
104
+ render(renderer: WebGLRenderer) {
105
+ this.quaternion.copy(this.camera.quaternion).invert();
106
+ this.updateMatrixWorld();
107
+
108
+ const clippingPlanes = renderer.clippingPlanes;
109
+ const viewport = renderer.getViewport(new Vector4());
110
+
111
+ renderer.setViewport(this.position.x, this.position.y, this.size, this.size);
112
+ renderer.clippingPlanes = [];
113
+ renderer.clearDepth();
114
+ renderer.render(this, this.orthoCamera);
115
+
116
+ renderer.setViewport(viewport);
117
+ renderer.clippingPlanes = clippingPlanes;
118
+ }
119
+ }
@@ -21,17 +21,17 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
- import * as THREE from "three";
24
+ import { LoadingManager, LoaderUtils } from "three";
25
25
 
26
- export class GLTFLoadingManager extends THREE.LoadingManager {
26
+ export class GLTFLoadingManager extends LoadingManager {
27
27
  public path = "";
28
28
  public resourcePath = "";
29
29
  public fileURL = "";
30
30
  public dataURLs = new Map();
31
31
 
32
32
  constructor(
33
- file: string | ArrayBuffer | Blob,
34
- externalData: Map<string, string | ArrayBuffer | Blob> = new Map(),
33
+ file: string | globalThis.File | ArrayBuffer | Blob,
34
+ externalData: Map<string, string | File | ArrayBuffer | Blob> = new Map(),
35
35
  params: { path?: string } = {}
36
36
  ) {
37
37
  super();
@@ -40,7 +40,7 @@ export class GLTFLoadingManager extends THREE.LoadingManager {
40
40
 
41
41
  if (typeof file === "string") {
42
42
  this.fileURL = file;
43
- this.resourcePath = THREE.LoaderUtils.extractUrlBase(file);
43
+ this.resourcePath = LoaderUtils.extractUrlBase(file);
44
44
  } else {
45
45
  externalData.forEach((value, key) => (this.fileURL = value === file ? key : this.fileURL));
46
46
  externalData.set(this.fileURL, file);
@@ -63,7 +63,7 @@ export class GLTFLoadingManager extends THREE.LoadingManager {
63
63
  });
64
64
  }
65
65
 
66
- dispose(): void {
66
+ dispose() {
67
67
  this.dataURLs.forEach(URL.revokeObjectURL);
68
68
  }
69
69
  }
package/src/index.ts CHANGED
@@ -21,5 +21,7 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
+ import "./Viewer/commands";
25
+
24
26
  export * from "@inweb/viewer-core";
25
27
  export { Viewer } from "./Viewer/Viewer";
@@ -1,3 +0,0 @@
1
- export interface IComponent {
2
- dispose(): void;
3
- }
@@ -1,16 +0,0 @@
1
- import * as THREE from "three";
2
- import { IComponent } from "../IComponent";
3
- import type { Viewer } from "../Viewer";
4
- export declare class ObjectSelectionComponent implements IComponent {
5
- protected viewer: Viewer;
6
- protected raycaster: THREE.Raycaster;
7
- protected mouse: THREE.Vector2;
8
- protected selectionMaterial: THREE.MeshBasicMaterial;
9
- constructor(viewer: Viewer);
10
- dispose(): void;
11
- onPointerUp: (event: PointerEvent) => void;
12
- onPointerDown: (event: PointerEvent) => void;
13
- clearSelection(): void;
14
- setSelectObject(object: any, selected: any): void;
15
- highlightObject(object: any, enable: any): void;
16
- }
@@ -1,17 +0,0 @@
1
- import * as THREE from "three";
2
- export declare class ClippingPlaneDragger {
3
- protected viewer: any;
4
- protected start: THREE.Vector3;
5
- protected end: THREE.Vector3;
6
- protected delta: THREE.Vector3;
7
- protected planeHelper: THREE.PlaneHelper;
8
- plane: THREE.Plane;
9
- constructor(viewer: any);
10
- dispose(): void;
11
- onPointerDown: (event: PointerEvent) => void;
12
- onPointerUp: (event: PointerEvent) => void;
13
- onPointerMove: (event: PointerEvent) => void;
14
- update(): void;
15
- screenToWorld(v: THREE.Vector3): THREE.Vector3;
16
- screenToPlane(v: THREE.Vector3): THREE.Vector3;
17
- }
@@ -1,3 +0,0 @@
1
- export interface IComponent {
2
- dispose(): void;
3
- }