@shopware-ag/dive 1.5.0 → 1.6.1

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 (43) 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/model/Model.ts +1 -1
  29. package/src/model/__test__/Model.test.ts +8 -1
  30. package/src/renderer/Renderer.ts +7 -1
  31. package/src/renderer/__test__/Renderer.test.ts +14 -5
  32. package/src/scene/Scene.ts +8 -2
  33. package/src/scene/__test__/Scene.test.ts +6 -0
  34. package/src/scene/root/Root.ts +11 -1
  35. package/src/scene/root/__test__/Root.test.ts +68 -2
  36. package/src/toolbox/BaseTool.ts +1 -1
  37. package/src/toolbox/Toolbox.ts +53 -37
  38. package/src/toolbox/__test__/BaseTool.test.ts +43 -7
  39. package/src/toolbox/__test__/Toolbox.test.ts +39 -44
  40. package/src/toolbox/select/SelectTool.ts +17 -28
  41. package/src/toolbox/select/__test__/SelectTool.test.ts +21 -12
  42. package/src/toolbox/transform/TransformTool.ts +7 -1
  43. package/src/toolbox/transform/__test__/TransformTool.test.ts +22 -5
package/build/dive.cjs CHANGED
@@ -22,6 +22,9 @@ var __spreadValues = (a, b) => {
22
22
  return a;
23
23
  };
24
24
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __esm = (fn, res) => function __init() {
26
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
27
+ };
25
28
  var __export = (target, all) => {
26
29
  for (var name in all)
27
30
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -64,6 +67,466 @@ var __async = (__this, __arguments, generator) => {
64
67
  });
65
68
  };
66
69
 
70
+ // src/constant/VisibilityLayerMask.ts
71
+ var DEFAULT_LAYER_MASK, COORDINATE_LAYER_MASK, UI_LAYER_MASK, HELPER_LAYER_MASK, PRODUCT_LAYER_MASK;
72
+ var init_VisibilityLayerMask = __esm({
73
+ "src/constant/VisibilityLayerMask.ts"() {
74
+ "use strict";
75
+ DEFAULT_LAYER_MASK = 1;
76
+ COORDINATE_LAYER_MASK = 2;
77
+ UI_LAYER_MASK = 4;
78
+ HELPER_LAYER_MASK = 8;
79
+ PRODUCT_LAYER_MASK = 16;
80
+ }
81
+ });
82
+
83
+ // src/interface/Draggable.ts
84
+ var isDraggable, findDraggableInterface;
85
+ var init_Draggable = __esm({
86
+ "src/interface/Draggable.ts"() {
87
+ "use strict";
88
+ isDraggable = (object) => {
89
+ return "isDraggable" in object;
90
+ };
91
+ findDraggableInterface = (child) => {
92
+ if (child === void 0) return void 0;
93
+ if (child.parent === null) {
94
+ return void 0;
95
+ }
96
+ if (isDraggable(child)) {
97
+ return child;
98
+ }
99
+ return findDraggableInterface(child.parent);
100
+ };
101
+ }
102
+ });
103
+
104
+ // src/interface/Hoverable.ts
105
+ var isHoverable, findHoverableInterface;
106
+ var init_Hoverable = __esm({
107
+ "src/interface/Hoverable.ts"() {
108
+ "use strict";
109
+ isHoverable = (object) => {
110
+ return "isHoverable" in object;
111
+ };
112
+ findHoverableInterface = (child) => {
113
+ if (child === void 0) return void 0;
114
+ if (child.parent === null) {
115
+ return void 0;
116
+ }
117
+ if (isHoverable(child)) {
118
+ return child;
119
+ }
120
+ return findHoverableInterface(child.parent);
121
+ };
122
+ }
123
+ });
124
+
125
+ // src/toolbox/BaseTool.ts
126
+ var import_three3, DIVEBaseTool;
127
+ var init_BaseTool = __esm({
128
+ "src/toolbox/BaseTool.ts"() {
129
+ "use strict";
130
+ import_three3 = require("three");
131
+ init_VisibilityLayerMask();
132
+ init_Draggable();
133
+ init_Hoverable();
134
+ DIVEBaseTool = class {
135
+ constructor(scene, controller) {
136
+ this.POINTER_DRAG_THRESHOLD = 1e-3;
137
+ this.name = "BaseTool";
138
+ this._canvas = controller.domElement;
139
+ this._scene = scene;
140
+ this._controller = controller;
141
+ this._pointer = new import_three3.Vector2();
142
+ this._pointerPrimaryDown = false;
143
+ this._pointerMiddleDown = false;
144
+ this._pointerSecondaryDown = false;
145
+ this._lastPointerDown = new import_three3.Vector2();
146
+ this._lastPointerUp = new import_three3.Vector2();
147
+ this._raycaster = new import_three3.Raycaster();
148
+ this._raycaster.layers.mask = PRODUCT_LAYER_MASK | UI_LAYER_MASK;
149
+ this._intersects = [];
150
+ this._hovered = null;
151
+ this._dragging = false;
152
+ this._dragStart = new import_three3.Vector3();
153
+ this._dragCurrent = new import_three3.Vector3();
154
+ this._dragEnd = new import_three3.Vector3();
155
+ this._dragDelta = new import_three3.Vector3();
156
+ this._draggable = null;
157
+ this._dragRaycastOnObjects = null;
158
+ }
159
+ get _pointerAnyDown() {
160
+ return this._pointerPrimaryDown || this._pointerMiddleDown || this._pointerSecondaryDown;
161
+ }
162
+ Activate() {
163
+ }
164
+ Deactivate() {
165
+ }
166
+ onPointerDown(e) {
167
+ var _a;
168
+ switch (e.button) {
169
+ case 0:
170
+ this._pointerPrimaryDown = true;
171
+ break;
172
+ case 1:
173
+ this._pointerMiddleDown = true;
174
+ break;
175
+ case 2:
176
+ this._pointerSecondaryDown = true;
177
+ break;
178
+ }
179
+ this._lastPointerDown.copy(this._pointer);
180
+ this._draggable = findDraggableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object) || null;
181
+ }
182
+ onDragStart(e) {
183
+ if (!this._draggable) return;
184
+ if (this._dragRaycastOnObjects !== null) {
185
+ this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
186
+ }
187
+ if (this._intersects.length === 0) return;
188
+ this._dragStart.copy(this._intersects[0].point.clone());
189
+ this._dragCurrent.copy(this._intersects[0].point.clone());
190
+ this._dragEnd.copy(this._dragStart.clone());
191
+ this._dragDelta.set(0, 0, 0);
192
+ if (this._draggable && this._draggable.onDragStart) {
193
+ this._draggable.onDragStart({
194
+ dragStart: this._dragStart,
195
+ dragCurrent: this._dragCurrent,
196
+ dragEnd: this._dragEnd,
197
+ dragDelta: this._dragDelta
198
+ });
199
+ this._dragging = true;
200
+ this._controller.enabled = false;
201
+ }
202
+ }
203
+ onPointerMove(e) {
204
+ var _a;
205
+ this._pointer.x = e.offsetX / this._canvas.clientWidth * 2 - 1;
206
+ this._pointer.y = -(e.offsetY / this._canvas.clientHeight) * 2 + 1;
207
+ this._raycaster.setFromCamera(this._pointer, this._controller.object);
208
+ this._intersects = this.raycast(this._scene.children);
209
+ const hoverable = findHoverableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object);
210
+ if (this._intersects[0] && hoverable) {
211
+ if (!this._hovered) {
212
+ if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
213
+ this._hovered = hoverable;
214
+ return;
215
+ }
216
+ if (this._hovered.uuid !== hoverable.uuid) {
217
+ if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
218
+ if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
219
+ this._hovered = hoverable;
220
+ return;
221
+ }
222
+ if (hoverable.onPointerOver) hoverable.onPointerOver(this._intersects[0]);
223
+ this._hovered = hoverable;
224
+ } else {
225
+ if (this._hovered) {
226
+ if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
227
+ }
228
+ this._hovered = null;
229
+ }
230
+ if (this._pointerAnyDown) {
231
+ if (!this._dragging) {
232
+ this.onDragStart(e);
233
+ }
234
+ this.onDrag(e);
235
+ }
236
+ }
237
+ onDrag(e) {
238
+ if (this._dragRaycastOnObjects !== null) {
239
+ this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
240
+ }
241
+ const intersect = this._intersects[0];
242
+ if (!intersect) return;
243
+ this._dragCurrent.copy(intersect.point.clone());
244
+ this._dragEnd.copy(intersect.point.clone());
245
+ this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
246
+ if (this._draggable && this._draggable.onDrag) {
247
+ this._draggable.onDrag({
248
+ dragStart: this._dragStart,
249
+ dragCurrent: this._dragCurrent,
250
+ dragEnd: this._dragEnd,
251
+ dragDelta: this._dragDelta
252
+ });
253
+ }
254
+ }
255
+ onPointerUp(e) {
256
+ if (this.pointerWasDragged() || this._dragging) {
257
+ if (this._draggable) {
258
+ this.onDragEnd(e);
259
+ }
260
+ } else {
261
+ this.onClick(e);
262
+ }
263
+ switch (e.button) {
264
+ case 0:
265
+ this._pointerPrimaryDown = false;
266
+ break;
267
+ case 1:
268
+ this._pointerMiddleDown = false;
269
+ break;
270
+ case 2:
271
+ this._pointerSecondaryDown = false;
272
+ break;
273
+ }
274
+ this._lastPointerUp.copy(this._pointer);
275
+ }
276
+ onClick(e) {
277
+ }
278
+ onDragEnd(e) {
279
+ const intersect = this._intersects[0];
280
+ if (intersect) {
281
+ this._dragEnd.copy(intersect.point.clone());
282
+ this._dragCurrent.copy(intersect.point.clone());
283
+ this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
284
+ }
285
+ if (this._draggable && this._draggable.onDragEnd) {
286
+ this._draggable.onDragEnd({
287
+ dragStart: this._dragStart,
288
+ dragCurrent: this._dragCurrent,
289
+ dragEnd: this._dragEnd,
290
+ dragDelta: this._dragDelta
291
+ });
292
+ }
293
+ this._draggable = null;
294
+ this._dragging = false;
295
+ this._dragStart.set(0, 0, 0);
296
+ this._dragCurrent.set(0, 0, 0);
297
+ this._dragEnd.set(0, 0, 0);
298
+ this._dragDelta.set(0, 0, 0);
299
+ this._controller.enabled = true;
300
+ }
301
+ onWheel(e) {
302
+ }
303
+ raycast(objects) {
304
+ if (objects !== void 0) return this._raycaster.intersectObjects(objects, true).filter((i) => i.object.visible);
305
+ return this._raycaster.intersectObjects(this._scene.children, true).filter((i) => i.object.visible);
306
+ }
307
+ pointerWasDragged() {
308
+ return this._lastPointerDown.distanceTo(this._pointer) > this.POINTER_DRAG_THRESHOLD;
309
+ }
310
+ };
311
+ }
312
+ });
313
+
314
+ // src/toolbox/transform/TransformTool.ts
315
+ var import_Addons, DIVETransformTool;
316
+ var init_TransformTool = __esm({
317
+ "src/toolbox/transform/TransformTool.ts"() {
318
+ "use strict";
319
+ init_BaseTool();
320
+ import_Addons = require("three/examples/jsm/Addons");
321
+ DIVETransformTool = class extends DIVEBaseTool {
322
+ constructor(scene, controller) {
323
+ super(scene, controller);
324
+ this.isTransformTool = true;
325
+ this.name = "DIVETransformTool";
326
+ this._gizmo = new import_Addons.TransformControls(this._controller.object, this._controller.domElement);
327
+ this._gizmo.mode = "translate";
328
+ this._gizmo.addEventListener("mouseDown", () => {
329
+ controller.enabled = false;
330
+ });
331
+ this._gizmo.addEventListener("mouseUp", () => {
332
+ controller.enabled = true;
333
+ });
334
+ this._gizmo.addEventListener("objectChange", () => {
335
+ if (!this._gizmo.object) return;
336
+ if (!("isMoveable" in this._gizmo.object)) return;
337
+ if (!("onMove" in this._gizmo.object)) return;
338
+ this._gizmo.object.onMove();
339
+ });
340
+ scene.add(this._gizmo);
341
+ }
342
+ Activate() {
343
+ }
344
+ SetGizmoMode(mode) {
345
+ this._gizmo.mode = mode;
346
+ }
347
+ SetGizmoVisibility(active) {
348
+ const contains = this._scene.children.includes(this._gizmo);
349
+ if (active && !contains) {
350
+ this._scene.add(this._gizmo);
351
+ } else if (!active && contains) {
352
+ this._scene.remove(this._gizmo);
353
+ }
354
+ }
355
+ // public onPointerDown(e: PointerEvent): void {
356
+ // super.onPointerDown(e);
357
+ // // if (this._hovered) {
358
+ // // this._dragRaycastOnObjects = this._gizmo.gizmoPlane.children;
359
+ // // }
360
+ // }
361
+ // protected raycast(): Intersection[] {
362
+ // return super.raycast(this._gizmo.gizmoNode.children);
363
+ // }
364
+ };
365
+ }
366
+ });
367
+
368
+ // src/interface/Selectable.ts
369
+ function isSelectable(object) {
370
+ return "isSelectable" in object;
371
+ }
372
+ function findSelectableInterface(child) {
373
+ if (child === void 0) return void 0;
374
+ if (child.parent === null) {
375
+ return void 0;
376
+ }
377
+ if (isSelectable(child)) {
378
+ return child;
379
+ }
380
+ return findSelectableInterface(child.parent);
381
+ }
382
+ var init_Selectable = __esm({
383
+ "src/interface/Selectable.ts"() {
384
+ "use strict";
385
+ }
386
+ });
387
+
388
+ // src/toolbox/select/SelectTool.ts
389
+ var SelectTool_exports = {};
390
+ __export(SelectTool_exports, {
391
+ DIVESelectTool: () => DIVESelectTool,
392
+ isSelectTool: () => isSelectTool
393
+ });
394
+ var isSelectTool, DIVESelectTool;
395
+ var init_SelectTool = __esm({
396
+ "src/toolbox/select/SelectTool.ts"() {
397
+ "use strict";
398
+ init_TransformTool();
399
+ init_Selectable();
400
+ isSelectTool = (tool) => {
401
+ return tool.isSelectTool !== void 0;
402
+ };
403
+ DIVESelectTool = class extends DIVETransformTool {
404
+ constructor(scene, controller) {
405
+ super(scene, controller);
406
+ this.isSelectTool = true;
407
+ this.name = "SelectTool";
408
+ }
409
+ Activate() {
410
+ }
411
+ Select(selectable) {
412
+ if (selectable.onSelect) selectable.onSelect();
413
+ this.AttachGizmo(selectable);
414
+ }
415
+ Deselect(selectable) {
416
+ if (selectable.onDeselect) selectable.onDeselect();
417
+ this.DetachGizmo();
418
+ }
419
+ AttachGizmo(selectable) {
420
+ if ("isMoveable" in selectable) {
421
+ const movable = selectable;
422
+ this._gizmo.attach(movable);
423
+ this.SetGizmoVisibility(movable.visible);
424
+ }
425
+ }
426
+ DetachGizmo() {
427
+ this._gizmo.detach();
428
+ }
429
+ onClick(e) {
430
+ super.onClick(e);
431
+ const first = this._raycaster.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];
432
+ const selectable = findSelectableInterface(first == null ? void 0 : first.object);
433
+ if (!first || !selectable) {
434
+ if (this._gizmo.object) {
435
+ this.Deselect(this._gizmo.object);
436
+ }
437
+ return;
438
+ }
439
+ if (this._gizmo.object) {
440
+ if (this._gizmo.object.uuid === selectable.uuid) return;
441
+ this.Deselect(this._gizmo.object);
442
+ }
443
+ this.Select(selectable);
444
+ }
445
+ };
446
+ }
447
+ });
448
+
449
+ // src/camera/PerspectiveCamera.ts
450
+ var import_three4, DIVEPerspectiveCameraDefaultSettings, _DIVEPerspectiveCamera, DIVEPerspectiveCamera;
451
+ var init_PerspectiveCamera = __esm({
452
+ "src/camera/PerspectiveCamera.ts"() {
453
+ "use strict";
454
+ import_three4 = require("three");
455
+ init_VisibilityLayerMask();
456
+ DIVEPerspectiveCameraDefaultSettings = {
457
+ fov: 80,
458
+ near: 0.1,
459
+ far: 1e3
460
+ };
461
+ _DIVEPerspectiveCamera = class _DIVEPerspectiveCamera extends import_three4.PerspectiveCamera {
462
+ constructor(settings = DIVEPerspectiveCameraDefaultSettings) {
463
+ super(settings.fov, 1, settings.near, settings.far);
464
+ this.onSetCameraLayer = () => {
465
+ };
466
+ this.layers.mask = _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
467
+ }
468
+ OnResize(width, height) {
469
+ this.aspect = width / height;
470
+ this.updateProjectionMatrix();
471
+ }
472
+ SetCameraLayer(layer) {
473
+ this.layers.mask = layer === "LIVE" ? _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
474
+ this.onSetCameraLayer(this.layers.mask);
475
+ }
476
+ };
477
+ _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;
478
+ _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;
479
+ DIVEPerspectiveCamera = _DIVEPerspectiveCamera;
480
+ }
481
+ });
482
+
483
+ // src/mediacreator/MediaCreator.ts
484
+ var MediaCreator_exports = {};
485
+ __export(MediaCreator_exports, {
486
+ DIVEMediaCreator: () => DIVEMediaCreator
487
+ });
488
+ var DIVEMediaCreator;
489
+ var init_MediaCreator = __esm({
490
+ "src/mediacreator/MediaCreator.ts"() {
491
+ "use strict";
492
+ init_PerspectiveCamera();
493
+ DIVEMediaCreator = class {
494
+ constructor(renderer, scene, controller) {
495
+ this.renderer = renderer;
496
+ this.scene = scene;
497
+ this.controller = controller;
498
+ }
499
+ GenerateMedia(position, target, width, height) {
500
+ const resetPosition = this.controller.object.position.clone();
501
+ const resetRotation = this.controller.object.quaternion.clone();
502
+ this.renderer.OnResize(width, height);
503
+ this.controller.object.OnResize(width, height);
504
+ this.controller.object.position.copy(position);
505
+ this.controller.target.copy(target);
506
+ this.controller.update();
507
+ const dataUri = this.DrawCanvas().toDataURL();
508
+ this.controller.object.position.copy(resetPosition);
509
+ this.controller.object.quaternion.copy(resetRotation);
510
+ return dataUri;
511
+ }
512
+ DrawCanvas(canvasElement) {
513
+ const restore = this.renderer.domElement;
514
+ if (canvasElement) {
515
+ this.renderer.domElement = canvasElement;
516
+ }
517
+ this.controller.object.layers.mask = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;
518
+ this.renderer.render(this.scene, this.controller.object);
519
+ this.controller.object.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
520
+ const returnCanvas = this.renderer.domElement;
521
+ if (canvasElement) {
522
+ this.renderer.domElement = restore;
523
+ }
524
+ return returnCanvas;
525
+ }
526
+ };
527
+ }
528
+ });
529
+
67
530
  // src/dive.ts
68
531
  var dive_exports = {};
69
532
  __export(dive_exports, {
@@ -74,7 +537,6 @@ __export(dive_exports, {
74
537
  default: () => DIVE
75
538
  });
76
539
  module.exports = __toCommonJS(dive_exports);
77
- var import_three17 = require("three");
78
540
 
79
541
  // src/renderer/Renderer.ts
80
542
  var import_three = require("three");
@@ -106,6 +568,11 @@ var DIVERenderer = class extends import_three.WebGLRenderer {
106
568
  this.toneMapping = rendererSettings.toneMapping;
107
569
  this.debug.checkShaderErrors = false;
108
570
  }
571
+ // Stops renderings and disposes the renderer.
572
+ Dispose() {
573
+ this.StopRenderer();
574
+ this.dispose();
575
+ }
109
576
  // Starts the renderer with the given scene and camera.
110
577
  StartRenderer(scene, cam) {
111
578
  this.setAnimationLoop(() => {
@@ -197,25 +664,17 @@ var DIVERenderer = class extends import_three.WebGLRenderer {
197
664
  };
198
665
 
199
666
  // src/scene/Scene.ts
200
- var import_three12 = require("three");
667
+ var import_three13 = require("three");
201
668
 
202
669
  // src/scene/root/Root.ts
203
- var import_three11 = require("three");
670
+ var import_three12 = require("three");
204
671
 
205
672
  // src/scene/root/lightroot/LightRoot.ts
206
- var import_three6 = require("three");
673
+ var import_three7 = require("three");
207
674
 
208
675
  // src/light/AmbientLight.ts
209
676
  var import_three2 = require("three");
210
-
211
- // src/constant/VisibilityLayerMask.ts
212
- var DEFAULT_LAYER_MASK = 1;
213
- var COORDINATE_LAYER_MASK = 2;
214
- var UI_LAYER_MASK = 4;
215
- var HELPER_LAYER_MASK = 8;
216
- var PRODUCT_LAYER_MASK = 16;
217
-
218
- // src/light/AmbientLight.ts
677
+ init_VisibilityLayerMask();
219
678
  var DIVEAmbientLight = class extends import_three2.Object3D {
220
679
  constructor() {
221
680
  super();
@@ -236,25 +695,34 @@ var DIVEAmbientLight = class extends import_three2.Object3D {
236
695
  };
237
696
 
238
697
  // src/light/PointLight.ts
239
- var import_three4 = require("three");
698
+ var import_three5 = require("three");
240
699
 
241
700
  // src/com/Communication.ts
242
- var import_three3 = require("three");
701
+ var import_MathUtils = require("three/src/math/MathUtils");
702
+ init_SelectTool();
243
703
  var _DIVECommunication = class _DIVECommunication {
244
- constructor(scene, controls, toolbox, mediaGenerator) {
704
+ constructor(renderer, scene, controls, toolbox) {
245
705
  this.registered = /* @__PURE__ */ new Map();
246
706
  // private listeners: { [key: string]: EventListener[] } = {};
247
707
  this.listeners = /* @__PURE__ */ new Map();
248
- this.id = import_three3.MathUtils.generateUUID();
708
+ this.id = (0, import_MathUtils.generateUUID)();
709
+ this.renderer = renderer;
249
710
  this.scene = scene;
250
711
  this.controller = controls;
251
712
  this.toolbox = toolbox;
252
- this.mediaGenerator = mediaGenerator;
713
+ this._mediaGenerator = null;
253
714
  _DIVECommunication.__instances.push(this);
254
715
  }
255
716
  static get(id) {
256
717
  return this.__instances.find((instance) => Array.from(instance.registered.values()).find((object) => object.id === id));
257
718
  }
719
+ get mediaGenerator() {
720
+ if (!this._mediaGenerator) {
721
+ const DIVEMediaCreator2 = (init_MediaCreator(), __toCommonJS(MediaCreator_exports)).default;
722
+ this._mediaGenerator = new DIVEMediaCreator2(this.renderer, this.scene, this.controller);
723
+ }
724
+ return this._mediaGenerator;
725
+ }
258
726
  DestroyInstance() {
259
727
  const existingIndex = _DIVECommunication.__instances.findIndex((entry) => entry.id === this.id);
260
728
  if (existingIndex === -1) return false;
@@ -324,6 +792,10 @@ var _DIVECommunication = class _DIVECommunication {
324
792
  returnValue = this.resetCamera(payload);
325
793
  break;
326
794
  }
795
+ case "COMPUTE_ENCOMPASSING_VIEW": {
796
+ returnValue = this.computeEncompassingView(payload);
797
+ break;
798
+ }
327
799
  case "SET_CAMERA_LAYER": {
328
800
  returnValue = this.setCameraLayer(payload);
329
801
  break;
@@ -434,8 +906,10 @@ var _DIVECommunication = class _DIVECommunication {
434
906
  const sceneObject = this.scene.GetSceneObject(object);
435
907
  if (!sceneObject) return false;
436
908
  if (!("isSelectable" in sceneObject)) return false;
437
- this.toolbox.UseTool("select");
438
- this.toolbox.GetActiveTool().AttachGizmo(sceneObject);
909
+ const activeTool = this.toolbox.GetActiveTool();
910
+ if (activeTool && isSelectTool(activeTool)) {
911
+ activeTool.AttachGizmo(sceneObject);
912
+ }
439
913
  Object.assign(payload, object);
440
914
  return true;
441
915
  }
@@ -445,8 +919,10 @@ var _DIVECommunication = class _DIVECommunication {
445
919
  const sceneObject = this.scene.GetSceneObject(object);
446
920
  if (!sceneObject) return false;
447
921
  if (!("isSelectable" in sceneObject)) return false;
448
- this.toolbox.UseTool("select");
449
- this.toolbox.GetActiveTool().DetachGizmo();
922
+ const activeTool = this.toolbox.GetActiveTool();
923
+ if (activeTool && isSelectTool(activeTool)) {
924
+ activeTool.DetachGizmo();
925
+ }
450
926
  Object.assign(payload, object);
451
927
  return true;
452
928
  }
@@ -501,6 +977,12 @@ var _DIVECommunication = class _DIVECommunication {
501
977
  this.controller.RevertLast(payload.duration);
502
978
  return true;
503
979
  }
980
+ computeEncompassingView(payload) {
981
+ const sceneBB = this.scene.ComputeSceneBB();
982
+ const transform = this.controller.ComputeEncompassingView(sceneBB);
983
+ Object.assign(payload, transform);
984
+ return transform;
985
+ }
504
986
  zoomCamera(payload) {
505
987
  if (payload.direction === "IN") this.controller.ZoomIn(payload.by);
506
988
  if (payload.direction === "OUT") this.controller.ZoomOut(payload.by);
@@ -521,10 +1003,12 @@ var _DIVECommunication = class _DIVECommunication {
521
1003
  updateScene(payload) {
522
1004
  if (payload.name !== void 0) this.scene.name = payload.name;
523
1005
  if (payload.backgroundColor !== void 0) this.scene.SetBackground(payload.backgroundColor);
1006
+ if (payload.gridEnabled !== void 0) this.scene.Root.Grid.SetVisibility(payload.gridEnabled);
524
1007
  if (payload.floorEnabled !== void 0) this.scene.Root.Floor.SetVisibility(payload.floorEnabled);
525
1008
  if (payload.floorColor !== void 0) this.scene.Root.Floor.SetColor(payload.floorColor);
526
1009
  payload.name = this.scene.name;
527
1010
  payload.backgroundColor = "#" + this.scene.background.getHexString();
1011
+ payload.gridEnabled = this.scene.Root.Grid.visible;
528
1012
  payload.floorEnabled = this.scene.Root.Floor.visible;
529
1013
  payload.floorColor = "#" + this.scene.Root.Floor.material.color.getHexString();
530
1014
  return true;
@@ -547,23 +1031,24 @@ _DIVECommunication.__instances = [];
547
1031
  var DIVECommunication = _DIVECommunication;
548
1032
 
549
1033
  // src/light/PointLight.ts
550
- var DIVEPointLight = class extends import_three4.Object3D {
1034
+ init_VisibilityLayerMask();
1035
+ var DIVEPointLight = class extends import_three5.Object3D {
551
1036
  constructor() {
552
1037
  super();
553
1038
  this.isMoveable = true;
554
1039
  this.isSelectable = true;
555
1040
  this.gizmo = null;
556
1041
  this.name = "DIVEPointLight";
557
- this.light = new import_three4.PointLight(16777215, 1);
1042
+ this.light = new import_three5.PointLight(16777215, 1);
558
1043
  this.light.layers.mask = PRODUCT_LAYER_MASK;
559
1044
  this.light.castShadow = true;
560
1045
  this.light.shadow.mapSize.width = 512;
561
1046
  this.light.shadow.mapSize.height = 512;
562
1047
  this.add(this.light);
563
1048
  const geoSize = 0.1;
564
- const geometry = new import_three4.SphereGeometry(geoSize, geoSize * 320, geoSize * 320);
565
- const material = new import_three4.MeshBasicMaterial({ color: this.light.color, transparent: true, opacity: 0.8, side: import_three4.FrontSide });
566
- this.mesh = new import_three4.Mesh(geometry, material);
1049
+ const geometry = new import_three5.SphereGeometry(geoSize, geoSize * 320, geoSize * 320);
1050
+ const material = new import_three5.MeshBasicMaterial({ color: this.light.color, transparent: true, opacity: 0.8, side: import_three5.FrontSide });
1051
+ this.mesh = new import_three5.Mesh(geometry, material);
567
1052
  this.mesh.layers.mask = UI_LAYER_MASK;
568
1053
  this.add(this.mesh);
569
1054
  }
@@ -593,16 +1078,17 @@ var DIVEPointLight = class extends import_three4.Object3D {
593
1078
  };
594
1079
 
595
1080
  // src/light/SceneLight.ts
596
- var import_three5 = require("three");
597
- var DIVESceneLight = class extends import_three5.Object3D {
1081
+ init_VisibilityLayerMask();
1082
+ var import_three6 = require("three");
1083
+ var DIVESceneLight = class extends import_three6.Object3D {
598
1084
  constructor() {
599
1085
  super();
600
1086
  this.name = "DIVESceneLight";
601
- this._hemiLight = new import_three5.HemisphereLight(16777215, 16777215, 2);
1087
+ this._hemiLight = new import_three6.HemisphereLight(16777215, 16777215, 2);
602
1088
  this._hemiLight.layers.mask = PRODUCT_LAYER_MASK;
603
1089
  this._hemiLight.position.set(0, 50, 0);
604
1090
  this.add(this._hemiLight);
605
- this._dirLight = new import_three5.DirectionalLight(16777215, 3);
1091
+ this._dirLight = new import_three6.DirectionalLight(16777215, 3);
606
1092
  this._dirLight.layers.mask = PRODUCT_LAYER_MASK;
607
1093
  this._dirLight.position.set(1, 1.75, 1);
608
1094
  this._dirLight.position.multiplyScalar(30);
@@ -632,7 +1118,7 @@ var DIVESceneLight = class extends import_three5.Object3D {
632
1118
  };
633
1119
 
634
1120
  // src/scene/root/lightroot/LightRoot.ts
635
- var DIVELightRoot = class extends import_three6.Object3D {
1121
+ var DIVELightRoot = class extends import_three7.Object3D {
636
1122
  constructor() {
637
1123
  super();
638
1124
  this.name = "LightRoot";
@@ -676,7 +1162,7 @@ var DIVELightRoot = class extends import_three6.Object3D {
676
1162
  if (light.position !== void 0 && light.position !== null) sceneObject.position.set(light.position.x, light.position.y, light.position.z);
677
1163
  if (light.intensity !== void 0 && light.intensity !== null) sceneObject.SetIntensity(light.intensity);
678
1164
  if (light.enabled !== void 0 && light.enabled !== null) sceneObject.SetEnabled(light.enabled);
679
- if (light.color !== void 0 && light.color !== null) sceneObject.SetColor(new import_three6.Color(light.color));
1165
+ if (light.color !== void 0 && light.color !== null) sceneObject.SetColor(new import_three7.Color(light.color));
680
1166
  if (light.visible !== void 0 && light.visible !== null) sceneObject.visible = light.visible;
681
1167
  }
682
1168
  DeleteLight(light) {
@@ -707,10 +1193,11 @@ var DIVELightRoot = class extends import_three6.Object3D {
707
1193
  };
708
1194
 
709
1195
  // src/scene/root/modelroot/ModelRoot.ts
710
- var import_three8 = require("three");
1196
+ var import_three9 = require("three");
711
1197
 
712
1198
  // src/model/Model.ts
713
- var import_three7 = require("three");
1199
+ var import_three8 = require("three");
1200
+ init_VisibilityLayerMask();
714
1201
 
715
1202
  // src/helper/findSceneRecursive/findSceneRecursive.ts
716
1203
  var findSceneRecursive = (object) => {
@@ -721,14 +1208,14 @@ var findSceneRecursive = (object) => {
721
1208
  };
722
1209
 
723
1210
  // src/model/Model.ts
724
- var DIVEModel = class extends import_three7.Object3D {
1211
+ var DIVEModel = class extends import_three8.Object3D {
725
1212
  constructor() {
726
1213
  super();
727
1214
  this.isSelectable = true;
728
1215
  this.isMoveable = true;
729
1216
  this.gizmo = null;
730
1217
  this.layers.mask = PRODUCT_LAYER_MASK;
731
- this.boundingBox = new import_three7.Box3();
1218
+ this.boundingBox = new import_three8.Box3();
732
1219
  }
733
1220
  SetModel(gltf) {
734
1221
  this.clear();
@@ -744,7 +1231,7 @@ var DIVEModel = class extends import_three7.Object3D {
744
1231
  this.position.set(position.x, position.y, position.z);
745
1232
  }
746
1233
  SetRotation(rotation) {
747
- this.rotation.setFromVector3(new import_three7.Vector3(rotation.x, rotation.y, rotation.z));
1234
+ this.rotation.setFromVector3(new import_three8.Vector3(rotation.x, rotation.y, rotation.z));
748
1235
  }
749
1236
  SetScale(scale) {
750
1237
  this.scale.set(scale.x, scale.y, scale.z);
@@ -771,9 +1258,9 @@ var DIVEModel = class extends import_three7.Object3D {
771
1258
  return;
772
1259
  }
773
1260
  const bottomY = this.boundingBox.min.y * this.scale.y;
774
- const bbBottomCenter = this.localToWorld(this.boundingBox.getCenter(new import_three7.Vector3()).multiply(this.scale));
1261
+ const bbBottomCenter = this.localToWorld(this.boundingBox.getCenter(new import_three8.Vector3()).multiply(this.scale));
775
1262
  bbBottomCenter.y = bottomY + this.position.y;
776
- const raycaster = new import_three7.Raycaster(bbBottomCenter, new import_three7.Vector3(0, -1, 0));
1263
+ const raycaster = new import_three8.Raycaster(bbBottomCenter, new import_three8.Vector3(0, -1, 0));
777
1264
  raycaster.layers.mask = PRODUCT_LAYER_MASK;
778
1265
  const intersections = raycaster.intersectObjects(findSceneRecursive(this).Root.children, true);
779
1266
  if (intersections.length > 0) {
@@ -782,7 +1269,7 @@ var DIVEModel = class extends import_three7.Object3D {
782
1269
  const meshBB = mesh.geometry.boundingBox;
783
1270
  const worldPos = mesh.localToWorld(meshBB.max.clone());
784
1271
  const oldPos = this.position.clone();
785
- const newPos = this.position.clone().setY(worldPos.y).add(new import_three7.Vector3(0, bottomY, 0));
1272
+ const newPos = this.position.clone().setY(worldPos.y).sub(new import_three8.Vector3(0, bottomY, 0));
786
1273
  this.position.copy(newPos);
787
1274
  if (this.position.y === oldPos.y) return;
788
1275
  (_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 });
@@ -803,13 +1290,13 @@ var DIVEModel = class extends import_three7.Object3D {
803
1290
  };
804
1291
 
805
1292
  // src/loadingmanager/LoadingManager.ts
806
- var import_Addons = require("three/examples/jsm/Addons.js");
1293
+ var import_Addons2 = require("three/examples/jsm/Addons.js");
807
1294
  var DIVELoadingManager = class {
808
1295
  // ... maybe extend with other loaders later
809
1296
  constructor() {
810
1297
  this.progress = /* @__PURE__ */ new Map();
811
- this.gltfloader = new import_Addons.GLTFLoader();
812
- this.dracoloader = new import_Addons.DRACOLoader();
1298
+ this.gltfloader = new import_Addons2.GLTFLoader();
1299
+ this.dracoloader = new import_Addons2.DRACOLoader();
813
1300
  this.dracoloader.setDecoderPath("https://www.gstatic.com/draco/v1/decoders/");
814
1301
  this.gltfloader.setDRACOLoader(this.dracoloader);
815
1302
  }
@@ -835,7 +1322,7 @@ var DIVELoadingManager = class {
835
1322
  };
836
1323
 
837
1324
  // src/scene/root/modelroot/ModelRoot.ts
838
- var DIVEModelRoot = class extends import_three8.Object3D {
1325
+ var DIVEModelRoot = class extends import_three9.Object3D {
839
1326
  constructor() {
840
1327
  super();
841
1328
  this.name = "ModelRoot";
@@ -904,10 +1391,11 @@ var DIVEModelRoot = class extends import_three8.Object3D {
904
1391
  };
905
1392
 
906
1393
  // src/primitive/floor/Floor.ts
907
- var import_three9 = require("three");
908
- var DIVEFloor = class extends import_three9.Mesh {
1394
+ var import_three10 = require("three");
1395
+ init_VisibilityLayerMask();
1396
+ var DIVEFloor = class extends import_three10.Mesh {
909
1397
  constructor() {
910
- super(new import_three9.PlaneGeometry(1e4, 1e4), new import_three9.MeshStandardMaterial({ color: new import_three9.Color(150 / 255, 150 / 255, 150 / 255) }));
1398
+ super(new import_three10.PlaneGeometry(1e4, 1e4), new import_three10.MeshStandardMaterial({ color: new import_three10.Color(150 / 255, 150 / 255, 150 / 255) }));
911
1399
  this.isFloor = true;
912
1400
  this.name = "Floor";
913
1401
  this.layers.mask = PRODUCT_LAYER_MASK;
@@ -918,7 +1406,7 @@ var DIVEFloor = class extends import_three9.Mesh {
918
1406
  this.visible = visible;
919
1407
  }
920
1408
  SetColor(color) {
921
- this.material.color = new import_three9.Color(color);
1409
+ this.material.color = new import_three10.Color(color);
922
1410
  }
923
1411
  };
924
1412
 
@@ -927,20 +1415,24 @@ var GRID_CENTER_LINE_COLOR = "#888888";
927
1415
  var GRID_SIDE_LINE_COLOR = "#dddddd";
928
1416
 
929
1417
  // src/grid/Grid.ts
930
- var import_three10 = require("three");
931
- var DIVEGrid = class extends import_three10.Object3D {
1418
+ init_VisibilityLayerMask();
1419
+ var import_three11 = require("three");
1420
+ var DIVEGrid = class extends import_three11.Object3D {
932
1421
  constructor() {
933
1422
  super();
934
1423
  this.name = "Grid";
935
- const grid = new import_three10.GridHelper(100, 100, GRID_CENTER_LINE_COLOR, GRID_SIDE_LINE_COLOR);
1424
+ const grid = new import_three11.GridHelper(100, 100, GRID_CENTER_LINE_COLOR, GRID_SIDE_LINE_COLOR);
936
1425
  grid.material.depthTest = false;
937
1426
  grid.layers.mask = HELPER_LAYER_MASK;
938
1427
  this.add(grid);
939
1428
  }
1429
+ SetVisibility(visible) {
1430
+ this.visible = visible;
1431
+ }
940
1432
  };
941
1433
 
942
1434
  // src/scene/root/Root.ts
943
- var DIVERoot = class extends import_three11.Object3D {
1435
+ var DIVERoot = class extends import_three12.Object3D {
944
1436
  get Floor() {
945
1437
  return this.floor;
946
1438
  }
@@ -959,6 +1451,15 @@ var DIVERoot = class extends import_three11.Object3D {
959
1451
  this.grid = new DIVEGrid();
960
1452
  this.add(this.grid);
961
1453
  }
1454
+ ComputeSceneBB() {
1455
+ const bb = new import_three12.Box3();
1456
+ this.modelRoot.traverse((object) => {
1457
+ if ("isObject3D" in object) {
1458
+ bb.expandByObject(object);
1459
+ }
1460
+ });
1461
+ return bb;
1462
+ }
962
1463
  GetSceneObject(object) {
963
1464
  switch (object.entityType) {
964
1465
  case "pov": {
@@ -1023,17 +1524,21 @@ var DIVERoot = class extends import_three11.Object3D {
1023
1524
  };
1024
1525
 
1025
1526
  // src/scene/Scene.ts
1026
- var DIVEScene = class extends import_three12.Scene {
1527
+ var DIVEScene = class extends import_three13.Scene {
1027
1528
  get Root() {
1028
1529
  return this.root;
1029
1530
  }
1030
1531
  constructor() {
1031
1532
  super();
1533
+ this.background = new import_three13.Color(16777215);
1032
1534
  this.root = new DIVERoot();
1033
1535
  this.add(this.root);
1034
1536
  }
1035
1537
  SetBackground(color) {
1036
- this.background = new import_three12.Color(color);
1538
+ this.background = new import_three13.Color(color);
1539
+ }
1540
+ ComputeSceneBB() {
1541
+ return this.Root.ComputeSceneBB();
1037
1542
  }
1038
1543
  GetSceneObject(object) {
1039
1544
  return this.Root.GetSceneObject(object);
@@ -1052,42 +1557,18 @@ var DIVEScene = class extends import_three12.Scene {
1052
1557
  }
1053
1558
  };
1054
1559
 
1055
- // src/camera/PerspectiveCamera.ts
1056
- var import_three13 = require("three");
1057
- var DIVEPerspectiveCameraDefaultSettings = {
1058
- fov: 80,
1059
- near: 0.1,
1060
- far: 1e3
1061
- };
1062
- var _DIVEPerspectiveCamera = class _DIVEPerspectiveCamera extends import_three13.PerspectiveCamera {
1063
- constructor(settings = DIVEPerspectiveCameraDefaultSettings) {
1064
- super(settings.fov, 1, settings.near, settings.far);
1065
- this.onSetCameraLayer = () => {
1066
- };
1067
- this.layers.mask = _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1068
- }
1069
- OnResize(width, height) {
1070
- this.aspect = width / height;
1071
- this.updateProjectionMatrix();
1072
- }
1073
- SetCameraLayer(layer) {
1074
- this.layers.mask = layer === "LIVE" ? _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1075
- this.onSetCameraLayer(this.layers.mask);
1076
- }
1077
- };
1078
- _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;
1079
- _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;
1080
- var DIVEPerspectiveCamera = _DIVEPerspectiveCamera;
1560
+ // src/dive.ts
1561
+ init_PerspectiveCamera();
1081
1562
 
1082
1563
  // src/controls/OrbitControls.ts
1083
- var import_Addons2 = require("three/examples/jsm/Addons.js");
1564
+ var import_Addons3 = require("three/examples/jsm/Addons.js");
1084
1565
  var import_three14 = require("three");
1085
1566
  var import_tween = require("@tweenjs/tween.js");
1086
1567
  var DIVEOrbitControlsDefaultSettings = {
1087
1568
  enableDamping: true,
1088
1569
  dampingFactor: 0.04
1089
1570
  };
1090
- var _DIVEOrbitControls = class _DIVEOrbitControls extends import_Addons2.OrbitControls {
1571
+ var _DIVEOrbitControls = class _DIVEOrbitControls extends import_Addons3.OrbitControls {
1091
1572
  constructor(camera, renderer, settings = DIVEOrbitControlsDefaultSettings) {
1092
1573
  super(camera, renderer.domElement);
1093
1574
  this.last = null;
@@ -1109,6 +1590,16 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends import_Addons2.OrbitCo
1109
1590
  this.enableDamping = settings.enableDamping;
1110
1591
  this.dampingFactor = settings.dampingFactor;
1111
1592
  }
1593
+ ComputeEncompassingView(bb) {
1594
+ const center = bb.getCenter(new import_three14.Vector3());
1595
+ const size = bb.getSize(new import_three14.Vector3());
1596
+ const distance = Math.max(size.x, size.y, size.z) * 1.25;
1597
+ const direction = this.object.position.clone().normalize();
1598
+ return {
1599
+ position: direction.multiplyScalar(distance),
1600
+ target: center
1601
+ };
1602
+ }
1112
1603
  ZoomIn(by) {
1113
1604
  const zoomBy = by || _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;
1114
1605
  const { minDistance, maxDistance } = this;
@@ -1169,394 +1660,40 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends import_Addons2.OrbitCo
1169
1660
  _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR = 1;
1170
1661
  var DIVEOrbitControls = _DIVEOrbitControls;
1171
1662
 
1172
- // src/mediacreator/MediaCreator.ts
1173
- var DIVEMediaCreator = class {
1174
- constructor(renderer, scene, controller) {
1175
- this.renderer = renderer;
1176
- this.scene = scene;
1177
- this.controller = controller;
1178
- }
1179
- GenerateMedia(position, target, width, height) {
1180
- const resetPosition = this.controller.object.position.clone();
1181
- const resetRotation = this.controller.object.quaternion.clone();
1182
- this.renderer.OnResize(width, height);
1183
- this.controller.object.OnResize(width, height);
1184
- this.controller.object.position.copy(position);
1185
- this.controller.target.copy(target);
1186
- this.controller.update();
1187
- const dataUri = this.DrawCanvas().toDataURL();
1188
- this.controller.object.position.copy(resetPosition);
1189
- this.controller.object.quaternion.copy(resetRotation);
1190
- return dataUri;
1191
- }
1192
- DrawCanvas(canvasElement) {
1193
- const restore = this.renderer.domElement;
1194
- if (canvasElement) {
1195
- this.renderer.domElement = canvasElement;
1196
- }
1197
- this.controller.object.layers.mask = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;
1198
- this.renderer.render(this.scene, this.controller.object);
1199
- this.controller.object.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1200
- const returnCanvas = this.renderer.domElement;
1201
- if (canvasElement) {
1202
- this.renderer.domElement = restore;
1663
+ // src/toolbox/Toolbox.ts
1664
+ var DIVEToolbox = class {
1665
+ get selectTool() {
1666
+ if (!this._selectTool) {
1667
+ const DIVESelectTool2 = (init_SelectTool(), __toCommonJS(SelectTool_exports)).DIVESelectTool;
1668
+ this._selectTool = new DIVESelectTool2(this._scene, this._controller);
1203
1669
  }
1204
- return returnCanvas;
1205
- }
1206
- };
1207
-
1208
- // src/interface/Selectable.ts
1209
- function isSelectable(object) {
1210
- return "isSelectable" in object;
1211
- }
1212
-
1213
- // src/toolbox/BaseTool.ts
1214
- var import_three15 = require("three");
1215
-
1216
- // src/interface/Draggable.ts
1217
- var isDraggable = (object) => {
1218
- return "isDraggable" in object;
1219
- };
1220
- var findDraggableInterface = (child) => {
1221
- if (child === void 0) return void 0;
1222
- if (child.parent === null) {
1223
- return void 0;
1670
+ return this._selectTool;
1224
1671
  }
1225
- if (isDraggable(child)) {
1226
- return child;
1227
- }
1228
- return findDraggableInterface(child.parent);
1229
- };
1230
-
1231
- // src/interface/Hoverable.ts
1232
- var isHoverable = (object) => {
1233
- return "isHoverable" in object;
1234
- };
1235
- var findHoverableInterface = (child) => {
1236
- if (child === void 0) return void 0;
1237
- if (child.parent === null) {
1238
- return void 0;
1239
- }
1240
- if (isHoverable(child)) {
1241
- return child;
1242
- }
1243
- return findHoverableInterface(child.parent);
1244
- };
1245
-
1246
- // src/toolbox/BaseTool.ts
1247
- var DIVEBaseTool = class {
1248
1672
  constructor(scene, controller) {
1249
- this.POINTER_DRAG_THRESHOLD = 1e-3;
1250
- this.name = "BaseTool";
1251
- this._canvas = controller.domElement;
1252
1673
  this._scene = scene;
1253
1674
  this._controller = controller;
1254
- this._pointer = new import_three15.Vector2();
1255
- this._pointerPrimaryDown = false;
1256
- this._pointerMiddleDown = false;
1257
- this._pointerSecondaryDown = false;
1258
- this._lastPointerDown = new import_three15.Vector2();
1259
- this._lastPointerUp = new import_three15.Vector2();
1260
- this._raycaster = new import_three15.Raycaster();
1261
- this._raycaster.layers.mask = PRODUCT_LAYER_MASK | UI_LAYER_MASK;
1262
- this._intersects = [];
1263
- this._hovered = null;
1264
- this._dragging = false;
1265
- this._dragStart = new import_three15.Vector3();
1266
- this._dragCurrent = new import_three15.Vector3();
1267
- this._dragEnd = new import_three15.Vector3();
1268
- this._dragDelta = new import_three15.Vector3();
1269
- this._draggable = null;
1270
- this._dragRaycastOnObjects = null;
1271
- }
1272
- get _pointerAnyDown() {
1273
- return this._pointerPrimaryDown || this._pointerMiddleDown || this._pointerSecondaryDown;
1274
- }
1275
- Activate() {
1276
- }
1277
- Deactivate() {
1278
- }
1279
- onPointerDown(e) {
1280
- var _a;
1281
- switch (e.button) {
1282
- case 0:
1283
- this._pointerPrimaryDown = true;
1284
- break;
1285
- case 1:
1286
- this._pointerMiddleDown = true;
1287
- break;
1288
- case 2:
1289
- this._pointerSecondaryDown = true;
1290
- break;
1291
- }
1292
- this._lastPointerDown.copy(this._pointer);
1293
- this._draggable = findDraggableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object) || null;
1294
- }
1295
- onDragStart(e) {
1296
- if (!this._draggable) return;
1297
- if (this._dragRaycastOnObjects !== null) {
1298
- this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
1299
- }
1300
- if (this._intersects.length === 0) return;
1301
- this._dragStart.copy(this._intersects[0].point.clone());
1302
- this._dragCurrent.copy(this._intersects[0].point.clone());
1303
- this._dragEnd.copy(this._dragStart.clone());
1304
- this._dragDelta.set(0, 0, 0);
1305
- if (this._draggable && this._draggable.onDragStart) {
1306
- this._draggable.onDragStart({
1307
- dragStart: this._dragStart,
1308
- dragCurrent: this._dragCurrent,
1309
- dragEnd: this._dragEnd,
1310
- dragDelta: this._dragDelta
1311
- });
1312
- this._dragging = true;
1313
- this._controller.enabled = false;
1314
- }
1315
- }
1316
- onPointerMove(e) {
1317
- var _a;
1318
- this._pointer.x = e.offsetX / this._canvas.clientWidth * 2 - 1;
1319
- this._pointer.y = -(e.offsetY / this._canvas.clientHeight) * 2 + 1;
1320
- this._raycaster.setFromCamera(this._pointer, this._controller.object);
1321
- this._intersects = this.raycast(this._scene.children);
1322
- const hoverable = findHoverableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object);
1323
- if (this._intersects[0] && hoverable) {
1324
- if (!this._hovered) {
1325
- if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
1326
- this._hovered = hoverable;
1327
- return;
1328
- }
1329
- if (this._hovered.uuid !== hoverable.uuid) {
1330
- if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
1331
- if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
1332
- this._hovered = hoverable;
1333
- return;
1334
- }
1335
- if (hoverable.onPointerOver) hoverable.onPointerOver(this._intersects[0]);
1336
- this._hovered = hoverable;
1337
- } else {
1338
- if (this._hovered) {
1339
- if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
1340
- }
1341
- this._hovered = null;
1342
- }
1343
- if (this._pointerAnyDown) {
1344
- if (!this._dragging) {
1345
- this.onDragStart(e);
1346
- }
1347
- this.onDrag(e);
1348
- }
1349
- }
1350
- onDrag(e) {
1351
- if (this._dragRaycastOnObjects !== null) {
1352
- this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
1353
- }
1354
- const intersect = this._intersects[0];
1355
- if (!intersect) return;
1356
- this._dragCurrent.copy(intersect.point.clone());
1357
- this._dragEnd.copy(intersect.point.clone());
1358
- this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
1359
- if (this._draggable && this._draggable.onDrag) {
1360
- this._draggable.onDrag({
1361
- dragStart: this._dragStart,
1362
- dragCurrent: this._dragCurrent,
1363
- dragEnd: this._dragEnd,
1364
- dragDelta: this._dragDelta
1365
- });
1366
- }
1367
- }
1368
- onPointerUp(e) {
1369
- if (this.pointerWasDragged() || this._dragging) {
1370
- if (this._draggable) {
1371
- this.onDragEnd(e);
1372
- }
1373
- } else {
1374
- this.onClick(e);
1375
- }
1376
- switch (e.button) {
1377
- case 0:
1378
- this._pointerPrimaryDown = false;
1379
- break;
1380
- case 1:
1381
- this._pointerMiddleDown = false;
1382
- break;
1383
- case 2:
1384
- this._pointerSecondaryDown = false;
1385
- break;
1386
- }
1387
- this._lastPointerUp.copy(this._pointer);
1388
- }
1389
- onClick(e) {
1675
+ this._selectTool = null;
1676
+ this._activeTool = null;
1390
1677
  }
1391
- onDragEnd(e) {
1392
- const intersect = this._intersects[0];
1393
- if (intersect) {
1394
- this._dragEnd.copy(intersect.point.clone());
1395
- this._dragCurrent.copy(intersect.point.clone());
1396
- this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
1397
- }
1398
- if (this._draggable && this._draggable.onDragEnd) {
1399
- this._draggable.onDragEnd({
1400
- dragStart: this._dragStart,
1401
- dragCurrent: this._dragCurrent,
1402
- dragEnd: this._dragEnd,
1403
- dragDelta: this._dragDelta
1404
- });
1405
- }
1406
- this._draggable = null;
1407
- this._dragging = false;
1408
- this._dragStart.set(0, 0, 0);
1409
- this._dragCurrent.set(0, 0, 0);
1410
- this._dragEnd.set(0, 0, 0);
1411
- this._dragDelta.set(0, 0, 0);
1412
- this._controller.enabled = true;
1413
- }
1414
- onWheel(e) {
1415
- }
1416
- raycast(objects) {
1417
- if (objects !== void 0) return this._raycaster.intersectObjects(objects, true).filter((i) => i.object.visible);
1418
- return this._raycaster.intersectObjects(this._scene.children, true).filter((i) => i.object.visible);
1419
- }
1420
- pointerWasDragged() {
1421
- return this._lastPointerDown.distanceTo(this._pointer) > this.POINTER_DRAG_THRESHOLD;
1422
- }
1423
- };
1424
-
1425
- // src/toolbox/transform/TransformTool.ts
1426
- var import_Addons3 = require("three/examples/jsm/Addons");
1427
- var DIVETransformTool = class extends DIVEBaseTool {
1428
- constructor(scene, controller) {
1429
- super(scene, controller);
1430
- this.name = "DIVETransformTool";
1431
- this._gizmo = new import_Addons3.TransformControls(this._controller.object, this._controller.domElement);
1432
- this._gizmo.mode = "translate";
1433
- this._gizmo.addEventListener("mouseDown", () => {
1434
- controller.enabled = false;
1435
- });
1436
- this._gizmo.addEventListener("mouseUp", () => {
1437
- controller.enabled = true;
1438
- });
1439
- this._gizmo.addEventListener("objectChange", () => {
1440
- if (!this._gizmo.object) return;
1441
- if (!("isMoveable" in this._gizmo.object)) return;
1442
- if (!("onMove" in this._gizmo.object)) return;
1443
- this._gizmo.object.onMove();
1444
- });
1445
- scene.add(this._gizmo);
1446
- }
1447
- Activate() {
1448
- }
1449
- SetGizmoMode(mode) {
1450
- this._gizmo.mode = mode;
1451
- }
1452
- SetGizmoVisibility(active) {
1453
- const contains = this._scene.children.includes(this._gizmo);
1454
- if (active && !contains) {
1455
- this._scene.add(this._gizmo);
1456
- } else if (!active && contains) {
1457
- this._scene.remove(this._gizmo);
1458
- }
1459
- }
1460
- // public onPointerDown(e: PointerEvent): void {
1461
- // super.onPointerDown(e);
1462
- // // if (this._hovered) {
1463
- // // this._dragRaycastOnObjects = this._gizmo.gizmoPlane.children;
1464
- // // }
1465
- // }
1466
- // protected raycast(): Intersection[] {
1467
- // return super.raycast(this._gizmo.gizmoNode.children);
1468
- // }
1469
- };
1470
-
1471
- // src/toolbox/select/SelectTool.ts
1472
- var DIVESelectTool = class extends DIVETransformTool {
1473
- constructor(scene, controller) {
1474
- super(scene, controller);
1475
- this.name = "SelectTool";
1476
- }
1477
- Activate() {
1478
- }
1479
- Select(selectable) {
1480
- if (selectable.onSelect) selectable.onSelect();
1481
- this.AttachGizmo(selectable);
1482
- }
1483
- Deselect(selectable) {
1484
- if (selectable.onDeselect) selectable.onDeselect();
1485
- this.DetachGizmo();
1486
- }
1487
- DetachGizmo() {
1488
- this._gizmo.detach();
1489
- }
1490
- AttachGizmo(selectable) {
1491
- if ("isMoveable" in selectable) {
1492
- const movable = selectable;
1493
- this._gizmo.attach(movable);
1494
- this.SetGizmoVisibility(movable.visible);
1495
- }
1496
- }
1497
- onClick(e) {
1498
- super.onClick(e);
1499
- const first = this._raycaster.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];
1500
- const selectable = this.findSelectableInterface(first == null ? void 0 : first.object);
1501
- if (!first || !selectable) {
1502
- if (this._gizmo.object) {
1503
- this.Deselect(this._gizmo.object);
1504
- }
1505
- return;
1506
- }
1507
- if (this._gizmo.object) {
1508
- if (this._gizmo.object.uuid === selectable.uuid) return;
1509
- this.Deselect(this._gizmo.object);
1510
- }
1511
- this.Select(selectable);
1512
- }
1513
- findSelectableInterface(child) {
1514
- if (child === void 0) return void 0;
1515
- if (child.parent === null) {
1516
- return void 0;
1517
- }
1518
- if (isSelectable(child)) {
1519
- return child;
1520
- }
1521
- return this.findSelectableInterface(child.parent);
1522
- }
1523
- };
1524
-
1525
- // src/toolbox/Toolbox.ts
1526
- var DIVEToolbox = class {
1527
- constructor(scene, controller) {
1528
- this.removeListenersCallback = () => {
1529
- };
1530
- this.selectTool = new DIVESelectTool(scene, controller);
1531
- const pointerMove = this.onPointerMove.bind(this);
1532
- const pointerDown = this.onPointerDown.bind(this);
1533
- const pointerUp = this.onPointerUp.bind(this);
1534
- const wheel = this.onWheel.bind(this);
1535
- controller.domElement.addEventListener("pointermove", pointerMove);
1536
- controller.domElement.addEventListener("pointerdown", pointerDown);
1537
- controller.domElement.addEventListener("pointerup", pointerUp);
1538
- controller.domElement.addEventListener("wheel", wheel);
1539
- this.removeListenersCallback = () => {
1540
- controller.domElement.removeEventListener("pointermove", pointerMove);
1541
- controller.domElement.removeEventListener("pointerdown", pointerDown);
1542
- controller.domElement.removeEventListener("pointerup", pointerUp);
1543
- controller.domElement.removeEventListener("wheel", wheel);
1544
- };
1545
- this.activeTool = this.selectTool;
1546
- this.activeTool.Activate();
1547
- }
1548
- dispose() {
1549
- this.removeListenersCallback();
1678
+ Dispose() {
1679
+ this.removeEventListeners();
1550
1680
  }
1551
1681
  GetActiveTool() {
1552
- return this.activeTool;
1682
+ return this._activeTool;
1553
1683
  }
1554
1684
  UseTool(tool) {
1555
- this.activeTool.Deactivate();
1685
+ var _a;
1686
+ (_a = this._activeTool) == null ? void 0 : _a.Deactivate();
1556
1687
  switch (tool) {
1557
1688
  case "select": {
1689
+ this.addEventListeners();
1558
1690
  this.selectTool.Activate();
1559
- this.activeTool = this.selectTool;
1691
+ this._activeTool = this.selectTool;
1692
+ break;
1693
+ }
1694
+ case "none": {
1695
+ this.removeEventListeners();
1696
+ this._activeTool = null;
1560
1697
  break;
1561
1698
  }
1562
1699
  default: {
@@ -1571,31 +1708,40 @@ var DIVEToolbox = class {
1571
1708
  this.selectTool.SetGizmoVisibility(active);
1572
1709
  }
1573
1710
  onPointerMove(e) {
1574
- this.activeTool.onPointerMove(e);
1711
+ var _a;
1712
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerMove(e);
1575
1713
  }
1576
1714
  onPointerDown(e) {
1577
- this.activeTool.onPointerDown(e);
1715
+ var _a;
1716
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerDown(e);
1578
1717
  }
1579
1718
  onPointerUp(e) {
1580
- this.activeTool.onPointerUp(e);
1719
+ var _a;
1720
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerUp(e);
1581
1721
  }
1582
1722
  onWheel(e) {
1583
- this.activeTool.onWheel(e);
1723
+ var _a;
1724
+ (_a = this._activeTool) == null ? void 0 : _a.onWheel(e);
1584
1725
  }
1585
- };
1586
- DIVEToolbox.DefaultTool = "select";
1587
-
1588
- // src/animation/AnimationSystem.ts
1589
- var import_tween2 = require("@tweenjs/tween.js");
1590
- var DIVEAnimationSystem = class {
1591
- update() {
1592
- (0, import_tween2.update)();
1726
+ addEventListeners() {
1727
+ this._controller.domElement.addEventListener("pointermove", (e) => this.onPointerMove(e));
1728
+ this._controller.domElement.addEventListener("pointerdown", (e) => this.onPointerDown(e));
1729
+ this._controller.domElement.addEventListener("pointerup", (e) => this.onPointerUp(e));
1730
+ this._controller.domElement.addEventListener("wheel", (e) => this.onWheel(e));
1731
+ }
1732
+ removeEventListeners() {
1733
+ this._controller.domElement.removeEventListener("pointermove", (e) => this.onPointerMove(e));
1734
+ this._controller.domElement.removeEventListener("pointerdown", (e) => this.onPointerDown(e));
1735
+ this._controller.domElement.removeEventListener("pointerup", (e) => this.onPointerUp(e));
1736
+ this._controller.domElement.removeEventListener("wheel", (e) => this.onWheel(e));
1593
1737
  }
1594
1738
  };
1739
+ DIVEToolbox.DefaultTool = "select";
1595
1740
 
1596
1741
  // src/axiscamera/AxisCamera.ts
1597
- var import_three16 = require("three");
1742
+ var import_three15 = require("three");
1598
1743
  var import_three_spritetext = __toESM(require("three-spritetext"), 1);
1744
+ init_VisibilityLayerMask();
1599
1745
 
1600
1746
  // src/constant/AxisHelperColors.ts
1601
1747
  var AxesColorRedLetter = "#c20017";
@@ -1606,18 +1752,18 @@ var AxesColorGreen = AxesColorGreenLetter;
1606
1752
  var AxesColorBlue = AxesColorBlueLetter;
1607
1753
 
1608
1754
  // src/axiscamera/AxisCamera.ts
1609
- var DIVEAxisCamera = class extends import_three16.OrthographicCamera {
1610
- constructor() {
1755
+ var DIVEAxisCamera = class extends import_three15.OrthographicCamera {
1756
+ constructor(renderer, scene, controls) {
1611
1757
  super(-1, 1, 1, -1, 0.1, 100);
1612
1758
  this.layers.mask = COORDINATE_LAYER_MASK;
1613
- this.axesHelper = new import_three16.AxesHelper(0.5);
1759
+ this.axesHelper = new import_three15.AxesHelper(0.5);
1614
1760
  this.axesHelper.layers.mask = COORDINATE_LAYER_MASK;
1615
1761
  this.axesHelper.material.depthTest = false;
1616
1762
  this.axesHelper.position.set(0, 0, -1);
1617
1763
  this.axesHelper.setColors(
1618
- new import_three16.Color(AxesColorRed),
1619
- new import_three16.Color(AxesColorGreen),
1620
- new import_three16.Color(AxesColorBlue)
1764
+ new import_three15.Color(AxesColorRed),
1765
+ new import_three15.Color(AxesColorGreen),
1766
+ new import_three15.Color(AxesColorBlue)
1621
1767
  );
1622
1768
  const x = new import_three_spritetext.default("X", 0.2, AxesColorRedLetter);
1623
1769
  const y = new import_three_spritetext.default("Y", 0.2, AxesColorGreenLetter);
@@ -1632,9 +1778,29 @@ var DIVEAxisCamera = class extends import_three16.OrthographicCamera {
1632
1778
  this.axesHelper.add(y);
1633
1779
  this.axesHelper.add(z);
1634
1780
  this.add(this.axesHelper);
1781
+ this._renderer = renderer;
1782
+ this._scene = scene;
1783
+ this._scene.add(this);
1784
+ const restoreViewport = new import_three15.Vector4();
1785
+ this._renderCallbackId = renderer.AddPostRenderCallback(() => {
1786
+ const restoreBackground = scene.background;
1787
+ scene.background = null;
1788
+ renderer.getViewport(restoreViewport);
1789
+ renderer.setViewport(0, 0, 150, 150);
1790
+ renderer.autoClear = false;
1791
+ this.SetFromCameraMatrix(controls.object.matrix);
1792
+ renderer.render(scene, this);
1793
+ renderer.setViewport(restoreViewport);
1794
+ renderer.autoClear = true;
1795
+ scene.background = restoreBackground;
1796
+ });
1797
+ }
1798
+ Dispose() {
1799
+ this._renderer.RemovePostRenderCallback(this._renderCallbackId);
1800
+ this._scene.remove(this);
1635
1801
  }
1636
1802
  SetFromCameraMatrix(matrix) {
1637
- this.axesHelper.rotation.setFromRotationMatrix(new import_three16.Matrix4().extractRotation(matrix).invert());
1803
+ this.axesHelper.rotation.setFromRotationMatrix(new import_three15.Matrix4().extractRotation(matrix).invert());
1638
1804
  }
1639
1805
  };
1640
1806
 
@@ -1751,13 +1917,63 @@ var DIVEMath = {
1751
1917
  };
1752
1918
 
1753
1919
  // src/dive.ts
1920
+ var import_MathUtils2 = require("three/src/math/MathUtils");
1754
1921
  var DIVEDefaultSettings = {
1755
1922
  autoResize: true,
1923
+ displayAxes: false,
1756
1924
  renderer: DIVERendererDefaultSettings,
1757
1925
  perspectiveCamera: DIVEPerspectiveCameraDefaultSettings,
1758
1926
  orbitControls: DIVEOrbitControlsDefaultSettings
1759
1927
  };
1760
- var DIVE = class {
1928
+ var DIVE = class _DIVE {
1929
+ // static members
1930
+ static QuickView(uri) {
1931
+ const dive = new _DIVE();
1932
+ dive.Communication.PerformAction("SET_CAMERA_TRANSFORM", {
1933
+ position: { x: 0, y: 2, z: 2 },
1934
+ target: { x: 0, y: 0.5, z: 0 }
1935
+ });
1936
+ const lightid = (0, import_MathUtils2.generateUUID)();
1937
+ dive.Communication.PerformAction("ADD_OBJECT", {
1938
+ entityType: "light",
1939
+ type: "scene",
1940
+ name: "light",
1941
+ id: lightid,
1942
+ enabled: true,
1943
+ visible: true,
1944
+ intensity: 1,
1945
+ color: 16777215
1946
+ });
1947
+ const modelid = (0, import_MathUtils2.generateUUID)();
1948
+ dive.Communication.Subscribe("MODEL_LOADED", (data) => {
1949
+ if (data.id !== modelid) return;
1950
+ dive.Communication.PerformAction("PLACE_ON_FLOOR", {
1951
+ id: modelid
1952
+ });
1953
+ const transform = dive.Communication.PerformAction("COMPUTE_ENCOMPASSING_VIEW", {});
1954
+ dive.Communication.PerformAction("SET_CAMERA_TRANSFORM", {
1955
+ position: transform.position,
1956
+ target: transform.target
1957
+ });
1958
+ });
1959
+ dive.Communication.PerformAction("ADD_OBJECT", {
1960
+ entityType: "model",
1961
+ name: "object",
1962
+ id: modelid,
1963
+ position: { x: 0, y: 0, z: 0 },
1964
+ rotation: { x: 0, y: 0, z: 0 },
1965
+ scale: { x: 1, y: 1, z: 1 },
1966
+ uri,
1967
+ visible: true,
1968
+ loaded: false
1969
+ });
1970
+ dive.Communication.PerformAction("UPDATE_SCENE", {
1971
+ backgroundColor: 16777215,
1972
+ gridEnabled: false,
1973
+ floorColor: 16777215
1974
+ });
1975
+ return dive;
1976
+ }
1761
1977
  // getters
1762
1978
  get Communication() {
1763
1979
  return this.communication;
@@ -1767,6 +1983,7 @@ var DIVE = class {
1767
1983
  }
1768
1984
  // setters
1769
1985
  set Settings(settings) {
1986
+ var _a;
1770
1987
  const settingsDelta = getObjectDelta(this._settings, settings);
1771
1988
  if (settingsDelta.renderer) this.renderer = new DIVERenderer(this._settings.renderer);
1772
1989
  if (settingsDelta.perspectiveCamera) {
@@ -1786,6 +2003,12 @@ var DIVE = class {
1786
2003
  this.removeResizeObserver();
1787
2004
  }
1788
2005
  }
2006
+ if (settingsDelta.displayAxes) {
2007
+ this.axisCamera = new DIVEAxisCamera(this.renderer, this.scene, this.orbitControls);
2008
+ } else {
2009
+ (_a = this.axisCamera) == null ? void 0 : _a.Dispose();
2010
+ this.axisCamera = null;
2011
+ }
1789
2012
  Object.assign(this._settings, settings);
1790
2013
  }
1791
2014
  constructor(settings) {
@@ -1797,28 +2020,14 @@ var DIVE = class {
1797
2020
  this.scene = new DIVEScene();
1798
2021
  this.perspectiveCamera = new DIVEPerspectiveCamera(this._settings.perspectiveCamera);
1799
2022
  this.orbitControls = new DIVEOrbitControls(this.perspectiveCamera, this.renderer, this._settings.orbitControls);
1800
- this.mediaCreator = new DIVEMediaCreator(this.renderer, this.scene, this.orbitControls);
1801
2023
  this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);
1802
- this.communication = new DIVECommunication(this.scene, this.orbitControls, this.toolbox, this.mediaCreator);
1803
- this.animationSystem = new DIVEAnimationSystem();
1804
- this.renderer.AddPreRenderCallback(() => {
1805
- this.animationSystem.update();
1806
- });
1807
- this.axisCamera = new DIVEAxisCamera();
1808
- this.scene.add(this.axisCamera);
1809
- const restoreViewport = new import_three17.Vector4();
1810
- this.renderer.AddPostRenderCallback(() => {
1811
- const restoreBackground = this.scene.background;
1812
- this.scene.background = null;
1813
- this.renderer.getViewport(restoreViewport);
1814
- this.renderer.setViewport(0, 0, 150, 150);
1815
- this.renderer.autoClear = false;
1816
- this.axisCamera.SetFromCameraMatrix(this.perspectiveCamera.matrix);
1817
- this.renderer.render(this.scene, this.axisCamera);
1818
- this.renderer.setViewport(restoreViewport);
1819
- this.renderer.autoClear = true;
1820
- this.scene.background = restoreBackground;
1821
- });
2024
+ this.communication = new DIVECommunication(this.renderer, this.scene, this.orbitControls, this.toolbox);
2025
+ this.animationSystem = null;
2026
+ if (this._settings.displayAxes) {
2027
+ this.axisCamera = new DIVEAxisCamera(this.renderer, this.scene, this.orbitControls);
2028
+ } else {
2029
+ this.axisCamera = null;
2030
+ }
1822
2031
  if (this._settings.autoResize) {
1823
2032
  this.addResizeObserver();
1824
2033
  }
@@ -1829,6 +2038,14 @@ var DIVE = class {
1829
2038
  }
1830
2039
  };
1831
2040
  }
2041
+ Dispose() {
2042
+ var _a;
2043
+ this.removeResizeObserver();
2044
+ this.renderer.Dispose();
2045
+ (_a = this.axisCamera) == null ? void 0 : _a.Dispose();
2046
+ this.toolbox.Dispose();
2047
+ this.communication.DestroyInstance();
2048
+ }
1832
2049
  // methods
1833
2050
  OnResize(width, height) {
1834
2051
  this.renderer.OnResize(width, height);