@selvajs/visualization 1.6.0-beta.5 → 1.6.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/render.d.cts CHANGED
@@ -151,7 +151,7 @@ type EdgesConfig = {
151
151
  thresholdAngle?: number;
152
152
  /** Default true. */
153
153
  distanceFade?: boolean;
154
- /** Default 4M. */
154
+ /** Default 8M. */
155
155
  maxTriangles?: number;
156
156
  /** Default 2M. */
157
157
  maxSegments?: number;
@@ -305,9 +305,9 @@ interface EdgeOptions {
305
305
  */
306
306
  distanceFade?: boolean;
307
307
  /**
308
- * Skip meshes above this triangle count entirely (default 4M) — extraction time is linear in
309
- * triangles, and past this bound even the worker path burns seconds for a look the screen-space
310
- * fallback approximates at constant cost. Skipped meshes are tagged
308
+ * Skip meshes above this triangle count entirely (default 8M). Extraction time and memory are
309
+ * linear in triangles: 8M is about 0.7 s in the worker and a few hundred MB of scratch, and past it
310
+ * the screen-space fallback approximates the look at constant cost. Skipped meshes are tagged
311
311
  * `userData.edgesSkipped = 'triangle-cap'`.
312
312
  */
313
313
  maxTriangles?: number;
@@ -465,6 +465,11 @@ interface ViewGizmo {
465
465
  isVisible(): boolean;
466
466
  dispose(): void;
467
467
  }
468
+ /** One thing to select: a whole object, or one member of a merged mesh. */
469
+ interface SelectionTarget {
470
+ object: THREE.Object3D;
471
+ memberIndex: number | null;
472
+ }
468
473
  interface ThreeViewer {
469
474
  scene: THREE.Scene;
470
475
  camera: THREE.PerspectiveCamera;
@@ -540,6 +545,16 @@ interface ThreeViewer {
540
545
  dispose: () => void;
541
546
  fitToView: () => void;
542
547
  clearSelection: () => void;
548
+ /**
549
+ * Selects from outside the viewport (an outliner's rows), replacing any current selection and
550
+ * firing no events. `[]` drops a selection made here and leaves one made by a canvas click.
551
+ */
552
+ selectEntries: (targets: SelectionTarget[]) => void;
553
+ /**
554
+ * Outlines one object, or one member of a merged mesh, as a preview (an outliner row under the
555
+ * pointer). `null` clears it. Lines and points have no outline, so they tint instead.
556
+ */
557
+ setHover: (object: THREE.Object3D | null, memberIndex?: number | null) => void;
543
558
  /**
544
559
  * Adds host-owned geometry that survives `updateScene` solves and counts for fit-to-view.
545
560
  * Pass `appId` to scope it to one app (`userData.source = 'app:<id>'`) so `clearUserGeometry`
package/dist/render.d.ts CHANGED
@@ -151,7 +151,7 @@ type EdgesConfig = {
151
151
  thresholdAngle?: number;
152
152
  /** Default true. */
153
153
  distanceFade?: boolean;
154
- /** Default 4M. */
154
+ /** Default 8M. */
155
155
  maxTriangles?: number;
156
156
  /** Default 2M. */
157
157
  maxSegments?: number;
@@ -305,9 +305,9 @@ interface EdgeOptions {
305
305
  */
306
306
  distanceFade?: boolean;
307
307
  /**
308
- * Skip meshes above this triangle count entirely (default 4M) — extraction time is linear in
309
- * triangles, and past this bound even the worker path burns seconds for a look the screen-space
310
- * fallback approximates at constant cost. Skipped meshes are tagged
308
+ * Skip meshes above this triangle count entirely (default 8M). Extraction time and memory are
309
+ * linear in triangles: 8M is about 0.7 s in the worker and a few hundred MB of scratch, and past it
310
+ * the screen-space fallback approximates the look at constant cost. Skipped meshes are tagged
311
311
  * `userData.edgesSkipped = 'triangle-cap'`.
312
312
  */
313
313
  maxTriangles?: number;
@@ -465,6 +465,11 @@ interface ViewGizmo {
465
465
  isVisible(): boolean;
466
466
  dispose(): void;
467
467
  }
468
+ /** One thing to select: a whole object, or one member of a merged mesh. */
469
+ interface SelectionTarget {
470
+ object: THREE.Object3D;
471
+ memberIndex: number | null;
472
+ }
468
473
  interface ThreeViewer {
469
474
  scene: THREE.Scene;
470
475
  camera: THREE.PerspectiveCamera;
@@ -540,6 +545,16 @@ interface ThreeViewer {
540
545
  dispose: () => void;
541
546
  fitToView: () => void;
542
547
  clearSelection: () => void;
548
+ /**
549
+ * Selects from outside the viewport (an outliner's rows), replacing any current selection and
550
+ * firing no events. `[]` drops a selection made here and leaves one made by a canvas click.
551
+ */
552
+ selectEntries: (targets: SelectionTarget[]) => void;
553
+ /**
554
+ * Outlines one object, or one member of a merged mesh, as a preview (an outliner row under the
555
+ * pointer). `null` clears it. Lines and points have no outline, so they tint instead.
556
+ */
557
+ setHover: (object: THREE.Object3D | null, memberIndex?: number | null) => void;
543
558
  /**
544
559
  * Adds host-owned geometry that survives `updateScene` solves and counts for fit-to-view.
545
560
  * Pass `appId` to scope it to one app (`userData.source = 'app:<id>'`) so `clearUserGeometry`
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-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:`
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-U_8oQ5q9.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 N}from"three/addons/postprocessing/OutputPass.js";import{FullScreenQuad as P,Pass as ee}from"three/addons/postprocessing/Pass.js";import{OrbitControls as F}from"three/addons/controls/OrbitControls.js";import{HDRLoader as I}from"three/addons/loaders/HDRLoader.js";const te=[`technical`,`studio`,`showcase`,`arctic`,`xray`,`lineart`,`wireframe`],ne=`compute`,re=`user`,ie=`app:`;function L(e){return`${ie}${e}`}function R(e){return typeof e!=`string`||!e.startsWith(ie)?null:e.slice(4)||null}function z(e){let t=e.userData?.source;return t===`user`||R(t)!==null}function ae(e,t){return t===void 0?z(e):e.userData?.source===L(t)}const B=`selvaReflectionEnvironment`;function V(e,t,n){let r=new y.PMREMGenerator(t),i=new C,a=r.fromScene(i,.04).texture;i.dispose(),r.dispose(),oe(e,a,n)}function oe(e,t,n){let r={texture:t,rotation:n.clone()};e.userData[B]=r,H(e,e)}function se(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 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 U(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 ce(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 le(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 ue(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 de(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 fe(t,n,r,i,a){if(ve(t,ge(n)),n.length===0)return;n.forEach(e=>{t.add(e),H(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)>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(ce(r.up,e)),i.target.copy(s),i.update()}}const pe=/* @__PURE__ */ new Set([`grid`,`floor`,`label-layer`,`measure`]);function me(e){return typeof e.userData.id==`string`&&pe.has(e.userData.id)}function he(e){let t=e;for(;t;){if(me(t))return!0;t=t.parent}return!1}function G(e){e.updateMatrixWorld(!0);let t=new y.Box3;return e.traverse(e=>{let n=e;e.visible&&!he(e)&&n.geometry&&t.expandByObject(e)}),t}function ge(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 _e=/* @__PURE__ */ new Set([`floor`,`grid`,`label-layer`]);function ve(e,t=/* @__PURE__ */ new Set){let n=[],r=[];for(let t of e.children)_e.has(t.userData.id)||z(t)?n.push(t):r.push(t);e.children.length=0;for(let t of n)e.children.push(t);for(let n of r)d(n,{keepUploaded:t}),n.parent=null,n.dispatchEvent({type:`removed`}),e.dispatchEvent({type:`childremoved`,child:n})}function ye(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 be(e){let{scene:t,perspective:n,controls:r,onActiveCameraChange:i}=e,a=(e.up??n.up).clone().normalize(),o=ye(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=xe(i,a),g=e.clone().add(h.clone().multiplyScalar(m)),_=u();c===`orthographic`&&(s.zoom=1),f(),o?d=Ce(_,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 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 xe(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 Se=e=>1-(1-e)**3;function Ce(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=Se(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 we(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 Te(e){let t=new T;return t.setPositions(e),{geometry:t,segmentCount:e.length/6,edgeSpacing:we(e)}}function K(e,t,n){let r=1e4,i=Math.cos(Math.PI/180*n),a=e.length/3;if(a>=67108864)throw Error(`extractEdgeSegments: ${a} vertices exceeds 2^26 limit`);let o=new Float64Array(a),s=new Float64Array(a),c=new Float64Array(a);for(let t=0;t<a;t++)o[t]=Math.round(e[3*t]*r),s[t]=Math.round(e[3*t+1]*r),c[t]=Math.round(e[3*t+2]*r);let l=16;for(;l<a*2;)l<<=1;let u=l-1,d=new Int32Array(l).fill(-1),f=new Int32Array(a);for(let e=0;e<a;e++){let t=(Math.imul(o[e]|0,73856093)^Math.imul(s[e]|0,19349663)^Math.imul(c[e]|0,83492791))&u;for(;;){let n=d[t];if(n===-1){d[t]=e,f[e]=e;break}if(o[n]===o[e]&&s[n]===s[e]&&c[n]===c[e]){f[e]=n;break}t=t+1&u}}let p=/* @__PURE__ */ new Float32Array(6144),m=0,h=/* @__PURE__ */ new Uint32Array(1024),g=(t,n,r)=>{if(m+6>p.length){let e=new Float32Array(p.length*2);e.set(p),p=e;let t=new Uint32Array(p.length/6);t.set(h),h=t}h[m/6]=r,p[m++]=e[3*t],p[m++]=e[3*t+1],p[m++]=e[3*t+2],p[m++]=e[3*n],p[m++]=e[3*n+1],p[m++]=e[3*n+2]},_=(t?t.length:a)/3,v=new Int32Array(a+1);for(let e=0;e<_;e++){let n=f[t?t[3*e]:3*e],r=f[t?t[3*e+1]:3*e+1],i=f[t?t[3*e+2]:3*e+2];n!==r&&r!==i&&i!==n&&(v[n+1]++,v[r+1]++,v[i+1]++)}for(let e=0;e<a;e++)v[e+1]+=v[e];let y=new Int32Array(v[a]);{let e=v.slice(0,a);for(let n=0;n<_;n++){let r=f[t?t[3*n]:3*n],i=f[t?t[3*n+1]:3*n+1],a=f[t?t[3*n+2]:3*n+2];r!==i&&i!==a&&a!==r&&(y[e[r]++]=i,y[e[i]++]=a,y[e[a]++]=r)}}let b=new Int32Array(y.length).fill(-2),x=(e,t)=>{for(let n=v[e],r=v[e+1];n<r;n++)if(y[n]===t)return n;return-1},S=(e,n)=>t?t[3*e+n]:3*e+n,C=/* @__PURE__ */ new Float64Array(3),w=t=>{let n=S(t,0),r=S(t,1),i=S(t,2),a=e[3*i]-e[3*r],o=e[3*i+1]-e[3*r+1],s=e[3*i+2]-e[3*r+2],c=e[3*n]-e[3*r],l=e[3*n+1]-e[3*r+1],u=e[3*n+2]-e[3*r+2],d=o*u-s*l,f=s*c-a*u,p=a*l-o*c,m=d*d+f*f+p*p;if(m>0){let e=1/Math.sqrt(m);d*=e,f*=e,p*=e}else d=0,f=0,p=0;C[0]=d,C[1]=f,C[2]=p},T=0,E=new Uint32Array(Math.max(16,y.length>>1)),D=new Int32Array(E.length),O=()=>{let e=new Uint32Array(E.length*2);e.set(E),E=e;let t=new Int32Array(e.length);t.set(D),D=t};for(let e=0;e<_;e++){let t=S(e,0),n=S(e,1),r=S(e,2),a=f[t],o=f[n],s=f[r];if(a===o||o===s||s===a)continue;let c=!1,l=0,u=0,d=0;for(let f=0;f<3;f++){let p=f===0?a:f===1?o:s,m=f===0?o:f===1?s:a,h=x(m,p),_=h===-1?-2:b[h];if(_>=0)c||=(w(e),l=C[0],u=C[1],d=C[2],!0),w(Math.floor(E[_]/3)),l*C[0]+u*C[1]+d*C[2]<=i&&g(f===0?t:f===1?n:r,f===0?n:f===1?r:t,e),b[h]=-1;else{let t=x(p,m);if(b[t]===-2){T===E.length&&O();let n=T++;b[t]=n,E[n]=3*e+f,D[n]=t}}}}for(let e=0;e<T;e++){if(b[D[e]]!==e)continue;let t=E[e],n=Math.floor(t/3),r=t-3*n;g(S(n,r),S(n,r===2?0:r+1),n)}return{segments:p.slice(0,m),faces:h.slice(0,m/6)}}function Ee(){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 De=`edge-overlay`;function Oe(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??8e6,maxSegments:e.maxSegments??2e6,maxOverlays:e.maxOverlays??1500}}function ke(e){let t=e.getAttribute(`position`);return t?(e.index?e.index.count:t.count)/3:0}function Ae(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 je(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 Me(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 Ne=/* @__PURE__ */ new WeakMap,Pe={};function Fe(e,t){let n=Ne.get(e.positions)?.get(e.index??Pe)?.get(t);return n?.version===e.version?n.edges:void 0}function Ie(e,t,n){let r=Ne.get(e.positions);r||Ne.set(e.positions,r=/* @__PURE__ */ new WeakMap);let i=r.get(e.index??Pe);return i||r.set(e.index??Pe,i=/* @__PURE__ */ new Map),i.set(t,{version:e.version,edges:n}),n}function Le(e,t){let n=Ae(e);return n?Fe(n,t)??Ie(n,t,K(n.positions,n.index,t)):Me(e,t)}let q;const J=/* @__PURE__ */ new Map;let Re=1;function ze(){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([Ee()],{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(/* @__PURE__ */ Error(`edge extraction worker crashed`));J.clear(),t.terminate(),q=null},q=t}catch{q=null}return q}function Be(e,t,n){return new Promise((r,i)=>{let a=Re++;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 Ve=/* @__PURE__ */ new Map;function He(e,t){let n=Ae(e);if(!n||ke(e)<25e3)return Promise.resolve(Le(e,t));let r=Fe(n,t);if(r)return Promise.resolve(r);let i=je(n,t),a=Ve.get(i);if(a)return a;let o=ze();if(!o)return Promise.resolve(Le(e,t));let s=Be(o,n,t).catch(()=>K(n.positions,n.index,t)).then(e=>Ie(n,t,e)).finally(()=>{Ve.delete(i)});return Ve.set(i,s),s}function Y(e){let t=e.userData?.members;return Array.isArray(t)&&t.length>0?t:null}function Ue(e){let t=Y(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 We(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 Ge(e,t,n){return g(e,t,n),()=>v(e)}function Ke(e,t){let n=Y(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 qe(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 Je(e,t,n){let{segments:r,faces:i}=n;if(!i||!Y(t))return;let a,o=!1,s=()=>{let n=_(t);if(n.size===0&&!o||(a??=Ke(t,i),!a))return;let s=n.size===0?r:qe(r,a,n);e.geometry.dispose(),e.geometry=Te(s).geometry,o=n.size>0};s();let c=m(t,s);e.addEventListener(`removed`,c)}function Ye(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 Xe=class{options;byKey=/* @__PURE__ */ new Map;constructor(e){this.options=e}for(e,t){let n=this.options.forcedColor??Ye(e,this.options.darken),r=n.getHex()*2+ +!!t,i=this.byKey.get(r);return i||(i=Ze(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 Ze(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 Qe(e,t,n){let r=new w(e.geometry,t);return r.userData.kind=De,r.raycast=()=>{},n&&nt(r,e.edgeSpacing),r}const $e=new y.Vector3,et=new y.Vector3;function tt(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;$e.copy(r.center).applyMatrix4(e.matrixWorld);let a=et.setFromMatrixPosition(t.matrixWorld).distanceTo($e);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 nt(e,t){e.onBeforeRender=(n,r,i)=>{w.prototype.onBeforeRender.call(e,n);let a=e.material,o=t*tt(e,i,a.resolution.y);a.opacity=y.MathUtils.clamp((o-1)/3,0,1)}}function rt(e){return e.userData?.kind===De}function it(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&&(ke(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 at(e,t,n,r){let i=Te(t.segments),a=r.distanceFade&&i.segmentCount<=r.maxSegments,o=Qe(i,n.for(e,a),a);return e.add(o),Je(o,e,t),o}const ot=/* @__PURE__ */ new WeakMap;function st(e){return ot.get(e)??0}function ct(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}async function lt(e,t={}){let n=Oe(t),r=new Xe(n),i=st(e),a=[],o=it(e,n).map(async t=>{let o=await He(t.geometry,n.thresholdAngle);st(e)===i&&ct(t,e)&&(t.children.some(e=>e.userData?.kind===`edge-overlay`)||a.push(at(t,o,r,n)))});return await Promise.all(o),r.disposeUnused(a),a}function ut(e){ot.set(e,st(e)+1);let t=[];e.traverse(e=>{e instanceof w&&rt(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 dt(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 ft(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: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:`
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=dt(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 pt(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 mt=.015,ht={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 gt(e){let t=e&&ht[e]||ht.Meters;return e=>`${(e/t.metersPerUnit).toPrecision(3)} ${t.suffix}`}function _t(e,t){if(e.isOrthographicCamera){let t=e;return Math.abs(t.top-t.bottom)/(t.zoom||1)*mt}return((t?e.position.distanceTo(t):e.position.length())||1)*mt}function vt(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 yt(e,t,n,r){let i=e.point.clone(),a=e.object,o=vt(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 bt(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=gt(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=_t(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:yt(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 xt=[];function St({camera:e,scene:t,groundNormals:n=()=>xt}){let r=e.near,i=e.near,a=Ct();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 Ct(){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===Tt(r)&&a.index===i&&a.indexVersion===(i?.version??-1))return a;let o={...Dt(r,i,Et(t)),position:r,positionVersion:Tt(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,wt(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&&!me(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 wt(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 Tt(e){return e.isInterleavedBufferAttribute?e.data.version:e.version}function Et(e){let t=[];for(let n of Y(e)??[])n.indexStart!==void 0&&t.push(n.indexStart/3);return t.sort((e,t)=>e-t)}function Dt(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 Ot(){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 kt(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 At(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 jt(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m=!0,h){let g=null,_=performance.now(),v=!0,b=0,x=new y.Matrix4,S=new y.Matrix4,C=null,w=()=>{v=!0},T=e=>{e.updateMatrixWorld();let t=C!==e||!x.equals(e.matrixWorld)||!S.equals(e.projectionMatrix);return t&&(C=e,x.copy(e.matrixWorld),S.copy(e.projectionMatrix)),t},E=e.domElement,D=[`pointerdown`,`pointerup`,`wheel`];if(m)for(let e of D)E.addEventListener(e,w,{passive:!0});let O=()=>{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),w())},k=(n,r)=>{let i=d?.();i?(i.setCamera(n),i.render(r)):e.render(t,n),h&&h.render(n),f&&f.render(t,n),u&&u.render(e)},A=()=>{k(r(),0)},j=function(){g=requestAnimationFrame(j);let e=performance.now(),t=(e-_)/1e3;_=e,O(),(a.enableDamping||a.autoRotate)&&a.update(),l&&l.update(r().position),p&&p.update(),c?.(t);let n=r();if(m){if(!(v||T(n)||e-b>=500))return;v=!1,b=e}k(n,t)};return{animate:j,dispose:()=>{if(g!==null&&(cancelAnimationFrame(g),g=null),m)for(let e of D)E.removeEventListener(e,w)},invalidate:w,renderNow:A}}const X=new y.Vector3(0,0,1);function Mt(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||ce(e.environment?.sceneUp??X,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||le(e.environment?.sceneUp??X,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||X,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??de(e.environment?.sceneUp??X)},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 Z=`__selvaLookBaseline`;function Nt(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 Pt(e){let t=e[Z];t&&(Nt(e,t),delete e[Z])}function Ft(e,t){let n=e;t?(n[Z]?Nt(n,n[Z]):n[Z]={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):(Pt(n),n.needsUpdate=!0)}function It(e,t){if(t.materialOverride)return t.envMapIntensity;let n=e.userData[o];if(n!=null)return n;let r=e,i=r[Z]?.metalness??r.metalness??0;return f(t.envMapIntensity,i)}function Lt(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??X),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=It(e,n)),Ft(e,n.materialOverride)}),H(r,r),c()},getMaterialAppearance:()=>n(l)}}function Rt(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 zt(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 Bt(e,t){d(e,t),e.environment?.dispose(),se(e),e.background instanceof y.Texture&&e.background.dispose()}const Q={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,34 @@ 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 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};
107
+ `};var Vt=class extends ee{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(Q.uniforms),vertexShader:Q.vertexShader,fragmentShader:Q.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 P(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 Ht(e){return e>=2?0:4}function Ut(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 Vt(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 N;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=Ht(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 Wt(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=Ut(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 Gt(e,t,n){let r=new F(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 Kt(e,t,n,r){n.environment.enableEnvironmentLighting?(V(e,t,ue(n.environment.sceneUp??X)),new I().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=ue(n.environment.sceneUp??X);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 qt(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||X).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)}const Jt=`#f5a524`,Yt={vertexShader:`
108
+ varying vec2 vUv;
109
+ void main() {
110
+ vUv = uv;
111
+ gl_Position = vec4(position.xy, 0.0, 1.0);
112
+ }
113
+ `,fragmentShader:`
114
+ uniform sampler2D tMask;
115
+ uniform vec2 uTexel;
116
+ uniform float uRadius;
117
+ uniform vec3 uColor;
118
+ varying vec2 vUv;
119
+
120
+ const int DIRECTIONS = 16;
121
+ const float TAU = 6.2831853;
122
+
123
+ void main() {
124
+ if (texture2D(tMask, vUv).r > 0.5) discard;
125
+
126
+ float coverage = 0.0;
127
+ for (int i = 0; i < DIRECTIONS; i++) {
128
+ float angle = TAU * float(i) / float(DIRECTIONS);
129
+ vec2 offset = vec2(cos(angle), sin(angle)) * uRadius * uTexel;
130
+ coverage = max(coverage, texture2D(tMask, vUv + offset).r);
131
+ coverage = max(coverage, texture2D(tMask, vUv + offset * 0.5).r);
132
+ }
133
+ if (coverage <= 0.0) discard;
134
+ gl_FragColor = vec4(uColor, coverage);
135
+ }
136
+ `};function Xt(e){return e instanceof y.Mesh&&!(e instanceof y.InstancedMesh)&&!e.geometry.isInstancedBufferGeometry}function Zt(e){let t=new y.BufferGeometry,n=new y.MeshBasicMaterial({side:y.DoubleSide,toneMapped:!1}),r=new y.Mesh(t,n);r.frustumCulled=!1,r.matrixWorldAutoUpdate=!1;let i=new y.WebGLRenderTarget(1,1,{depthBuffer:!1}),a=new y.ShaderMaterial({...Yt,uniforms:{tMask:{value:i.texture},uTexel:{value:new y.Vector2},uRadius:{value:1},uColor:{value:new y.Color(Jt).convertLinearToSRGB()}},transparent:!0,depthTest:!1,depthWrite:!1,toneMapped:!1}),o=new P(a),s=null,c=null,l=new y.Vector2,u=new y.Color,d=()=>{s=null,c=null,t.deleteAttribute(`position`),t.setIndex(null)},f=(e,n)=>{if(d(),!e||!Xt(e))return!1;let i=e.geometry.getAttribute(`position`);if(!i)return!1;if(n===null)t.setDrawRange(0,1/0);else{let r=Y(e)?.[n];if(r?.indexStart==null||r.indexCount==null)return!1;t.setDrawRange(r.indexStart,r.indexCount)}return t.setAttribute(`position`,i),t.setIndex(e.geometry.getIndex()),e.updateWorldMatrix(!0,!1),r.matrixWorld.copy(e.matrixWorld),s=e,c=n,!0},p=()=>s?.visible?c===null||!_(s).has(c):!1;return{show:f,render:t=>{if(!p())return;e.getDrawingBufferSize(l),i.setSize(l.x,l.y),a.uniforms.uTexel.value.set(1/l.x,1/l.y),a.uniforms.uRadius.value=2*e.getPixelRatio();let n=e.autoClear,s=e.getClearAlpha();e.getClearColor(u),e.setRenderTarget(i),e.setClearColor(0,0),e.clear(),e.autoClear=!1,e.render(r,t),e.setRenderTarget(null),e.setClearColor(u,s),o.render(e),e.autoClear=n},dispose:()=>{d(),t.dispose(),n.dispose(),a.dispose(),o.dispose(),i.dispose()}}}function $(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 Qt(e,t,n,r){let i=/* @__PURE__ */ new Set,a=/* @__PURE__ */ new Map,o=[],s=null,l=!1,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=G(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=new y.Color(Jt),b=null,x=null,S=()=>{if(b&&x){let e=b.material;e instanceof y.Material&&e.dispose(),b.material=x}b=null,x=null},C=e=>{if(S(),!e||i.has(e))return;let t=e;if(!(t.material instanceof y.Material))return;let n=t.material.clone();$(n,v,e instanceof y.Mesh),b=t,x=t.material,t.material=n},w=()=>{for(let{restore:e,material:t}of o)e(),t.dispose();o.length=0,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,l=!1},T=(e,t)=>{if(t&&e instanceof y.Mesh){let n=h(e).clone();return $(n,_,!0),o.push({restore:Ge(e,t,n),material:n}),!0}let n=e;if(!(n.material instanceof y.Material))return!1;let r=n.material.clone();return $(r,_,e instanceof y.Mesh),a.set(e,n.material),n.material=r,!0},E=e=>{if(e.length===0&&!l)return;S(),w();let t=/* @__PURE__ */ new Map;for(let{object:n,memberIndex:r}of e){if(r===null){i.add(n),T(n,null);continue}let e=t.get(n);e||t.set(n,e=/* @__PURE__ */ new Set),e.add(r)}for(let[e,n]of t)i.add(e),T(e,n);l=e.length>0},D=null,O=-1,k=()=>{if(D===null||t.children.length!==O){let e=G(t);D=e.isEmpty()?1:e.getSize(new y.Vector3).length(),O=t.children.length}u.params.Points.threshold=D*.01},A=(n,r)=>{let i=e.getBoundingClientRect();d.x=(n-i.left)/i.width*2-1,d.y=-((r-i.top)/i.height)*2+1,k(),u.setFromCamera(d,p());for(let e of u.intersectObjects(t.children,!0))if(m(e.object)&&!he(e.object))return e;return null},j=e=>{f.set(e.clientX,e.clientY)},M=e=>{let t=new y.Vector2(e.clientX,e.clientY);if(f.distanceTo(t)>5)return;let n=A(e.clientX,e.clientY);if(!n){w(),r.events?.onBackgroundClicked?.({x:d.x,y:d.y});return}let a=n.object,o=Ue(n),c=o?.index??null;(l||!i.has(a)||c!==s)&&(S(),w(),i.add(a),s=c,T(a,o?/* @__PURE__ */ new Set([o.index]):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))},N=e=>{let i=A(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=Ue(i),s=o&&a instanceof y.Mesh?We(a,o.member):new y.Box3().setFromObject(a);s.isEmpty()||n.frameBounds(s,!0)},P=e=>{if(r.events?.enableKeyboardControls)switch(e.key.toLowerCase()){case`f`:e.preventDefault(),g();break;case`escape`:e.preventDefault(),w();break;case` `:e.preventDefault(),g()}};return r.events?.enableClickToFocus&&(e.addEventListener(`mousedown`,j),e.addEventListener(`click`,M),e.addEventListener(`dblclick`,N)),r.events?.enableKeyboardControls&&(e.setAttribute(`tabindex`,`0`),e.addEventListener(`keydown`,P)),{dispose:()=>{e.removeEventListener(`mousedown`,j),e.removeEventListener(`click`,M),e.removeEventListener(`dblclick`,N),e.removeEventListener(`keydown`,P),S(),w()},fitToView:g,clearSelection:w,selectEntries:E,setHoverTint:C}}function $t(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??X;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 en(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 tn(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 nn=function(e,t){let n=Mt(t||{}),r=n.environment?.sceneUp||X,i=n.render.pixelRatio??Math.min(window.devicePixelRatio,2),a=zt(n),o=Rt(n,e);o.up.copy(r);let s=tn(e,n,i);l(s.capabilities.getMaxAnisotropy()),t?.onMaxAnisotropy?.(s.capabilities.getMaxAnisotropy());let c=Gt(o,e,n),u=be({scene:a,perspective:o,controls:c,onActiveCameraChange:()=>{},up:r}),f=()=>u.getActiveCamera(),p=!1;Kt(a,s,n,()=>p);let m=$t(a,n),h=m.sun,g=()=>{h&&en(h,G(a))};n.floor?.enabled&&qt(a,n);let _=n.floor?.enabled?a.children.find(e=>e.userData.id===`floor`)??null:null,v=n.grid.enabled?ft({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(G(a))},x=n.gizmo.enabled?At({camera:o,domElement:e,controller:u}):null,S=n.grid.plane??de(r),C=new y.Vector3(+(S===`x`),+(S===`y`),+(S===`z`)),w=r.clone().normalize(),T=n.camera.dynamicNear?St({camera:o,scene:a,groundNormals:()=>{let e=[];return v?.object.visible&&e.push(C),n.floor.enabled&&_?.visible&&e.push(w),e}}):null,E=pt(e.parentElement??e,a),D=n.measure.enabled?bt({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:()=>{},selectEntries:()=>{},setHoverTint:()=>{}}:Qt(e,a,u,n),k=Zt(s),A=Ot();D&&A.register({id:`measure`,tool:D,priority:0}),x&&A.register({id:`gizmo`,tool:x,priority:-100});let j=0,M=0,N=e=>{j=e.clientX,M=e.clientY},P=e=>Math.hypot(e.clientX-j,e.clientY-M)>5,ee=e=>{P(e)||A.handleClick(e)&&e.stopImmediatePropagation()};e.addEventListener(`mousedown`,N,{capture:!0}),e.addEventListener(`click`,ee,{capture:!0});let F=e=>A.handleMove(e);e.addEventListener(`mousemove`,F,{passive:!0});let I=()=>{},te=(e,t)=>{lt(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),I()})},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)},ie=e=>{ut(e),B.setEdgeFallback(!1),I()},R=e.parentElement,z=()=>R?{width:R.clientWidth,height:R.clientHeight}:{width:window.innerWidth,height:window.innerHeight},B=Wt({renderer:s,scene:a,getActiveCamera:f,getCanvasSize:z,pixelRatio:i,config:n,requestRender:()=>I()});B.sync();let V=Lt({scene:a,renderer:s,lights:m,config:n,pipeline:B,requestRender:()=>I()}),{animate:oe,dispose:se,invalidate:H,renderNow:U}=jt(s,a,o,f,u,c,z,i,n.events.onFrame,v,x,()=>B.get(),E,T,n.render.onDemand??!0,k);return I=H,oe(),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:A,applyEdges:te,clearEdges:ie,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,se(),O.dispose(),e.removeEventListener(`mousedown`,N,{capture:!0}),e.removeEventListener(`click`,ee,{capture:!0}),e.removeEventListener(`mousemove`,F),D?.dispose(),E?.dispose(),k.dispose(),x?.dispose(),v?.dispose(),B.dispose(),u.dispose(),c.dispose(),s.dispose(),s.forceContextLoss(),Bt(a))},fitToView:O.fitToView,clearSelection:O.clearSelection,selectEntries:e=>{O.selectEntries(e),H()},setHover:(e,t=null)=>{let n=k.show(e,t);O.setHoverTint(n?null:e),H()},addUserGeometry:(e,t)=>{e.userData.source=t===void 0?re:L(t),a.add(e),I()},removeUserGeometry:e=>{e.removeFromParent(),d(e),I()},clearUserGeometry:e=>{a.children.filter(t=>ae(t,e)).forEach(e=>{e.removeFromParent(),d(e)}),I()}}};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,nn as initThree,z as isHostOwned,ae as isOwnedBy,n as materialAppearanceForLook,_t as pickThreshold,kt as pointerToNdc,s as setLogger,yt as snapToVertex,fe as updateScene};
108
137
  //# sourceMappingURL=render.js.map