@selvajs/visualization 1.6.0-beta.2 → 1.6.0-beta.4

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 (42) hide show
  1. package/dist/gpu-dispose-Cestx__L.cjs +2 -0
  2. package/dist/gpu-dispose-Cestx__L.cjs.map +1 -0
  3. package/dist/gpu-dispose-gTGxGTL4.js +2 -0
  4. package/dist/gpu-dispose-gTGxGTL4.js.map +1 -0
  5. package/dist/gpu-ownership-DcHWbATk.js +2 -0
  6. package/dist/gpu-ownership-DcHWbATk.js.map +1 -0
  7. package/dist/gpu-ownership-ilj3JEdn.cjs +2 -0
  8. package/dist/gpu-ownership-ilj3JEdn.cjs.map +1 -0
  9. package/dist/merged-draw-CO5Ev9ia.js +2 -0
  10. package/dist/merged-draw-CO5Ev9ia.js.map +1 -0
  11. package/dist/merged-draw-SXYrxFt4.cjs +2 -0
  12. package/dist/merged-draw-SXYrxFt4.cjs.map +1 -0
  13. package/dist/parse.cjs +8 -8
  14. package/dist/parse.cjs.map +1 -1
  15. package/dist/parse.d.cts +6 -17
  16. package/dist/parse.d.ts +6 -17
  17. package/dist/parse.js +8 -8
  18. package/dist/parse.js.map +1 -1
  19. package/dist/render.cjs +4 -4
  20. package/dist/render.cjs.map +1 -1
  21. package/dist/render.d.cts +1 -31
  22. package/dist/render.d.ts +1 -31
  23. package/dist/render.js +4 -4
  24. package/dist/render.js.map +1 -1
  25. package/dist/scene.cjs +1 -1
  26. package/dist/scene.cjs.map +1 -1
  27. package/dist/scene.d.cts +0 -12
  28. package/dist/scene.d.ts +0 -12
  29. package/dist/scene.js +1 -1
  30. package/dist/scene.js.map +1 -1
  31. package/dist/{types-DjPelPRM.d.ts → types-P5PyfYYE.d.cts} +1 -3
  32. package/dist/{types-DjPelPRM.d.cts → types-P5PyfYYE.d.ts} +1 -3
  33. package/package.json +9 -8
  34. package/dist/gpu-dispose-Dich0oW7.js +0 -2
  35. package/dist/gpu-dispose-Dich0oW7.js.map +0 -1
  36. package/dist/gpu-dispose-GZmNW-gK.cjs +0 -2
  37. package/dist/gpu-dispose-GZmNW-gK.cjs.map +0 -1
  38. package/dist/merged-draw-B75jHIzV.cjs +0 -2
  39. package/dist/merged-draw-B75jHIzV.cjs.map +0 -1
  40. package/dist/merged-draw-BPhBYH-v.js +0 -2
  41. package/dist/merged-draw-BPhBYH-v.js.map +0 -1
  42. package/dist/rolldown-runtime-BocRIvOZ.cjs +0 -1
package/dist/render.d.cts CHANGED
@@ -1,9 +1,8 @@
1
- import { a as MaterialAppearanceOptions, i as LookPreset, n as Look, r as LookMaterialOverride, t as LOOKS } from "./types-DjPelPRM.cjs";
1
+ import { a as MaterialAppearanceOptions, i as LookPreset, n as Look, r as LookMaterialOverride, t as LOOKS } from "./types-P5PyfYYE.cjs";
2
2
  import * as THREE from "three";
3
3
  import { OrbitControls } from "three/addons/controls/OrbitControls.js";
4
4
  import "three/addons/lines/LineSegments2.js";
5
5
  import { CSS2DObject } from "three/addons/renderers/CSS2DRenderer.js";
6
- //#region src/shared/errors.d.ts
7
6
  /**
8
7
  * Errors for the visualization package. Replaces `@selvajs/compute`'s `RhinoComputeError`, which
9
8
  * mis-named failures on paths (e.g. the plugin WebSocket) that never touch Rhino.Compute. `code`
@@ -30,8 +29,6 @@ export declare class VisualizationError extends Error {
30
29
  originalError?: Error;
31
30
  });
32
31
  }
33
- //#endregion
34
- //#region src/shared/logger.d.ts
35
32
  /**
36
33
  * Logging facility for the visualization package. Deliberately local rather than imported from
37
34
  * `@selvajs/compute` (logging isn't a compute concern). Mirrors compute's logger shape so a host
@@ -46,8 +43,6 @@ interface Logger {
46
43
  export declare function getLogger(): Logger;
47
44
  export declare function setLogger(logger: Logger | Console | null): void;
48
45
  export declare function enableDebugLogging(): void;
49
- //#endregion
50
- //#region src/shared/looks.d.ts
51
46
  /** The look applied when the caller passes no `look` option. */
52
47
  export declare const DEFAULT_LOOK: Look;
53
48
  /**
@@ -62,8 +57,6 @@ export declare const DEFAULT_LOOK: Look;
62
57
  export declare const LOOK_PRESETS: Record<Look, LookPreset>;
63
58
  /** Baked at parse time (not toggleable at runtime). */
64
59
  export declare function materialAppearanceForLook(look: Look): MaterialAppearanceOptions;
65
- //#endregion
66
- //#region src/render/types.d.ts
67
60
  type CameraConfig = {
68
61
  position?: THREE.Vector3;
69
62
  fov?: number;
@@ -262,8 +255,6 @@ type EventConfig = {
262
255
  /** Fires every animation frame, after controls update and before render. */
263
256
  onFrame?: (delta: number) => void;
264
257
  };
265
- //#endregion
266
- //#region src/render/camera-controller.d.ts
267
258
  /**
268
259
  * Runtime camera control: preset views, perspective⇄orthographic toggle, rotate lock.
269
260
  *
@@ -296,8 +287,6 @@ interface CameraController {
296
287
  /** Cancel any in-flight camera tween. Call on viewer teardown so ticks can't touch disposed controls. */
297
288
  dispose(): void;
298
289
  }
299
- //#endregion
300
- //#region src/render/edges/options.d.ts
301
290
  /** Crisp boundary/crease edges overlaid on meshes. See the layer README for depth/perf strategy. */
302
291
  interface EdgeOptions {
303
292
  /** Default: each overlay derives its color from its own mesh's material (see {@link DEFAULT_EDGE_COLOR}). */
@@ -341,8 +330,6 @@ interface EdgeOptions {
341
330
  */
342
331
  maxOverlays?: number;
343
332
  }
344
- //#endregion
345
- //#region src/render/grid.d.ts
346
333
  interface Grid {
347
334
  /** Tagged `userData.id = 'grid'` so pick/fit code skips it. */
348
335
  readonly object: THREE.Mesh;
@@ -356,8 +343,6 @@ interface Grid {
356
343
  setVisible(visible: boolean): void;
357
344
  dispose(): void;
358
345
  }
359
- //#endregion
360
- //#region src/render/label-layer.d.ts
361
346
  interface LabelHandle {
362
347
  readonly object: CSS2DObject;
363
348
  setPosition(position: THREE.Vector3): void;
@@ -371,8 +356,6 @@ interface LabelLayer {
371
356
  setSize(width: number, height: number): void;
372
357
  dispose(): void;
373
358
  }
374
- //#endregion
375
- //#region src/render/measure.d.ts
376
359
  /**
377
360
  * Two-click distance measurement. Click a point, click a second, read the distance off a label on
378
361
  * the connecting line; a third click starts fresh.
@@ -409,8 +392,6 @@ export declare function snapToVertex(hit: THREE.Intersection, camera: THREE.Came
409
392
  width: number;
410
393
  height: number;
411
394
  }, snapPixels: number): THREE.Vector3;
412
- //#endregion
413
- //#region src/render/tool-registry.d.ts
414
395
  /**
415
396
  * A tool that can claim canvas pointer input.
416
397
  *
@@ -463,8 +444,6 @@ export declare function pointerToNdc(event: MouseEvent, canvas: HTMLCanvasElemen
463
444
  x: number;
464
445
  y: number;
465
446
  };
466
- //#endregion
467
- //#region src/render/view-gizmo.d.ts
468
447
  /**
469
448
  * Corner nav-cube/axis gizmo. Uses three's {@link ViewHelper} only as the rendered widget, not its
470
449
  * click→animate behavior: ViewHelper's snap assumes Y-up and animates straight onto the up axis,
@@ -486,8 +465,6 @@ interface ViewGizmo {
486
465
  isVisible(): boolean;
487
466
  dispose(): void;
488
467
  }
489
- //#endregion
490
- //#region src/render/scene-setup/viewer.d.ts
491
468
  interface ThreeViewer {
492
469
  scene: THREE.Scene;
493
470
  camera: THREE.PerspectiveCamera;
@@ -575,11 +552,7 @@ interface ThreeViewer {
575
552
  /** Removes and disposes geometry added via `addUserGeometry` — one app's, or all of it. */
576
553
  clearUserGeometry: (appId?: string) => void;
577
554
  }
578
- //#endregion
579
- //#region src/render/scene-setup/init-three.d.ts
580
555
  export declare const initThree: (canvas: HTMLCanvasElement, options?: ThreeInitializerOptions) => ThreeViewer;
581
- //#endregion
582
- //#region src/render/scene-ownership.d.ts
583
556
  /** Geometry produced by a solve. Replaced wholesale on the next one. */
584
557
  export declare const SOURCE_COMPUTE = "compute";
585
558
  /**
@@ -601,10 +574,7 @@ export declare function isHostOwned(object: THREE.Object3D): boolean;
601
574
  * `clearUserGeometry()` does.
602
575
  */
603
576
  export declare function isOwnedBy(object: THREE.Object3D, id?: string): boolean;
604
- //#endregion
605
- //#region src/render/three-helpers.d.ts
606
577
  /** Replaces scene content with `meshes`, rescales the camera frustum to fit, and (first call only) positions the camera/controls. */
607
578
  export declare function updateScene(scene: THREE.Scene, meshes: THREE.Object3D[], camera: THREE.PerspectiveCamera, controls: OrbitControls, initialPositionSet: boolean): void;
608
- //#endregion
609
579
  export { type CameraConfig, type CameraController, type CameraProjection, type ControlsConfig, type EdgesConfig, type EnvironmentConfig, type ErrorCode, type EventConfig, type FloorConfig, type GizmoConfig, type Grid, type GridConfig, LOOKS, type LabelHandle, type LabelLayer, type LightingConfig, type Logger, type Look, type LookMaterialOverride, type LookPreset, type MaterialAppearanceOptions, type MeasureConfig, type MeasureTool, type PointerTool, type RenderConfig, type ThreeInitializerOptions, type ThreeViewer, type ToolRegistration, type ToolRegistry, type ViewGizmo, type ViewPreset };
610
580
  //# sourceMappingURL=render.d.cts.map
package/dist/render.d.ts CHANGED
@@ -1,9 +1,8 @@
1
- import { a as MaterialAppearanceOptions, i as LookPreset, n as Look, r as LookMaterialOverride, t as LOOKS } from "./types-DjPelPRM.js";
1
+ import { a as MaterialAppearanceOptions, i as LookPreset, n as Look, r as LookMaterialOverride, t as LOOKS } from "./types-P5PyfYYE.js";
2
2
  import * as THREE from "three";
3
3
  import { LineSegments2 } from "three/addons/lines/LineSegments2.js";
4
4
  import { CSS2DObject } from "three/addons/renderers/CSS2DRenderer.js";
5
5
  import { OrbitControls } from "three/addons/controls/OrbitControls.js";
6
- //#region src/shared/errors.d.ts
7
6
  /**
8
7
  * Errors for the visualization package. Replaces `@selvajs/compute`'s `RhinoComputeError`, which
9
8
  * mis-named failures on paths (e.g. the plugin WebSocket) that never touch Rhino.Compute. `code`
@@ -30,8 +29,6 @@ export declare class VisualizationError extends Error {
30
29
  originalError?: Error;
31
30
  });
32
31
  }
33
- //#endregion
34
- //#region src/shared/logger.d.ts
35
32
  /**
36
33
  * Logging facility for the visualization package. Deliberately local rather than imported from
37
34
  * `@selvajs/compute` (logging isn't a compute concern). Mirrors compute's logger shape so a host
@@ -46,8 +43,6 @@ interface Logger {
46
43
  export declare function getLogger(): Logger;
47
44
  export declare function setLogger(logger: Logger | Console | null): void;
48
45
  export declare function enableDebugLogging(): void;
49
- //#endregion
50
- //#region src/shared/looks.d.ts
51
46
  /** The look applied when the caller passes no `look` option. */
52
47
  export declare const DEFAULT_LOOK: Look;
53
48
  /**
@@ -62,8 +57,6 @@ export declare const DEFAULT_LOOK: Look;
62
57
  export declare const LOOK_PRESETS: Record<Look, LookPreset>;
63
58
  /** Baked at parse time (not toggleable at runtime). */
64
59
  export declare function materialAppearanceForLook(look: Look): MaterialAppearanceOptions;
65
- //#endregion
66
- //#region src/render/types.d.ts
67
60
  type CameraConfig = {
68
61
  position?: THREE.Vector3;
69
62
  fov?: number;
@@ -262,8 +255,6 @@ type EventConfig = {
262
255
  /** Fires every animation frame, after controls update and before render. */
263
256
  onFrame?: (delta: number) => void;
264
257
  };
265
- //#endregion
266
- //#region src/render/camera-controller.d.ts
267
258
  /**
268
259
  * Runtime camera control: preset views, perspective⇄orthographic toggle, rotate lock.
269
260
  *
@@ -296,8 +287,6 @@ interface CameraController {
296
287
  /** Cancel any in-flight camera tween. Call on viewer teardown so ticks can't touch disposed controls. */
297
288
  dispose(): void;
298
289
  }
299
- //#endregion
300
- //#region src/render/edges/options.d.ts
301
290
  /** Crisp boundary/crease edges overlaid on meshes. See the layer README for depth/perf strategy. */
302
291
  interface EdgeOptions {
303
292
  /** Default: each overlay derives its color from its own mesh's material (see {@link DEFAULT_EDGE_COLOR}). */
@@ -341,8 +330,6 @@ interface EdgeOptions {
341
330
  */
342
331
  maxOverlays?: number;
343
332
  }
344
- //#endregion
345
- //#region src/render/grid.d.ts
346
333
  interface Grid {
347
334
  /** Tagged `userData.id = 'grid'` so pick/fit code skips it. */
348
335
  readonly object: THREE.Mesh;
@@ -356,8 +343,6 @@ interface Grid {
356
343
  setVisible(visible: boolean): void;
357
344
  dispose(): void;
358
345
  }
359
- //#endregion
360
- //#region src/render/label-layer.d.ts
361
346
  interface LabelHandle {
362
347
  readonly object: CSS2DObject;
363
348
  setPosition(position: THREE.Vector3): void;
@@ -371,8 +356,6 @@ interface LabelLayer {
371
356
  setSize(width: number, height: number): void;
372
357
  dispose(): void;
373
358
  }
374
- //#endregion
375
- //#region src/render/measure.d.ts
376
359
  /**
377
360
  * Two-click distance measurement. Click a point, click a second, read the distance off a label on
378
361
  * the connecting line; a third click starts fresh.
@@ -409,8 +392,6 @@ export declare function snapToVertex(hit: THREE.Intersection, camera: THREE.Came
409
392
  width: number;
410
393
  height: number;
411
394
  }, snapPixels: number): THREE.Vector3;
412
- //#endregion
413
- //#region src/render/tool-registry.d.ts
414
395
  /**
415
396
  * A tool that can claim canvas pointer input.
416
397
  *
@@ -463,8 +444,6 @@ export declare function pointerToNdc(event: MouseEvent, canvas: HTMLCanvasElemen
463
444
  x: number;
464
445
  y: number;
465
446
  };
466
- //#endregion
467
- //#region src/render/view-gizmo.d.ts
468
447
  /**
469
448
  * Corner nav-cube/axis gizmo. Uses three's {@link ViewHelper} only as the rendered widget, not its
470
449
  * click→animate behavior: ViewHelper's snap assumes Y-up and animates straight onto the up axis,
@@ -486,8 +465,6 @@ interface ViewGizmo {
486
465
  isVisible(): boolean;
487
466
  dispose(): void;
488
467
  }
489
- //#endregion
490
- //#region src/render/scene-setup/viewer.d.ts
491
468
  interface ThreeViewer {
492
469
  scene: THREE.Scene;
493
470
  camera: THREE.PerspectiveCamera;
@@ -575,11 +552,7 @@ interface ThreeViewer {
575
552
  /** Removes and disposes geometry added via `addUserGeometry` — one app's, or all of it. */
576
553
  clearUserGeometry: (appId?: string) => void;
577
554
  }
578
- //#endregion
579
- //#region src/render/scene-setup/init-three.d.ts
580
555
  export declare const initThree: (canvas: HTMLCanvasElement, options?: ThreeInitializerOptions) => ThreeViewer;
581
- //#endregion
582
- //#region src/render/scene-ownership.d.ts
583
556
  /** Geometry produced by a solve. Replaced wholesale on the next one. */
584
557
  export declare const SOURCE_COMPUTE = "compute";
585
558
  /**
@@ -601,10 +574,7 @@ export declare function isHostOwned(object: THREE.Object3D): boolean;
601
574
  * `clearUserGeometry()` does.
602
575
  */
603
576
  export declare function isOwnedBy(object: THREE.Object3D, id?: string): boolean;
604
- //#endregion
605
- //#region src/render/three-helpers.d.ts
606
577
  /** Replaces scene content with `meshes`, rescales the camera frustum to fit, and (first call only) positions the camera/controls. */
607
578
  export declare function updateScene(scene: THREE.Scene, meshes: THREE.Object3D[], camera: THREE.PerspectiveCamera, controls: OrbitControls, initialPositionSet: boolean): void;
608
- //#endregion
609
579
  export { type CameraConfig, type CameraController, type CameraProjection, type ControlsConfig, type EdgesConfig, type EnvironmentConfig, type ErrorCode, type EventConfig, type FloorConfig, type GizmoConfig, type Grid, type GridConfig, LOOKS, type LabelHandle, type LabelLayer, type LightingConfig, type Logger, type Look, type LookMaterialOverride, type LookPreset, type MaterialAppearanceOptions, type MeasureConfig, type MeasureTool, type PointerTool, type RenderConfig, type ThreeInitializerOptions, type ThreeViewer, type ToolRegistration, type ToolRegistry, type ViewGizmo, type ViewPreset };
610
580
  //# sourceMappingURL=render.d.ts.map
package/dist/render.js CHANGED
@@ -1,5 +1,5 @@
1
- import{a as e,c as t,d as n,f as r,g as i,h as a,l as o,m as s,p as c,r as l,s as u,t as d,u as f}from"./gpu-dispose-Dich0oW7.js";import{i as p,n as m,o as h,r as g,t as _}from"./merged-draw-BPhBYH-v.js";import*as v from"three";import{Line2 as y}from"three/addons/lines/Line2.js";import{LineGeometry as b}from"three/addons/lines/LineGeometry.js";import{LineMaterial as x}from"three/addons/lines/LineMaterial.js";import{RoomEnvironment as S}from"three/addons/environments/RoomEnvironment.js";import{LineSegments2 as C}from"three/addons/lines/LineSegments2.js";import{LineSegmentsGeometry as w}from"three/addons/lines/LineSegmentsGeometry.js";import{CSS2DObject as T,CSS2DRenderer as E}from"three/addons/renderers/CSS2DRenderer.js";import{ViewHelper as D}from"three/addons/helpers/ViewHelper.js";import{EffectComposer as O}from"three/addons/postprocessing/EffectComposer.js";import{RenderPass as k}from"three/addons/postprocessing/RenderPass.js";import{GTAOPass as A}from"three/addons/postprocessing/GTAOPass.js";import{SMAAPass as j}from"three/addons/postprocessing/SMAAPass.js";import{OutputPass as M}from"three/addons/postprocessing/OutputPass.js";import{FullScreenQuad as ee,Pass as N}from"three/addons/postprocessing/Pass.js";import{OrbitControls as P}from"three/addons/controls/OrbitControls.js";import{HDRLoader as F}from"three/addons/loaders/HDRLoader.js";const te=[`technical`,`studio`,`showcase`,`arctic`,`xray`,`lineart`,`wireframe`],ne=`compute`,re=`user`,I=`app:`;function L(e){return`${I}${e}`}function R(e){return typeof e!=`string`||!e.startsWith(I)?null:e.slice(4)||null}function z(e){let t=e.userData?.source;return t===`user`||R(t)!==null}function ie(e,t){return t===void 0?z(e):e.userData?.source===L(t)}const B=`selvaReflectionEnvironment`;function V(e,t,n){let r=new v.PMREMGenerator(t),i=new S,a=r.fromScene(i,.04).texture;i.dispose(),r.dispose(),ae(e,a,n)}function ae(e,t,n){let r={texture:t,rotation:n.clone()};e.userData[B]=r,H(e,e)}function oe(e){e.userData[B]?.texture.dispose(),delete e.userData[B]}function H(e,t){let n=t.userData[B];n&&e.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,r=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of r){if(!(e instanceof v.MeshStandardMaterial)||e.envMap&&e.envMap!==n.texture)continue;let t=e.metalness>.5?n.texture:null;e.envMap!==t&&(e.envMap=t,e.envMapRotation.copy(n.rotation),e.needsUpdate=!0)}})}function U(e){let t=e.clone().normalize(),n=new v.Vector3(0,0,1),r=new v.Vector3(0,1,0),i=Math.abs(t.dot(n))>.9?r:n,a=new v.Vector3().crossVectors(i,t).normalize();return{up:t,forward:new v.Vector3().crossVectors(t,a).normalize(),right:a}}function se(e,t){let{forward:n,right:r,up:i}=U(e);return n.clone().multiplyScalar(-1).add(r.clone().multiplyScalar(-1)).add(i).normalize().multiplyScalar(t)}function ce(e,t,n){let{forward:r,right:i,up:a}=U(e);return i.clone().multiplyScalar(t).add(r.clone().multiplyScalar(t)).add(a.clone().multiplyScalar(n))}function le(e){let t=e.clone().normalize(),n=new v.Vector3(0,1,0);if(t.dot(n)>.9999)return new v.Euler;if(t.dot(n)<-.9999)return new v.Euler(Math.PI,0,0);let r=new v.Quaternion().setFromUnitVectors(n,t);return new v.Euler().setFromQuaternion(r)}function ue(e){let t=Math.abs(e.x),n=Math.abs(e.y),r=Math.abs(e.z);return t>=n&&t>=r?`x`:n>=r?`y`:`z`}const W={HUGE_THRESHOLD:1e4,LARGE_THRESHOLD:1e3,SCALE_RATIO_THRESHOLD:100,NEAR_PLANE_FACTOR:{TINY:1e-4,SMALL:.001,NORMAL:.01},FAR_PLANE_FACTOR:{HUGE:100,LARGE:50,NORMAL:20},INITIAL_DISTANCE_MULTIPLIER:4};function de(t,n,r,i,a){if(ge(t),n.length===0)return;n.forEach(e=>{t.add(e),H(e,t)});let o=e(n),s=o.getCenter(new v.Vector3),c=o.getSize(new v.Vector3),l=Math.max(c.x,c.y,c.z);if(l/Math.min(c.x||1,c.y||1,c.z||1)>W.SCALE_RATIO_THRESHOLD||l>W.HUGE_THRESHOLD?(r.near=l*W.NEAR_PLANE_FACTOR.TINY,r.far=l*W.FAR_PLANE_FACTOR.HUGE):l>W.LARGE_THRESHOLD?(r.near=l*W.NEAR_PLANE_FACTOR.SMALL,r.far=l*W.FAR_PLANE_FACTOR.LARGE):(r.near=Math.max(.01,l*W.NEAR_PLANE_FACTOR.NORMAL),r.far=Math.max(2e3,l*W.FAR_PLANE_FACTOR.NORMAL)),r.updateProjectionMatrix(),!a){let e=l*W.INITIAL_DISTANCE_MULTIPLIER;r.position.copy(s).add(se(r.up,e)),i.target.copy(s),i.update()}}const fe=new Set([`grid`,`floor`,`label-layer`,`measure`]);function pe(e){return typeof e.userData.id==`string`&&fe.has(e.userData.id)}function me(e){let t=e;for(;t;){if(pe(t))return!0;t=t.parent}return!1}function G(e){e.updateMatrixWorld(!0);let t=new v.Box3;return e.traverse(e=>{let n=e;e.visible&&!me(e)&&n.geometry&&t.expandByObject(e)}),t}const he=new Set([`floor`,`grid`,`label-layer`]);function ge(e){[...e.children].forEach(e=>{he.has(e.userData.id)||z(e)||(d(e),e.removeFromParent())})}function _e(e){let{up:t,forward:n,right:r}=U(e),i=n.clone().negate(),a=r.clone();return{top:t.clone(),bottom:t.clone().negate(),front:i.clone(),back:i.clone().negate(),right:a.clone(),left:a.clone().negate(),iso:i.clone().multiplyScalar(1.2).add(a.clone()).add(t.clone()).normalize()}}function ve(e){let{scene:t,perspective:n,controls:r,onActiveCameraChange:i}=e,a=(e.up??n.up).clone().normalize(),o=_e(a),s=new v.OrthographicCamera(-1,1,1,-1,n.near,n.far);s.up.copy(a);let c=`perspective`,l=n.aspect,u=()=>c===`perspective`?n:s,d=null,f=()=>{d?.cancel(),d=null},p=()=>{let e=(c===`orthographic`?s:n).position.distanceTo(r.target)*Math.tan(n.fov*Math.PI/360),t=e*l;s.left=-t,s.right=t,s.top=e,s.bottom=-e,s.near=n.near,s.far=n.far,s.updateProjectionMatrix()},m=e=>{if(e!==c){if(f(),e===`orthographic`)s.position.copy(n.position),s.up.copy(n.up),s.lookAt(r.target),s.zoom=1,p();else{let e=(s.top-s.bottom)/(2*s.zoom)/Math.tan(n.fov*Math.PI/360),t=s.position.clone().sub(r.target);t.lengthSq()<1e-12&&t.copy(a),t.normalize(),n.position.copy(r.target).add(t.multiplyScalar(e))}c=e,r.object=u(),r.update(),i(u())}},h=(e,t,i,o)=>{let l=n.fov*(Math.PI/180),m=t/(2*Math.tan(l/2))*1.5,h=ye(i,a),g=e.clone().add(h.clone().multiplyScalar(m)),_=u();c===`orthographic`&&(s.zoom=1),f(),o?d=xe(_,r,g,e,()=>{c===`orthographic`&&p()}):(_.position.copy(g),r.target.copy(e),c===`orthographic`&&p(),r.update())},g=(e,n=!0)=>{let i=G(t),a=i.isEmpty()?r.target.clone():i.getCenter(new v.Vector3),o=i.isEmpty()?new v.Vector3(1,1,1):i.getSize(new v.Vector3),s=Math.max(o.x,o.y,o.z)||1;h(a,s,e,n)};return{getActiveCamera:u,getProjection:()=>c,setProjection:m,toggleProjection:()=>(m(c===`perspective`?`orthographic`:`perspective`),c),setView:(e,t=!0)=>{g(o[e],t)},setViewDirection:g,frameBounds:(e,t=!0)=>{if(e.isEmpty())return;let n=e.getCenter(new v.Vector3),i=e.getSize(new v.Vector3),a=Math.max(i.x,i.y,i.z)||1,s=u().position.clone().sub(r.target);s.lengthSq()<1e-12&&s.copy(o.iso),h(n,a,s.normalize(),t)},setRotateEnabled:e=>{r.enableRotate=e},isRotateEnabled:()=>r.enableRotate,updateAspect:(e,t)=>{l=t===0?l:e/t,c===`orthographic`&&p()},dispose:f}}function ye(e,t){let{up:n,forward:r}=U(t),i=e.clone().normalize();if(Math.abs(i.dot(n))<.9999)return e;let a=r.clone().negate(),o=.5*Math.PI/180;return i.multiplyScalar(Math.cos(o)).add(a.multiplyScalar(Math.sin(o))).normalize()}const be=e=>1-(1-e)**3;function xe(e,t,n,r,i,a=250){let o=e.position.clone(),s=t.target.clone(),c=performance.now(),l=null,u=()=>{l=null;let d=be(Math.min((performance.now()-c)/a,1));e.position.lerpVectors(o,n,d),t.target.lerpVectors(s,r,d),i(),t.update(),d<1&&(l=requestAnimationFrame(u))};return l=requestAnimationFrame(u),{cancel:()=>{l!==null&&(cancelAnimationFrame(l),l=null)}}}function Se(e){let t=Math.floor(e.length/6);if(t===0)return 1/0;let n=Math.max(1,Math.ceil(t/4096)),r=[];for(let i=0;i<t;i+=n){let t=i*6,n=Math.hypot(e[t+3]-e[t],e[t+4]-e[t+1],e[t+5]-e[t+2]);n>0&&r.push(n)}return r.length===0?1/0:(r.sort((e,t)=>e-t),r[Math.min(r.length-1,Math.floor(r.length*.15))])}function Ce(e){let t=new w;return t.setPositions(e),{geometry:t,segmentCount:e.length/6,edgeSpacing:Se(e)}}function K(e,t,n){let r=1e4,i=67108864,a=Math.cos(Math.PI/180*n),o=e.length/3;if(o>=i)throw Error(`extractEdgeSegments: ${o} vertices exceeds 2^26 limit`);let s=new Float64Array(o),c=new Float64Array(o),l=new Float64Array(o);for(let t=0;t<o;t++)s[t]=Math.round(e[3*t]*r),c[t]=Math.round(e[3*t+1]*r),l[t]=Math.round(e[3*t+2]*r);let u=16;for(;u<o*2;)u<<=1;let d=u-1,f=new Int32Array(u).fill(-1),p=new Int32Array(o);for(let e=0;e<o;e++){let t=(Math.imul(s[e]|0,73856093)^Math.imul(c[e]|0,19349663)^Math.imul(l[e]|0,83492791))&d;for(;;){let n=f[t];if(n===-1){f[t]=e,p[e]=e;break}if(s[n]===s[e]&&c[n]===c[e]&&l[n]===l[e]){p[e]=n;break}t=t+1&d}}let m=new Float32Array(6144),h=0,g=new Uint32Array(1024),_=(t,n,r)=>{if(h+6>m.length){let e=new Float32Array(m.length*2);e.set(m),m=e;let t=new Uint32Array(m.length/6);t.set(g),g=t}g[h/6]=r,m[h++]=e[3*t],m[h++]=e[3*t+1],m[h++]=e[3*t+2],m[h++]=e[3*n],m[h++]=e[3*n+1],m[h++]=e[3*n+2]},v=new Map,y=[],b=[],x=[],S=[],C=(t?t.length:o)/3;for(let n=0;n<C;n++){let r=t?t[3*n]:3*n,o=t?t[3*n+1]:3*n+1,s=t?t[3*n+2]:3*n+2,c=p[r],l=p[o],u=p[s];if(c===l||l===u||u===c)continue;let d=e[3*s]-e[3*o],f=e[3*s+1]-e[3*o+1],m=e[3*s+2]-e[3*o+2],h=e[3*r]-e[3*o],g=e[3*r+1]-e[3*o+1],C=e[3*r+2]-e[3*o+2],w=f*C-m*g,T=m*h-d*C,E=d*g-f*h,D=w*w+T*T+E*E;if(D>0){let e=1/Math.sqrt(D);w*=e,T*=e,E*=e}else w=0,T=0,E=0;for(let e=0;e<3;e++){let t,d,f,p;e===0?(t=r,d=o,f=c,p=l):e===1?(t=o,d=s,f=l,p=u):(t=s,d=r,f=u,p=c);let m=p*i+f,h=v.get(m);if(h!==void 0&&h!==-1)w*x[3*h]+T*x[3*h+1]+E*x[3*h+2]<=a&&_(t,d,n),v.set(m,-1);else{let e=f*i+p;if(!v.has(e)){let r=y.length;v.set(e,r),y.push(t),b.push(d),x.push(w,T,E),S.push(n)}}}}for(let e of v.values())e!==-1&&_(y[e],b[e],S[e]);return{segments:m.slice(0,h),faces:g.slice(0,h/6)}}function we(){return[`const extract = ${K.toString()};`,`self.onmessage = (event) => {`,` const { id, positions, index, thresholdAngle } = event.data;`,` try {`,` const { segments, faces } = extract(positions, index, thresholdAngle);`,` self.postMessage({ id, segments, faces }, [segments.buffer, faces.buffer]);`,` } catch (error) {`,` self.postMessage({ id, error: String((error && error.message) || error) });`,` }`,`};`].join(`
2
- `)}const Te=`edge-overlay`;function Ee(e){return{forcedColor:e.color==null?null:new v.Color(e.color),darken:v.MathUtils.clamp(e.darken??.75,0,1),width:e.width??1.5,thresholdAngle:e.thresholdAngle??44,distanceFade:e.distanceFade??!0,maxTriangles:e.maxTriangles??4e6,maxSegments:e.maxSegments??2e6,maxOverlays:e.maxOverlays??1500}}function De(e){let t=e.getAttribute(`position`);return t?(e.index?e.index.count:t.count)/3:0}function Oe(e){let t=e.getAttribute(`position`);if(!t||t.isInterleavedBufferAttribute||t.itemSize!==3||!(t.array instanceof Float32Array)||t.count>=67108864)return null;let n=e.index;return n&&!(n.array instanceof Uint32Array)&&!(n.array instanceof Uint16Array)?null:{positions:t.array,index:n?n.array:null}}function ke(e,t){let n=4096,r=2166136261,i=e=>{r^=e,r=Math.imul(r,16777619)},a=new Uint32Array(e.positions.buffer,e.positions.byteOffset,e.positions.length),o=Math.min(n,a.length);for(let e=0;e<o;e++)i(a[e]);for(let e=Math.max(o,a.length-n);e<a.length;e++)i(a[e]);let s=0;if(e.index){s=e.index.length;let t=Math.min(n,s);for(let n=0;n<t;n++)i(e.index[n]);for(let r=Math.max(t,s-n);r<s;r++)i(e.index[r])}return`${t}:${e.positions.length}:${s}:${r>>>0}`}function Ae(e,t){let n=new v.EdgesGeometry(e,t),r=n.attributes.position?n.attributes.position.array:new Float32Array;return n.dispose(),{segments:r,faces:null}}function je(e,t){let n=Oe(e);return n?K(n.positions,n.index,t):Ae(e,t)}let q;const J=new Map;let Me=1;function Ne(){if(q!==void 0)return q;if(typeof Worker>`u`||typeof Blob>`u`||typeof URL>`u`||typeof URL.createObjectURL!=`function`)return q=null,null;try{let e=URL.createObjectURL(new Blob([we()],{type:`text/javascript`})),t=new Worker(e);t.onmessage=e=>{let{id:t,segments:n,faces:r,error:i}=e.data,a=J.get(t);a&&(J.delete(t),n?a.resolve({segments:n,faces:r??null}):a.reject(Error(i??`edge extraction failed in worker`)))},t.onerror=()=>{for(let e of J.values())e.reject(Error(`edge extraction worker crashed`));J.clear(),t.terminate(),q=null},q=t}catch{q=null}return q}function Pe(e,t,n){return new Promise((r,i)=>{let a=Me++;J.set(a,{resolve:r,reject:i});let o=t.positions.slice(),s=t.index?t.index.slice():null,c=[o.buffer];s&&c.push(s.buffer),e.postMessage({id:a,positions:o,index:s,thresholdAngle:n},c)})}const Y=new Map;function Fe(e,t){let n=Oe(e);if(!n||De(e)<25e3)return Promise.resolve(je(e,t));let r=ke(n,t),i=Y.get(r);if(i)return i;let a=Ne();if(!a)return Promise.resolve(je(e,t));let o=Pe(a,n,t).catch(()=>K(n.positions,n.index,t)).finally(()=>{Y.delete(r)});return Y.set(r,o),o}function X(e){let t=e.userData?.members;return Array.isArray(t)&&t.length>0?t:null}function Ie(e){let t=X(e.object);if(!t||e.faceIndex==null)return null;let n=e.faceIndex*3,r=0,i=t.length-1;for(;r<=i;){let e=r+i>>1,a=t[e];if(a.indexStart==null||a.indexCount==null)return null;if(n<a.indexStart)i=e-1;else if(n>=a.indexStart+a.indexCount)r=e+1;else return{member:a,index:e}}return null}function Le(e,t){let n=new v.Box3,r=e.geometry.getIndex(),i=e.geometry.getAttribute(`position`);if(!r||!i||t.indexStart==null||t.indexCount==null)return n;e.updateMatrixWorld();let a=new v.Vector3,o=Math.min(t.indexStart+t.indexCount,r.count);for(let s=t.indexStart;s<o;s++)a.fromBufferAttribute(i,r.getX(s)).applyMatrix4(e.matrixWorld),n.expandByPoint(a);return n}function Re(e,t,n){let r=X(e)?.indexOf(t)??-1;return r<0||t.indexStart==null||t.indexCount==null?()=>{}:(h(e,r,n),()=>_(e))}function ze(e,t){let n=X(e);if(!n)return null;let r=[];for(let e of n){if(e.indexStart==null)return null;r.push(e.indexStart)}let i=new Uint32Array(t.length);for(let e=0;e<t.length;e++){let n=t[e]*3,a=0,o=r.length-1;for(;a<o;){let e=a+o+1>>1;r[e]<=n?a=e:o=e-1}i[e]=a}return i}function Be(e,t,n){let r=0;for(let e=0;e<t.length;e++)n.has(t[e])||r++;let i=new Float32Array(r*6),a=0;for(let r=0;r<t.length;r++)n.has(t[r])||(i.set(e.subarray(r*6,r*6+6),a),a+=6);return i}function Ve(e,t,n){let{segments:r,faces:i}=n;if(!i||!X(t))return;let a,o=!1,s=()=>{let n=g(t);if(n.size===0&&!o||(a??=ze(t,i),!a))return;let s=n.size===0?r:Be(r,a,n);e.geometry.dispose(),e.geometry=Ce(s).geometry,o=n.size>0};s();let c=p(t,s);e.addEventListener(`removed`,c)}function He(e,t){let n=(Array.isArray(e.material)?e.material[0]:e.material)?.color;return n?n.clone().multiplyScalar(1-t):new v.Color(2236962)}var Ue=class{options;byKey=new Map;constructor(e){this.options=e}for(e,t){let n=this.options.forcedColor??He(e,this.options.darken),r=n.getHex()*2+ +!!t,i=this.byKey.get(r);return i||(i=We(n,this.options.width,t),this.byKey.set(r,i)),i}disposeUnused(e){let t=new Set(e.map(e=>e.material));for(let e of this.byKey.values())t.has(e)||e.dispose()}};function We(e,t,n){let r=new x({color:e});return r.linewidth=t,r.polygonOffset=!0,r.polygonOffsetFactor=0,r.polygonOffsetUnits=-1,n&&(r.transparent=!0),r}function Ge(e,t,n){let r=new C(e.geometry,t);return r.userData.kind=Te,r.raycast=()=>{},n&&Ye(r,e.edgeSpacing),r}const Ke=new v.Vector3,qe=new v.Vector3;function Je(e,t,n){e.geometry.boundingSphere||e.geometry.computeBoundingSphere();let r=e.geometry.boundingSphere;if(!r)return 1/0;if(t.isPerspectiveCamera){let i=t;Ke.copy(r.center).applyMatrix4(e.matrixWorld);let a=qe.setFromMatrixPosition(t.matrixWorld).distanceTo(Ke);if(a<=r.radius*e.matrixWorld.getMaxScaleOnAxis())return 1/0;let o=Math.tan(v.MathUtils.degToRad(i.fov)*.5),s=2*a*o;return s>0?n/s:1/0}if(t.isOrthographicCamera){let e=t,r=(e.top-e.bottom)/e.zoom;return r>0?n/r:1/0}return 1/0}function Ye(e,t){e.onBeforeRender=(n,r,i)=>{C.prototype.onBeforeRender.call(e,n);let a=e.material,o=t*Je(e,i,a.resolution.y);a.opacity=v.MathUtils.clamp((o-1)/3,0,1)}}function Xe(e){return e.userData?.kind===Te}function Ze(e,t){let n=[],r=0;e.traverse(e=>{if(e instanceof v.Mesh&&e.userData.id!==`floor`&&e.userData.id!==`grid`&&e.userData.kind!==`edge-overlay`){if(e.children.some(e=>e.userData?.kind===`edge-overlay`)){r++;return}if(e.geometry){if(De(e.geometry)>t.maxTriangles){e.userData.edgesSkipped=`triangle-cap`;return}n.push(e)}}});let i=Math.max(0,t.maxOverlays-r),a=n.slice(0,i);for(let e of a)delete e.userData.edgesSkipped;for(let e of n.slice(i))e.userData.edgesSkipped=`overlay-budget`;return n.length>i&&console.debug(`[edges] overlay budget reached: ${n.length} meshes want overlays, ${i} allowed — the rest fall back to the screen-space edge pass.`),a}function Qe(e,t,n,r){let i=Ce(t.segments),a=r.distanceFade&&i.segmentCount<=r.maxSegments,o=Ge(i,n.for(e,a),a);return e.add(o),Ve(o,e,t),o}const $e=new WeakMap;function Z(e){return $e.get(e)??0}function et(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}async function tt(e,t={}){let n=Ee(t),r=new Ue(n),i=Z(e),a=[],o=Ze(e,n).map(async t=>{let o=await Fe(t.geometry,n.thresholdAngle);Z(e)===i&&et(t,e)&&(t.children.some(e=>e.userData?.kind===`edge-overlay`)||a.push(Qe(t,o,r,n)))});return await Promise.all(o),r.disposeUnused(a),a}function nt(e){$e.set(e,Z(e)+1);let t=[];e.traverse(e=>{e instanceof C&&Xe(e)&&t.push(e)});let n=new Set;for(let e of t)e.geometry.dispose(),n.add(e.material),e.removeFromParent();return n.forEach(e=>e.dispose()),t.length}function rt(e){if(!(e>0)||!Number.isFinite(e))return 1;let t=10**Math.floor(Math.log10(e)),n=e/t;return(n>=5?5:n>=2?2:1)*t}function it(e={}){let{cellSize:t=1,majorEvery:n=10,cellColor:r=8947848,majorColor:i=4473924,fadeDistance:a=100,plane:o=`y`}=e,s=o===`y`?new v.Vector2(0,2):o===`z`?new v.Vector2(0,1):new v.Vector2(1,2),c=2.5,l=new v.PlaneGeometry(1,1);o===`y`?l.rotateX(-Math.PI/2):o===`x`&&l.rotateY(Math.PI/2);let u=new v.ShaderMaterial({vertexShader:`
1
+ import{a as e,c as t,d as n,f as r,g as i,h as a,l as o,m as s,p as c,r as l,s as u,t as d,u as f}from"./gpu-dispose-gTGxGTL4.js";import{n as p}from"./gpu-ownership-DcHWbATk.js";import{i as m,n as h,o as g,r as _,t as v}from"./merged-draw-CO5Ev9ia.js";import*as y from"three";import{Line2 as b}from"three/addons/lines/Line2.js";import{LineGeometry as x}from"three/addons/lines/LineGeometry.js";import{LineMaterial as S}from"three/addons/lines/LineMaterial.js";import{RoomEnvironment as C}from"three/addons/environments/RoomEnvironment.js";import{LineSegments2 as w}from"three/addons/lines/LineSegments2.js";import{LineSegmentsGeometry as T}from"three/addons/lines/LineSegmentsGeometry.js";import{CSS2DObject as E,CSS2DRenderer as D}from"three/addons/renderers/CSS2DRenderer.js";import{ViewHelper as O}from"three/addons/helpers/ViewHelper.js";import{EffectComposer as k}from"three/addons/postprocessing/EffectComposer.js";import{RenderPass as A}from"three/addons/postprocessing/RenderPass.js";import{GTAOPass as j}from"three/addons/postprocessing/GTAOPass.js";import{SMAAPass as M}from"three/addons/postprocessing/SMAAPass.js";import{OutputPass as ee}from"three/addons/postprocessing/OutputPass.js";import{FullScreenQuad as te,Pass as N}from"three/addons/postprocessing/Pass.js";import{OrbitControls as P}from"three/addons/controls/OrbitControls.js";import{HDRLoader as ne}from"three/addons/loaders/HDRLoader.js";const re=[`technical`,`studio`,`showcase`,`arctic`,`xray`,`lineart`,`wireframe`],ie=`compute`,ae=`user`,F=`app:`;function I(e){return`${F}${e}`}function L(e){return typeof e!=`string`||!e.startsWith(F)?null:e.slice(4)||null}function R(e){let t=e.userData?.source;return t===`user`||L(t)!==null}function oe(e,t){return t===void 0?R(e):e.userData?.source===I(t)}const z=`selvaReflectionEnvironment`;function se(e,t,n){let r=new y.PMREMGenerator(t),i=new C,a=r.fromScene(i,.04).texture;i.dispose(),r.dispose(),ce(e,a,n)}function ce(e,t,n){let r={texture:t,rotation:n.clone()};e.userData[z]=r,V(e,e)}function B(e){e.userData[z]?.texture.dispose(),delete e.userData[z]}function V(e,t){let n=t.userData[z];n&&e.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,r=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of r){if(!(e instanceof y.MeshStandardMaterial)||e.envMap&&e.envMap!==n.texture)continue;let t=e.metalness>.5?n.texture:null;e.envMap!==t&&(e.envMap=t,e.envMapRotation.copy(n.rotation),e.needsUpdate=!0)}})}function H(e){let t=e.clone().normalize(),n=new y.Vector3(0,0,1),r=new y.Vector3(0,1,0),i=Math.abs(t.dot(n))>.9?r:n,a=new y.Vector3().crossVectors(i,t).normalize();return{up:t,forward:new y.Vector3().crossVectors(t,a).normalize(),right:a}}function le(e,t){let{forward:n,right:r,up:i}=H(e);return n.clone().multiplyScalar(-1).add(r.clone().multiplyScalar(-1)).add(i).normalize().multiplyScalar(t)}function ue(e,t,n){let{forward:r,right:i,up:a}=H(e);return i.clone().multiplyScalar(t).add(r.clone().multiplyScalar(t)).add(a.clone().multiplyScalar(n))}function de(e){let t=e.clone().normalize(),n=new y.Vector3(0,1,0);if(t.dot(n)>.9999)return new y.Euler;if(t.dot(n)<-.9999)return new y.Euler(Math.PI,0,0);let r=new y.Quaternion().setFromUnitVectors(n,t);return new y.Euler().setFromQuaternion(r)}function fe(e){let t=Math.abs(e.x),n=Math.abs(e.y),r=Math.abs(e.z);return t>=n&&t>=r?`x`:n>=r?`y`:`z`}const U={HUGE_THRESHOLD:1e4,LARGE_THRESHOLD:1e3,SCALE_RATIO_THRESHOLD:100,NEAR_PLANE_FACTOR:{TINY:1e-4,SMALL:.001,NORMAL:.01},FAR_PLANE_FACTOR:{HUGE:100,LARGE:50,NORMAL:20},INITIAL_DISTANCE_MULTIPLIER:4};function pe(t,n,r,i,a){if(ye(t,_e(n)),n.length===0)return;n.forEach(e=>{t.add(e),V(e,t)});let o=e(n),s=o.getCenter(new y.Vector3),c=o.getSize(new y.Vector3),l=Math.max(c.x,c.y,c.z);if(l/Math.min(c.x||1,c.y||1,c.z||1)>U.SCALE_RATIO_THRESHOLD||l>U.HUGE_THRESHOLD?(r.near=l*U.NEAR_PLANE_FACTOR.TINY,r.far=l*U.FAR_PLANE_FACTOR.HUGE):l>U.LARGE_THRESHOLD?(r.near=l*U.NEAR_PLANE_FACTOR.SMALL,r.far=l*U.FAR_PLANE_FACTOR.LARGE):(r.near=Math.max(.01,l*U.NEAR_PLANE_FACTOR.NORMAL),r.far=Math.max(2e3,l*U.FAR_PLANE_FACTOR.NORMAL)),r.updateProjectionMatrix(),!a){let e=l*U.INITIAL_DISTANCE_MULTIPLIER;r.position.copy(s).add(le(r.up,e)),i.target.copy(s),i.update()}}const me=/* @__PURE__ */ new Set([`grid`,`floor`,`label-layer`,`measure`]);function he(e){return typeof e.userData.id==`string`&&me.has(e.userData.id)}function ge(e){let t=e;for(;t;){if(he(t))return!0;t=t.parent}return!1}function W(e){e.updateMatrixWorld(!0);let t=new y.Box3;return e.traverse(e=>{let n=e;e.visible&&!ge(e)&&n.geometry&&t.expandByObject(e)}),t}function _e(e){let t=/* @__PURE__ */ new Set;for(let n of e)n.traverse(e=>{let n=e.geometry,r=n&&p(n);r&&t.add(r)});return t}const ve=/* @__PURE__ */ new Set([`floor`,`grid`,`label-layer`]);function ye(e,t=/* @__PURE__ */ new Set){[...e.children].forEach(e=>{ve.has(e.userData.id)||R(e)||(d(e,{keepUploaded:t}),e.removeFromParent())})}function be(e){let{up:t,forward:n,right:r}=H(e),i=n.clone().negate(),a=r.clone();return{top:t.clone(),bottom:t.clone().negate(),front:i.clone(),back:i.clone().negate(),right:a.clone(),left:a.clone().negate(),iso:i.clone().multiplyScalar(1.2).add(a.clone()).add(t.clone()).normalize()}}function xe(e){let{scene:t,perspective:n,controls:r,onActiveCameraChange:i}=e,a=(e.up??n.up).clone().normalize(),o=be(a),s=new y.OrthographicCamera(-1,1,1,-1,n.near,n.far);s.up.copy(a);let c=`perspective`,l=n.aspect,u=()=>c===`perspective`?n:s,d=null,f=()=>{d?.cancel(),d=null},p=()=>{let e=(c===`orthographic`?s:n).position.distanceTo(r.target)*Math.tan(n.fov*Math.PI/360),t=e*l;s.left=-t,s.right=t,s.top=e,s.bottom=-e,s.near=n.near,s.far=n.far,s.updateProjectionMatrix()},m=e=>{if(e!==c){if(f(),e===`orthographic`)s.position.copy(n.position),s.up.copy(n.up),s.lookAt(r.target),s.zoom=1,p();else{let e=(s.top-s.bottom)/(2*s.zoom)/Math.tan(n.fov*Math.PI/360),t=s.position.clone().sub(r.target);t.lengthSq()<1e-12&&t.copy(a),t.normalize(),n.position.copy(r.target).add(t.multiplyScalar(e))}c=e,r.object=u(),r.update(),i(u())}},h=(e,t,i,o)=>{let l=n.fov*(Math.PI/180),m=t/(2*Math.tan(l/2))*1.5,h=Se(i,a),g=e.clone().add(h.clone().multiplyScalar(m)),_=u();c===`orthographic`&&(s.zoom=1),f(),o?d=we(_,r,g,e,()=>{c===`orthographic`&&p()}):(_.position.copy(g),r.target.copy(e),c===`orthographic`&&p(),r.update())},g=(e,n=!0)=>{let i=W(t),a=i.isEmpty()?r.target.clone():i.getCenter(new y.Vector3),o=i.isEmpty()?new y.Vector3(1,1,1):i.getSize(new y.Vector3),s=Math.max(o.x,o.y,o.z)||1;h(a,s,e,n)};return{getActiveCamera:u,getProjection:()=>c,setProjection:m,toggleProjection:()=>(m(c===`perspective`?`orthographic`:`perspective`),c),setView:(e,t=!0)=>{g(o[e],t)},setViewDirection:g,frameBounds:(e,t=!0)=>{if(e.isEmpty())return;let n=e.getCenter(new y.Vector3),i=e.getSize(new y.Vector3),a=Math.max(i.x,i.y,i.z)||1,s=u().position.clone().sub(r.target);s.lengthSq()<1e-12&&s.copy(o.iso),h(n,a,s.normalize(),t)},setRotateEnabled:e=>{r.enableRotate=e},isRotateEnabled:()=>r.enableRotate,updateAspect:(e,t)=>{l=t===0?l:e/t,c===`orthographic`&&p()},dispose:f}}function Se(e,t){let{up:n,forward:r}=H(t),i=e.clone().normalize();if(Math.abs(i.dot(n))<.9999)return e;let a=r.clone().negate(),o=.5*Math.PI/180;return i.multiplyScalar(Math.cos(o)).add(a.multiplyScalar(Math.sin(o))).normalize()}const Ce=e=>1-(1-e)**3;function we(e,t,n,r,i,a=250){let o=e.position.clone(),s=t.target.clone(),c=performance.now(),l=null,u=()=>{l=null;let d=Ce(Math.min((performance.now()-c)/a,1));e.position.lerpVectors(o,n,d),t.target.lerpVectors(s,r,d),i(),t.update(),d<1&&(l=requestAnimationFrame(u))};return l=requestAnimationFrame(u),{cancel:()=>{l!==null&&(cancelAnimationFrame(l),l=null)}}}function Te(e){let t=Math.floor(e.length/6);if(t===0)return 1/0;let n=Math.max(1,Math.ceil(t/4096)),r=[];for(let i=0;i<t;i+=n){let t=i*6,n=Math.hypot(e[t+3]-e[t],e[t+4]-e[t+1],e[t+5]-e[t+2]);n>0&&r.push(n)}return r.length===0?1/0:(r.sort((e,t)=>e-t),r[Math.min(r.length-1,Math.floor(r.length*.15))])}function Ee(e){let t=new T;return t.setPositions(e),{geometry:t,segmentCount:e.length/6,edgeSpacing:Te(e)}}function G(e,t,n){let r=1e4,i=67108864,a=Math.cos(Math.PI/180*n),o=e.length/3;if(o>=i)throw Error(`extractEdgeSegments: ${o} vertices exceeds 2^26 limit`);let s=new Float64Array(o),c=new Float64Array(o),l=new Float64Array(o);for(let t=0;t<o;t++)s[t]=Math.round(e[3*t]*r),c[t]=Math.round(e[3*t+1]*r),l[t]=Math.round(e[3*t+2]*r);let u=16;for(;u<o*2;)u<<=1;let d=u-1,f=new Int32Array(u).fill(-1),p=new Int32Array(o);for(let e=0;e<o;e++){let t=(Math.imul(s[e]|0,73856093)^Math.imul(c[e]|0,19349663)^Math.imul(l[e]|0,83492791))&d;for(;;){let n=f[t];if(n===-1){f[t]=e,p[e]=e;break}if(s[n]===s[e]&&c[n]===c[e]&&l[n]===l[e]){p[e]=n;break}t=t+1&d}}let m=/* @__PURE__ */ new Float32Array(6144),h=0,g=/* @__PURE__ */ new Uint32Array(1024),_=(t,n,r)=>{if(h+6>m.length){let e=new Float32Array(m.length*2);e.set(m),m=e;let t=new Uint32Array(m.length/6);t.set(g),g=t}g[h/6]=r,m[h++]=e[3*t],m[h++]=e[3*t+1],m[h++]=e[3*t+2],m[h++]=e[3*n],m[h++]=e[3*n+1],m[h++]=e[3*n+2]},v=/* @__PURE__ */ new Map,y=[],b=[],x=[],S=[],C=(t?t.length:o)/3;for(let n=0;n<C;n++){let r=t?t[3*n]:3*n,o=t?t[3*n+1]:3*n+1,s=t?t[3*n+2]:3*n+2,c=p[r],l=p[o],u=p[s];if(c===l||l===u||u===c)continue;let d=e[3*s]-e[3*o],f=e[3*s+1]-e[3*o+1],m=e[3*s+2]-e[3*o+2],h=e[3*r]-e[3*o],g=e[3*r+1]-e[3*o+1],C=e[3*r+2]-e[3*o+2],w=f*C-m*g,T=m*h-d*C,E=d*g-f*h,D=w*w+T*T+E*E;if(D>0){let e=1/Math.sqrt(D);w*=e,T*=e,E*=e}else w=0,T=0,E=0;for(let e=0;e<3;e++){let t,d,f,p;e===0?(t=r,d=o,f=c,p=l):e===1?(t=o,d=s,f=l,p=u):(t=s,d=r,f=u,p=c);let m=p*i+f,h=v.get(m);if(h!==void 0&&h!==-1)w*x[3*h]+T*x[3*h+1]+E*x[3*h+2]<=a&&_(t,d,n),v.set(m,-1);else{let e=f*i+p;if(!v.has(e)){let r=y.length;v.set(e,r),y.push(t),b.push(d),x.push(w,T,E),S.push(n)}}}}for(let e of v.values())e!==-1&&_(y[e],b[e],S[e]);return{segments:m.slice(0,h),faces:g.slice(0,h/6)}}function De(){return[`const extract = ${G.toString()};`,`self.onmessage = (event) => {`,` const { id, positions, index, thresholdAngle } = event.data;`,` try {`,` const { segments, faces } = extract(positions, index, thresholdAngle);`,` self.postMessage({ id, segments, faces }, [segments.buffer, faces.buffer]);`,` } catch (error) {`,` self.postMessage({ id, error: String((error && error.message) || error) });`,` }`,`};`].join(`
2
+ `)}const Oe=`edge-overlay`;function ke(e){return{forcedColor:e.color==null?null:new y.Color(e.color),darken:y.MathUtils.clamp(e.darken??.75,0,1),width:e.width??1.5,thresholdAngle:e.thresholdAngle??44,distanceFade:e.distanceFade??!0,maxTriangles:e.maxTriangles??4e6,maxSegments:e.maxSegments??2e6,maxOverlays:e.maxOverlays??1500}}function Ae(e){let t=e.getAttribute(`position`);return t?(e.index?e.index.count:t.count)/3:0}function je(e){let t=e.getAttribute(`position`);if(!t||t.isInterleavedBufferAttribute||t.itemSize!==3||!(t.array instanceof Float32Array)||t.count>=67108864)return null;let n=e.index;return n&&!(n.array instanceof Uint32Array)&&!(n.array instanceof Uint16Array)?null:{positions:t.array,index:n?n.array:null,version:`${t.version}:${n?.version??0}`}}function Me(e,t){let n=4096,r=2166136261,i=e=>{r^=e,r=Math.imul(r,16777619)},a=new Uint32Array(e.positions.buffer,e.positions.byteOffset,e.positions.length),o=Math.min(n,a.length);for(let e=0;e<o;e++)i(a[e]);for(let e=Math.max(o,a.length-n);e<a.length;e++)i(a[e]);let s=0;if(e.index){s=e.index.length;let t=Math.min(n,s);for(let n=0;n<t;n++)i(e.index[n]);for(let r=Math.max(t,s-n);r<s;r++)i(e.index[r])}return`${t}:${e.positions.length}:${s}:${r>>>0}`}function Ne(e,t){let n=new y.EdgesGeometry(e,t),r=n.attributes.position?n.attributes.position.array:/* @__PURE__ */ new Float32Array;return n.dispose(),{segments:r,faces:null}}const K=/* @__PURE__ */ new WeakMap,q={};function Pe(e,t){let n=K.get(e.positions)?.get(e.index??q)?.get(t);return n?.version===e.version?n.edges:void 0}function Fe(e,t,n){let r=K.get(e.positions);r||K.set(e.positions,r=/* @__PURE__ */ new WeakMap);let i=r.get(e.index??q);return i||r.set(e.index??q,i=/* @__PURE__ */ new Map),i.set(t,{version:e.version,edges:n}),n}function Ie(e,t){let n=je(e);return n?Pe(n,t)??Fe(n,t,G(n.positions,n.index,t)):Ne(e,t)}let J;const Y=/* @__PURE__ */ new Map;let Le=1;function Re(){if(J!==void 0)return J;if(typeof Worker>`u`||typeof Blob>`u`||typeof URL>`u`||typeof URL.createObjectURL!=`function`)return J=null,null;try{let e=URL.createObjectURL(new Blob([De()],{type:`text/javascript`})),t=new Worker(e);t.onmessage=e=>{let{id:t,segments:n,faces:r,error:i}=e.data,a=Y.get(t);a&&(Y.delete(t),n?a.resolve({segments:n,faces:r??null}):a.reject(Error(i??`edge extraction failed in worker`)))},t.onerror=()=>{for(let e of Y.values())e.reject(/* @__PURE__ */ Error(`edge extraction worker crashed`));Y.clear(),t.terminate(),J=null},J=t}catch{J=null}return J}function ze(e,t,n){return new Promise((r,i)=>{let a=Le++;Y.set(a,{resolve:r,reject:i});let o=t.positions.slice(),s=t.index?t.index.slice():null,c=[o.buffer];s&&c.push(s.buffer),e.postMessage({id:a,positions:o,index:s,thresholdAngle:n},c)})}const X=/* @__PURE__ */ new Map;function Be(e,t){let n=je(e);if(!n||Ae(e)<25e3)return Promise.resolve(Ie(e,t));let r=Pe(n,t);if(r)return Promise.resolve(r);let i=Me(n,t),a=X.get(i);if(a)return a;let o=Re();if(!o)return Promise.resolve(Ie(e,t));let s=ze(o,n,t).catch(()=>G(n.positions,n.index,t)).then(e=>Fe(n,t,e)).finally(()=>{X.delete(i)});return X.set(i,s),s}function Z(e){let t=e.userData?.members;return Array.isArray(t)&&t.length>0?t:null}function Ve(e){let t=Z(e.object);if(!t||e.faceIndex==null)return null;let n=e.faceIndex*3,r=0,i=t.length-1;for(;r<=i;){let e=r+i>>1,a=t[e];if(a.indexStart==null||a.indexCount==null)return null;if(n<a.indexStart)i=e-1;else if(n>=a.indexStart+a.indexCount)r=e+1;else return{member:a,index:e}}return null}function He(e,t){let n=new y.Box3,r=e.geometry.getIndex(),i=e.geometry.getAttribute(`position`);if(!r||!i||t.indexStart==null||t.indexCount==null)return n;e.updateMatrixWorld();let a=new y.Vector3,o=Math.min(t.indexStart+t.indexCount,r.count);for(let s=t.indexStart;s<o;s++)a.fromBufferAttribute(i,r.getX(s)).applyMatrix4(e.matrixWorld),n.expandByPoint(a);return n}function Ue(e,t,n){let r=Z(e)?.indexOf(t)??-1;return r<0||t.indexStart==null||t.indexCount==null?()=>{}:(g(e,r,n),()=>v(e))}function We(e,t){let n=Z(e);if(!n)return null;let r=[];for(let e of n){if(e.indexStart==null)return null;r.push(e.indexStart)}let i=new Uint32Array(t.length);for(let e=0;e<t.length;e++){let n=t[e]*3,a=0,o=r.length-1;for(;a<o;){let e=a+o+1>>1;r[e]<=n?a=e:o=e-1}i[e]=a}return i}function Ge(e,t,n){let r=0;for(let e=0;e<t.length;e++)n.has(t[e])||r++;let i=new Float32Array(r*6),a=0;for(let r=0;r<t.length;r++)n.has(t[r])||(i.set(e.subarray(r*6,r*6+6),a),a+=6);return i}function Ke(e,t,n){let{segments:r,faces:i}=n;if(!i||!Z(t))return;let a,o=!1,s=()=>{let n=_(t);if(n.size===0&&!o||(a??=We(t,i),!a))return;let s=n.size===0?r:Ge(r,a,n);e.geometry.dispose(),e.geometry=Ee(s).geometry,o=n.size>0};s();let c=m(t,s);e.addEventListener(`removed`,c)}function qe(e,t){let n=(Array.isArray(e.material)?e.material[0]:e.material)?.color;return n?n.clone().multiplyScalar(1-t):new y.Color(2236962)}var Je=class{options;byKey=/* @__PURE__ */ new Map;constructor(e){this.options=e}for(e,t){let n=this.options.forcedColor??qe(e,this.options.darken),r=n.getHex()*2+ +!!t,i=this.byKey.get(r);return i||(i=Ye(n,this.options.width,t),this.byKey.set(r,i)),i}disposeUnused(e){let t=new Set(e.map(e=>e.material));for(let e of this.byKey.values())t.has(e)||e.dispose()}};function Ye(e,t,n){let r=new S({color:e});return r.linewidth=t,r.polygonOffset=!0,r.polygonOffsetFactor=0,r.polygonOffsetUnits=-1,n&&(r.transparent=!0),r}function Xe(e,t,n){let r=new w(e.geometry,t);return r.userData.kind=Oe,r.raycast=()=>{},n&&et(r,e.edgeSpacing),r}const Ze=new y.Vector3,Qe=new y.Vector3;function $e(e,t,n){e.geometry.boundingSphere||e.geometry.computeBoundingSphere();let r=e.geometry.boundingSphere;if(!r)return 1/0;if(t.isPerspectiveCamera){let i=t;Ze.copy(r.center).applyMatrix4(e.matrixWorld);let a=Qe.setFromMatrixPosition(t.matrixWorld).distanceTo(Ze);if(a<=r.radius*e.matrixWorld.getMaxScaleOnAxis())return 1/0;let o=Math.tan(y.MathUtils.degToRad(i.fov)*.5),s=2*a*o;return s>0?n/s:1/0}if(t.isOrthographicCamera){let e=t,r=(e.top-e.bottom)/e.zoom;return r>0?n/r:1/0}return 1/0}function et(e,t){e.onBeforeRender=(n,r,i)=>{w.prototype.onBeforeRender.call(e,n);let a=e.material,o=t*$e(e,i,a.resolution.y);a.opacity=y.MathUtils.clamp((o-1)/3,0,1)}}function tt(e){return e.userData?.kind===Oe}function nt(e,t){let n=[],r=0;e.traverse(e=>{e instanceof y.Mesh&&e.userData.id!==`floor`&&e.userData.id!==`grid`&&e.userData.kind!==`edge-overlay`&&(e.children.some(e=>e.userData?.kind===`edge-overlay`)?r++:e.geometry&&(Ae(e.geometry)>t.maxTriangles?e.userData.edgesSkipped=`triangle-cap`:n.push(e)))});let i=Math.max(0,t.maxOverlays-r),a=n.slice(0,i);for(let e of a)delete e.userData.edgesSkipped;for(let e of n.slice(i))e.userData.edgesSkipped=`overlay-budget`;return n.length>i&&console.debug(`[edges] overlay budget reached: ${n.length} meshes want overlays, ${i} allowed — the rest fall back to the screen-space edge pass.`),a}function rt(e,t,n,r){let i=Ee(t.segments),a=r.distanceFade&&i.segmentCount<=r.maxSegments,o=Xe(i,n.for(e,a),a);return e.add(o),Ke(o,e,t),o}const it=/* @__PURE__ */ new WeakMap;function at(e){return it.get(e)??0}function ot(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}async function st(e,t={}){let n=ke(t),r=new Je(n),i=at(e),a=[],o=nt(e,n).map(async t=>{let o=await Be(t.geometry,n.thresholdAngle);at(e)===i&&ot(t,e)&&(t.children.some(e=>e.userData?.kind===`edge-overlay`)||a.push(rt(t,o,r,n)))});return await Promise.all(o),r.disposeUnused(a),a}function ct(e){it.set(e,at(e)+1);let t=[];e.traverse(e=>{e instanceof w&&tt(e)&&t.push(e)});let n=/* @__PURE__ */ new Set;for(let e of t)e.geometry.dispose(),n.add(e.material),e.removeFromParent();return n.forEach(e=>e.dispose()),t.length}function lt(e){if(!(e>0)||!Number.isFinite(e))return 1;let t=10**Math.floor(Math.log10(e)),n=e/t;return(n>=5?5:n>=2?2:1)*t}function ut(e={}){let{cellSize:t=1,majorEvery:n=10,cellColor:r=8947848,majorColor:i=4473924,fadeDistance:a=100,plane:o=`y`}=e,s=o===`y`?new y.Vector2(0,2):o===`z`?new y.Vector2(0,1):new y.Vector2(1,2),c=2.5,l=new y.PlaneGeometry(1,1);o===`y`?l.rotateX(-Math.PI/2):o===`x`&&l.rotateY(Math.PI/2);let u=new y.ShaderMaterial({vertexShader:`
3
3
  varying vec3 vWorldPos;
4
4
  void main() {
5
5
  vec4 world = modelMatrix * vec4(position, 1.0);
@@ -50,7 +50,7 @@ import{a as e,c as t,d as n,f as r,g as i,h as a,l as o,m as s,p as c,r as l,s a
50
50
  if (alpha < 0.001) discard;
51
51
  gl_FragColor = vec4(color, alpha);
52
52
  }
53
- `,transparent:!0,depthWrite:!1,side:v.DoubleSide,uniforms:{uAxes:{value:s},uCell:{value:t},uMajor:{value:n},uCellColor:{value:new v.Color(r)},uMajorColor:{value:new v.Color(i)},uCenter:{value:new v.Vector3},uFade:{value:a}}}),d=new v.Mesh(l,u);d.name=`grid`,d.userData.id=`grid`,d.renderOrder=-1;let f=a,p=a*c,m=new v.Vector3;return{object:d,update:e=>{o===`y`?(d.position.set(e.x,0,e.z),m.set(e.x,0,e.z)):o===`z`?(d.position.set(e.x,e.y,0),m.set(e.x,e.y,0)):(d.position.set(0,e.y,e.z),m.set(0,e.y,e.z)),u.uniforms.uCenter.value.copy(m),d.scale.setScalar(p)},fitToContent:e=>{if(e.isEmpty())return;let t=e.getSize(new v.Vector3),n=(e,t)=>t===0?e.x:t===1?e.y:e.z,r=Math.max(n(t,s.x),n(t,s.y));r>0&&Number.isFinite(r)&&(u.uniforms.uCell.value=rt(r/20),f=r*2,u.uniforms.uFade.value=f,p=f*c)},setVisible:e=>{d.visible=e},dispose:()=>{d.removeFromParent(),l.dispose(),u.dispose()}}}function at(e,t){let n=new E,r=n.domElement;r.style.position=`absolute`,r.style.top=`0`,r.style.left=`0`,r.style.overflow=`hidden`,r.style.pointerEvents=`none`,r.style.zIndex=`30`,getComputedStyle(e).position===`static`&&(e.style.position=`relative`),e.appendChild(r);let i={width:e.clientWidth||1,height:e.clientHeight||1};n.setSize(i.width,i.height);let a=new v.Group;a.name=`label-layer`,a.userData.id=`label-layer`,t.add(a);let o=new Set;return{addLabel:(e,t,n)=>{let r=document.createElement(`div`);r.textContent=e,n?r.className=n:Object.assign(r.style,{padding:`2px 6px`,borderRadius:`4px`,background:`rgba(20, 20, 20, 0.78)`,color:`#fff`,font:`12px/1.3 system-ui, sans-serif`,whiteSpace:`pre`,textAlign:`center`,userSelect:`none`}),r.style.pointerEvents=`none`;let i=new T(r);return i.position.copy(t),a.add(i),o.add(i),{object:i,setPosition:e=>i.position.copy(e),setText:e=>{r.textContent=e},remove:()=>{i.removeFromParent(),r.remove(),o.delete(i)}}},render:(e,t)=>n.render(e,t),setSize:(e,t)=>n.setSize(e,t),dispose:()=>{o.forEach(e=>{e.removeFromParent(),e.element.remove()}),o.clear(),a.removeFromParent(),r.remove()}}}const ot=.015,st={Millimeters:{metersPerUnit:1/1e3,suffix:`mm`},Centimeters:{metersPerUnit:1/100,suffix:`cm`},Meters:{metersPerUnit:1,suffix:`m`},Inches:{metersPerUnit:1/39.37,suffix:`in`},Feet:{metersPerUnit:1/3.28084,suffix:`ft`}};function ct(e){let t=e&&st[e]||st.Meters;return e=>`${(e/t.metersPerUnit).toPrecision(3)} ${t.suffix}`}function lt(e,t){if(e.isOrthographicCamera){let t=e;return Math.abs(t.top-t.bottom)/(t.zoom||1)*ot}return((t?e.position.distanceTo(t):e.position.length())||1)*ot}function ut(e){let t=e.object;if(t instanceof v.Mesh)return e.face?[e.face.a,e.face.b,e.face.c]:null;if(t instanceof v.Points)return e.index==null?null:[e.index];if(t instanceof v.Line){if(e.index==null)return null;let n=t.geometry.index;return n?e.index+1>=n.count?null:[n.getX(e.index),n.getX(e.index+1)]:[e.index,e.index+1]}return null}function dt(e,t,n,r){let i=e.point.clone(),a=e.object,o=ut(e);if(!o||!a.geometry)return i;let s=a.geometry.attributes.position;if(!s)return i;let c=e=>{let r=e.clone().project(t);return new v.Vector2((r.x+1)/2*n.width,(1-r.y)/2*n.height)},l=c(i),u=i,d=r;for(let e of o){if(e>=s.count)continue;let t=new v.Vector3().fromBufferAttribute(s,e).applyMatrix4(a.matrixWorld),n=c(t).distanceTo(l);n<d&&(d=n,u=t)}return u}function ft(e){let{canvas:t,scene:n,getActiveCamera:r,getViewTarget:i,labelLayer:a,options:o={}}=e,s=o.snapPixels??12,c=new v.Color(o.color??16763904),l=ct(o.displayUnit),u=o.format??((e,t)=>`${l(e)}\nΔx ${l(t.x)} Δy ${l(t.y)} Δz ${l(t.z)}`),d=new v.Raycaster,f=new v.Vector2,p=!1,m=[],h=[],g=null,_=null,S=new v.PointsMaterial({color:c,size:8,sizeAttenuation:!1,depthTest:!1}),C=new v.PointsMaterial({color:c,size:11,sizeAttenuation:!1,depthTest:!1,transparent:!0,opacity:.5}),w=null,T=e=>{if(!e){w&&(w.visible=!1);return}if(!w){let e=new v.BufferGeometry;e.setAttribute(`position`,new v.Float32BufferAttribute([0,0,0],3)),w=new v.Points(e,C),w.renderOrder=1e3,w.userData.id=`measure`,w.raycast=()=>{},n.add(w)}w.position.copy(e),w.visible=!0},E=e=>{let t=new v.BufferGeometry;t.setAttribute(`position`,new v.Float32BufferAttribute([e.x,e.y,e.z],3));let r=new v.Points(t,S);return r.renderOrder=999,r.userData.id=`measure`,r.raycast=()=>{},n.add(r),r},D=()=>{m.length=0,h.forEach(e=>{e.geometry.dispose(),e.removeFromParent()}),h.length=0,g&&=(g.geometry.dispose(),g.material.dispose(),g.removeFromParent(),null),_?.remove(),_=null},O=()=>{if(m.length!==2)return;let[e,t]=m,r=new b;r.setPositions([e.x,e.y,e.z,t.x,t.y,t.z]);let i=new x({color:c});i.linewidth=2,i.depthTest=!1,g=new y(r,i),g.renderOrder=998,g.userData.id=`measure`,g.raycast=()=>{},n.add(g);let s=e.clone().add(t).multiplyScalar(.5),l=new v.Vector3(Math.abs(t.x-e.x),Math.abs(t.y-e.y),Math.abs(t.z-e.z));_=a.addLabel(u(e.distanceTo(t),l),s,o.labelClassName)},k=e=>{let a=t.getBoundingClientRect();f.x=(e.clientX-a.left)/a.width*2-1,f.y=-((e.clientY-a.top)/a.height)*2+1;let o=r();d.setFromCamera(f,o);let c=lt(o,i?.());d.params.Line.threshold=c,d.params.Points.threshold=c;let l=d.intersectObjects(n.children,!0).filter(e=>e.object.userData.id!==`measure`&&e.object.userData.id!==`grid`);return l.length===0?null:dt(l[0],o,{width:a.width,height:a.height},s)},A=null,j=0,M=()=>{j&&=(cancelAnimationFrame(j),0),A=null};return{setEnabled:e=>{p=e,e||(M(),D(),T(null))},isEnabled:()=>p,handleClick:e=>{if(!p)return!1;m.length===2&&D();let t=k(e);return t===null||(m.push(t),h.push(E(t)),m.length===2&&O(),!0)},handleMove:e=>{p&&(A=e,!j&&(j=requestAnimationFrame(()=>{j=0;let e=A;A=null,p&&e&&T(k(e))})))},clear:D,dispose:()=>{M(),D(),w&&=(w.geometry.dispose(),w.removeFromParent(),null),S.dispose(),C.dispose()}}}const pt=[];function mt({camera:e,scene:t,groundNormals:n=()=>pt}){let r=e.near,i=e.near,a=ht();return{update:()=>{e.near!==i&&(r=e.near);let o=a.measure(t,e),s=r;if(o!==null){let t=o;for(let r of n())t=Math.min(t,Math.abs(e.position.dot(r)));s=v.MathUtils.clamp(t*.5,r,e.far*.01)}Math.abs(s-i)>i*.05&&(e.near=s,e.updateProjectionMatrix(),i=s)}}}function ht(){let e=new WeakMap,t=new v.Frustum,n=new v.Matrix4,r=new v.Vector3,i=new v.Box3,a=new Float64Array(20),o=new Float64Array(20),s=new Float32Array(6),c=new Float64Array(21),l=new Float64Array(21),u=1/0,d=!1,f=(t,n)=>{let r=n.getAttribute(`position`),i=n.getIndex(),a=e.get(n);if(a&&a.position===r&&a.positionVersion===_t(r)&&a.index===i&&a.indexVersion===(i?.version??-1))return a;let o={...yt(r,i,vt(t)),position:r,positionVersion:_t(r),index:i,indexVersion:i?.version??-1};return e.set(n,o),o},p=(e,t,n)=>{let{position:r,index:i}=e,a=i?.array,o=1/0;for(let i=e.ranges[t*2];i<e.ranges[t*2+1];i++){for(let e=0;e<3;e++){let t=a?a[i*3+e]:i*3+e;c[e*3]=r.getX(t),c[e*3+1]=r.getY(t),c[e*3+2]=r.getZ(t)}let e=3;for(let t=0;t<16&&e>0;t+=4){let r=n[t],i=n[t+1],a=n[t+2],o=n[t+3],s=0;for(let t=0;t<e;t++){let n=(t+1)%e,u=c[t*3],d=c[t*3+1],f=c[t*3+2],p=c[n*3],m=c[n*3+1],h=c[n*3+2],g=r*u+i*d+a*f+o,_=r*p+i*m+a*h+o;if(g>=0&&(l[s*3]=u,l[s*3+1]=d,l[s*3+2]=f,s++),g>=0!=_>=0){let e=g/(g-_);l[s*3]=u+(p-u)*e,l[s*3+1]=d+(m-d)*e,l[s*3+2]=f+(h-f)*e,s++}}[c,l]=[l,c],e=s}for(let t=0;t<e;t++){let e=n[16]*c[t*3]+n[17]*c[t*3+1]+n[18]*c[t*3+2]+n[19];e<o&&(o=e)}}return o},m=e=>{let t=e.elements;for(let e=0;e<20;e+=4){let n=a[e],r=a[e+1],i=a[e+2];o[e]=t[0]*n+t[1]*r+t[2]*i,o[e+1]=t[4]*n+t[5]*r+t[6]*i,o[e+2]=t[8]*n+t[9]*r+t[10]*i,o[e+3]=n*t[12]+r*t[13]+i*t[14]+a[e+3]}return o},h=(e,t,n)=>{outer:for(let r=0;r<e.length;r+=6){let i=e[r],a=e[r+1],o=e[r+2],s=e[r+3],c=e[r+4],l=e[r+5];for(let e=0;e<16;e+=4){let n=t[e],r=t[e+1],u=t[e+2];if(n*(n>0?s:i)+r*(r>0?c:a)+u*(u>0?l:o)+t[e+3]<0)continue outer}let d=t[16],f=t[17],m=t[18],h=d*(d>0?i:s)+f*(f>0?a:c)+m*(m>0?o:l)+t[19];h>=u||(u=n?Math.min(u,p(n,r/6,t)):h)}},g=e=>{let t=e.geometry;if(!t?.getAttribute?.(`position`))return;if(d=!0,gt(e)){let n=f(e,t);h(n.boxes,m(e.matrixWorld),n);return}let n=e;n.isInstancedMesh?(n.boundingBox||n.computeBoundingBox(),i.copy(n.boundingBox)):(t.boundingBox||t.computeBoundingBox(),i.copy(t.boundingBox)),!i.isEmpty()&&(s[0]=i.min.x,s[1]=i.min.y,s[2]=i.min.z,s[3]=i.max.x,s[4]=i.max.y,s[5]=i.max.z,h(s,m(e.matrixWorld)))},_=e=>{if(e.visible&&!pe(e)&&e.userData.kind!==`edge-overlay`){g(e);for(let t of e.children)_(t)}};return{measure:(e,i)=>{e.updateMatrixWorld(),i.updateMatrixWorld(),n.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),t.setFromProjectionMatrix(n);for(let e=0;e<4;e++){let n=t.planes[e];a[e*4]=n.normal.x,a[e*4+1]=n.normal.y,a[e*4+2]=n.normal.z,a[e*4+3]=n.constant}i.getWorldDirection(r),a[16]=r.x,a[17]=r.y,a[18]=r.z,a[19]=-r.dot(i.position),u=1/0,d=!1;for(let t of e.children)_(t);return d?u:null}}}function gt(e){let t=e;if(!t.isMesh||t.isInstancedMesh||t.isSkinnedMesh)return!1;let n=t.geometry;return!n.isInstancedBufferGeometry&&Object.keys(n.morphAttributes).length===0}function _t(e){return e.isInterleavedBufferAttribute?e.data.version:e.version}function vt(e){let t=[];for(let n of X(e)??[])n.indexStart!==void 0&&t.push(n.indexStart/3);return t.sort((e,t)=>e-t)}function yt(e,t,n){let r=Math.floor((t?t.count:e.count)/3),i=[],a=0;for(let e=0;e<r;){for(;a<n.length&&n[a]<=e;)a++;let t=Math.min(r,e+256,n[a]??r);i.push(e,t),e=t}let o=i.length/2,s=new Float32Array(o*6),c=!e.isInterleavedBufferAttribute,l=e.array,u=c&&e.itemSize===3&&!e.normalized,d=t?.array;for(let t=0;t<o;t++){let n=1/0,r=1/0,a=1/0,o=-1/0,c=-1/0,f=-1/0,p=i[t*2+1]*3;for(let s=i[t*2]*3;s<p;s++){let t=d?d[s]:s,i=u?l[t*3]:e.getX(t),p=u?l[t*3+1]:e.getY(t),m=u?l[t*3+2]:e.getZ(t);i<n&&(n=i),p<r&&(r=p),m<a&&(a=m),i>o&&(o=i),p>c&&(c=p),m>f&&(f=m)}let m=t*6;s[m]=n,s[m+1]=r,s[m+2]=a,s[m+3]=o,s[m+4]=c,s[m+5]=f}return{boxes:s,ranges:Uint32Array.from(i)}}function bt(){let e=[],t=null,n=()=>e.sort((e,t)=>t.priority-e.priority),r=t=>e.findIndex(e=>e.id===t),i=n=>{let i=r(n);i!==-1&&(e.splice(i,1),t===n&&(t=null))};return{register:({id:t,tool:r,priority:a=0})=>(i(t),e.push({id:t,tool:r,priority:a}),n(),()=>i(t)),unregister:i,get:t=>e[r(t)]?.tool??null,setActive:n=>{t=n;for(let t of e)t.tool.setEnabled?.(t.id===n)},getActive:()=>t,handleClick:t=>{for(let n of[...e])if(n.tool.handleClick(t))return!0;return!1},handleMove:t=>{for(let n of[...e])n.tool.handleMove?.(t)}}}function xt(e,t){let n=t.getBoundingClientRect();return{x:(e.clientX-n.left)/n.width*2-1,y:-((e.clientY-n.top)/n.height)*2+1}}function St(e){let{camera:t,domElement:n,controller:r}=e,i=new D(t,n);i.setLabels(`X`,`Y`,`Z`);let a=!0,o=new v.Raycaster,s=new v.OrthographicCamera(-2,2,2,-2,0,4);s.position.set(0,0,2),s.updateMatrixWorld();let c={posX:new v.Vector3(1,0,0),negX:new v.Vector3(-1,0,0),posY:new v.Vector3(0,1,0),negY:new v.Vector3(0,-1,0),posZ:new v.Vector3(0,0,1),negZ:new v.Vector3(0,0,-1)},l=e=>{let r=n.getBoundingClientRect(),a=r.left+n.offsetWidth-128-i.location.right,l=r.top+n.offsetHeight-128-i.location.bottom,u=new v.Vector2((e.clientX-a)/128*2-1,-((e.clientY-l)/128)*2+1);if(Math.abs(u.x)>1||Math.abs(u.y)>1)return null;i.quaternion.copy(t.quaternion).invert(),i.updateMatrixWorld(),o.setFromCamera(u,s);let d=o.intersectObjects(i.children,!1);for(let e of d){let t=e.object.userData?.type;if(typeof t==`string`&&t in c)return t}return null};return{render:e=>{if(!a)return;let t=e.autoClear;e.autoClear=!1,i.render(e),e.autoClear=t},handleClick:e=>{if(!a)return!1;let t=l(e);return t?(r.getProjection()===`orthographic`&&r.setProjection(`perspective`),r.setViewDirection(c[t],!1),!0):!1},setVisible:e=>{a=e},isVisible:()=>a,dispose:()=>i.dispose()}}function Ct(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m=!0){let h=null,g=performance.now(),_=!0,y=0,b=new v.Matrix4,x=new v.Matrix4,S=null,C=()=>{_=!0},w=e=>{e.updateMatrixWorld();let t=S!==e||!b.equals(e.matrixWorld)||!x.equals(e.projectionMatrix);return t&&(S=e,b.copy(e.matrixWorld),x.copy(e.projectionMatrix)),t},T=e.domElement,E=[`pointerdown`,`pointerup`,`wheel`];if(m)for(let e of E)T.addEventListener(e,C,{passive:!0});let D=()=>{let{width:t,height:r}=o();if(t===0||r===0)return;let a=Math.floor(t*s),c=Math.floor(r*s);(e.domElement.width!==a||e.domElement.height!==c)&&(e.setPixelRatio(s),e.setSize(t,r,!1),n.aspect=t/r,n.updateProjectionMatrix(),i.updateAspect(t,r),d?.()?.setSize(t,r,s),f?.setSize(t,r),C())},O=(n,r)=>{let i=d?.();i?(i.setCamera(n),i.render(r)):e.render(t,n),f&&f.render(t,n),u&&u.render(e)},k=()=>{O(r(),0)},A=function(){h=requestAnimationFrame(A);let e=performance.now(),t=(e-g)/1e3;g=e,D(),(a.enableDamping||a.autoRotate)&&a.update(),l&&l.update(r().position),p&&p.update(),c?.(t);let n=r();if(m){if(!(_||w(n)||e-y>=500))return;_=!1,y=e}O(n,t)};return{animate:A,dispose:()=>{if(h!==null&&(cancelAnimationFrame(h),h=null),m)for(let e of E)T.removeEventListener(e,C)},invalidate:C,renderNow:k}}const Q=new v.Vector3(0,0,1);function wt(e){let n=e.sceneScale||`m`,r={mm:{cameraDistance:20,near:.1,far:2e3,floorSize:100,lightDistance:10,lightHeight:20,minDistance:.1,shadowSize:100,scaleFactor:1e3},cm:{cameraDistance:20,near:.1,far:2e3,floorSize:100,lightDistance:25,lightHeight:50,minDistance:.1,shadowSize:100,scaleFactor:100},m:{cameraDistance:10,near:.01,far:2e3,floorSize:50,lightDistance:25,lightHeight:50,minDistance:.001,shadowSize:100,scaleFactor:1},inches:{cameraDistance:15,near:.1,far:2e3,floorSize:80,lightDistance:20,lightHeight:40,minDistance:.1,shadowSize:80,scaleFactor:39.37},feet:{cameraDistance:8,near:.1,far:2e3,floorSize:40,lightDistance:15,lightHeight:30,minDistance:.1,shadowSize:60,scaleFactor:3.28084}}[n],i=e.look??`technical`,a=t[i];return{sceneScale:n,look:i,camera:{position:e.camera?.position||se(e.environment?.sceneUp??Q,r.cameraDistance*Math.sqrt(3)),fov:e.camera?.fov||20,near:e.camera?.near||r.near,far:e.camera?.far||r.far,target:e.camera?.target||new v.Vector3(0,0,0),dynamicNear:e.camera?.dynamicNear??!0},lighting:{enableSunlight:e.lighting?.enableSunlight??!0,sunlightIntensity:e.lighting?.sunlightIntensity??a.sunlightIntensity,sunlightPosition:e.lighting?.sunlightPosition||ce(e.environment?.sceneUp??Q,r.lightDistance,r.lightHeight),ambientLightColor:e.lighting?.ambientLightColor||new v.Color(4210752),ambientLightIntensity:e.lighting?.ambientLightIntensity??a.ambientIntensity,sunlightColor:e.lighting?.sunlightColor||16777215,enableHemisphereLight:e.lighting?.enableHemisphereLight??a.hemisphereIntensity>0,hemisphereSkyColor:e.lighting?.hemisphereSkyColor??14673663,hemisphereGroundColor:e.lighting?.hemisphereGroundColor??7036754,hemisphereIntensity:e.lighting?.hemisphereIntensity??a.hemisphereIntensity},environment:{hdrPath:e.environment?.hdrPath||`/baseHDR.hdr`,backgroundColor:e.environment?.backgroundColor||new v.Color(15790320),enableEnvironmentLighting:e.environment?.enableEnvironmentLighting??!0,sceneUp:e.environment?.sceneUp||Q,showEnvironment:e.environment?.showEnvironment??!1,environmentIntensity:e.environment?.environmentIntensity??a.environmentIntensity},floor:{enabled:e.floor?.enabled??!1,size:e.floor?.size||r.floorSize,color:e.floor?.color||new v.Color(8421504),roughness:e.floor?.roughness??.7,metalness:e.floor?.metalness??0,receiveShadow:e.floor?.receiveShadow??!0},render:{enableShadows:e.render?.enableShadows??!0,shadowMapSize:e.render?.shadowMapSize||2048,antialias:e.render?.antialias??!0,pixelRatio:e.render?.pixelRatio||Math.min(window.devicePixelRatio,2),toneMapping:e.render?.toneMapping??a.toneMapping,toneMappingExposure:e.render?.toneMappingExposure??a.toneMappingExposure,preserveDrawingBuffer:e.render?.preserveDrawingBuffer??!1,ambientOcclusion:e.render?.ambientOcclusion??a.ambientOcclusion,aoIntensity:e.render?.aoIntensity??1,aoPixelRatio:e.render?.aoPixelRatio??1,onDemand:e.render?.onDemand??!0},controls:{enableDamping:e.controls?.enableDamping??!1,dampingFactor:e.controls?.dampingFactor||.05,autoRotate:e.controls?.autoRotate??!1,autoRotateSpeed:e.controls?.autoRotateSpeed||.5,enableZoom:e.controls?.enableZoom??!0,enablePan:e.controls?.enablePan??!0,minDistance:e.controls?.minDistance||r.minDistance,maxDistance:e.controls?.maxDistance||1/0},grid:{enabled:e.grid?.enabled??!1,cellSize:e.grid?.cellSize??1,majorEvery:e.grid?.majorEvery??10,cellColor:e.grid?.cellColor??8947848,majorColor:e.grid?.majorColor??4473924,fadeDistance:e.grid?.fadeDistance??100,plane:e.grid?.plane??ue(e.environment?.sceneUp??Q)},gizmo:{enabled:e.gizmo?.enabled??!1},edges:{enabled:e.edges?.enabled??!1,color:e.edges?.color,darken:e.edges?.darken,width:e.edges?.width??1.5,thresholdAngle:e.edges?.thresholdAngle??44,distanceFade:e.edges?.distanceFade??!0,maxTriangles:e.edges?.maxTriangles,maxSegments:e.edges?.maxSegments,maxOverlays:e.edges?.maxOverlays,screenSpaceFallback:e.edges?.screenSpaceFallback},measure:{enabled:e.measure?.enabled??!1,snapPixels:e.measure?.snapPixels,color:e.measure?.color,labelClassName:e.measure?.labelClassName,displayUnit:e.measure?.displayUnit,format:e.measure?.format},events:{onBackgroundClicked:e.events?.onBackgroundClicked,onObjectSelected:e.events?.onObjectSelected,onMeshMetadataClicked:e.events?.onMeshMetadataClicked,onMeshDoubleClicked:e.events?.onMeshDoubleClicked,selectionColor:e.events?.selectionColor||`#ff0000`,enableEventHandlers:e.events?.enableEventHandlers??!0,enableKeyboardControls:e.events?.enableKeyboardControls??!0,enableClickToFocus:e.events?.enableClickToFocus??!0,enableDoubleClickZoom:e.events?.enableDoubleClickZoom??!0,onReady:e.events?.onReady,onFrame:e.events?.onFrame},onMaxAnisotropy:e.onMaxAnisotropy}}const $=`__selvaLookBaseline`;function Tt(e,t){e.color?.setHex(t.color),e.metalness!==void 0&&(e.metalness=t.metalness),e.roughness!==void 0&&(e.roughness=t.roughness),e.opacity=t.opacity,e.transparent=t.transparent,e.depthWrite=t.depthWrite,e.wireframe!==void 0&&(e.wireframe=t.wireframe),e.side=t.side}function Et(e){let t=e[$];t&&(Tt(e,t),delete e[$])}function Dt(e,t){let n=e;if(!t){Et(n),n.needsUpdate=!0;return}n[$]?Tt(n,n[$]):n[$]={color:n.color?.getHex()??16777215,metalness:n.metalness??0,roughness:n.roughness??1,opacity:n.opacity,transparent:n.transparent,depthWrite:n.depthWrite,wireframe:n.wireframe??!1,side:n.side},t.color!==void 0&&n.color?.setHex(t.color),t.metalness!==void 0&&n.metalness!==void 0&&(n.metalness=t.metalness),t.roughness!==void 0&&n.roughness!==void 0&&(n.roughness=t.roughness),t.opacity!==void 0&&(n.opacity=t.opacity,n.transparent=t.opacity<1),t.depthWrite!==void 0&&(n.depthWrite=t.depthWrite),t.wireframe!==void 0&&n.wireframe!==void 0&&(n.wireframe=t.wireframe),t.side!==void 0&&(n.side=t.side),n.needsUpdate=!0}function Ot(e,t){if(t.materialOverride)return t.envMapIntensity;let n=e.userData[o];if(n!=null)return n;let r=e,i=r[$]?.metalness??r.metalness??0;return f(t.envMapIntensity,i)}function kt(e){let{scene:r,renderer:i,lights:a,config:o,pipeline:s,requestRender:c}=e,l=o.look,u=e=>{e.ambientIntensity!==void 0&&(a.ambient.intensity=e.ambientIntensity),e.hemisphereIntensity!==void 0&&!a.hemisphere&&e.hemisphereIntensity>0&&(a.hemisphere=new v.HemisphereLight(e.hemisphereSkyColor??o.lighting.hemisphereSkyColor,e.hemisphereGroundColor??o.lighting.hemisphereGroundColor,e.hemisphereIntensity),a.hemisphere.position.copy(o.environment.sceneUp??Q),r.add(a.hemisphere)),a.hemisphere&&(e.hemisphereIntensity!==void 0&&(a.hemisphere.intensity=e.hemisphereIntensity),e.hemisphereSkyColor!==void 0&&a.hemisphere.color.set(e.hemisphereSkyColor),e.hemisphereGroundColor!==void 0&&a.hemisphere.groundColor.set(e.hemisphereGroundColor)),c()},d=e=>{o.environment.environmentIntensity=e,r.environmentIntensity=e,c()};return{setFillLights:u,setEnvironmentIntensity:d,setToneMappingExposure:e=>{o.render.toneMappingExposure=e,i.toneMappingExposure=e,s.get()&&s.rebuild()},setAoIntensity:e=>{o.render.aoIntensity=e,s.get()&&s.rebuild()},setLook:e=>{let n=t[e];l=e,i.toneMapping=n.toneMapping,i.toneMappingExposure=n.toneMappingExposure,o.render.toneMapping=n.toneMapping,o.render.toneMappingExposure=n.toneMappingExposure,u({hemisphereIntensity:n.hemisphereIntensity,ambientIntensity:n.ambientIntensity}),d(n.environmentIntensity),a.sun&&(a.sun.intensity=n.sunlightIntensity,o.lighting.sunlightIntensity=n.sunlightIntensity);let f=s.get()!==null;s.setAmbientOcclusion(n.ambientOcclusion),f&&s.rebuild(),r.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,r=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of r)`envMapIntensity`in e&&(e.envMapIntensity=Ot(e,n)),Dt(e,n.materialOverride)}),H(r,r),c()},getMaterialAppearance:()=>n(l)}}function At(e,t){let n=t.parentElement,r=n?n.clientWidth:window.innerWidth,i=n?n.clientHeight:window.innerHeight,a=new v.PerspectiveCamera(e.camera.fov,r/i,e.camera.near,e.camera.far),o=e.camera.position;return o&&a.position.set(o.x,o.y,o.z),a}function jt(e){let t=new v.Scene;return t.background=(typeof e.environment.backgroundColor==`string`?new v.Color(e.environment.backgroundColor):e.environment.backgroundColor)||null,t}function Mt(e,t){d(e,t),e.environment?.dispose(),oe(e),e.background instanceof v.Texture&&e.background.dispose()}const Nt={uniforms:{tDiffuse:{value:null},tNormal:{value:null},tDepth:{value:null},uResolution:{value:new v.Vector2(1,1)},uColor:{value:new v.Color(2236962)},uOpacity:{value:1},uNormalThreshold:{value:.4},uDepthThreshold:{value:.02},uThickness:{value:1},uNear:{value:.1},uFar:{value:1e3},uPerspective:{value:1}},vertexShader:`
53
+ `,transparent:!0,depthWrite:!1,side:y.DoubleSide,uniforms:{uAxes:{value:s},uCell:{value:t},uMajor:{value:n},uCellColor:{value:new y.Color(r)},uMajorColor:{value:new y.Color(i)},uCenter:{value:new y.Vector3},uFade:{value:a}}}),d=new y.Mesh(l,u);d.name=`grid`,d.userData.id=`grid`,d.renderOrder=-1;let f=a,p=a*c,m=new y.Vector3;return{object:d,update:e=>{o===`y`?(d.position.set(e.x,0,e.z),m.set(e.x,0,e.z)):o===`z`?(d.position.set(e.x,e.y,0),m.set(e.x,e.y,0)):(d.position.set(0,e.y,e.z),m.set(0,e.y,e.z)),u.uniforms.uCenter.value.copy(m),d.scale.setScalar(p)},fitToContent:e=>{if(e.isEmpty())return;let t=e.getSize(new y.Vector3),n=(e,t)=>t===0?e.x:t===1?e.y:e.z,r=Math.max(n(t,s.x),n(t,s.y));r>0&&Number.isFinite(r)&&(u.uniforms.uCell.value=lt(r/20),f=r*2,u.uniforms.uFade.value=f,p=f*c)},setVisible:e=>{d.visible=e},dispose:()=>{d.removeFromParent(),l.dispose(),u.dispose()}}}function dt(e,t){let n=new D,r=n.domElement;r.style.position=`absolute`,r.style.top=`0`,r.style.left=`0`,r.style.overflow=`hidden`,r.style.pointerEvents=`none`,r.style.zIndex=`30`,getComputedStyle(e).position===`static`&&(e.style.position=`relative`),e.appendChild(r);let i={width:e.clientWidth||1,height:e.clientHeight||1};n.setSize(i.width,i.height);let a=new y.Group;a.name=`label-layer`,a.userData.id=`label-layer`,t.add(a);let o=/* @__PURE__ */ new Set;return{addLabel:(e,t,n)=>{let r=document.createElement(`div`);r.textContent=e,n?r.className=n:Object.assign(r.style,{padding:`2px 6px`,borderRadius:`4px`,background:`rgba(20, 20, 20, 0.78)`,color:`#fff`,font:`12px/1.3 system-ui, sans-serif`,whiteSpace:`pre`,textAlign:`center`,userSelect:`none`}),r.style.pointerEvents=`none`;let i=new E(r);return i.position.copy(t),a.add(i),o.add(i),{object:i,setPosition:e=>i.position.copy(e),setText:e=>{r.textContent=e},remove:()=>{i.removeFromParent(),r.remove(),o.delete(i)}}},render:(e,t)=>n.render(e,t),setSize:(e,t)=>n.setSize(e,t),dispose:()=>{o.forEach(e=>{e.removeFromParent(),e.element.remove()}),o.clear(),a.removeFromParent(),r.remove()}}}const ft=.015,pt={Millimeters:{metersPerUnit:1/1e3,suffix:`mm`},Centimeters:{metersPerUnit:1/100,suffix:`cm`},Meters:{metersPerUnit:1,suffix:`m`},Inches:{metersPerUnit:1/39.37,suffix:`in`},Feet:{metersPerUnit:1/3.28084,suffix:`ft`}};function mt(e){let t=e&&pt[e]||pt.Meters;return e=>`${(e/t.metersPerUnit).toPrecision(3)} ${t.suffix}`}function ht(e,t){if(e.isOrthographicCamera){let t=e;return Math.abs(t.top-t.bottom)/(t.zoom||1)*ft}return((t?e.position.distanceTo(t):e.position.length())||1)*ft}function gt(e){let t=e.object;if(t instanceof y.Mesh)return e.face?[e.face.a,e.face.b,e.face.c]:null;if(t instanceof y.Points)return e.index==null?null:[e.index];if(t instanceof y.Line){if(e.index==null)return null;let n=t.geometry.index;return n?e.index+1>=n.count?null:[n.getX(e.index),n.getX(e.index+1)]:[e.index,e.index+1]}return null}function _t(e,t,n,r){let i=e.point.clone(),a=e.object,o=gt(e);if(!o||!a.geometry)return i;let s=a.geometry.attributes.position;if(!s)return i;let c=e=>{let r=e.clone().project(t);return new y.Vector2((r.x+1)/2*n.width,(1-r.y)/2*n.height)},l=c(i),u=i,d=r;for(let e of o){if(e>=s.count)continue;let t=new y.Vector3().fromBufferAttribute(s,e).applyMatrix4(a.matrixWorld),n=c(t).distanceTo(l);n<d&&(d=n,u=t)}return u}function vt(e){let{canvas:t,scene:n,getActiveCamera:r,getViewTarget:i,labelLayer:a,options:o={}}=e,s=o.snapPixels??12,c=new y.Color(o.color??16763904),l=mt(o.displayUnit),u=o.format??((e,t)=>`${l(e)}\nΔx ${l(t.x)} Δy ${l(t.y)} Δz ${l(t.z)}`),d=new y.Raycaster,f=new y.Vector2,p=!1,m=[],h=[],g=null,_=null,v=new y.PointsMaterial({color:c,size:8,sizeAttenuation:!1,depthTest:!1}),C=new y.PointsMaterial({color:c,size:11,sizeAttenuation:!1,depthTest:!1,transparent:!0,opacity:.5}),w=null,T=e=>{if(!e)w&&(w.visible=!1);else{if(!w){let e=new y.BufferGeometry;e.setAttribute(`position`,new y.Float32BufferAttribute([0,0,0],3)),w=new y.Points(e,C),w.renderOrder=1e3,w.userData.id=`measure`,w.raycast=()=>{},n.add(w)}w.position.copy(e),w.visible=!0}},E=e=>{let t=new y.BufferGeometry;t.setAttribute(`position`,new y.Float32BufferAttribute([e.x,e.y,e.z],3));let r=new y.Points(t,v);return r.renderOrder=999,r.userData.id=`measure`,r.raycast=()=>{},n.add(r),r},D=()=>{m.length=0,h.forEach(e=>{e.geometry.dispose(),e.removeFromParent()}),h.length=0,g&&=(g.geometry.dispose(),g.material.dispose(),g.removeFromParent(),null),_?.remove(),_=null},O=()=>{if(m.length!==2)return;let[e,t]=m,r=new x;r.setPositions([e.x,e.y,e.z,t.x,t.y,t.z]);let i=new S({color:c});i.linewidth=2,i.depthTest=!1,g=new b(r,i),g.renderOrder=998,g.userData.id=`measure`,g.raycast=()=>{},n.add(g);let s=e.clone().add(t).multiplyScalar(.5),l=new y.Vector3(Math.abs(t.x-e.x),Math.abs(t.y-e.y),Math.abs(t.z-e.z));_=a.addLabel(u(e.distanceTo(t),l),s,o.labelClassName)},k=e=>{let a=t.getBoundingClientRect();f.x=(e.clientX-a.left)/a.width*2-1,f.y=-((e.clientY-a.top)/a.height)*2+1;let o=r();d.setFromCamera(f,o);let c=ht(o,i?.());d.params.Line.threshold=c,d.params.Points.threshold=c;let l=d.intersectObjects(n.children,!0).filter(e=>e.object.userData.id!==`measure`&&e.object.userData.id!==`grid`);return l.length===0?null:_t(l[0],o,{width:a.width,height:a.height},s)},A=null,j=0,M=()=>{j&&=(cancelAnimationFrame(j),0),A=null};return{setEnabled:e=>{p=e,e||(M(),D(),T(null))},isEnabled:()=>p,handleClick:e=>{if(!p)return!1;m.length===2&&D();let t=k(e);return t===null||(m.push(t),h.push(E(t)),m.length===2&&O()),!0},handleMove:e=>{p&&(A=e,!j&&(j=requestAnimationFrame(()=>{j=0;let e=A;A=null,p&&e&&T(k(e))})))},clear:D,dispose:()=>{M(),D(),w&&=(w.geometry.dispose(),w.removeFromParent(),null),v.dispose(),C.dispose()}}}const yt=[];function bt({camera:e,scene:t,groundNormals:n=()=>yt}){let r=e.near,i=e.near,a=xt();return{update:()=>{e.near!==i&&(r=e.near);let o=a.measure(t,e),s=r;if(o!==null){let t=o;for(let r of n())t=Math.min(t,Math.abs(e.position.dot(r)));s=y.MathUtils.clamp(t*.5,r,e.far*.01)}Math.abs(s-i)>i*.05&&(e.near=s,e.updateProjectionMatrix(),i=s)}}}function xt(){let e=/* @__PURE__ */ new WeakMap,t=new y.Frustum,n=new y.Matrix4,r=new y.Vector3,i=new y.Box3,a=/* @__PURE__ */ new Float64Array(20),o=/* @__PURE__ */ new Float64Array(20),s=/* @__PURE__ */ new Float32Array(6),c=/* @__PURE__ */ new Float64Array(21),l=/* @__PURE__ */ new Float64Array(21),u=1/0,d=!1,f=(t,n)=>{let r=n.getAttribute(`position`),i=n.getIndex(),a=e.get(n);if(a&&a.position===r&&a.positionVersion===Ct(r)&&a.index===i&&a.indexVersion===(i?.version??-1))return a;let o={...Tt(r,i,wt(t)),position:r,positionVersion:Ct(r),index:i,indexVersion:i?.version??-1};return e.set(n,o),o},p=(e,t,n)=>{let{position:r,index:i}=e,a=i?.array,o=1/0;for(let i=e.ranges[t*2];i<e.ranges[t*2+1];i++){for(let e=0;e<3;e++){let t=a?a[i*3+e]:i*3+e;c[e*3]=r.getX(t),c[e*3+1]=r.getY(t),c[e*3+2]=r.getZ(t)}let e=3;for(let t=0;t<16&&e>0;t+=4){let r=n[t],i=n[t+1],a=n[t+2],o=n[t+3],s=0;for(let t=0;t<e;t++){let n=(t+1)%e,u=c[t*3],d=c[t*3+1],f=c[t*3+2],p=c[n*3],m=c[n*3+1],h=c[n*3+2],g=r*u+i*d+a*f+o,_=r*p+i*m+a*h+o;if(g>=0&&(l[s*3]=u,l[s*3+1]=d,l[s*3+2]=f,s++),g>=0!=_>=0){let e=g/(g-_);l[s*3]=u+(p-u)*e,l[s*3+1]=d+(m-d)*e,l[s*3+2]=f+(h-f)*e,s++}}[c,l]=[l,c],e=s}for(let t=0;t<e;t++){let e=n[16]*c[t*3]+n[17]*c[t*3+1]+n[18]*c[t*3+2]+n[19];e<o&&(o=e)}}return o},m=e=>{let t=e.elements;for(let e=0;e<20;e+=4){let n=a[e],r=a[e+1],i=a[e+2];o[e]=t[0]*n+t[1]*r+t[2]*i,o[e+1]=t[4]*n+t[5]*r+t[6]*i,o[e+2]=t[8]*n+t[9]*r+t[10]*i,o[e+3]=n*t[12]+r*t[13]+i*t[14]+a[e+3]}return o},h=(e,t,n)=>{outer:for(let r=0;r<e.length;r+=6){let i=e[r],a=e[r+1],o=e[r+2],s=e[r+3],c=e[r+4],l=e[r+5];for(let e=0;e<16;e+=4){let n=t[e],r=t[e+1],u=t[e+2];if(n*(n>0?s:i)+r*(r>0?c:a)+u*(u>0?l:o)+t[e+3]<0)continue outer}let d=t[16],f=t[17],m=t[18],h=d*(d>0?i:s)+f*(f>0?a:c)+m*(m>0?o:l)+t[19];h>=u||(u=n?Math.min(u,p(n,r/6,t)):h)}},g=e=>{let t=e.geometry;if(!t?.getAttribute?.(`position`))return;if(d=!0,St(e)){let n=f(e,t);h(n.boxes,m(e.matrixWorld),n);return}let n=e;n.isInstancedMesh?(n.boundingBox||n.computeBoundingBox(),i.copy(n.boundingBox)):(t.boundingBox||t.computeBoundingBox(),i.copy(t.boundingBox)),!i.isEmpty()&&(s[0]=i.min.x,s[1]=i.min.y,s[2]=i.min.z,s[3]=i.max.x,s[4]=i.max.y,s[5]=i.max.z,h(s,m(e.matrixWorld)))},_=e=>{if(e.visible&&!he(e)&&e.userData.kind!==`edge-overlay`){g(e);for(let t of e.children)_(t)}};return{measure:(e,i)=>{e.updateMatrixWorld(),i.updateMatrixWorld(),n.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),t.setFromProjectionMatrix(n);for(let e=0;e<4;e++){let n=t.planes[e];a[e*4]=n.normal.x,a[e*4+1]=n.normal.y,a[e*4+2]=n.normal.z,a[e*4+3]=n.constant}i.getWorldDirection(r),a[16]=r.x,a[17]=r.y,a[18]=r.z,a[19]=-r.dot(i.position),u=1/0,d=!1;for(let t of e.children)_(t);return d?u:null}}}function St(e){let t=e;if(!t.isMesh||t.isInstancedMesh||t.isSkinnedMesh)return!1;let n=t.geometry;return!n.isInstancedBufferGeometry&&Object.keys(n.morphAttributes).length===0}function Ct(e){return e.isInterleavedBufferAttribute?e.data.version:e.version}function wt(e){let t=[];for(let n of Z(e)??[])n.indexStart!==void 0&&t.push(n.indexStart/3);return t.sort((e,t)=>e-t)}function Tt(e,t,n){let r=Math.floor((t?t.count:e.count)/3),i=[],a=0;for(let e=0;e<r;){for(;a<n.length&&n[a]<=e;)a++;let t=Math.min(r,e+256,n[a]??r);i.push(e,t),e=t}let o=i.length/2,s=new Float32Array(o*6),c=!e.isInterleavedBufferAttribute,l=e.array,u=c&&e.itemSize===3&&!e.normalized,d=t?.array;for(let t=0;t<o;t++){let n=1/0,r=1/0,a=1/0,o=-1/0,c=-1/0,f=-1/0,p=i[t*2+1]*3;for(let s=i[t*2]*3;s<p;s++){let t=d?d[s]:s,i=u?l[t*3]:e.getX(t),p=u?l[t*3+1]:e.getY(t),m=u?l[t*3+2]:e.getZ(t);i<n&&(n=i),p<r&&(r=p),m<a&&(a=m),i>o&&(o=i),p>c&&(c=p),m>f&&(f=m)}let m=t*6;s[m]=n,s[m+1]=r,s[m+2]=a,s[m+3]=o,s[m+4]=c,s[m+5]=f}return{boxes:s,ranges:Uint32Array.from(i)}}function Et(){let e=[],t=null,n=()=>e.sort((e,t)=>t.priority-e.priority),r=t=>e.findIndex(e=>e.id===t),i=n=>{let i=r(n);i!==-1&&(e.splice(i,1),t===n&&(t=null))};return{register:({id:t,tool:r,priority:a=0})=>(i(t),e.push({id:t,tool:r,priority:a}),n(),()=>i(t)),unregister:i,get:t=>e[r(t)]?.tool??null,setActive:n=>{t=n;for(let t of e)t.tool.setEnabled?.(t.id===n)},getActive:()=>t,handleClick:t=>{for(let n of[...e])if(n.tool.handleClick(t))return!0;return!1},handleMove:t=>{for(let n of[...e])n.tool.handleMove?.(t)}}}function Dt(e,t){let n=t.getBoundingClientRect();return{x:(e.clientX-n.left)/n.width*2-1,y:-((e.clientY-n.top)/n.height)*2+1}}function Ot(e){let{camera:t,domElement:n,controller:r}=e,i=new O(t,n);i.setLabels(`X`,`Y`,`Z`);let a=!0,o=new y.Raycaster,s=new y.OrthographicCamera(-2,2,2,-2,0,4);s.position.set(0,0,2),s.updateMatrixWorld();let c={posX:new y.Vector3(1,0,0),negX:new y.Vector3(-1,0,0),posY:new y.Vector3(0,1,0),negY:new y.Vector3(0,-1,0),posZ:new y.Vector3(0,0,1),negZ:new y.Vector3(0,0,-1)},l=e=>{let r=n.getBoundingClientRect(),a=r.left+n.offsetWidth-128-i.location.right,l=r.top+n.offsetHeight-128-i.location.bottom,u=new y.Vector2((e.clientX-a)/128*2-1,-((e.clientY-l)/128)*2+1);if(Math.abs(u.x)>1||Math.abs(u.y)>1)return null;i.quaternion.copy(t.quaternion).invert(),i.updateMatrixWorld(),o.setFromCamera(u,s);let d=o.intersectObjects(i.children,!1);for(let e of d){let t=e.object.userData?.type;if(typeof t==`string`&&t in c)return t}return null};return{render:e=>{if(!a)return;let t=e.autoClear;e.autoClear=!1,i.render(e),e.autoClear=t},handleClick:e=>{if(!a)return!1;let t=l(e);return t?(r.getProjection()===`orthographic`&&r.setProjection(`perspective`),r.setViewDirection(c[t],!1),!0):!1},setVisible:e=>{a=e},isVisible:()=>a,dispose:()=>i.dispose()}}function kt(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m=!0){let h=null,g=performance.now(),_=!0,v=0,b=new y.Matrix4,x=new y.Matrix4,S=null,C=()=>{_=!0},w=e=>{e.updateMatrixWorld();let t=S!==e||!b.equals(e.matrixWorld)||!x.equals(e.projectionMatrix);return t&&(S=e,b.copy(e.matrixWorld),x.copy(e.projectionMatrix)),t},T=e.domElement,E=[`pointerdown`,`pointerup`,`wheel`];if(m)for(let e of E)T.addEventListener(e,C,{passive:!0});let D=()=>{let{width:t,height:r}=o();if(t===0||r===0)return;let a=Math.floor(t*s),c=Math.floor(r*s);(e.domElement.width!==a||e.domElement.height!==c)&&(e.setPixelRatio(s),e.setSize(t,r,!1),n.aspect=t/r,n.updateProjectionMatrix(),i.updateAspect(t,r),d?.()?.setSize(t,r,s),f?.setSize(t,r),C())},O=(n,r)=>{let i=d?.();i?(i.setCamera(n),i.render(r)):e.render(t,n),f&&f.render(t,n),u&&u.render(e)},k=()=>{O(r(),0)},A=function(){h=requestAnimationFrame(A);let e=performance.now(),t=(e-g)/1e3;g=e,D(),(a.enableDamping||a.autoRotate)&&a.update(),l&&l.update(r().position),p&&p.update(),c?.(t);let n=r();if(m){if(!(_||w(n)||e-v>=500))return;_=!1,v=e}O(n,t)};return{animate:A,dispose:()=>{if(h!==null&&(cancelAnimationFrame(h),h=null),m)for(let e of E)T.removeEventListener(e,C)},invalidate:C,renderNow:k}}const Q=new y.Vector3(0,0,1);function At(e){let n=e.sceneScale||`m`,r={mm:{cameraDistance:20,near:.1,far:2e3,floorSize:100,lightDistance:10,lightHeight:20,minDistance:.1,shadowSize:100,scaleFactor:1e3},cm:{cameraDistance:20,near:.1,far:2e3,floorSize:100,lightDistance:25,lightHeight:50,minDistance:.1,shadowSize:100,scaleFactor:100},m:{cameraDistance:10,near:.01,far:2e3,floorSize:50,lightDistance:25,lightHeight:50,minDistance:.001,shadowSize:100,scaleFactor:1},inches:{cameraDistance:15,near:.1,far:2e3,floorSize:80,lightDistance:20,lightHeight:40,minDistance:.1,shadowSize:80,scaleFactor:39.37},feet:{cameraDistance:8,near:.1,far:2e3,floorSize:40,lightDistance:15,lightHeight:30,minDistance:.1,shadowSize:60,scaleFactor:3.28084}}[n],i=e.look??`technical`,a=t[i];return{sceneScale:n,look:i,camera:{position:e.camera?.position||le(e.environment?.sceneUp??Q,r.cameraDistance*Math.sqrt(3)),fov:e.camera?.fov||20,near:e.camera?.near||r.near,far:e.camera?.far||r.far,target:e.camera?.target||new y.Vector3(0,0,0),dynamicNear:e.camera?.dynamicNear??!0},lighting:{enableSunlight:e.lighting?.enableSunlight??!0,sunlightIntensity:e.lighting?.sunlightIntensity??a.sunlightIntensity,sunlightPosition:e.lighting?.sunlightPosition||ue(e.environment?.sceneUp??Q,r.lightDistance,r.lightHeight),ambientLightColor:e.lighting?.ambientLightColor||new y.Color(4210752),ambientLightIntensity:e.lighting?.ambientLightIntensity??a.ambientIntensity,sunlightColor:e.lighting?.sunlightColor||16777215,enableHemisphereLight:e.lighting?.enableHemisphereLight??a.hemisphereIntensity>0,hemisphereSkyColor:e.lighting?.hemisphereSkyColor??14673663,hemisphereGroundColor:e.lighting?.hemisphereGroundColor??7036754,hemisphereIntensity:e.lighting?.hemisphereIntensity??a.hemisphereIntensity},environment:{hdrPath:e.environment?.hdrPath||`/baseHDR.hdr`,backgroundColor:e.environment?.backgroundColor||new y.Color(15790320),enableEnvironmentLighting:e.environment?.enableEnvironmentLighting??!0,sceneUp:e.environment?.sceneUp||Q,showEnvironment:e.environment?.showEnvironment??!1,environmentIntensity:e.environment?.environmentIntensity??a.environmentIntensity},floor:{enabled:e.floor?.enabled??!1,size:e.floor?.size||r.floorSize,color:e.floor?.color||new y.Color(8421504),roughness:e.floor?.roughness??.7,metalness:e.floor?.metalness??0,receiveShadow:e.floor?.receiveShadow??!0},render:{enableShadows:e.render?.enableShadows??!0,shadowMapSize:e.render?.shadowMapSize||2048,antialias:e.render?.antialias??!0,pixelRatio:e.render?.pixelRatio||Math.min(window.devicePixelRatio,2),toneMapping:e.render?.toneMapping??a.toneMapping,toneMappingExposure:e.render?.toneMappingExposure??a.toneMappingExposure,preserveDrawingBuffer:e.render?.preserveDrawingBuffer??!1,ambientOcclusion:e.render?.ambientOcclusion??a.ambientOcclusion,aoIntensity:e.render?.aoIntensity??1,aoPixelRatio:e.render?.aoPixelRatio??1,onDemand:e.render?.onDemand??!0},controls:{enableDamping:e.controls?.enableDamping??!1,dampingFactor:e.controls?.dampingFactor||.05,autoRotate:e.controls?.autoRotate??!1,autoRotateSpeed:e.controls?.autoRotateSpeed||.5,enableZoom:e.controls?.enableZoom??!0,enablePan:e.controls?.enablePan??!0,minDistance:e.controls?.minDistance||r.minDistance,maxDistance:e.controls?.maxDistance||1/0},grid:{enabled:e.grid?.enabled??!1,cellSize:e.grid?.cellSize??1,majorEvery:e.grid?.majorEvery??10,cellColor:e.grid?.cellColor??8947848,majorColor:e.grid?.majorColor??4473924,fadeDistance:e.grid?.fadeDistance??100,plane:e.grid?.plane??fe(e.environment?.sceneUp??Q)},gizmo:{enabled:e.gizmo?.enabled??!1},edges:{enabled:e.edges?.enabled??!1,color:e.edges?.color,darken:e.edges?.darken,width:e.edges?.width??1.5,thresholdAngle:e.edges?.thresholdAngle??44,distanceFade:e.edges?.distanceFade??!0,maxTriangles:e.edges?.maxTriangles,maxSegments:e.edges?.maxSegments,maxOverlays:e.edges?.maxOverlays,screenSpaceFallback:e.edges?.screenSpaceFallback},measure:{enabled:e.measure?.enabled??!1,snapPixels:e.measure?.snapPixels,color:e.measure?.color,labelClassName:e.measure?.labelClassName,displayUnit:e.measure?.displayUnit,format:e.measure?.format},events:{onBackgroundClicked:e.events?.onBackgroundClicked,onObjectSelected:e.events?.onObjectSelected,onMeshMetadataClicked:e.events?.onMeshMetadataClicked,onMeshDoubleClicked:e.events?.onMeshDoubleClicked,selectionColor:e.events?.selectionColor||`#ff0000`,enableEventHandlers:e.events?.enableEventHandlers??!0,enableKeyboardControls:e.events?.enableKeyboardControls??!0,enableClickToFocus:e.events?.enableClickToFocus??!0,enableDoubleClickZoom:e.events?.enableDoubleClickZoom??!0,onReady:e.events?.onReady,onFrame:e.events?.onFrame},onMaxAnisotropy:e.onMaxAnisotropy}}const $=`__selvaLookBaseline`;function jt(e,t){e.color?.setHex(t.color),e.metalness!==void 0&&(e.metalness=t.metalness),e.roughness!==void 0&&(e.roughness=t.roughness),e.opacity=t.opacity,e.transparent=t.transparent,e.depthWrite=t.depthWrite,e.wireframe!==void 0&&(e.wireframe=t.wireframe),e.side=t.side}function Mt(e){let t=e[$];t&&(jt(e,t),delete e[$])}function Nt(e,t){let n=e;t?(n[$]?jt(n,n[$]):n[$]={color:n.color?.getHex()??16777215,metalness:n.metalness??0,roughness:n.roughness??1,opacity:n.opacity,transparent:n.transparent,depthWrite:n.depthWrite,wireframe:n.wireframe??!1,side:n.side},t.color!==void 0&&n.color?.setHex(t.color),t.metalness!==void 0&&n.metalness!==void 0&&(n.metalness=t.metalness),t.roughness!==void 0&&n.roughness!==void 0&&(n.roughness=t.roughness),t.opacity!==void 0&&(n.opacity=t.opacity,n.transparent=t.opacity<1),t.depthWrite!==void 0&&(n.depthWrite=t.depthWrite),t.wireframe!==void 0&&n.wireframe!==void 0&&(n.wireframe=t.wireframe),t.side!==void 0&&(n.side=t.side),n.needsUpdate=!0):(Mt(n),n.needsUpdate=!0)}function Pt(e,t){if(t.materialOverride)return t.envMapIntensity;let n=e.userData[o];if(n!=null)return n;let r=e,i=r[$]?.metalness??r.metalness??0;return f(t.envMapIntensity,i)}function Ft(e){let{scene:r,renderer:i,lights:a,config:o,pipeline:s,requestRender:c}=e,l=o.look,u=e=>{e.ambientIntensity!==void 0&&(a.ambient.intensity=e.ambientIntensity),e.hemisphereIntensity!==void 0&&!a.hemisphere&&e.hemisphereIntensity>0&&(a.hemisphere=new y.HemisphereLight(e.hemisphereSkyColor??o.lighting.hemisphereSkyColor,e.hemisphereGroundColor??o.lighting.hemisphereGroundColor,e.hemisphereIntensity),a.hemisphere.position.copy(o.environment.sceneUp??Q),r.add(a.hemisphere)),a.hemisphere&&(e.hemisphereIntensity!==void 0&&(a.hemisphere.intensity=e.hemisphereIntensity),e.hemisphereSkyColor!==void 0&&a.hemisphere.color.set(e.hemisphereSkyColor),e.hemisphereGroundColor!==void 0&&a.hemisphere.groundColor.set(e.hemisphereGroundColor)),c()},d=e=>{o.environment.environmentIntensity=e,r.environmentIntensity=e,c()};return{setFillLights:u,setEnvironmentIntensity:d,setToneMappingExposure:e=>{o.render.toneMappingExposure=e,i.toneMappingExposure=e,s.get()&&s.rebuild()},setAoIntensity:e=>{o.render.aoIntensity=e,s.get()&&s.rebuild()},setLook:e=>{let n=t[e];l=e,i.toneMapping=n.toneMapping,i.toneMappingExposure=n.toneMappingExposure,o.render.toneMapping=n.toneMapping,o.render.toneMappingExposure=n.toneMappingExposure,u({hemisphereIntensity:n.hemisphereIntensity,ambientIntensity:n.ambientIntensity}),d(n.environmentIntensity),a.sun&&(a.sun.intensity=n.sunlightIntensity,o.lighting.sunlightIntensity=n.sunlightIntensity);let f=s.get()!==null;s.setAmbientOcclusion(n.ambientOcclusion),f&&s.rebuild(),r.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,r=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of r)`envMapIntensity`in e&&(e.envMapIntensity=Pt(e,n)),Nt(e,n.materialOverride)}),V(r,r),c()},getMaterialAppearance:()=>n(l)}}function It(e,t){let n=t.parentElement,r=n?n.clientWidth:window.innerWidth,i=n?n.clientHeight:window.innerHeight,a=new y.PerspectiveCamera(e.camera.fov,r/i,e.camera.near,e.camera.far),o=e.camera.position;return o&&a.position.set(o.x,o.y,o.z),a}function Lt(e){let t=new y.Scene;return t.background=(typeof e.environment.backgroundColor==`string`?new y.Color(e.environment.backgroundColor):e.environment.backgroundColor)||null,t}function Rt(e,t){d(e,t),e.environment?.dispose(),B(e),e.background instanceof y.Texture&&e.background.dispose()}const zt={uniforms:{tDiffuse:{value:null},tNormal:{value:null},tDepth:{value:null},uResolution:{value:new y.Vector2(1,1)},uColor:{value:new y.Color(2236962)},uOpacity:{value:1},uNormalThreshold:{value:.4},uDepthThreshold:{value:.02},uThickness:{value:1},uNear:{value:.1},uFar:{value:1e3},uPerspective:{value:1}},vertexShader:`
54
54
  varying vec2 vUv;
55
55
  void main() {
56
56
  vUv = uv;
@@ -104,5 +104,5 @@ import{a as e,c as t,d as n,f as r,g as i,h as a,l as o,m as s,p as c,r as l,s a
104
104
  float edge = max(depthEdge, normalEdge) * uOpacity;
105
105
  gl_FragColor = vec4(mix(color.rgb, uColor, edge), color.a);
106
106
  }
107
- `};var Pt=class extends N{camera;scene;normalMaterial;edgeMaterial;fsQuad;normalTarget=null;width;height;constructor(e,t,n,r,i={}){super(),this.scene=e,this.camera=t,this.width=Math.max(1,n),this.height=Math.max(1,r),this.normalMaterial=new v.MeshNormalMaterial,this.normalMaterial.blending=v.NoBlending,this.edgeMaterial=new v.ShaderMaterial({uniforms:v.UniformsUtils.clone(Nt.uniforms),vertexShader:Nt.vertexShader,fragmentShader:Nt.fragmentShader});let a=this.edgeMaterial.uniforms;a.uColor.value=new v.Color(i.color??2236962),a.uOpacity.value=i.opacity??1,a.uNormalThreshold.value=i.normalThreshold??.4,a.uDepthThreshold.value=i.depthThreshold??.02,a.uThickness.value=i.thickness??1,this.fsQuad=new ee(this.edgeMaterial),this.needsSwap=!0}acquireNormalTarget(){if(!this.normalTarget){let e=new v.DepthTexture(this.width,this.height);this.normalTarget=new v.WebGLRenderTarget(this.width,this.height,{minFilter:v.NearestFilter,magFilter:v.NearestFilter,depthTexture:e})}return this.normalTarget}setSize(e,t){this.width=Math.max(1,e),this.height=Math.max(1,t),this.normalTarget?.setSize(this.width,this.height)}render(e,t,n){let r=this.acquireNormalTarget(),i=e.getRenderTarget(),a=e.autoClear,o=e.getClearColor(new v.Color),s=e.getClearAlpha(),c=this.scene.overrideMaterial;e.setRenderTarget(r),e.setClearColor(7829503,1),e.autoClear=!0,this.scene.overrideMaterial=this.normalMaterial,e.render(this.scene,this.camera),this.scene.overrideMaterial=c,e.setClearColor(o,s),e.autoClear=a;let l=this.edgeMaterial.uniforms;l.tDiffuse.value=n.texture,l.tNormal.value=r.texture,l.tDepth.value=r.depthTexture,l.uResolution.value.set(this.width,this.height);let u=this.camera;l.uPerspective.value=+!!u.isPerspectiveCamera,l.uNear.value=this.camera.near??.1,l.uFar.value=this.camera.far??1e3,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e),e.setRenderTarget(i)}dispose(){this.normalTarget?.dispose(),this.normalMaterial.dispose(),this.edgeMaterial.dispose(),this.fsQuad.dispose()}};function Ft(e){return e>=2?0:4}function It(e,t,n,r,i,a){let o=new v.WebGLRenderTarget(r,i,{type:v.HalfFloatType}),s=new O(e,o);s.renderTarget2.samples=0;let c=e=>{s.readBuffer=o,s.writeBuffer=s.renderTarget2,s.render(e)},l=new k(t,n);s.addPass(l);let u=null;(a.ambientOcclusion??!0)&&(u=new A(t,n,r,i),u.blendIntensity=a.aoIntensity??1,u.updateGtaoMaterial({screenSpaceRadius:!0}),s.addPass(u));let d=new Pt(t,n,r,i,typeof a.edgeDetection==`object`?a.edgeDetection:{});d.enabled=!!a.edgeDetection,s.addPass(d);let f=new j;s.addPass(f);let p=new M;s.addPass(p),e.toneMapping=a.toneMapping,e.toneMappingExposure=a.toneMappingExposure;let m=a.aoPixelRatio??1,h=1;if(u){let e=u.setSize.bind(u);u.setSize=(t,n)=>e(Math.max(1,Math.round(t*h)),Math.max(1,Math.round(n*h)))}let g=e=>{h=Math.min(e,m)/e;let t=Ft(e);o.samples!==t&&(o.samples=t,o.dispose()),s.setPixelRatio(e)};return g(e.getPixelRatio()),s.setSize(r,i),{render:c,setSize:(e,t,n)=>{g(n),s.setSize(e,t)},setCamera:e=>{if(l.camera=e,d.camera=e,!u)return;u.camera=e;let t=+!!e.isPerspectiveCamera;u.gtaoMaterial.defines.PERSPECTIVE_CAMERA!==t&&(u.gtaoMaterial.defines.PERSPECTIVE_CAMERA=t,u.gtaoMaterial.needsUpdate=!0)},setEdgeDetection:e=>{d.enabled=e},edgeDetectionEnabled:()=>d.enabled,dispose:()=>{s.dispose(),u?.dispose(),d.dispose(),f.dispose(),p.dispose()}}}function Lt(e){let{renderer:t,scene:n,getActiveCamera:r,getCanvasSize:i,pixelRatio:a,config:o,requestRender:s}=e,c=null,l=!!o.render.ambientOcclusion,u=!1,d=!1,f=e=>{let{width:s,height:c}=i(),l=It(t,n,r(),Math.max(1,s),Math.max(1,c),{toneMapping:o.render.toneMapping??v.NeutralToneMapping,toneMappingExposure:o.render.toneMappingExposure??1,ambientOcclusion:e,aoIntensity:o.render.aoIntensity,aoPixelRatio:o.render.aoPixelRatio,edgeDetection:!1});return l.setSize(Math.max(1,s),Math.max(1,c),a),l},p=()=>{if(!(l||u)){c?.dispose(),c=null,s();return}(!c||d!==l)&&(c?.dispose(),c=f(l),d=l),c.setEdgeDetection(u),s()};return{get:()=>c,sync:p,rebuild:()=>{c?.dispose(),c=null,p()},setAmbientOcclusion:e=>{l=e,p()},setEdgeFallback:e=>{e!==u&&(u=e,p())},isEdgeFallbackActive:()=>u,dispose:()=>{c?.dispose(),c=null}}}function Rt(e,t,n){let r=new P(e,t),i=n.camera.target;return i&&r.target.set(i.x,i.y,i.z),r.enableDamping=n.controls.enableDamping||!1,r.dampingFactor=n.controls.dampingFactor||.05,r.autoRotate=n.controls.autoRotate||!1,r.autoRotateSpeed=n.controls.autoRotateSpeed||.5,r.enableZoom=n.controls.enableZoom??!0,r.enablePan=n.controls.enablePan??!0,r.minDistance=n.controls.minDistance||.001,r.maxDistance=n.controls.maxDistance||1/0,r.screenSpacePanning=!1,r.maxPolarAngle=Math.PI,r.update(),r}function zt(e,t,n,r){n.environment.enableEnvironmentLighting?(V(e,t,le(n.environment.sceneUp??Q)),new F().load(n.environment.hdrPath||`/baseHDR.hdr`,function(i){if(r()){i.dispose();return}if(!i?.image){c().warn(`HDR loaded without image data; skipping environment map.`),i?.dispose(),n.events.onReady?.();return}i.mapping=v.EquirectangularReflectionMapping;let a=new v.PMREMGenerator(t);a.compileEquirectangularShader();let o=a.fromEquirectangular(i).texture;a.dispose(),e.environment=o,e.environmentIntensity=n.environment.environmentIntensity??1;let s=le(n.environment.sceneUp??Q);e.environmentRotation.copy(s),n.environment.showEnvironment?(e.background=i,e.backgroundRotation.copy(s)):i.dispose(),n.events.onReady?.()},void 0,function(e){r()||(c().warn(`HDR texture could not be loaded, falling back to basic lighting:`,e),n.events.onReady?.())})):n.events.onReady?.()}function Bt(e,t){let n=t.floor.size,r=new v.PlaneGeometry(n,n),i=typeof t.floor.color==`string`?new v.Color(t.floor.color):t.floor.color,a=new v.MeshStandardMaterial({color:i,roughness:t.floor.roughness,metalness:t.floor.metalness,side:v.DoubleSide}),o=new v.Mesh(r,a);o.userData.id=`floor`,o.name=`floor`;let s=(t.environment?.sceneUp||Q).clone().normalize();o.quaternion.setFromUnitVectors(new v.Vector3(0,0,1),s),o.position.set(0,0,0),t.floor.receiveShadow&&t.render.enableShadows&&(o.receiveShadow=!0),e.add(o)}function Vt(e,t,n){if(n&&`emissive`in e){let n=e;n.emissive=t.clone(),n.emissiveIntensity=.6,n.color.lerp(t,.75),n.metalness=Math.min(n.metalness,.2),n.opacity<1&&(n.opacity=1,n.transparent=!1,n.depthWrite=!0);return}`color`in e&&(e.color=t.clone())}function Ht(e,t,n,r){let i=new Set,a=new Map,o=null,s=null,l=null,u=new v.Raycaster,d=new v.Vector2,f=new v.Vector2,p=()=>n.getActiveCamera(),h=e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0},g=()=>{let e=G(t);if(e.isEmpty()){c().warn(`No objects to fit to view`);return}n.frameBounds(e,!1)},_=typeof r.events.selectionColor==`string`?new v.Color(r.events.selectionColor):r.events.selectionColor instanceof v.Color?r.events.selectionColor:new v.Color(`#ff0000`),y=()=>{o&&(o(),o=null,l?.dispose(),l=null),i.forEach(e=>{let n=e;if(a.has(e)){let r=a.get(e),i=n.material;i instanceof v.Material?i.dispose():Array.isArray(i)&&i.forEach(e=>e.dispose()),n.material=r,a.delete(e);let o=e;for(;o.parent;)o=o.parent;o!==t&&(r instanceof v.Material?r.dispose():r.forEach(e=>e.dispose()))}}),i.clear(),s=null},b=(e,t)=>{if(t&&e instanceof v.Mesh){let n=m(e).clone();return Vt(n,_,!0),l=n,o=Re(e,t,n),!0}let n=e;if(!(n.material instanceof v.Material))return!1;let r=n.material.clone();return Vt(r,_,e instanceof v.Mesh),a.set(e,n.material),n.material=r,!0},x=null,S=-1,C=()=>{if(x===null||t.children.length!==S){let e=G(t);x=e.isEmpty()?1:e.getSize(new v.Vector3).length(),S=t.children.length}u.params.Points.threshold=x*.01},w=(n,r)=>{let i=e.getBoundingClientRect();d.x=(n-i.left)/i.width*2-1,d.y=-((r-i.top)/i.height)*2+1,C(),u.setFromCamera(d,p());for(let e of u.intersectObjects(t.children,!0))if(h(e.object)&&!me(e.object))return e;return null},T=e=>{f.set(e.clientX,e.clientY)},E=e=>{let t=new v.Vector2(e.clientX,e.clientY);if(f.distanceTo(t)>5)return;let n=w(e.clientX,e.clientY);if(!n){y(),r.events?.onBackgroundClicked?.({x:d.x,y:d.y});return}let a=n.object,o=Ie(n),c=o?.index??null;i.has(a)&&c===s||(y(),i.add(a),s=c,b(a,o?.member??null),r.events?.onObjectSelected?.(a),o?r.events?.onMeshMetadataClicked?.({source:a.userData?.source,name:o.member.name,layer:o.member.layer,trackingKey:o.member.trackingKey,metadata:o.member.metadata}):a instanceof v.Mesh&&Object.keys(a.userData).length>0&&r.events?.onMeshMetadataClicked?.(a.userData))},D=e=>{let i=w(e.clientX,e.clientY);if(!i){r.events?.enableDoubleClickZoom&&n.frameBounds(G(t),!0);return}let a=i.object;if(r.events?.onMeshDoubleClicked?.(a),!r.events?.enableDoubleClickZoom)return;let o=Ie(i),s=o&&a instanceof v.Mesh?Le(a,o.member):new v.Box3().setFromObject(a);s.isEmpty()||n.frameBounds(s,!0)},O=e=>{if(r.events?.enableKeyboardControls)switch(e.key.toLowerCase()){case`f`:e.preventDefault(),g();break;case`escape`:e.preventDefault(),y();break;case` `:e.preventDefault(),g()}};return r.events?.enableClickToFocus&&(e.addEventListener(`mousedown`,T),e.addEventListener(`click`,E),e.addEventListener(`dblclick`,D)),r.events?.enableKeyboardControls&&(e.setAttribute(`tabindex`,`0`),e.addEventListener(`keydown`,O)),{dispose:()=>{e.removeEventListener(`mousedown`,T),e.removeEventListener(`click`,E),e.removeEventListener(`dblclick`,D),e.removeEventListener(`keydown`,O),y()},fitToView:g,clearSelection:y}}function Ut(e,t){let n=new v.AmbientLight(t.lighting.ambientLightColor,t.lighting.ambientLightIntensity);e.add(n);let r=null;if(t.lighting.enableHemisphereLight){r=new v.HemisphereLight(t.lighting.hemisphereSkyColor,t.lighting.hemisphereGroundColor,t.lighting.hemisphereIntensity);let n=t.environment.sceneUp??Q;r.position.copy(n),e.add(r)}if(!t.lighting.enableSunlight)return{ambient:n,hemisphere:r,sun:null};let i=new v.DirectionalLight(t.lighting.sunlightColor??16777215,t.lighting.sunlightIntensity),a=t.lighting.sunlightPosition;return a&&i.position.set(a.x,a.y,a.z),t.render.enableShadows?(i.castShadow=!0,i.shadow.mapSize.width=t.render.shadowMapSize||2048,i.shadow.mapSize.height=t.render.shadowMapSize||2048,i.shadow.bias=-1e-4,i.shadow.normalBias=.02,i.shadow.radius=4,e.add(i),e.add(i.target),{ambient:n,hemisphere:r,sun:i}):(e.add(i),{ambient:n,hemisphere:r,sun:null})}function Wt(e,t){if(t.isEmpty())return;let n=t.getCenter(new v.Vector3),r=t.getSize(new v.Vector3).length()*.5*1.2,i=e.shadow.camera;i.left=-r,i.right=r,i.top=r,i.bottom=-r,e.target.position.copy(n),e.target.updateMatrixWorld();let a=e.position.distanceTo(n);i.near=Math.max(r*.01,a-r),i.far=a+r,i.updateProjectionMatrix()}function Gt(e,t,n){let r=new v.WebGLRenderer({antialias:t.render.antialias,canvas:e,alpha:!0,powerPreference:`high-performance`,preserveDrawingBuffer:t.render.preserveDrawingBuffer,logarithmicDepthBuffer:!1}),i=e.parentElement,a=i?i.clientWidth:window.innerWidth,o=i?i.clientHeight:window.innerHeight;return i&&(e.style.width=`100%`,e.style.height=`100%`,e.style.display=`block`),r.setSize(a,o,!1),r.setPixelRatio(n),t.render.enableShadows&&(r.shadowMap.enabled=!0,r.shadowMap.type=v.VSMShadowMap),r.toneMapping=t.render.toneMapping,r.toneMappingExposure=t.render.toneMappingExposure??1,r.outputColorSpace=v.SRGBColorSpace,r.sortObjects=!0,r}const Kt=function(e,t){let n=wt(t||{}),r=n.environment?.sceneUp||Q,i=n.render.pixelRatio??Math.min(window.devicePixelRatio,2),a=jt(n),o=At(n,e);o.up.copy(r);let s=Gt(e,n,i);l(s.capabilities.getMaxAnisotropy()),t?.onMaxAnisotropy?.(s.capabilities.getMaxAnisotropy());let c=Rt(o,e,n),u=ve({scene:a,perspective:o,controls:c,onActiveCameraChange:()=>{},up:r}),f=()=>u.getActiveCamera(),p=!1;zt(a,s,n,()=>p);let m=Ut(a,n),h=m.sun,g=()=>{h&&Wt(h,G(a))};n.floor?.enabled&&Bt(a,n);let _=n.floor?.enabled?a.children.find(e=>e.userData.id===`floor`)??null:null,y=n.grid.enabled?it({cellSize:n.grid.cellSize,majorEvery:n.grid.majorEvery,cellColor:n.grid.cellColor,majorColor:n.grid.majorColor,fadeDistance:n.grid.fadeDistance,plane:n.grid.plane}):null;y&&a.add(y.object);let b=()=>{y&&y.fitToContent(G(a))},x=n.gizmo.enabled?St({camera:o,domElement:e,controller:u}):null,S=n.grid.plane??ue(r),C=new v.Vector3(+(S===`x`),+(S===`y`),+(S===`z`)),w=r.clone().normalize(),T=n.camera.dynamicNear?mt({camera:o,scene:a,groundNormals:()=>{let e=[];return y?.object.visible&&e.push(C),n.floor.enabled&&_?.visible&&e.push(w),e}}):null,E=at(e.parentElement??e,a),D=n.measure.enabled?ft({canvas:e,scene:a,getActiveCamera:f,labelLayer:E,options:{snapPixels:n.measure.snapPixels,color:n.measure.color,labelClassName:n.measure.labelClassName,displayUnit:n.measure.displayUnit,format:n.measure.format}}):null,O=n.events.enableEventHandlers===!1?{dispose:()=>{},fitToView:()=>{},clearSelection:()=>{}}:Ht(e,a,u,n),k=bt();D&&k.register({id:`measure`,tool:D,priority:0}),x&&k.register({id:`gizmo`,tool:x,priority:-100});let A=0,j=0,M=e=>{A=e.clientX,j=e.clientY},ee=e=>Math.hypot(e.clientX-A,e.clientY-j)>5,N=e=>{ee(e)||k.handleClick(e)&&e.stopImmediatePropagation()};e.addEventListener(`mousedown`,M,{capture:!0}),e.addEventListener(`click`,N,{capture:!0});let P=e=>k.handleMove(e);e.addEventListener(`mousemove`,P,{passive:!0});let F=()=>{},te=(e,t)=>{tt(e,{color:n.edges.color,darken:n.edges.darken,width:n.edges.width,thresholdAngle:n.edges.thresholdAngle,distanceFade:n.edges.distanceFade,maxTriangles:n.edges.maxTriangles,maxSegments:n.edges.maxSegments,maxOverlays:n.edges.maxOverlays,...t}).then(()=>{ne(e),F()})},ne=e=>{if(n.edges.screenSpaceFallback===!1)return;let t=!1;e.traverse(e=>{let n=e.userData?.edgesSkipped;(n===`triangle-cap`||n===`overlay-budget`)&&(t=!0)}),B.setEdgeFallback(t)},I=e=>{nt(e),B.setEdgeFallback(!1),F()},R=e.parentElement,z=()=>R?{width:R.clientWidth,height:R.clientHeight}:{width:window.innerWidth,height:window.innerHeight},B=Lt({renderer:s,scene:a,getActiveCamera:f,getCanvasSize:z,pixelRatio:i,config:n,requestRender:()=>F()});B.sync();let V=kt({scene:a,renderer:s,lights:m,config:n,pipeline:B,requestRender:()=>F()}),{animate:ae,dispose:oe,invalidate:H,renderNow:U}=Ct(s,a,o,f,u,c,z,i,n.events.onFrame,y,x,()=>B.get(),E,T,n.render.onDemand??!0);return F=H,ae(),a.up.set(r.x,r.y,r.z),g(),b(),{scene:a,camera:o,controls:c,renderer:s,cameraController:u,grid:y,gizmo:x,measureTool:D,labelLayer:E,tools:k,applyEdges:te,clearEdges:I,invalidate:H,captureImage:(e=`image/png`,t)=>(U(),new Promise(n=>s.domElement.toBlob(n,e,t))),setAmbientOcclusion:B.setAmbientOcclusion,setLook:V.setLook,setFillLights:V.setFillLights,setEnvironmentIntensity:V.setEnvironmentIntensity,setToneMappingExposure:V.setToneMappingExposure,setAoIntensity:V.setAoIntensity,getMaterialAppearance:V.getMaterialAppearance,updateShadowBounds:g,updateGridScale:b,dispose:()=>{p||(p=!0,oe(),O.dispose(),e.removeEventListener(`mousedown`,M,{capture:!0}),e.removeEventListener(`click`,N,{capture:!0}),e.removeEventListener(`mousemove`,P),D?.dispose(),E?.dispose(),x?.dispose(),y?.dispose(),B.dispose(),u.dispose(),c.dispose(),s.dispose(),s.forceContextLoss(),Mt(a))},fitToView:O.fitToView,clearSelection:O.clearSelection,addUserGeometry:(e,t)=>{e.userData.source=t===void 0?re:L(t),a.add(e),F()},removeUserGeometry:e=>{e.removeFromParent(),d(e),F()},clearUserGeometry:e=>{a.children.filter(t=>ie(t,e)).forEach(e=>{e.removeFromParent(),d(e)}),F()}}};export{u as DEFAULT_LOOK,a as ErrorCodes,te as LOOKS,t as LOOK_PRESETS,ne as SOURCE_COMPUTE,re as SOURCE_USER,i as VisualizationError,R as appIdFromSource,L as appSource,r as enableDebugLogging,c as getLogger,Kt as initThree,z as isHostOwned,ie as isOwnedBy,n as materialAppearanceForLook,lt as pickThreshold,xt as pointerToNdc,s as setLogger,dt as snapToVertex,de as updateScene};
107
+ `};var Bt=class extends N{camera;scene;normalMaterial;edgeMaterial;fsQuad;normalTarget=null;width;height;constructor(e,t,n,r,i={}){super(),this.scene=e,this.camera=t,this.width=Math.max(1,n),this.height=Math.max(1,r),this.normalMaterial=new y.MeshNormalMaterial,this.normalMaterial.blending=y.NoBlending,this.edgeMaterial=new y.ShaderMaterial({uniforms:y.UniformsUtils.clone(zt.uniforms),vertexShader:zt.vertexShader,fragmentShader:zt.fragmentShader});let a=this.edgeMaterial.uniforms;a.uColor.value=new y.Color(i.color??2236962),a.uOpacity.value=i.opacity??1,a.uNormalThreshold.value=i.normalThreshold??.4,a.uDepthThreshold.value=i.depthThreshold??.02,a.uThickness.value=i.thickness??1,this.fsQuad=new te(this.edgeMaterial),this.needsSwap=!0}acquireNormalTarget(){if(!this.normalTarget){let e=new y.DepthTexture(this.width,this.height);this.normalTarget=new y.WebGLRenderTarget(this.width,this.height,{minFilter:y.NearestFilter,magFilter:y.NearestFilter,depthTexture:e})}return this.normalTarget}setSize(e,t){this.width=Math.max(1,e),this.height=Math.max(1,t),this.normalTarget?.setSize(this.width,this.height)}render(e,t,n){let r=this.acquireNormalTarget(),i=e.getRenderTarget(),a=e.autoClear,o=e.getClearColor(new y.Color),s=e.getClearAlpha(),c=this.scene.overrideMaterial;e.setRenderTarget(r),e.setClearColor(7829503,1),e.autoClear=!0,this.scene.overrideMaterial=this.normalMaterial,e.render(this.scene,this.camera),this.scene.overrideMaterial=c,e.setClearColor(o,s),e.autoClear=a;let l=this.edgeMaterial.uniforms;l.tDiffuse.value=n.texture,l.tNormal.value=r.texture,l.tDepth.value=r.depthTexture,l.uResolution.value.set(this.width,this.height);let u=this.camera;l.uPerspective.value=+!!u.isPerspectiveCamera,l.uNear.value=this.camera.near??.1,l.uFar.value=this.camera.far??1e3,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e),e.setRenderTarget(i)}dispose(){this.normalTarget?.dispose(),this.normalMaterial.dispose(),this.edgeMaterial.dispose(),this.fsQuad.dispose()}};function Vt(e){return e>=2?0:4}function Ht(e,t,n,r,i,a){let o=new y.WebGLRenderTarget(r,i,{type:y.HalfFloatType}),s=new k(e,o);s.renderTarget2.samples=0;let c=e=>{s.readBuffer=o,s.writeBuffer=s.renderTarget2,s.render(e)},l=new A(t,n);s.addPass(l);let u=null;(a.ambientOcclusion??!0)&&(u=new j(t,n,r,i),u.blendIntensity=a.aoIntensity??1,u.updateGtaoMaterial({screenSpaceRadius:!0}),s.addPass(u));let d=new Bt(t,n,r,i,typeof a.edgeDetection==`object`?a.edgeDetection:{});d.enabled=!!a.edgeDetection,s.addPass(d);let f=new M;s.addPass(f);let p=new ee;s.addPass(p),e.toneMapping=a.toneMapping,e.toneMappingExposure=a.toneMappingExposure;let m=a.aoPixelRatio??1,h=1;if(u){let e=u.setSize.bind(u);u.setSize=(t,n)=>e(Math.max(1,Math.round(t*h)),Math.max(1,Math.round(n*h)))}let g=e=>{h=Math.min(e,m)/e;let t=Vt(e);o.samples!==t&&(o.samples=t,o.dispose()),s.setPixelRatio(e)};return g(e.getPixelRatio()),s.setSize(r,i),{render:c,setSize:(e,t,n)=>{g(n),s.setSize(e,t)},setCamera:e=>{if(l.camera=e,d.camera=e,!u)return;u.camera=e;let t=+!!e.isPerspectiveCamera;u.gtaoMaterial.defines.PERSPECTIVE_CAMERA!==t&&(u.gtaoMaterial.defines.PERSPECTIVE_CAMERA=t,u.gtaoMaterial.needsUpdate=!0)},setEdgeDetection:e=>{d.enabled=e},edgeDetectionEnabled:()=>d.enabled,dispose:()=>{s.dispose(),u?.dispose(),d.dispose(),f.dispose(),p.dispose()}}}function Ut(e){let{renderer:t,scene:n,getActiveCamera:r,getCanvasSize:i,pixelRatio:a,config:o,requestRender:s}=e,c=null,l=!!o.render.ambientOcclusion,u=!1,d=!1,f=e=>{let{width:s,height:c}=i(),l=Ht(t,n,r(),Math.max(1,s),Math.max(1,c),{toneMapping:o.render.toneMapping??y.NeutralToneMapping,toneMappingExposure:o.render.toneMappingExposure??1,ambientOcclusion:e,aoIntensity:o.render.aoIntensity,aoPixelRatio:o.render.aoPixelRatio,edgeDetection:!1});return l.setSize(Math.max(1,s),Math.max(1,c),a),l},p=()=>{l||u?(c&&d===l||(c?.dispose(),c=f(l),d=l),c.setEdgeDetection(u),s()):(c?.dispose(),c=null,s())};return{get:()=>c,sync:p,rebuild:()=>{c?.dispose(),c=null,p()},setAmbientOcclusion:e=>{l=e,p()},setEdgeFallback:e=>{e!==u&&(u=e,p())},isEdgeFallbackActive:()=>u,dispose:()=>{c?.dispose(),c=null}}}function Wt(e,t,n){let r=new P(e,t),i=n.camera.target;return i&&r.target.set(i.x,i.y,i.z),r.enableDamping=n.controls.enableDamping||!1,r.dampingFactor=n.controls.dampingFactor||.05,r.autoRotate=n.controls.autoRotate||!1,r.autoRotateSpeed=n.controls.autoRotateSpeed||.5,r.enableZoom=n.controls.enableZoom??!0,r.enablePan=n.controls.enablePan??!0,r.minDistance=n.controls.minDistance||.001,r.maxDistance=n.controls.maxDistance||1/0,r.screenSpacePanning=!1,r.maxPolarAngle=Math.PI,r.update(),r}function Gt(e,t,n,r){n.environment.enableEnvironmentLighting?(se(e,t,de(n.environment.sceneUp??Q)),new ne().load(n.environment.hdrPath||`/baseHDR.hdr`,function(i){if(r()){i.dispose();return}if(!i?.image){c().warn(`HDR loaded without image data; skipping environment map.`),i?.dispose(),n.events.onReady?.();return}i.mapping=y.EquirectangularReflectionMapping;let a=new y.PMREMGenerator(t);a.compileEquirectangularShader();let o=a.fromEquirectangular(i).texture;a.dispose(),e.environment=o,e.environmentIntensity=n.environment.environmentIntensity??1;let s=de(n.environment.sceneUp??Q);e.environmentRotation.copy(s),n.environment.showEnvironment?(e.background=i,e.backgroundRotation.copy(s)):i.dispose(),n.events.onReady?.()},void 0,function(e){r()||(c().warn(`HDR texture could not be loaded, falling back to basic lighting:`,e),n.events.onReady?.())})):n.events.onReady?.()}function Kt(e,t){let n=t.floor.size,r=new y.PlaneGeometry(n,n),i=typeof t.floor.color==`string`?new y.Color(t.floor.color):t.floor.color,a=new y.MeshStandardMaterial({color:i,roughness:t.floor.roughness,metalness:t.floor.metalness,side:y.DoubleSide}),o=new y.Mesh(r,a);o.userData.id=`floor`,o.name=`floor`;let s=(t.environment?.sceneUp||Q).clone().normalize();o.quaternion.setFromUnitVectors(new y.Vector3(0,0,1),s),o.position.set(0,0,0),t.floor.receiveShadow&&t.render.enableShadows&&(o.receiveShadow=!0),e.add(o)}function qt(e,t,n){if(n&&`emissive`in e){let n=e;n.emissive=t.clone(),n.emissiveIntensity=.6,n.color.lerp(t,.75),n.metalness=Math.min(n.metalness,.2),n.opacity<1&&(n.opacity=1,n.transparent=!1,n.depthWrite=!0)}else`color`in e&&(e.color=t.clone())}function Jt(e,t,n,r){let i=/* @__PURE__ */ new Set,a=/* @__PURE__ */ new Map,o=null,s=null,l=null,u=new y.Raycaster,d=new y.Vector2,f=new y.Vector2,p=()=>n.getActiveCamera(),m=e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0},g=()=>{let e=W(t);e.isEmpty()?c().warn(`No objects to fit to view`):n.frameBounds(e,!1)},_=typeof r.events.selectionColor==`string`?new y.Color(r.events.selectionColor):r.events.selectionColor instanceof y.Color?r.events.selectionColor:new y.Color(`#ff0000`),v=()=>{o&&(o(),o=null,l?.dispose(),l=null),i.forEach(e=>{let n=e;if(a.has(e)){let r=a.get(e),i=n.material;i instanceof y.Material?i.dispose():Array.isArray(i)&&i.forEach(e=>e.dispose()),n.material=r,a.delete(e);let o=e;for(;o.parent;)o=o.parent;o!==t&&(r instanceof y.Material?r.dispose():r.forEach(e=>e.dispose()))}}),i.clear(),s=null},b=(e,t)=>{if(t&&e instanceof y.Mesh){let n=h(e).clone();return qt(n,_,!0),l=n,o=Ue(e,t,n),!0}let n=e;if(!(n.material instanceof y.Material))return!1;let r=n.material.clone();return qt(r,_,e instanceof y.Mesh),a.set(e,n.material),n.material=r,!0},x=null,S=-1,C=()=>{if(x===null||t.children.length!==S){let e=W(t);x=e.isEmpty()?1:e.getSize(new y.Vector3).length(),S=t.children.length}u.params.Points.threshold=x*.01},w=(n,r)=>{let i=e.getBoundingClientRect();d.x=(n-i.left)/i.width*2-1,d.y=-((r-i.top)/i.height)*2+1,C(),u.setFromCamera(d,p());for(let e of u.intersectObjects(t.children,!0))if(m(e.object)&&!ge(e.object))return e;return null},T=e=>{f.set(e.clientX,e.clientY)},E=e=>{let t=new y.Vector2(e.clientX,e.clientY);if(f.distanceTo(t)>5)return;let n=w(e.clientX,e.clientY);if(!n){v(),r.events?.onBackgroundClicked?.({x:d.x,y:d.y});return}let a=n.object,o=Ve(n),c=o?.index??null;i.has(a)&&c===s||(v(),i.add(a),s=c,b(a,o?.member??null),r.events?.onObjectSelected?.(a),o?r.events?.onMeshMetadataClicked?.({source:a.userData?.source,name:o.member.name,layer:o.member.layer,trackingKey:o.member.trackingKey,metadata:o.member.metadata}):a instanceof y.Mesh&&Object.keys(a.userData).length>0&&r.events?.onMeshMetadataClicked?.(a.userData))},D=e=>{let i=w(e.clientX,e.clientY);if(!i){r.events?.enableDoubleClickZoom&&n.frameBounds(W(t),!0);return}let a=i.object;if(r.events?.onMeshDoubleClicked?.(a),!r.events?.enableDoubleClickZoom)return;let o=Ve(i),s=o&&a instanceof y.Mesh?He(a,o.member):new y.Box3().setFromObject(a);s.isEmpty()||n.frameBounds(s,!0)},O=e=>{if(r.events?.enableKeyboardControls)switch(e.key.toLowerCase()){case`f`:e.preventDefault(),g();break;case`escape`:e.preventDefault(),v();break;case` `:e.preventDefault(),g()}};return r.events?.enableClickToFocus&&(e.addEventListener(`mousedown`,T),e.addEventListener(`click`,E),e.addEventListener(`dblclick`,D)),r.events?.enableKeyboardControls&&(e.setAttribute(`tabindex`,`0`),e.addEventListener(`keydown`,O)),{dispose:()=>{e.removeEventListener(`mousedown`,T),e.removeEventListener(`click`,E),e.removeEventListener(`dblclick`,D),e.removeEventListener(`keydown`,O),v()},fitToView:g,clearSelection:v}}function Yt(e,t){let n=new y.AmbientLight(t.lighting.ambientLightColor,t.lighting.ambientLightIntensity);e.add(n);let r=null;if(t.lighting.enableHemisphereLight){r=new y.HemisphereLight(t.lighting.hemisphereSkyColor,t.lighting.hemisphereGroundColor,t.lighting.hemisphereIntensity);let n=t.environment.sceneUp??Q;r.position.copy(n),e.add(r)}if(!t.lighting.enableSunlight)return{ambient:n,hemisphere:r,sun:null};let i=new y.DirectionalLight(t.lighting.sunlightColor??16777215,t.lighting.sunlightIntensity),a=t.lighting.sunlightPosition;return a&&i.position.set(a.x,a.y,a.z),t.render.enableShadows?(i.castShadow=!0,i.shadow.mapSize.width=t.render.shadowMapSize||2048,i.shadow.mapSize.height=t.render.shadowMapSize||2048,i.shadow.bias=-1e-4,i.shadow.normalBias=.02,i.shadow.radius=4,e.add(i),e.add(i.target),{ambient:n,hemisphere:r,sun:i}):(e.add(i),{ambient:n,hemisphere:r,sun:null})}function Xt(e,t){if(t.isEmpty())return;let n=t.getCenter(new y.Vector3),r=t.getSize(new y.Vector3).length()*.5*1.2,i=e.shadow.camera;i.left=-r,i.right=r,i.top=r,i.bottom=-r,e.target.position.copy(n),e.target.updateMatrixWorld();let a=e.position.distanceTo(n);i.near=Math.max(r*.01,a-r),i.far=a+r,i.updateProjectionMatrix()}function Zt(e,t,n){let r=new y.WebGLRenderer({antialias:t.render.antialias,canvas:e,alpha:!0,powerPreference:`high-performance`,preserveDrawingBuffer:t.render.preserveDrawingBuffer,logarithmicDepthBuffer:!1}),i=e.parentElement,a=i?i.clientWidth:window.innerWidth,o=i?i.clientHeight:window.innerHeight;return i&&(e.style.width=`100%`,e.style.height=`100%`,e.style.display=`block`),r.setSize(a,o,!1),r.setPixelRatio(n),t.render.enableShadows&&(r.shadowMap.enabled=!0,r.shadowMap.type=y.VSMShadowMap),r.toneMapping=t.render.toneMapping,r.toneMappingExposure=t.render.toneMappingExposure??1,r.outputColorSpace=y.SRGBColorSpace,r.sortObjects=!0,r}const Qt=function(e,t){let n=At(t||{}),r=n.environment?.sceneUp||Q,i=n.render.pixelRatio??Math.min(window.devicePixelRatio,2),a=Lt(n),o=It(n,e);o.up.copy(r);let s=Zt(e,n,i);l(s.capabilities.getMaxAnisotropy()),t?.onMaxAnisotropy?.(s.capabilities.getMaxAnisotropy());let c=Wt(o,e,n),u=xe({scene:a,perspective:o,controls:c,onActiveCameraChange:()=>{},up:r}),f=()=>u.getActiveCamera(),p=!1;Gt(a,s,n,()=>p);let m=Yt(a,n),h=m.sun,g=()=>{h&&Xt(h,W(a))};n.floor?.enabled&&Kt(a,n);let _=n.floor?.enabled?a.children.find(e=>e.userData.id===`floor`)??null:null,v=n.grid.enabled?ut({cellSize:n.grid.cellSize,majorEvery:n.grid.majorEvery,cellColor:n.grid.cellColor,majorColor:n.grid.majorColor,fadeDistance:n.grid.fadeDistance,plane:n.grid.plane}):null;v&&a.add(v.object);let b=()=>{v&&v.fitToContent(W(a))},x=n.gizmo.enabled?Ot({camera:o,domElement:e,controller:u}):null,S=n.grid.plane??fe(r),C=new y.Vector3(+(S===`x`),+(S===`y`),+(S===`z`)),w=r.clone().normalize(),T=n.camera.dynamicNear?bt({camera:o,scene:a,groundNormals:()=>{let e=[];return v?.object.visible&&e.push(C),n.floor.enabled&&_?.visible&&e.push(w),e}}):null,E=dt(e.parentElement??e,a),D=n.measure.enabled?vt({canvas:e,scene:a,getActiveCamera:f,labelLayer:E,options:{snapPixels:n.measure.snapPixels,color:n.measure.color,labelClassName:n.measure.labelClassName,displayUnit:n.measure.displayUnit,format:n.measure.format}}):null,O=n.events.enableEventHandlers===!1?{dispose:()=>{},fitToView:()=>{},clearSelection:()=>{}}:Jt(e,a,u,n),k=Et();D&&k.register({id:`measure`,tool:D,priority:0}),x&&k.register({id:`gizmo`,tool:x,priority:-100});let A=0,j=0,M=e=>{A=e.clientX,j=e.clientY},ee=e=>Math.hypot(e.clientX-A,e.clientY-j)>5,te=e=>{ee(e)||k.handleClick(e)&&e.stopImmediatePropagation()};e.addEventListener(`mousedown`,M,{capture:!0}),e.addEventListener(`click`,te,{capture:!0});let N=e=>k.handleMove(e);e.addEventListener(`mousemove`,N,{passive:!0});let P=()=>{},ne=(e,t)=>{st(e,{color:n.edges.color,darken:n.edges.darken,width:n.edges.width,thresholdAngle:n.edges.thresholdAngle,distanceFade:n.edges.distanceFade,maxTriangles:n.edges.maxTriangles,maxSegments:n.edges.maxSegments,maxOverlays:n.edges.maxOverlays,...t}).then(()=>{re(e),P()})},re=e=>{if(n.edges.screenSpaceFallback===!1)return;let t=!1;e.traverse(e=>{let n=e.userData?.edgesSkipped;(n===`triangle-cap`||n===`overlay-budget`)&&(t=!0)}),R.setEdgeFallback(t)},ie=e=>{ct(e),R.setEdgeFallback(!1),P()},F=e.parentElement,L=()=>F?{width:F.clientWidth,height:F.clientHeight}:{width:window.innerWidth,height:window.innerHeight},R=Ut({renderer:s,scene:a,getActiveCamera:f,getCanvasSize:L,pixelRatio:i,config:n,requestRender:()=>P()});R.sync();let z=Ft({scene:a,renderer:s,lights:m,config:n,pipeline:R,requestRender:()=>P()}),{animate:se,dispose:ce,invalidate:B,renderNow:V}=kt(s,a,o,f,u,c,L,i,n.events.onFrame,v,x,()=>R.get(),E,T,n.render.onDemand??!0);return P=B,se(),a.up.set(r.x,r.y,r.z),g(),b(),{scene:a,camera:o,controls:c,renderer:s,cameraController:u,grid:v,gizmo:x,measureTool:D,labelLayer:E,tools:k,applyEdges:ne,clearEdges:ie,invalidate:B,captureImage:(e=`image/png`,t)=>(V(),new Promise(n=>s.domElement.toBlob(n,e,t))),setAmbientOcclusion:R.setAmbientOcclusion,setLook:z.setLook,setFillLights:z.setFillLights,setEnvironmentIntensity:z.setEnvironmentIntensity,setToneMappingExposure:z.setToneMappingExposure,setAoIntensity:z.setAoIntensity,getMaterialAppearance:z.getMaterialAppearance,updateShadowBounds:g,updateGridScale:b,dispose:()=>{p||(p=!0,ce(),O.dispose(),e.removeEventListener(`mousedown`,M,{capture:!0}),e.removeEventListener(`click`,te,{capture:!0}),e.removeEventListener(`mousemove`,N),D?.dispose(),E?.dispose(),x?.dispose(),v?.dispose(),R.dispose(),u.dispose(),c.dispose(),s.dispose(),s.forceContextLoss(),Rt(a))},fitToView:O.fitToView,clearSelection:O.clearSelection,addUserGeometry:(e,t)=>{e.userData.source=t===void 0?ae:I(t),a.add(e),P()},removeUserGeometry:e=>{e.removeFromParent(),d(e),P()},clearUserGeometry:e=>{a.children.filter(t=>oe(t,e)).forEach(e=>{e.removeFromParent(),d(e)}),P()}}};export{u as DEFAULT_LOOK,a as ErrorCodes,re as LOOKS,t as LOOK_PRESETS,ie as SOURCE_COMPUTE,ae as SOURCE_USER,i as VisualizationError,L as appIdFromSource,I as appSource,r as enableDebugLogging,c as getLogger,Qt as initThree,R as isHostOwned,oe as isOwnedBy,n as materialAppearanceForLook,ht as pickThreshold,Dt as pointerToNdc,s as setLogger,_t as snapToVertex,pe as updateScene};
108
108
  //# sourceMappingURL=render.js.map