@shopware-ag/dive 1.5.0 → 1.6.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 (41) hide show
  1. package/README.md +38 -25
  2. package/build/dive.cjs +717 -500
  3. package/build/dive.cjs.map +1 -1
  4. package/build/dive.d.cts +174 -113
  5. package/build/dive.d.ts +174 -113
  6. package/build/dive.js +716 -486
  7. package/build/dive.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/__test__/DIVE.test.ts +66 -22
  10. package/src/animation/AnimationSystem.ts +16 -0
  11. package/src/animation/__test__/AnimationSystem.test.ts +23 -2
  12. package/src/axiscamera/AxisCamera.ts +40 -2
  13. package/src/axiscamera/__test__/AxisCamera.test.ts +178 -5
  14. package/src/com/Communication.ts +50 -16
  15. package/src/com/__test__/Communication.test.ts +73 -24
  16. package/src/com/actions/camera/computeencompassingview.ts +9 -0
  17. package/src/com/actions/index.ts +2 -0
  18. package/src/com/actions/scene/updatescene.ts +1 -0
  19. package/src/controls/OrbitControls.ts +14 -2
  20. package/src/controls/__test__/OrbitControls.test.ts +31 -4
  21. package/src/dive.ts +93 -33
  22. package/src/grid/Grid.ts +4 -0
  23. package/src/grid/__test__/Grid.test.ts +7 -0
  24. package/src/interface/Selectable.ts +17 -0
  25. package/src/interface/__test__/Interfaces.test.ts +18 -0
  26. package/src/mediacreator/MediaCreator.ts +2 -2
  27. package/src/mediacreator/__test__/MediaCreator.test.ts +12 -10
  28. package/src/renderer/Renderer.ts +7 -1
  29. package/src/renderer/__test__/Renderer.test.ts +14 -5
  30. package/src/scene/Scene.ts +8 -2
  31. package/src/scene/__test__/Scene.test.ts +6 -0
  32. package/src/scene/root/Root.ts +11 -1
  33. package/src/scene/root/__test__/Root.test.ts +68 -2
  34. package/src/toolbox/BaseTool.ts +1 -1
  35. package/src/toolbox/Toolbox.ts +53 -37
  36. package/src/toolbox/__test__/BaseTool.test.ts +43 -7
  37. package/src/toolbox/__test__/Toolbox.test.ts +39 -44
  38. package/src/toolbox/select/SelectTool.ts +17 -28
  39. package/src/toolbox/select/__test__/SelectTool.test.ts +21 -12
  40. package/src/toolbox/transform/TransformTool.ts +7 -1
  41. package/src/toolbox/transform/__test__/TransformTool.test.ts +22 -5
package/build/dive.js CHANGED
@@ -1,6 +1,8 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
6
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -17,6 +19,22 @@ var __spreadValues = (a, b) => {
17
19
  return a;
18
20
  };
19
21
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
22
+ var __esm = (fn, res) => function __init() {
23
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
24
+ };
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
38
  var __async = (__this, __arguments, generator) => {
21
39
  return new Promise((resolve, reject) => {
22
40
  var fulfilled = (value) => {
@@ -38,8 +56,465 @@ var __async = (__this, __arguments, generator) => {
38
56
  });
39
57
  };
40
58
 
41
- // src/dive.ts
42
- import { Vector4 } from "three";
59
+ // src/constant/VisibilityLayerMask.ts
60
+ var DEFAULT_LAYER_MASK, COORDINATE_LAYER_MASK, UI_LAYER_MASK, HELPER_LAYER_MASK, PRODUCT_LAYER_MASK;
61
+ var init_VisibilityLayerMask = __esm({
62
+ "src/constant/VisibilityLayerMask.ts"() {
63
+ "use strict";
64
+ DEFAULT_LAYER_MASK = 1;
65
+ COORDINATE_LAYER_MASK = 2;
66
+ UI_LAYER_MASK = 4;
67
+ HELPER_LAYER_MASK = 8;
68
+ PRODUCT_LAYER_MASK = 16;
69
+ }
70
+ });
71
+
72
+ // src/interface/Draggable.ts
73
+ var isDraggable, findDraggableInterface;
74
+ var init_Draggable = __esm({
75
+ "src/interface/Draggable.ts"() {
76
+ "use strict";
77
+ isDraggable = (object) => {
78
+ return "isDraggable" in object;
79
+ };
80
+ findDraggableInterface = (child) => {
81
+ if (child === void 0) return void 0;
82
+ if (child.parent === null) {
83
+ return void 0;
84
+ }
85
+ if (isDraggable(child)) {
86
+ return child;
87
+ }
88
+ return findDraggableInterface(child.parent);
89
+ };
90
+ }
91
+ });
92
+
93
+ // src/interface/Hoverable.ts
94
+ var isHoverable, findHoverableInterface;
95
+ var init_Hoverable = __esm({
96
+ "src/interface/Hoverable.ts"() {
97
+ "use strict";
98
+ isHoverable = (object) => {
99
+ return "isHoverable" in object;
100
+ };
101
+ findHoverableInterface = (child) => {
102
+ if (child === void 0) return void 0;
103
+ if (child.parent === null) {
104
+ return void 0;
105
+ }
106
+ if (isHoverable(child)) {
107
+ return child;
108
+ }
109
+ return findHoverableInterface(child.parent);
110
+ };
111
+ }
112
+ });
113
+
114
+ // src/toolbox/BaseTool.ts
115
+ import { Raycaster, Vector2, Vector3 } from "three";
116
+ var DIVEBaseTool;
117
+ var init_BaseTool = __esm({
118
+ "src/toolbox/BaseTool.ts"() {
119
+ "use strict";
120
+ init_VisibilityLayerMask();
121
+ init_Draggable();
122
+ init_Hoverable();
123
+ DIVEBaseTool = class {
124
+ constructor(scene, controller) {
125
+ this.POINTER_DRAG_THRESHOLD = 1e-3;
126
+ this.name = "BaseTool";
127
+ this._canvas = controller.domElement;
128
+ this._scene = scene;
129
+ this._controller = controller;
130
+ this._pointer = new Vector2();
131
+ this._pointerPrimaryDown = false;
132
+ this._pointerMiddleDown = false;
133
+ this._pointerSecondaryDown = false;
134
+ this._lastPointerDown = new Vector2();
135
+ this._lastPointerUp = new Vector2();
136
+ this._raycaster = new Raycaster();
137
+ this._raycaster.layers.mask = PRODUCT_LAYER_MASK | UI_LAYER_MASK;
138
+ this._intersects = [];
139
+ this._hovered = null;
140
+ this._dragging = false;
141
+ this._dragStart = new Vector3();
142
+ this._dragCurrent = new Vector3();
143
+ this._dragEnd = new Vector3();
144
+ this._dragDelta = new Vector3();
145
+ this._draggable = null;
146
+ this._dragRaycastOnObjects = null;
147
+ }
148
+ get _pointerAnyDown() {
149
+ return this._pointerPrimaryDown || this._pointerMiddleDown || this._pointerSecondaryDown;
150
+ }
151
+ Activate() {
152
+ }
153
+ Deactivate() {
154
+ }
155
+ onPointerDown(e) {
156
+ var _a;
157
+ switch (e.button) {
158
+ case 0:
159
+ this._pointerPrimaryDown = true;
160
+ break;
161
+ case 1:
162
+ this._pointerMiddleDown = true;
163
+ break;
164
+ case 2:
165
+ this._pointerSecondaryDown = true;
166
+ break;
167
+ }
168
+ this._lastPointerDown.copy(this._pointer);
169
+ this._draggable = findDraggableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object) || null;
170
+ }
171
+ onDragStart(e) {
172
+ if (!this._draggable) return;
173
+ if (this._dragRaycastOnObjects !== null) {
174
+ this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
175
+ }
176
+ if (this._intersects.length === 0) return;
177
+ this._dragStart.copy(this._intersects[0].point.clone());
178
+ this._dragCurrent.copy(this._intersects[0].point.clone());
179
+ this._dragEnd.copy(this._dragStart.clone());
180
+ this._dragDelta.set(0, 0, 0);
181
+ if (this._draggable && this._draggable.onDragStart) {
182
+ this._draggable.onDragStart({
183
+ dragStart: this._dragStart,
184
+ dragCurrent: this._dragCurrent,
185
+ dragEnd: this._dragEnd,
186
+ dragDelta: this._dragDelta
187
+ });
188
+ this._dragging = true;
189
+ this._controller.enabled = false;
190
+ }
191
+ }
192
+ onPointerMove(e) {
193
+ var _a;
194
+ this._pointer.x = e.offsetX / this._canvas.clientWidth * 2 - 1;
195
+ this._pointer.y = -(e.offsetY / this._canvas.clientHeight) * 2 + 1;
196
+ this._raycaster.setFromCamera(this._pointer, this._controller.object);
197
+ this._intersects = this.raycast(this._scene.children);
198
+ const hoverable = findHoverableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object);
199
+ if (this._intersects[0] && hoverable) {
200
+ if (!this._hovered) {
201
+ if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
202
+ this._hovered = hoverable;
203
+ return;
204
+ }
205
+ if (this._hovered.uuid !== hoverable.uuid) {
206
+ if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
207
+ if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
208
+ this._hovered = hoverable;
209
+ return;
210
+ }
211
+ if (hoverable.onPointerOver) hoverable.onPointerOver(this._intersects[0]);
212
+ this._hovered = hoverable;
213
+ } else {
214
+ if (this._hovered) {
215
+ if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
216
+ }
217
+ this._hovered = null;
218
+ }
219
+ if (this._pointerAnyDown) {
220
+ if (!this._dragging) {
221
+ this.onDragStart(e);
222
+ }
223
+ this.onDrag(e);
224
+ }
225
+ }
226
+ onDrag(e) {
227
+ if (this._dragRaycastOnObjects !== null) {
228
+ this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
229
+ }
230
+ const intersect = this._intersects[0];
231
+ if (!intersect) return;
232
+ this._dragCurrent.copy(intersect.point.clone());
233
+ this._dragEnd.copy(intersect.point.clone());
234
+ this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
235
+ if (this._draggable && this._draggable.onDrag) {
236
+ this._draggable.onDrag({
237
+ dragStart: this._dragStart,
238
+ dragCurrent: this._dragCurrent,
239
+ dragEnd: this._dragEnd,
240
+ dragDelta: this._dragDelta
241
+ });
242
+ }
243
+ }
244
+ onPointerUp(e) {
245
+ if (this.pointerWasDragged() || this._dragging) {
246
+ if (this._draggable) {
247
+ this.onDragEnd(e);
248
+ }
249
+ } else {
250
+ this.onClick(e);
251
+ }
252
+ switch (e.button) {
253
+ case 0:
254
+ this._pointerPrimaryDown = false;
255
+ break;
256
+ case 1:
257
+ this._pointerMiddleDown = false;
258
+ break;
259
+ case 2:
260
+ this._pointerSecondaryDown = false;
261
+ break;
262
+ }
263
+ this._lastPointerUp.copy(this._pointer);
264
+ }
265
+ onClick(e) {
266
+ }
267
+ onDragEnd(e) {
268
+ const intersect = this._intersects[0];
269
+ if (intersect) {
270
+ this._dragEnd.copy(intersect.point.clone());
271
+ this._dragCurrent.copy(intersect.point.clone());
272
+ this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
273
+ }
274
+ if (this._draggable && this._draggable.onDragEnd) {
275
+ this._draggable.onDragEnd({
276
+ dragStart: this._dragStart,
277
+ dragCurrent: this._dragCurrent,
278
+ dragEnd: this._dragEnd,
279
+ dragDelta: this._dragDelta
280
+ });
281
+ }
282
+ this._draggable = null;
283
+ this._dragging = false;
284
+ this._dragStart.set(0, 0, 0);
285
+ this._dragCurrent.set(0, 0, 0);
286
+ this._dragEnd.set(0, 0, 0);
287
+ this._dragDelta.set(0, 0, 0);
288
+ this._controller.enabled = true;
289
+ }
290
+ onWheel(e) {
291
+ }
292
+ raycast(objects) {
293
+ if (objects !== void 0) return this._raycaster.intersectObjects(objects, true).filter((i) => i.object.visible);
294
+ return this._raycaster.intersectObjects(this._scene.children, true).filter((i) => i.object.visible);
295
+ }
296
+ pointerWasDragged() {
297
+ return this._lastPointerDown.distanceTo(this._pointer) > this.POINTER_DRAG_THRESHOLD;
298
+ }
299
+ };
300
+ }
301
+ });
302
+
303
+ // src/toolbox/transform/TransformTool.ts
304
+ import { TransformControls } from "three/examples/jsm/Addons";
305
+ var DIVETransformTool;
306
+ var init_TransformTool = __esm({
307
+ "src/toolbox/transform/TransformTool.ts"() {
308
+ "use strict";
309
+ init_BaseTool();
310
+ DIVETransformTool = class extends DIVEBaseTool {
311
+ constructor(scene, controller) {
312
+ super(scene, controller);
313
+ this.isTransformTool = true;
314
+ this.name = "DIVETransformTool";
315
+ this._gizmo = new TransformControls(this._controller.object, this._controller.domElement);
316
+ this._gizmo.mode = "translate";
317
+ this._gizmo.addEventListener("mouseDown", () => {
318
+ controller.enabled = false;
319
+ });
320
+ this._gizmo.addEventListener("mouseUp", () => {
321
+ controller.enabled = true;
322
+ });
323
+ this._gizmo.addEventListener("objectChange", () => {
324
+ if (!this._gizmo.object) return;
325
+ if (!("isMoveable" in this._gizmo.object)) return;
326
+ if (!("onMove" in this._gizmo.object)) return;
327
+ this._gizmo.object.onMove();
328
+ });
329
+ scene.add(this._gizmo);
330
+ }
331
+ Activate() {
332
+ }
333
+ SetGizmoMode(mode) {
334
+ this._gizmo.mode = mode;
335
+ }
336
+ SetGizmoVisibility(active) {
337
+ const contains = this._scene.children.includes(this._gizmo);
338
+ if (active && !contains) {
339
+ this._scene.add(this._gizmo);
340
+ } else if (!active && contains) {
341
+ this._scene.remove(this._gizmo);
342
+ }
343
+ }
344
+ // public onPointerDown(e: PointerEvent): void {
345
+ // super.onPointerDown(e);
346
+ // // if (this._hovered) {
347
+ // // this._dragRaycastOnObjects = this._gizmo.gizmoPlane.children;
348
+ // // }
349
+ // }
350
+ // protected raycast(): Intersection[] {
351
+ // return super.raycast(this._gizmo.gizmoNode.children);
352
+ // }
353
+ };
354
+ }
355
+ });
356
+
357
+ // src/interface/Selectable.ts
358
+ function isSelectable(object) {
359
+ return "isSelectable" in object;
360
+ }
361
+ function findSelectableInterface(child) {
362
+ if (child === void 0) return void 0;
363
+ if (child.parent === null) {
364
+ return void 0;
365
+ }
366
+ if (isSelectable(child)) {
367
+ return child;
368
+ }
369
+ return findSelectableInterface(child.parent);
370
+ }
371
+ var init_Selectable = __esm({
372
+ "src/interface/Selectable.ts"() {
373
+ "use strict";
374
+ }
375
+ });
376
+
377
+ // src/toolbox/select/SelectTool.ts
378
+ var SelectTool_exports = {};
379
+ __export(SelectTool_exports, {
380
+ DIVESelectTool: () => DIVESelectTool,
381
+ isSelectTool: () => isSelectTool
382
+ });
383
+ var isSelectTool, DIVESelectTool;
384
+ var init_SelectTool = __esm({
385
+ "src/toolbox/select/SelectTool.ts"() {
386
+ "use strict";
387
+ init_TransformTool();
388
+ init_Selectable();
389
+ isSelectTool = (tool) => {
390
+ return tool.isSelectTool !== void 0;
391
+ };
392
+ DIVESelectTool = class extends DIVETransformTool {
393
+ constructor(scene, controller) {
394
+ super(scene, controller);
395
+ this.isSelectTool = true;
396
+ this.name = "SelectTool";
397
+ }
398
+ Activate() {
399
+ }
400
+ Select(selectable) {
401
+ if (selectable.onSelect) selectable.onSelect();
402
+ this.AttachGizmo(selectable);
403
+ }
404
+ Deselect(selectable) {
405
+ if (selectable.onDeselect) selectable.onDeselect();
406
+ this.DetachGizmo();
407
+ }
408
+ AttachGizmo(selectable) {
409
+ if ("isMoveable" in selectable) {
410
+ const movable = selectable;
411
+ this._gizmo.attach(movable);
412
+ this.SetGizmoVisibility(movable.visible);
413
+ }
414
+ }
415
+ DetachGizmo() {
416
+ this._gizmo.detach();
417
+ }
418
+ onClick(e) {
419
+ super.onClick(e);
420
+ const first = this._raycaster.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];
421
+ const selectable = findSelectableInterface(first == null ? void 0 : first.object);
422
+ if (!first || !selectable) {
423
+ if (this._gizmo.object) {
424
+ this.Deselect(this._gizmo.object);
425
+ }
426
+ return;
427
+ }
428
+ if (this._gizmo.object) {
429
+ if (this._gizmo.object.uuid === selectable.uuid) return;
430
+ this.Deselect(this._gizmo.object);
431
+ }
432
+ this.Select(selectable);
433
+ }
434
+ };
435
+ }
436
+ });
437
+
438
+ // src/camera/PerspectiveCamera.ts
439
+ import { PerspectiveCamera } from "three";
440
+ var DIVEPerspectiveCameraDefaultSettings, _DIVEPerspectiveCamera, DIVEPerspectiveCamera;
441
+ var init_PerspectiveCamera = __esm({
442
+ "src/camera/PerspectiveCamera.ts"() {
443
+ "use strict";
444
+ init_VisibilityLayerMask();
445
+ DIVEPerspectiveCameraDefaultSettings = {
446
+ fov: 80,
447
+ near: 0.1,
448
+ far: 1e3
449
+ };
450
+ _DIVEPerspectiveCamera = class _DIVEPerspectiveCamera extends PerspectiveCamera {
451
+ constructor(settings = DIVEPerspectiveCameraDefaultSettings) {
452
+ super(settings.fov, 1, settings.near, settings.far);
453
+ this.onSetCameraLayer = () => {
454
+ };
455
+ this.layers.mask = _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
456
+ }
457
+ OnResize(width, height) {
458
+ this.aspect = width / height;
459
+ this.updateProjectionMatrix();
460
+ }
461
+ SetCameraLayer(layer) {
462
+ this.layers.mask = layer === "LIVE" ? _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
463
+ this.onSetCameraLayer(this.layers.mask);
464
+ }
465
+ };
466
+ _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;
467
+ _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;
468
+ DIVEPerspectiveCamera = _DIVEPerspectiveCamera;
469
+ }
470
+ });
471
+
472
+ // src/mediacreator/MediaCreator.ts
473
+ var MediaCreator_exports = {};
474
+ __export(MediaCreator_exports, {
475
+ DIVEMediaCreator: () => DIVEMediaCreator
476
+ });
477
+ var DIVEMediaCreator;
478
+ var init_MediaCreator = __esm({
479
+ "src/mediacreator/MediaCreator.ts"() {
480
+ "use strict";
481
+ init_PerspectiveCamera();
482
+ DIVEMediaCreator = class {
483
+ constructor(renderer, scene, controller) {
484
+ this.renderer = renderer;
485
+ this.scene = scene;
486
+ this.controller = controller;
487
+ }
488
+ GenerateMedia(position, target, width, height) {
489
+ const resetPosition = this.controller.object.position.clone();
490
+ const resetRotation = this.controller.object.quaternion.clone();
491
+ this.renderer.OnResize(width, height);
492
+ this.controller.object.OnResize(width, height);
493
+ this.controller.object.position.copy(position);
494
+ this.controller.target.copy(target);
495
+ this.controller.update();
496
+ const dataUri = this.DrawCanvas().toDataURL();
497
+ this.controller.object.position.copy(resetPosition);
498
+ this.controller.object.quaternion.copy(resetRotation);
499
+ return dataUri;
500
+ }
501
+ DrawCanvas(canvasElement) {
502
+ const restore = this.renderer.domElement;
503
+ if (canvasElement) {
504
+ this.renderer.domElement = canvasElement;
505
+ }
506
+ this.controller.object.layers.mask = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;
507
+ this.renderer.render(this.scene, this.controller.object);
508
+ this.controller.object.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
509
+ const returnCanvas = this.renderer.domElement;
510
+ if (canvasElement) {
511
+ this.renderer.domElement = restore;
512
+ }
513
+ return returnCanvas;
514
+ }
515
+ };
516
+ }
517
+ });
43
518
 
44
519
  // src/renderer/Renderer.ts
45
520
  import { MathUtils, NoToneMapping, PCFSoftShadowMap, WebGLRenderer } from "three";
@@ -71,6 +546,11 @@ var DIVERenderer = class extends WebGLRenderer {
71
546
  this.toneMapping = rendererSettings.toneMapping;
72
547
  this.debug.checkShaderErrors = false;
73
548
  }
549
+ // Stops renderings and disposes the renderer.
550
+ Dispose() {
551
+ this.StopRenderer();
552
+ this.dispose();
553
+ }
74
554
  // Starts the renderer with the given scene and camera.
75
555
  StartRenderer(scene, cam) {
76
556
  this.setAnimationLoop(() => {
@@ -162,25 +642,17 @@ var DIVERenderer = class extends WebGLRenderer {
162
642
  };
163
643
 
164
644
  // src/scene/Scene.ts
165
- import { Color as Color7, Scene as Scene2 } from "three";
645
+ import { Color as Color6, Scene as Scene2 } from "three";
166
646
 
167
647
  // src/scene/root/Root.ts
168
- import { Object3D as Object3D8 } from "three";
648
+ import { Box3 as Box32, Object3D as Object3D9 } from "three";
169
649
 
170
650
  // src/scene/root/lightroot/LightRoot.ts
171
- import { Color as Color5, Object3D as Object3D4 } from "three";
651
+ import { Color as Color4, Object3D as Object3D5 } from "three";
172
652
 
173
653
  // src/light/AmbientLight.ts
654
+ init_VisibilityLayerMask();
174
655
  import { AmbientLight, Object3D } from "three";
175
-
176
- // src/constant/VisibilityLayerMask.ts
177
- var DEFAULT_LAYER_MASK = 1;
178
- var COORDINATE_LAYER_MASK = 2;
179
- var UI_LAYER_MASK = 4;
180
- var HELPER_LAYER_MASK = 8;
181
- var PRODUCT_LAYER_MASK = 16;
182
-
183
- // src/light/AmbientLight.ts
184
656
  var DIVEAmbientLight = class extends Object3D {
185
657
  constructor() {
186
658
  super();
@@ -201,25 +673,34 @@ var DIVEAmbientLight = class extends Object3D {
201
673
  };
202
674
 
203
675
  // src/light/PointLight.ts
204
- import { PointLight, SphereGeometry, MeshBasicMaterial, Mesh, FrontSide, Object3D as Object3D2 } from "three";
676
+ import { PointLight, SphereGeometry, MeshBasicMaterial, Mesh, FrontSide, Object3D as Object3D3 } from "three";
205
677
 
206
678
  // src/com/Communication.ts
207
- import { MathUtils as MathUtils2 } from "three";
679
+ init_SelectTool();
680
+ import { generateUUID } from "three/src/math/MathUtils";
208
681
  var _DIVECommunication = class _DIVECommunication {
209
- constructor(scene, controls, toolbox, mediaGenerator) {
682
+ constructor(renderer, scene, controls, toolbox) {
210
683
  this.registered = /* @__PURE__ */ new Map();
211
684
  // private listeners: { [key: string]: EventListener[] } = {};
212
685
  this.listeners = /* @__PURE__ */ new Map();
213
- this.id = MathUtils2.generateUUID();
686
+ this.id = generateUUID();
687
+ this.renderer = renderer;
214
688
  this.scene = scene;
215
689
  this.controller = controls;
216
690
  this.toolbox = toolbox;
217
- this.mediaGenerator = mediaGenerator;
691
+ this._mediaGenerator = null;
218
692
  _DIVECommunication.__instances.push(this);
219
693
  }
220
694
  static get(id) {
221
695
  return this.__instances.find((instance) => Array.from(instance.registered.values()).find((object) => object.id === id));
222
696
  }
697
+ get mediaGenerator() {
698
+ if (!this._mediaGenerator) {
699
+ const DIVEMediaCreator2 = (init_MediaCreator(), __toCommonJS(MediaCreator_exports)).default;
700
+ this._mediaGenerator = new DIVEMediaCreator2(this.renderer, this.scene, this.controller);
701
+ }
702
+ return this._mediaGenerator;
703
+ }
223
704
  DestroyInstance() {
224
705
  const existingIndex = _DIVECommunication.__instances.findIndex((entry) => entry.id === this.id);
225
706
  if (existingIndex === -1) return false;
@@ -289,6 +770,10 @@ var _DIVECommunication = class _DIVECommunication {
289
770
  returnValue = this.resetCamera(payload);
290
771
  break;
291
772
  }
773
+ case "COMPUTE_ENCOMPASSING_VIEW": {
774
+ returnValue = this.computeEncompassingView(payload);
775
+ break;
776
+ }
292
777
  case "SET_CAMERA_LAYER": {
293
778
  returnValue = this.setCameraLayer(payload);
294
779
  break;
@@ -399,8 +884,10 @@ var _DIVECommunication = class _DIVECommunication {
399
884
  const sceneObject = this.scene.GetSceneObject(object);
400
885
  if (!sceneObject) return false;
401
886
  if (!("isSelectable" in sceneObject)) return false;
402
- this.toolbox.UseTool("select");
403
- this.toolbox.GetActiveTool().AttachGizmo(sceneObject);
887
+ const activeTool = this.toolbox.GetActiveTool();
888
+ if (activeTool && isSelectTool(activeTool)) {
889
+ activeTool.AttachGizmo(sceneObject);
890
+ }
404
891
  Object.assign(payload, object);
405
892
  return true;
406
893
  }
@@ -410,8 +897,10 @@ var _DIVECommunication = class _DIVECommunication {
410
897
  const sceneObject = this.scene.GetSceneObject(object);
411
898
  if (!sceneObject) return false;
412
899
  if (!("isSelectable" in sceneObject)) return false;
413
- this.toolbox.UseTool("select");
414
- this.toolbox.GetActiveTool().DetachGizmo();
900
+ const activeTool = this.toolbox.GetActiveTool();
901
+ if (activeTool && isSelectTool(activeTool)) {
902
+ activeTool.DetachGizmo();
903
+ }
415
904
  Object.assign(payload, object);
416
905
  return true;
417
906
  }
@@ -466,6 +955,12 @@ var _DIVECommunication = class _DIVECommunication {
466
955
  this.controller.RevertLast(payload.duration);
467
956
  return true;
468
957
  }
958
+ computeEncompassingView(payload) {
959
+ const sceneBB = this.scene.ComputeSceneBB();
960
+ const transform = this.controller.ComputeEncompassingView(sceneBB);
961
+ Object.assign(payload, transform);
962
+ return transform;
963
+ }
469
964
  zoomCamera(payload) {
470
965
  if (payload.direction === "IN") this.controller.ZoomIn(payload.by);
471
966
  if (payload.direction === "OUT") this.controller.ZoomOut(payload.by);
@@ -486,10 +981,12 @@ var _DIVECommunication = class _DIVECommunication {
486
981
  updateScene(payload) {
487
982
  if (payload.name !== void 0) this.scene.name = payload.name;
488
983
  if (payload.backgroundColor !== void 0) this.scene.SetBackground(payload.backgroundColor);
984
+ if (payload.gridEnabled !== void 0) this.scene.Root.Grid.SetVisibility(payload.gridEnabled);
489
985
  if (payload.floorEnabled !== void 0) this.scene.Root.Floor.SetVisibility(payload.floorEnabled);
490
986
  if (payload.floorColor !== void 0) this.scene.Root.Floor.SetColor(payload.floorColor);
491
987
  payload.name = this.scene.name;
492
988
  payload.backgroundColor = "#" + this.scene.background.getHexString();
989
+ payload.gridEnabled = this.scene.Root.Grid.visible;
493
990
  payload.floorEnabled = this.scene.Root.Floor.visible;
494
991
  payload.floorColor = "#" + this.scene.Root.Floor.material.color.getHexString();
495
992
  return true;
@@ -512,7 +1009,8 @@ _DIVECommunication.__instances = [];
512
1009
  var DIVECommunication = _DIVECommunication;
513
1010
 
514
1011
  // src/light/PointLight.ts
515
- var DIVEPointLight = class extends Object3D2 {
1012
+ init_VisibilityLayerMask();
1013
+ var DIVEPointLight = class extends Object3D3 {
516
1014
  constructor() {
517
1015
  super();
518
1016
  this.isMoveable = true;
@@ -558,8 +1056,9 @@ var DIVEPointLight = class extends Object3D2 {
558
1056
  };
559
1057
 
560
1058
  // src/light/SceneLight.ts
561
- import { DirectionalLight, HemisphereLight, Object3D as Object3D3 } from "three";
562
- var DIVESceneLight = class extends Object3D3 {
1059
+ init_VisibilityLayerMask();
1060
+ import { DirectionalLight, HemisphereLight, Object3D as Object3D4 } from "three";
1061
+ var DIVESceneLight = class extends Object3D4 {
563
1062
  constructor() {
564
1063
  super();
565
1064
  this.name = "DIVESceneLight";
@@ -597,7 +1096,7 @@ var DIVESceneLight = class extends Object3D3 {
597
1096
  };
598
1097
 
599
1098
  // src/scene/root/lightroot/LightRoot.ts
600
- var DIVELightRoot = class extends Object3D4 {
1099
+ var DIVELightRoot = class extends Object3D5 {
601
1100
  constructor() {
602
1101
  super();
603
1102
  this.name = "LightRoot";
@@ -641,7 +1140,7 @@ var DIVELightRoot = class extends Object3D4 {
641
1140
  if (light.position !== void 0 && light.position !== null) sceneObject.position.set(light.position.x, light.position.y, light.position.z);
642
1141
  if (light.intensity !== void 0 && light.intensity !== null) sceneObject.SetIntensity(light.intensity);
643
1142
  if (light.enabled !== void 0 && light.enabled !== null) sceneObject.SetEnabled(light.enabled);
644
- if (light.color !== void 0 && light.color !== null) sceneObject.SetColor(new Color5(light.color));
1143
+ if (light.color !== void 0 && light.color !== null) sceneObject.SetColor(new Color4(light.color));
645
1144
  if (light.visible !== void 0 && light.visible !== null) sceneObject.visible = light.visible;
646
1145
  }
647
1146
  DeleteLight(light) {
@@ -672,10 +1171,11 @@ var DIVELightRoot = class extends Object3D4 {
672
1171
  };
673
1172
 
674
1173
  // src/scene/root/modelroot/ModelRoot.ts
675
- import { Object3D as Object3D6 } from "three";
1174
+ import { Object3D as Object3D7 } from "three";
676
1175
 
677
1176
  // src/model/Model.ts
678
- import { Box3, Object3D as Object3D5, Raycaster, Vector3 } from "three";
1177
+ init_VisibilityLayerMask();
1178
+ import { Box3, Object3D as Object3D6, Raycaster as Raycaster2, Vector3 as Vector32 } from "three";
679
1179
 
680
1180
  // src/helper/findSceneRecursive/findSceneRecursive.ts
681
1181
  var findSceneRecursive = (object) => {
@@ -686,7 +1186,7 @@ var findSceneRecursive = (object) => {
686
1186
  };
687
1187
 
688
1188
  // src/model/Model.ts
689
- var DIVEModel = class extends Object3D5 {
1189
+ var DIVEModel = class extends Object3D6 {
690
1190
  constructor() {
691
1191
  super();
692
1192
  this.isSelectable = true;
@@ -709,7 +1209,7 @@ var DIVEModel = class extends Object3D5 {
709
1209
  this.position.set(position.x, position.y, position.z);
710
1210
  }
711
1211
  SetRotation(rotation) {
712
- this.rotation.setFromVector3(new Vector3(rotation.x, rotation.y, rotation.z));
1212
+ this.rotation.setFromVector3(new Vector32(rotation.x, rotation.y, rotation.z));
713
1213
  }
714
1214
  SetScale(scale) {
715
1215
  this.scale.set(scale.x, scale.y, scale.z);
@@ -736,9 +1236,9 @@ var DIVEModel = class extends Object3D5 {
736
1236
  return;
737
1237
  }
738
1238
  const bottomY = this.boundingBox.min.y * this.scale.y;
739
- const bbBottomCenter = this.localToWorld(this.boundingBox.getCenter(new Vector3()).multiply(this.scale));
1239
+ const bbBottomCenter = this.localToWorld(this.boundingBox.getCenter(new Vector32()).multiply(this.scale));
740
1240
  bbBottomCenter.y = bottomY + this.position.y;
741
- const raycaster = new Raycaster(bbBottomCenter, new Vector3(0, -1, 0));
1241
+ const raycaster = new Raycaster2(bbBottomCenter, new Vector32(0, -1, 0));
742
1242
  raycaster.layers.mask = PRODUCT_LAYER_MASK;
743
1243
  const intersections = raycaster.intersectObjects(findSceneRecursive(this).Root.children, true);
744
1244
  if (intersections.length > 0) {
@@ -747,7 +1247,7 @@ var DIVEModel = class extends Object3D5 {
747
1247
  const meshBB = mesh.geometry.boundingBox;
748
1248
  const worldPos = mesh.localToWorld(meshBB.max.clone());
749
1249
  const oldPos = this.position.clone();
750
- const newPos = this.position.clone().setY(worldPos.y).add(new Vector3(0, bottomY, 0));
1250
+ const newPos = this.position.clone().setY(worldPos.y).add(new Vector32(0, bottomY, 0));
751
1251
  this.position.copy(newPos);
752
1252
  if (this.position.y === oldPos.y) return;
753
1253
  (_a = DIVECommunication.get(this.userData.id)) == null ? void 0 : _a.PerformAction("UPDATE_OBJECT", { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });
@@ -800,7 +1300,7 @@ var DIVELoadingManager = class {
800
1300
  };
801
1301
 
802
1302
  // src/scene/root/modelroot/ModelRoot.ts
803
- var DIVEModelRoot = class extends Object3D6 {
1303
+ var DIVEModelRoot = class extends Object3D7 {
804
1304
  constructor() {
805
1305
  super();
806
1306
  this.name = "ModelRoot";
@@ -869,10 +1369,11 @@ var DIVEModelRoot = class extends Object3D6 {
869
1369
  };
870
1370
 
871
1371
  // src/primitive/floor/Floor.ts
872
- import { Color as Color6, Mesh as Mesh2, MeshStandardMaterial as MeshStandardMaterial2, PlaneGeometry } from "three";
1372
+ init_VisibilityLayerMask();
1373
+ import { Color as Color5, Mesh as Mesh2, MeshStandardMaterial, PlaneGeometry } from "three";
873
1374
  var DIVEFloor = class extends Mesh2 {
874
1375
  constructor() {
875
- super(new PlaneGeometry(1e4, 1e4), new MeshStandardMaterial2({ color: new Color6(150 / 255, 150 / 255, 150 / 255) }));
1376
+ super(new PlaneGeometry(1e4, 1e4), new MeshStandardMaterial({ color: new Color5(150 / 255, 150 / 255, 150 / 255) }));
876
1377
  this.isFloor = true;
877
1378
  this.name = "Floor";
878
1379
  this.layers.mask = PRODUCT_LAYER_MASK;
@@ -883,7 +1384,7 @@ var DIVEFloor = class extends Mesh2 {
883
1384
  this.visible = visible;
884
1385
  }
885
1386
  SetColor(color) {
886
- this.material.color = new Color6(color);
1387
+ this.material.color = new Color5(color);
887
1388
  }
888
1389
  };
889
1390
 
@@ -892,8 +1393,9 @@ var GRID_CENTER_LINE_COLOR = "#888888";
892
1393
  var GRID_SIDE_LINE_COLOR = "#dddddd";
893
1394
 
894
1395
  // src/grid/Grid.ts
895
- import { GridHelper, Object3D as Object3D7 } from "three";
896
- var DIVEGrid = class extends Object3D7 {
1396
+ init_VisibilityLayerMask();
1397
+ import { GridHelper, Object3D as Object3D8 } from "three";
1398
+ var DIVEGrid = class extends Object3D8 {
897
1399
  constructor() {
898
1400
  super();
899
1401
  this.name = "Grid";
@@ -902,10 +1404,13 @@ var DIVEGrid = class extends Object3D7 {
902
1404
  grid.layers.mask = HELPER_LAYER_MASK;
903
1405
  this.add(grid);
904
1406
  }
1407
+ SetVisibility(visible) {
1408
+ this.visible = visible;
1409
+ }
905
1410
  };
906
1411
 
907
1412
  // src/scene/root/Root.ts
908
- var DIVERoot = class extends Object3D8 {
1413
+ var DIVERoot = class extends Object3D9 {
909
1414
  get Floor() {
910
1415
  return this.floor;
911
1416
  }
@@ -924,6 +1429,15 @@ var DIVERoot = class extends Object3D8 {
924
1429
  this.grid = new DIVEGrid();
925
1430
  this.add(this.grid);
926
1431
  }
1432
+ ComputeSceneBB() {
1433
+ const bb = new Box32();
1434
+ this.modelRoot.traverse((object) => {
1435
+ if ("isObject3D" in object) {
1436
+ bb.expandByObject(object);
1437
+ }
1438
+ });
1439
+ return bb;
1440
+ }
927
1441
  GetSceneObject(object) {
928
1442
  switch (object.entityType) {
929
1443
  case "pov": {
@@ -994,11 +1508,15 @@ var DIVEScene = class extends Scene2 {
994
1508
  }
995
1509
  constructor() {
996
1510
  super();
1511
+ this.background = new Color6(16777215);
997
1512
  this.root = new DIVERoot();
998
1513
  this.add(this.root);
999
1514
  }
1000
1515
  SetBackground(color) {
1001
- this.background = new Color7(color);
1516
+ this.background = new Color6(color);
1517
+ }
1518
+ ComputeSceneBB() {
1519
+ return this.Root.ComputeSceneBB();
1002
1520
  }
1003
1521
  GetSceneObject(object) {
1004
1522
  return this.Root.GetSceneObject(object);
@@ -1017,36 +1535,12 @@ var DIVEScene = class extends Scene2 {
1017
1535
  }
1018
1536
  };
1019
1537
 
1020
- // src/camera/PerspectiveCamera.ts
1021
- import { PerspectiveCamera } from "three";
1022
- var DIVEPerspectiveCameraDefaultSettings = {
1023
- fov: 80,
1024
- near: 0.1,
1025
- far: 1e3
1026
- };
1027
- var _DIVEPerspectiveCamera = class _DIVEPerspectiveCamera extends PerspectiveCamera {
1028
- constructor(settings = DIVEPerspectiveCameraDefaultSettings) {
1029
- super(settings.fov, 1, settings.near, settings.far);
1030
- this.onSetCameraLayer = () => {
1031
- };
1032
- this.layers.mask = _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1033
- }
1034
- OnResize(width, height) {
1035
- this.aspect = width / height;
1036
- this.updateProjectionMatrix();
1037
- }
1038
- SetCameraLayer(layer) {
1039
- this.layers.mask = layer === "LIVE" ? _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1040
- this.onSetCameraLayer(this.layers.mask);
1041
- }
1042
- };
1043
- _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;
1044
- _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;
1045
- var DIVEPerspectiveCamera = _DIVEPerspectiveCamera;
1538
+ // src/dive.ts
1539
+ init_PerspectiveCamera();
1046
1540
 
1047
1541
  // src/controls/OrbitControls.ts
1048
1542
  import { OrbitControls } from "three/examples/jsm/Addons.js";
1049
- import { MathUtils as MathUtils3 } from "three";
1543
+ import { MathUtils as MathUtils2, Vector3 as Vector33 } from "three";
1050
1544
  import { Easing, Tween } from "@tweenjs/tween.js";
1051
1545
  var DIVEOrbitControlsDefaultSettings = {
1052
1546
  enableDamping: true,
@@ -1074,10 +1568,20 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends OrbitControls {
1074
1568
  this.enableDamping = settings.enableDamping;
1075
1569
  this.dampingFactor = settings.dampingFactor;
1076
1570
  }
1571
+ ComputeEncompassingView(bb) {
1572
+ const center = bb.getCenter(new Vector33());
1573
+ const size = bb.getSize(new Vector33());
1574
+ const distance = Math.max(size.x, size.y, size.z) * 1.25;
1575
+ const direction = this.object.position.clone().normalize();
1576
+ return {
1577
+ position: direction.multiplyScalar(distance),
1578
+ target: center
1579
+ };
1580
+ }
1077
1581
  ZoomIn(by) {
1078
1582
  const zoomBy = by || _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;
1079
1583
  const { minDistance, maxDistance } = this;
1080
- this.minDistance = this.maxDistance = MathUtils3.clamp(this.getDistance() - zoomBy, minDistance + zoomBy, maxDistance - zoomBy);
1584
+ this.minDistance = this.maxDistance = MathUtils2.clamp(this.getDistance() - zoomBy, minDistance + zoomBy, maxDistance - zoomBy);
1081
1585
  this.update();
1082
1586
  this.minDistance = minDistance;
1083
1587
  this.maxDistance = maxDistance;
@@ -1085,7 +1589,7 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends OrbitControls {
1085
1589
  ZoomOut(by) {
1086
1590
  const zoomBy = by || _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;
1087
1591
  const { minDistance, maxDistance } = this;
1088
- this.minDistance = this.maxDistance = MathUtils3.clamp(this.getDistance() + zoomBy, minDistance + zoomBy, maxDistance - zoomBy);
1592
+ this.minDistance = this.maxDistance = MathUtils2.clamp(this.getDistance() + zoomBy, minDistance + zoomBy, maxDistance - zoomBy);
1089
1593
  this.update();
1090
1594
  this.minDistance = minDistance;
1091
1595
  this.maxDistance = maxDistance;
@@ -1134,394 +1638,40 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends OrbitControls {
1134
1638
  _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR = 1;
1135
1639
  var DIVEOrbitControls = _DIVEOrbitControls;
1136
1640
 
1137
- // src/mediacreator/MediaCreator.ts
1138
- var DIVEMediaCreator = class {
1139
- constructor(renderer, scene, controller) {
1140
- this.renderer = renderer;
1141
- this.scene = scene;
1142
- this.controller = controller;
1143
- }
1144
- GenerateMedia(position, target, width, height) {
1145
- const resetPosition = this.controller.object.position.clone();
1146
- const resetRotation = this.controller.object.quaternion.clone();
1147
- this.renderer.OnResize(width, height);
1148
- this.controller.object.OnResize(width, height);
1149
- this.controller.object.position.copy(position);
1150
- this.controller.target.copy(target);
1151
- this.controller.update();
1152
- const dataUri = this.DrawCanvas().toDataURL();
1153
- this.controller.object.position.copy(resetPosition);
1154
- this.controller.object.quaternion.copy(resetRotation);
1155
- return dataUri;
1156
- }
1157
- DrawCanvas(canvasElement) {
1158
- const restore = this.renderer.domElement;
1159
- if (canvasElement) {
1160
- this.renderer.domElement = canvasElement;
1161
- }
1162
- this.controller.object.layers.mask = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;
1163
- this.renderer.render(this.scene, this.controller.object);
1164
- this.controller.object.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1165
- const returnCanvas = this.renderer.domElement;
1166
- if (canvasElement) {
1167
- this.renderer.domElement = restore;
1641
+ // src/toolbox/Toolbox.ts
1642
+ var DIVEToolbox = class {
1643
+ get selectTool() {
1644
+ if (!this._selectTool) {
1645
+ const DIVESelectTool2 = (init_SelectTool(), __toCommonJS(SelectTool_exports)).DIVESelectTool;
1646
+ this._selectTool = new DIVESelectTool2(this._scene, this._controller);
1168
1647
  }
1169
- return returnCanvas;
1648
+ return this._selectTool;
1170
1649
  }
1171
- };
1172
-
1173
- // src/interface/Selectable.ts
1174
- function isSelectable(object) {
1175
- return "isSelectable" in object;
1176
- }
1177
-
1178
- // src/toolbox/BaseTool.ts
1179
- import { Raycaster as Raycaster2, Vector2, Vector3 as Vector32 } from "three";
1180
-
1181
- // src/interface/Draggable.ts
1182
- var isDraggable = (object) => {
1183
- return "isDraggable" in object;
1184
- };
1185
- var findDraggableInterface = (child) => {
1186
- if (child === void 0) return void 0;
1187
- if (child.parent === null) {
1188
- return void 0;
1189
- }
1190
- if (isDraggable(child)) {
1191
- return child;
1192
- }
1193
- return findDraggableInterface(child.parent);
1194
- };
1195
-
1196
- // src/interface/Hoverable.ts
1197
- var isHoverable = (object) => {
1198
- return "isHoverable" in object;
1199
- };
1200
- var findHoverableInterface = (child) => {
1201
- if (child === void 0) return void 0;
1202
- if (child.parent === null) {
1203
- return void 0;
1204
- }
1205
- if (isHoverable(child)) {
1206
- return child;
1207
- }
1208
- return findHoverableInterface(child.parent);
1209
- };
1210
-
1211
- // src/toolbox/BaseTool.ts
1212
- var DIVEBaseTool = class {
1213
1650
  constructor(scene, controller) {
1214
- this.POINTER_DRAG_THRESHOLD = 1e-3;
1215
- this.name = "BaseTool";
1216
- this._canvas = controller.domElement;
1217
1651
  this._scene = scene;
1218
1652
  this._controller = controller;
1219
- this._pointer = new Vector2();
1220
- this._pointerPrimaryDown = false;
1221
- this._pointerMiddleDown = false;
1222
- this._pointerSecondaryDown = false;
1223
- this._lastPointerDown = new Vector2();
1224
- this._lastPointerUp = new Vector2();
1225
- this._raycaster = new Raycaster2();
1226
- this._raycaster.layers.mask = PRODUCT_LAYER_MASK | UI_LAYER_MASK;
1227
- this._intersects = [];
1228
- this._hovered = null;
1229
- this._dragging = false;
1230
- this._dragStart = new Vector32();
1231
- this._dragCurrent = new Vector32();
1232
- this._dragEnd = new Vector32();
1233
- this._dragDelta = new Vector32();
1234
- this._draggable = null;
1235
- this._dragRaycastOnObjects = null;
1236
- }
1237
- get _pointerAnyDown() {
1238
- return this._pointerPrimaryDown || this._pointerMiddleDown || this._pointerSecondaryDown;
1239
- }
1240
- Activate() {
1241
- }
1242
- Deactivate() {
1243
- }
1244
- onPointerDown(e) {
1245
- var _a;
1246
- switch (e.button) {
1247
- case 0:
1248
- this._pointerPrimaryDown = true;
1249
- break;
1250
- case 1:
1251
- this._pointerMiddleDown = true;
1252
- break;
1253
- case 2:
1254
- this._pointerSecondaryDown = true;
1255
- break;
1256
- }
1257
- this._lastPointerDown.copy(this._pointer);
1258
- this._draggable = findDraggableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object) || null;
1259
- }
1260
- onDragStart(e) {
1261
- if (!this._draggable) return;
1262
- if (this._dragRaycastOnObjects !== null) {
1263
- this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
1264
- }
1265
- if (this._intersects.length === 0) return;
1266
- this._dragStart.copy(this._intersects[0].point.clone());
1267
- this._dragCurrent.copy(this._intersects[0].point.clone());
1268
- this._dragEnd.copy(this._dragStart.clone());
1269
- this._dragDelta.set(0, 0, 0);
1270
- if (this._draggable && this._draggable.onDragStart) {
1271
- this._draggable.onDragStart({
1272
- dragStart: this._dragStart,
1273
- dragCurrent: this._dragCurrent,
1274
- dragEnd: this._dragEnd,
1275
- dragDelta: this._dragDelta
1276
- });
1277
- this._dragging = true;
1278
- this._controller.enabled = false;
1279
- }
1280
- }
1281
- onPointerMove(e) {
1282
- var _a;
1283
- this._pointer.x = e.offsetX / this._canvas.clientWidth * 2 - 1;
1284
- this._pointer.y = -(e.offsetY / this._canvas.clientHeight) * 2 + 1;
1285
- this._raycaster.setFromCamera(this._pointer, this._controller.object);
1286
- this._intersects = this.raycast(this._scene.children);
1287
- const hoverable = findHoverableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object);
1288
- if (this._intersects[0] && hoverable) {
1289
- if (!this._hovered) {
1290
- if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
1291
- this._hovered = hoverable;
1292
- return;
1293
- }
1294
- if (this._hovered.uuid !== hoverable.uuid) {
1295
- if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
1296
- if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
1297
- this._hovered = hoverable;
1298
- return;
1299
- }
1300
- if (hoverable.onPointerOver) hoverable.onPointerOver(this._intersects[0]);
1301
- this._hovered = hoverable;
1302
- } else {
1303
- if (this._hovered) {
1304
- if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
1305
- }
1306
- this._hovered = null;
1307
- }
1308
- if (this._pointerAnyDown) {
1309
- if (!this._dragging) {
1310
- this.onDragStart(e);
1311
- }
1312
- this.onDrag(e);
1313
- }
1314
- }
1315
- onDrag(e) {
1316
- if (this._dragRaycastOnObjects !== null) {
1317
- this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
1318
- }
1319
- const intersect = this._intersects[0];
1320
- if (!intersect) return;
1321
- this._dragCurrent.copy(intersect.point.clone());
1322
- this._dragEnd.copy(intersect.point.clone());
1323
- this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
1324
- if (this._draggable && this._draggable.onDrag) {
1325
- this._draggable.onDrag({
1326
- dragStart: this._dragStart,
1327
- dragCurrent: this._dragCurrent,
1328
- dragEnd: this._dragEnd,
1329
- dragDelta: this._dragDelta
1330
- });
1331
- }
1332
- }
1333
- onPointerUp(e) {
1334
- if (this.pointerWasDragged() || this._dragging) {
1335
- if (this._draggable) {
1336
- this.onDragEnd(e);
1337
- }
1338
- } else {
1339
- this.onClick(e);
1340
- }
1341
- switch (e.button) {
1342
- case 0:
1343
- this._pointerPrimaryDown = false;
1344
- break;
1345
- case 1:
1346
- this._pointerMiddleDown = false;
1347
- break;
1348
- case 2:
1349
- this._pointerSecondaryDown = false;
1350
- break;
1351
- }
1352
- this._lastPointerUp.copy(this._pointer);
1353
- }
1354
- onClick(e) {
1355
- }
1356
- onDragEnd(e) {
1357
- const intersect = this._intersects[0];
1358
- if (intersect) {
1359
- this._dragEnd.copy(intersect.point.clone());
1360
- this._dragCurrent.copy(intersect.point.clone());
1361
- this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
1362
- }
1363
- if (this._draggable && this._draggable.onDragEnd) {
1364
- this._draggable.onDragEnd({
1365
- dragStart: this._dragStart,
1366
- dragCurrent: this._dragCurrent,
1367
- dragEnd: this._dragEnd,
1368
- dragDelta: this._dragDelta
1369
- });
1370
- }
1371
- this._draggable = null;
1372
- this._dragging = false;
1373
- this._dragStart.set(0, 0, 0);
1374
- this._dragCurrent.set(0, 0, 0);
1375
- this._dragEnd.set(0, 0, 0);
1376
- this._dragDelta.set(0, 0, 0);
1377
- this._controller.enabled = true;
1378
- }
1379
- onWheel(e) {
1380
- }
1381
- raycast(objects) {
1382
- if (objects !== void 0) return this._raycaster.intersectObjects(objects, true).filter((i) => i.object.visible);
1383
- return this._raycaster.intersectObjects(this._scene.children, true).filter((i) => i.object.visible);
1384
- }
1385
- pointerWasDragged() {
1386
- return this._lastPointerDown.distanceTo(this._pointer) > this.POINTER_DRAG_THRESHOLD;
1653
+ this._selectTool = null;
1654
+ this._activeTool = null;
1387
1655
  }
1388
- };
1389
-
1390
- // src/toolbox/transform/TransformTool.ts
1391
- import { TransformControls } from "three/examples/jsm/Addons";
1392
- var DIVETransformTool = class extends DIVEBaseTool {
1393
- constructor(scene, controller) {
1394
- super(scene, controller);
1395
- this.name = "DIVETransformTool";
1396
- this._gizmo = new TransformControls(this._controller.object, this._controller.domElement);
1397
- this._gizmo.mode = "translate";
1398
- this._gizmo.addEventListener("mouseDown", () => {
1399
- controller.enabled = false;
1400
- });
1401
- this._gizmo.addEventListener("mouseUp", () => {
1402
- controller.enabled = true;
1403
- });
1404
- this._gizmo.addEventListener("objectChange", () => {
1405
- if (!this._gizmo.object) return;
1406
- if (!("isMoveable" in this._gizmo.object)) return;
1407
- if (!("onMove" in this._gizmo.object)) return;
1408
- this._gizmo.object.onMove();
1409
- });
1410
- scene.add(this._gizmo);
1411
- }
1412
- Activate() {
1413
- }
1414
- SetGizmoMode(mode) {
1415
- this._gizmo.mode = mode;
1416
- }
1417
- SetGizmoVisibility(active) {
1418
- const contains = this._scene.children.includes(this._gizmo);
1419
- if (active && !contains) {
1420
- this._scene.add(this._gizmo);
1421
- } else if (!active && contains) {
1422
- this._scene.remove(this._gizmo);
1423
- }
1424
- }
1425
- // public onPointerDown(e: PointerEvent): void {
1426
- // super.onPointerDown(e);
1427
- // // if (this._hovered) {
1428
- // // this._dragRaycastOnObjects = this._gizmo.gizmoPlane.children;
1429
- // // }
1430
- // }
1431
- // protected raycast(): Intersection[] {
1432
- // return super.raycast(this._gizmo.gizmoNode.children);
1433
- // }
1434
- };
1435
-
1436
- // src/toolbox/select/SelectTool.ts
1437
- var DIVESelectTool = class extends DIVETransformTool {
1438
- constructor(scene, controller) {
1439
- super(scene, controller);
1440
- this.name = "SelectTool";
1441
- }
1442
- Activate() {
1443
- }
1444
- Select(selectable) {
1445
- if (selectable.onSelect) selectable.onSelect();
1446
- this.AttachGizmo(selectable);
1447
- }
1448
- Deselect(selectable) {
1449
- if (selectable.onDeselect) selectable.onDeselect();
1450
- this.DetachGizmo();
1451
- }
1452
- DetachGizmo() {
1453
- this._gizmo.detach();
1454
- }
1455
- AttachGizmo(selectable) {
1456
- if ("isMoveable" in selectable) {
1457
- const movable = selectable;
1458
- this._gizmo.attach(movable);
1459
- this.SetGizmoVisibility(movable.visible);
1460
- }
1461
- }
1462
- onClick(e) {
1463
- super.onClick(e);
1464
- const first = this._raycaster.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];
1465
- const selectable = this.findSelectableInterface(first == null ? void 0 : first.object);
1466
- if (!first || !selectable) {
1467
- if (this._gizmo.object) {
1468
- this.Deselect(this._gizmo.object);
1469
- }
1470
- return;
1471
- }
1472
- if (this._gizmo.object) {
1473
- if (this._gizmo.object.uuid === selectable.uuid) return;
1474
- this.Deselect(this._gizmo.object);
1475
- }
1476
- this.Select(selectable);
1477
- }
1478
- findSelectableInterface(child) {
1479
- if (child === void 0) return void 0;
1480
- if (child.parent === null) {
1481
- return void 0;
1482
- }
1483
- if (isSelectable(child)) {
1484
- return child;
1485
- }
1486
- return this.findSelectableInterface(child.parent);
1487
- }
1488
- };
1489
-
1490
- // src/toolbox/Toolbox.ts
1491
- var DIVEToolbox = class {
1492
- constructor(scene, controller) {
1493
- this.removeListenersCallback = () => {
1494
- };
1495
- this.selectTool = new DIVESelectTool(scene, controller);
1496
- const pointerMove = this.onPointerMove.bind(this);
1497
- const pointerDown = this.onPointerDown.bind(this);
1498
- const pointerUp = this.onPointerUp.bind(this);
1499
- const wheel = this.onWheel.bind(this);
1500
- controller.domElement.addEventListener("pointermove", pointerMove);
1501
- controller.domElement.addEventListener("pointerdown", pointerDown);
1502
- controller.domElement.addEventListener("pointerup", pointerUp);
1503
- controller.domElement.addEventListener("wheel", wheel);
1504
- this.removeListenersCallback = () => {
1505
- controller.domElement.removeEventListener("pointermove", pointerMove);
1506
- controller.domElement.removeEventListener("pointerdown", pointerDown);
1507
- controller.domElement.removeEventListener("pointerup", pointerUp);
1508
- controller.domElement.removeEventListener("wheel", wheel);
1509
- };
1510
- this.activeTool = this.selectTool;
1511
- this.activeTool.Activate();
1512
- }
1513
- dispose() {
1514
- this.removeListenersCallback();
1656
+ Dispose() {
1657
+ this.removeEventListeners();
1515
1658
  }
1516
1659
  GetActiveTool() {
1517
- return this.activeTool;
1660
+ return this._activeTool;
1518
1661
  }
1519
1662
  UseTool(tool) {
1520
- this.activeTool.Deactivate();
1663
+ var _a;
1664
+ (_a = this._activeTool) == null ? void 0 : _a.Deactivate();
1521
1665
  switch (tool) {
1522
1666
  case "select": {
1667
+ this.addEventListeners();
1523
1668
  this.selectTool.Activate();
1524
- this.activeTool = this.selectTool;
1669
+ this._activeTool = this.selectTool;
1670
+ break;
1671
+ }
1672
+ case "none": {
1673
+ this.removeEventListeners();
1674
+ this._activeTool = null;
1525
1675
  break;
1526
1676
  }
1527
1677
  default: {
@@ -1536,30 +1686,39 @@ var DIVEToolbox = class {
1536
1686
  this.selectTool.SetGizmoVisibility(active);
1537
1687
  }
1538
1688
  onPointerMove(e) {
1539
- this.activeTool.onPointerMove(e);
1689
+ var _a;
1690
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerMove(e);
1540
1691
  }
1541
1692
  onPointerDown(e) {
1542
- this.activeTool.onPointerDown(e);
1693
+ var _a;
1694
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerDown(e);
1543
1695
  }
1544
1696
  onPointerUp(e) {
1545
- this.activeTool.onPointerUp(e);
1697
+ var _a;
1698
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerUp(e);
1546
1699
  }
1547
1700
  onWheel(e) {
1548
- this.activeTool.onWheel(e);
1701
+ var _a;
1702
+ (_a = this._activeTool) == null ? void 0 : _a.onWheel(e);
1549
1703
  }
1550
- };
1551
- DIVEToolbox.DefaultTool = "select";
1552
-
1553
- // src/animation/AnimationSystem.ts
1554
- import { update as updateTween } from "@tweenjs/tween.js";
1555
- var DIVEAnimationSystem = class {
1556
- update() {
1557
- updateTween();
1704
+ addEventListeners() {
1705
+ this._controller.domElement.addEventListener("pointermove", (e) => this.onPointerMove(e));
1706
+ this._controller.domElement.addEventListener("pointerdown", (e) => this.onPointerDown(e));
1707
+ this._controller.domElement.addEventListener("pointerup", (e) => this.onPointerUp(e));
1708
+ this._controller.domElement.addEventListener("wheel", (e) => this.onWheel(e));
1709
+ }
1710
+ removeEventListeners() {
1711
+ this._controller.domElement.removeEventListener("pointermove", (e) => this.onPointerMove(e));
1712
+ this._controller.domElement.removeEventListener("pointerdown", (e) => this.onPointerDown(e));
1713
+ this._controller.domElement.removeEventListener("pointerup", (e) => this.onPointerUp(e));
1714
+ this._controller.domElement.removeEventListener("wheel", (e) => this.onWheel(e));
1558
1715
  }
1559
1716
  };
1717
+ DIVEToolbox.DefaultTool = "select";
1560
1718
 
1561
1719
  // src/axiscamera/AxisCamera.ts
1562
- import { AxesHelper, Color as Color8, Matrix4, OrthographicCamera } from "three";
1720
+ init_VisibilityLayerMask();
1721
+ import { AxesHelper, Color as Color7, Matrix4, OrthographicCamera, Vector4 } from "three";
1563
1722
  import SpriteText from "three-spritetext";
1564
1723
 
1565
1724
  // src/constant/AxisHelperColors.ts
@@ -1572,7 +1731,7 @@ var AxesColorBlue = AxesColorBlueLetter;
1572
1731
 
1573
1732
  // src/axiscamera/AxisCamera.ts
1574
1733
  var DIVEAxisCamera = class extends OrthographicCamera {
1575
- constructor() {
1734
+ constructor(renderer, scene, controls) {
1576
1735
  super(-1, 1, 1, -1, 0.1, 100);
1577
1736
  this.layers.mask = COORDINATE_LAYER_MASK;
1578
1737
  this.axesHelper = new AxesHelper(0.5);
@@ -1580,9 +1739,9 @@ var DIVEAxisCamera = class extends OrthographicCamera {
1580
1739
  this.axesHelper.material.depthTest = false;
1581
1740
  this.axesHelper.position.set(0, 0, -1);
1582
1741
  this.axesHelper.setColors(
1583
- new Color8(AxesColorRed),
1584
- new Color8(AxesColorGreen),
1585
- new Color8(AxesColorBlue)
1742
+ new Color7(AxesColorRed),
1743
+ new Color7(AxesColorGreen),
1744
+ new Color7(AxesColorBlue)
1586
1745
  );
1587
1746
  const x = new SpriteText("X", 0.2, AxesColorRedLetter);
1588
1747
  const y = new SpriteText("Y", 0.2, AxesColorGreenLetter);
@@ -1597,6 +1756,26 @@ var DIVEAxisCamera = class extends OrthographicCamera {
1597
1756
  this.axesHelper.add(y);
1598
1757
  this.axesHelper.add(z);
1599
1758
  this.add(this.axesHelper);
1759
+ this._renderer = renderer;
1760
+ this._scene = scene;
1761
+ this._scene.add(this);
1762
+ const restoreViewport = new Vector4();
1763
+ this._renderCallbackId = renderer.AddPostRenderCallback(() => {
1764
+ const restoreBackground = scene.background;
1765
+ scene.background = null;
1766
+ renderer.getViewport(restoreViewport);
1767
+ renderer.setViewport(0, 0, 150, 150);
1768
+ renderer.autoClear = false;
1769
+ this.SetFromCameraMatrix(controls.object.matrix);
1770
+ renderer.render(scene, this);
1771
+ renderer.setViewport(restoreViewport);
1772
+ renderer.autoClear = true;
1773
+ scene.background = restoreBackground;
1774
+ });
1775
+ }
1776
+ Dispose() {
1777
+ this._renderer.RemovePostRenderCallback(this._renderCallbackId);
1778
+ this._scene.remove(this);
1600
1779
  }
1601
1780
  SetFromCameraMatrix(matrix) {
1602
1781
  this.axesHelper.rotation.setFromRotationMatrix(new Matrix4().extractRotation(matrix).invert());
@@ -1716,13 +1895,63 @@ var DIVEMath = {
1716
1895
  };
1717
1896
 
1718
1897
  // src/dive.ts
1898
+ import { generateUUID as generateUUID2 } from "three/src/math/MathUtils";
1719
1899
  var DIVEDefaultSettings = {
1720
1900
  autoResize: true,
1901
+ displayAxes: false,
1721
1902
  renderer: DIVERendererDefaultSettings,
1722
1903
  perspectiveCamera: DIVEPerspectiveCameraDefaultSettings,
1723
1904
  orbitControls: DIVEOrbitControlsDefaultSettings
1724
1905
  };
1725
- var DIVE = class {
1906
+ var DIVE = class _DIVE {
1907
+ // static members
1908
+ static QuickView(uri) {
1909
+ const dive = new _DIVE();
1910
+ dive.Communication.PerformAction("SET_CAMERA_TRANSFORM", {
1911
+ position: { x: 0, y: 2, z: 2 },
1912
+ target: { x: 0, y: 0.5, z: 0 }
1913
+ });
1914
+ const lightid = generateUUID2();
1915
+ dive.Communication.PerformAction("ADD_OBJECT", {
1916
+ entityType: "light",
1917
+ type: "scene",
1918
+ name: "light",
1919
+ id: lightid,
1920
+ enabled: true,
1921
+ visible: true,
1922
+ intensity: 1,
1923
+ color: 16777215
1924
+ });
1925
+ const modelid = generateUUID2();
1926
+ dive.Communication.Subscribe("MODEL_LOADED", (data) => {
1927
+ if (data.id !== modelid) return;
1928
+ dive.Communication.PerformAction("PLACE_ON_FLOOR", {
1929
+ id: modelid
1930
+ });
1931
+ const transform = dive.Communication.PerformAction("COMPUTE_ENCOMPASSING_VIEW", {});
1932
+ dive.Communication.PerformAction("SET_CAMERA_TRANSFORM", {
1933
+ position: transform.position,
1934
+ target: transform.target
1935
+ });
1936
+ });
1937
+ dive.Communication.PerformAction("ADD_OBJECT", {
1938
+ entityType: "model",
1939
+ name: "object",
1940
+ id: modelid,
1941
+ position: { x: 0, y: 0, z: 0 },
1942
+ rotation: { x: 0, y: 0, z: 0 },
1943
+ scale: { x: 1, y: 1, z: 1 },
1944
+ uri,
1945
+ visible: true,
1946
+ loaded: false
1947
+ });
1948
+ dive.Communication.PerformAction("UPDATE_SCENE", {
1949
+ backgroundColor: 16777215,
1950
+ gridEnabled: false,
1951
+ floorColor: 16777215
1952
+ });
1953
+ return dive;
1954
+ }
1726
1955
  // getters
1727
1956
  get Communication() {
1728
1957
  return this.communication;
@@ -1732,6 +1961,7 @@ var DIVE = class {
1732
1961
  }
1733
1962
  // setters
1734
1963
  set Settings(settings) {
1964
+ var _a;
1735
1965
  const settingsDelta = getObjectDelta(this._settings, settings);
1736
1966
  if (settingsDelta.renderer) this.renderer = new DIVERenderer(this._settings.renderer);
1737
1967
  if (settingsDelta.perspectiveCamera) {
@@ -1751,6 +1981,12 @@ var DIVE = class {
1751
1981
  this.removeResizeObserver();
1752
1982
  }
1753
1983
  }
1984
+ if (settingsDelta.displayAxes) {
1985
+ this.axisCamera = new DIVEAxisCamera(this.renderer, this.scene, this.orbitControls);
1986
+ } else {
1987
+ (_a = this.axisCamera) == null ? void 0 : _a.Dispose();
1988
+ this.axisCamera = null;
1989
+ }
1754
1990
  Object.assign(this._settings, settings);
1755
1991
  }
1756
1992
  constructor(settings) {
@@ -1762,28 +1998,14 @@ var DIVE = class {
1762
1998
  this.scene = new DIVEScene();
1763
1999
  this.perspectiveCamera = new DIVEPerspectiveCamera(this._settings.perspectiveCamera);
1764
2000
  this.orbitControls = new DIVEOrbitControls(this.perspectiveCamera, this.renderer, this._settings.orbitControls);
1765
- this.mediaCreator = new DIVEMediaCreator(this.renderer, this.scene, this.orbitControls);
1766
2001
  this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);
1767
- this.communication = new DIVECommunication(this.scene, this.orbitControls, this.toolbox, this.mediaCreator);
1768
- this.animationSystem = new DIVEAnimationSystem();
1769
- this.renderer.AddPreRenderCallback(() => {
1770
- this.animationSystem.update();
1771
- });
1772
- this.axisCamera = new DIVEAxisCamera();
1773
- this.scene.add(this.axisCamera);
1774
- const restoreViewport = new Vector4();
1775
- this.renderer.AddPostRenderCallback(() => {
1776
- const restoreBackground = this.scene.background;
1777
- this.scene.background = null;
1778
- this.renderer.getViewport(restoreViewport);
1779
- this.renderer.setViewport(0, 0, 150, 150);
1780
- this.renderer.autoClear = false;
1781
- this.axisCamera.SetFromCameraMatrix(this.perspectiveCamera.matrix);
1782
- this.renderer.render(this.scene, this.axisCamera);
1783
- this.renderer.setViewport(restoreViewport);
1784
- this.renderer.autoClear = true;
1785
- this.scene.background = restoreBackground;
1786
- });
2002
+ this.communication = new DIVECommunication(this.renderer, this.scene, this.orbitControls, this.toolbox);
2003
+ this.animationSystem = null;
2004
+ if (this._settings.displayAxes) {
2005
+ this.axisCamera = new DIVEAxisCamera(this.renderer, this.scene, this.orbitControls);
2006
+ } else {
2007
+ this.axisCamera = null;
2008
+ }
1787
2009
  if (this._settings.autoResize) {
1788
2010
  this.addResizeObserver();
1789
2011
  }
@@ -1794,6 +2016,14 @@ var DIVE = class {
1794
2016
  }
1795
2017
  };
1796
2018
  }
2019
+ Dispose() {
2020
+ var _a;
2021
+ this.removeResizeObserver();
2022
+ this.renderer.Dispose();
2023
+ (_a = this.axisCamera) == null ? void 0 : _a.Dispose();
2024
+ this.toolbox.Dispose();
2025
+ this.communication.DestroyInstance();
2026
+ }
1797
2027
  // methods
1798
2028
  OnResize(width, height) {
1799
2029
  this.renderer.OnResize(width, height);