@selvajs/visualization 1.6.0-beta.6 → 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/merged-draw-CLtLo5Bh.cjs +2 -0
- package/dist/merged-draw-CLtLo5Bh.cjs.map +1 -0
- package/dist/{merged-draw-CO5Ev9ia.js → merged-draw-U_8oQ5q9.js} +2 -2
- package/dist/merged-draw-U_8oQ5q9.js.map +1 -0
- package/dist/render.cjs +33 -4
- package/dist/render.cjs.map +1 -1
- package/dist/render.d.cts +15 -0
- package/dist/render.d.ts +15 -0
- package/dist/render.js +33 -4
- package/dist/render.js.map +1 -1
- package/dist/scene.cjs +1 -1
- package/dist/scene.js +1 -1
- package/package.json +1 -1
- package/dist/merged-draw-CO5Ev9ia.js.map +0 -1
- package/dist/merged-draw-SXYrxFt4.cjs +0 -2
- package/dist/merged-draw-SXYrxFt4.cjs.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./gpu-ownership-ilj3JEdn.cjs");let t=require("three");t=e.s(t,1);const n=/* @__PURE__ */ new WeakMap,r=/* @__PURE__ */ new WeakMap,i=/* @__PURE__ */ new Set;function a(e){let t=e.userData?.members;return!Array.isArray(t)||t.length===0||t.some(e=>e.indexStart==null||e.indexCount==null)?null:t}function o(e){let t=n.get(e);return t||(t={base:Array.isArray(e.material)?e.material[0]:e.material,hidden:i,highlight:null},n.set(e,t)),t}function s(n){let r=n.geometry;if(!e.i(r))return r;let i=new t.BufferGeometry;i.setIndex(r.index);for(let[e,t]of Object.entries(r.attributes))i.setAttribute(e,t);return i.boundingBox=r.boundingBox?.clone()??null,i.boundingSphere=r.boundingSphere?.clone()??null,e.t(i,r),n.geometry=i,i}function c(e,t,r){let i=s(e);if(i.clearGroups(),r.hidden.size===0&&!r.highlight){e.material=r.base,n.delete(e);return}let a=-1,o=0,c=0,l=()=>{a>=0&&i.addGroup(a,o-a,c),a=-1};for(let e=0;e<t.length;e++){if(r.hidden.has(e)){l();continue}let{indexStart:n,indexCount:i}=t[e],s=+!!r.highlight?.members.has(e);(a<0||s!==c||n!==o)&&(l(),a=n,c=s),o=n+i}l(),e.material=r.highlight?[r.base,r.highlight.material]:[r.base]}function l(e,t){let n=a(e);if(!n)return;let i=o(e);t(i),c(e,n,i),r.get(e)?.forEach(e=>e())}function u(e){return n.get(e)?.hidden??i}function d(e,t){let n=u(e);n.size===t.size&&[...t].every(e=>n.has(e))||l(e,e=>{e.hidden=new Set(t)})}function f(e){return n.get(e)?.base??(Array.isArray(e.material)?e.material[0]:e.material)}function p(e,t,n){l(e,e=>{e.highlight={members:t,material:n}})}function m(e){n.get(e)?.highlight&&l(e,e=>{e.highlight=null})}function h(e,t){let n=r.get(e);return n||r.set(e,n=/* @__PURE__ */ new Set),n.add(t),()=>n.delete(t)}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}});
|
|
2
|
+
//# sourceMappingURL=merged-draw-CLtLo5Bh.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merged-draw-CLtLo5Bh.cjs","names":["isCachedGeometry","THREE","require_gpu_ownership","three","states","listeners","NONE","windowsOf","members","mesh","m","stateOf","state","ownGeometry","shared","own","name","attribute","rebuild","geometry","runStart","runEnd","runMaterial","flush","i","windows","material","indexStart","indexCount","update","change","listener","getHiddenMembers","setHiddenMembers","current","hidden","getBaseMaterial","setMemberHighlight","clearMemberHighlight","onMemberDrawChange","set"],"sources":["../src/shared/merged-draw.ts"],"sourcesContent":["// ============================================================================\n// Which parts of a merged mesh draw, and with what material\n// ============================================================================\n//\n// A merged mesh draws many source members in one call. Two features draw only part of it: hiding\n// a member (`scene/`) and tinting the selected member (`render/`). Both need geometry groups, and\n// three honours groups only when `material` is an array: with a single material it draws the whole\n// index range and ignores them. So one owner builds the groups and the material array from both\n// states together. Two writers each replacing the groups would undo each other.\n//\n// Members are addressed by their index in `userData.members`, which carries each member's window\n// into the index buffer (`finalizeMergedMesh`).\n\nimport * as THREE from 'three';\n\nimport { borrowGeometry, isCachedGeometry } from './gpu-ownership.js';\n\ninterface MemberWindow {\n\tindexStart?: number;\n\tindexCount?: number;\n}\n\ninterface DrawState {\n\t/** The mesh's own material, restored once nothing is hidden or highlighted. */\n\tbase: THREE.Material;\n\thidden: ReadonlySet<number>;\n\thighlight: { members: ReadonlySet<number>; material: THREE.Material } | null;\n}\n\nconst states = new WeakMap<THREE.Mesh, DrawState>();\nconst listeners = new WeakMap<THREE.Mesh, Set<() => void>>();\n\nconst NONE: ReadonlySet<number> = new Set();\n\nfunction windowsOf(mesh: THREE.Mesh): Required<MemberWindow>[] | null {\n\tconst members = mesh.userData?.members as MemberWindow[] | undefined;\n\tif (!Array.isArray(members) || members.length === 0) return null;\n\t// One member without a window means the ranges can't be rebuilt without dropping geometry.\n\tif (members.some((m) => m.indexStart == null || m.indexCount == null)) return null;\n\treturn members as Required<MemberWindow>[];\n}\n\nfunction stateOf(mesh: THREE.Mesh): DrawState {\n\tlet state = states.get(mesh);\n\tif (!state) {\n\t\tconst base = Array.isArray(mesh.material) ? mesh.material[0]! : mesh.material;\n\t\tstate = { base, hidden: NONE, highlight: null };\n\t\tstates.set(mesh, state);\n\t}\n\treturn state;\n}\n\n// Groups live on the geometry, and a cached geometry can back two meshes at once (two identical\n// branches), so a mesh gets its own geometry over the same attributes before writing any.\nfunction ownGeometry(mesh: THREE.Mesh): THREE.BufferGeometry {\n\tconst shared = mesh.geometry;\n\tif (!isCachedGeometry(shared)) return shared;\n\n\tconst own = new THREE.BufferGeometry();\n\town.setIndex(shared.index);\n\tfor (const [name, attribute] of Object.entries(shared.attributes))\n\t\town.setAttribute(name, attribute);\n\town.boundingBox = shared.boundingBox?.clone() ?? null;\n\town.boundingSphere = shared.boundingSphere?.clone() ?? null;\n\tborrowGeometry(own, shared);\n\tmesh.geometry = own;\n\treturn own;\n}\n\nfunction rebuild(mesh: THREE.Mesh, windows: Required<MemberWindow>[], state: DrawState): void {\n\tconst geometry = ownGeometry(mesh);\n\tgeometry.clearGroups();\n\n\tif (state.hidden.size === 0 && !state.highlight) {\n\t\tmesh.material = state.base;\n\t\tstates.delete(mesh);\n\t\treturn;\n\t}\n\n\t// Coalesce neighbours with the same material, so hiding one member costs two draws, not N.\n\tlet runStart = -1;\n\tlet runEnd = 0;\n\tlet runMaterial = 0;\n\tconst flush = () => {\n\t\tif (runStart >= 0) geometry.addGroup(runStart, runEnd - runStart, runMaterial);\n\t\trunStart = -1;\n\t};\n\tfor (let i = 0; i < windows.length; i++) {\n\t\tif (state.hidden.has(i)) {\n\t\t\tflush();\n\t\t\tcontinue;\n\t\t}\n\t\tconst { indexStart, indexCount } = windows[i]!;\n\t\tconst material = state.highlight?.members.has(i) ? 1 : 0;\n\t\tif (runStart < 0 || material !== runMaterial || indexStart !== runEnd) {\n\t\t\tflush();\n\t\t\trunStart = indexStart;\n\t\t\trunMaterial = material;\n\t\t}\n\t\trunEnd = indexStart + indexCount;\n\t}\n\tflush();\n\n\tmesh.material = state.highlight ? [state.base, state.highlight.material] : [state.base];\n}\n\nfunction update(mesh: THREE.Mesh, change: (state: DrawState) => void): void {\n\tconst windows = windowsOf(mesh);\n\tif (!windows) return;\n\tconst state = stateOf(mesh);\n\tchange(state);\n\trebuild(mesh, windows, state);\n\tlisteners.get(mesh)?.forEach((listener) => listener());\n}\n\n/** Members of `mesh` not drawn, by index into `userData.members`. */\nexport function getHiddenMembers(mesh: THREE.Mesh): ReadonlySet<number> {\n\treturn states.get(mesh)?.hidden ?? NONE;\n}\n\nexport function setHiddenMembers(mesh: THREE.Mesh, hidden: ReadonlySet<number>): void {\n\tconst current = getHiddenMembers(mesh);\n\tif (current.size === hidden.size && [...hidden].every((i) => current.has(i))) return;\n\tupdate(mesh, (state) => {\n\t\tstate.hidden = new Set(hidden);\n\t});\n}\n\n/** The material `mesh` draws with when nothing is highlighted. */\nexport function getBaseMaterial(mesh: THREE.Mesh): THREE.Material {\n\treturn (\n\t\tstates.get(mesh)?.base ?? (Array.isArray(mesh.material) ? mesh.material[0]! : mesh.material)\n\t);\n}\n\n/** Draws `members` with `material`. The caller owns `material` and disposes it. */\nexport function setMemberHighlight(\n\tmesh: THREE.Mesh,\n\tmembers: ReadonlySet<number>,\n\tmaterial: THREE.Material\n): void {\n\tupdate(mesh, (state) => {\n\t\tstate.highlight = { members, material };\n\t});\n}\n\nexport function clearMemberHighlight(mesh: THREE.Mesh): void {\n\tif (!states.get(mesh)?.highlight) return;\n\tupdate(mesh, (state) => {\n\t\tstate.highlight = null;\n\t});\n}\n\n/** Calls `listener` after the hidden set or highlight of `mesh` changes. Returns an unsubscribe. */\nexport function onMemberDrawChange(mesh: THREE.Mesh, listener: () => void): () => void {\n\tlet set = listeners.get(mesh);\n\tif (!set) listeners.set(mesh, (set = new Set()));\n\tset.add(listener);\n\treturn () => set.delete(listener);\n}\n"],"mappings":"A,kFA6BA,MAAMI,kBAAS,IAAI,QACbC,kBAAY,IAAI,QAEhBC,kBAA4B,IAAI,IAEtC,SAASC,EAAU,EAAmD,CACrE,IAAMC,EAAUC,EAAK,UAAU,QAI/B,MAHI,CAAC,MAAM,QAAQD,CAAO,GAAKA,EAAQ,SAAW,GAE9CA,EAAQ,KAAM,GAAME,EAAE,YAAc,MAAQA,EAAE,YAAc,IAAI,EAAU,KACvEF,CACR,CAEA,SAASG,EAAQ,EAA6B,CAC7C,IAAIC,EAAQR,EAAO,IAAIK,CAAI,EAM3B,OALKG,IAEJ,EAAQ,CAAE,KADG,MAAM,QAAQH,EAAK,QAAQ,EAAIA,EAAK,SAAS,GAAMA,EAAK,SACrD,OAAQH,EAAM,UAAW,IAAK,EAC9CF,EAAO,IAAIK,EAAMG,CAAK,GAEhBA,CACR,CAIA,SAASC,EAAY,EAAwC,CAC5D,IAAMC,EAASL,EAAK,SACpB,GAAI,CAACT,EAAAA,EAAiBc,CAAM,EAAG,OAAOA,EAEtC,IAAMC,EAAM,IAAId,EAAM,eACtBc,EAAI,SAASD,EAAO,KAAK,EACzB,IAAK,GAAM,CAACE,EAAMC,KAAc,OAAO,QAAQH,EAAO,UAAU,EAC/DC,EAAI,aAAaC,EAAMC,CAAS,EAKjC,MAJA,GAAI,YAAcH,EAAO,aAAa,MAAM,GAAK,KACjD,EAAI,eAAiBA,EAAO,gBAAgB,MAAM,GAAK,KACvDZ,EAAA,EAAea,EAAKD,CAAM,EAC1B,EAAK,SAAWC,EACTA,CACR,CAEA,SAASG,EAAQ,EAAkB,EAAmC,EAAwB,CAC7F,IAAMC,EAAWN,EAAYJ,CAAI,EAGjC,GAFAU,EAAS,YAAY,EAEjBP,EAAM,OAAO,OAAS,GAAK,CAACA,EAAM,UAAW,CAChD,EAAK,SAAWA,EAAM,KACtBR,EAAO,OAAOK,CAAI,EAClB,MACD,CAGA,IAAIW,EAAW,GACXC,EAAS,EACTC,EAAc,EACZC,MAAc,CACfH,GAAY,GAAGD,EAAS,SAASC,EAAUC,EAASD,EAAUE,CAAW,EAC7E,EAAW,EACZ,EACA,IAAK,IAAIE,EAAI,EAAGA,EAAIC,EAAQ,OAAQ,IAAK,CACxC,GAAIb,EAAM,OAAO,IAAIY,CAAC,EAAG,CACxBD,EAAM,EACN,QACD,CACA,GAAM,CAAE,aAAY,cAAeE,EAAQD,GACrCE,EAAW,KAAM,WAAW,QAAQ,IAAIF,CAAC,GAC3CJ,EAAW,GAAKM,IAAaJ,GAAeK,IAAeN,KAC9DE,EAAM,EACN,EAAWI,EACX,EAAcD,GAEf,EAASC,EAAaC,CACvB,CACAL,EAAM,EAEN,EAAK,SAAWX,EAAM,UAAY,CAACA,EAAM,KAAMA,EAAM,UAAU,QAAQ,EAAI,CAACA,EAAM,IAAI,CACvF,CAEA,SAASiB,EAAO,EAAkB,EAA0C,CAC3E,IAAMJ,EAAUlB,EAAUE,CAAI,EAC9B,GAAI,CAACgB,EAAS,OACd,IAAMb,EAAQD,EAAQF,CAAI,EAC1BqB,EAAOlB,CAAK,EACZM,EAAQT,EAAMgB,EAASb,CAAK,EAC5BP,EAAU,IAAII,CAAI,CAAC,EAAE,QAAS,GAAasB,EAAS,CAAC,CACtD,CAGA,SAAgBC,EAAiB,EAAuC,CACvE,OAAO5B,EAAO,IAAIK,CAAI,CAAC,EAAE,QAAUH,CACpC,CAEA,SAAgB2B,EAAiB,EAAkB,EAAmC,CACrF,IAAMC,EAAUF,EAAiBvB,CAAI,EACjCyB,EAAQ,OAASC,EAAO,MAAQ,CAAC,GAAGA,CAAM,CAAC,CAAC,MAAO,GAAMD,EAAQ,IAAIV,CAAC,CAAC,GAC3EK,EAAOpB,EAAO,GAAU,CACvB,EAAM,OAAS,IAAI,IAAI0B,CAAM,CAC9B,CAAC,CACF,CAGA,SAAgBC,EAAgB,EAAkC,CACjE,OACChC,EAAO,IAAIK,CAAI,CAAC,EAAE,OAAS,MAAM,QAAQA,EAAK,QAAQ,EAAIA,EAAK,SAAS,GAAMA,EAAK,SAErF,CAGA,SAAgB4B,EACf,EACA,EACA,EACO,CACPR,EAAOpB,EAAO,GAAU,CACvB,EAAM,UAAY,CAAE,UAAS,UAAS,CACvC,CAAC,CACF,CAEA,SAAgB6B,EAAqB,EAAwB,CACvDlC,EAAO,IAAIK,CAAI,CAAC,EAAE,WACvBoB,EAAOpB,EAAO,GAAU,CACvB,EAAM,UAAY,IACnB,CAAC,CACF,CAGA,SAAgB8B,EAAmB,EAAkB,EAAkC,CACtF,IAAIC,EAAMnC,EAAU,IAAII,CAAI,EAG5B,OAFK+B,GAAKnC,EAAU,IAAII,EAAO,kBAAM,IAAI,GAAM,EAC/C+B,EAAI,IAAIT,CAAQ,MACHS,EAAI,OAAOT,CAAQ,CACjC,C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e,t}from"./gpu-ownership-DcHWbATk.js";import*as n from"three";const r=/* @__PURE__ */ new WeakMap,i=/* @__PURE__ */ new WeakMap,a=/* @__PURE__ */ new Set;function o(e){let t=e.userData?.members;return!Array.isArray(t)||t.length===0||t.some(e=>e.indexStart==null||e.indexCount==null)?null:t}function s(e){let t=r.get(e);return t||(t={base:Array.isArray(e.material)?e.material[0]:e.material,hidden:a,highlight:null},r.set(e,t)),t}function c(r){let i=r.geometry;if(!e(i))return i;let a=new n.BufferGeometry;a.setIndex(i.index);for(let[e,t]of Object.entries(i.attributes))a.setAttribute(e,t);return a.boundingBox=i.boundingBox?.clone()??null,a.boundingSphere=i.boundingSphere?.clone()??null,t(a,i),r.geometry=a,a}function l(e,t,n){let i=c(e);if(i.clearGroups(),n.hidden.size===0&&!n.highlight){e.material=n.base,r.delete(e);return}let a=-1,o=0,s=0,l=()=>{a>=0&&i.addGroup(a,o-a,s),a=-1};for(let e=0;e<t.length;e++){if(n.hidden.has(e)){l();continue}let{indexStart:r,indexCount:i}=t[e],c
|
|
2
|
-
//# sourceMappingURL=merged-draw-
|
|
1
|
+
import{i as e,t}from"./gpu-ownership-DcHWbATk.js";import*as n from"three";const r=/* @__PURE__ */ new WeakMap,i=/* @__PURE__ */ new WeakMap,a=/* @__PURE__ */ new Set;function o(e){let t=e.userData?.members;return!Array.isArray(t)||t.length===0||t.some(e=>e.indexStart==null||e.indexCount==null)?null:t}function s(e){let t=r.get(e);return t||(t={base:Array.isArray(e.material)?e.material[0]:e.material,hidden:a,highlight:null},r.set(e,t)),t}function c(r){let i=r.geometry;if(!e(i))return i;let a=new n.BufferGeometry;a.setIndex(i.index);for(let[e,t]of Object.entries(i.attributes))a.setAttribute(e,t);return a.boundingBox=i.boundingBox?.clone()??null,a.boundingSphere=i.boundingSphere?.clone()??null,t(a,i),r.geometry=a,a}function l(e,t,n){let i=c(e);if(i.clearGroups(),n.hidden.size===0&&!n.highlight){e.material=n.base,r.delete(e);return}let a=-1,o=0,s=0,l=()=>{a>=0&&i.addGroup(a,o-a,s),a=-1};for(let e=0;e<t.length;e++){if(n.hidden.has(e)){l();continue}let{indexStart:r,indexCount:i}=t[e],c=+!!n.highlight?.members.has(e);(a<0||c!==s||r!==o)&&(l(),a=r,s=c),o=r+i}l(),e.material=n.highlight?[n.base,n.highlight.material]:[n.base]}function u(e,t){let n=o(e);if(!n)return;let r=s(e);t(r),l(e,n,r),i.get(e)?.forEach(e=>e())}function d(e){return r.get(e)?.hidden??a}function f(e,t){let n=d(e);n.size===t.size&&[...t].every(e=>n.has(e))||u(e,e=>{e.hidden=new Set(t)})}function p(e){return r.get(e)?.base??(Array.isArray(e.material)?e.material[0]:e.material)}function m(e,t,n){u(e,e=>{e.highlight={members:t,material:n}})}function h(e){r.get(e)?.highlight&&u(e,e=>{e.highlight=null})}function g(e,t){let n=i.get(e);return n||i.set(e,n=/* @__PURE__ */ new Set),n.add(t),()=>n.delete(t)}export{f as a,g as i,p as n,m as o,d as r,h as t};
|
|
2
|
+
//# sourceMappingURL=merged-draw-U_8oQ5q9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merged-draw-U_8oQ5q9.js","names":["isCachedGeometry","THREE","states","listeners","NONE","windowsOf","members","mesh","m","stateOf","state","ownGeometry","shared","own","name","attribute","borrowGeometry","rebuild","geometry","runStart","runEnd","runMaterial","flush","i","windows","material","indexStart","indexCount","update","change","listener","getHiddenMembers","setHiddenMembers","current","hidden","getBaseMaterial","setMemberHighlight","clearMemberHighlight","onMemberDrawChange","set"],"sources":["../src/shared/merged-draw.ts"],"sourcesContent":["// ============================================================================\n// Which parts of a merged mesh draw, and with what material\n// ============================================================================\n//\n// A merged mesh draws many source members in one call. Two features draw only part of it: hiding\n// a member (`scene/`) and tinting the selected member (`render/`). Both need geometry groups, and\n// three honours groups only when `material` is an array: with a single material it draws the whole\n// index range and ignores them. So one owner builds the groups and the material array from both\n// states together. Two writers each replacing the groups would undo each other.\n//\n// Members are addressed by their index in `userData.members`, which carries each member's window\n// into the index buffer (`finalizeMergedMesh`).\n\nimport * as THREE from 'three';\n\nimport { borrowGeometry, isCachedGeometry } from './gpu-ownership.js';\n\ninterface MemberWindow {\n\tindexStart?: number;\n\tindexCount?: number;\n}\n\ninterface DrawState {\n\t/** The mesh's own material, restored once nothing is hidden or highlighted. */\n\tbase: THREE.Material;\n\thidden: ReadonlySet<number>;\n\thighlight: { members: ReadonlySet<number>; material: THREE.Material } | null;\n}\n\nconst states = new WeakMap<THREE.Mesh, DrawState>();\nconst listeners = new WeakMap<THREE.Mesh, Set<() => void>>();\n\nconst NONE: ReadonlySet<number> = new Set();\n\nfunction windowsOf(mesh: THREE.Mesh): Required<MemberWindow>[] | null {\n\tconst members = mesh.userData?.members as MemberWindow[] | undefined;\n\tif (!Array.isArray(members) || members.length === 0) return null;\n\t// One member without a window means the ranges can't be rebuilt without dropping geometry.\n\tif (members.some((m) => m.indexStart == null || m.indexCount == null)) return null;\n\treturn members as Required<MemberWindow>[];\n}\n\nfunction stateOf(mesh: THREE.Mesh): DrawState {\n\tlet state = states.get(mesh);\n\tif (!state) {\n\t\tconst base = Array.isArray(mesh.material) ? mesh.material[0]! : mesh.material;\n\t\tstate = { base, hidden: NONE, highlight: null };\n\t\tstates.set(mesh, state);\n\t}\n\treturn state;\n}\n\n// Groups live on the geometry, and a cached geometry can back two meshes at once (two identical\n// branches), so a mesh gets its own geometry over the same attributes before writing any.\nfunction ownGeometry(mesh: THREE.Mesh): THREE.BufferGeometry {\n\tconst shared = mesh.geometry;\n\tif (!isCachedGeometry(shared)) return shared;\n\n\tconst own = new THREE.BufferGeometry();\n\town.setIndex(shared.index);\n\tfor (const [name, attribute] of Object.entries(shared.attributes))\n\t\town.setAttribute(name, attribute);\n\town.boundingBox = shared.boundingBox?.clone() ?? null;\n\town.boundingSphere = shared.boundingSphere?.clone() ?? null;\n\tborrowGeometry(own, shared);\n\tmesh.geometry = own;\n\treturn own;\n}\n\nfunction rebuild(mesh: THREE.Mesh, windows: Required<MemberWindow>[], state: DrawState): void {\n\tconst geometry = ownGeometry(mesh);\n\tgeometry.clearGroups();\n\n\tif (state.hidden.size === 0 && !state.highlight) {\n\t\tmesh.material = state.base;\n\t\tstates.delete(mesh);\n\t\treturn;\n\t}\n\n\t// Coalesce neighbours with the same material, so hiding one member costs two draws, not N.\n\tlet runStart = -1;\n\tlet runEnd = 0;\n\tlet runMaterial = 0;\n\tconst flush = () => {\n\t\tif (runStart >= 0) geometry.addGroup(runStart, runEnd - runStart, runMaterial);\n\t\trunStart = -1;\n\t};\n\tfor (let i = 0; i < windows.length; i++) {\n\t\tif (state.hidden.has(i)) {\n\t\t\tflush();\n\t\t\tcontinue;\n\t\t}\n\t\tconst { indexStart, indexCount } = windows[i]!;\n\t\tconst material = state.highlight?.members.has(i) ? 1 : 0;\n\t\tif (runStart < 0 || material !== runMaterial || indexStart !== runEnd) {\n\t\t\tflush();\n\t\t\trunStart = indexStart;\n\t\t\trunMaterial = material;\n\t\t}\n\t\trunEnd = indexStart + indexCount;\n\t}\n\tflush();\n\n\tmesh.material = state.highlight ? [state.base, state.highlight.material] : [state.base];\n}\n\nfunction update(mesh: THREE.Mesh, change: (state: DrawState) => void): void {\n\tconst windows = windowsOf(mesh);\n\tif (!windows) return;\n\tconst state = stateOf(mesh);\n\tchange(state);\n\trebuild(mesh, windows, state);\n\tlisteners.get(mesh)?.forEach((listener) => listener());\n}\n\n/** Members of `mesh` not drawn, by index into `userData.members`. */\nexport function getHiddenMembers(mesh: THREE.Mesh): ReadonlySet<number> {\n\treturn states.get(mesh)?.hidden ?? NONE;\n}\n\nexport function setHiddenMembers(mesh: THREE.Mesh, hidden: ReadonlySet<number>): void {\n\tconst current = getHiddenMembers(mesh);\n\tif (current.size === hidden.size && [...hidden].every((i) => current.has(i))) return;\n\tupdate(mesh, (state) => {\n\t\tstate.hidden = new Set(hidden);\n\t});\n}\n\n/** The material `mesh` draws with when nothing is highlighted. */\nexport function getBaseMaterial(mesh: THREE.Mesh): THREE.Material {\n\treturn (\n\t\tstates.get(mesh)?.base ?? (Array.isArray(mesh.material) ? mesh.material[0]! : mesh.material)\n\t);\n}\n\n/** Draws `members` with `material`. The caller owns `material` and disposes it. */\nexport function setMemberHighlight(\n\tmesh: THREE.Mesh,\n\tmembers: ReadonlySet<number>,\n\tmaterial: THREE.Material\n): void {\n\tupdate(mesh, (state) => {\n\t\tstate.highlight = { members, material };\n\t});\n}\n\nexport function clearMemberHighlight(mesh: THREE.Mesh): void {\n\tif (!states.get(mesh)?.highlight) return;\n\tupdate(mesh, (state) => {\n\t\tstate.highlight = null;\n\t});\n}\n\n/** Calls `listener` after the hidden set or highlight of `mesh` changes. Returns an unsubscribe. */\nexport function onMemberDrawChange(mesh: THREE.Mesh, listener: () => void): () => void {\n\tlet set = listeners.get(mesh);\n\tif (!set) listeners.set(mesh, (set = new Set()));\n\tset.add(listener);\n\treturn () => set.delete(listener);\n}\n"],"mappings":"A,0EA6BA,MAAME,kBAAS,IAAI,QACbC,kBAAY,IAAI,QAEhBC,kBAA4B,IAAI,IAEtC,SAASC,EAAU,EAAmD,CACrE,IAAMC,EAAUC,EAAK,UAAU,QAI/B,MAHI,CAAC,MAAM,QAAQD,CAAO,GAAKA,EAAQ,SAAW,GAE9CA,EAAQ,KAAM,GAAME,EAAE,YAAc,MAAQA,EAAE,YAAc,IAAI,EAAU,KACvEF,CACR,CAEA,SAASG,EAAQ,EAA6B,CAC7C,IAAIC,EAAQR,EAAO,IAAIK,CAAI,EAM3B,OALKG,IAEJ,EAAQ,CAAE,KADG,MAAM,QAAQH,EAAK,QAAQ,EAAIA,EAAK,SAAS,GAAMA,EAAK,SACrD,OAAQH,EAAM,UAAW,IAAK,EAC9CF,EAAO,IAAIK,EAAMG,CAAK,GAEhBA,CACR,CAIA,SAASC,EAAY,EAAwC,CAC5D,IAAMC,EAASL,EAAK,SACpB,GAAI,CAACP,EAAiBY,CAAM,EAAG,OAAOA,EAEtC,IAAMC,EAAM,IAAIZ,EAAM,eACtBY,EAAI,SAASD,EAAO,KAAK,EACzB,IAAK,GAAM,CAACE,EAAMC,KAAc,OAAO,QAAQH,EAAO,UAAU,EAC/DC,EAAI,aAAaC,EAAMC,CAAS,EAKjC,MAJA,GAAI,YAAcH,EAAO,aAAa,MAAM,GAAK,KACjD,EAAI,eAAiBA,EAAO,gBAAgB,MAAM,GAAK,KACvDI,EAAeH,EAAKD,CAAM,EAC1B,EAAK,SAAWC,EACTA,CACR,CAEA,SAASI,EAAQ,EAAkB,EAAmC,EAAwB,CAC7F,IAAMC,EAAWP,EAAYJ,CAAI,EAGjC,GAFAW,EAAS,YAAY,EAEjBR,EAAM,OAAO,OAAS,GAAK,CAACA,EAAM,UAAW,CAChD,EAAK,SAAWA,EAAM,KACtBR,EAAO,OAAOK,CAAI,EAClB,MACD,CAGA,IAAIY,EAAW,GACXC,EAAS,EACTC,EAAc,EACZC,MAAc,CACfH,GAAY,GAAGD,EAAS,SAASC,EAAUC,EAASD,EAAUE,CAAW,EAC7E,EAAW,EACZ,EACA,IAAK,IAAIE,EAAI,EAAGA,EAAIC,EAAQ,OAAQ,IAAK,CACxC,GAAId,EAAM,OAAO,IAAIa,CAAC,EAAG,CACxBD,EAAM,EACN,QACD,CACA,GAAM,CAAE,aAAY,cAAeE,EAAQD,GACrCE,EAAW,KAAM,WAAW,QAAQ,IAAIF,CAAC,GAC3CJ,EAAW,GAAKM,IAAaJ,GAAeK,IAAeN,KAC9DE,EAAM,EACN,EAAWI,EACX,EAAcD,GAEf,EAASC,EAAaC,CACvB,CACAL,EAAM,EAEN,EAAK,SAAWZ,EAAM,UAAY,CAACA,EAAM,KAAMA,EAAM,UAAU,QAAQ,EAAI,CAACA,EAAM,IAAI,CACvF,CAEA,SAASkB,EAAO,EAAkB,EAA0C,CAC3E,IAAMJ,EAAUnB,EAAUE,CAAI,EAC9B,GAAI,CAACiB,EAAS,OACd,IAAMd,EAAQD,EAAQF,CAAI,EAC1BsB,EAAOnB,CAAK,EACZO,EAAQV,EAAMiB,EAASd,CAAK,EAC5BP,EAAU,IAAII,CAAI,CAAC,EAAE,QAAS,GAAauB,EAAS,CAAC,CACtD,CAGA,SAAgBC,EAAiB,EAAuC,CACvE,OAAO7B,EAAO,IAAIK,CAAI,CAAC,EAAE,QAAUH,CACpC,CAEA,SAAgB4B,EAAiB,EAAkB,EAAmC,CACrF,IAAMC,EAAUF,EAAiBxB,CAAI,EACjC0B,EAAQ,OAASC,EAAO,MAAQ,CAAC,GAAGA,CAAM,CAAC,CAAC,MAAO,GAAMD,EAAQ,IAAIV,CAAC,CAAC,GAC3EK,EAAOrB,EAAO,GAAU,CACvB,EAAM,OAAS,IAAI,IAAI2B,CAAM,CAC9B,CAAC,CACF,CAGA,SAAgBC,EAAgB,EAAkC,CACjE,OACCjC,EAAO,IAAIK,CAAI,CAAC,EAAE,OAAS,MAAM,QAAQA,EAAK,QAAQ,EAAIA,EAAK,SAAS,GAAMA,EAAK,SAErF,CAGA,SAAgB6B,EACf,EACA,EACA,EACO,CACPR,EAAOrB,EAAO,GAAU,CACvB,EAAM,UAAY,CAAE,UAAS,UAAS,CACvC,CAAC,CACF,CAEA,SAAgB8B,EAAqB,EAAwB,CACvDnC,EAAO,IAAIK,CAAI,CAAC,EAAE,WACvBqB,EAAOrB,EAAO,GAAU,CACvB,EAAM,UAAY,IACnB,CAAC,CACF,CAGA,SAAgB+B,EAAmB,EAAkB,EAAkC,CACtF,IAAIC,EAAMpC,EAAU,IAAII,CAAI,EAG5B,OAFKgC,GAAKpC,EAAU,IAAII,EAAO,kBAAM,IAAI,GAAM,EAC/CgC,EAAI,IAAIT,CAAQ,MACHS,EAAI,OAAOT,CAAQ,CACjC,C"}
|
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){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
|
|
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-CLtLo5Bh.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 F(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 ee(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 I={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 te(e,n,i,a,o){if(B(e,re(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)>I.SCALE_RATIO_THRESHOLD||u>I.HUGE_THRESHOLD?(i.near=u*I.NEAR_PLANE_FACTOR.TINY,i.far=u*I.FAR_PLANE_FACTOR.HUGE):u>I.LARGE_THRESHOLD?(i.near=u*I.NEAR_PLANE_FACTOR.SMALL,i.far=u*I.FAR_PLANE_FACTOR.LARGE):(i.near=Math.max(.01,u*I.NEAR_PLANE_FACTOR.NORMAL),i.far=Math.max(2e3,u*I.FAR_PLANE_FACTOR.NORMAL)),i.updateProjectionMatrix(),!o){let e=u*I.INITIAL_DISTANCE_MULTIPLIER;i.position.copy(c).add(N(i.up,e)),a.target.copy(c),a.update()}}const ne=/* @__PURE__ */ new Set([`grid`,`floor`,`label-layer`,`measure`]);function L(e){return typeof e.userData.id==`string`&&ne.has(e.userData.id)}function R(e){let t=e;for(;t;){if(L(t))return!0;t=t.parent}return!1}function z(e){e.updateMatrixWorld(!0);let t=new r.Box3;return e.traverse(e=>{let n=e;e.visible&&!R(e)&&n.geometry&&t.expandByObject(e)}),t}function re(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 ie=/* @__PURE__ */ new Set([`floor`,`grid`,`label-layer`]);function B(e,n=/* @__PURE__ */ new Set){let r=[],i=[];for(let t of e.children)ie.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=oe(_,i,g,e,()=>{l===`orthographic`&&m()}):(_.position.copy(g),i.target.copy(e),l===`orthographic`&&m(),i.update())},_=(e,n=!0)=>{let a=z(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 U=e=>1-(1-e)**3;function oe(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=U(Math.min((performance.now()-c)/a,1));e.position.lerpVectors(o,n,d),t.target.lerpVectors(s,r,d),i(),t.update(),d<1&&(l=requestAnimationFrame(u))};return l=requestAnimationFrame(u),{cancel:()=>{l!==null&&(cancelAnimationFrame(l),l=null)}}}function se(e){let t=Math.floor(e.length/6);if(t===0)return 1/0;let n=Math.max(1,Math.ceil(t/4096)),r=[];for(let i=0;i<t;i+=n){let t=i*6,n=Math.hypot(e[t+3]-e[t],e[t+4]-e[t+1],e[t+5]-e[t+2]);n>0&&r.push(n)}return r.length===0?1/0:(r.sort((e,t)=>e-t),r[Math.min(r.length-1,Math.floor(r.length*.15))])}function W(e){let t=new l.LineSegmentsGeometry;return t.setPositions(e),{geometry:t,segmentCount:e.length/6,edgeSpacing:se(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 X=/* @__PURE__ */ new Map;function xe(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=X.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(()=>{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 Se(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 Ce(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 we(e,t,r){return n.o(e,t,r),()=>n.t(e)}function Te(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 Ee(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 De(e,t,r){let{segments:i,faces:a}=r;if(!a||!Z(t))return;let o,s=!1,c=()=>{let r=n.r(t);if(r.size===0&&!s||(o??=Te(t,a),!o))return;let c=r.size===0?i:Ee(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 Oe(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 ke=class{options;byKey=/* @__PURE__ */ new Map;constructor(e){this.options=e}for(e,t){let n=this.options.forcedColor??Oe(e,this.options.darken),r=n.getHex()*2+ +!!t,i=this.byKey.get(r);return i||(i=Ae(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 Ae(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 je(e,t,n){let r=new c.LineSegments2(e.geometry,t);return r.userData.kind=le,r.raycast=()=>{},n&&Fe(r,e.edgeSpacing),r}const Me=new r.Vector3,Ne=new r.Vector3;function Pe(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;Me.copy(i.center).applyMatrix4(e.matrixWorld);let o=Ne.setFromMatrixPosition(t.matrixWorld).distanceTo(Me);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 Fe(e,t){e.onBeforeRender=(n,i,a)=>{c.LineSegments2.prototype.onBeforeRender.call(e,n);let o=e.material,s=t*Pe(e,a,o.resolution.y);o.opacity=r.MathUtils.clamp((s-1)/3,0,1)}}function Ie(e){return e.userData?.kind===le}function Le(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 Re(e,t,n,r){let i=W(t.segments),a=r.distanceFade&&i.segmentCount<=r.maxSegments,o=je(i,n.for(e,a),a);return e.add(o),De(o,e,t),o}const ze=/* @__PURE__ */ new WeakMap;function Be(e){return ze.get(e)??0}function Ve(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}async function He(e,t={}){let n=ue(t),r=new ke(n),i=Be(e),a=[],o=Le(e,n).map(async t=>{let o=await xe(t.geometry,n.thresholdAngle);Be(e)===i&&Ve(t,e)&&(t.children.some(e=>e.userData?.kind===`edge-overlay`)||a.push(Re(t,o,r,n)))});return await Promise.all(o),r.disposeUnused(a),a}function Ue(e){ze.set(e,Be(e)+1);let t=[];e.traverse(e=>{e instanceof c.LineSegments2&&Ie(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 We(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 Ge(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);
|
|
@@ -50,7 +50,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
|
|
|
50
50
|
if (alpha < 0.001) discard;
|
|
51
51
|
gl_FragColor = vec4(color, alpha);
|
|
52
52
|
}
|
|
53
|
-
`,transparent:!0,depthWrite:!1,side:r.DoubleSide,uniforms:{uAxes:{value:c},uCell:{value:t},uMajor:{value:n},uCellColor:{value:new r.Color(i)},uMajorColor:{value:new r.Color(a)},uCenter:{value:new r.Vector3},uFade:{value:o}}}),f=new r.Mesh(u,d);f.name=`grid`,f.userData.id=`grid`,f.renderOrder=-1;let p=o,m=o*l,h=new r.Vector3;return{object:f,update:e=>{s===`y`?(f.position.set(e.x,0,e.z),h.set(e.x,0,e.z)):s===`z`?(f.position.set(e.x,e.y,0),h.set(e.x,e.y,0)):(f.position.set(0,e.y,e.z),h.set(0,e.y,e.z)),d.uniforms.uCenter.value.copy(h),f.scale.setScalar(m)},fitToContent:e=>{if(e.isEmpty())return;let t=e.getSize(new r.Vector3),n=(e,t)=>t===0?e.x:t===1?e.y:e.z,i=Math.max(n(t,c.x),n(t,c.y));i>0&&Number.isFinite(i)&&(d.uniforms.uCell.value=Ge(i/20),p=i*2,d.uniforms.uFade.value=p,m=p*l)},setVisible:e=>{f.visible=e},dispose:()=>{f.removeFromParent(),u.dispose(),d.dispose()}}}function qe(e,t){let n=new u.CSS2DRenderer,i=n.domElement;i.style.position=`absolute`,i.style.top=`0`,i.style.left=`0`,i.style.overflow=`hidden`,i.style.pointerEvents=`none`,i.style.zIndex=`30`,getComputedStyle(e).position===`static`&&(e.style.position=`relative`),e.appendChild(i);let a={width:e.clientWidth||1,height:e.clientHeight||1};n.setSize(a.width,a.height);let o=new r.Group;o.name=`label-layer`,o.userData.id=`label-layer`,t.add(o);let s=/* @__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 u.CSS2DObject(r);return i.position.copy(t),o.add(i),s.add(i),{object:i,setPosition:e=>i.position.copy(e),setText:e=>{r.textContent=e},remove:()=>{i.removeFromParent(),r.remove(),s.delete(i)}}},render:(e,t)=>n.render(e,t),setSize:(e,t)=>n.setSize(e,t),dispose:()=>{s.forEach(e=>{e.removeFromParent(),e.element.remove()}),s.clear(),o.removeFromParent(),i.remove()}}}const Je=.015,Ye={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 Xe(e){let t=e&&Ye[e]||Ye.Meters;return e=>`${(e/t.metersPerUnit).toPrecision(3)} ${t.suffix}`}function Ze(e,t){if(e.isOrthographicCamera){let t=e;return Math.abs(t.top-t.bottom)/(t.zoom||1)*Je}return((t?e.position.distanceTo(t):e.position.length())||1)*Je}function Qe(e){let t=e.object;if(t instanceof r.Mesh)return e.face?[e.face.a,e.face.b,e.face.c]:null;if(t instanceof r.Points)return e.index==null?null:[e.index];if(t instanceof r.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 $e(e,t,n,i){let a=e.point.clone(),o=e.object,s=Qe(e);if(!s||!o.geometry)return a;let c=o.geometry.attributes.position;if(!c)return a;let l=e=>{let i=e.clone().project(t);return new r.Vector2((i.x+1)/2*n.width,(1-i.y)/2*n.height)},u=l(a),d=a,f=i;for(let e of s){if(e>=c.count)continue;let t=new r.Vector3().fromBufferAttribute(c,e).applyMatrix4(o.matrixWorld),n=l(t).distanceTo(u);n<f&&(f=n,d=t)}return d}function et(e){let{canvas:t,scene:n,getActiveCamera:s,getViewTarget:c,labelLayer:l,options:u={}}=e,d=u.snapPixels??12,f=new r.Color(u.color??16763904),p=Xe(u.displayUnit),m=u.format??((e,t)=>`${p(e)}\nΔx ${p(t.x)} Δy ${p(t.y)} Δz ${p(t.z)}`),h=new r.Raycaster,g=new r.Vector2,_=!1,v=[],y=[],b=null,x=null,S=new r.PointsMaterial({color:f,size:8,sizeAttenuation:!1,depthTest:!1}),C=new r.PointsMaterial({color:f,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 r.BufferGeometry;e.setAttribute(`position`,new r.Float32BufferAttribute([0,0,0],3)),w=new r.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 r.BufferGeometry;t.setAttribute(`position`,new r.Float32BufferAttribute([e.x,e.y,e.z],3));let i=new r.Points(t,S);return i.renderOrder=999,i.userData.id=`measure`,i.raycast=()=>{},n.add(i),i},D=()=>{v.length=0,y.forEach(e=>{e.geometry.dispose(),e.removeFromParent()}),y.length=0,b&&=(b.geometry.dispose(),b.material.dispose(),b.removeFromParent(),null),x?.remove(),x=null},O=()=>{if(v.length!==2)return;let[e,t]=v,s=new a.LineGeometry;s.setPositions([e.x,e.y,e.z,t.x,t.y,t.z]);let c=new o.LineMaterial({color:f});c.linewidth=2,c.depthTest=!1,b=new i.Line2(s,c),b.renderOrder=998,b.userData.id=`measure`,b.raycast=()=>{},n.add(b);let d=e.clone().add(t).multiplyScalar(.5),p=new r.Vector3(Math.abs(t.x-e.x),Math.abs(t.y-e.y),Math.abs(t.z-e.z));x=l.addLabel(m(e.distanceTo(t),p),d,u.labelClassName)},k=e=>{let r=t.getBoundingClientRect();g.x=(e.clientX-r.left)/r.width*2-1,g.y=-((e.clientY-r.top)/r.height)*2+1;let i=s();h.setFromCamera(g,i);let a=Ze(i,c?.());h.params.Line.threshold=a,h.params.Points.threshold=a;let o=h.intersectObjects(n.children,!0).filter(e=>e.object.userData.id!==`measure`&&e.object.userData.id!==`grid`);return o.length===0?null:$e(o[0],i,{width:r.width,height:r.height},d)},A=null,j=0,M=()=>{j&&=(cancelAnimationFrame(j),0),A=null};return{setEnabled:e=>{_=e,e||(M(),D(),T(null))},isEnabled:()=>_,handleClick:e=>{if(!_)return!1;v.length===2&&D();let t=k(e);return t===null||(v.push(t),y.push(E(t)),v.length===2&&O()),!0},handleMove:e=>{_&&(A=e,!j&&(j=requestAnimationFrame(()=>{j=0;let e=A;A=null,_&&e&&T(k(e))})))},clear:D,dispose:()=>{M(),D(),w&&=(w.geometry.dispose(),w.removeFromParent(),null),S.dispose(),C.dispose()}}}const tt=[];function nt({camera:e,scene:t,groundNormals:n=()=>tt}){let i=e.near,a=e.near,o=rt();return{update:()=>{e.near!==a&&(i=e.near);let s=o.measure(t,e),c=i;if(s!==null){let t=s;for(let r of n())t=Math.min(t,Math.abs(e.position.dot(r)));c=r.MathUtils.clamp(t*.5,i,e.far*.01)}Math.abs(c-a)>a*.05&&(e.near=c,e.updateProjectionMatrix(),a=c)}}}function rt(){let e=/* @__PURE__ */ new WeakMap,t=new r.Frustum,n=new r.Matrix4,i=new r.Vector3,a=new r.Box3,o=/* @__PURE__ */ new Float64Array(20),s=/* @__PURE__ */ new Float64Array(20),c=/* @__PURE__ */ new Float32Array(6),l=/* @__PURE__ */ new Float64Array(21),u=/* @__PURE__ */ new Float64Array(21),d=1/0,f=!1,p=(t,n)=>{let r=n.getAttribute(`position`),i=n.getIndex(),a=e.get(n);if(a&&a.position===r&&a.positionVersion===at(r)&&a.index===i&&a.indexVersion===(i?.version??-1))return a;let o={...st(r,i,ot(t)),position:r,positionVersion:at(r),index:i,indexVersion:i?.version??-1};return e.set(n,o),o},m=(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;l[e*3]=r.getX(t),l[e*3+1]=r.getY(t),l[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,c=l[t*3],d=l[t*3+1],f=l[t*3+2],p=l[n*3],m=l[n*3+1],h=l[n*3+2],g=r*c+i*d+a*f+o,_=r*p+i*m+a*h+o;if(g>=0&&(u[s*3]=c,u[s*3+1]=d,u[s*3+2]=f,s++),g>=0!=_>=0){let e=g/(g-_);u[s*3]=c+(p-c)*e,u[s*3+1]=d+(m-d)*e,u[s*3+2]=f+(h-f)*e,s++}}[l,u]=[u,l],e=s}for(let t=0;t<e;t++){let e=n[16]*l[t*3]+n[17]*l[t*3+1]+n[18]*l[t*3+2]+n[19];e<o&&(o=e)}}return o},h=e=>{let t=e.elements;for(let e=0;e<20;e+=4){let n=o[e],r=o[e+1],i=o[e+2];s[e]=t[0]*n+t[1]*r+t[2]*i,s[e+1]=t[4]*n+t[5]*r+t[6]*i,s[e+2]=t[8]*n+t[9]*r+t[10]*i,s[e+3]=n*t[12]+r*t[13]+i*t[14]+o[e+3]}return s},g=(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 u=t[16],f=t[17],p=t[18],h=u*(u>0?i:s)+f*(f>0?a:c)+p*(p>0?o:l)+t[19];h>=d||(d=n?Math.min(d,m(n,r/6,t)):h)}},_=e=>{let t=e.geometry;if(!t?.getAttribute?.(`position`))return;if(f=!0,it(e)){let n=p(e,t);g(n.boxes,h(e.matrixWorld),n);return}let n=e;n.isInstancedMesh?(n.boundingBox||n.computeBoundingBox(),a.copy(n.boundingBox)):(t.boundingBox||t.computeBoundingBox(),a.copy(t.boundingBox)),!a.isEmpty()&&(c[0]=a.min.x,c[1]=a.min.y,c[2]=a.min.z,c[3]=a.max.x,c[4]=a.max.y,c[5]=a.max.z,g(c,h(e.matrixWorld)))},v=e=>{if(e.visible&&!L(e)&&e.userData.kind!==`edge-overlay`){_(e);for(let t of e.children)v(t)}};return{measure:(e,r)=>{e.updateMatrixWorld(),r.updateMatrixWorld(),n.multiplyMatrices(r.projectionMatrix,r.matrixWorldInverse),t.setFromProjectionMatrix(n);for(let e=0;e<4;e++){let n=t.planes[e];o[e*4]=n.normal.x,o[e*4+1]=n.normal.y,o[e*4+2]=n.normal.z,o[e*4+3]=n.constant}r.getWorldDirection(i),o[16]=i.x,o[17]=i.y,o[18]=i.z,o[19]=-i.dot(r.position),d=1/0,f=!1;for(let t of e.children)v(t);return f?d:null}}}function it(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 at(e){return e.isInterleavedBufferAttribute?e.data.version:e.version}function ot(e){let t=[];for(let n of X(e)??[])n.indexStart!==void 0&&t.push(n.indexStart/3);return t.sort((e,t)=>e-t)}function st(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 ct(){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 lt(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 ut(e){let{camera:t,domElement:n,controller:i}=e,a=new d.ViewHelper(t,n);a.setLabels(`X`,`Y`,`Z`);let o=!0,s=new r.Raycaster,c=new r.OrthographicCamera(-2,2,2,-2,0,4);c.position.set(0,0,2),c.updateMatrixWorld();let l={posX:new r.Vector3(1,0,0),negX:new r.Vector3(-1,0,0),posY:new r.Vector3(0,1,0),negY:new r.Vector3(0,-1,0),posZ:new r.Vector3(0,0,1),negZ:new r.Vector3(0,0,-1)},u=e=>{let i=n.getBoundingClientRect(),o=i.left+n.offsetWidth-128-a.location.right,u=i.top+n.offsetHeight-128-a.location.bottom,d=new r.Vector2((e.clientX-o)/128*2-1,-((e.clientY-u)/128)*2+1);if(Math.abs(d.x)>1||Math.abs(d.y)>1)return null;a.quaternion.copy(t.quaternion).invert(),a.updateMatrixWorld(),s.setFromCamera(d,c);let f=s.intersectObjects(a.children,!1);for(let e of f){let t=e.object.userData?.type;if(typeof t==`string`&&t in l)return t}return null};return{render:e=>{if(!o)return;let t=e.autoClear;e.autoClear=!1,a.render(e),e.autoClear=t},handleClick:e=>{if(!o)return!1;let t=u(e);return t?(i.getProjection()===`orthographic`&&i.setProjection(`perspective`),i.setViewDirection(l[t],!1),!0):!1},setVisible:e=>{o=e},isVisible:()=>o,dispose:()=>a.dispose()}}function dt(e,t,n,i,a,o,s,c,l,u,d,f,p,m,h=!0){let g=null,_=performance.now(),v=!0,y=0,b=new r.Matrix4,x=new r.Matrix4,S=null,C=()=>{v=!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(h)for(let e of E)T.addEventListener(e,C,{passive:!0});let D=()=>{let{width:t,height:r}=s();if(t===0||r===0)return;let i=Math.floor(t*c),o=Math.floor(r*c);(e.domElement.width!==i||e.domElement.height!==o)&&(e.setPixelRatio(c),e.setSize(t,r,!1),n.aspect=t/r,n.updateProjectionMatrix(),a.updateAspect(t,r),f?.()?.setSize(t,r,c),p?.setSize(t,r),C())},O=(n,r)=>{let i=f?.();i?(i.setCamera(n),i.render(r)):e.render(t,n),p&&p.render(t,n),d&&d.render(e)},k=()=>{O(i(),0)},A=function(){g=requestAnimationFrame(A);let e=performance.now(),t=(e-_)/1e3;_=e,D(),(o.enableDamping||o.autoRotate)&&o.update(),u&&u.update(i().position),m&&m.update(),l?.(t);let n=i();if(h){if(!(v||w(n)||e-y>=500))return;v=!1,y=e}O(n,t)};return{animate:A,dispose:()=>{if(g!==null&&(cancelAnimationFrame(g),g=null),h)for(let e of E)T.removeEventListener(e,C)},invalidate:C,renderNow:k}}const Z=new r.Vector3(0,0,1);function ft(e){let n=e.sceneScale||`m`,i={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],a=e.look??`technical`,o=t.c[a];return{sceneScale:n,look:a,camera:{position:e.camera?.position||N(e.environment?.sceneUp??Z,i.cameraDistance*Math.sqrt(3)),fov:e.camera?.fov||20,near:e.camera?.near||i.near,far:e.camera?.far||i.far,target:e.camera?.target||new r.Vector3(0,0,0),dynamicNear:e.camera?.dynamicNear??!0},lighting:{enableSunlight:e.lighting?.enableSunlight??!0,sunlightIntensity:e.lighting?.sunlightIntensity??o.sunlightIntensity,sunlightPosition:e.lighting?.sunlightPosition||P(e.environment?.sceneUp??Z,i.lightDistance,i.lightHeight),ambientLightColor:e.lighting?.ambientLightColor||new r.Color(4210752),ambientLightIntensity:e.lighting?.ambientLightIntensity??o.ambientIntensity,sunlightColor:e.lighting?.sunlightColor||16777215,enableHemisphereLight:e.lighting?.enableHemisphereLight??o.hemisphereIntensity>0,hemisphereSkyColor:e.lighting?.hemisphereSkyColor??14673663,hemisphereGroundColor:e.lighting?.hemisphereGroundColor??7036754,hemisphereIntensity:e.lighting?.hemisphereIntensity??o.hemisphereIntensity},environment:{hdrPath:e.environment?.hdrPath||`/baseHDR.hdr`,backgroundColor:e.environment?.backgroundColor||new r.Color(15790320),enableEnvironmentLighting:e.environment?.enableEnvironmentLighting??!0,sceneUp:e.environment?.sceneUp||Z,showEnvironment:e.environment?.showEnvironment??!1,environmentIntensity:e.environment?.environmentIntensity??o.environmentIntensity},floor:{enabled:e.floor?.enabled??!1,size:e.floor?.size||i.floorSize,color:e.floor?.color||new r.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??o.toneMapping,toneMappingExposure:e.render?.toneMappingExposure??o.toneMappingExposure,preserveDrawingBuffer:e.render?.preserveDrawingBuffer??!1,ambientOcclusion:e.render?.ambientOcclusion??o.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||i.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??te(e.environment?.sceneUp??Z)},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 Q=`__selvaLookBaseline`;function pt(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[Q];t&&(pt(e,t),delete e[Q])}function ht(e,t){let n=e;t?(n[Q]?pt(n,n[Q]):n[Q]={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 gt(e,n){if(n.materialOverride)return n.envMapIntensity;let r=e.userData[t.l];if(r!=null)return r;let i=e,a=i[Q]?.metalness??i.metalness??0;return t.u(n.envMapIntensity,a)}function _t(e){let{scene:n,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 r.HemisphereLight(e.hemisphereSkyColor??o.lighting.hemisphereSkyColor,e.hemisphereGroundColor??o.lighting.hemisphereGroundColor,e.hemisphereIntensity),a.hemisphere.position.copy(o.environment.sceneUp??Z),n.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,n.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 r=t.c[e];l=e,i.toneMapping=r.toneMapping,i.toneMappingExposure=r.toneMappingExposure,o.render.toneMapping=r.toneMapping,o.render.toneMappingExposure=r.toneMappingExposure,u({hemisphereIntensity:r.hemisphereIntensity,ambientIntensity:r.ambientIntensity}),d(r.environmentIntensity),a.sun&&(a.sun.intensity=r.sunlightIntensity,o.lighting.sunlightIntensity=r.sunlightIntensity);let f=s.get()!==null;s.setAmbientOcclusion(r.ambientOcclusion),f&&s.rebuild(),n.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,n=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of n)`envMapIntensity`in e&&(e.envMapIntensity=gt(e,r)),ht(e,r.materialOverride)}),j(n,n),c()},getMaterialAppearance:()=>t.d(l)}}function vt(e,t){let n=t.parentElement,i=n?n.clientWidth:window.innerWidth,a=n?n.clientHeight:window.innerHeight,o=new r.PerspectiveCamera(e.camera.fov,i/a,e.camera.near,e.camera.far),s=e.camera.position;return s&&o.position.set(s.x,s.y,s.z),o}function yt(e){let t=new r.Scene;return t.background=(typeof e.environment.backgroundColor==`string`?new r.Color(e.environment.backgroundColor):e.environment.backgroundColor)||null,t}function bt(e,n){t.t(e,n),e.environment?.dispose(),A(e),e.background instanceof r.Texture&&e.background.dispose()}const $={uniforms:{tDiffuse:{value:null},tNormal:{value:null},tDepth:{value:null},uResolution:{value:new r.Vector2(1,1)},uColor:{value:new r.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:r.DoubleSide,uniforms:{uAxes:{value:c},uCell:{value:t},uMajor:{value:n},uCellColor:{value:new r.Color(i)},uMajorColor:{value:new r.Color(a)},uCenter:{value:new r.Vector3},uFade:{value:o}}}),f=new r.Mesh(u,d);f.name=`grid`,f.userData.id=`grid`,f.renderOrder=-1;let p=o,m=o*l,h=new r.Vector3;return{object:f,update:e=>{s===`y`?(f.position.set(e.x,0,e.z),h.set(e.x,0,e.z)):s===`z`?(f.position.set(e.x,e.y,0),h.set(e.x,e.y,0)):(f.position.set(0,e.y,e.z),h.set(0,e.y,e.z)),d.uniforms.uCenter.value.copy(h),f.scale.setScalar(m)},fitToContent:e=>{if(e.isEmpty())return;let t=e.getSize(new r.Vector3),n=(e,t)=>t===0?e.x:t===1?e.y:e.z,i=Math.max(n(t,c.x),n(t,c.y));i>0&&Number.isFinite(i)&&(d.uniforms.uCell.value=We(i/20),p=i*2,d.uniforms.uFade.value=p,m=p*l)},setVisible:e=>{f.visible=e},dispose:()=>{f.removeFromParent(),u.dispose(),d.dispose()}}}function Ke(e,t){let n=new u.CSS2DRenderer,i=n.domElement;i.style.position=`absolute`,i.style.top=`0`,i.style.left=`0`,i.style.overflow=`hidden`,i.style.pointerEvents=`none`,i.style.zIndex=`30`,getComputedStyle(e).position===`static`&&(e.style.position=`relative`),e.appendChild(i);let a={width:e.clientWidth||1,height:e.clientHeight||1};n.setSize(a.width,a.height);let o=new r.Group;o.name=`label-layer`,o.userData.id=`label-layer`,t.add(o);let s=/* @__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 u.CSS2DObject(r);return i.position.copy(t),o.add(i),s.add(i),{object:i,setPosition:e=>i.position.copy(e),setText:e=>{r.textContent=e},remove:()=>{i.removeFromParent(),r.remove(),s.delete(i)}}},render:(e,t)=>n.render(e,t),setSize:(e,t)=>n.setSize(e,t),dispose:()=>{s.forEach(e=>{e.removeFromParent(),e.element.remove()}),s.clear(),o.removeFromParent(),i.remove()}}}const qe=.015,Je={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 Ye(e){let t=e&&Je[e]||Je.Meters;return e=>`${(e/t.metersPerUnit).toPrecision(3)} ${t.suffix}`}function Xe(e,t){if(e.isOrthographicCamera){let t=e;return Math.abs(t.top-t.bottom)/(t.zoom||1)*qe}return((t?e.position.distanceTo(t):e.position.length())||1)*qe}function Ze(e){let t=e.object;if(t instanceof r.Mesh)return e.face?[e.face.a,e.face.b,e.face.c]:null;if(t instanceof r.Points)return e.index==null?null:[e.index];if(t instanceof r.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 Qe(e,t,n,i){let a=e.point.clone(),o=e.object,s=Ze(e);if(!s||!o.geometry)return a;let c=o.geometry.attributes.position;if(!c)return a;let l=e=>{let i=e.clone().project(t);return new r.Vector2((i.x+1)/2*n.width,(1-i.y)/2*n.height)},u=l(a),d=a,f=i;for(let e of s){if(e>=c.count)continue;let t=new r.Vector3().fromBufferAttribute(c,e).applyMatrix4(o.matrixWorld),n=l(t).distanceTo(u);n<f&&(f=n,d=t)}return d}function $e(e){let{canvas:t,scene:n,getActiveCamera:s,getViewTarget:c,labelLayer:l,options:u={}}=e,d=u.snapPixels??12,f=new r.Color(u.color??16763904),p=Ye(u.displayUnit),m=u.format??((e,t)=>`${p(e)}\nΔx ${p(t.x)} Δy ${p(t.y)} Δz ${p(t.z)}`),h=new r.Raycaster,g=new r.Vector2,_=!1,v=[],y=[],b=null,x=null,S=new r.PointsMaterial({color:f,size:8,sizeAttenuation:!1,depthTest:!1}),C=new r.PointsMaterial({color:f,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 r.BufferGeometry;e.setAttribute(`position`,new r.Float32BufferAttribute([0,0,0],3)),w=new r.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 r.BufferGeometry;t.setAttribute(`position`,new r.Float32BufferAttribute([e.x,e.y,e.z],3));let i=new r.Points(t,S);return i.renderOrder=999,i.userData.id=`measure`,i.raycast=()=>{},n.add(i),i},D=()=>{v.length=0,y.forEach(e=>{e.geometry.dispose(),e.removeFromParent()}),y.length=0,b&&=(b.geometry.dispose(),b.material.dispose(),b.removeFromParent(),null),x?.remove(),x=null},O=()=>{if(v.length!==2)return;let[e,t]=v,s=new a.LineGeometry;s.setPositions([e.x,e.y,e.z,t.x,t.y,t.z]);let c=new o.LineMaterial({color:f});c.linewidth=2,c.depthTest=!1,b=new i.Line2(s,c),b.renderOrder=998,b.userData.id=`measure`,b.raycast=()=>{},n.add(b);let d=e.clone().add(t).multiplyScalar(.5),p=new r.Vector3(Math.abs(t.x-e.x),Math.abs(t.y-e.y),Math.abs(t.z-e.z));x=l.addLabel(m(e.distanceTo(t),p),d,u.labelClassName)},k=e=>{let r=t.getBoundingClientRect();g.x=(e.clientX-r.left)/r.width*2-1,g.y=-((e.clientY-r.top)/r.height)*2+1;let i=s();h.setFromCamera(g,i);let a=Xe(i,c?.());h.params.Line.threshold=a,h.params.Points.threshold=a;let o=h.intersectObjects(n.children,!0).filter(e=>e.object.userData.id!==`measure`&&e.object.userData.id!==`grid`);return o.length===0?null:Qe(o[0],i,{width:r.width,height:r.height},d)},A=null,j=0,M=()=>{j&&=(cancelAnimationFrame(j),0),A=null};return{setEnabled:e=>{_=e,e||(M(),D(),T(null))},isEnabled:()=>_,handleClick:e=>{if(!_)return!1;v.length===2&&D();let t=k(e);return t===null||(v.push(t),y.push(E(t)),v.length===2&&O()),!0},handleMove:e=>{_&&(A=e,!j&&(j=requestAnimationFrame(()=>{j=0;let e=A;A=null,_&&e&&T(k(e))})))},clear:D,dispose:()=>{M(),D(),w&&=(w.geometry.dispose(),w.removeFromParent(),null),S.dispose(),C.dispose()}}}const et=[];function tt({camera:e,scene:t,groundNormals:n=()=>et}){let i=e.near,a=e.near,o=nt();return{update:()=>{e.near!==a&&(i=e.near);let s=o.measure(t,e),c=i;if(s!==null){let t=s;for(let r of n())t=Math.min(t,Math.abs(e.position.dot(r)));c=r.MathUtils.clamp(t*.5,i,e.far*.01)}Math.abs(c-a)>a*.05&&(e.near=c,e.updateProjectionMatrix(),a=c)}}}function nt(){let e=/* @__PURE__ */ new WeakMap,t=new r.Frustum,n=new r.Matrix4,i=new r.Vector3,a=new r.Box3,o=/* @__PURE__ */ new Float64Array(20),s=/* @__PURE__ */ new Float64Array(20),c=/* @__PURE__ */ new Float32Array(6),l=/* @__PURE__ */ new Float64Array(21),u=/* @__PURE__ */ new Float64Array(21),d=1/0,f=!1,p=(t,n)=>{let r=n.getAttribute(`position`),i=n.getIndex(),a=e.get(n);if(a&&a.position===r&&a.positionVersion===it(r)&&a.index===i&&a.indexVersion===(i?.version??-1))return a;let o={...ot(r,i,at(t)),position:r,positionVersion:it(r),index:i,indexVersion:i?.version??-1};return e.set(n,o),o},m=(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;l[e*3]=r.getX(t),l[e*3+1]=r.getY(t),l[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,c=l[t*3],d=l[t*3+1],f=l[t*3+2],p=l[n*3],m=l[n*3+1],h=l[n*3+2],g=r*c+i*d+a*f+o,_=r*p+i*m+a*h+o;if(g>=0&&(u[s*3]=c,u[s*3+1]=d,u[s*3+2]=f,s++),g>=0!=_>=0){let e=g/(g-_);u[s*3]=c+(p-c)*e,u[s*3+1]=d+(m-d)*e,u[s*3+2]=f+(h-f)*e,s++}}[l,u]=[u,l],e=s}for(let t=0;t<e;t++){let e=n[16]*l[t*3]+n[17]*l[t*3+1]+n[18]*l[t*3+2]+n[19];e<o&&(o=e)}}return o},h=e=>{let t=e.elements;for(let e=0;e<20;e+=4){let n=o[e],r=o[e+1],i=o[e+2];s[e]=t[0]*n+t[1]*r+t[2]*i,s[e+1]=t[4]*n+t[5]*r+t[6]*i,s[e+2]=t[8]*n+t[9]*r+t[10]*i,s[e+3]=n*t[12]+r*t[13]+i*t[14]+o[e+3]}return s},g=(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 u=t[16],f=t[17],p=t[18],h=u*(u>0?i:s)+f*(f>0?a:c)+p*(p>0?o:l)+t[19];h>=d||(d=n?Math.min(d,m(n,r/6,t)):h)}},_=e=>{let t=e.geometry;if(!t?.getAttribute?.(`position`))return;if(f=!0,rt(e)){let n=p(e,t);g(n.boxes,h(e.matrixWorld),n);return}let n=e;n.isInstancedMesh?(n.boundingBox||n.computeBoundingBox(),a.copy(n.boundingBox)):(t.boundingBox||t.computeBoundingBox(),a.copy(t.boundingBox)),!a.isEmpty()&&(c[0]=a.min.x,c[1]=a.min.y,c[2]=a.min.z,c[3]=a.max.x,c[4]=a.max.y,c[5]=a.max.z,g(c,h(e.matrixWorld)))},v=e=>{if(e.visible&&!L(e)&&e.userData.kind!==`edge-overlay`){_(e);for(let t of e.children)v(t)}};return{measure:(e,r)=>{e.updateMatrixWorld(),r.updateMatrixWorld(),n.multiplyMatrices(r.projectionMatrix,r.matrixWorldInverse),t.setFromProjectionMatrix(n);for(let e=0;e<4;e++){let n=t.planes[e];o[e*4]=n.normal.x,o[e*4+1]=n.normal.y,o[e*4+2]=n.normal.z,o[e*4+3]=n.constant}r.getWorldDirection(i),o[16]=i.x,o[17]=i.y,o[18]=i.z,o[19]=-i.dot(r.position),d=1/0,f=!1;for(let t of e.children)v(t);return f?d:null}}}function rt(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 it(e){return e.isInterleavedBufferAttribute?e.data.version:e.version}function at(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 ot(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 st(){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 ct(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 lt(e){let{camera:t,domElement:n,controller:i}=e,a=new d.ViewHelper(t,n);a.setLabels(`X`,`Y`,`Z`);let o=!0,s=new r.Raycaster,c=new r.OrthographicCamera(-2,2,2,-2,0,4);c.position.set(0,0,2),c.updateMatrixWorld();let l={posX:new r.Vector3(1,0,0),negX:new r.Vector3(-1,0,0),posY:new r.Vector3(0,1,0),negY:new r.Vector3(0,-1,0),posZ:new r.Vector3(0,0,1),negZ:new r.Vector3(0,0,-1)},u=e=>{let i=n.getBoundingClientRect(),o=i.left+n.offsetWidth-128-a.location.right,u=i.top+n.offsetHeight-128-a.location.bottom,d=new r.Vector2((e.clientX-o)/128*2-1,-((e.clientY-u)/128)*2+1);if(Math.abs(d.x)>1||Math.abs(d.y)>1)return null;a.quaternion.copy(t.quaternion).invert(),a.updateMatrixWorld(),s.setFromCamera(d,c);let f=s.intersectObjects(a.children,!1);for(let e of f){let t=e.object.userData?.type;if(typeof t==`string`&&t in l)return t}return null};return{render:e=>{if(!o)return;let t=e.autoClear;e.autoClear=!1,a.render(e),e.autoClear=t},handleClick:e=>{if(!o)return!1;let t=u(e);return t?(i.getProjection()===`orthographic`&&i.setProjection(`perspective`),i.setViewDirection(l[t],!1),!0):!1},setVisible:e=>{o=e},isVisible:()=>o,dispose:()=>a.dispose()}}function ut(e,t,n,i,a,o,s,c,l,u,d,f,p,m,h=!0,g){let _=null,v=performance.now(),y=!0,b=0,x=new r.Matrix4,S=new r.Matrix4,C=null,w=()=>{y=!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(h)for(let e of D)E.addEventListener(e,w,{passive:!0});let O=()=>{let{width:t,height:r}=s();if(t===0||r===0)return;let i=Math.floor(t*c),o=Math.floor(r*c);(e.domElement.width!==i||e.domElement.height!==o)&&(e.setPixelRatio(c),e.setSize(t,r,!1),n.aspect=t/r,n.updateProjectionMatrix(),a.updateAspect(t,r),f?.()?.setSize(t,r,c),p?.setSize(t,r),w())},k=(n,r)=>{let i=f?.();i?(i.setCamera(n),i.render(r)):e.render(t,n),g&&g.render(n),p&&p.render(t,n),d&&d.render(e)},A=()=>{k(i(),0)},j=function(){_=requestAnimationFrame(j);let e=performance.now(),t=(e-v)/1e3;v=e,O(),(o.enableDamping||o.autoRotate)&&o.update(),u&&u.update(i().position),m&&m.update(),l?.(t);let n=i();if(h){if(!(y||T(n)||e-b>=500))return;y=!1,b=e}k(n,t)};return{animate:j,dispose:()=>{if(_!==null&&(cancelAnimationFrame(_),_=null),h)for(let e of D)E.removeEventListener(e,w)},invalidate:w,renderNow:A}}const Q=new r.Vector3(0,0,1);function dt(e){let n=e.sceneScale||`m`,i={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],a=e.look??`technical`,o=t.c[a];return{sceneScale:n,look:a,camera:{position:e.camera?.position||N(e.environment?.sceneUp??Q,i.cameraDistance*Math.sqrt(3)),fov:e.camera?.fov||20,near:e.camera?.near||i.near,far:e.camera?.far||i.far,target:e.camera?.target||new r.Vector3(0,0,0),dynamicNear:e.camera?.dynamicNear??!0},lighting:{enableSunlight:e.lighting?.enableSunlight??!0,sunlightIntensity:e.lighting?.sunlightIntensity??o.sunlightIntensity,sunlightPosition:e.lighting?.sunlightPosition||P(e.environment?.sceneUp??Q,i.lightDistance,i.lightHeight),ambientLightColor:e.lighting?.ambientLightColor||new r.Color(4210752),ambientLightIntensity:e.lighting?.ambientLightIntensity??o.ambientIntensity,sunlightColor:e.lighting?.sunlightColor||16777215,enableHemisphereLight:e.lighting?.enableHemisphereLight??o.hemisphereIntensity>0,hemisphereSkyColor:e.lighting?.hemisphereSkyColor??14673663,hemisphereGroundColor:e.lighting?.hemisphereGroundColor??7036754,hemisphereIntensity:e.lighting?.hemisphereIntensity??o.hemisphereIntensity},environment:{hdrPath:e.environment?.hdrPath||`/baseHDR.hdr`,backgroundColor:e.environment?.backgroundColor||new r.Color(15790320),enableEnvironmentLighting:e.environment?.enableEnvironmentLighting??!0,sceneUp:e.environment?.sceneUp||Q,showEnvironment:e.environment?.showEnvironment??!1,environmentIntensity:e.environment?.environmentIntensity??o.environmentIntensity},floor:{enabled:e.floor?.enabled??!1,size:e.floor?.size||i.floorSize,color:e.floor?.color||new r.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??o.toneMapping,toneMappingExposure:e.render?.toneMappingExposure??o.toneMappingExposure,preserveDrawingBuffer:e.render?.preserveDrawingBuffer??!1,ambientOcclusion:e.render?.ambientOcclusion??o.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||i.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??ee(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 ft(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[$];t&&(ft(e,t),delete e[$])}function mt(e,t){let n=e;t?(n[$]?ft(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):(pt(n),n.needsUpdate=!0)}function ht(e,n){if(n.materialOverride)return n.envMapIntensity;let r=e.userData[t.l];if(r!=null)return r;let i=e,a=i[$]?.metalness??i.metalness??0;return t.u(n.envMapIntensity,a)}function gt(e){let{scene:n,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 r.HemisphereLight(e.hemisphereSkyColor??o.lighting.hemisphereSkyColor,e.hemisphereGroundColor??o.lighting.hemisphereGroundColor,e.hemisphereIntensity),a.hemisphere.position.copy(o.environment.sceneUp??Q),n.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,n.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 r=t.c[e];l=e,i.toneMapping=r.toneMapping,i.toneMappingExposure=r.toneMappingExposure,o.render.toneMapping=r.toneMapping,o.render.toneMappingExposure=r.toneMappingExposure,u({hemisphereIntensity:r.hemisphereIntensity,ambientIntensity:r.ambientIntensity}),d(r.environmentIntensity),a.sun&&(a.sun.intensity=r.sunlightIntensity,o.lighting.sunlightIntensity=r.sunlightIntensity);let f=s.get()!==null;s.setAmbientOcclusion(r.ambientOcclusion),f&&s.rebuild(),n.traverse(e=>{if(e.userData.source!==`compute`)return;let t=e,n=Array.isArray(t.material)?t.material:t.material?[t.material]:[];for(let e of n)`envMapIntensity`in e&&(e.envMapIntensity=ht(e,r)),mt(e,r.materialOverride)}),j(n,n),c()},getMaterialAppearance:()=>t.d(l)}}function _t(e,t){let n=t.parentElement,i=n?n.clientWidth:window.innerWidth,a=n?n.clientHeight:window.innerHeight,o=new r.PerspectiveCamera(e.camera.fov,i/a,e.camera.near,e.camera.far),s=e.camera.position;return s&&o.position.set(s.x,s.y,s.z),o}function vt(e){let t=new r.Scene;return t.background=(typeof e.environment.backgroundColor==`string`?new r.Color(e.environment.backgroundColor):e.environment.backgroundColor)||null,t}function yt(e,n){t.t(e,n),e.environment?.dispose(),A(e),e.background instanceof r.Texture&&e.background.dispose()}const bt={uniforms:{tDiffuse:{value:null},tNormal:{value:null},tDepth:{value:null},uResolution:{value:new r.Vector2(1,1)},uColor:{value:new r.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 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
|
|
|
104
104
|
float edge = max(depthEdge, normalEdge) * uOpacity;
|
|
105
105
|
gl_FragColor = vec4(mix(color.rgb, uColor, edge), color.a);
|
|
106
106
|
}
|
|
107
|
-
`};var xt=class extends _.Pass{camera;scene;normalMaterial;edgeMaterial;fsQuad;normalTarget=null;width;height;constructor(e,t,n,i,a={}){super(),this.scene=e,this.camera=t,this.width=Math.max(1,n),this.height=Math.max(1,i),this.normalMaterial=new r.MeshNormalMaterial,this.normalMaterial.blending=r.NoBlending,this.edgeMaterial=new r.ShaderMaterial({uniforms:r.UniformsUtils.clone($.uniforms),vertexShader:$.vertexShader,fragmentShader:$.fragmentShader});let o=this.edgeMaterial.uniforms;o.uColor.value=new r.Color(a.color??2236962),o.uOpacity.value=a.opacity??1,o.uNormalThreshold.value=a.normalThreshold??.4,o.uDepthThreshold.value=a.depthThreshold??.02,o.uThickness.value=a.thickness??1,this.fsQuad=new _.FullScreenQuad(this.edgeMaterial),this.needsSwap=!0}acquireNormalTarget(){if(!this.normalTarget){let e=new r.DepthTexture(this.width,this.height);this.normalTarget=new r.WebGLRenderTarget(this.width,this.height,{minFilter:r.NearestFilter,magFilter:r.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 i=this.acquireNormalTarget(),a=e.getRenderTarget(),o=e.autoClear,s=e.getClearColor(new r.Color),c=e.getClearAlpha(),l=this.scene.overrideMaterial;e.setRenderTarget(i),e.setClearColor(7829503,1),e.autoClear=!0,this.scene.overrideMaterial=this.normalMaterial,e.render(this.scene,this.camera),this.scene.overrideMaterial=l,e.setClearColor(s,c),e.autoClear=o;let u=this.edgeMaterial.uniforms;u.tDiffuse.value=n.texture,u.tNormal.value=i.texture,u.tDepth.value=i.depthTexture,u.uResolution.value.set(this.width,this.height);let d=this.camera;u.uPerspective.value=+!!d.isPerspectiveCamera,u.uNear.value=this.camera.near??.1,u.uFar.value=this.camera.far??1e3,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e),e.setRenderTarget(a)}dispose(){this.normalTarget?.dispose(),this.normalMaterial.dispose(),this.edgeMaterial.dispose(),this.fsQuad.dispose()}};function St(e){return e>=2?0:4}function Ct(e,t,n,i,a,o){let s=new r.WebGLRenderTarget(i,a,{type:r.HalfFloatType}),c=new f.EffectComposer(e,s);c.renderTarget2.samples=0;let l=e=>{c.readBuffer=s,c.writeBuffer=c.renderTarget2,c.render(e)},u=new p.RenderPass(t,n);c.addPass(u);let d=null;(o.ambientOcclusion??!0)&&(d=new m.GTAOPass(t,n,i,a),d.blendIntensity=o.aoIntensity??1,d.updateGtaoMaterial({screenSpaceRadius:!0}),c.addPass(d));let _=new xt(t,n,i,a,typeof o.edgeDetection==`object`?o.edgeDetection:{});_.enabled=!!o.edgeDetection,c.addPass(_);let v=new h.SMAAPass;c.addPass(v);let y=new g.OutputPass;c.addPass(y),e.toneMapping=o.toneMapping,e.toneMappingExposure=o.toneMappingExposure;let b=o.aoPixelRatio??1,x=1;if(d){let e=d.setSize.bind(d);d.setSize=(t,n)=>e(Math.max(1,Math.round(t*x)),Math.max(1,Math.round(n*x)))}let S=e=>{x=Math.min(e,b)/e;let t=St(e);s.samples!==t&&(s.samples=t,s.dispose()),c.setPixelRatio(e)};return S(e.getPixelRatio()),c.setSize(i,a),{render:l,setSize:(e,t,n)=>{S(n),c.setSize(e,t)},setCamera:e=>{if(u.camera=e,_.camera=e,!d)return;d.camera=e;let t=+!!e.isPerspectiveCamera;d.gtaoMaterial.defines.PERSPECTIVE_CAMERA!==t&&(d.gtaoMaterial.defines.PERSPECTIVE_CAMERA=t,d.gtaoMaterial.needsUpdate=!0)},setEdgeDetection:e=>{_.enabled=e},edgeDetectionEnabled:()=>_.enabled,dispose:()=>{c.dispose(),d?.dispose(),_.dispose(),v.dispose(),y.dispose()}}}function wt(e){let{renderer:t,scene:n,getActiveCamera:i,getCanvasSize:a,pixelRatio:o,config:s,requestRender:c}=e,l=null,u=!!s.render.ambientOcclusion,d=!1,f=!1,p=e=>{let{width:c,height:l}=a(),u=Ct(t,n,i(),Math.max(1,c),Math.max(1,l),{toneMapping:s.render.toneMapping??r.NeutralToneMapping,toneMappingExposure:s.render.toneMappingExposure??1,ambientOcclusion:e,aoIntensity:s.render.aoIntensity,aoPixelRatio:s.render.aoPixelRatio,edgeDetection:!1});return u.setSize(Math.max(1,c),Math.max(1,l),o),u},m=()=>{u||d?(l&&f===u||(l?.dispose(),l=p(u),f=u),l.setEdgeDetection(d),c()):(l?.dispose(),l=null,c())};return{get:()=>l,sync:m,rebuild:()=>{l?.dispose(),l=null,m()},setAmbientOcclusion:e=>{u=e,m()},setEdgeFallback:e=>{e!==d&&(d=e,m())},isEdgeFallbackActive:()=>d,dispose:()=>{l?.dispose(),l=null}}}function Tt(e,t,n){let r=new v.OrbitControls(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 Et(e,n,i,a){i.environment.enableEnvironmentLighting?(O(e,n,ee(i.environment.sceneUp??Z)),new y.HDRLoader().load(i.environment.hdrPath||`/baseHDR.hdr`,function(o){if(a()){o.dispose();return}if(!o?.image){t.p().warn(`HDR loaded without image data; skipping environment map.`),o?.dispose(),i.events.onReady?.();return}o.mapping=r.EquirectangularReflectionMapping;let s=new r.PMREMGenerator(n);s.compileEquirectangularShader();let c=s.fromEquirectangular(o).texture;s.dispose(),e.environment=c,e.environmentIntensity=i.environment.environmentIntensity??1;let l=ee(i.environment.sceneUp??Z);e.environmentRotation.copy(l),i.environment.showEnvironment?(e.background=o,e.backgroundRotation.copy(l)):o.dispose(),i.events.onReady?.()},void 0,function(e){a()||(t.p().warn(`HDR texture could not be loaded, falling back to basic lighting:`,e),i.events.onReady?.())})):i.events.onReady?.()}function Dt(e,t){let n=t.floor.size,i=new r.PlaneGeometry(n,n),a=typeof t.floor.color==`string`?new r.Color(t.floor.color):t.floor.color,o=new r.MeshStandardMaterial({color:a,roughness:t.floor.roughness,metalness:t.floor.metalness,side:r.DoubleSide}),s=new r.Mesh(i,o);s.userData.id=`floor`,s.name=`floor`;let c=(t.environment?.sceneUp||Z).clone().normalize();s.quaternion.setFromUnitVectors(new r.Vector3(0,0,1),c),s.position.set(0,0,0),t.floor.receiveShadow&&t.render.enableShadows&&(s.receiveShadow=!0),e.add(s)}function Ot(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 kt(e,i,a,o){let s=/* @__PURE__ */ new Set,c=/* @__PURE__ */ new Map,l=null,u=null,d=null,f=new r.Raycaster,p=new r.Vector2,m=new r.Vector2,h=()=>a.getActiveCamera(),g=e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0},_=()=>{let e=R(i);e.isEmpty()?t.p().warn(`No objects to fit to view`):a.frameBounds(e,!1)},v=typeof o.events.selectionColor==`string`?new r.Color(o.events.selectionColor):o.events.selectionColor instanceof r.Color?o.events.selectionColor:new r.Color(`#ff0000`),y=()=>{l&&(l(),l=null,d?.dispose(),d=null),s.forEach(e=>{let t=e;if(c.has(e)){let n=c.get(e),a=t.material;a instanceof r.Material?a.dispose():Array.isArray(a)&&a.forEach(e=>e.dispose()),t.material=n,c.delete(e);let o=e;for(;o.parent;)o=o.parent;o!==i&&(n instanceof r.Material?n.dispose():n.forEach(e=>e.dispose()))}}),s.clear(),u=null},b=(e,t)=>{if(t&&e instanceof r.Mesh){let r=n.n(e).clone();return Ot(r,v,!0),d=r,l=Te(e,t,r),!0}let i=e;if(!(i.material instanceof r.Material))return!1;let a=i.material.clone();return Ot(a,v,e instanceof r.Mesh),c.set(e,i.material),i.material=a,!0},x=null,S=-1,C=()=>{if(x===null||i.children.length!==S){let e=R(i);x=e.isEmpty()?1:e.getSize(new r.Vector3).length(),S=i.children.length}f.params.Points.threshold=x*.01},w=(t,n)=>{let r=e.getBoundingClientRect();p.x=(t-r.left)/r.width*2-1,p.y=-((n-r.top)/r.height)*2+1,C(),f.setFromCamera(p,h());for(let e of f.intersectObjects(i.children,!0))if(g(e.object)&&!re(e.object))return e;return null},T=e=>{m.set(e.clientX,e.clientY)},E=e=>{let t=new r.Vector2(e.clientX,e.clientY);if(m.distanceTo(t)>5)return;let n=w(e.clientX,e.clientY);if(!n){y(),o.events?.onBackgroundClicked?.({x:p.x,y:p.y});return}let i=n.object,a=Ce(n),c=a?.index??null;s.has(i)&&c===u||(y(),s.add(i),u=c,b(i,a?.member??null),o.events?.onObjectSelected?.(i),a?o.events?.onMeshMetadataClicked?.({source:i.userData?.source,name:a.member.name,layer:a.member.layer,trackingKey:a.member.trackingKey,metadata:a.member.metadata}):i instanceof r.Mesh&&Object.keys(i.userData).length>0&&o.events?.onMeshMetadataClicked?.(i.userData))},D=e=>{let t=w(e.clientX,e.clientY);if(!t){o.events?.enableDoubleClickZoom&&a.frameBounds(R(i),!0);return}let n=t.object;if(o.events?.onMeshDoubleClicked?.(n),!o.events?.enableDoubleClickZoom)return;let s=Ce(t),c=s&&n instanceof r.Mesh?we(n,s.member):new r.Box3().setFromObject(n);c.isEmpty()||a.frameBounds(c,!0)},O=e=>{if(o.events?.enableKeyboardControls)switch(e.key.toLowerCase()){case`f`:e.preventDefault(),_();break;case`escape`:e.preventDefault(),y();break;case` `:e.preventDefault(),_()}};return o.events?.enableClickToFocus&&(e.addEventListener(`mousedown`,T),e.addEventListener(`click`,E),e.addEventListener(`dblclick`,D)),o.events?.enableKeyboardControls&&(e.setAttribute(`tabindex`,`0`),e.addEventListener(`keydown`,O)),{dispose:()=>{e.removeEventListener(`mousedown`,T),e.removeEventListener(`click`,E),e.removeEventListener(`dblclick`,D),e.removeEventListener(`keydown`,O),y()},fitToView:_,clearSelection:y}}function At(e,t){let n=new r.AmbientLight(t.lighting.ambientLightColor,t.lighting.ambientLightIntensity);e.add(n);let i=null;if(t.lighting.enableHemisphereLight){i=new r.HemisphereLight(t.lighting.hemisphereSkyColor,t.lighting.hemisphereGroundColor,t.lighting.hemisphereIntensity);let n=t.environment.sceneUp??Z;i.position.copy(n),e.add(i)}if(!t.lighting.enableSunlight)return{ambient:n,hemisphere:i,sun:null};let a=new r.DirectionalLight(t.lighting.sunlightColor??16777215,t.lighting.sunlightIntensity),o=t.lighting.sunlightPosition;return o&&a.position.set(o.x,o.y,o.z),t.render.enableShadows?(a.castShadow=!0,a.shadow.mapSize.width=t.render.shadowMapSize||2048,a.shadow.mapSize.height=t.render.shadowMapSize||2048,a.shadow.bias=-1e-4,a.shadow.normalBias=.02,a.shadow.radius=4,e.add(a),e.add(a.target),{ambient:n,hemisphere:i,sun:a}):(e.add(a),{ambient:n,hemisphere:i,sun:null})}function jt(e,t){if(t.isEmpty())return;let n=t.getCenter(new r.Vector3),i=t.getSize(new r.Vector3).length()*.5*1.2,a=e.shadow.camera;a.left=-i,a.right=i,a.top=i,a.bottom=-i,e.target.position.copy(n),e.target.updateMatrixWorld();let o=e.position.distanceTo(n);a.near=Math.max(i*.01,o-i),a.far=o+i,a.updateProjectionMatrix()}function Mt(e,t,n){let i=new r.WebGLRenderer({antialias:t.render.antialias,canvas:e,alpha:!0,powerPreference:`high-performance`,preserveDrawingBuffer:t.render.preserveDrawingBuffer,logarithmicDepthBuffer:!1}),a=e.parentElement,o=a?a.clientWidth:window.innerWidth,s=a?a.clientHeight:window.innerHeight;return a&&(e.style.width=`100%`,e.style.height=`100%`,e.style.display=`block`),i.setSize(o,s,!1),i.setPixelRatio(n),t.render.enableShadows&&(i.shadowMap.enabled=!0,i.shadowMap.type=r.VSMShadowMap),i.toneMapping=t.render.toneMapping,i.toneMappingExposure=t.render.toneMappingExposure??1,i.outputColorSpace=r.SRGBColorSpace,i.sortObjects=!0,i}const Nt=function(e,n){let i=ft(n||{}),a=i.environment?.sceneUp||Z,o=i.render.pixelRatio??Math.min(window.devicePixelRatio,2),s=yt(i),c=vt(i,e);c.up.copy(a);let l=Mt(e,i,o);t.r(l.capabilities.getMaxAnisotropy()),n?.onMaxAnisotropy?.(l.capabilities.getMaxAnisotropy());let u=Tt(c,e,i),d=ae({scene:s,perspective:c,controls:u,onActiveCameraChange:()=>{},up:a}),f=()=>d.getActiveCamera(),p=!1;Et(s,l,i,()=>p);let m=At(s,i),h=m.sun,g=()=>{h&&jt(h,R(s))};i.floor?.enabled&&Dt(s,i);let _=i.floor?.enabled?s.children.find(e=>e.userData.id===`floor`)??null:null,v=i.grid.enabled?Ke({cellSize:i.grid.cellSize,majorEvery:i.grid.majorEvery,cellColor:i.grid.cellColor,majorColor:i.grid.majorColor,fadeDistance:i.grid.fadeDistance,plane:i.grid.plane}):null;v&&s.add(v.object);let y=()=>{v&&v.fitToContent(R(s))},b=i.gizmo.enabled?ut({camera:c,domElement:e,controller:d}):null,S=i.grid.plane??te(a),w=new r.Vector3(+(S===`x`),+(S===`y`),+(S===`z`)),T=a.clone().normalize(),D=i.camera.dynamicNear?nt({camera:c,scene:s,groundNormals:()=>{let e=[];return v?.object.visible&&e.push(w),i.floor.enabled&&_?.visible&&e.push(T),e}}):null,O=qe(e.parentElement??e,s),k=i.measure.enabled?et({canvas:e,scene:s,getActiveCamera:f,labelLayer:O,options:{snapPixels:i.measure.snapPixels,color:i.measure.color,labelClassName:i.measure.labelClassName,displayUnit:i.measure.displayUnit,format:i.measure.format}}):null,A=i.events.enableEventHandlers===!1?{dispose:()=>{},fitToView:()=>{},clearSelection:()=>{}}:kt(e,s,d,i),j=ct();k&&j.register({id:`measure`,tool:k,priority:0}),b&&j.register({id:`gizmo`,tool:b,priority:-100});let M=0,N=0,P=e=>{M=e.clientX,N=e.clientY},ee=e=>Math.hypot(e.clientX-M,e.clientY-N)>5,F=e=>{ee(e)||j.handleClick(e)&&e.stopImmediatePropagation()};e.addEventListener(`mousedown`,P,{capture:!0}),e.addEventListener(`click`,F,{capture:!0});let ne=e=>j.handleMove(e);e.addEventListener(`mousemove`,ne,{passive:!0});let I=()=>{},L=(e,t)=>{Ue(e,{color:i.edges.color,darken:i.edges.darken,width:i.edges.width,thresholdAngle:i.edges.thresholdAngle,distanceFade:i.edges.distanceFade,maxTriangles:i.edges.maxTriangles,maxSegments:i.edges.maxSegments,maxOverlays:i.edges.maxOverlays,...t}).then(()=>{re(e),I()})},re=e=>{if(i.edges.screenSpaceFallback===!1)return;let t=!1;e.traverse(e=>{let n=e.userData?.edgesSkipped;(n===`triangle-cap`||n===`overlay-budget`)&&(t=!0)}),V.setEdgeFallback(t)},ie=e=>{We(e),V.setEdgeFallback(!1),I()},z=e.parentElement,B=()=>z?{width:z.clientWidth,height:z.clientHeight}:{width:window.innerWidth,height:window.innerHeight},V=wt({renderer:l,scene:s,getActiveCamera:f,getCanvasSize:B,pixelRatio:o,config:i,requestRender:()=>I()});V.sync();let H=_t({scene:s,renderer:l,lights:m,config:i,pipeline:V,requestRender:()=>I()}),{animate:oe,dispose:se,invalidate:U,renderNow:W}=dt(l,s,c,f,d,u,B,o,i.events.onFrame,v,b,()=>V.get(),O,D,i.render.onDemand??!0);return I=U,oe(),s.up.set(a.x,a.y,a.z),g(),y(),{scene:s,camera:c,controls:u,renderer:l,cameraController:d,grid:v,gizmo:b,measureTool:k,labelLayer:O,tools:j,applyEdges:L,clearEdges:ie,invalidate:U,captureImage:(e=`image/png`,t)=>(W(),new Promise(n=>l.domElement.toBlob(n,e,t))),setAmbientOcclusion:V.setAmbientOcclusion,setLook:H.setLook,setFillLights:H.setFillLights,setEnvironmentIntensity:H.setEnvironmentIntensity,setToneMappingExposure:H.setToneMappingExposure,setAoIntensity:H.setAoIntensity,getMaterialAppearance:H.getMaterialAppearance,updateShadowBounds:g,updateGridScale:y,dispose:()=>{p||(p=!0,se(),A.dispose(),e.removeEventListener(`mousedown`,P,{capture:!0}),e.removeEventListener(`click`,F,{capture:!0}),e.removeEventListener(`mousemove`,ne),k?.dispose(),O?.dispose(),b?.dispose(),v?.dispose(),V.dispose(),d.dispose(),u.dispose(),l.dispose(),l.forceContextLoss(),bt(s))},fitToView:A.fitToView,clearSelection:A.clearSelection,addUserGeometry:(e,t)=>{e.userData.source=t===void 0?x:C(t),s.add(e),I()},removeUserGeometry:e=>{e.removeFromParent(),t.t(e),I()},clearUserGeometry:e=>{s.children.filter(t=>E(t,e)).forEach(e=>{e.removeFromParent(),t.t(e)}),I()}}};exports.DEFAULT_LOOK=t.s,exports.ErrorCodes=t.h,exports.LOOKS=b,exports.LOOK_PRESETS=t.c,exports.SOURCE_COMPUTE=`compute`,exports.SOURCE_USER=x,exports.VisualizationError=t.g,exports.appIdFromSource=w,exports.appSource=C,exports.enableDebugLogging=t.f,exports.getLogger=t.p,exports.initThree=Nt,exports.isHostOwned=T,exports.isOwnedBy=E,exports.materialAppearanceForLook=t.d,exports.pickThreshold=Ze,exports.pointerToNdc=lt,exports.setLogger=t.m,exports.snapToVertex=$e,exports.updateScene=ne;
|
|
107
|
+
`};var xt=class extends _.Pass{camera;scene;normalMaterial;edgeMaterial;fsQuad;normalTarget=null;width;height;constructor(e,t,n,i,a={}){super(),this.scene=e,this.camera=t,this.width=Math.max(1,n),this.height=Math.max(1,i),this.normalMaterial=new r.MeshNormalMaterial,this.normalMaterial.blending=r.NoBlending,this.edgeMaterial=new r.ShaderMaterial({uniforms:r.UniformsUtils.clone(bt.uniforms),vertexShader:bt.vertexShader,fragmentShader:bt.fragmentShader});let o=this.edgeMaterial.uniforms;o.uColor.value=new r.Color(a.color??2236962),o.uOpacity.value=a.opacity??1,o.uNormalThreshold.value=a.normalThreshold??.4,o.uDepthThreshold.value=a.depthThreshold??.02,o.uThickness.value=a.thickness??1,this.fsQuad=new _.FullScreenQuad(this.edgeMaterial),this.needsSwap=!0}acquireNormalTarget(){if(!this.normalTarget){let e=new r.DepthTexture(this.width,this.height);this.normalTarget=new r.WebGLRenderTarget(this.width,this.height,{minFilter:r.NearestFilter,magFilter:r.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 i=this.acquireNormalTarget(),a=e.getRenderTarget(),o=e.autoClear,s=e.getClearColor(new r.Color),c=e.getClearAlpha(),l=this.scene.overrideMaterial;e.setRenderTarget(i),e.setClearColor(7829503,1),e.autoClear=!0,this.scene.overrideMaterial=this.normalMaterial,e.render(this.scene,this.camera),this.scene.overrideMaterial=l,e.setClearColor(s,c),e.autoClear=o;let u=this.edgeMaterial.uniforms;u.tDiffuse.value=n.texture,u.tNormal.value=i.texture,u.tDepth.value=i.depthTexture,u.uResolution.value.set(this.width,this.height);let d=this.camera;u.uPerspective.value=+!!d.isPerspectiveCamera,u.uNear.value=this.camera.near??.1,u.uFar.value=this.camera.far??1e3,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e),e.setRenderTarget(a)}dispose(){this.normalTarget?.dispose(),this.normalMaterial.dispose(),this.edgeMaterial.dispose(),this.fsQuad.dispose()}};function St(e){return e>=2?0:4}function Ct(e,t,n,i,a,o){let s=new r.WebGLRenderTarget(i,a,{type:r.HalfFloatType}),c=new f.EffectComposer(e,s);c.renderTarget2.samples=0;let l=e=>{c.readBuffer=s,c.writeBuffer=c.renderTarget2,c.render(e)},u=new p.RenderPass(t,n);c.addPass(u);let d=null;(o.ambientOcclusion??!0)&&(d=new m.GTAOPass(t,n,i,a),d.blendIntensity=o.aoIntensity??1,d.updateGtaoMaterial({screenSpaceRadius:!0}),c.addPass(d));let _=new xt(t,n,i,a,typeof o.edgeDetection==`object`?o.edgeDetection:{});_.enabled=!!o.edgeDetection,c.addPass(_);let v=new h.SMAAPass;c.addPass(v);let y=new g.OutputPass;c.addPass(y),e.toneMapping=o.toneMapping,e.toneMappingExposure=o.toneMappingExposure;let b=o.aoPixelRatio??1,x=1;if(d){let e=d.setSize.bind(d);d.setSize=(t,n)=>e(Math.max(1,Math.round(t*x)),Math.max(1,Math.round(n*x)))}let S=e=>{x=Math.min(e,b)/e;let t=St(e);s.samples!==t&&(s.samples=t,s.dispose()),c.setPixelRatio(e)};return S(e.getPixelRatio()),c.setSize(i,a),{render:l,setSize:(e,t,n)=>{S(n),c.setSize(e,t)},setCamera:e=>{if(u.camera=e,_.camera=e,!d)return;d.camera=e;let t=+!!e.isPerspectiveCamera;d.gtaoMaterial.defines.PERSPECTIVE_CAMERA!==t&&(d.gtaoMaterial.defines.PERSPECTIVE_CAMERA=t,d.gtaoMaterial.needsUpdate=!0)},setEdgeDetection:e=>{_.enabled=e},edgeDetectionEnabled:()=>_.enabled,dispose:()=>{c.dispose(),d?.dispose(),_.dispose(),v.dispose(),y.dispose()}}}function wt(e){let{renderer:t,scene:n,getActiveCamera:i,getCanvasSize:a,pixelRatio:o,config:s,requestRender:c}=e,l=null,u=!!s.render.ambientOcclusion,d=!1,f=!1,p=e=>{let{width:c,height:l}=a(),u=Ct(t,n,i(),Math.max(1,c),Math.max(1,l),{toneMapping:s.render.toneMapping??r.NeutralToneMapping,toneMappingExposure:s.render.toneMappingExposure??1,ambientOcclusion:e,aoIntensity:s.render.aoIntensity,aoPixelRatio:s.render.aoPixelRatio,edgeDetection:!1});return u.setSize(Math.max(1,c),Math.max(1,l),o),u},m=()=>{u||d?(l&&f===u||(l?.dispose(),l=p(u),f=u),l.setEdgeDetection(d),c()):(l?.dispose(),l=null,c())};return{get:()=>l,sync:m,rebuild:()=>{l?.dispose(),l=null,m()},setAmbientOcclusion:e=>{u=e,m()},setEdgeFallback:e=>{e!==d&&(d=e,m())},isEdgeFallbackActive:()=>d,dispose:()=>{l?.dispose(),l=null}}}function Tt(e,t,n){let r=new v.OrbitControls(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 Et(e,n,i,a){i.environment.enableEnvironmentLighting?(O(e,n,F(i.environment.sceneUp??Q)),new y.HDRLoader().load(i.environment.hdrPath||`/baseHDR.hdr`,function(o){if(a()){o.dispose();return}if(!o?.image){t.p().warn(`HDR loaded without image data; skipping environment map.`),o?.dispose(),i.events.onReady?.();return}o.mapping=r.EquirectangularReflectionMapping;let s=new r.PMREMGenerator(n);s.compileEquirectangularShader();let c=s.fromEquirectangular(o).texture;s.dispose(),e.environment=c,e.environmentIntensity=i.environment.environmentIntensity??1;let l=F(i.environment.sceneUp??Q);e.environmentRotation.copy(l),i.environment.showEnvironment?(e.background=o,e.backgroundRotation.copy(l)):o.dispose(),i.events.onReady?.()},void 0,function(e){a()||(t.p().warn(`HDR texture could not be loaded, falling back to basic lighting:`,e),i.events.onReady?.())})):i.events.onReady?.()}function Dt(e,t){let n=t.floor.size,i=new r.PlaneGeometry(n,n),a=typeof t.floor.color==`string`?new r.Color(t.floor.color):t.floor.color,o=new r.MeshStandardMaterial({color:a,roughness:t.floor.roughness,metalness:t.floor.metalness,side:r.DoubleSide}),s=new r.Mesh(i,o);s.userData.id=`floor`,s.name=`floor`;let c=(t.environment?.sceneUp||Q).clone().normalize();s.quaternion.setFromUnitVectors(new r.Vector3(0,0,1),c),s.position.set(0,0,0),t.floor.receiveShadow&&t.render.enableShadows&&(s.receiveShadow=!0),e.add(s)}const Ot=`#f5a524`,kt={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 At(e){return e instanceof r.Mesh&&!(e instanceof r.InstancedMesh)&&!e.geometry.isInstancedBufferGeometry}function jt(e){let t=new r.BufferGeometry,i=new r.MeshBasicMaterial({side:r.DoubleSide,toneMapped:!1}),a=new r.Mesh(t,i);a.frustumCulled=!1,a.matrixWorldAutoUpdate=!1;let o=new r.WebGLRenderTarget(1,1,{depthBuffer:!1}),s=new r.ShaderMaterial({...kt,uniforms:{tMask:{value:o.texture},uTexel:{value:new r.Vector2},uRadius:{value:1},uColor:{value:new r.Color(Ot).convertLinearToSRGB()}},transparent:!0,depthTest:!1,depthWrite:!1,toneMapped:!1}),c=new _.FullScreenQuad(s),l=null,u=null,d=new r.Vector2,f=new r.Color,p=()=>{l=null,u=null,t.deleteAttribute(`position`),t.setIndex(null)},m=(e,n)=>{if(p(),!e||!At(e))return!1;let r=e.geometry.getAttribute(`position`);if(!r)return!1;if(n===null)t.setDrawRange(0,1/0);else{let r=Z(e)?.[n];if(r?.indexStart==null||r.indexCount==null)return!1;t.setDrawRange(r.indexStart,r.indexCount)}return t.setAttribute(`position`,r),t.setIndex(e.geometry.getIndex()),e.updateWorldMatrix(!0,!1),a.matrixWorld.copy(e.matrixWorld),l=e,u=n,!0},h=()=>l?.visible?u===null||!n.r(l).has(u):!1;return{show:m,render:t=>{if(!h())return;e.getDrawingBufferSize(d),o.setSize(d.x,d.y),s.uniforms.uTexel.value.set(1/d.x,1/d.y),s.uniforms.uRadius.value=2*e.getPixelRatio();let n=e.autoClear,r=e.getClearAlpha();e.getClearColor(f),e.setRenderTarget(o),e.setClearColor(0,0),e.clear(),e.autoClear=!1,e.render(a,t),e.setRenderTarget(null),e.setClearColor(f,r),c.render(e),e.autoClear=n},dispose:()=>{p(),t.dispose(),i.dispose(),s.dispose(),c.dispose(),o.dispose()}}}function Mt(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 Nt(e,i,a,o){let s=/* @__PURE__ */ new Set,c=/* @__PURE__ */ new Map,l=[],u=null,d=!1,f=new r.Raycaster,p=new r.Vector2,m=new r.Vector2,h=()=>a.getActiveCamera(),g=e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0},_=()=>{let e=z(i);e.isEmpty()?t.p().warn(`No objects to fit to view`):a.frameBounds(e,!1)},v=typeof o.events.selectionColor==`string`?new r.Color(o.events.selectionColor):o.events.selectionColor instanceof r.Color?o.events.selectionColor:new r.Color(`#ff0000`),y=new r.Color(Ot),b=null,x=null,S=()=>{if(b&&x){let e=b.material;e instanceof r.Material&&e.dispose(),b.material=x}b=null,x=null},C=e=>{if(S(),!e||s.has(e))return;let t=e;if(!(t.material instanceof r.Material))return;let n=t.material.clone();Mt(n,y,e instanceof r.Mesh),b=t,x=t.material,t.material=n},w=()=>{for(let{restore:e,material:t}of l)e(),t.dispose();l.length=0,s.forEach(e=>{let t=e;if(c.has(e)){let n=c.get(e),a=t.material;a instanceof r.Material?a.dispose():Array.isArray(a)&&a.forEach(e=>e.dispose()),t.material=n,c.delete(e);let o=e;for(;o.parent;)o=o.parent;o!==i&&(n instanceof r.Material?n.dispose():n.forEach(e=>e.dispose()))}}),s.clear(),u=null,d=!1},T=(e,t)=>{if(t&&e instanceof r.Mesh){let r=n.n(e).clone();return Mt(r,v,!0),l.push({restore:we(e,t,r),material:r}),!0}let i=e;if(!(i.material instanceof r.Material))return!1;let a=i.material.clone();return Mt(a,v,e instanceof r.Mesh),c.set(e,i.material),i.material=a,!0},E=e=>{if(e.length===0&&!d)return;S(),w();let t=/* @__PURE__ */ new Map;for(let{object:n,memberIndex:r}of e){if(r===null){s.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)s.add(e),T(e,n);d=e.length>0},D=null,O=-1,k=()=>{if(D===null||i.children.length!==O){let e=z(i);D=e.isEmpty()?1:e.getSize(new r.Vector3).length(),O=i.children.length}f.params.Points.threshold=D*.01},A=(t,n)=>{let r=e.getBoundingClientRect();p.x=(t-r.left)/r.width*2-1,p.y=-((n-r.top)/r.height)*2+1,k(),f.setFromCamera(p,h());for(let e of f.intersectObjects(i.children,!0))if(g(e.object)&&!R(e.object))return e;return null},j=e=>{m.set(e.clientX,e.clientY)},M=e=>{let t=new r.Vector2(e.clientX,e.clientY);if(m.distanceTo(t)>5)return;let n=A(e.clientX,e.clientY);if(!n){w(),o.events?.onBackgroundClicked?.({x:p.x,y:p.y});return}let i=n.object,a=Se(n),c=a?.index??null;(d||!s.has(i)||c!==u)&&(S(),w(),s.add(i),u=c,T(i,a?/* @__PURE__ */ new Set([a.index]):null),o.events?.onObjectSelected?.(i),a?o.events?.onMeshMetadataClicked?.({source:i.userData?.source,name:a.member.name,layer:a.member.layer,trackingKey:a.member.trackingKey,metadata:a.member.metadata}):i instanceof r.Mesh&&Object.keys(i.userData).length>0&&o.events?.onMeshMetadataClicked?.(i.userData))},N=e=>{let t=A(e.clientX,e.clientY);if(!t){o.events?.enableDoubleClickZoom&&a.frameBounds(z(i),!0);return}let n=t.object;if(o.events?.onMeshDoubleClicked?.(n),!o.events?.enableDoubleClickZoom)return;let s=Se(t),c=s&&n instanceof r.Mesh?Ce(n,s.member):new r.Box3().setFromObject(n);c.isEmpty()||a.frameBounds(c,!0)},P=e=>{if(o.events?.enableKeyboardControls)switch(e.key.toLowerCase()){case`f`:e.preventDefault(),_();break;case`escape`:e.preventDefault(),w();break;case` `:e.preventDefault(),_()}};return o.events?.enableClickToFocus&&(e.addEventListener(`mousedown`,j),e.addEventListener(`click`,M),e.addEventListener(`dblclick`,N)),o.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:_,clearSelection:w,selectEntries:E,setHoverTint:C}}function Pt(e,t){let n=new r.AmbientLight(t.lighting.ambientLightColor,t.lighting.ambientLightIntensity);e.add(n);let i=null;if(t.lighting.enableHemisphereLight){i=new r.HemisphereLight(t.lighting.hemisphereSkyColor,t.lighting.hemisphereGroundColor,t.lighting.hemisphereIntensity);let n=t.environment.sceneUp??Q;i.position.copy(n),e.add(i)}if(!t.lighting.enableSunlight)return{ambient:n,hemisphere:i,sun:null};let a=new r.DirectionalLight(t.lighting.sunlightColor??16777215,t.lighting.sunlightIntensity),o=t.lighting.sunlightPosition;return o&&a.position.set(o.x,o.y,o.z),t.render.enableShadows?(a.castShadow=!0,a.shadow.mapSize.width=t.render.shadowMapSize||2048,a.shadow.mapSize.height=t.render.shadowMapSize||2048,a.shadow.bias=-1e-4,a.shadow.normalBias=.02,a.shadow.radius=4,e.add(a),e.add(a.target),{ambient:n,hemisphere:i,sun:a}):(e.add(a),{ambient:n,hemisphere:i,sun:null})}function Ft(e,t){if(t.isEmpty())return;let n=t.getCenter(new r.Vector3),i=t.getSize(new r.Vector3).length()*.5*1.2,a=e.shadow.camera;a.left=-i,a.right=i,a.top=i,a.bottom=-i,e.target.position.copy(n),e.target.updateMatrixWorld();let o=e.position.distanceTo(n);a.near=Math.max(i*.01,o-i),a.far=o+i,a.updateProjectionMatrix()}function It(e,t,n){let i=new r.WebGLRenderer({antialias:t.render.antialias,canvas:e,alpha:!0,powerPreference:`high-performance`,preserveDrawingBuffer:t.render.preserveDrawingBuffer,logarithmicDepthBuffer:!1}),a=e.parentElement,o=a?a.clientWidth:window.innerWidth,s=a?a.clientHeight:window.innerHeight;return a&&(e.style.width=`100%`,e.style.height=`100%`,e.style.display=`block`),i.setSize(o,s,!1),i.setPixelRatio(n),t.render.enableShadows&&(i.shadowMap.enabled=!0,i.shadowMap.type=r.VSMShadowMap),i.toneMapping=t.render.toneMapping,i.toneMappingExposure=t.render.toneMappingExposure??1,i.outputColorSpace=r.SRGBColorSpace,i.sortObjects=!0,i}const Lt=function(e,n){let i=dt(n||{}),a=i.environment?.sceneUp||Q,o=i.render.pixelRatio??Math.min(window.devicePixelRatio,2),s=vt(i),c=_t(i,e);c.up.copy(a);let l=It(e,i,o);t.r(l.capabilities.getMaxAnisotropy()),n?.onMaxAnisotropy?.(l.capabilities.getMaxAnisotropy());let u=Tt(c,e,i),d=ae({scene:s,perspective:c,controls:u,onActiveCameraChange:()=>{},up:a}),f=()=>d.getActiveCamera(),p=!1;Et(s,l,i,()=>p);let m=Pt(s,i),h=m.sun,g=()=>{h&&Ft(h,z(s))};i.floor?.enabled&&Dt(s,i);let _=i.floor?.enabled?s.children.find(e=>e.userData.id===`floor`)??null:null,v=i.grid.enabled?Ge({cellSize:i.grid.cellSize,majorEvery:i.grid.majorEvery,cellColor:i.grid.cellColor,majorColor:i.grid.majorColor,fadeDistance:i.grid.fadeDistance,plane:i.grid.plane}):null;v&&s.add(v.object);let y=()=>{v&&v.fitToContent(z(s))},b=i.gizmo.enabled?lt({camera:c,domElement:e,controller:d}):null,S=i.grid.plane??ee(a),w=new r.Vector3(+(S===`x`),+(S===`y`),+(S===`z`)),T=a.clone().normalize(),D=i.camera.dynamicNear?tt({camera:c,scene:s,groundNormals:()=>{let e=[];return v?.object.visible&&e.push(w),i.floor.enabled&&_?.visible&&e.push(T),e}}):null,O=Ke(e.parentElement??e,s),k=i.measure.enabled?$e({canvas:e,scene:s,getActiveCamera:f,labelLayer:O,options:{snapPixels:i.measure.snapPixels,color:i.measure.color,labelClassName:i.measure.labelClassName,displayUnit:i.measure.displayUnit,format:i.measure.format}}):null,A=i.events.enableEventHandlers===!1?{dispose:()=>{},fitToView:()=>{},clearSelection:()=>{},selectEntries:()=>{},setHoverTint:()=>{}}:Nt(e,s,d,i),j=jt(l),M=st();k&&M.register({id:`measure`,tool:k,priority:0}),b&&M.register({id:`gizmo`,tool:b,priority:-100});let N=0,P=0,F=e=>{N=e.clientX,P=e.clientY},I=e=>Math.hypot(e.clientX-N,e.clientY-P)>5,te=e=>{I(e)||M.handleClick(e)&&e.stopImmediatePropagation()};e.addEventListener(`mousedown`,F,{capture:!0}),e.addEventListener(`click`,te,{capture:!0});let ne=e=>M.handleMove(e);e.addEventListener(`mousemove`,ne,{passive:!0});let L=()=>{},R=(e,t)=>{He(e,{color:i.edges.color,darken:i.edges.darken,width:i.edges.width,thresholdAngle:i.edges.thresholdAngle,distanceFade:i.edges.distanceFade,maxTriangles:i.edges.maxTriangles,maxSegments:i.edges.maxSegments,maxOverlays:i.edges.maxOverlays,...t}).then(()=>{re(e),L()})},re=e=>{if(i.edges.screenSpaceFallback===!1)return;let t=!1;e.traverse(e=>{let n=e.userData?.edgesSkipped;(n===`triangle-cap`||n===`overlay-budget`)&&(t=!0)}),H.setEdgeFallback(t)},ie=e=>{Ue(e),H.setEdgeFallback(!1),L()},B=e.parentElement,V=()=>B?{width:B.clientWidth,height:B.clientHeight}:{width:window.innerWidth,height:window.innerHeight},H=wt({renderer:l,scene:s,getActiveCamera:f,getCanvasSize:V,pixelRatio:o,config:i,requestRender:()=>L()});H.sync();let U=gt({scene:s,renderer:l,lights:m,config:i,pipeline:H,requestRender:()=>L()}),{animate:oe,dispose:se,invalidate:W,renderNow:G}=ut(l,s,c,f,d,u,V,o,i.events.onFrame,v,b,()=>H.get(),O,D,i.render.onDemand??!0,j);return L=W,oe(),s.up.set(a.x,a.y,a.z),g(),y(),{scene:s,camera:c,controls:u,renderer:l,cameraController:d,grid:v,gizmo:b,measureTool:k,labelLayer:O,tools:M,applyEdges:R,clearEdges:ie,invalidate:W,captureImage:(e=`image/png`,t)=>(G(),new Promise(n=>l.domElement.toBlob(n,e,t))),setAmbientOcclusion:H.setAmbientOcclusion,setLook:U.setLook,setFillLights:U.setFillLights,setEnvironmentIntensity:U.setEnvironmentIntensity,setToneMappingExposure:U.setToneMappingExposure,setAoIntensity:U.setAoIntensity,getMaterialAppearance:U.getMaterialAppearance,updateShadowBounds:g,updateGridScale:y,dispose:()=>{p||(p=!0,se(),A.dispose(),e.removeEventListener(`mousedown`,F,{capture:!0}),e.removeEventListener(`click`,te,{capture:!0}),e.removeEventListener(`mousemove`,ne),k?.dispose(),O?.dispose(),j.dispose(),b?.dispose(),v?.dispose(),H.dispose(),d.dispose(),u.dispose(),l.dispose(),l.forceContextLoss(),yt(s))},fitToView:A.fitToView,clearSelection:A.clearSelection,selectEntries:e=>{A.selectEntries(e),W()},setHover:(e,t=null)=>{let n=j.show(e,t);A.setHoverTint(n?null:e),W()},addUserGeometry:(e,t)=>{e.userData.source=t===void 0?x:C(t),s.add(e),L()},removeUserGeometry:e=>{e.removeFromParent(),t.t(e),L()},clearUserGeometry:e=>{s.children.filter(t=>E(t,e)).forEach(e=>{e.removeFromParent(),t.t(e)}),L()}}};exports.DEFAULT_LOOK=t.s,exports.ErrorCodes=t.h,exports.LOOKS=b,exports.LOOK_PRESETS=t.c,exports.SOURCE_COMPUTE=`compute`,exports.SOURCE_USER=x,exports.VisualizationError=t.g,exports.appIdFromSource=w,exports.appSource=C,exports.enableDebugLogging=t.f,exports.getLogger=t.p,exports.initThree=Lt,exports.isHostOwned=T,exports.isOwnedBy=E,exports.materialAppearanceForLook=t.d,exports.pickThreshold=Xe,exports.pointerToNdc=ct,exports.setLogger=t.m,exports.snapToVertex=Qe,exports.updateScene=te;
|
|
108
137
|
//# sourceMappingURL=render.cjs.map
|