@selvajs/visualization 1.6.0-beta.4 → 1.6.0-beta.6
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/parse.cjs +6 -6
- package/dist/parse.cjs.map +1 -1
- package/dist/parse.d.cts +2 -0
- package/dist/parse.d.ts +2 -0
- package/dist/parse.js +8 -8
- package/dist/parse.js.map +1 -1
- package/dist/render.cjs +2 -2
- package/dist/render.cjs.map +1 -1
- package/dist/render.d.cts +4 -4
- package/dist/render.d.ts +4 -4
- package/dist/render.js +4 -4
- package/dist/render.js.map +1 -1
- package/package.json +1 -1
package/dist/render.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./gpu-ownership-ilj3JEdn.cjs"),t=require("./gpu-dispose-Cestx__L.cjs"),n=require("./merged-draw-SXYrxFt4.cjs");let r=require("three");r=e.s(r,1);let i=require("three/addons/lines/Line2.js"),a=require("three/addons/lines/LineGeometry.js"),o=require("three/addons/lines/LineMaterial.js"),s=require("three/addons/environments/RoomEnvironment.js"),c=require("three/addons/lines/LineSegments2.js"),l=require("three/addons/lines/LineSegmentsGeometry.js"),u=require("three/addons/renderers/CSS2DRenderer.js"),d=require("three/addons/helpers/ViewHelper.js"),f=require("three/addons/postprocessing/EffectComposer.js"),p=require("three/addons/postprocessing/RenderPass.js"),m=require("three/addons/postprocessing/GTAOPass.js"),h=require("three/addons/postprocessing/SMAAPass.js"),g=require("three/addons/postprocessing/OutputPass.js"),_=require("three/addons/postprocessing/Pass.js"),v=require("three/addons/controls/OrbitControls.js"),y=require("three/addons/loaders/HDRLoader.js");const b=[`technical`,`studio`,`showcase`,`arctic`,`xray`,`lineart`,`wireframe`],x=`user`,S=`app:`;function C(e){return`${S}${e}`}function w(e){return typeof e!=`string`||!e.startsWith(S)?null:e.slice(4)||null}function T(e){let t=e.userData?.source;return t===`user`||w(t)!==null}function E(e,t){return t===void 0?T(e):e.userData?.source===C(t)}const D=`selvaReflectionEnvironment`;function O(e,t,n){let i=new r.PMREMGenerator(t),a=new s.RoomEnvironment,o=i.fromScene(a,.04).texture;a.dispose(),i.dispose(),k(e,o,n)}function k(e,t,n){let r={texture:t,rotation:n.clone()};e.userData[D]=r,j(e,e)}function A(e){e.userData[D]?.texture.dispose(),delete e.userData[D]}function j(e,t){let n=t.userData[D];n&&e.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,i=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of i){if(!(e instanceof r.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 M(e){let t=e.clone().normalize(),n=new r.Vector3(0,0,1),i=new r.Vector3(0,1,0),a=Math.abs(t.dot(n))>.9?i:n,o=new r.Vector3().crossVectors(a,t).normalize();return{up:t,forward:new r.Vector3().crossVectors(t,o).normalize(),right:o}}function N(e,t){let{forward:n,right:r,up:i}=M(e);return n.clone().multiplyScalar(-1).add(r.clone().multiplyScalar(-1)).add(i).normalize().multiplyScalar(t)}function P(e,t,n){let{forward:r,right:i,up:a}=M(e);return i.clone().multiplyScalar(t).add(r.clone().multiplyScalar(t)).add(a.clone().multiplyScalar(n))}function ee(e){let t=e.clone().normalize(),n=new r.Vector3(0,1,0);if(t.dot(n)>.9999)return new r.Euler;if(t.dot(n)<-.9999)return new r.Euler(Math.PI,0,0);let i=new r.Quaternion().setFromUnitVectors(n,t);return new r.Euler().setFromQuaternion(i)}function te(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 F={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 ne(e,n,i,a,o){if(B(e,ie(n)),n.length===0)return;n.forEach(t=>{e.add(t),j(t,e)});let s=t.a(n),c=s.getCenter(new r.Vector3),l=s.getSize(new r.Vector3),u=Math.max(l.x,l.y,l.z);if(u/Math.min(l.x||1,l.y||1,l.z||1)>F.SCALE_RATIO_THRESHOLD||u>F.HUGE_THRESHOLD?(i.near=u*F.NEAR_PLANE_FACTOR.TINY,i.far=u*F.FAR_PLANE_FACTOR.HUGE):u>F.LARGE_THRESHOLD?(i.near=u*F.NEAR_PLANE_FACTOR.SMALL,i.far=u*F.FAR_PLANE_FACTOR.LARGE):(i.near=Math.max(.01,u*F.NEAR_PLANE_FACTOR.NORMAL),i.far=Math.max(2e3,u*F.FAR_PLANE_FACTOR.NORMAL)),i.updateProjectionMatrix(),!o){let e=u*F.INITIAL_DISTANCE_MULTIPLIER;i.position.copy(c).add(N(i.up,e)),a.target.copy(c),a.update()}}const I=/* @__PURE__ */ new Set([`grid`,`floor`,`label-layer`,`measure`]);function L(e){return typeof e.userData.id==`string`&&I.has(e.userData.id)}function re(e){let t=e;for(;t;){if(L(t))return!0;t=t.parent}return!1}function R(e){e.updateMatrixWorld(!0);let t=new r.Box3;return e.traverse(e=>{let n=e;e.visible&&!re(e)&&n.geometry&&t.expandByObject(e)}),t}function ie(t){let n=/* @__PURE__ */ new Set;for(let r of t)r.traverse(t=>{let r=t.geometry,i=r&&e.n(r);i&&n.add(i)});return n}const z=/* @__PURE__ */ new Set([`floor`,`grid`,`label-layer`]);function B(e,n=/* @__PURE__ */ new Set){[...e.children].forEach(e=>{z.has(e.userData.id)||T(e)||(t.t(e,{keepUploaded:n}),e.removeFromParent())})}function V(e){let{up:t,forward:n,right:r}=M(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 ae(e){let{scene:t,perspective:n,controls:i,onActiveCameraChange:a}=e,o=(e.up??n.up).clone().normalize(),s=V(o),c=new r.OrthographicCamera(-1,1,1,-1,n.near,n.far);c.up.copy(o);let l=`perspective`,u=n.aspect,d=()=>l===`perspective`?n:c,f=null,p=()=>{f?.cancel(),f=null},m=()=>{let e=(l===`orthographic`?c:n).position.distanceTo(i.target)*Math.tan(n.fov*Math.PI/360),t=e*u;c.left=-t,c.right=t,c.top=e,c.bottom=-e,c.near=n.near,c.far=n.far,c.updateProjectionMatrix()},h=e=>{if(e!==l){if(p(),e===`orthographic`)c.position.copy(n.position),c.up.copy(n.up),c.lookAt(i.target),c.zoom=1,m();else{let e=(c.top-c.bottom)/(2*c.zoom)/Math.tan(n.fov*Math.PI/360),t=c.position.clone().sub(i.target);t.lengthSq()<1e-12&&t.copy(o),t.normalize(),n.position.copy(i.target).add(t.multiplyScalar(e))}l=e,i.object=d(),i.update(),a(d())}},g=(e,t,r,a)=>{let s=n.fov*(Math.PI/180),u=t/(2*Math.tan(s/2))*1.5,h=H(r,o),g=e.clone().add(h.clone().multiplyScalar(u)),_=d();l===`orthographic`&&(c.zoom=1),p(),a?f=se(_,i,g,e,()=>{l===`orthographic`&&m()}):(_.position.copy(g),i.target.copy(e),l===`orthographic`&&m(),i.update())},_=(e,n=!0)=>{let a=R(t),o=a.isEmpty()?i.target.clone():a.getCenter(new r.Vector3),s=a.isEmpty()?new r.Vector3(1,1,1):a.getSize(new r.Vector3),c=Math.max(s.x,s.y,s.z)||1;g(o,c,e,n)};return{getActiveCamera:d,getProjection:()=>l,setProjection:h,toggleProjection:()=>(h(l===`perspective`?`orthographic`:`perspective`),l),setView:(e,t=!0)=>{_(s[e],t)},setViewDirection:_,frameBounds:(e,t=!0)=>{if(e.isEmpty())return;let n=e.getCenter(new r.Vector3),a=e.getSize(new r.Vector3),o=Math.max(a.x,a.y,a.z)||1,c=d().position.clone().sub(i.target);c.lengthSq()<1e-12&&c.copy(s.iso),g(n,o,c.normalize(),t)},setRotateEnabled:e=>{i.enableRotate=e},isRotateEnabled:()=>i.enableRotate,updateAspect:(e,t)=>{u=t===0?u:e/t,l===`orthographic`&&m()},dispose:p}}function H(e,t){let{up:n,forward:r}=M(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 oe=e=>1-(1-e)**3;function se(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=oe(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 U(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 W(e){let t=new l.LineSegmentsGeometry;return t.setPositions(e),{geometry:t,segmentCount:e.length/6,edgeSpacing:U(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 ce(){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 le=`edge-overlay`;function ue(e){return{forcedColor:e.color==null?null:new r.Color(e.color),darken:r.MathUtils.clamp(e.darken??.75,0,1),width:e.width??1.5,thresholdAngle:e.thresholdAngle??44,distanceFade:e.distanceFade??!0,maxTriangles:e.maxTriangles??
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./gpu-ownership-ilj3JEdn.cjs"),t=require("./gpu-dispose-Cestx__L.cjs"),n=require("./merged-draw-SXYrxFt4.cjs");let r=require("three");r=e.s(r,1);let i=require("three/addons/lines/Line2.js"),a=require("three/addons/lines/LineGeometry.js"),o=require("three/addons/lines/LineMaterial.js"),s=require("three/addons/environments/RoomEnvironment.js"),c=require("three/addons/lines/LineSegments2.js"),l=require("three/addons/lines/LineSegmentsGeometry.js"),u=require("three/addons/renderers/CSS2DRenderer.js"),d=require("three/addons/helpers/ViewHelper.js"),f=require("three/addons/postprocessing/EffectComposer.js"),p=require("three/addons/postprocessing/RenderPass.js"),m=require("three/addons/postprocessing/GTAOPass.js"),h=require("three/addons/postprocessing/SMAAPass.js"),g=require("three/addons/postprocessing/OutputPass.js"),_=require("three/addons/postprocessing/Pass.js"),v=require("three/addons/controls/OrbitControls.js"),y=require("three/addons/loaders/HDRLoader.js");const b=[`technical`,`studio`,`showcase`,`arctic`,`xray`,`lineart`,`wireframe`],x=`user`,S=`app:`;function C(e){return`${S}${e}`}function w(e){return typeof e!=`string`||!e.startsWith(S)?null:e.slice(4)||null}function T(e){let t=e.userData?.source;return t===`user`||w(t)!==null}function E(e,t){return t===void 0?T(e):e.userData?.source===C(t)}const D=`selvaReflectionEnvironment`;function O(e,t,n){let i=new r.PMREMGenerator(t),a=new s.RoomEnvironment,o=i.fromScene(a,.04).texture;a.dispose(),i.dispose(),k(e,o,n)}function k(e,t,n){let r={texture:t,rotation:n.clone()};e.userData[D]=r,j(e,e)}function A(e){e.userData[D]?.texture.dispose(),delete e.userData[D]}function j(e,t){let n=t.userData[D];n&&e.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,i=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of i){if(!(e instanceof r.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 M(e){let t=e.clone().normalize(),n=new r.Vector3(0,0,1),i=new r.Vector3(0,1,0),a=Math.abs(t.dot(n))>.9?i:n,o=new r.Vector3().crossVectors(a,t).normalize();return{up:t,forward:new r.Vector3().crossVectors(t,o).normalize(),right:o}}function N(e,t){let{forward:n,right:r,up:i}=M(e);return n.clone().multiplyScalar(-1).add(r.clone().multiplyScalar(-1)).add(i).normalize().multiplyScalar(t)}function P(e,t,n){let{forward:r,right:i,up:a}=M(e);return i.clone().multiplyScalar(t).add(r.clone().multiplyScalar(t)).add(a.clone().multiplyScalar(n))}function ee(e){let t=e.clone().normalize(),n=new r.Vector3(0,1,0);if(t.dot(n)>.9999)return new r.Euler;if(t.dot(n)<-.9999)return new r.Euler(Math.PI,0,0);let i=new r.Quaternion().setFromUnitVectors(n,t);return new r.Euler().setFromQuaternion(i)}function te(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 F={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 ne(e,n,i,a,o){if(B(e,ie(n)),n.length===0)return;n.forEach(t=>{e.add(t),j(t,e)});let s=t.a(n),c=s.getCenter(new r.Vector3),l=s.getSize(new r.Vector3),u=Math.max(l.x,l.y,l.z);if(u/Math.min(l.x||1,l.y||1,l.z||1)>F.SCALE_RATIO_THRESHOLD||u>F.HUGE_THRESHOLD?(i.near=u*F.NEAR_PLANE_FACTOR.TINY,i.far=u*F.FAR_PLANE_FACTOR.HUGE):u>F.LARGE_THRESHOLD?(i.near=u*F.NEAR_PLANE_FACTOR.SMALL,i.far=u*F.FAR_PLANE_FACTOR.LARGE):(i.near=Math.max(.01,u*F.NEAR_PLANE_FACTOR.NORMAL),i.far=Math.max(2e3,u*F.FAR_PLANE_FACTOR.NORMAL)),i.updateProjectionMatrix(),!o){let e=u*F.INITIAL_DISTANCE_MULTIPLIER;i.position.copy(c).add(N(i.up,e)),a.target.copy(c),a.update()}}const I=/* @__PURE__ */ new Set([`grid`,`floor`,`label-layer`,`measure`]);function L(e){return typeof e.userData.id==`string`&&I.has(e.userData.id)}function re(e){let t=e;for(;t;){if(L(t))return!0;t=t.parent}return!1}function R(e){e.updateMatrixWorld(!0);let t=new r.Box3;return e.traverse(e=>{let n=e;e.visible&&!re(e)&&n.geometry&&t.expandByObject(e)}),t}function ie(t){let n=/* @__PURE__ */ new Set;for(let r of t)r.traverse(t=>{let r=t.geometry,i=r&&e.n(r);i&&n.add(i)});return n}const z=/* @__PURE__ */ new Set([`floor`,`grid`,`label-layer`]);function B(e,n=/* @__PURE__ */ new Set){let r=[],i=[];for(let t of e.children)z.has(t.userData.id)||T(t)?r.push(t):i.push(t);e.children.length=0;for(let t of r)e.children.push(t);for(let r of i)t.t(r,{keepUploaded:n}),r.parent=null,r.dispatchEvent({type:`removed`}),e.dispatchEvent({type:`childremoved`,child:r})}function V(e){let{up:t,forward:n,right:r}=M(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 ae(e){let{scene:t,perspective:n,controls:i,onActiveCameraChange:a}=e,o=(e.up??n.up).clone().normalize(),s=V(o),c=new r.OrthographicCamera(-1,1,1,-1,n.near,n.far);c.up.copy(o);let l=`perspective`,u=n.aspect,d=()=>l===`perspective`?n:c,f=null,p=()=>{f?.cancel(),f=null},m=()=>{let e=(l===`orthographic`?c:n).position.distanceTo(i.target)*Math.tan(n.fov*Math.PI/360),t=e*u;c.left=-t,c.right=t,c.top=e,c.bottom=-e,c.near=n.near,c.far=n.far,c.updateProjectionMatrix()},h=e=>{if(e!==l){if(p(),e===`orthographic`)c.position.copy(n.position),c.up.copy(n.up),c.lookAt(i.target),c.zoom=1,m();else{let e=(c.top-c.bottom)/(2*c.zoom)/Math.tan(n.fov*Math.PI/360),t=c.position.clone().sub(i.target);t.lengthSq()<1e-12&&t.copy(o),t.normalize(),n.position.copy(i.target).add(t.multiplyScalar(e))}l=e,i.object=d(),i.update(),a(d())}},g=(e,t,r,a)=>{let s=n.fov*(Math.PI/180),u=t/(2*Math.tan(s/2))*1.5,h=H(r,o),g=e.clone().add(h.clone().multiplyScalar(u)),_=d();l===`orthographic`&&(c.zoom=1),p(),a?f=se(_,i,g,e,()=>{l===`orthographic`&&m()}):(_.position.copy(g),i.target.copy(e),l===`orthographic`&&m(),i.update())},_=(e,n=!0)=>{let a=R(t),o=a.isEmpty()?i.target.clone():a.getCenter(new r.Vector3),s=a.isEmpty()?new r.Vector3(1,1,1):a.getSize(new r.Vector3),c=Math.max(s.x,s.y,s.z)||1;g(o,c,e,n)};return{getActiveCamera:d,getProjection:()=>l,setProjection:h,toggleProjection:()=>(h(l===`perspective`?`orthographic`:`perspective`),l),setView:(e,t=!0)=>{_(s[e],t)},setViewDirection:_,frameBounds:(e,t=!0)=>{if(e.isEmpty())return;let n=e.getCenter(new r.Vector3),a=e.getSize(new r.Vector3),o=Math.max(a.x,a.y,a.z)||1,c=d().position.clone().sub(i.target);c.lengthSq()<1e-12&&c.copy(s.iso),g(n,o,c.normalize(),t)},setRotateEnabled:e=>{i.enableRotate=e},isRotateEnabled:()=>i.enableRotate,updateAspect:(e,t)=>{u=t===0?u:e/t,l===`orthographic`&&m()},dispose:p}}function H(e,t){let{up:n,forward:r}=M(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 oe=e=>1-(1-e)**3;function se(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=oe(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 U(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 W(e){let t=new l.LineSegmentsGeometry;return t.setPositions(e),{geometry:t,segmentCount:e.length/6,edgeSpacing:U(e)}}function G(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 ce(){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 le=`edge-overlay`;function ue(e){return{forcedColor:e.color==null?null:new r.Color(e.color),darken:r.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 de(e){let t=e.getAttribute(`position`);return t?(e.index?e.index.count:t.count)/3:0}function fe(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 pe(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 r.EdgesGeometry(e,t),i=n.attributes.position?n.attributes.position.array:/* @__PURE__ */ new Float32Array;return n.dispose(),{segments:i,faces:null}}const K=/* @__PURE__ */ new WeakMap,q={};function he(e,t){let n=K.get(e.positions)?.get(e.index??q)?.get(t);return n?.version===e.version?n.edges:void 0}function ge(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 _e(e,t){let n=fe(e);return n?he(n,t)??ge(n,t,G(n.positions,n.index,t)):me(e,t)}let J;const Y=/* @__PURE__ */ new Map;let ve=1;function ye(){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([ce()],{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 be(e,t,n){return new Promise((r,i)=>{let a=ve++;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 xe=/* @__PURE__ */ new Map;function Se(e,t){let n=fe(e);if(!n||de(e)<25e3)return Promise.resolve(_e(e,t));let r=he(n,t);if(r)return Promise.resolve(r);let i=pe(n,t),a=xe.get(i);if(a)return a;let o=ye();if(!o)return Promise.resolve(_e(e,t));let s=be(o,n,t).catch(()=>G(n.positions,n.index,t)).then(e=>ge(n,t,e)).finally(()=>{xe.delete(i)});return xe.set(i,s),s}function X(e){let t=e.userData?.members;return Array.isArray(t)&&t.length>0?t:null}function Ce(e){let t=X(e.object);if(!t||e.faceIndex==null)return null;let n=e.faceIndex*3,r=0,i=t.length-1;for(;r<=i;){let e=r+i>>1,a=t[e];if(a.indexStart==null||a.indexCount==null)return null;if(n<a.indexStart)i=e-1;else if(n>=a.indexStart+a.indexCount)r=e+1;else return{member:a,index:e}}return null}function we(e,t){let n=new r.Box3,i=e.geometry.getIndex(),a=e.geometry.getAttribute(`position`);if(!i||!a||t.indexStart==null||t.indexCount==null)return n;e.updateMatrixWorld();let o=new r.Vector3,s=Math.min(t.indexStart+t.indexCount,i.count);for(let r=t.indexStart;r<s;r++)o.fromBufferAttribute(a,i.getX(r)).applyMatrix4(e.matrixWorld),n.expandByPoint(o);return n}function Te(e,t,r){let i=X(e)?.indexOf(t)??-1;return i<0||t.indexStart==null||t.indexCount==null?()=>{}:(n.o(e,i,r),()=>n.t(e))}function Ee(e,t){let n=X(e);if(!n)return null;let r=[];for(let e of n){if(e.indexStart==null)return null;r.push(e.indexStart)}let i=new Uint32Array(t.length);for(let e=0;e<t.length;e++){let n=t[e]*3,a=0,o=r.length-1;for(;a<o;){let e=a+o+1>>1;r[e]<=n?a=e:o=e-1}i[e]=a}return i}function De(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 Oe(e,t,r){let{segments:i,faces:a}=r;if(!a||!X(t))return;let o,s=!1,c=()=>{let r=n.r(t);if(r.size===0&&!s||(o??=Ee(t,a),!o))return;let c=r.size===0?i:De(i,o,r);e.geometry.dispose(),e.geometry=W(c).geometry,s=r.size>0};c();let l=n.i(t,c);e.addEventListener(`removed`,l)}function ke(e,t){let n=(Array.isArray(e.material)?e.material[0]:e.material)?.color;return n?n.clone().multiplyScalar(1-t):new r.Color(2236962)}var Ae=class{options;byKey=/* @__PURE__ */ new Map;constructor(e){this.options=e}for(e,t){let n=this.options.forcedColor??ke(e,this.options.darken),r=n.getHex()*2+ +!!t,i=this.byKey.get(r);return i||(i=je(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 je(e,t,n){let r=new o.LineMaterial({color:e});return r.linewidth=t,r.polygonOffset=!0,r.polygonOffsetFactor=0,r.polygonOffsetUnits=-1,n&&(r.transparent=!0),r}function Me(e,t,n){let r=new c.LineSegments2(e.geometry,t);return r.userData.kind=le,r.raycast=()=>{},n&&Ie(r,e.edgeSpacing),r}const Ne=new r.Vector3,Pe=new r.Vector3;function Fe(e,t,n){e.geometry.boundingSphere||e.geometry.computeBoundingSphere();let i=e.geometry.boundingSphere;if(!i)return 1/0;if(t.isPerspectiveCamera){let a=t;Ne.copy(i.center).applyMatrix4(e.matrixWorld);let o=Pe.setFromMatrixPosition(t.matrixWorld).distanceTo(Ne);if(o<=i.radius*e.matrixWorld.getMaxScaleOnAxis())return 1/0;let s=Math.tan(r.MathUtils.degToRad(a.fov)*.5),c=2*o*s;return c>0?n/c: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 Ie(e,t){e.onBeforeRender=(n,i,a)=>{c.LineSegments2.prototype.onBeforeRender.call(e,n);let o=e.material,s=t*Fe(e,a,o.resolution.y);o.opacity=r.MathUtils.clamp((s-1)/3,0,1)}}function Le(e){return e.userData?.kind===le}function Re(e,t){let n=[],i=0;e.traverse(e=>{e instanceof r.Mesh&&e.userData.id!==`floor`&&e.userData.id!==`grid`&&e.userData.kind!==`edge-overlay`&&(e.children.some(e=>e.userData?.kind===`edge-overlay`)?i++:e.geometry&&(de(e.geometry)>t.maxTriangles?e.userData.edgesSkipped=`triangle-cap`:n.push(e)))});let a=Math.max(0,t.maxOverlays-i),o=n.slice(0,a);for(let e of o)delete e.userData.edgesSkipped;for(let e of n.slice(a))e.userData.edgesSkipped=`overlay-budget`;return n.length>a&&console.debug(`[edges] overlay budget reached: ${n.length} meshes want overlays, ${a} allowed — the rest fall back to the screen-space edge pass.`),o}function ze(e,t,n,r){let i=W(t.segments),a=r.distanceFade&&i.segmentCount<=r.maxSegments,o=Me(i,n.for(e,a),a);return e.add(o),Oe(o,e,t),o}const Be=/* @__PURE__ */ new WeakMap;function Ve(e){return Be.get(e)??0}function He(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}async function Ue(e,t={}){let n=ue(t),r=new Ae(n),i=Ve(e),a=[],o=Re(e,n).map(async t=>{let o=await Se(t.geometry,n.thresholdAngle);Ve(e)===i&&He(t,e)&&(t.children.some(e=>e.userData?.kind===`edge-overlay`)||a.push(ze(t,o,r,n)))});return await Promise.all(o),r.disposeUnused(a),a}function We(e){Be.set(e,Ve(e)+1);let t=[];e.traverse(e=>{e instanceof c.LineSegments2&&Le(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 Ge(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 Ke(e={}){let{cellSize:t=1,majorEvery:n=10,cellColor:i=8947848,majorColor:a=4473924,fadeDistance:o=100,plane:s=`y`}=e,c=s===`y`?new r.Vector2(0,2):s===`z`?new r.Vector2(0,1):new r.Vector2(1,2),l=2.5,u=new r.PlaneGeometry(1,1);s===`y`?u.rotateX(-Math.PI/2):s===`x`&&u.rotateY(Math.PI/2);let d=new r.ShaderMaterial({vertexShader:`
|
|
3
3
|
varying vec3 vWorldPos;
|
|
4
4
|
void main() {
|
|
5
5
|
vec4 world = modelMatrix * vec4(position, 1.0);
|