@shopware-ag/dive 1.4.2 → 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 (46) hide show
  1. package/README.md +38 -24
  2. package/build/dive.cjs +734 -492
  3. package/build/dive.cjs.map +1 -1
  4. package/build/dive.d.cts +182 -113
  5. package/build/dive.d.ts +182 -113
  6. package/build/dive.js +733 -478
  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 +59 -16
  15. package/src/com/__test__/Communication.test.ts +83 -24
  16. package/src/com/actions/camera/computeencompassingview.ts +9 -0
  17. package/src/com/actions/index.ts +4 -0
  18. package/src/com/actions/scene/updatescene.ts +1 -0
  19. package/src/com/actions/toolbox/transform/setgizmovisible.ts +4 -0
  20. package/src/controls/OrbitControls.ts +14 -2
  21. package/src/controls/__test__/OrbitControls.test.ts +31 -4
  22. package/src/dive.ts +93 -33
  23. package/src/grid/Grid.ts +4 -0
  24. package/src/grid/__test__/Grid.test.ts +7 -0
  25. package/src/interface/Selectable.ts +17 -0
  26. package/src/interface/__test__/Interfaces.test.ts +18 -0
  27. package/src/mediacreator/MediaCreator.ts +2 -2
  28. package/src/mediacreator/__test__/MediaCreator.test.ts +12 -10
  29. package/src/model/Model.ts +6 -0
  30. package/src/model/__test__/Model.test.ts +9 -0
  31. package/src/renderer/Renderer.ts +7 -1
  32. package/src/renderer/__test__/Renderer.test.ts +14 -5
  33. package/src/scene/Scene.ts +8 -2
  34. package/src/scene/__test__/Scene.test.ts +6 -0
  35. package/src/scene/root/Root.ts +11 -1
  36. package/src/scene/root/__test__/Root.test.ts +68 -2
  37. package/src/scene/root/modelroot/ModelRoot.ts +1 -1
  38. package/src/scene/root/modelroot/__test__/ModelRoot.test.ts +1 -0
  39. package/src/toolbox/BaseTool.ts +3 -3
  40. package/src/toolbox/Toolbox.ts +57 -37
  41. package/src/toolbox/__test__/BaseTool.test.ts +49 -7
  42. package/src/toolbox/__test__/Toolbox.test.ts +43 -40
  43. package/src/toolbox/select/SelectTool.ts +18 -28
  44. package/src/toolbox/select/__test__/SelectTool.test.ts +27 -8
  45. package/src/toolbox/transform/TransformTool.ts +16 -1
  46. package/src/toolbox/transform/__test__/TransformTool.test.ts +34 -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;
@@ -301,6 +786,10 @@ var _DIVECommunication = class _DIVECommunication {
301
786
  returnValue = this.setGizmoMode(payload);
302
787
  break;
303
788
  }
789
+ case "SET_GIZMO_VISIBILITY": {
790
+ returnValue = this.setGizmoVisibility(payload);
791
+ break;
792
+ }
304
793
  case "MODEL_LOADED": {
305
794
  returnValue = this.modelLoaded(payload);
306
795
  break;
@@ -395,8 +884,10 @@ var _DIVECommunication = class _DIVECommunication {
395
884
  const sceneObject = this.scene.GetSceneObject(object);
396
885
  if (!sceneObject) return false;
397
886
  if (!("isSelectable" in sceneObject)) return false;
398
- this.toolbox.UseTool("select");
399
- this.toolbox.GetActiveTool().AttachGizmo(sceneObject);
887
+ const activeTool = this.toolbox.GetActiveTool();
888
+ if (activeTool && isSelectTool(activeTool)) {
889
+ activeTool.AttachGizmo(sceneObject);
890
+ }
400
891
  Object.assign(payload, object);
401
892
  return true;
402
893
  }
@@ -406,8 +897,10 @@ var _DIVECommunication = class _DIVECommunication {
406
897
  const sceneObject = this.scene.GetSceneObject(object);
407
898
  if (!sceneObject) return false;
408
899
  if (!("isSelectable" in sceneObject)) return false;
409
- this.toolbox.UseTool("select");
410
- this.toolbox.GetActiveTool().DetachGizmo();
900
+ const activeTool = this.toolbox.GetActiveTool();
901
+ if (activeTool && isSelectTool(activeTool)) {
902
+ activeTool.DetachGizmo();
903
+ }
411
904
  Object.assign(payload, object);
412
905
  return true;
413
906
  }
@@ -462,6 +955,12 @@ var _DIVECommunication = class _DIVECommunication {
462
955
  this.controller.RevertLast(payload.duration);
463
956
  return true;
464
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
+ }
465
964
  zoomCamera(payload) {
466
965
  if (payload.direction === "IN") this.controller.ZoomIn(payload.by);
467
966
  if (payload.direction === "OUT") this.controller.ZoomOut(payload.by);
@@ -471,6 +970,10 @@ var _DIVECommunication = class _DIVECommunication {
471
970
  this.toolbox.SetGizmoMode(payload.mode);
472
971
  return true;
473
972
  }
973
+ setGizmoVisibility(payload) {
974
+ this.toolbox.SetGizmoVisibility(payload);
975
+ return payload;
976
+ }
474
977
  modelLoaded(payload) {
475
978
  this.registered.get(payload.id).loaded = true;
476
979
  return true;
@@ -478,10 +981,12 @@ var _DIVECommunication = class _DIVECommunication {
478
981
  updateScene(payload) {
479
982
  if (payload.name !== void 0) this.scene.name = payload.name;
480
983
  if (payload.backgroundColor !== void 0) this.scene.SetBackground(payload.backgroundColor);
984
+ if (payload.gridEnabled !== void 0) this.scene.Root.Grid.SetVisibility(payload.gridEnabled);
481
985
  if (payload.floorEnabled !== void 0) this.scene.Root.Floor.SetVisibility(payload.floorEnabled);
482
986
  if (payload.floorColor !== void 0) this.scene.Root.Floor.SetColor(payload.floorColor);
483
987
  payload.name = this.scene.name;
484
988
  payload.backgroundColor = "#" + this.scene.background.getHexString();
989
+ payload.gridEnabled = this.scene.Root.Grid.visible;
485
990
  payload.floorEnabled = this.scene.Root.Floor.visible;
486
991
  payload.floorColor = "#" + this.scene.Root.Floor.material.color.getHexString();
487
992
  return true;
@@ -504,7 +1009,8 @@ _DIVECommunication.__instances = [];
504
1009
  var DIVECommunication = _DIVECommunication;
505
1010
 
506
1011
  // src/light/PointLight.ts
507
- var DIVEPointLight = class extends Object3D2 {
1012
+ init_VisibilityLayerMask();
1013
+ var DIVEPointLight = class extends Object3D3 {
508
1014
  constructor() {
509
1015
  super();
510
1016
  this.isMoveable = true;
@@ -550,8 +1056,9 @@ var DIVEPointLight = class extends Object3D2 {
550
1056
  };
551
1057
 
552
1058
  // src/light/SceneLight.ts
553
- import { DirectionalLight, HemisphereLight, Object3D as Object3D3 } from "three";
554
- var DIVESceneLight = class extends Object3D3 {
1059
+ init_VisibilityLayerMask();
1060
+ import { DirectionalLight, HemisphereLight, Object3D as Object3D4 } from "three";
1061
+ var DIVESceneLight = class extends Object3D4 {
555
1062
  constructor() {
556
1063
  super();
557
1064
  this.name = "DIVESceneLight";
@@ -589,7 +1096,7 @@ var DIVESceneLight = class extends Object3D3 {
589
1096
  };
590
1097
 
591
1098
  // src/scene/root/lightroot/LightRoot.ts
592
- var DIVELightRoot = class extends Object3D4 {
1099
+ var DIVELightRoot = class extends Object3D5 {
593
1100
  constructor() {
594
1101
  super();
595
1102
  this.name = "LightRoot";
@@ -633,7 +1140,7 @@ var DIVELightRoot = class extends Object3D4 {
633
1140
  if (light.position !== void 0 && light.position !== null) sceneObject.position.set(light.position.x, light.position.y, light.position.z);
634
1141
  if (light.intensity !== void 0 && light.intensity !== null) sceneObject.SetIntensity(light.intensity);
635
1142
  if (light.enabled !== void 0 && light.enabled !== null) sceneObject.SetEnabled(light.enabled);
636
- 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));
637
1144
  if (light.visible !== void 0 && light.visible !== null) sceneObject.visible = light.visible;
638
1145
  }
639
1146
  DeleteLight(light) {
@@ -664,10 +1171,11 @@ var DIVELightRoot = class extends Object3D4 {
664
1171
  };
665
1172
 
666
1173
  // src/scene/root/modelroot/ModelRoot.ts
667
- import { Object3D as Object3D6 } from "three";
1174
+ import { Object3D as Object3D7 } from "three";
668
1175
 
669
1176
  // src/model/Model.ts
670
- 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";
671
1179
 
672
1180
  // src/helper/findSceneRecursive/findSceneRecursive.ts
673
1181
  var findSceneRecursive = (object) => {
@@ -678,7 +1186,7 @@ var findSceneRecursive = (object) => {
678
1186
  };
679
1187
 
680
1188
  // src/model/Model.ts
681
- var DIVEModel = class extends Object3D5 {
1189
+ var DIVEModel = class extends Object3D6 {
682
1190
  constructor() {
683
1191
  super();
684
1192
  this.isSelectable = true;
@@ -701,11 +1209,16 @@ var DIVEModel = class extends Object3D5 {
701
1209
  this.position.set(position.x, position.y, position.z);
702
1210
  }
703
1211
  SetRotation(rotation) {
704
- this.rotation.setFromVector3(new Vector3(rotation.x, rotation.y, rotation.z));
1212
+ this.rotation.setFromVector3(new Vector32(rotation.x, rotation.y, rotation.z));
705
1213
  }
706
1214
  SetScale(scale) {
707
1215
  this.scale.set(scale.x, scale.y, scale.z);
708
1216
  }
1217
+ SetVisibility(visible) {
1218
+ this.traverse((child) => {
1219
+ child.visible = visible;
1220
+ });
1221
+ }
709
1222
  SetToWorldOrigin() {
710
1223
  var _a;
711
1224
  this.position.set(0, 0, 0);
@@ -723,9 +1236,9 @@ var DIVEModel = class extends Object3D5 {
723
1236
  return;
724
1237
  }
725
1238
  const bottomY = this.boundingBox.min.y * this.scale.y;
726
- 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));
727
1240
  bbBottomCenter.y = bottomY + this.position.y;
728
- const raycaster = new Raycaster(bbBottomCenter, new Vector3(0, -1, 0));
1241
+ const raycaster = new Raycaster2(bbBottomCenter, new Vector32(0, -1, 0));
729
1242
  raycaster.layers.mask = PRODUCT_LAYER_MASK;
730
1243
  const intersections = raycaster.intersectObjects(findSceneRecursive(this).Root.children, true);
731
1244
  if (intersections.length > 0) {
@@ -734,7 +1247,7 @@ var DIVEModel = class extends Object3D5 {
734
1247
  const meshBB = mesh.geometry.boundingBox;
735
1248
  const worldPos = mesh.localToWorld(meshBB.max.clone());
736
1249
  const oldPos = this.position.clone();
737
- 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));
738
1251
  this.position.copy(newPos);
739
1252
  if (this.position.y === oldPos.y) return;
740
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 });
@@ -787,7 +1300,7 @@ var DIVELoadingManager = class {
787
1300
  };
788
1301
 
789
1302
  // src/scene/root/modelroot/ModelRoot.ts
790
- var DIVEModelRoot = class extends Object3D6 {
1303
+ var DIVEModelRoot = class extends Object3D7 {
791
1304
  constructor() {
792
1305
  super();
793
1306
  this.name = "ModelRoot";
@@ -820,7 +1333,7 @@ var DIVEModelRoot = class extends Object3D6 {
820
1333
  if (object.position !== void 0) sceneObject.SetPosition(object.position);
821
1334
  if (object.rotation !== void 0) sceneObject.SetRotation(object.rotation);
822
1335
  if (object.scale !== void 0) sceneObject.SetScale(object.scale);
823
- if (object.visible !== void 0) sceneObject.visible = object.visible;
1336
+ if (object.visible !== void 0) sceneObject.SetVisibility(object.visible);
824
1337
  }
825
1338
  DeleteModel(object) {
826
1339
  if (object.id === void 0) {
@@ -856,10 +1369,11 @@ var DIVEModelRoot = class extends Object3D6 {
856
1369
  };
857
1370
 
858
1371
  // src/primitive/floor/Floor.ts
859
- 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";
860
1374
  var DIVEFloor = class extends Mesh2 {
861
1375
  constructor() {
862
- 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) }));
863
1377
  this.isFloor = true;
864
1378
  this.name = "Floor";
865
1379
  this.layers.mask = PRODUCT_LAYER_MASK;
@@ -870,7 +1384,7 @@ var DIVEFloor = class extends Mesh2 {
870
1384
  this.visible = visible;
871
1385
  }
872
1386
  SetColor(color) {
873
- this.material.color = new Color6(color);
1387
+ this.material.color = new Color5(color);
874
1388
  }
875
1389
  };
876
1390
 
@@ -879,8 +1393,9 @@ var GRID_CENTER_LINE_COLOR = "#888888";
879
1393
  var GRID_SIDE_LINE_COLOR = "#dddddd";
880
1394
 
881
1395
  // src/grid/Grid.ts
882
- import { GridHelper, Object3D as Object3D7 } from "three";
883
- var DIVEGrid = class extends Object3D7 {
1396
+ init_VisibilityLayerMask();
1397
+ import { GridHelper, Object3D as Object3D8 } from "three";
1398
+ var DIVEGrid = class extends Object3D8 {
884
1399
  constructor() {
885
1400
  super();
886
1401
  this.name = "Grid";
@@ -889,10 +1404,13 @@ var DIVEGrid = class extends Object3D7 {
889
1404
  grid.layers.mask = HELPER_LAYER_MASK;
890
1405
  this.add(grid);
891
1406
  }
1407
+ SetVisibility(visible) {
1408
+ this.visible = visible;
1409
+ }
892
1410
  };
893
1411
 
894
1412
  // src/scene/root/Root.ts
895
- var DIVERoot = class extends Object3D8 {
1413
+ var DIVERoot = class extends Object3D9 {
896
1414
  get Floor() {
897
1415
  return this.floor;
898
1416
  }
@@ -911,6 +1429,15 @@ var DIVERoot = class extends Object3D8 {
911
1429
  this.grid = new DIVEGrid();
912
1430
  this.add(this.grid);
913
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
+ }
914
1441
  GetSceneObject(object) {
915
1442
  switch (object.entityType) {
916
1443
  case "pov": {
@@ -981,11 +1508,15 @@ var DIVEScene = class extends Scene2 {
981
1508
  }
982
1509
  constructor() {
983
1510
  super();
1511
+ this.background = new Color6(16777215);
984
1512
  this.root = new DIVERoot();
985
1513
  this.add(this.root);
986
1514
  }
987
1515
  SetBackground(color) {
988
- this.background = new Color7(color);
1516
+ this.background = new Color6(color);
1517
+ }
1518
+ ComputeSceneBB() {
1519
+ return this.Root.ComputeSceneBB();
989
1520
  }
990
1521
  GetSceneObject(object) {
991
1522
  return this.Root.GetSceneObject(object);
@@ -1004,36 +1535,12 @@ var DIVEScene = class extends Scene2 {
1004
1535
  }
1005
1536
  };
1006
1537
 
1007
- // src/camera/PerspectiveCamera.ts
1008
- import { PerspectiveCamera } from "three";
1009
- var DIVEPerspectiveCameraDefaultSettings = {
1010
- fov: 80,
1011
- near: 0.1,
1012
- far: 1e3
1013
- };
1014
- var _DIVEPerspectiveCamera = class _DIVEPerspectiveCamera extends PerspectiveCamera {
1015
- constructor(settings = DIVEPerspectiveCameraDefaultSettings) {
1016
- super(settings.fov, 1, settings.near, settings.far);
1017
- this.onSetCameraLayer = () => {
1018
- };
1019
- this.layers.mask = _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1020
- }
1021
- OnResize(width, height) {
1022
- this.aspect = width / height;
1023
- this.updateProjectionMatrix();
1024
- }
1025
- SetCameraLayer(layer) {
1026
- this.layers.mask = layer === "LIVE" ? _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1027
- this.onSetCameraLayer(this.layers.mask);
1028
- }
1029
- };
1030
- _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;
1031
- _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;
1032
- var DIVEPerspectiveCamera = _DIVEPerspectiveCamera;
1538
+ // src/dive.ts
1539
+ init_PerspectiveCamera();
1033
1540
 
1034
1541
  // src/controls/OrbitControls.ts
1035
1542
  import { OrbitControls } from "three/examples/jsm/Addons.js";
1036
- import { MathUtils as MathUtils3 } from "three";
1543
+ import { MathUtils as MathUtils2, Vector3 as Vector33 } from "three";
1037
1544
  import { Easing, Tween } from "@tweenjs/tween.js";
1038
1545
  var DIVEOrbitControlsDefaultSettings = {
1039
1546
  enableDamping: true,
@@ -1061,10 +1568,20 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends OrbitControls {
1061
1568
  this.enableDamping = settings.enableDamping;
1062
1569
  this.dampingFactor = settings.dampingFactor;
1063
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
+ }
1064
1581
  ZoomIn(by) {
1065
1582
  const zoomBy = by || _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;
1066
1583
  const { minDistance, maxDistance } = this;
1067
- 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);
1068
1585
  this.update();
1069
1586
  this.minDistance = minDistance;
1070
1587
  this.maxDistance = maxDistance;
@@ -1072,7 +1589,7 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends OrbitControls {
1072
1589
  ZoomOut(by) {
1073
1590
  const zoomBy = by || _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;
1074
1591
  const { minDistance, maxDistance } = this;
1075
- 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);
1076
1593
  this.update();
1077
1594
  this.minDistance = minDistance;
1078
1595
  this.maxDistance = maxDistance;
@@ -1121,385 +1638,40 @@ var _DIVEOrbitControls = class _DIVEOrbitControls extends OrbitControls {
1121
1638
  _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR = 1;
1122
1639
  var DIVEOrbitControls = _DIVEOrbitControls;
1123
1640
 
1124
- // src/mediacreator/MediaCreator.ts
1125
- var DIVEMediaCreator = class {
1126
- constructor(renderer, scene, controller) {
1127
- this.renderer = renderer;
1128
- this.scene = scene;
1129
- this.controller = controller;
1130
- }
1131
- GenerateMedia(position, target, width, height) {
1132
- const resetPosition = this.controller.object.position.clone();
1133
- const resetRotation = this.controller.object.quaternion.clone();
1134
- this.renderer.OnResize(width, height);
1135
- this.controller.object.OnResize(width, height);
1136
- this.controller.object.position.copy(position);
1137
- this.controller.target.copy(target);
1138
- this.controller.update();
1139
- const dataUri = this.DrawCanvas().toDataURL();
1140
- this.controller.object.position.copy(resetPosition);
1141
- this.controller.object.quaternion.copy(resetRotation);
1142
- return dataUri;
1143
- }
1144
- DrawCanvas(canvasElement) {
1145
- const restore = this.renderer.domElement;
1146
- if (canvasElement) {
1147
- this.renderer.domElement = canvasElement;
1148
- }
1149
- this.controller.object.layers.mask = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;
1150
- this.renderer.render(this.scene, this.controller.object);
1151
- this.controller.object.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1152
- const returnCanvas = this.renderer.domElement;
1153
- if (canvasElement) {
1154
- 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);
1155
1647
  }
1156
- return returnCanvas;
1157
- }
1158
- };
1159
-
1160
- // src/interface/Selectable.ts
1161
- function isSelectable(object) {
1162
- return "isSelectable" in object;
1163
- }
1164
-
1165
- // src/toolbox/BaseTool.ts
1166
- import { Raycaster as Raycaster2, Vector2, Vector3 as Vector32 } from "three";
1167
-
1168
- // src/interface/Draggable.ts
1169
- var isDraggable = (object) => {
1170
- return "isDraggable" in object;
1171
- };
1172
- var findDraggableInterface = (child) => {
1173
- if (child === void 0) return void 0;
1174
- if (child.parent === null) {
1175
- return void 0;
1176
- }
1177
- if (isDraggable(child)) {
1178
- return child;
1179
- }
1180
- return findDraggableInterface(child.parent);
1181
- };
1182
-
1183
- // src/interface/Hoverable.ts
1184
- var isHoverable = (object) => {
1185
- return "isHoverable" in object;
1186
- };
1187
- var findHoverableInterface = (child) => {
1188
- if (child === void 0) return void 0;
1189
- if (child.parent === null) {
1190
- return void 0;
1191
- }
1192
- if (isHoverable(child)) {
1193
- return child;
1648
+ return this._selectTool;
1194
1649
  }
1195
- return findHoverableInterface(child.parent);
1196
- };
1197
-
1198
- // src/toolbox/BaseTool.ts
1199
- var DIVEBaseTool = class {
1200
1650
  constructor(scene, controller) {
1201
- this.POINTER_DRAG_THRESHOLD = 1e-3;
1202
- this.name = "BaseTool";
1203
- this._canvas = controller.domElement;
1204
1651
  this._scene = scene;
1205
1652
  this._controller = controller;
1206
- this._pointer = new Vector2();
1207
- this._pointerPrimaryDown = false;
1208
- this._pointerMiddleDown = false;
1209
- this._pointerSecondaryDown = false;
1210
- this._lastPointerDown = new Vector2();
1211
- this._lastPointerUp = new Vector2();
1212
- this._raycaster = new Raycaster2();
1213
- this._raycaster.layers.mask = PRODUCT_LAYER_MASK | UI_LAYER_MASK;
1214
- this._intersects = [];
1215
- this._hovered = null;
1216
- this._dragging = false;
1217
- this._dragStart = new Vector32();
1218
- this._dragCurrent = new Vector32();
1219
- this._dragEnd = new Vector32();
1220
- this._dragDelta = new Vector32();
1221
- this._draggable = null;
1222
- this._dragRaycastOnObjects = null;
1223
- }
1224
- get _pointerAnyDown() {
1225
- return this._pointerPrimaryDown || this._pointerMiddleDown || this._pointerSecondaryDown;
1226
- }
1227
- Activate() {
1228
- }
1229
- Deactivate() {
1653
+ this._selectTool = null;
1654
+ this._activeTool = null;
1230
1655
  }
1231
- onPointerDown(e) {
1232
- var _a;
1233
- switch (e.button) {
1234
- case 0:
1235
- this._pointerPrimaryDown = true;
1236
- break;
1237
- case 1:
1238
- this._pointerMiddleDown = true;
1239
- break;
1240
- case 2:
1241
- this._pointerSecondaryDown = true;
1242
- break;
1243
- }
1244
- this._lastPointerDown.copy(this._pointer);
1245
- this._draggable = findDraggableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object) || null;
1246
- }
1247
- onDragStart(e) {
1248
- if (!this._draggable) return;
1249
- if (this._dragRaycastOnObjects !== null) {
1250
- this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
1251
- }
1252
- if (this._intersects.length === 0) return;
1253
- this._dragStart.copy(this._intersects[0].point.clone());
1254
- this._dragCurrent.copy(this._intersects[0].point.clone());
1255
- this._dragEnd.copy(this._dragStart.clone());
1256
- this._dragDelta.set(0, 0, 0);
1257
- if (this._draggable && this._draggable.onDragStart) {
1258
- this._draggable.onDragStart({
1259
- dragStart: this._dragStart,
1260
- dragCurrent: this._dragCurrent,
1261
- dragEnd: this._dragEnd,
1262
- dragDelta: this._dragDelta
1263
- });
1264
- this._dragging = true;
1265
- this._controller.enabled = false;
1266
- }
1267
- }
1268
- onPointerMove(e) {
1269
- var _a;
1270
- this._pointer.x = e.offsetX / this._canvas.clientWidth * 2 - 1;
1271
- this._pointer.y = -(e.offsetY / this._canvas.clientHeight) * 2 + 1;
1272
- this._raycaster.setFromCamera(this._pointer, this._controller.object);
1273
- this._intersects = this.raycast(this._scene.children);
1274
- const hoverable = findHoverableInterface((_a = this._intersects[0]) == null ? void 0 : _a.object);
1275
- if (this._intersects[0] && hoverable) {
1276
- if (!this._hovered) {
1277
- if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
1278
- this._hovered = hoverable;
1279
- return;
1280
- }
1281
- if (this._hovered.uuid !== hoverable.uuid) {
1282
- if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
1283
- if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);
1284
- this._hovered = hoverable;
1285
- return;
1286
- }
1287
- if (hoverable.onPointerOver) hoverable.onPointerOver(this._intersects[0]);
1288
- this._hovered = hoverable;
1289
- } else {
1290
- if (this._hovered) {
1291
- if (this._hovered.onPointerLeave) this._hovered.onPointerLeave();
1292
- }
1293
- this._hovered = null;
1294
- }
1295
- if (this._pointerAnyDown) {
1296
- if (!this._dragging) {
1297
- this.onDragStart(e);
1298
- }
1299
- this.onDrag(e);
1300
- }
1301
- }
1302
- onDrag(e) {
1303
- if (this._dragRaycastOnObjects !== null) {
1304
- this._intersects = this._raycaster.intersectObjects(this._dragRaycastOnObjects, true);
1305
- }
1306
- const intersect = this._intersects[0];
1307
- if (!intersect) return;
1308
- this._dragCurrent.copy(intersect.point.clone());
1309
- this._dragEnd.copy(intersect.point.clone());
1310
- this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
1311
- if (this._draggable && this._draggable.onDrag) {
1312
- this._draggable.onDrag({
1313
- dragStart: this._dragStart,
1314
- dragCurrent: this._dragCurrent,
1315
- dragEnd: this._dragEnd,
1316
- dragDelta: this._dragDelta
1317
- });
1318
- }
1319
- }
1320
- onPointerUp(e) {
1321
- if (this.pointerWasDragged() || this._dragging) {
1322
- if (this._draggable) {
1323
- this.onDragEnd(e);
1324
- }
1325
- } else {
1326
- this.onClick(e);
1327
- }
1328
- switch (e.button) {
1329
- case 0:
1330
- this._pointerPrimaryDown = false;
1331
- break;
1332
- case 1:
1333
- this._pointerMiddleDown = false;
1334
- break;
1335
- case 2:
1336
- this._pointerSecondaryDown = false;
1337
- break;
1338
- }
1339
- this._lastPointerUp.copy(this._pointer);
1340
- }
1341
- onClick(e) {
1342
- }
1343
- onDragEnd(e) {
1344
- const intersect = this._intersects[0];
1345
- if (intersect) {
1346
- this._dragEnd.copy(intersect.point.clone());
1347
- this._dragCurrent.copy(intersect.point.clone());
1348
- this._dragDelta.subVectors(this._dragCurrent.clone(), this._dragStart.clone());
1349
- }
1350
- if (this._draggable && this._draggable.onDragEnd) {
1351
- this._draggable.onDragEnd({
1352
- dragStart: this._dragStart,
1353
- dragCurrent: this._dragCurrent,
1354
- dragEnd: this._dragEnd,
1355
- dragDelta: this._dragDelta
1356
- });
1357
- }
1358
- this._draggable = null;
1359
- this._dragging = false;
1360
- this._dragStart.set(0, 0, 0);
1361
- this._dragCurrent.set(0, 0, 0);
1362
- this._dragEnd.set(0, 0, 0);
1363
- this._dragDelta.set(0, 0, 0);
1364
- this._controller.enabled = true;
1365
- }
1366
- onWheel(e) {
1367
- }
1368
- raycast(objects) {
1369
- if (objects !== void 0) return this._raycaster.intersectObjects(objects, true);
1370
- return this._raycaster.intersectObjects(this._scene.children, true);
1371
- }
1372
- pointerWasDragged() {
1373
- return this._lastPointerDown.distanceTo(this._pointer) > this.POINTER_DRAG_THRESHOLD;
1374
- }
1375
- };
1376
-
1377
- // src/toolbox/transform/TransformTool.ts
1378
- import { TransformControls } from "three/examples/jsm/Addons";
1379
- var DIVETransformTool = class extends DIVEBaseTool {
1380
- constructor(scene, controller) {
1381
- super(scene, controller);
1382
- this.name = "DIVETransformTool";
1383
- this._gizmo = new TransformControls(this._controller.object, this._controller.domElement);
1384
- this._gizmo.mode = "translate";
1385
- this._gizmo.addEventListener("mouseDown", () => {
1386
- controller.enabled = false;
1387
- });
1388
- this._gizmo.addEventListener("mouseUp", () => {
1389
- controller.enabled = true;
1390
- });
1391
- this._gizmo.addEventListener("objectChange", () => {
1392
- if (!this._gizmo.object) return;
1393
- if (!("isMoveable" in this._gizmo.object)) return;
1394
- if (!("onMove" in this._gizmo.object)) return;
1395
- this._gizmo.object.onMove();
1396
- });
1397
- scene.add(this._gizmo);
1398
- }
1399
- Activate() {
1400
- }
1401
- SetGizmoMode(mode) {
1402
- this._gizmo.mode = mode;
1403
- }
1404
- // public onPointerDown(e: PointerEvent): void {
1405
- // super.onPointerDown(e);
1406
- // // if (this._hovered) {
1407
- // // this._dragRaycastOnObjects = this._gizmo.gizmoPlane.children;
1408
- // // }
1409
- // }
1410
- // protected raycast(): Intersection[] {
1411
- // return super.raycast(this._gizmo.gizmoNode.children);
1412
- // }
1413
- };
1414
-
1415
- // src/toolbox/select/SelectTool.ts
1416
- var DIVESelectTool = class extends DIVETransformTool {
1417
- constructor(scene, controller) {
1418
- super(scene, controller);
1419
- this.name = "SelectTool";
1420
- }
1421
- Activate() {
1422
- }
1423
- Select(selectable) {
1424
- if (selectable.onSelect) selectable.onSelect();
1425
- this.AttachGizmo(selectable);
1426
- }
1427
- Deselect(selectable) {
1428
- if (selectable.onDeselect) selectable.onDeselect();
1429
- this.DetachGizmo();
1430
- }
1431
- DetachGizmo() {
1432
- this._gizmo.detach();
1433
- }
1434
- AttachGizmo(selectable) {
1435
- if ("isMoveable" in selectable) {
1436
- const movable = selectable;
1437
- this._gizmo.attach(movable);
1438
- }
1439
- }
1440
- onClick(e) {
1441
- super.onClick(e);
1442
- const first = this._raycaster.intersectObjects(this._scene.Root.children, true)[0];
1443
- const selectable = this.findSelectableInterface(first == null ? void 0 : first.object);
1444
- if (!first || !selectable) {
1445
- if (this._gizmo.object) {
1446
- this.Deselect(this._gizmo.object);
1447
- }
1448
- return;
1449
- }
1450
- if (this._gizmo.object) {
1451
- if (this._gizmo.object.uuid === selectable.uuid) return;
1452
- this.Deselect(this._gizmo.object);
1453
- }
1454
- this.Select(selectable);
1455
- }
1456
- findSelectableInterface(child) {
1457
- if (child === void 0) return void 0;
1458
- if (child.parent === null) {
1459
- return void 0;
1460
- }
1461
- if (isSelectable(child)) {
1462
- return child;
1463
- }
1464
- return this.findSelectableInterface(child.parent);
1465
- }
1466
- };
1467
-
1468
- // src/toolbox/Toolbox.ts
1469
- var DIVEToolbox = class {
1470
- constructor(scene, controller) {
1471
- this.removeListenersCallback = () => {
1472
- };
1473
- this.selectTool = new DIVESelectTool(scene, controller);
1474
- const pointerMove = this.onPointerMove.bind(this);
1475
- const pointerDown = this.onPointerDown.bind(this);
1476
- const pointerUp = this.onPointerUp.bind(this);
1477
- const wheel = this.onWheel.bind(this);
1478
- controller.domElement.addEventListener("pointermove", pointerMove);
1479
- controller.domElement.addEventListener("pointerdown", pointerDown);
1480
- controller.domElement.addEventListener("pointerup", pointerUp);
1481
- controller.domElement.addEventListener("wheel", wheel);
1482
- this.removeListenersCallback = () => {
1483
- controller.domElement.removeEventListener("pointermove", pointerMove);
1484
- controller.domElement.removeEventListener("pointerdown", pointerDown);
1485
- controller.domElement.removeEventListener("pointerup", pointerUp);
1486
- controller.domElement.removeEventListener("wheel", wheel);
1487
- };
1488
- this.activeTool = this.selectTool;
1489
- this.activeTool.Activate();
1490
- }
1491
- dispose() {
1492
- this.removeListenersCallback();
1656
+ Dispose() {
1657
+ this.removeEventListeners();
1493
1658
  }
1494
1659
  GetActiveTool() {
1495
- return this.activeTool;
1660
+ return this._activeTool;
1496
1661
  }
1497
1662
  UseTool(tool) {
1498
- this.activeTool.Deactivate();
1663
+ var _a;
1664
+ (_a = this._activeTool) == null ? void 0 : _a.Deactivate();
1499
1665
  switch (tool) {
1500
1666
  case "select": {
1667
+ this.addEventListeners();
1501
1668
  this.selectTool.Activate();
1502
- this.activeTool = this.selectTool;
1669
+ this._activeTool = this.selectTool;
1670
+ break;
1671
+ }
1672
+ case "none": {
1673
+ this.removeEventListeners();
1674
+ this._activeTool = null;
1503
1675
  break;
1504
1676
  }
1505
1677
  default: {
@@ -1510,31 +1682,43 @@ var DIVEToolbox = class {
1510
1682
  SetGizmoMode(mode) {
1511
1683
  this.selectTool.SetGizmoMode(mode);
1512
1684
  }
1685
+ SetGizmoVisibility(active) {
1686
+ this.selectTool.SetGizmoVisibility(active);
1687
+ }
1513
1688
  onPointerMove(e) {
1514
- this.activeTool.onPointerMove(e);
1689
+ var _a;
1690
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerMove(e);
1515
1691
  }
1516
1692
  onPointerDown(e) {
1517
- this.activeTool.onPointerDown(e);
1693
+ var _a;
1694
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerDown(e);
1518
1695
  }
1519
1696
  onPointerUp(e) {
1520
- this.activeTool.onPointerUp(e);
1697
+ var _a;
1698
+ (_a = this._activeTool) == null ? void 0 : _a.onPointerUp(e);
1521
1699
  }
1522
1700
  onWheel(e) {
1523
- this.activeTool.onWheel(e);
1701
+ var _a;
1702
+ (_a = this._activeTool) == null ? void 0 : _a.onWheel(e);
1524
1703
  }
1525
- };
1526
- DIVEToolbox.DefaultTool = "select";
1527
-
1528
- // src/animation/AnimationSystem.ts
1529
- import { update as updateTween } from "@tweenjs/tween.js";
1530
- var DIVEAnimationSystem = class {
1531
- update() {
1532
- 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));
1533
1715
  }
1534
1716
  };
1717
+ DIVEToolbox.DefaultTool = "select";
1535
1718
 
1536
1719
  // src/axiscamera/AxisCamera.ts
1537
- import { AxesHelper, Color as Color8, Matrix4, OrthographicCamera } from "three";
1720
+ init_VisibilityLayerMask();
1721
+ import { AxesHelper, Color as Color7, Matrix4, OrthographicCamera, Vector4 } from "three";
1538
1722
  import SpriteText from "three-spritetext";
1539
1723
 
1540
1724
  // src/constant/AxisHelperColors.ts
@@ -1547,7 +1731,7 @@ var AxesColorBlue = AxesColorBlueLetter;
1547
1731
 
1548
1732
  // src/axiscamera/AxisCamera.ts
1549
1733
  var DIVEAxisCamera = class extends OrthographicCamera {
1550
- constructor() {
1734
+ constructor(renderer, scene, controls) {
1551
1735
  super(-1, 1, 1, -1, 0.1, 100);
1552
1736
  this.layers.mask = COORDINATE_LAYER_MASK;
1553
1737
  this.axesHelper = new AxesHelper(0.5);
@@ -1555,9 +1739,9 @@ var DIVEAxisCamera = class extends OrthographicCamera {
1555
1739
  this.axesHelper.material.depthTest = false;
1556
1740
  this.axesHelper.position.set(0, 0, -1);
1557
1741
  this.axesHelper.setColors(
1558
- new Color8(AxesColorRed),
1559
- new Color8(AxesColorGreen),
1560
- new Color8(AxesColorBlue)
1742
+ new Color7(AxesColorRed),
1743
+ new Color7(AxesColorGreen),
1744
+ new Color7(AxesColorBlue)
1561
1745
  );
1562
1746
  const x = new SpriteText("X", 0.2, AxesColorRedLetter);
1563
1747
  const y = new SpriteText("Y", 0.2, AxesColorGreenLetter);
@@ -1572,6 +1756,26 @@ var DIVEAxisCamera = class extends OrthographicCamera {
1572
1756
  this.axesHelper.add(y);
1573
1757
  this.axesHelper.add(z);
1574
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);
1575
1779
  }
1576
1780
  SetFromCameraMatrix(matrix) {
1577
1781
  this.axesHelper.rotation.setFromRotationMatrix(new Matrix4().extractRotation(matrix).invert());
@@ -1691,13 +1895,63 @@ var DIVEMath = {
1691
1895
  };
1692
1896
 
1693
1897
  // src/dive.ts
1898
+ import { generateUUID as generateUUID2 } from "three/src/math/MathUtils";
1694
1899
  var DIVEDefaultSettings = {
1695
1900
  autoResize: true,
1901
+ displayAxes: false,
1696
1902
  renderer: DIVERendererDefaultSettings,
1697
1903
  perspectiveCamera: DIVEPerspectiveCameraDefaultSettings,
1698
1904
  orbitControls: DIVEOrbitControlsDefaultSettings
1699
1905
  };
1700
- 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
+ }
1701
1955
  // getters
1702
1956
  get Communication() {
1703
1957
  return this.communication;
@@ -1707,6 +1961,7 @@ var DIVE = class {
1707
1961
  }
1708
1962
  // setters
1709
1963
  set Settings(settings) {
1964
+ var _a;
1710
1965
  const settingsDelta = getObjectDelta(this._settings, settings);
1711
1966
  if (settingsDelta.renderer) this.renderer = new DIVERenderer(this._settings.renderer);
1712
1967
  if (settingsDelta.perspectiveCamera) {
@@ -1726,6 +1981,12 @@ var DIVE = class {
1726
1981
  this.removeResizeObserver();
1727
1982
  }
1728
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
+ }
1729
1990
  Object.assign(this._settings, settings);
1730
1991
  }
1731
1992
  constructor(settings) {
@@ -1737,28 +1998,14 @@ var DIVE = class {
1737
1998
  this.scene = new DIVEScene();
1738
1999
  this.perspectiveCamera = new DIVEPerspectiveCamera(this._settings.perspectiveCamera);
1739
2000
  this.orbitControls = new DIVEOrbitControls(this.perspectiveCamera, this.renderer, this._settings.orbitControls);
1740
- this.mediaCreator = new DIVEMediaCreator(this.renderer, this.scene, this.orbitControls);
1741
2001
  this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);
1742
- this.communication = new DIVECommunication(this.scene, this.orbitControls, this.toolbox, this.mediaCreator);
1743
- this.animationSystem = new DIVEAnimationSystem();
1744
- this.renderer.AddPreRenderCallback(() => {
1745
- this.animationSystem.update();
1746
- });
1747
- this.axisCamera = new DIVEAxisCamera();
1748
- this.scene.add(this.axisCamera);
1749
- const restoreViewport = new Vector4();
1750
- this.renderer.AddPostRenderCallback(() => {
1751
- const restoreBackground = this.scene.background;
1752
- this.scene.background = null;
1753
- this.renderer.getViewport(restoreViewport);
1754
- this.renderer.setViewport(0, 0, 150, 150);
1755
- this.renderer.autoClear = false;
1756
- this.axisCamera.SetFromCameraMatrix(this.perspectiveCamera.matrix);
1757
- this.renderer.render(this.scene, this.axisCamera);
1758
- this.renderer.setViewport(restoreViewport);
1759
- this.renderer.autoClear = true;
1760
- this.scene.background = restoreBackground;
1761
- });
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
+ }
1762
2009
  if (this._settings.autoResize) {
1763
2010
  this.addResizeObserver();
1764
2011
  }
@@ -1769,6 +2016,14 @@ var DIVE = class {
1769
2016
  }
1770
2017
  };
1771
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
+ }
1772
2027
  // methods
1773
2028
  OnResize(width, height) {
1774
2029
  this.renderer.OnResize(width, height);