@shopware-ag/dive 1.1.0 → 1.1.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.
package/build/dive.cjs ADDED
@@ -0,0 +1,1508 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+ var __async = (__this, __arguments, generator) => {
47
+ return new Promise((resolve, reject) => {
48
+ var fulfilled = (value) => {
49
+ try {
50
+ step(generator.next(value));
51
+ } catch (e) {
52
+ reject(e);
53
+ }
54
+ };
55
+ var rejected = (value) => {
56
+ try {
57
+ step(generator.throw(value));
58
+ } catch (e) {
59
+ reject(e);
60
+ }
61
+ };
62
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
63
+ step((generator = generator.apply(__this, __arguments)).next());
64
+ });
65
+ };
66
+
67
+ // src/dive.ts
68
+ var dive_exports = {};
69
+ __export(dive_exports, {
70
+ DIVE: () => DIVE,
71
+ DIVECommunication: () => DIVECommunication,
72
+ DIVEDefaultSettings: () => DIVEDefaultSettings,
73
+ DIVEMath: () => DIVEMath,
74
+ default: () => DIVE
75
+ });
76
+ module.exports = __toCommonJS(dive_exports);
77
+ var import_three17 = require("three");
78
+
79
+ // src/renderer/Renderer.ts
80
+ var import_three = require("three");
81
+ var DIVERendererDefaultSettings = {
82
+ antialias: true,
83
+ alpha: true,
84
+ stencil: false,
85
+ shadowMapEnabled: true,
86
+ shadowMapType: import_three.PCFSoftShadowMap,
87
+ toneMapping: import_three.NoToneMapping
88
+ };
89
+ var DIVERenderer = class extends import_three.WebGLRenderer {
90
+ constructor(rendererSettings = DIVERendererDefaultSettings) {
91
+ super({
92
+ antialias: rendererSettings.antialias,
93
+ alpha: rendererSettings.alpha,
94
+ preserveDrawingBuffer: true
95
+ });
96
+ // basic functionality members
97
+ this.paused = false;
98
+ this.running = false;
99
+ this.force = false;
100
+ // pre- and post-render callbacks
101
+ this.preRenderCallbacks = /* @__PURE__ */ new Map();
102
+ this.postRenderCallbacks = /* @__PURE__ */ new Map();
103
+ this.setPixelRatio(window.devicePixelRatio);
104
+ this.shadowMap.enabled = rendererSettings.shadowMapEnabled;
105
+ this.shadowMap.type = rendererSettings.shadowMapType;
106
+ this.toneMapping = rendererSettings.toneMapping;
107
+ this.debug.checkShaderErrors = false;
108
+ }
109
+ // Starts the renderer with the given scene and camera.
110
+ StartRenderer(scene, cam) {
111
+ this.setAnimationLoop(() => {
112
+ this.internal_render(scene, cam);
113
+ });
114
+ this.running = true;
115
+ }
116
+ // Pauses the renderer.
117
+ PauseRenderer() {
118
+ this.paused = true;
119
+ }
120
+ // Resumes the renderer after pausing.
121
+ ResumeRenderer() {
122
+ this.paused = false;
123
+ }
124
+ // Stops the renderer completely. Has to be started again with StartRenderer().
125
+ StopRenderer() {
126
+ this.setAnimationLoop(null);
127
+ this.running = false;
128
+ }
129
+ // Resizes the renderer to the given width and height.
130
+ OnResize(width, height) {
131
+ this.setSize(width, height);
132
+ }
133
+ /**
134
+ * Adds a callback to the render loop before actual render call.
135
+ * @param callback Executed before rendering.
136
+ * @returns uuid to remove the callback.
137
+ */
138
+ AddPreRenderCallback(callback) {
139
+ const newUUID = import_three.MathUtils.generateUUID();
140
+ this.preRenderCallbacks.set(newUUID, callback);
141
+ return newUUID;
142
+ }
143
+ /**
144
+ * Removes a callback from the render loop before actual render call.
145
+ * @param uuid of callback to remove.
146
+ * @returns if removing was successful.
147
+ */
148
+ RemovePreRenderCallback(uuid) {
149
+ if (!this.preRenderCallbacks.has(uuid)) return false;
150
+ this.preRenderCallbacks.delete(uuid);
151
+ return true;
152
+ }
153
+ /**
154
+ * Adds a callback to the render loop after actual render call.
155
+ * @param callback Executed after rendering.
156
+ * @returns uuid to remove the callback.
157
+ */
158
+ AddPostRenderCallback(callback) {
159
+ const newUUID = import_three.MathUtils.generateUUID();
160
+ this.postRenderCallbacks.set(newUUID, callback);
161
+ return newUUID;
162
+ }
163
+ /**
164
+ * Removes a callback from the render loop after actual render call.
165
+ * @param uuid of callback to remove.
166
+ * @returns if removing was successful.
167
+ */
168
+ RemovePostRenderCallback(uuid) {
169
+ if (!this.postRenderCallbacks.has(uuid)) return false;
170
+ this.postRenderCallbacks.delete(uuid);
171
+ return true;
172
+ }
173
+ /**
174
+ * Forces the renderer to render the next frame.
175
+ */
176
+ ForceRendering() {
177
+ this.force = true;
178
+ }
179
+ /**
180
+ * Internal render loop.
181
+ *
182
+ * To control renderloop you can add callbacks via AddPreRenderCallback() and AddPostRenderCallback().
183
+ * @param scene Scene to render.
184
+ * @param cam Camera to render with.
185
+ */
186
+ internal_render(scene, cam) {
187
+ if ((this.paused || !this.running) && !this.force) return;
188
+ this.preRenderCallbacks.forEach((callback) => {
189
+ callback();
190
+ });
191
+ this.render(scene, cam);
192
+ this.postRenderCallbacks.forEach((callback) => {
193
+ callback();
194
+ });
195
+ this.force = false;
196
+ }
197
+ };
198
+
199
+ // src/scene/Scene.ts
200
+ var import_three12 = require("three");
201
+
202
+ // src/scene/root/Root.ts
203
+ var import_three11 = require("three");
204
+
205
+ // src/scene/root/lightroot/LightRoot.ts
206
+ var import_three6 = require("three");
207
+
208
+ // src/light/AmbientLight.ts
209
+ 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
219
+ var DIVEAmbientLight = class extends import_three2.Object3D {
220
+ constructor() {
221
+ super();
222
+ this.name = "DIVEAmbientLight";
223
+ this._light = new import_three2.AmbientLight(16777215, 1);
224
+ this._light.layers.mask = PRODUCT_LAYER_MASK;
225
+ this.add(this._light);
226
+ }
227
+ SetColor(color) {
228
+ this._light.color = color;
229
+ }
230
+ SetIntensity(intensity) {
231
+ this._light.intensity = intensity;
232
+ }
233
+ SetEnabled(enabled) {
234
+ this._light.visible = enabled;
235
+ }
236
+ };
237
+
238
+ // src/light/PointLight.ts
239
+ var import_three4 = require("three");
240
+
241
+ // src/com/Communication.ts
242
+ var import_three3 = require("three");
243
+ var _DIVECommunication = class _DIVECommunication {
244
+ constructor(scene, controls, toolbox, mediaGenerator) {
245
+ this.registered = /* @__PURE__ */ new Map();
246
+ // private listeners: { [key: string]: EventListener[] } = {};
247
+ this.listeners = /* @__PURE__ */ new Map();
248
+ this.id = import_three3.MathUtils.generateUUID();
249
+ this.scene = scene;
250
+ this.controller = controls;
251
+ this.toolbox = toolbox;
252
+ this.mediaGenerator = mediaGenerator;
253
+ _DIVECommunication.__instances.push(this);
254
+ }
255
+ static get(id) {
256
+ return this.__instances.find((instance) => Array.from(instance.registered.values()).find((object) => object.id === id));
257
+ }
258
+ DestroyInstance() {
259
+ const existingIndex = _DIVECommunication.__instances.findIndex((entry) => entry.id === this.id);
260
+ if (existingIndex === -1) return false;
261
+ _DIVECommunication.__instances.splice(existingIndex, 1);
262
+ return true;
263
+ }
264
+ PerformAction(action, payload) {
265
+ let returnValue = false;
266
+ switch (action) {
267
+ case "GET_ALL_SCENE_DATA": {
268
+ returnValue = this.getAllSceneData(payload);
269
+ break;
270
+ }
271
+ case "GET_ALL_OBJECTS": {
272
+ returnValue = this.getAllObjects(payload);
273
+ break;
274
+ }
275
+ case "GET_OBJECTS": {
276
+ returnValue = this.getObjects(payload);
277
+ break;
278
+ }
279
+ case "ADD_OBJECT": {
280
+ returnValue = this.addObject(payload);
281
+ break;
282
+ }
283
+ case "UPDATE_OBJECT": {
284
+ returnValue = this.updateObject(payload);
285
+ break;
286
+ }
287
+ case "DELETE_OBJECT": {
288
+ returnValue = this.deleteObject(payload);
289
+ break;
290
+ }
291
+ case "SELECT_OBJECT": {
292
+ returnValue = this.selectObject(payload);
293
+ break;
294
+ }
295
+ case "SET_BACKGROUND": {
296
+ returnValue = this.setBackground(payload);
297
+ break;
298
+ }
299
+ case "PLACE_ON_FLOOR": {
300
+ returnValue = this.placeOnFloor(payload);
301
+ break;
302
+ }
303
+ case "SET_CAMERA_TRANSFORM": {
304
+ returnValue = this.setCameraTransform(payload);
305
+ break;
306
+ }
307
+ case "GET_CAMERA_TRANSFORM": {
308
+ returnValue = this.getCameraTransform(payload);
309
+ break;
310
+ }
311
+ case "MOVE_CAMERA": {
312
+ returnValue = this.moveCamera(payload);
313
+ break;
314
+ }
315
+ case "RESET_CAMERA": {
316
+ returnValue = this.resetCamera(payload);
317
+ break;
318
+ }
319
+ case "SET_CAMERA_LAYER": {
320
+ returnValue = this.setCameraLayer(payload);
321
+ break;
322
+ }
323
+ case "ZOOM_CAMERA": {
324
+ returnValue = this.zoomCamera(payload);
325
+ break;
326
+ }
327
+ case "SET_GIZMO_MODE": {
328
+ returnValue = this.setGizmoMode(payload);
329
+ break;
330
+ }
331
+ case "MODEL_LOADED": {
332
+ returnValue = this.modelLoaded(payload);
333
+ break;
334
+ }
335
+ case "UPDATE_SCENE": {
336
+ returnValue = this.updateScene(payload);
337
+ break;
338
+ }
339
+ case "GENERATE_MEDIA": {
340
+ returnValue = this.generateMedia(payload);
341
+ break;
342
+ }
343
+ }
344
+ this.dispatch(action, payload);
345
+ return returnValue;
346
+ }
347
+ Subscribe(type, listener) {
348
+ if (!this.listeners.get(type)) this.listeners.set(type, []);
349
+ this.listeners.get(type).push(listener);
350
+ return () => {
351
+ const listenerArray = this.listeners.get(type);
352
+ if (!listenerArray) return false;
353
+ const existingIndex = listenerArray.findIndex((entry) => entry === listener);
354
+ if (existingIndex === -1) return false;
355
+ listenerArray.splice(existingIndex, 1);
356
+ return true;
357
+ };
358
+ }
359
+ dispatch(type, payload) {
360
+ const listenerArray = this.listeners.get(type);
361
+ if (!listenerArray) return;
362
+ listenerArray.forEach((listener) => listener(payload));
363
+ }
364
+ getAllSceneData(payload) {
365
+ const sceneData = {
366
+ name: this.scene.name,
367
+ mediaItem: null,
368
+ backgroundColor: "#" + this.scene.background.getHexString(),
369
+ floorEnabled: this.scene.Root.Floor.visible,
370
+ floorColor: "#" + this.scene.Root.Floor.material.color.getHexString(),
371
+ userCamera: {
372
+ position: this.controller.object.position.clone(),
373
+ target: this.controller.target.clone()
374
+ },
375
+ spotmarks: [],
376
+ lights: Array.from(this.registered.values()).filter((object) => object.entityType === "light"),
377
+ objects: Array.from(this.registered.values()).filter((object) => object.entityType === "model"),
378
+ cameras: Array.from(this.registered.values()).filter((object) => object.entityType === "pov")
379
+ };
380
+ Object.assign(payload, sceneData);
381
+ return sceneData;
382
+ }
383
+ getAllObjects(payload) {
384
+ Object.assign(payload, this.registered);
385
+ return this.registered;
386
+ }
387
+ getObjects(payload) {
388
+ this.registered.forEach((object) => {
389
+ if (payload.ids && payload.ids.length > 0 && !payload.ids.includes(object.id)) return;
390
+ payload.map.set(object.id, object);
391
+ });
392
+ return payload.map;
393
+ }
394
+ addObject(payload) {
395
+ if (this.registered.get(payload.id)) return false;
396
+ this.registered.set(payload.id, payload);
397
+ this.scene.AddSceneObject(payload);
398
+ return true;
399
+ }
400
+ updateObject(payload) {
401
+ const objectToUpdate = this.registered.get(payload.id);
402
+ if (!objectToUpdate) return false;
403
+ this.registered.set(payload.id, __spreadValues(__spreadValues({}, objectToUpdate), payload));
404
+ const updatedObject = this.registered.get(payload.id);
405
+ this.scene.UpdateSceneObject(updatedObject);
406
+ Object.assign(payload, updatedObject);
407
+ return true;
408
+ }
409
+ deleteObject(payload) {
410
+ const deletedObject = this.registered.get(payload.id);
411
+ if (!deletedObject) return false;
412
+ Object.assign(payload, deletedObject);
413
+ this.registered.delete(payload.id);
414
+ this.scene.DeleteSceneObject(deletedObject);
415
+ return true;
416
+ }
417
+ selectObject(payload) {
418
+ const object = this.registered.get(payload.id);
419
+ if (!object) return false;
420
+ const sceneObject = this.scene.GetSceneObject(object);
421
+ if (!sceneObject) return false;
422
+ if (!("isSelectable" in sceneObject)) return false;
423
+ this.toolbox.UseTool("select");
424
+ this.toolbox.GetActiveTool().Select(sceneObject);
425
+ Object.assign(payload, object);
426
+ return true;
427
+ }
428
+ setBackground(payload) {
429
+ this.scene.SetBackground(payload.color);
430
+ return true;
431
+ }
432
+ placeOnFloor(payload) {
433
+ if (!this.registered.get(payload.id)) return false;
434
+ this.scene.PlaceOnFloor(payload);
435
+ return true;
436
+ }
437
+ setCameraTransform(payload) {
438
+ this.controller.object.position.copy(payload.position);
439
+ this.controller.target.copy(payload.target);
440
+ this.controller.update();
441
+ return true;
442
+ }
443
+ getCameraTransform(payload) {
444
+ const transform = {
445
+ position: this.controller.object.position.clone(),
446
+ target: this.controller.target.clone()
447
+ };
448
+ Object.assign(payload, transform);
449
+ return transform;
450
+ }
451
+ moveCamera(payload) {
452
+ let position = { x: 0, y: 0, z: 0 };
453
+ let target = { x: 0, y: 0, z: 0 };
454
+ if ("id" in payload) {
455
+ position = this.registered.get(payload.id).position;
456
+ target = this.registered.get(payload.id).target;
457
+ } else {
458
+ position = payload.position;
459
+ target = payload.target;
460
+ }
461
+ this.controller.MoveTo(position, target, payload.duration, payload.locked);
462
+ return true;
463
+ }
464
+ setCameraLayer(payload) {
465
+ this.controller.object.SetCameraLayer(payload.layer);
466
+ return true;
467
+ }
468
+ resetCamera(payload) {
469
+ this.controller.RevertLast(payload.duration);
470
+ return true;
471
+ }
472
+ zoomCamera(payload) {
473
+ if (payload.direction === "IN") this.controller.ZoomIn(payload.by);
474
+ if (payload.direction === "OUT") this.controller.ZoomOut(payload.by);
475
+ return true;
476
+ }
477
+ setGizmoMode(payload) {
478
+ this.toolbox.SetGizmoMode(payload.mode);
479
+ return true;
480
+ }
481
+ modelLoaded(payload) {
482
+ this.registered.get(payload.id).loaded = true;
483
+ return true;
484
+ }
485
+ updateScene(payload) {
486
+ if (payload.name !== void 0) this.scene.name = payload.name;
487
+ if (payload.backgroundColor !== void 0) this.scene.SetBackground(payload.backgroundColor);
488
+ if (payload.floorEnabled !== void 0) this.scene.Root.Floor.SetVisibility(payload.floorEnabled);
489
+ if (payload.floorColor !== void 0) this.scene.Root.Floor.SetColor(payload.floorColor);
490
+ payload.name = this.scene.name;
491
+ payload.backgroundColor = "#" + this.scene.background.getHexString();
492
+ payload.floorEnabled = this.scene.Root.Floor.visible;
493
+ payload.floorColor = "#" + this.scene.Root.Floor.material.color.getHexString();
494
+ return true;
495
+ }
496
+ generateMedia(payload) {
497
+ let position = { x: 0, y: 0, z: 0 };
498
+ let target = { x: 0, y: 0, z: 0 };
499
+ if ("id" in payload) {
500
+ position = this.registered.get(payload.id).position;
501
+ target = this.registered.get(payload.id).target;
502
+ } else {
503
+ position = payload.position;
504
+ target = payload.target;
505
+ }
506
+ payload.dataUri = this.mediaGenerator.GenerateMedia(position, target, payload.width, payload.height);
507
+ return true;
508
+ }
509
+ };
510
+ _DIVECommunication.__instances = [];
511
+ var DIVECommunication = _DIVECommunication;
512
+
513
+ // src/light/PointLight.ts
514
+ var DIVEPointLight = class extends import_three4.Object3D {
515
+ constructor() {
516
+ super();
517
+ this.isMoveable = true;
518
+ this.isSelectable = true;
519
+ this.gizmo = null;
520
+ this.name = "DIVEPointLight";
521
+ this.light = new import_three4.PointLight(16777215, 1);
522
+ this.light.layers.mask = PRODUCT_LAYER_MASK;
523
+ this.light.castShadow = true;
524
+ this.light.shadow.mapSize.width = 512;
525
+ this.light.shadow.mapSize.height = 512;
526
+ this.add(this.light);
527
+ const geoSize = 0.1;
528
+ const geometry = new import_three4.SphereGeometry(geoSize, geoSize * 320, geoSize * 320);
529
+ const material = new import_three4.MeshBasicMaterial({ color: this.light.color, transparent: true, opacity: 0.8, side: import_three4.FrontSide });
530
+ this.mesh = new import_three4.Mesh(geometry, material);
531
+ this.mesh.layers.mask = HELPER_LAYER_MASK;
532
+ this.add(this.mesh);
533
+ }
534
+ SetColor(color) {
535
+ this.light.color = color;
536
+ this.mesh.material.color = color;
537
+ }
538
+ SetIntensity(intensity) {
539
+ this.light.intensity = intensity;
540
+ this.mesh.material.opacity = intensity > 0.8 ? 0.8 : intensity * 0.8;
541
+ }
542
+ SetEnabled(enabled) {
543
+ this.light.visible = enabled;
544
+ }
545
+ onMove() {
546
+ var _a;
547
+ (_a = DIVECommunication.get(this.userData.id)) == null ? void 0 : _a.PerformAction("UPDATE_OBJECT", { id: this.userData.id, position: this.position });
548
+ }
549
+ };
550
+
551
+ // src/light/SceneLight.ts
552
+ var import_three5 = require("three");
553
+ var DIVESceneLight = class extends import_three5.Object3D {
554
+ constructor() {
555
+ super();
556
+ this.name = "DIVESceneLight";
557
+ this._hemiLight = new import_three5.HemisphereLight(16777215, 16777215, 2);
558
+ this._hemiLight.layers.mask = PRODUCT_LAYER_MASK;
559
+ this._hemiLight.position.set(0, 50, 0);
560
+ this.add(this._hemiLight);
561
+ this._dirLight = new import_three5.DirectionalLight(16777215, 3);
562
+ this._dirLight.layers.mask = PRODUCT_LAYER_MASK;
563
+ this._dirLight.position.set(1, 1.75, 1);
564
+ this._dirLight.position.multiplyScalar(30);
565
+ this._dirLight.castShadow = true;
566
+ this._dirLight.shadow.mapSize.width = 2048;
567
+ this._dirLight.shadow.mapSize.height = 2048;
568
+ const d = 5;
569
+ this._dirLight.shadow.camera.left = -d;
570
+ this._dirLight.shadow.camera.right = d;
571
+ this._dirLight.shadow.camera.top = d;
572
+ this._dirLight.shadow.camera.bottom = -d;
573
+ this._dirLight.shadow.camera.far = 3500;
574
+ this.add(this._dirLight);
575
+ }
576
+ SetColor(color) {
577
+ this._hemiLight.color = color;
578
+ this._dirLight.color = color;
579
+ }
580
+ SetIntensity(intensity) {
581
+ this._hemiLight.intensity = intensity * 2;
582
+ this._dirLight.intensity = intensity * 3;
583
+ }
584
+ SetEnabled(enabled) {
585
+ this._hemiLight.visible = enabled;
586
+ this._dirLight.visible = enabled;
587
+ }
588
+ };
589
+
590
+ // src/scene/root/lightroot/LightRoot.ts
591
+ var DIVELightRoot = class extends import_three6.Object3D {
592
+ constructor() {
593
+ super();
594
+ this.name = "LightRoot";
595
+ }
596
+ GetLight(object) {
597
+ if (object.id === void 0) {
598
+ console.warn("LightRoot.GetLight: object.id is undefined");
599
+ return void 0;
600
+ }
601
+ return this.children.find((object3D) => object3D.userData.id === object.id);
602
+ }
603
+ UpdateLight(light) {
604
+ if (light.id === void 0) {
605
+ console.warn(`LightRoot.UpdateLight: light.id is undefined`);
606
+ return;
607
+ }
608
+ let sceneObject = this.children.find((object3D) => object3D.userData.id === light.id);
609
+ if (!sceneObject) {
610
+ switch (light.type) {
611
+ case "scene": {
612
+ sceneObject = new DIVESceneLight();
613
+ break;
614
+ }
615
+ case "ambient": {
616
+ sceneObject = new DIVEAmbientLight();
617
+ break;
618
+ }
619
+ case "point": {
620
+ sceneObject = new DIVEPointLight();
621
+ break;
622
+ }
623
+ default: {
624
+ console.warn(`LightRoot.UpdateLight: Unknown light type: ${light.type}`);
625
+ return;
626
+ }
627
+ }
628
+ sceneObject.userData.id = light.id;
629
+ this.add(sceneObject);
630
+ }
631
+ if (light.name !== void 0 && light.name !== null) sceneObject.name = light.name;
632
+ if (light.position !== void 0 && light.position !== null) sceneObject.position.set(light.position.x, light.position.y, light.position.z);
633
+ if (light.intensity !== void 0 && light.intensity !== null) sceneObject.SetIntensity(light.intensity);
634
+ if (light.enabled !== void 0 && light.enabled !== null) sceneObject.SetEnabled(light.enabled);
635
+ if (light.color !== void 0 && light.color !== null) sceneObject.SetColor(new import_three6.Color(light.color));
636
+ if (light.visible !== void 0 && light.visible !== null) sceneObject.visible = light.visible;
637
+ }
638
+ DeleteLight(light) {
639
+ var _a;
640
+ if (light.id === void 0) {
641
+ console.warn("LightRoot.DeleteLight: light.id is undefined");
642
+ return;
643
+ }
644
+ const sceneObject = this.children.find((object3D) => object3D.userData.id === light.id);
645
+ if (!sceneObject) {
646
+ console.warn(`LightRoot.DeleteLight: Light with id ${light.id} not found`);
647
+ return;
648
+ }
649
+ if ("isMoveable" in sceneObject) {
650
+ (_a = sceneObject.gizmo) == null ? void 0 : _a.detach();
651
+ }
652
+ this.remove(sceneObject);
653
+ }
654
+ };
655
+
656
+ // src/scene/root/modelroot/ModelRoot.ts
657
+ var import_three8 = require("three");
658
+
659
+ // src/model/Model.ts
660
+ var import_three7 = require("three");
661
+ var DIVEModel = class extends import_three7.Object3D {
662
+ constructor() {
663
+ super();
664
+ this.isSelectable = true;
665
+ this.isMoveable = true;
666
+ this.gizmo = null;
667
+ this.layers.mask = PRODUCT_LAYER_MASK;
668
+ this.boundingBox = new import_three7.Box3();
669
+ }
670
+ SetModel(gltf) {
671
+ this.clear();
672
+ gltf.scene.traverse((child) => {
673
+ child.castShadow = true;
674
+ child.receiveShadow = true;
675
+ child.layers.mask = this.layers.mask;
676
+ this.boundingBox.expandByObject(child);
677
+ });
678
+ this.add(gltf.scene);
679
+ }
680
+ SetPosition(position) {
681
+ this.position.set(position.x, position.y, position.z);
682
+ }
683
+ SetRotation(rotation) {
684
+ this.rotation.setFromVector3(new import_three7.Vector3(rotation.x, rotation.y, rotation.z));
685
+ }
686
+ SetScale(scale) {
687
+ this.scale.set(scale.x, scale.y, scale.z);
688
+ }
689
+ SetToWorldOrigin() {
690
+ var _a;
691
+ this.position.set(0, 0, 0);
692
+ (_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 });
693
+ }
694
+ PlaceOnFloor() {
695
+ var _a;
696
+ this.position.y = -this.boundingBox.min.y * this.scale.y;
697
+ (_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 });
698
+ }
699
+ onMove() {
700
+ var _a;
701
+ (_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 });
702
+ }
703
+ };
704
+
705
+ // src/loadingmanager/LoadingManager.ts
706
+ var import_Addons = require("three/examples/jsm/Addons.js");
707
+ var DIVELoadingManager = class {
708
+ // ... maybe extend with other loaders later
709
+ constructor() {
710
+ this.progress = /* @__PURE__ */ new Map();
711
+ this.gltfloader = new import_Addons.GLTFLoader();
712
+ this.dracoloader = new import_Addons.DRACOLoader();
713
+ this.dracoloader.setDecoderPath("https://www.gstatic.com/draco/v1/decoders/");
714
+ this.gltfloader.setDRACOLoader(this.dracoloader);
715
+ }
716
+ LoadGLTF(uri) {
717
+ return __async(this, null, function* () {
718
+ const progEvent = (p) => {
719
+ this.progress.set(uri, p.loaded / p.total);
720
+ };
721
+ this.progress.set(uri, 0);
722
+ return new Promise((resolve, reject) => {
723
+ this.gltfloader.loadAsync(uri, progEvent).then(resolve).catch(reject);
724
+ });
725
+ });
726
+ }
727
+ PollProgress() {
728
+ let total = 0;
729
+ this.progress.forEach((progress) => {
730
+ total += progress;
731
+ });
732
+ if (this.progress.size === 0) return 1;
733
+ return total / this.progress.size;
734
+ }
735
+ };
736
+
737
+ // src/scene/root/modelroot/ModelRoot.ts
738
+ var DIVEModelRoot = class extends import_three8.Object3D {
739
+ constructor() {
740
+ super();
741
+ this.name = "ModelRoot";
742
+ this.loadingManager = new DIVELoadingManager();
743
+ }
744
+ GetModel(object) {
745
+ if (object.id === void 0) {
746
+ console.warn("ModelRoot.GetModel: object.id is undefined");
747
+ return void 0;
748
+ }
749
+ return this.children.find((object3D) => object3D.userData.id === object.id);
750
+ }
751
+ UpdateModel(object) {
752
+ if (object.id === void 0) {
753
+ console.warn("ModelRoot.UpdateModel: object.id is undefined");
754
+ return;
755
+ }
756
+ let sceneObject = this.children.find((object3D) => object3D.userData.id === object.id);
757
+ if (!sceneObject && object.uri !== void 0) {
758
+ const model = new DIVEModel();
759
+ sceneObject = model;
760
+ sceneObject.userData.id = object.id;
761
+ this.add(sceneObject);
762
+ this.loadingManager.LoadGLTF(object.uri).then((gltf) => {
763
+ var _a;
764
+ model.SetModel(gltf);
765
+ (_a = DIVECommunication.get(object.id)) == null ? void 0 : _a.PerformAction("MODEL_LOADED", { id: object.id });
766
+ });
767
+ }
768
+ if (object.position !== void 0) sceneObject.SetPosition(object.position);
769
+ if (object.rotation !== void 0) sceneObject.SetRotation(object.rotation);
770
+ if (object.scale !== void 0) sceneObject.SetScale(object.scale);
771
+ if (object.visible !== void 0) sceneObject.visible = object.visible;
772
+ }
773
+ DeleteModel(object) {
774
+ var _a;
775
+ if (object.id === void 0) {
776
+ console.warn(`ModelRoot.DeleteModel: object.id is undefined`);
777
+ return;
778
+ }
779
+ const sceneObject = this.children.find((object3D) => object3D.userData.id === object.id);
780
+ if (!sceneObject) {
781
+ console.warn(`ModelRoot.DeleteModel: Model with id ${object.id} not found`);
782
+ return;
783
+ }
784
+ if ("isMoveable" in sceneObject) {
785
+ (_a = sceneObject.gizmo) == null ? void 0 : _a.detach();
786
+ }
787
+ this.remove(sceneObject);
788
+ }
789
+ PlaceOnFloor(object) {
790
+ if (object.id === void 0) console.warn("ModelRoot.PlaceOnFloor: object.id is undefined");
791
+ const sceneObject = this.children.find((object3D) => object3D.userData.id === object.id);
792
+ if (!sceneObject) return;
793
+ sceneObject.PlaceOnFloor();
794
+ }
795
+ };
796
+
797
+ // src/primitive/floor/Floor.ts
798
+ var import_three9 = require("three");
799
+ var DIVEFloor = class extends import_three9.Mesh {
800
+ constructor() {
801
+ super(new import_three9.PlaneGeometry(1e4, 1e4), new import_three9.MeshStandardMaterial({ color: new import_three9.Color(150 / 255, 150 / 255, 150 / 255) }));
802
+ this.isFloor = true;
803
+ this.name = "Floor";
804
+ this.layers.mask = PRODUCT_LAYER_MASK;
805
+ this.receiveShadow = true;
806
+ this.rotateX(-Math.PI / 2);
807
+ }
808
+ SetVisibility(visible) {
809
+ this.visible = visible;
810
+ }
811
+ SetColor(color) {
812
+ this.material.color = new import_three9.Color(color);
813
+ }
814
+ };
815
+
816
+ // src/constant/GridColors.ts
817
+ var GRID_CENTER_LINE_COLOR = "#888888";
818
+ var GRID_SIDE_LINE_COLOR = "#dddddd";
819
+
820
+ // src/grid/Grid.ts
821
+ var import_three10 = require("three");
822
+ var DIVEGrid = class extends import_three10.Object3D {
823
+ constructor() {
824
+ super();
825
+ this.name = "Grid";
826
+ const grid = new import_three10.GridHelper(100, 100, GRID_CENTER_LINE_COLOR, GRID_SIDE_LINE_COLOR);
827
+ grid.material.depthTest = false;
828
+ grid.layers.mask = HELPER_LAYER_MASK;
829
+ this.add(grid);
830
+ }
831
+ };
832
+
833
+ // src/scene/root/Root.ts
834
+ var DIVERoot = class extends import_three11.Object3D {
835
+ get Floor() {
836
+ return this.floor;
837
+ }
838
+ get Grid() {
839
+ return this.grid;
840
+ }
841
+ constructor() {
842
+ super();
843
+ this.name = "Root";
844
+ this.lightRoot = new DIVELightRoot();
845
+ this.add(this.lightRoot);
846
+ this.modelRoot = new DIVEModelRoot();
847
+ this.add(this.modelRoot);
848
+ this.floor = new DIVEFloor();
849
+ this.add(this.floor);
850
+ this.grid = new DIVEGrid();
851
+ this.add(this.grid);
852
+ }
853
+ GetSceneObject(object) {
854
+ switch (object.entityType) {
855
+ case "pov": {
856
+ return void 0;
857
+ }
858
+ case "light": {
859
+ return this.lightRoot.GetLight(object);
860
+ }
861
+ case "model": {
862
+ return this.modelRoot.GetModel(object);
863
+ }
864
+ }
865
+ }
866
+ AddSceneObject(object) {
867
+ switch (object.entityType) {
868
+ case "pov": {
869
+ break;
870
+ }
871
+ case "light": {
872
+ this.lightRoot.UpdateLight(object);
873
+ break;
874
+ }
875
+ case "model": {
876
+ this.modelRoot.UpdateModel(object);
877
+ break;
878
+ }
879
+ }
880
+ }
881
+ UpdateSceneObject(object) {
882
+ switch (object.entityType) {
883
+ case "pov": {
884
+ break;
885
+ }
886
+ case "light": {
887
+ this.lightRoot.UpdateLight(object);
888
+ break;
889
+ }
890
+ case "model": {
891
+ this.modelRoot.UpdateModel(object);
892
+ break;
893
+ }
894
+ }
895
+ }
896
+ DeleteSceneObject(object) {
897
+ switch (object.entityType) {
898
+ case "pov": {
899
+ break;
900
+ }
901
+ case "light": {
902
+ this.lightRoot.DeleteLight(object);
903
+ break;
904
+ }
905
+ case "model": {
906
+ this.modelRoot.DeleteModel(object);
907
+ break;
908
+ }
909
+ }
910
+ }
911
+ PlaceOnFloor(object) {
912
+ this.modelRoot.PlaceOnFloor(object);
913
+ }
914
+ };
915
+
916
+ // src/scene/Scene.ts
917
+ var DIVEScene = class extends import_three12.Scene {
918
+ get Root() {
919
+ return this.root;
920
+ }
921
+ constructor() {
922
+ super();
923
+ this.root = new DIVERoot();
924
+ this.add(this.root);
925
+ }
926
+ SetBackground(color) {
927
+ this.background = new import_three12.Color(color);
928
+ }
929
+ GetSceneObject(object) {
930
+ return this.Root.GetSceneObject(object);
931
+ }
932
+ AddSceneObject(object) {
933
+ this.Root.UpdateSceneObject(object);
934
+ }
935
+ UpdateSceneObject(object) {
936
+ this.Root.UpdateSceneObject(object);
937
+ }
938
+ DeleteSceneObject(object) {
939
+ this.Root.DeleteSceneObject(object);
940
+ }
941
+ PlaceOnFloor(object) {
942
+ this.Root.PlaceOnFloor(object);
943
+ }
944
+ };
945
+
946
+ // src/camera/PerspectiveCamera.ts
947
+ var import_three13 = require("three");
948
+ var DIVEPerspectiveCameraDefaultSettings = {
949
+ fov: 80,
950
+ near: 0.1,
951
+ far: 1e3
952
+ };
953
+ var _DIVEPerspectiveCamera = class _DIVEPerspectiveCamera extends import_three13.PerspectiveCamera {
954
+ constructor(settings = DIVEPerspectiveCameraDefaultSettings) {
955
+ super(settings.fov, 1, settings.near, settings.far);
956
+ this.onSetCameraLayer = () => {
957
+ };
958
+ this.layers.mask = _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
959
+ }
960
+ OnResize(width, height) {
961
+ this.aspect = width / height;
962
+ this.updateProjectionMatrix();
963
+ }
964
+ SetCameraLayer(layer) {
965
+ this.layers.mask = layer === "LIVE" ? _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
966
+ this.onSetCameraLayer(this.layers.mask);
967
+ }
968
+ };
969
+ _DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;
970
+ _DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;
971
+ var DIVEPerspectiveCamera = _DIVEPerspectiveCamera;
972
+
973
+ // src/controls/OrbitControls.ts
974
+ var import_Addons2 = require("three/examples/jsm/Addons.js");
975
+ var import_three14 = require("three");
976
+ var import_tween = require("@tweenjs/tween.js");
977
+ var DIVEOrbitControlsDefaultSettings = {
978
+ enableDamping: true,
979
+ dampingFactor: 0.04
980
+ };
981
+ var _DIVEOrbitControls = class _DIVEOrbitControls extends import_Addons2.OrbitControls {
982
+ constructor(camera, renderer, settings = DIVEOrbitControlsDefaultSettings) {
983
+ super(camera, renderer.domElement);
984
+ this.last = null;
985
+ this.animating = false;
986
+ this.locked = false;
987
+ this.stopMoveTo = () => {
988
+ };
989
+ this.stopRevertLast = () => {
990
+ };
991
+ this.preRenderCallback = () => {
992
+ if (this.locked) return;
993
+ this.update();
994
+ };
995
+ this.domElement = renderer.domElement;
996
+ this.object = camera;
997
+ renderer.AddPreRenderCallback(() => {
998
+ this.preRenderCallback();
999
+ });
1000
+ this.enableDamping = settings.enableDamping;
1001
+ this.dampingFactor = settings.dampingFactor;
1002
+ }
1003
+ ZoomIn(by) {
1004
+ const zoomBy = by || _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;
1005
+ const { minDistance, maxDistance } = this;
1006
+ this.minDistance = this.maxDistance = import_three14.MathUtils.clamp(this.getDistance() - zoomBy, minDistance + zoomBy, maxDistance - zoomBy);
1007
+ this.update();
1008
+ this.minDistance = minDistance;
1009
+ this.maxDistance = maxDistance;
1010
+ }
1011
+ ZoomOut(by) {
1012
+ const zoomBy = by || _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;
1013
+ const { minDistance, maxDistance } = this;
1014
+ this.minDistance = this.maxDistance = import_three14.MathUtils.clamp(this.getDistance() + zoomBy, minDistance + zoomBy, maxDistance - zoomBy);
1015
+ this.update();
1016
+ this.minDistance = minDistance;
1017
+ this.maxDistance = maxDistance;
1018
+ }
1019
+ MoveTo(pos, target, duration, lock) {
1020
+ if (this.animating) return;
1021
+ const toPosition = pos || this.object.position.clone();
1022
+ const toTarget = target || this.target.clone();
1023
+ this.stopRevertLast();
1024
+ if (!this.locked) this.last = { pos: this.object.position.clone(), target: this.target.clone() };
1025
+ this.animating = duration > 0;
1026
+ this.locked = lock;
1027
+ this.enabled = false;
1028
+ const tweenPos = new import_tween.Tween(this.object.position).to(toPosition, duration).easing(import_tween.Easing.Quadratic.Out).start();
1029
+ const tweenQuat = new import_tween.Tween(this.target).to(toTarget, duration).easing(import_tween.Easing.Quadratic.Out).onUpdate(() => {
1030
+ this.object.lookAt(this.target);
1031
+ }).onComplete(() => {
1032
+ this.animating = false;
1033
+ this.enabled = !lock;
1034
+ }).start();
1035
+ this.stopMoveTo = () => {
1036
+ tweenPos.stop();
1037
+ tweenQuat.stop();
1038
+ };
1039
+ }
1040
+ RevertLast(duration) {
1041
+ if (this.animating || !this.locked) return;
1042
+ this.stopMoveTo();
1043
+ this.animating = duration > 0;
1044
+ this.enabled = false;
1045
+ const { pos, target } = this.last;
1046
+ const tweenPos = new import_tween.Tween(this.object.position).to(pos, duration).easing(import_tween.Easing.Quadratic.Out).start();
1047
+ const tweenQuat = new import_tween.Tween(this.target).to(target, duration).easing(import_tween.Easing.Quadratic.Out).onUpdate(() => {
1048
+ this.object.lookAt(this.target);
1049
+ }).onComplete(() => {
1050
+ this.animating = false;
1051
+ this.locked = false;
1052
+ this.enabled = true;
1053
+ }).start();
1054
+ this.stopRevertLast = () => {
1055
+ tweenPos.stop();
1056
+ tweenQuat.stop();
1057
+ };
1058
+ }
1059
+ };
1060
+ _DIVEOrbitControls.DEFAULT_ZOOM_FACTOR = 1;
1061
+ var DIVEOrbitControls = _DIVEOrbitControls;
1062
+
1063
+ // src/mediacreator/MediaCreator.ts
1064
+ var DIVEMediaCreator = class {
1065
+ constructor(renderer, scene, controller) {
1066
+ this.renderer = renderer;
1067
+ this.scene = scene;
1068
+ this.controller = controller;
1069
+ }
1070
+ GenerateMedia(position, target, width, height) {
1071
+ const resetPosition = this.controller.object.position.clone();
1072
+ const resetRotation = this.controller.object.quaternion.clone();
1073
+ this.renderer.OnResize(width, height);
1074
+ this.controller.object.OnResize(width, height);
1075
+ this.controller.object.position.copy(position);
1076
+ this.controller.target.copy(target);
1077
+ this.controller.update();
1078
+ const dataUri = this.DrawCanvas().toDataURL();
1079
+ this.controller.object.position.copy(resetPosition);
1080
+ this.controller.object.quaternion.copy(resetRotation);
1081
+ return dataUri;
1082
+ }
1083
+ DrawCanvas(canvasElement) {
1084
+ const restore = this.renderer.domElement;
1085
+ if (canvasElement) {
1086
+ this.renderer.domElement = canvasElement;
1087
+ }
1088
+ this.controller.object.layers.mask = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;
1089
+ this.renderer.render(this.scene, this.controller.object);
1090
+ this.controller.object.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
1091
+ const returnCanvas = this.renderer.domElement;
1092
+ if (canvasElement) {
1093
+ this.renderer.domElement = restore;
1094
+ }
1095
+ return returnCanvas;
1096
+ }
1097
+ };
1098
+
1099
+ // src/toolbox/select/SelectTool.ts
1100
+ var import_three15 = require("three");
1101
+ var import_Addons3 = require("three/examples/jsm/Addons.js");
1102
+
1103
+ // src/toolbox/BaseTool.ts
1104
+ var DIVEBaseTool = class {
1105
+ constructor() {
1106
+ this.name = "BaseTool";
1107
+ }
1108
+ Activate() {
1109
+ }
1110
+ Deactivate() {
1111
+ }
1112
+ onPointerDown(e) {
1113
+ }
1114
+ onPointerUp(e) {
1115
+ }
1116
+ onWheel(e) {
1117
+ }
1118
+ };
1119
+
1120
+ // src/toolbox/select/SelectTool.ts
1121
+ var DIVESelectTool = class extends DIVEBaseTool {
1122
+ constructor(scene, controller) {
1123
+ super();
1124
+ this.name = "SelectTool";
1125
+ this.canvas = controller.domElement;
1126
+ this.scene = scene;
1127
+ this.controller = controller;
1128
+ this.raycaster = new import_three15.Raycaster();
1129
+ this.raycaster.layers.mask = PRODUCT_LAYER_MASK | HELPER_LAYER_MASK;
1130
+ this.gizmo = new import_Addons3.TransformControls(this.controller.object, this.canvas);
1131
+ this.gizmo.layers.mask = UI_LAYER_MASK;
1132
+ this.gizmo.getRaycaster().layers.mask = UI_LAYER_MASK & this.controller.object.layers.mask;
1133
+ this.gizmo.traverse((child) => {
1134
+ child.layers.mask = UI_LAYER_MASK;
1135
+ });
1136
+ this.gizmo.addEventListener("objectChange", () => {
1137
+ if (!this.gizmo.object) return;
1138
+ if (!("onMove" in this.gizmo.object)) return;
1139
+ if (typeof this.gizmo.object.onMove !== "function") return;
1140
+ this.gizmo.object.onMove();
1141
+ });
1142
+ this.controller.object.onSetCameraLayer = (mask) => {
1143
+ this.gizmo.getRaycaster().layers.mask = UI_LAYER_MASK & mask;
1144
+ };
1145
+ this.gizmo.addEventListener("dragging-changed", function(event) {
1146
+ controller.enabled = !event.value;
1147
+ });
1148
+ this.scene.add(this.gizmo);
1149
+ }
1150
+ Activate() {
1151
+ }
1152
+ SetGizmoMode(mode) {
1153
+ this.gizmo.setMode(mode);
1154
+ }
1155
+ Select(selectable) {
1156
+ if (selectable.onSelect) selectable.onSelect();
1157
+ if ("isMoveable" in selectable) {
1158
+ const movable = selectable;
1159
+ movable.gizmo = this.gizmo;
1160
+ this.gizmo.attach(movable);
1161
+ }
1162
+ }
1163
+ Deselect(selectable) {
1164
+ if (selectable.onDeselect) selectable.onDeselect();
1165
+ if ("isMoveable" in selectable) selectable.gizmo = null;
1166
+ this.gizmo.detach();
1167
+ }
1168
+ onPointerUp(e) {
1169
+ const pointerPos = new import_three15.Vector2(e.offsetX / this.canvas.clientWidth * 2 - 1, e.offsetY / this.canvas.clientHeight * -2 + 1);
1170
+ this.raycaster.setFromCamera(pointerPos, this.controller.object);
1171
+ const first = this.raycastFirst();
1172
+ const selectable = this.findSelectableInterface(first == null ? void 0 : first.object);
1173
+ if (!first || !selectable) {
1174
+ if (this.gizmo.object) this.Deselect(this.gizmo.object);
1175
+ return;
1176
+ }
1177
+ this.Select(selectable);
1178
+ }
1179
+ findSelectableInterface(child) {
1180
+ if (child === void 0) return void 0;
1181
+ if (child.parent === null) {
1182
+ return void 0;
1183
+ }
1184
+ if ("isSelectable" in child) {
1185
+ return child;
1186
+ }
1187
+ return this.findSelectableInterface(child.parent);
1188
+ }
1189
+ raycastFirst() {
1190
+ return this.raycastAll()[0];
1191
+ }
1192
+ raycastAll() {
1193
+ return this.raycaster.intersectObjects(this.scene.Root.children, true);
1194
+ }
1195
+ };
1196
+
1197
+ // src/toolbox/Toolbox.ts
1198
+ var DIVEToolbox = class {
1199
+ constructor(scene, controller) {
1200
+ this.removeListenersCallback = () => {
1201
+ };
1202
+ this.selectTool = new DIVESelectTool(scene, controller);
1203
+ controller.domElement.addEventListener("pointerdown", this.onPointerDown.bind(this));
1204
+ controller.domElement.addEventListener("pointerup", this.onPointerUp.bind(this));
1205
+ controller.domElement.addEventListener("wheel", this.onWheel.bind(this));
1206
+ this.removeListenersCallback = () => {
1207
+ controller.domElement.removeEventListener("pointerdown", this.onPointerDown.bind(this));
1208
+ controller.domElement.removeEventListener("pointerup", this.onPointerUp.bind(this));
1209
+ controller.domElement.removeEventListener("wheel", this.onWheel.bind(this));
1210
+ };
1211
+ this.activeTool = this.selectTool;
1212
+ this.activeTool.Activate();
1213
+ }
1214
+ dispose() {
1215
+ this.removeListenersCallback();
1216
+ }
1217
+ GetActiveTool() {
1218
+ return this.activeTool;
1219
+ }
1220
+ UseTool(tool) {
1221
+ this.activeTool.Deactivate();
1222
+ switch (tool) {
1223
+ case "select": {
1224
+ this.selectTool.Activate();
1225
+ this.activeTool = this.selectTool;
1226
+ break;
1227
+ }
1228
+ default: {
1229
+ throw new Error(`ToolBox.UseTool: Unknown tool: ${tool}`);
1230
+ }
1231
+ }
1232
+ }
1233
+ SetGizmoMode(mode) {
1234
+ this.selectTool.SetGizmoMode(mode);
1235
+ }
1236
+ onPointerDown(e) {
1237
+ this.activeTool.onPointerDown(e);
1238
+ }
1239
+ onPointerUp(e) {
1240
+ this.activeTool.onPointerUp(e);
1241
+ }
1242
+ onWheel(e) {
1243
+ this.activeTool.onWheel(e);
1244
+ }
1245
+ };
1246
+ DIVEToolbox.DefaultTool = "select";
1247
+
1248
+ // src/animation/AnimationSystem.ts
1249
+ var import_tween2 = require("@tweenjs/tween.js");
1250
+ var DIVEAnimationSystem = class {
1251
+ update() {
1252
+ (0, import_tween2.update)();
1253
+ }
1254
+ };
1255
+
1256
+ // src/axiscamera/AxisCamera.ts
1257
+ var import_three16 = require("three");
1258
+ var import_three_spritetext = __toESM(require("three-spritetext"), 1);
1259
+
1260
+ // src/constant/AxisHelperColors.ts
1261
+ var AxesColorRedLetter = "#c20017";
1262
+ var AxesColorGreenLetter = "#00ab26";
1263
+ var AxesColorBlueLetter = "#0081d4";
1264
+ var AxesColorRed = AxesColorRedLetter;
1265
+ var AxesColorGreen = AxesColorGreenLetter;
1266
+ var AxesColorBlue = AxesColorBlueLetter;
1267
+
1268
+ // src/axiscamera/AxisCamera.ts
1269
+ var DIVEAxisCamera = class extends import_three16.OrthographicCamera {
1270
+ constructor() {
1271
+ super(-1, 1, 1, -1, 0.1, 100);
1272
+ this.layers.mask = COORDINATE_LAYER_MASK;
1273
+ this.axesHelper = new import_three16.AxesHelper(0.5);
1274
+ this.axesHelper.layers.mask = COORDINATE_LAYER_MASK;
1275
+ this.axesHelper.material.depthTest = false;
1276
+ this.axesHelper.position.set(0, 0, -1);
1277
+ this.axesHelper.setColors(
1278
+ new import_three16.Color(AxesColorRed),
1279
+ new import_three16.Color(AxesColorGreen),
1280
+ new import_three16.Color(AxesColorBlue)
1281
+ );
1282
+ const x = new import_three_spritetext.default("X", 0.2, AxesColorRedLetter);
1283
+ const y = new import_three_spritetext.default("Y", 0.2, AxesColorGreenLetter);
1284
+ const z = new import_three_spritetext.default("Z", 0.2, AxesColorBlueLetter);
1285
+ x.layers.mask = COORDINATE_LAYER_MASK;
1286
+ y.layers.mask = COORDINATE_LAYER_MASK;
1287
+ z.layers.mask = COORDINATE_LAYER_MASK;
1288
+ x.position.set(0.7, 0, 0);
1289
+ y.position.set(0, 0.7, 0);
1290
+ z.position.set(0, 0, 0.7);
1291
+ this.axesHelper.add(x);
1292
+ this.axesHelper.add(y);
1293
+ this.axesHelper.add(z);
1294
+ this.add(this.axesHelper);
1295
+ }
1296
+ SetFromCameraMatrix(matrix) {
1297
+ this.axesHelper.rotation.setFromRotationMatrix(new import_three16.Matrix4().extractRotation(matrix).invert());
1298
+ }
1299
+ };
1300
+
1301
+ // src/helper/getObjectDelta/getObjectDelta.ts
1302
+ var getObjectDelta = (a, b) => {
1303
+ if (Object.keys(a).length === 0 && Object.keys(b).length === 0) {
1304
+ return {};
1305
+ }
1306
+ if (typeof a !== "object" || typeof b !== "object") {
1307
+ return b;
1308
+ }
1309
+ let delta = {};
1310
+ Object.keys(b).forEach((key) => {
1311
+ if (!Object.keys(a).includes(key)) {
1312
+ delta = __spreadProps(__spreadValues({}, delta), { [key]: b[key] });
1313
+ return;
1314
+ }
1315
+ if (Array.isArray(b[key])) {
1316
+ if (!Array.isArray(a[key])) {
1317
+ delta = __spreadProps(__spreadValues({}, delta), { [key]: b[key] });
1318
+ return;
1319
+ }
1320
+ const aArray = a[key];
1321
+ const bArray = b[key];
1322
+ if (aArray.length === 0 && bArray.length === 0) {
1323
+ delta = __spreadValues({}, delta);
1324
+ return;
1325
+ }
1326
+ if (aArray.length !== bArray.length) {
1327
+ delta = __spreadProps(__spreadValues({}, delta), { [key]: b[key] });
1328
+ return;
1329
+ }
1330
+ const arrayDeltas = [];
1331
+ bArray.forEach((entry, index) => {
1332
+ const inArrayDelta = getObjectDelta(aArray[index], bArray[index]);
1333
+ if (Object.keys(inArrayDelta).length) {
1334
+ arrayDeltas.push(bArray[index]);
1335
+ }
1336
+ });
1337
+ if (Object.keys(arrayDeltas).length) {
1338
+ delta = __spreadProps(__spreadValues({}, delta), { [key]: arrayDeltas });
1339
+ return;
1340
+ }
1341
+ return;
1342
+ }
1343
+ if (typeof b[key] === "object") {
1344
+ if (typeof a[key] !== "object") {
1345
+ delta = __spreadProps(__spreadValues({}, delta), { [key]: b[key] });
1346
+ return;
1347
+ }
1348
+ const objectDelta = getObjectDelta(a[key], b[key]);
1349
+ if (Object.keys(objectDelta).length) {
1350
+ delta = __spreadProps(__spreadValues({}, delta), { [key]: objectDelta });
1351
+ return;
1352
+ }
1353
+ }
1354
+ if (a[key] !== b[key]) {
1355
+ delta = __spreadProps(__spreadValues({}, delta), { [key]: b[key] });
1356
+ }
1357
+ });
1358
+ return delta;
1359
+ };
1360
+
1361
+ // src/math/helper/shift.ts
1362
+ function shift(value, exponent) {
1363
+ const subvalues = (value + "e").split("e");
1364
+ return +(subvalues[0] + "e" + (+subvalues[1] + (exponent || 0)));
1365
+ }
1366
+
1367
+ // src/math/ceil/ceilExp.ts
1368
+ function ceilExp(number, decimals = 0) {
1369
+ const n = shift(number, +decimals);
1370
+ return shift(Math.ceil(n), -decimals);
1371
+ }
1372
+
1373
+ // src/math/floor/floorExp.ts
1374
+ function floorExp(number, decimals = 0) {
1375
+ const n = shift(number, +decimals);
1376
+ return shift(Math.floor(n), -decimals);
1377
+ }
1378
+
1379
+ // src/math/round/roundExp.ts
1380
+ function roundExponential(number, decimals = 0) {
1381
+ if (number < 0) return -roundExponential(-number, decimals);
1382
+ const n = shift(number, +decimals);
1383
+ return shift(Math.round(n), -decimals);
1384
+ }
1385
+
1386
+ // src/math/toFixed/toFixedExp.ts
1387
+ function toFixedExp(number, decimals = 0) {
1388
+ const n = shift(number, +decimals);
1389
+ return shift(Math.round(n), -decimals).toFixed(decimals);
1390
+ }
1391
+
1392
+ // src/math/truncate/truncateExp.ts
1393
+ function truncateExp(number, decimals = 0) {
1394
+ const n = shift(number, +decimals);
1395
+ return shift(Math.trunc(n), -decimals);
1396
+ }
1397
+
1398
+ // src/math/index.ts
1399
+ var DIVEMath = {
1400
+ ceilExp,
1401
+ floorExp,
1402
+ roundExp: roundExponential,
1403
+ toFixedExp,
1404
+ truncateExp
1405
+ };
1406
+
1407
+ // src/dive.ts
1408
+ var DIVEDefaultSettings = {
1409
+ autoResize: true,
1410
+ renderer: DIVERendererDefaultSettings,
1411
+ perspectiveCamera: DIVEPerspectiveCameraDefaultSettings,
1412
+ orbitControls: DIVEOrbitControlsDefaultSettings
1413
+ };
1414
+ var DIVE = class {
1415
+ // getters
1416
+ get Communication() {
1417
+ return this.communication;
1418
+ }
1419
+ get Canvas() {
1420
+ return this.renderer.domElement;
1421
+ }
1422
+ // setters
1423
+ set Settings(settings) {
1424
+ const settingsDelta = getObjectDelta(this._settings, settings);
1425
+ if (settingsDelta.renderer) this.renderer = new DIVERenderer(this._settings.renderer);
1426
+ if (settingsDelta.perspectiveCamera) {
1427
+ this.perspectiveCamera.fov = settingsDelta.perspectiveCamera.fov;
1428
+ this.perspectiveCamera.near = settingsDelta.perspectiveCamera.near;
1429
+ this.perspectiveCamera.far = settingsDelta.perspectiveCamera.far;
1430
+ this.perspectiveCamera.OnResize(this.renderer.domElement.width, this.renderer.domElement.height);
1431
+ }
1432
+ if (settingsDelta.orbitControls) {
1433
+ this.orbitControls.enableDamping = settingsDelta.orbitControls.enableDamping;
1434
+ this.orbitControls.dampingFactor = settingsDelta.orbitControls.dampingFactor;
1435
+ }
1436
+ if (settingsDelta.autoResize !== this._settings.autoResize) {
1437
+ if (settingsDelta.autoResize) {
1438
+ this.addResizeObserver();
1439
+ } else {
1440
+ this.removeResizeObserver();
1441
+ }
1442
+ }
1443
+ Object.assign(this._settings, settings);
1444
+ }
1445
+ constructor(settings) {
1446
+ this._settings = __spreadValues(__spreadValues({}, DIVEDefaultSettings), settings !== void 0 ? settings : {});
1447
+ this._resizeObserverId = "";
1448
+ this._width = 0;
1449
+ this._height = 0;
1450
+ this.renderer = new DIVERenderer(this._settings.renderer);
1451
+ this.scene = new DIVEScene();
1452
+ this.perspectiveCamera = new DIVEPerspectiveCamera(this._settings.perspectiveCamera);
1453
+ this.orbitControls = new DIVEOrbitControls(this.perspectiveCamera, this.renderer, this._settings.orbitControls);
1454
+ this.mediaCreator = new DIVEMediaCreator(this.renderer, this.scene, this.orbitControls);
1455
+ this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);
1456
+ this.communication = new DIVECommunication(this.scene, this.orbitControls, this.toolbox, this.mediaCreator);
1457
+ this.animationSystem = new DIVEAnimationSystem();
1458
+ this.renderer.AddPreRenderCallback(() => {
1459
+ this.animationSystem.update();
1460
+ });
1461
+ this.axisCamera = new DIVEAxisCamera();
1462
+ this.scene.add(this.axisCamera);
1463
+ const restoreViewport = new import_three17.Vector4();
1464
+ this.renderer.AddPostRenderCallback(() => {
1465
+ const restoreBackground = this.scene.background;
1466
+ this.scene.background = null;
1467
+ this.renderer.getViewport(restoreViewport);
1468
+ this.renderer.setViewport(0, 0, 150, 150);
1469
+ this.renderer.autoClear = false;
1470
+ this.axisCamera.SetFromCameraMatrix(this.perspectiveCamera.matrix);
1471
+ this.renderer.render(this.scene, this.axisCamera);
1472
+ this.renderer.setViewport(restoreViewport);
1473
+ this.renderer.autoClear = true;
1474
+ this.scene.background = restoreBackground;
1475
+ });
1476
+ if (this._settings.autoResize) {
1477
+ this.addResizeObserver();
1478
+ }
1479
+ this.renderer.StartRenderer(this.scene, this.perspectiveCamera);
1480
+ }
1481
+ // methods
1482
+ OnResize(width, height) {
1483
+ this.renderer.OnResize(width, height);
1484
+ this.perspectiveCamera.OnResize(width, height);
1485
+ }
1486
+ addResizeObserver() {
1487
+ this._resizeObserverId = this.renderer.AddPreRenderCallback(() => {
1488
+ const canvasWrapper = this.renderer.domElement.parentElement;
1489
+ if (!canvasWrapper) return;
1490
+ const { clientWidth, clientHeight } = canvasWrapper;
1491
+ if (clientWidth === this._width && clientHeight === this._height) return;
1492
+ this.OnResize(clientWidth, clientHeight);
1493
+ this._width = clientWidth;
1494
+ this._height = clientHeight;
1495
+ });
1496
+ }
1497
+ removeResizeObserver() {
1498
+ this.renderer.RemovePreRenderCallback(this._resizeObserverId);
1499
+ }
1500
+ };
1501
+ // Annotate the CommonJS export names for ESM import in node:
1502
+ 0 && (module.exports = {
1503
+ DIVE,
1504
+ DIVECommunication,
1505
+ DIVEDefaultSettings,
1506
+ DIVEMath
1507
+ });
1508
+ //# sourceMappingURL=dive.cjs.map