diff --git a/CHANGELOG.md b/CHANGELOG.md index 35cd38b..7025704 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Stability: make the direct-view load gate settings-aware for preferred OBJ conversion and keep mobile direct-format reads on Obsidian vault APIs instead of desktop Node path helpers. - UI: upgrade measurement calibration so users can scale the loaded model uniformly from the latest ruler distance, keep overlays anchored in model space, apply locked model-size scaling from one known axis, and verify the workflow through preview automation. - UI: make distance measurement lock the selected object by default and snap endpoints to mesh vertices or visible crease/perimeter triangle edges, filtering coplanar face diagonals and preferring edge projection outside the corner radius, with first-click target selection when needed and Alt/Option-click preserving the older free surface pick as a backup. +- Performance: cache selected-target measurement snap candidates while measuring so hover previews do not repeatedly rebuild vertex and edge lists for the same object. - UI: restyle distance measurements as orthographic drawing-style dimension callouts with extension lines, arrowheads, and compact drafting labels instead of thick freehand ruler lines. - UI: remove the preview canvas native hover tooltip while preserving keyboard shortcut metadata for accessibility. - UI: clarify render scale versus measurement scale by showing render resolution as percentages, syncing the toolbar to the active renderer budget, and applying the configured scale to `3dgrid`. diff --git a/main.js b/main.js index e110a42..e481e50 100644 --- a/main.js +++ b/main.js @@ -4114,7 +4114,7 @@ void main() { `),f?`${f}/`:"");E.preload(),s=E}catch(u){r.push(`OBJ material library not found: ${d}`)}}else a&&(!e||!t)&&r.push("OBJ material library could not be resolved without a model path.");let o=new lA;s&&o.setMaterials(s);let l=o.parse(i);return rle(l),{object:l,warnings:r}}var Hoe,lU,Xoe,Yoe,mU=y(()=>{"use strict";U2();z2();H2();X2();tU();us();ps();_A();CC();F_();Hoe={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",tga:"image/x-tga",webp:"image/webp",tif:"image/tiff",tiff:"image/tiff"},lU=["jpg","jpeg","png","bmp","tga","webp","tif","tiff"],Xoe=/^\s*(map_Kd|map_Ka|map_Ks|map_Ns|map_d|map_bump|bump|disp|decal)\s+(.+)/i,Yoe=4});function Rr(){return pU.Platform.isMobile}var pU,ga=y(()=>{"use strict";pU=require("obsidian")});function sle(){return typeof activeDocument=="undefined"?window.document:activeDocument}function gU(n){return sle().createElementNS(nle,n)}function pl(n){let e=gU("div");return n&&(e.className=n),e}function gu(n,e){let t=gU(n);return e&&(t.className=e),t}var nle,Rm=y(()=>{"use strict";nle="http://www.w3.org/1999/xhtml"});function ei(n){return{x:n.x,y:n.y,z:n.z}}function un(n){return{x:n.x,y:n.y,z:n.z}}function bm(n,e){return{x:n.x-e.x,y:n.y-e.y,z:n.z-e.z}}function B_(n,e){return{x:n.x*e,y:n.y*e,z:n.z*e}}function EU(n,e){let t=bm(n,e);return Math.hypot(t.x,t.y,t.z)}function DC(n){let e=Math.hypot(n.x,n.y,n.z);return e<=Number.EPSILON?null:B_(n,1/e)}function _u(n,e){return{x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}}function _U(n,e){return n.x*e.x+n.y*e.y+n.z*e.z}function SU(n,e,t){return{x:e==="x"?n.x+t:n.x,y:e==="y"?n.y+t:n.y,z:e==="z"?n.z+t:n.z}}function TU(n){return Math.max(n*.01,.01)}function Lf(n,e,t=TU(e)){return n{"use strict"});function ka(n,e){return{min:un(n),max:un(e)}}function vu(n,e){return n?{min:{x:Math.min(n.min.x,e.min.x),y:Math.min(n.min.y,e.min.y),z:Math.min(n.min.z,e.min.z)},max:{x:Math.max(n.max.x,e.max.x),y:Math.max(n.max.y,e.max.y),z:Math.max(n.max.z,e.max.z)}}:ka(e.min,e.max)}function Xi(n){return bm(n.max,n.min)}function Er(n){return _u(n.min,B_(Xi(n),.5))}function AU(n){return EU(n.min,n.max)}function U_(n){return AU(n)/2}function xU(n){let e=Xi(n);return Math.max(e.x,e.y,e.z)}function LC(n){let e=Xi(n),t=AU(n);return{center:_u(n.min,B_(e,.5)),size:e,diagonalLength:t,radius:t/2,maxSpan:Math.max(e.x,e.y,e.z)}}var gl=y(()=>{"use strict";ks()});function OC(n,e,t={}){var s,a,o,l,c;let i=Math.max(e,Number.EPSILON),r=(s=t.radiusMultiplier)!=null?s:2.5;return{target:un(n),radius:i*r,lowerRadiusLimit:i*((a=t.lowerRadiusFactor)!=null?a:.05),upperRadiusLimit:i*((o=t.upperRadiusFactor)!=null?o:10),near:i*((l=t.nearFactor)!=null?l:.001),far:i*((c=t.farFactor)!=null?c:20)}}function V_(n,e={}){let t=LC(n);return OC(t.center,t.radius,e)}function RU(n,e={}){var o,l,c,f,d,u;let t=LC(n),i=Math.max(t.maxSpan,t.radius,Number.EPSILON),r=i*((o=e.distanceMultiplier)!=null?o:1.8),s=Math.max((l=e.minNear)!=null?l:Math.max(i/1e4,1e-5),i/((c=e.nearDivisor)!=null?c:1e3)),a=Math.max((d=e.minFar)!=null?d:Math.max(i*((f=e.farMultiplier)!=null?f:20),1),r+t.radius*4);return{target:un(t.center),position:_u(t.center,{x:r,y:r*((u=e.elevationFactor)!=null?u:.65),z:r}),near:s,far:a}}var bA=y(()=>{"use strict";gl();ks()});function Ui(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var MA=y(()=>{"use strict"});function yA(n){var s;let e=new Set,t=0,i=0;for(let a of n.meshes){t+=a.triangleCount,i+=a.vertexCount;for(let o of(s=a.materialKeys)!=null?s:[])o!=null&&e.add(o)}let r=lle({triangleCount:t,splatCount:n.splatCount,meshCount:n.meshes.length,materialCount:e.size});return{meshCount:n.meshes.length,triangleCount:t,splatCount:n.splatCount,vertexCount:i,materialCount:e.size,performanceTier:r,performanceHint:cle(r,{triangleCount:t,splatCount:n.splatCount,materialCount:e.size}),resourceWarnings:n.resourceWarnings?[...n.resourceWarnings]:void 0,boundingSize:un(n.boundingSize),rootName:n.rootName}}function lle(n){var e,t,i;return((e=n.splatCount)!=null?e:0)>=15e5||n.triangleCount>=12e5||n.materialCount>=96||n.meshCount>=240?"extreme":((t=n.splatCount)!=null?t:0)>=65e4||n.triangleCount>=45e4||n.materialCount>=48||n.meshCount>=120?"heavy":((i=n.splatCount)!=null?i:0)>=18e4||n.triangleCount>=12e4||n.materialCount>=18||n.meshCount>=48?"medium":"light"}function cle(n,e){var r;let t=((r=e.splatCount)!=null?r:e.triangleCount).toLocaleString(),i=e.splatCount!==void 0?"splats":"triangles";return n==="extreme"?`${t} ${i}, ${e.materialCount.toLocaleString()} materials. Expect automatic quality throttling while interacting.`:n==="heavy"?`${t} ${i}, ${e.materialCount.toLocaleString()} materials. Interaction may lower shadows and resolution temporarily.`:n==="medium"?`${t} ${i}, ${e.materialCount.toLocaleString()} materials. Performance should be steady on most desktop GPUs.`:`${t} ${i}, ${e.materialCount.toLocaleString()} materials. Performance tier: light.`}function ac(n){var e;return{name:n.name,triangleCount:n.triangleCount,vertexCount:n.vertexCount,materialName:(e=n.materialName)!=null?e:null,boundingSize:un(n.boundingSize),center:un(n.center),source:n.source,meshNames:n.meshNames?[...n.meshNames]:void 0,childCount:n.childCount,componentId:n.componentId,occurrenceId:n.occurrenceId,partNumber:n.partNumber,componentPath:n.componentPath}}function bU(n){return n.splatCount!==void 0?"Splats":"Triangles"}function MU(n){var e;return(e=n.splatCount)!=null?e:n.triangleCount}var IA=y(()=>{"use strict";ks()});function ym(n,e="-"){if(typeof n!="string")return e;let t=n.trim();return t.length>0?t:e}function fle(n){return n?n==="detail-cluster"?"Detail cluster":n.charAt(0).toUpperCase()+n.slice(1):null}function dle(n){var r,s,a,o;if(!n.sourceFormat&&!n.effectiveFormat&&!n.loadStrategy)return null;let e=(s=(r=n.sourceFormat)!=null?r:n.effectiveFormat)!=null?s:"unknown",t=(a=n.effectiveFormat)!=null?a:e,i=(o=n.loadStrategy)!=null?o:e!==t?"convert":"direct";return`${e.toUpperCase()}${t!==e?` -> ${t.toUpperCase()}`:""} (${i})`}function ule(n,e=8){if(!(n!=null&&n.length))return null;let t=n.slice(0,e).join(", "),i=n.length-e;return i>0?`${t}, +${i} more`:t}function yU(n,e={}){var r,s;let t=(r=e.countLabel)!=null?r:bU(n),i=(s=e.decimals)!=null?s:3;return[`| Meshes | ${n.meshCount} |`,`| ${t} | ${MU(n).toLocaleString()} |`,`| Vertices | ${n.vertexCount.toLocaleString()} |`,`| Materials | ${n.materialCount} |`,...n.performanceTier?[`| Performance Tier | ${n.performanceTier} |`]:[],`| Bounding Size | ${NC(n.boundingSize,{decimals:i})} |`]}function xo(n){return Ui(n).replace(/\|/g,"\\|").replace(/\r?\n/g," ")}function NC(n,e={}){var r,s;let t=(r=e.decimals)!=null?r:3,i=(s=e.separator)!=null?s:" x ";return`${n.x.toFixed(t)}${i}${n.y.toFixed(t)}${i}${n.z.toFixed(t)}`}function IU(n,e={}){return["| Metric | Value |","|--------|-------|",...yU(n,e)]}function hle(n,e,t={}){return["| Property | Value |","|----------|-------|",`| Format | ${n} |`,...yU(e,t)]}function CA(n){var r,s;let e=[];e.push(`## ${n.title} - Model Info`),e.push(""),e.push(...hle(n.format,n.summary,{countLabel:n.countLabel})),e.push("");let t=(r=n.meshBreakdown)!=null?r:[];t.length>1&&t.length<=50&&(e.push("### Mesh Breakdown"),e.push(""),e.push("| # | Name | Triangles | Vertices | Material |"),e.push("|---|------|-----------|----------|----------|"),t.forEach((a,o)=>{let l=a.triangleCount===null?"-":a.triangleCount.toLocaleString();e.push(`| ${o+1} | ${xo(ym(a.name,`mesh-${o+1}`))} | ${l} | ${a.vertexCount.toLocaleString()} | ${xo(ym(a.materialName))} |`)}),e.push(""));let i=Array.from((s=n.materialNames)!=null?s:[]).map(a=>ym(a,"")).filter(a=>a.length>0);if(i.length>0){let a=Array.from(new Set(i));e.push("### Materials"),e.push("");for(let o of a)e.push(`- ${Ui(o)}`);e.push("")}return e.join(` `)}function PA(n,e={}){var o;let t=Ui(ym((o=e.title)!=null?o:n.name,"Selected Part")),i=[];i.push(`## ${t} - Part Info`),i.push(""),i.push("| Property | Value |"),i.push("|----------|-------|"),i.push(`| Mesh | ${xo(ym(n.name))} |`);let r=fle(n.source);r&&i.push(`| Source | ${xo(r)} |`),n.childCount!==void 0&&n.childCount>1&&i.push(`| Child Meshes | ${n.childCount.toLocaleString()} |`),n.componentId&&i.push(`| Component ID | ${xo(n.componentId)} |`),n.occurrenceId&&i.push(`| Occurrence ID | ${xo(n.occurrenceId)} |`),n.partNumber&&i.push(`| Part Number | ${xo(n.partNumber)} |`),n.componentPath&&i.push(`| Component Path | ${xo(n.componentPath)} |`);let s=dle(n);s&&i.push(`| Format Lineage | ${xo(s)} |`),i.push(`| Triangles | ${n.triangleCount.toLocaleString()} |`),i.push(`| Vertices | ${n.vertexCount.toLocaleString()} |`),i.push(`| Material | ${xo(ym(n.materialName))} |`),i.push(`| Bounding Size | ${NC(n.boundingSize)} |`),i.push(`| Center | ${NC(n.center,{separator:", "})} |`);let a=ule(n.meshNames);return a&&n.childCount!==1&&i.push(`| Mesh Refs | ${xo(a)} |`),i.push(""),i.join(` `)}var DA=y(()=>{"use strict";MA();IA()});function LA(n){return{canvas:n.canvas,observeRender:n.observeRender,getCameraStateKey:n.getCameraStateKey,projectWorldPoint:n.projectWorldPoint,isWorldPointOccluded:n.isWorldPointOccluded}}function OA(n){return n.map(e=>e.value.toFixed(e.digits)).join("_")}function CU(n){return Number.isFinite(n.x)&&Number.isFinite(n.y)&&Number.isFinite(n.z)}function PU(n,e,t){return!CU(n)||e.clientWidth===0||e.clientHeight===0?!1:(t.screenX=(n.x+1)/2*e.clientWidth,t.screenY=(1-n.y)/2*e.clientHeight,t.depth=(n.z+1)/2,!0)}function DU(n,e,t,i,r){return!CU(n)||e===0||t===0||i.clientWidth===0||i.clientHeight===0?!1:(r.screenX=n.x*(i.clientWidth/e),r.screenY=n.y*(i.clientHeight/t),r.depth=n.z,!0)}var wC=y(()=>{"use strict"});function Eu(n){var e;return n.size===0?null:n.size===1?(e=Array.from(n)[0])!=null?e:null:`${n.size} materials`}function mle(n){return Math.max(n.boundingSize.x,n.boundingSize.y,n.boundingSize.z)}function ple(n){return Math.max(n.boundingSize.x,n.boundingSize.y,n.boundingSize.z)}function gle(n){let e=n.trim().toLowerCase();return/^(mesh|node|object|primitive|points|pointcloud|geometry)[-_\s.]?\d+$/i.test(e)||/^(mesh|node|object|primitive|points|pointcloud|geometry)$/i.test(e)}function _le(n){let e={x:n.boundingSize.x/2,y:n.boundingSize.y/2,z:n.boundingSize.z/2};return{min:{x:n.center.x-e.x,y:n.center.y-e.y,z:n.center.z-e.z},max:{x:n.center.x+e.x,y:n.center.y+e.y,z:n.center.z+e.z}}}function vle(n,e){if(n.source&&n.source!=="mesh"||!Number.isFinite(e)||e<=0||!gle(n.name))return!1;let t=mle(n);return Number.isFinite(t)&&t>0&&t<=e*.04}function Ele(n){var o;let e=null,t=0,i=0,r=new Set,s=[];for(let l of n)e=vu(e,_le(l)),t+=l.triangleCount,i+=l.vertexCount,l.materialName&&r.add(l.materialName),s.push(...(o=l.meshNames)!=null&&o.length?l.meshNames:[l.name]);let a=e!=null?e:{min:{x:0,y:0,z:0},max:{x:0,y:0,z:0}};return{name:"Small detail cluster",triangleCount:t,vertexCount:i,materialName:Eu(r),boundingSize:Xi(a),center:Er(a),source:"detail-cluster",meshNames:s,childCount:n.length}}function Sle(n,e,t){let i=ple(n),r=t.filter(o=>vle(o,i));if(r.length<2)return e.length>0?[...e,...t]:[...t];let s=new Set(r),a=t.filter(o=>!s.has(o));return[...e,Ele(r),...a]}function NA(n){var e;return{summary:n.summary,parts:Tle(n),materialNames:Ale(n.renderableMeshes,n.getMeshMaterialNames),resourceWarnings:n.resourceWarnings?[...n.resourceWarnings]:[],capturedAt:(e=n.capturedAt)!=null?e:new Date().toISOString()}}function Tle(n){let e=n.renderableMeshes.filter(t=>!n.groupedPartCandidates.groupedMeshes.has(t)).map(t=>n.createMeshPart(t));return Sle(n.summary,n.groupedPartCandidates.parts,e)}function Ale(n,e){let t=new Set;for(let i of n)for(let r of e(i))r&&t.add(r);return Array.from(t).sort((i,r)=>i.localeCompare(r))}var G_=y(()=>{"use strict";gl()});function k_(n){switch(n){case"\xB5m":case"\u03BCm":return"um";case"um":case"mm":case"cm":case"m":return n;default:return"mm"}}function _s(n){return{x:Number.isFinite(n.x)&&n.x>0?n.x:1,y:Number.isFinite(n.y)&&n.y>0?n.y:1,z:Number.isFinite(n.z)&&n.z>0?n.z:1}}function Ro(n){let e=Math.abs(n),t=e>=100?1:e>=10?2:3;return Pm(n,t)}function wU(n,e,t){if(!Number.isFinite(e)||e<=Wa||!Number.isFinite(t)||t<=Wa)return null;let i=_s(n),r=t/e;return _s({x:i.x*r,y:i.y*r,z:i.z*r})}function BA(n,e,t){let i=_s(t);return{x:e.x+(n.x-e.x)*i.x,y:e.y+(n.y-e.y)*i.y,z:e.z+(n.z-e.z)*i.z}}function UA(n,e,t){let i=_s(t);return{x:e.x+(n.x-e.x)/i.x,y:e.y+(n.y-e.y)/i.y,z:e.z+(n.z-e.z)/i.z}}function VA(n,e){var a,o,l,c;if(!_l(n))return null;let t=null;for(let f of e.vertices)_l(f.point)&&(t=OU(t,{point:f.point,kind:"vertex",distance:kC(n,f.point),targetId:(a=f.targetId)!=null?a:e.targetId}));let i=null;for(let f of e.edges){if(!_l(f.start)||!_l(f.end))continue;let d=Dle(n,f.start,f.end);d&&(i=OU(i,{point:d,kind:"edge",distance:kC(n,d),targetId:(o=f.targetId)!=null?o:e.targetId}))}let r=Math.max((l=e.vertexRadius)!=null?l:0,0),s=t&&t.distance<=r?t:i!=null?i:t;return!s||Number.isFinite(e.maxDistance)&&s.distance>((c=e.maxDistance)!=null?c:0)?null:{point:{...s.point},kind:s.kind,distance:s.distance,targetId:s.targetId}}function GA(n,e,t){let i=new Map;for(let[r,s,a]of e){let o=[n[r],n[s],n[a]];if(o.some(c=>!c||!_l(c)))continue;let l=Ile(o[0],o[1],o[2]);for(let[c,f]of[[r,s],[s,a],[a,r]]){let d=n[c],u=n[f];if(!d||!u||!_l(d)||!_l(u)||kC(d,u)<=Wa)continue;let h=yle(d,u),m=i.get(h);m?l&&m.normals.push(l):i.set(h,{start:d,end:u,normals:l?[l]:[],targetId:t})}}return Array.from(i.values()).filter(r=>!Cle(r.normals)).map(r=>({start:r.start,end:r.end,targetId:r.targetId}))}function kA(n,e){let t=[];if(e&&e.length>=3){for(let i=0;i+2{var u;return Number.isFinite(e[d])&&((u=e[d])!=null?u:0)>Wa&&n[d]>Wa});if(!c)return null;let f=((l=e[c])!=null?l:0)/n[c];return _s({x:f,y:f,z:f})}let a=!1,o={...r};for(let c of s){let f=e[c];Number.isFinite(f)&&(f!=null?f:0)>Wa&&n[c]>Wa&&(o[c]=(f!=null?f:0)/n[c],a=!0)}return a?_s(o):null}function zA(n){var t,i;let e=n.active?n.pending?"picking-end":n.targetLocked?"ready":"select-target":n.records.length>0?"reviewing":"inactive";return{active:n.active,phase:e,records:n.records,unit:k_(n.unit),scale:_s(n.scale),bounds:n.bounds,targetLocked:!!n.targetLocked,targetName:(t=n.targetName)!=null?t:null,snapKind:(i=n.snapKind)!=null?i:null}}function HA(n){let e=n.getMeasurementState();return e.active?(e.phase==="picking-end"?n.cancelMeasurement():n.toggleMeasurement(),!0):!1}function wf(n,e){if(!n)return;if(n.classList.toggle(xle,e),!e){n.classList.remove(wA),delete n.dataset.ai3dMeasurementFocusToken;return}let t=`${Date.now()}-${Math.random().toString(36).slice(2)}`;n.dataset.ai3dMeasurementFocusToken=t,n.classList.remove(wA),n.getBoundingClientRect(),n.classList.add(wA),window.setTimeout(()=>{n.dataset.ai3dMeasurementFocusToken===t&&(n.classList.remove(wA),delete n.dataset.ai3dMeasurementFocusToken)},Rle)}function XA(n,e,t,i){let r=_s(t),s={x:(e.x-n.x)*r.x,y:(e.y-n.y)*r.y,z:(e.z-n.z)*r.z},a={x:Math.abs(s.x),y:Math.abs(s.y),z:Math.abs(s.z)};return{distance:Math.sqrt(s.x*s.x+s.y*s.y+s.z*s.z),delta:s,absDelta:a,unit:i}}function Pm(n,e){return n.toFixed(e).replace(/\.?0+$/,"")}function _l(n){return Number.isFinite(n.x)&&Number.isFinite(n.y)&&Number.isFinite(n.z)}function LU(n){return[Math.round(n.x*BC),Math.round(n.y*BC),Math.round(n.z*BC)].join(",")}function yle(n,e){let t=LU(n),i=LU(e);return t=0&&n=100?1:s>=10?2:3;return`${Pm(r,a)} ${VU(i)}`}function VC(n){let e=Math.abs(n),t=e>=100?1:e>=10?2:3;return Pm(e,t)}function Dm(n){return{primary:Nf(n.distance,n.unit),secondary:[`X ${VC(n.absDelta.x)}`,`Y ${VC(n.absDelta.y)}`,`Z ${VC(n.absDelta.z)}`,VU(n.unit)].join(" ")}}function YA(n,e,t=oc.width,i=oc.height){n.clearRect(0,0,t,i);let r=t/2,s=i/2,a=Math.min(t-120,Math.max(250,e.primary.length*24+92)),o=78,l=(t-a)/2,c=(i-o)/2,f=s;Ole(n,l,c,a,o,4),n.fillStyle=FC.labelPlate,n.fill(),n.lineWidth=2,n.strokeStyle=FC.labelPlateBorder,n.stroke(),n.textAlign="center",n.textBaseline="middle",n.lineJoin="round",n.fillStyle=FC.labelText,n.font="700 38px 'Segoe UI', Arial, sans-serif",n.fillText(e.primary,r,f,a-72)}function Ole(n,e,t,i,r,s){if(typeof n.roundRect=="function"){n.beginPath(),n.roundRect(e,t,i,r,s);return}let a=Math.min(s,i/2,r/2);n.beginPath(),n.moveTo(e+a,t),n.lineTo(e+i-a,t),n.quadraticCurveTo(e+i,t,e+i,t+a),n.lineTo(e+i,t+r-a),n.quadraticCurveTo(e+i,t+r,e+i-a,t+r),n.lineTo(e+a,t+r),n.quadraticCurveTo(e,t+r,e,t+r-a),n.lineTo(e,t+a),n.quadraticCurveTo(e,t,e+a,t),n.closePath()}function KA(n){if(n.length===0)return"";let e=["## Measurements","","| # | Distance | Delta X | Delta Y | Delta Z | Start | End |","|---|----------|---------|---------|---------|-------|-----|"];for(let t of n){let i=t.reading.unit,r=NU(t.start),s=NU(t.end);e.push([t.index,Nf(t.reading.distance,i),Nf(t.reading.absDelta.x,i,!1),Nf(t.reading.absDelta.y,i,!1),Nf(t.reading.absDelta.z,i,!1),r,s].join(" | ").replace(/^/,"| ").replace(/$/," |"))}return e.join(` -`)}function NU(n){return`${Pm(n.x,3)}, ${Pm(n.y,3)}, ${Pm(n.z,3)}`}var FC,oc,xle,wA,Rle,GC,Wa,BC,ble,Mle,W_=y(()=>{"use strict";FC={line:"#f8fafc",marker:"#f8fafc",pending:"#f59e0b",hover:"#ffffff",preview:"#e5e7eb",labelPlate:"rgba(248, 250, 252, 0.94)",labelPlateBorder:"rgba(15, 23, 42, 0.58)",labelText:"#111827",labelSecondary:"rgba(51, 65, 85, 0.82)",labelOutline:"rgba(248, 250, 252, 0.22)"},oc={width:760,height:220},xle="ai3d-measurement-active",wA="ai3d-measurement-focus-aggregation",Rle=1100,GC={um:1e-6,mm:.001,cm:.01,m:1},Wa=1e-9,BC=1e6,ble=.9995,Mle={um:"\u03BCm",mm:"mm",cm:"cm",m:"m"}});function Nle(n){let e=typeof activeWindow=="undefined"?window:activeWindow;return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(n):e.setTimeout(()=>n(e.performance.now()),16)}function wle(n){let e=typeof activeWindow=="undefined"?window:activeWindow;if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(n);return}e.clearTimeout(n)}function ZA(n){return new WC(n)}var jA,WC,zC=y(()=>{"use strict";jA=class jA{constructor(e){this.originals=new Map;this.unsubscribe=null;this.active=!1;this.drag=null;this.pendingDrag=null;this.selected=null;this.activePointerId=null;this.frameCount=0;this.pendingDragEvent=null;this.dragUpdateFrame=null;this.adapter=e}isEnabled(){return this.active}setEnabled(e){var t,i,r;return this.active===e?this.active:(this.active=e,this.finishDrag(),this.setSelected(null),this.activePointerId=null,e?this.unsubscribe=this.adapter.subscribe({onPointerDown:(s,a)=>this.handlePointerDown(s,a),onPointerMove:s=>this.handlePointerMove(s),onPointerUp:s=>this.handlePointerUp(s),onRender:()=>this.handleRender()}):((t=this.unsubscribe)==null||t.call(this),this.unsubscribe=null),(r=(i=this.adapter).requestRender)==null||r.call(i),this.active)}toggle(){return this.setEnabled(!this.active)}reset(){var e,t;this.finishDrag(),this.setSelected(null);for(let{part:i,transform:r}of this.originals.values())this.adapter.isDisposed(i)||this.adapter.restoreTransform(i,r);this.activePointerId=null,(t=(e=this.adapter).requestRender)==null||t.call(e)}dispose(){this.setEnabled(!1),this.originals.clear()}handlePointerDown(e,t){if(t.button!==0||t.isPrimary===!1)return;let i=this.adapter.resolvePart(e);if(!i){this.drag=null,this.pendingDrag=null,this.activePointerId=null,this.setSelected(null);return}this.activePointerId=t.pointerId,this.setSelected(i),this.pendingDrag={part:i,event:t,x:t.clientX,y:t.clientY}}handlePointerMove(e){if(!(this.activePointerId!==null&&e.pointerId!==this.activePointerId)){if(!this.drag&&this.pendingDrag){if(e.pointerType==="mouse"&&(e.buttons&1)===0){this.pendingDrag=null,this.activePointerId=null;return}if(Math.hypot(e.clientX-this.pendingDrag.x,e.clientY-this.pendingDrag.y){this.dragUpdateFrame=null,this.flushDragUpdate()}))}flushDragUpdate(){this.dragUpdateFrame!==null&&(wle(this.dragUpdateFrame),this.dragUpdateFrame=null);let e=this.pendingDragEvent;this.pendingDragEvent=null,!(!this.drag||!e)&&this.adapter.updateDrag(this.drag,e)}setSelected(e){this.selected=e,this.frameCount=0,this.adapter.setSelected(e)}captureOriginalTransform(e){let t=this.adapter.getPartId(e);this.originals.has(t)||this.originals.set(t,{part:e,transform:this.adapter.captureTransform(e)})}};jA.DRAG_START_DISTANCE=4;WC=jA});function Wle(n){return!!n&&typeof n=="object"&&!Array.isArray(n)}function qA(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"")}function zle(n){if(typeof n=="string"){let e=n.trim();return e.length>0?e:void 0}if(typeof n=="number"&&Number.isFinite(n))return String(n)}function GU(n,e=0){if(!Wle(n)||e>2)return[];let t=[];for(let i of kle)for(let[r,s]of Object.entries(n))qA(r)===qA(i)&&t.push(...GU(s,e+1));return t.push(n),t}function z_(n,e){let t=new Set(e.map(qA));for(let i of n)for(let[r,s]of Object.entries(i)){if(!t.has(qA(r)))continue;let a=zle(s);if(a)return a}}function va(n,e={}){var c,f;let t=GU(n),i=z_(t,Fle),r=z_(t,Ble),s=z_(t,Ule),a=(c=z_(t,Gle))!=null?c:e.path,o=(f=z_(t,Vle))!=null?f:e.name;return{componentId:i,occurrenceId:r,partNumber:s,componentPath:a,displayName:o,hasExplicitIdentity:!!(i||r||s)}}var Fle,Ble,Ule,Vle,Gle,kle,HC=y(()=>{"use strict";Fle=["ai3dPartId","partId","componentId","componentIdentifier","cadId","persistentId","externalId","id"],Ble=["ai3dOccurrenceId","occurrenceId","instanceId","occurrencePath","assemblyPath","pathId"],Ule=["ai3dPartNumber","partNumber","partNo","partNum","swPartNumber","solidworksPartNumber","part_number"],Vle=["displayName","partName","componentName","cadName","name"],Gle=["componentPath","cadPath","assemblyPath","occurrencePath"],kle=["ai3d","cad","solidworks","sw","metadata","properties","extras","gltf","userData"]});function Sa(n){return n instanceof ui}function H_(n){return n instanceof Ds}function Ff(n){return Sa(n)||H_(n)}function Ws(n){return n?Array.isArray(n)?n:[n]:[]}function X_(n){var r,s,a,o;if(H_(n))return 0;let e=n.geometry,t=(s=(r=e.getIndex())==null?void 0:r.count)!=null?s:0;if(t>0)return Math.floor(t/3);let i=(o=(a=e.getAttribute("position"))==null?void 0:a.count)!=null?o:0;return Math.floor(i/3)}function Om(n){var e,t;return(t=(e=n.geometry.getAttribute("position"))==null?void 0:e.count)!=null?t:0}function Nm(n){return n?n.name||n.type||`material-${n.uuid}`:null}function Ea(n,e){var i;let t=(i=n.userData)==null?void 0:i.name;return typeof t=="string"&&t.trim().length>0?t:n.name||e}function Lm(n,e){let t=[],i=e;for(;i&&i!==n;)t.push(Ea(i,i.type||`object-${i.id}`)),i=i.parent;return t.reverse().join("/")}function $r(n){let e=new kr().setFromObject(n);return ka(ei(e.min),ei(e.max))}function kU(n){let e=new Map;for(let t of n)t.updateWorldMatrix(!0,!1),e.set(t,$r(t));return e}function WU(n){return Ws(n.material).map(e=>Nm(e))}function zU(n){return{name:Ea(n,H_(n)?`points-${n.id}`:`mesh-${n.id}`),triangleCount:H_(n)?null:X_(n),vertexCount:Om(n),materialName:Nm(Ws(n.material)[0])}}function Hle(n,e,t){var a;n.updateWorldMatrix(!0,!1);let i=(a=t==null?void 0:t.get(n))!=null?a:$r(n),r=Ea(n,`mesh-${n.id}`),s=va(n.userData,{name:r,path:e?Lm(e,n):r});return ac({name:JA(s,r),triangleCount:X_(n),vertexCount:Om(n),materialName:Nm(Ws(n.material)[0]),boundingSize:Xi(i),center:Er(i),source:s.hasExplicitIdentity?"component":"mesh",meshNames:[r],childCount:1,componentId:s.componentId,occurrenceId:s.occurrenceId,partNumber:s.partNumber,componentPath:s.componentPath})}function XC(n,e,t){var a;if(Sa(n))return Hle(n,e,t);n.updateWorldMatrix(!0,!1);let i=(a=t==null?void 0:t.get(n))!=null?a:$r(n),r=Ea(n,`points-${n.id}`),s=va(n.userData,{name:r,path:e?Lm(e,n):r});return ac({name:JA(s,r),triangleCount:0,vertexCount:Om(n),materialName:Nm(Ws(n.material)[0]),boundingSize:Xi(i),center:Er(i),source:s.hasExplicitIdentity?"component":"mesh",meshNames:[r],childCount:1,componentId:s.componentId,occurrenceId:s.occurrenceId,partNumber:s.partNumber,componentPath:s.componentPath})}function Xle(n,e){let t=[];return n.traverse(i=>{Sa(i)&&e.has(i)&&t.push(i)}),t}function wm(n,e){let t=new Map;for(let i of e){let r=i.parent;for(;r&&r!==n;){let s=t.get(r);s||(s=[],t.set(r,s)),s.push(i),r=r.parent}}return t}function HU(n,e,t){var i;return(i=t==null?void 0:t.get(n))!=null?i:Xle(n,e)}function Yle(n){let e=n.trim().toLowerCase();return/^(scene|root|model|group|node|object|assembly|component)[-_\s.]?\d*$/i.test(e)||e==="__root__"}function Kle(n){return/->\d+(?:[_\s.-]*primitive\d*)?$/i.test(n.trim())}function XU(n,e,t,i,r){var m;if(Ff(n))return XC(n,e,r);n.updateWorldMatrix(!0,!0);let s=new Set(t!=null?t:[]);s.size===0&&n.traverse(g=>{Sa(g)&&s.add(g)});let a=HU(n,s,i),o=null,l=new Set,c=0,f=0;for(let g of a){g.updateWorldMatrix(!0,!1),o=vu(o,(m=r==null?void 0:r.get(g))!=null?m:$r(g)),c+=X_(g),f+=Om(g);for(let p of Ws(g.material)){let _=Nm(p);_&&l.add(_)}}a.length===0&&(o=$r(n));let d=o!=null?o:ka({x:0,y:0,z:0},{x:0,y:0,z:0}),u=Ea(n,`group-${n.id}`),h=va(n.userData,{name:u,path:e?Lm(e,n):u});return ac({name:JA(h,u),triangleCount:c,vertexCount:f,materialName:Eu(l),boundingSize:Xi(d),center:Er(d),source:h.hasExplicitIdentity?"component":"group",meshNames:a.map(g=>Ea(g,`mesh-${g.id}`)),childCount:a.length,componentId:h.componentId,occurrenceId:h.occurrenceId,partNumber:h.partNumber,componentPath:h.componentPath})}function QA(n,e,t,i){var l,c;let r=new Set(t),s=null,a=null,o=e.parent;for(;o&&o!==n;){let f=HU(o,r,i);if(f.length>0&&f.length1&&u.trim()&&!Yle(u)&&(s=o)}o=o.parent}return(c=s!=null?s:a)!=null?c:e}function YU(n,e,t=wm(n,e),i){let r=[],s=new Set,a=[];return n.updateWorldMatrix(!0,!0),n.traverse(o=>{var f;if(o===n||Sa(o))return;let l=(f=t.get(o))!=null?f:[];if(l.length<2||l.length===e.length){let d=va(o.userData,{name:Ea(o,`component-${o.id}`),path:Lm(n,o)});if(!d.hasExplicitIdentity||l.length<1||l.length===e.length)return;a.push({object:o,childMeshes:l,identity:d});return}let c=va(o.userData,{name:Ea(o,`group-${o.id}`),path:Lm(n,o)});!c.hasExplicitIdentity&&!o.name.trim()||a.push({object:o,childMeshes:l,identity:c})}),a.sort((o,l)=>o.childMeshes.length-l.childMeshes.length).forEach(({object:o,childMeshes:l,identity:c})=>{var p;let f=l.filter(_=>!s.has(_));if(f.length<1||!c.hasExplicitIdentity&&f.length<2)return;for(let _ of f)s.add(_);let d=null;for(let _ of f)_.updateWorldMatrix(!0,!1),d=vu(d,(p=i==null?void 0:i.get(_))!=null?p:$r(_));let u=new Set,h=0,m=0;for(let _ of f){h+=X_(_),m+=Om(_);for(let v of Ws(_.material)){let E=Nm(v);E&&u.add(E)}}let g=d!=null?d:ka({x:0,y:0,z:0},{x:0,y:0,z:0});r.push(ac({name:JA(c,Ea(o,`group-${o.id}`)),triangleCount:h,vertexCount:m,materialName:Eu(u),boundingSize:Xi(g),center:Er(g),source:c.hasExplicitIdentity?"component":"group",meshNames:f.map(_=>Ea(_,`mesh-${_.id}`)),childCount:f.length,componentId:c.componentId,occurrenceId:c.occurrenceId,partNumber:c.partNumber,componentPath:c.componentPath}))}),{parts:r,groupedMeshes:s}}function $A(n,e,t=[],i){return yA({rootName:n.name||"__root__",boundingSize:Xi(i!=null?i:$r(n)),meshes:e.map(r=>({triangleCount:X_(r),vertexCount:Om(r),materialKeys:Ws(r.material).map(s=>s.uuid)})),resourceWarnings:t})}function KU(n,e,t,i){var f;if(!n)return{meshCount:0,pointCloudCount:0,smallPartCount:0,smallestPartSpan:null,modelSpan:null};let r=Xi(t!=null?t:$r(n)),s=Math.max(r.x,r.y,r.z),a=Math.max(s*.04,Number.EPSILON),o=0,l=0,c=Number.POSITIVE_INFINITY;for(let d of e){H_(d)&&o++;let u=Xi((f=i==null?void 0:i.get(d))!=null?f:$r(d)),h=Math.max(u.x,u.y,u.z);Number.isFinite(h)&&h>0&&(c=Math.min(c,h),Sa(d)&&h<=a&&h0?Number(s.toPrecision(6)):null}}function JA(n,e){var t;return((t=n.displayName)==null?void 0:t.trim())||n.partNumber||n.componentId||e}var YC=y(()=>{"use strict";us();gl();HC();G_();ks();IA()});function jle(n){return!!n&&typeof n=="object"&&"object"in n&&"meshes"in n}function Zle(n,e,t=wm(n,e)){let i=new Map;for(let r of e){let s=QA(n,r,e,t),a=i.get(s);a||(a={id:s.id,object:s,meshes:[]},i.set(s,a)),a.meshes.push(r)}return Array.from(i.values())}function qle(n,e){var t;n.updateMatrixWorld(!0),(t=e.parent)==null||t.updateMatrixWorld(!0),e.updateMatrixWorld(!0),n.attach(e),e.updateMatrixWorld(!0)}function ZU(n,e,t,i,r,s,a,o){return ZA(new KC(n,e,t,i,r,s,a,o))}var jU,Qle,KC,qU=y(()=>{"use strict";us();ks();zC();YC();jU=new ht(4890367),Qle=new ht(1722990),KC=class{constructor(e,t,i,r,s,a,o,l=wm(r,s)){this.meshToPart=new Map;this.raycaster=new Af;this.pointer=new yt;this.tempBox=new kr;this.tempCenter=new re;this.tempDirection=new re;this.tempCameraForward=new re;this.tempCameraRight=new re;this.tempCameraUp=new re;this.tempDragOffset=new re;this.tempNextPosition=new re;this.tempHelperDelta=new re;this.partCenterCache=new Map;this.selectionHelper=null;this.lastOccluded=!1;this.selected=null;this.lastPointerDown=null;this.partPointerActive=!1;this.activePointerId=null;this.scene=e,this.camera=t,this.canvas=i,this.meshes=s,this.parts=Zle(r,s,l);for(let c of this.parts)for(let f of c.meshes)this.meshToPart.set(f.id,c);this.controls=a,this.invalidate=o}requestRender(){this.invalidate()}getParts(){return this.parts}getPartId(e){return e.id}isDisposed(e){return!e.object.parent&&!this.scene.children.includes(e.object)}captureTransform(e){return{parent:e.object.parent,position:e.object.position.clone(),quaternion:e.object.quaternion.clone(),scale:e.object.scale.clone()}}restoreTransform(e,t){t.parent?t.parent.add(e.object):this.scene.add(e.object),e.object.position.copy(t.position),e.object.quaternion.copy(t.quaternion),e.object.scale.copy(t.scale),e.object.updateMatrixWorld(!0),this.invalidatePartCenter(e),this.requestRender()}subscribe(e){this.canvas.classList.add("ai3d-disassembly-active");let t=s=>{var o,l;if(s.button!==0||s.isPrimary===!1)return;this.lastPointerDown={x:s.clientX,y:s.clientY};let a=this.resolvePickTarget(s);if(this.partPointerActive=!!a,this.partPointerActive){s.preventDefault(),s.stopPropagation(),this.controls.enabled=!1,this.activePointerId=s.pointerId;try{(l=(o=this.canvas).setPointerCapture)==null||l.call(o,s.pointerId)}catch(c){}}e.onPointerDown(a,s)},i=s=>{this.activePointerId!==null&&s.pointerId!==this.activePointerId||(this.partPointerActive&&(s.preventDefault(),s.stopPropagation()),e.onPointerMove(s))},r=s=>{var a,o;if(!(this.activePointerId!==null&&s.pointerId!==this.activePointerId)){if(this.partPointerActive&&(s.preventDefault(),s.stopPropagation()),this.lastPointerDown=null,e.onPointerUp(s),this.partPointerActive=!1,this.activePointerId!==null&&((o=(a=this.canvas).hasPointerCapture)!=null&&o.call(a,this.activePointerId)))try{this.canvas.releasePointerCapture(this.activePointerId)}catch(l){}this.activePointerId=null,this.controls.enabled=!0}};return this.canvas.addEventListener("pointerdown",t),window.addEventListener("pointermove",i),window.addEventListener("pointerup",r),()=>{var s,a;if(this.canvas.removeEventListener("pointerdown",t),window.removeEventListener("pointermove",i),window.removeEventListener("pointerup",r),this.canvas.classList.remove("ai3d-disassembly-active","ai3d-disassembly-dragging"),this.partPointerActive=!1,this.activePointerId!==null&&((a=(s=this.canvas).hasPointerCapture)!=null&&a.call(s,this.activePointerId)))try{this.canvas.releasePointerCapture(this.activePointerId)}catch(o){}this.activePointerId=null,this.controls.enabled=!0}}resolvePart(e){var t;return jle(e)?this.parts.includes(e)?e:null:e&&(t=this.meshToPart.get(e.id))!=null?t:null}setSelected(e){var t;(t=this.selectionHelper)==null||t.removeFromParent(),this.selectionHelper=null,this.selected=e,this.lastOccluded=!1,e&&!this.isDisposed(e)&&(this.selectionHelper=new cl(e.object,jU),this.scene.add(this.selectionHelper)),this.requestRender()}beginDrag(e,t){let i=this.getPartWorldCenter(e,this.tempCenter).clone(),r=this.getPointOnDragPlane(i,t);if(!r)return null;t.preventDefault(),t.stopPropagation(),qle(this.scene,e.object),this.canvas.classList.add("ai3d-disassembly-dragging");let s="move";t.shiftKey&&(s="rotate");let a=this.tempCameraForward;this.camera.getWorldDirection(a);let o=Mm(ei(r),ei(a));return o?(this.controls.enabled=!1,this.requestRender(),{part:e,mode:s,plane:o,startPoint:r.clone(),startPosition:e.object.position.clone(),startQuaternion:e.object.quaternion.clone(),pivot:i,pointerX:t.clientX,pointerY:t.clientY}):null}updateDrag(e,t){if(t.preventDefault(),t.stopPropagation(),e.mode==="rotate"){this.updateRotation(e,t);return}let i=this.getRayPlanePoint(t,e.plane);if(!i)return;let r=this.tempDragOffset.copy(i).sub(e.startPoint),s=this.tempNextPosition.copy(e.startPosition).add(r),a=this.tempHelperDelta.copy(s).sub(e.part.object.position);e.part.object.position.copy(s),e.part.object.updateMatrixWorld(!0),this.invalidatePartCenter(e.part),this.translateSelectionHelper(a),this.requestRender()}endDrag(e){var t;this.controls.enabled=!0,this.canvas.classList.remove("ai3d-disassembly-dragging"),(t=this.selectionHelper)==null||t.update(),this.requestRender()}updateSelectionOcclusion(e){let t=this.getPartWorldCenter(e,this.tempCenter),i=this.camera.position,r=Of(ei(i),ei(t));if(!r)return;let s=this.tempDirection.set(r.direction.x,r.direction.y,r.direction.z);this.raycaster.set(i,s),this.raycaster.far=r.distance;let a=this.raycaster.intersectObjects(this.meshes,!1)[0],o=!!a&&Lf(a.distance,r.distance,r.epsilon);o!==this.lastOccluded&&(this.lastOccluded=o,this.selectionHelper&&(this.selectionHelper.material.color.set(o?Qle:jU),this.requestRender()))}updateRotation(e,t){var c;let i=t.clientX-e.pointerX,r=t.clientY-e.pointerY,s=this.tempCameraForward;this.camera.getWorldDirection(s);let a=this.tempCameraUp.copy(this.camera.up).normalize(),o=this.tempCameraRight.crossVectors(a,s).normalize(),l=RA({startPosition:ei(e.startPosition),pivot:ei(e.pivot),startRotationQuaternion:xA(e.startQuaternion),yawAxis:ei(a),pitchAxis:ei(o),deltaX:i,deltaY:r,sensitivity:.01});l&&(e.part.object.position.set(l.position.x,l.position.y,l.position.z),e.part.object.quaternion.set(l.rotationQuaternion.x,l.rotationQuaternion.y,l.rotationQuaternion.z,l.rotationQuaternion.w),e.part.object.updateMatrixWorld(!0),this.invalidatePartCenter(e.part),(c=this.selectionHelper)==null||c.update(),this.requestRender())}resolvePickTarget(e){let t=this.canvas.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.meshes,!1)[0];return(i==null?void 0:i.object)instanceof ui?i.object:null}getPointOnDragPlane(e,t){var s;let i=this.tempCameraForward;this.camera.getWorldDirection(i);let r=Mm(ei(e),ei(i));return r&&(s=this.getRayPlanePoint(t,r))!=null?s:e}getRayPlanePoint(e,t){let i=this.canvas.getBoundingClientRect(),r=e.clientX-i.left,s=e.clientY-i.top;this.pointer.set(r/i.width*2-1,-(s/i.height)*2+1),this.raycaster.setFromCamera(this.pointer,this.camera);let a=AA({origin:ei(this.raycaster.ray.origin),direction:ei(this.raycaster.ray.direction)},t);return a?new re(a.x,a.y,a.z):null}getPartWorldCenter(e,t){let i=this.partCenterCache.get(e.id);return i?t.copy(i):(this.tempBox.setFromObject(e.object).getCenter(t),this.partCenterCache.set(e.id,t.clone()),t)}invalidatePartCenter(e){this.partCenterCache.delete(e.id)}translateSelectionHelper(e){if(!this.selectionHelper||e.lengthSq()<=Number.EPSILON)return;let t=this.selectionHelper.geometry.getAttribute("position");for(let i=0;ie.uuid).join("|"):n.uuid}function tce(n){if(n)for(let e of Array.isArray(n)?n:[n])e.dispose()}var $le,ex,$U=y(()=>{"use strict";$le=.242;ex=class{constructor(){this.materials=new Map}get(e){let t=ece(e),i=this.materials.get(t);if(i)return i;let r=Jle(e);return this.materials.set(t,r),r}clear(){for(let e of this.materials.values())tce(e);this.materials.clear()}get size(){return this.materials.size}}});function JU(n){return un(n)}function ice(n,e){return{originalPosition:JU(n),originalCenter:JU(e)}}function tx(n,e,t){let i=n.getRootCenter();for(let r of n.getParts()){let s=n.getPartState(r);s||(s=ice(n.getPartPosition(r),n.getPartCenter(r)),n.setPartState(r,s));let a=(s.originalCenter[t]-i[t])*e;n.setPartPosition(r,SU(s.originalPosition,t,a))}}function ix(n){for(let e of n.getParts()){let t=n.getPartState(e);t&&n.setPartPosition(e,t.originalPosition)}}var jC=y(()=>{"use strict";ks()});function rx(n){return un(n)}function rce(n){return n instanceof ui}function nce(n){let e=[];return n.traverse(t=>{rce(t)&&t.geometry&&e.push(t)}),e}function eV(n,e,t){tx(new nx(n),e,t)}function ZC(n){ix(new nx(n))}var nx,tV=y(()=>{"use strict";us();ks();gl();jC();nx=class{constructor(e){this.root=e}getParts(){return nce(this.root)}getRootCenter(){let e=new kr().setFromObject(this.root);return Er({min:ei(e.min),max:ei(e.max)})}getPartPosition(e){return ei(e.position)}getPartCenter(e){let i=new kr().setFromObject(e).getCenter(new re);return ei(i)}setPartPosition(e,t){e.position.set(t.x,t.y,t.z)}getPartState(e){var i;let t=(i=e.userData)!=null?i:{};return t._previewExplodeState?{originalPosition:rx(t._previewExplodeState.originalPosition),originalCenter:rx(t._previewExplodeState.originalCenter)}:null}setPartState(e,t){e.userData._previewExplodeState={originalPosition:rx(t.originalPosition),originalCenter:rx(t.originalCenter)}}}});function iV(n){return n.cameraMoved||n.animating||n.renderDirty||n.renderObserverCount>0&&n.renderObserverSettleFrames>0}var sx,rV=y(()=>{"use strict";sx=class{constructor(e=120){this.maxSamples=e;this.samples=[];this.renderedFrameCount=0;this.idleFrameSkipCount=0;this.slowFrameCount=0;this.maxRenderMs=0;this.adaptiveScaleChangeCount=0}recordRenderedFrame(e,t){!Number.isFinite(e)||e<0||(this.renderedFrameCount++,e>=t&&this.slowFrameCount++,this.maxRenderMs=Math.max(this.maxRenderMs,e),this.samples.push(e),this.samples.length>this.maxSamples&&this.samples.shift())}recordIdleFrameSkip(){this.idleFrameSkipCount++}recordAdaptiveScaleChange(){this.adaptiveScaleChangeCount++}snapshot(){let e=[...this.samples].sort((r,s)=>r-s),t=this.samples.reduce((r,s)=>r+s,0),i=e.length===0?-1:Math.min(e.length-1,Math.ceil(e.length*.95)-1);return{renderedFrameCount:this.renderedFrameCount,idleFrameSkipCount:this.idleFrameSkipCount,slowFrameCount:this.slowFrameCount,averageRenderMs:e.length?Number((t/e.length).toFixed(2)):0,p95RenderMs:i>=0?Number(e[i].toFixed(2)):0,maxRenderMs:Number(this.maxRenderMs.toFixed(2)),adaptiveScaleChangeCount:this.adaptiveScaleChangeCount}}}});var lV={};Be(lV,{ThreeModelPreview:()=>ox,createThreeModelPreview:()=>bce});function aV(){return{textureCount:0,colorTextureCount:0,srgbColorTextureCount:0}}function Rce(n,e){n.textureCount+=e.textureCount,n.colorTextureCount+=e.colorTextureCount,n.srgbColorTextureCount+=e.srgbColorTextureCount}function qC(n){return n instanceof ll||n instanceof vo||n instanceof rc}function QC(n){return n instanceof ir}function oV(n){return Number.isFinite(n)?Math.max(0,Math.min(n,1)):0}function bce(n){return new ox(n)}var ax,sce,ace,oce,lce,cce,nV,fce,sV,dce,uce,hce,mce,pce,gce,_ce,vce,Ece,Sce,Y_,Tce,Ace,xce,ox,cV=y(()=>{"use strict";us();F2();B2();mU();ga();Rm();gl();bA();DA();F_();wC();ks();G_();W_();qU();$U();tV();ps();CC();rV();YC();ax=new ht("#20242e"),sce=.28,ace=2.5,oce=1.5,lce=1.15,cce=260,nV=30,fce=8,sV=28,dce=18,uce=2,hce=28,mce=.86,pce=1.08,gce=.62,_ce=.86,vce=4,Ece=120,Sce=16317180,Y_=16317180,Tce=16096779,Ace=16777215,xce=15067115;ox=class{constructor(e){this.raycaster=new Af;this.occlusionRaycaster=new Af;this.renderObservers=new Set;this.cameraZoomObservers=new Set;this.pointer=new yt;this.annotationProjection=new re;this.annotationDirection=new re;this.clock={last:performance.now()};this.defaultLights=[];this.configLights=[];this.environmentTarget=null;this.environmentInstallHandle=0;this.rootObject=null;this.loadedExt="";this.resourceWarnings=[];this.textureAudit=aV();this.renderHandle=0;this.contextLost=!1;this.quality="high";this.renderScale=1;this.interactivePixelRatioActive=!1;this.interactionPixelRatioDeadline=0;this.renderObserverSettleFrames=0;this.frameBudgetPixelRatioScale=1;this.frameBudgetSlowStreak=0;this.frameBudgetFastStreak=0;this.frameBudgetObserverStride=1;this.frameBudgetObserverCursor=0;this.frameBudgetShadowDeferred=!1;this.lastFrameDurationMs=0;this.smoothness=new sx;this.viewportVisible=!0;this.viewportObserver=null;this.lastDisposalAudit={reason:"initial",meshCount:0,geometryCount:0,materialCount:0,textureCount:0,objectCount:0,timestamp:performance.now()};this.axesHelper=null;this.bboxHelper=null;this.groundShadowMesh=null;this.meshShadowFlagsPrepared=!1;this.gridHelper=null;this.bboxEnabled=!1;this.wireframeEnabled=!1;this.wireframeOriginalMaterials=new Map;this.sceneConfig={};this.focusSelectionEnabled=!1;this.explodeStateActive=!1;this.focusedObject=null;this.highlightedObject=null;this.selectionHelper=null;this.focusHelper=null;this.mixer=null;this.animationPlaying=!1;this.initialTarget=new re;this.initialPosition=new re(3,2,3);this.initialFov=45;this.initialZoom=1;this.initialCameraMode="perspective";this.cameraMode="perspective";this.lastPointerDown=null;this.measurementActive=!1;this.measurementScale={x:1,y:1,z:1};this.measurementBaseRootScale=new re(1,1,1);this.measurementBaseBounds=null;this.measurementUnit="mm";this.measurementSegments=[];this.measurementMarkers=[];this.measurementMarkerPoints=[];this.measurementTargetObject=null;this.measurementTargetHelper=null;this.measurementSnapKind=null;this.measurementObservers=new Set;this.pendingPoint=null;this.pendingMarker=null;this.hoveredMarkerIndex=-1;this.lastPointerClient={x:0,y:0,altKey:!1};this.previewLine=null;this.previewLineUpdateHandle=0;this.originalMaterials=new Map;this.focusedSelectedMeshes=new Map;this.focusDimMaterialCache=new ex;this._lastPickResult={mesh:null,pickedPoint:null,screenX:0,screenY:0};this._onPickCallbacks=[];this.disassembly=null;this.disassemblySetup=!1;this.renderDirty=!0;this.stlMaterial=null;this.cachedMeshes=null;this.cachedMeshRoot=null;this.cachedRenderables=null;this.cachedRenderableRoot=null;this.cachedRenderableObjectCount=null;this.cachedChildMeshMap=null;this.cachedChildMeshMapRoot=null;this.cachedRenderableBoundsMap=null;this.cachedRenderableBoundsMapRoot=null;this.cachedRootPreviewBounds=null;this.cachedRootPreviewBoundsObject=null;this.cachedGeometryQualityStats=null;this.cameraAnimHandle=0;this.preventCanvasWheelScroll=e=>{this.prepareInteractiveFrameBudget(),e.preventDefault(),e.stopPropagation(),this.markDirty()};this.handleControlsChange=()=>{this.prepareInteractiveFrameBudget(),this.measurementSegments.length>0&&this.updateMeasurementOverlayPositions(),this.markDirty(),this.notifyCameraZoomChanged()};this.handleViewportIntersection=e=>{let t=e[e.length-1];if(!t)return;let i=t.isIntersecting&&t.intersectionRatio>0;i!==this.viewportVisible&&(this.viewportVisible=i,i?(this.clock.last=performance.now(),this.markDirty(),this.markShadowDirty(),this.startRenderLoop()):(cancelAnimationFrame(this.renderHandle),this.renderHandle=0))};this.handlePointerDown=e=>{e.button!==0||e.isPrimary===!1||(this.lastPointerDown={x:e.clientX,y:e.clientY},this.prepareInteractiveFrameBudget())};this.handlePointerUp=e=>{var i;if(e.button!==0||e.isPrimary===!1)return;let t=this.lastPointerDown;this.lastPointerDown=null,t&&(Math.hypot(e.clientX-t.x,e.clientY-t.y)>4||(i=this.disassembly)!=null&&i.isEnabled()||this.dispatchPick(e))};this.handlePointerMove=e=>{if(this.lastPointerClient={x:e.clientX,y:e.clientY,altKey:e.altKey},e.buttons&1&&this.prepareInteractiveFrameBudget(),!this.measurementActive||(this.pendingPoint&&this.schedulePreviewLineUpdate(),this.measurementMarkers.length===0))return;let t=this.renderer.domElement.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.measurementMarkers,!1),r=i.length>0?this.measurementMarkers.indexOf(i[0].object):-1;if(r!==this.hoveredMarkerIndex){if(this.hoveredMarkerIndex>=0&&this.hoveredMarkerIndex=0&&r{e.preventDefault(),this.contextLost=!0,this.renderHandle&&(cancelAnimationFrame(this.renderHandle),this.renderHandle=0)};this.handleContextRestored=()=>{this.contextLost=!1,this.markDirty(),this.startRenderLoop()};this.renderer=new eA({canvas:e,antialias:!0,alpha:!0,preserveDrawingBuffer:!0,powerPreference:"high-performance"}),this.renderer.outputColorSpace=Li,this.renderer.toneMapping=ws,this.renderer.toneMappingExposure=1,this.renderer.shadowMap.enabled=!1,this.renderer.shadowMap.type=aT,this.renderer.shadowMap.autoUpdate=!1,this.renderer.shadowMap.needsUpdate=!1,this.renderer.setClearColor(ax,1),this.scene=new $d,this.camera=new _r(this.initialFov,1,.01,2e3),this.camera.position.copy(this.initialPosition),this.camera.lookAt(this.initialTarget),this.scene.add(this.camera),this.controls=new nA(this.camera,e),this.controls.enableDamping=!0,this.controls.dampingFactor=.08,this.controls.zoomSpeed=.65,this.controls.screenSpacePanning=!0,this.controls.target.copy(this.initialTarget),this.controls.addEventListener("change",this.handleControlsChange),this.installDefaultLighting(),this.resizeObs=new ResizeObserver(()=>this.resizeRenderer()),this.resizeObs.observe(e),typeof IntersectionObserver!="undefined"&&(this.viewportObserver=new IntersectionObserver(this.handleViewportIntersection,{root:null,threshold:[0,.01]}),this.viewportObserver.observe(e)),e.addEventListener("wheel",this.preventCanvasWheelScroll,{passive:!1}),e.addEventListener("pointerdown",this.handlePointerDown),e.addEventListener("pointerup",this.handlePointerUp),e.addEventListener("pointermove",this.handlePointerMove),e.addEventListener("webglcontextlost",this.handleContextLost),e.addEventListener("webglcontextrestored",this.handleContextRestored),this.resizeRenderer(),this.startRenderLoop()}async loadModel(e,t,i,r,s){var l;Ti(s),this.clearLoadedModel("model-switch"),Ti(s),this.loadedExt=t.toLowerCase(),this.resourceWarnings=[],this.textureAudit=aV();let a=null,o=[];try{if(this.loadedExt==="glb"||this.loadedExt==="gltf"){let u=await fU(e,this.loadedExt,i,r,s);a=u.scene,o=u.animations,this.resourceWarnings=u.warnings}else if(this.loadedExt==="stl")a=await dU(e),this.stlMaterial=Sa(a)?a.material:null;else if(this.loadedExt==="ply")a=await uU(e);else if(this.loadedExt==="obj"){let u=await hU(e,i,r);a=u.object,this.resourceWarnings=u.warnings}else throw new Error(`Three preview does not support .${this.loadedExt} format`);Ti(s),this.rootObject=a,this.scene.add(a),this.invalidateMeshCache();let c=this.getRenderableObjects(a);this.prepareModelForQuality(c),Ti(s),this.syncShadowFeatures();let f=this.getRootPreviewBounds(a);if(this.captureMeasurementBaseState(a,f),this.updateShadowFraming(f),this.syncSceneHelpers(),this.markDirty(),o.length>0){this.mixer=new g_(a);for(let u of o)this.mixer.clipAction(u).play();this.animationPlaying=!0}let d=$A(a,c,this.resourceWarnings,f!=null?f:void 0);return this.cachedGeometryQualityStats=null,this.fitCameraToObject(a,f!=null?f:void 0),this.bboxEnabled&&this.ensureBoundingBoxHelper(),this.scheduleGlobalEnvironmentInstall(),this.disassemblySetup=!1,(l=this.disassembly)==null||l.dispose(),this.disassembly=null,d}catch(c){throw a&&(a.removeFromParent(),this.rootObject===a&&(this.rootObject=null),this.lastDisposalAudit=this.disposeObjectGraph(a,"model-switch"),this.invalidateMeshCache()),c}}applyConfig(e){e.camera&&this.applyCameraConfig(e.camera),e.lights&&this.applyLightConfig(e.lights),e.scene&&this.applySceneConfig(e.scene),e.stl&&this.applySTLConfig(e.stl)}applySTLConfig(e){let t=this.stlMaterial;t&&(e.color!==void 0&&t.color.set(e.color),e.wireframe!==void 0&&(t.wireframe=e.wireframe,t.needsUpdate=!0),this.markDirty())}destroy(){var t,i;cancelAnimationFrame(this.renderHandle),cancelAnimationFrame(this.cameraAnimHandle),this._onPickCallbacks=[],this.renderObservers.clear(),this.cameraZoomObservers.clear(),this.measurementObservers.clear(),(t=this.disassembly)==null||t.dispose(),this.disassembly=null,this.disassemblySetup=!1,this.clearFocusedMesh(),this.clearSelectionHighlight(),this.clearLoadedModel("destroy");for(let r of this.configLights)this.disposeConfiguredLight(r);this.configLights.length=0;for(let r of this.defaultLights)this.disposeConfiguredLight(r);this.defaultLights.length=0,this.disposeGlobalEnvironment(),this.controls.removeEventListener("change",this.handleControlsChange),this.controls.dispose();let e=this.renderer.domElement;e.removeEventListener("wheel",this.preventCanvasWheelScroll),e.removeEventListener("pointerdown",this.handlePointerDown),e.removeEventListener("pointerup",this.handlePointerUp),e.removeEventListener("pointermove",this.handlePointerMove),e.removeEventListener("webglcontextlost",this.handleContextLost),e.removeEventListener("webglcontextrestored",this.handleContextRestored),this.resizeObs.disconnect(),(i=this.viewportObserver)==null||i.disconnect(),this.viewportObserver=null,this.renderer.dispose()}getCanvas(){return this.renderer.domElement}captureSnapshot(){return this.renderNow(0),this.renderer.domElement.toDataURL("image/png")}getAnnotationProvider(){let e=this.renderer.domElement;return LA({canvas:e,observeRender:t=>(this.renderObservers.add(t),this.setRenderObserverSettleFrames(),this.markDirty(),{remove:()=>{this.renderObservers.delete(t),this.renderObservers.size===0&&this.setRenderObserverSettleFrames(0)}}),getCameraStateKey:()=>this.getAnnotationCameraStateKey(),projectWorldPoint:(t,i)=>this.projectAnnotationWorldPoint(t,i),isWorldPointOccluded:t=>this.isAnnotationWorldPointOccluded(t)})}exportModelInfo(e){var s;if(!this.rootObject)return"";let t=this.getRenderableObjects(this.rootObject),i=$A(this.rootObject,t,this.resourceWarnings,(s=this.getRootPreviewBounds())!=null?s:void 0),r=e&&Gs(e)||i.rootName;return CA({title:r,format:this.loadedExt.toUpperCase(),summary:i,meshBreakdown:t.map(zU)})}getModelEvidence(){var o;if(!this.rootObject)return null;let e=this.getRenderableObjects(this.rootObject),t=this.getRenderableMeshes(this.rootObject),i=this.getChildRenderableMeshMap(this.rootObject),r=this.getRenderableBoundsMap(this.rootObject),s=YU(this.rootObject,t,i,r),a={parts:s.parts,groupedMeshes:new Set(s.groupedMeshes)};return NA({summary:$A(this.rootObject,e,this.resourceWarnings,(o=this.getRootPreviewBounds())!=null?o:void 0),renderableMeshes:e,groupedPartCandidates:a,createMeshPart:l=>XC(l,this.rootObject,r),getMeshMaterialNames:WU,resourceWarnings:this.resourceWarnings})}getSelectedPartInfo(){var r;let e=(r=this.focusedObject)!=null?r:QC(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;if(!e)return null;let t=this.rootObject?this.getRenderableMeshes(this.rootObject):[],i=this.rootObject?this.getChildRenderableMeshMap(this.rootObject):void 0;return XU(e,this.rootObject,t,i)}exportSelectedPartInfo(){let e=this.getSelectedPartInfo();return e?PA(e):""}getPickWorldPoint(e){return e.pickedPoint&&typeof e.pickedPoint=="object"?ei(e.pickedPoint):QC(e.mesh)?Er($r(e.mesh)):null}onPick(e){return this._onPickCallbacks.push(e),()=>{this._onPickCallbacks=this._onPickCallbacks.filter(t=>t!==e)}}resetView(){this.rootObject&&this.explodeStateActive&&(ZC(this.rootObject),this.explodeStateActive=!1,this.invalidateRootBoundsCache(),this.markShadowDirty()),this.resetDisassembly(),this.clearFocusedMesh(),this.clearSelectionHighlight(),this.switchCameraMode(this.initialCameraMode),this.camera.position.copy(this.initialPosition),this.controls.target.copy(this.initialTarget),this.camera.lookAt(this.controls.target),this.camera instanceof _r&&(this.camera.fov=this.initialFov),this.camera.zoom=this.initialZoom,this.camera.updateProjectionMatrix(),this.controls.update(),this.markDirty(),this.renderNow(performance.now()),this.notifyCameraZoomChanged()}toggleFocusSelection(){var t;let e=!this.focusSelectionEnabled;return e&&((t=this.disassembly)!=null&&t.isEnabled())&&this.disassembly.setEnabled(!1),e&&this.deactivateMeasurementMode(),this.focusSelectionEnabled=e,this.focusSelectionEnabled?(this.clearSelectionHighlight(),this._lastPickResult.mesh instanceof ir&&this.setFocusedObject(this._lastPickResult.mesh)):this.clearFocusedMesh(),this.markDirty(),this.focusSelectionEnabled}isFocusSelectionEnabled(){return this.focusSelectionEnabled}setWireframe(e){e!==this.wireframeEnabled&&(this.wireframeEnabled=e,this.applyWireframe(e),this.markDirty())}toggleWireframe(){return this.setWireframe(!this.wireframeEnabled),this.wireframeEnabled}applyWireframe(e){if(this.rootObject)for(let t of this.getRenderableMeshes(this.rootObject))if(e){this.wireframeOriginalMaterials.set(t.id,t.material);let r=Ws(t.material).map(s=>{if(s instanceof Mn){let a=new fs({color:s.color,transparent:s.transparent,opacity:s.opacity,side:s.side,visible:s.visible});return a.wireframe=!0,a}if("wireframe"in s){let a=s.clone();return a.wireframe=!0,a}return s});t.material=Array.isArray(t.material)?r:r[0]}else{let i=this.wireframeOriginalMaterials.get(t.id);i&&(t.material=i),this.wireframeOriginalMaterials.delete(t.id)}}toggleOrientationGizmo(){if(!this.axesHelper){this.axesHelper=new om(1.2),this.axesHelper.visible=!1;let e=this.axesHelper.material;e.depthTest=!1,e.depthWrite=!1,this.axesHelper.renderOrder=999,this.scene.add(this.axesHelper)}return this.axesHelper.visible=!this.axesHelper.visible,this.axesHelper.position.copy(this.controls.target),this.markDirty(),this.axesHelper.visible}isOrientationGizmoEnabled(){var e;return!!((e=this.axesHelper)!=null&&e.visible)}toggleBoundingBox(){var e;return this.bboxEnabled=!this.bboxEnabled,this.bboxEnabled?(this.ensureBoundingBoxHelper(),this.markDirty(),!!this.bboxHelper):((e=this.bboxHelper)==null||e.removeFromParent(),this.bboxHelper=null,this.markDirty(),!1)}hasAnimations(){return this.mixer!==null}toggleAnimation(){return this.mixer?(this.animationPlaying=!this.animationPlaying,this.mixer.timeScale=this.animationPlaying?1:0,this.markDirty(),this.animationPlaying):!1}toggleMeasurement(){var t;if(this.measurementActive)return this.deactivateMeasurementMode(),!1;(t=this.disassembly)!=null&&t.isEnabled()&&this.disassembly.setEnabled(!1);let e=this.getCurrentMeasurementTargetObject();return this.clearSelectionHighlight(),this.focusSelectionEnabled&&(this.focusSelectionEnabled=!1,this.clearFocusedMesh()),this.measurementActive=!0,this.setMeasurementTargetObject(e,!1),wf(this.renderer.domElement,this.measurementActive),this.notifyMeasurementsChanged(),this.measurementActive}isMeasurementActive(){return this.measurementActive}clearMeasurements(){this.disposeMeasurementOverlays(!1)}cancelMeasurement(){let e=!!this.pendingPoint;this.cancelPendingMeasurement(),e&&this.notifyMeasurementsChanged()}deactivateMeasurementMode(){return this.measurementActive?(this.measurementActive=!1,wf(this.renderer.domElement,!1),this.setMeasurementTargetObject(null,!1),this.cancelPendingMeasurement(),this.notifyMeasurementsChanged(),!0):!1}disposeMeasurementOverlays(e){var t;e&&(this.measurementActive=!1,wf(this.renderer.domElement,!1),this.setMeasurementTargetObject(null,!1)),this.cancelPendingMeasurement(!1);for(let i of this.measurementSegments){i.line.removeFromParent(),i.line.geometry.dispose(),i.line.material.dispose(),i.label.removeFromParent();let r=i.label.material;(t=r.map)==null||t.dispose(),r.dispose()}this.measurementSegments=[];for(let i of this.measurementMarkers){i.removeFromParent(),i.geometry.dispose();let r=i.material;if(Array.isArray(r))for(let s of r)s.dispose();else r.dispose()}this.measurementMarkers=[],this.measurementMarkerPoints=[],this.markDirty(),this.notifyMeasurementsChanged()}setMeasurementScale(e){this.measurementScale=_s(e),this.applyMeasurementModelScale(),this.updateMeasurementOverlayPositions(),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementScale(){return{...this.measurementScale}}setMeasurementUnit(e){this.measurementUnit=k_(e),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementUnit(){return this.measurementUnit}getMeasurementBounds(){var i;if(!this.rootObject)return null;let e=(i=this.measurementBaseBounds)!=null?i:$r(this.rootObject);return Xi(e)}getMeasurementRecords(){return this.createMeasurementRecords()}getMeasurementState(){return zA({active:this.measurementActive,pending:!!this.pendingPoint,records:this.createMeasurementRecords(),unit:this.measurementUnit,scale:this.getMeasurementScale(),bounds:this.getMeasurementBounds(),targetLocked:!!this.measurementTargetObject,targetName:this.getMeasurementTargetName(),snapKind:this.measurementSnapKind})}exportMeasurements(){return KA(this.createMeasurementRecords())}observeMeasurements(e){return this.measurementObservers.add(e),e(),()=>{this.measurementObservers.delete(e)}}updateMeasurementLabels(){var t,i;if(this.measurementSegments.length===0)return;let e=this.getMeasurementMarkerSize()*3.2;for(let r of this.measurementSegments){this.updateMeasurementLineGeometry(r);let s=Dm(this.createMeasurementReading(r.start,r.end));r.label.removeFromParent();let a=r.label.material;(t=a.map)==null||t.dispose(),a.dispose();let o=this.createThreeMeasurementDraftingLayout(r.start,r.end),l=(i=o==null?void 0:o.labelPosition)!=null?i:new re().addVectors(this.toMeasurementDisplayPoint(r.start),this.toMeasurementDisplayPoint(r.end)).multiplyScalar(.5);r.label=this.createMeasurementLabelSprite(s,l,e),this.scene.add(r.label)}this.markDirty()}captureMeasurementBaseState(e,t){this.measurementBaseRootScale.copy(e.scale),this.measurementBaseBounds=t?ka(t.min,t.max):null,this.measurementScale={x:1,y:1,z:1}}resetMeasurementCalibrationState(){this.measurementScale={x:1,y:1,z:1},this.measurementBaseRootScale.set(1,1,1),this.measurementBaseBounds=null,this.measurementMarkerPoints=[]}applyMeasurementModelScale(){var t;if(!this.rootObject)return;this.applyRootMeasurementScale(),this.invalidateRootBoundsCache();let e=(t=this.getRootPreviewBounds())!=null?t:$r(this.rootObject);this.updateShadowFraming(e),this.bboxEnabled&&this.ensureBoundingBoxHelper(),this.removeGroundShadow(),this.removeGrid(),this.syncSceneHelpers(),this.fitCameraToObject(this.rootObject,e),this.applyRootMeasurementScale(),this.invalidateRootBoundsCache()}applyRootMeasurementScale(){if(!this.rootObject)return;let e=_s(this.measurementScale);this.rootObject.scale.set(this.measurementBaseRootScale.x*e.x,this.measurementBaseRootScale.y*e.y,this.measurementBaseRootScale.z*e.z),this.rootObject.updateMatrixWorld(!0)}getMeasurementPivot(){return this.rootObject?this.rootObject.getWorldPosition(new re):new re}toMeasurementDisplayPoint(e){let t=BA(e,this.getMeasurementPivot(),this.measurementScale);return new re(t.x,t.y,t.z)}toMeasurementBasePoint(e){let t=UA(e,this.getMeasurementPivot(),this.measurementScale);return new re(t.x,t.y,t.z)}updateMeasurementOverlayPositions(){this.updateMeasurementTargetHelper();for(let e=0;e{this.cameraZoomObservers.delete(e)}}getPerformanceSnapshot(){let e=this.smoothness.snapshot(),t=this.getQualitySnapshot();return{backend:"three",renderScale:Number(this.renderScale.toFixed(2)),quality:this.quality,pixelRatio:Number(this.renderer.getPixelRatio().toFixed(2)),interactivePixelRatioActive:this.interactivePixelRatioActive,renderDirty:this.renderDirty,renderObserverCount:this.renderObservers.size,renderObserverSettleFrames:this.renderObserverSettleFrames,frameBudgetPixelRatioScale:Number(this.frameBudgetPixelRatioScale.toFixed(2)),frameBudgetObserverStride:this.frameBudgetObserverStride,frameBudgetShadowDeferred:this.frameBudgetShadowDeferred,lastFrameDurationMs:Number(this.lastFrameDurationMs.toFixed(2)),averageRenderMs:e.averageRenderMs,p95RenderMs:e.p95RenderMs,maxRenderMs:e.maxRenderMs,renderedFrameCount:e.renderedFrameCount,slowFrameCount:e.slowFrameCount,idleFrameSkipCount:e.idleFrameSkipCount,adaptiveScaleChangeCount:e.adaptiveScaleChangeCount,viewportVisible:this.viewportVisible,disposalAudit:{...this.lastDisposalAudit},meshCount:t.geometry.meshCount,qualitySnapshot:t}}getQualitySnapshot(){let e=this.getGeometryQualityStats(),t=this.smoothness.snapshot();return{backend:"three",supportedFormats:["glb","gltf","stl","ply","obj"],colorPipeline:{outputColorSpace:String(this.renderer.outputColorSpace),toneMapping:this.renderer.toneMapping===ws?"NoToneMapping":String(this.renderer.toneMapping),textureCount:this.textureAudit.textureCount,colorTextureCount:this.textureAudit.colorTextureCount,srgbColorTextureCount:this.textureAudit.srgbColorTextureCount},geometry:e,camera:{near:Number(this.camera.near.toPrecision(6)),far:Number(this.camera.far.toPrecision(6)),nearFarRatio:Number((this.camera.far/Math.max(this.camera.near,Number.EPSILON)).toPrecision(6))},performance:{renderScale:Number(this.renderScale.toFixed(2)),pixelRatio:Number(this.renderer.getPixelRatio().toFixed(2)),frameBudgetPixelRatioScale:Number(this.frameBudgetPixelRatioScale.toFixed(2)),frameBudgetObserverStride:this.frameBudgetObserverStride,viewportVisible:this.viewportVisible,renderedFrameCount:t.renderedFrameCount,idleFrameSkipCount:t.idleFrameSkipCount,slowFrameCount:t.slowFrameCount,averageRenderMs:t.averageRenderMs,p95RenderMs:t.p95RenderMs,maxRenderMs:t.maxRenderMs,adaptiveScaleChangeCount:t.adaptiveScaleChangeCount}}}setExplode(e,t){if(!this.rootObject)return;let i=Math.abs(e)>Number.EPSILON;!i&&!this.explodeStateActive||(eV(this.rootObject,e,t),this.explodeStateActive=i,this.invalidateRootBoundsCache(),this.markShadowDirty(),this.markDirty())}resetExplode(){this.rootObject&&this.explodeStateActive&&(ZC(this.rootObject),this.explodeStateActive=!1,this.invalidateRootBoundsCache(),this.markShadowDirty(),this.markDirty())}focusWorldPoint(e){let t=new re(e.x,e.y,e.z),i=this.camera.position.distanceTo(this.controls.target),r=t.clone().sub(this.camera.position).normalize(),s=t.clone().sub(r.multiplyScalar(i));this.animateCamera(s,t)}toggleDisassembly(){if(this.ensureDisassembly(),!this.disassembly)return!1;let e=!this.disassembly.isEnabled();e&&(this.focusSelectionEnabled=!1,this.clearFocusedMesh(),this.clearSelectionHighlight(),this.deactivateMeasurementMode());let t=this.disassembly.setEnabled(e);return t||this.disassembly.reset(),t}resetDisassembly(){this.disassembly&&(this.disassembly.reset(),this.invalidateRootBoundsCache())}isDisassemblyEnabled(){var e,t;return(t=(e=this.disassembly)==null?void 0:e.isEnabled())!=null?t:!1}ensureDisassembly(){if(this.disassemblySetup||(this.disassemblySetup=!0,!this.rootObject))return;let e=this.getRenderableMeshes(this.rootObject);e.length!==0&&(this.disassembly=ZU(this.scene,this.camera,this.renderer.domElement,this.rootObject,e,this.controls,()=>{this.invalidateRootBoundsCache(),this.markShadowDirty(),this.markDirty()},this.getChildRenderableMeshMap(this.rootObject)))}animateCamera(e,t){cancelAnimationFrame(this.cameraAnimHandle);let i=this.camera.position.clone(),r=this.controls.target.clone(),s=500,a=performance.now(),o=()=>{let l=performance.now()-a,c=Math.min(1,l/s),f=c<.5?4*c*c*c:1-Math.pow(-2*c+2,3)/2;this.camera.position.lerpVectors(i,e,f),this.controls.target.lerpVectors(r,t,f),this.controls.update(),this.markDirty(),c<1&&(this.cameraAnimHandle=window.requestAnimationFrame(o))};this.cameraAnimHandle=window.requestAnimationFrame(o)}startRenderLoop(){if(this.renderHandle||!this.viewportVisible||this.contextLost)return;let e=()=>{if(!this.viewportVisible||this.contextLost){this.renderHandle=0;return}let t=this.renderNow(performance.now());this.renderHandle=t?window.requestAnimationFrame(e):0};this.renderHandle=window.requestAnimationFrame(e)}renderNow(e){var l,c,f;let t=this.renderer.domElement;if(!this.viewportVisible||!t.isConnected||t.clientWidth<=0||t.clientHeight<=0)return!1;let i=Math.max(0,(e-this.clock.last)/1e3);this.clock.last=e;let r=this.controls.update(),s=!!this.mixer&&this.animationPlaying;if(s&&this.mixer&&(this.mixer.update(i),this.markShadowDirty()),this.restoreInteractivePixelRatioIfIdle(e,r),!r&&!s&&!this.renderDirty)return this.smoothness.recordIdleFrameSkip(),this.renderObserverSettleFrames>0&&(this.renderObserverSettleFrames--,this.notifyRenderObservers()),this.shouldContinueRenderLoop(r,s);this.renderDirty=!1,this.setRenderObserverSettleFrames(),(l=this.bboxHelper)==null||l.update(),(c=this.selectionHelper)==null||c.update(),(f=this.focusHelper)==null||f.update(),this.axesHelper&&this.axesHelper.visible&&this.axesHelper.position.copy(this.controls.target);let a=performance.now();this.renderer.render(this.scene,this.camera);let o=performance.now()-a;return this.smoothness.recordRenderedFrame(o,sV),this.updateFrameBudget(o),this.notifyRenderObservers(),this.shouldContinueRenderLoop(r,s)}shouldContinueRenderLoop(e,t){return iV({cameraMoved:e,animating:t,renderDirty:this.renderDirty,renderObserverCount:this.renderObservers.size,renderObserverSettleFrames:this.renderObserverSettleFrames})}notifyRenderObservers(){if(!(this.frameBudgetObserverStride>1&&(this.frameBudgetObserverCursor=(this.frameBudgetObserverCursor+1)%this.frameBudgetObserverStride,this.frameBudgetObserverCursor!==0)))for(let e of this.renderObservers)e()}markDirty(){this.renderDirty=!0,this.startRenderLoop()}markShadowDirty(){if(!this.renderer.shadowMap.enabled){this.frameBudgetShadowDeferred=!1,this.renderer.shadowMap.needsUpdate=!1;return}if(this.shouldDeferShadowRefresh()){this.frameBudgetShadowDeferred=!0;return}this.frameBudgetShadowDeferred=!1,this.renderer.shadowMap.needsUpdate=!0}prepareInteractiveFrameBudget(){let e=performance.now();this.interactionPixelRatioDeadline=e+cce,this.activateInteractivePixelRatio()&&this.resizeRenderer()}activateInteractivePixelRatio(){if(this.interactivePixelRatioActive)return!1;let e=this.computePixelRatio(!1);return this.computePixelRatio(!0)>=e?!1:(this.interactivePixelRatioActive=!0,!0)}restoreInteractivePixelRatioIfIdle(e,t){!this.interactivePixelRatioActive||t||e=sV?(this.frameBudgetSlowStreak++,this.frameBudgetFastStreak=0):e<=dce?(this.frameBudgetFastStreak++,this.frameBudgetSlowStreak=0):(this.frameBudgetSlowStreak=0,this.frameBudgetFastStreak=0),this.frameBudgetSlowStreak>=uce){this.frameBudgetSlowStreak=0;let t=Math.max(gce,this.frameBudgetPixelRatioScale*mce);t=hce&&this.frameBudgetPixelRatioScale<1&&(this.frameBudgetFastStreak=0,this.frameBudgetPixelRatioScale=Math.min(1,this.frameBudgetPixelRatioScale*pce),this.frameBudgetObserverStride=Math.max(1,this.frameBudgetObserverStride-1),this.setRenderObserverSettleFrames(),this.smoothness.recordAdaptiveScaleChange(),this.resizeRenderer())}}resetFrameBudget(){let e=this.frameBudgetPixelRatioScale!==1||this.frameBudgetObserverStride!==1;this.frameBudgetPixelRatioScale=1,this.frameBudgetSlowStreak=0,this.frameBudgetFastStreak=0,this.frameBudgetObserverStride=1,this.frameBudgetObserverCursor=0,this.setRenderObserverSettleFrames(),e&&this.markDirty()}setRenderObserverSettleFrames(e=nV){this.renderObserverSettleFrames=this.renderObservers.size>0?e:0}shouldDeferShadowRefresh(){return this.interactivePixelRatioActive&&this.frameBudgetPixelRatioScale<=_ce}resizeRenderer(){let e=this.renderer.domElement,t=Math.max(1,Math.round(e.clientWidth||e.width||1)),i=Math.max(1,Math.round(e.clientHeight||e.height||1));this.renderer.setPixelRatio(this.computePixelRatio()),this.renderer.setSize(t,i,!1),this.camera instanceof ds?this.updateOrthographicFrustum(t/i):this.camera.aspect=t/i,this.camera.updateProjectionMatrix(),this.markDirty()}getCameraZoomRange(){if(!this.rootObject)return null;if(this.camera instanceof ds){let s=Math.max(this.initialZoom*.25,.05),a=Math.max(this.initialZoom*6,s*2),o=Number.isFinite(this.controls.minZoom)&&this.controls.minZoom>0?this.controls.minZoom:s,l=Number.isFinite(this.controls.maxZoom)&&this.controls.maxZoom>o?this.controls.maxZoom:a;return{mode:"zoom",current:Math.max(o,Math.min(this.camera.zoom,l)),min:o,max:l}}let e=this.camera.position.distanceTo(this.controls.target),t=Math.max(e*.08,1e-5),i=Number.isFinite(this.controls.minDistance)&&this.controls.minDistance>0?this.controls.minDistance:t,r=Number.isFinite(this.controls.maxDistance)&&this.controls.maxDistance>i?this.controls.maxDistance:Math.max(e*8,i*10);return{mode:"distance",current:Math.max(i,Math.min(e,r)),min:i,max:r}}notifyCameraZoomChanged(){if(this.cameraZoomObservers.size===0)return;let e=this.getCameraZoomState();for(let t of this.cameraZoomObservers)t(e)}computeOrthographicViewSpan(){var i;if(!this.rootObject)return 2;let e=(i=this.getRootPreviewBounds())!=null?i:$r(this.rootObject),t=Xi(e);return Math.max(Math.max(t.x,t.y,t.z,Number.EPSILON)*1.2,.001)}updateOrthographicFrustum(e){if(!(this.camera instanceof ds))return;let i=this.computeOrthographicViewSpan()/2,r=i*e;this.camera.left=-r,this.camera.right=r,this.camera.top=i,this.camera.bottom=-i}updateOrthographicFrustumForCamera(e,t){let r=this.computeOrthographicViewSpan()/2,s=r*t;e.left=-s,e.right=s,e.top=r,e.bottom=-r,e.updateProjectionMatrix()}switchCameraMode(e){if(this.cameraMode===e&&(e==="perspective"&&this.camera instanceof _r||e==="orthographic"&&this.camera instanceof ds))return;let t=this.renderer.domElement,i=Math.max(1,Math.round(t.clientWidth||t.width||1)),r=Math.max(1,Math.round(t.clientHeight||t.height||1)),s=i/r,a=this.camera,o=a.position.clone(),l=this.controls.target.clone(),c=a.zoom||1,f=a.near,d=a.far;if(this.scene.remove(a),e==="orthographic"){let u=new ds(-1,1,1,-1,f,d);u.position.copy(o),u.zoom=c,u.lookAt(l),this.updateOrthographicFrustumForCamera(u,s),this.camera=u}else{let u=new _r(this.initialFov,s,f,d);u.position.copy(o),u.zoom=c,u.lookAt(l),this.camera=u}this.scene.add(this.camera),this.controls.object=this.camera,this.controls.target.copy(l),this.controls.update(),this.cameraMode=e}applyCameraConfig(e){var i;let t=(i=e.mode)!=null?i:this.cameraMode;e.mode&&(this.initialCameraMode=e.mode),this.switchCameraMode(t),this.camera instanceof _r&&typeof e.fov=="number"&&Number.isFinite(e.fov)&&(this.camera.fov=e.fov,this.initialFov=e.fov),e.position&&(this.camera.position.set(...e.position),this.initialPosition.set(...e.position)),e.lookAt&&(this.controls.target.set(...e.lookAt),this.camera.lookAt(this.controls.target),this.initialTarget.set(...e.lookAt)),typeof e.near=="number"&&Number.isFinite(e.near)&&(this.camera.near=e.near),typeof e.far=="number"&&Number.isFinite(e.far)&&(this.camera.far=e.far),typeof e.zoom=="number"&&Number.isFinite(e.zoom)&&(this.camera.zoom=e.zoom,this.initialZoom=e.zoom),this.camera.updateProjectionMatrix(),this.controls.update(),this.markDirty(),this.notifyCameraZoomChanged()}applyLightConfig(e){for(let i of this.configLights)this.disposeConfiguredLight(i);this.configLights.length=0;let t=e.length>0;for(let i of this.defaultLights)i.visible=!t;for(let i of e){let r=this.createConfiguredLight(i);r&&(this.configLights.push(r),r.parent!==this.camera&&this.scene.add(r))}this.syncShadowFeatures(),this.updateShadowFraming(),this.markShadowDirty(),this.markDirty()}applySceneConfig(e){if(this.sceneConfig={...this.sceneConfig,...e},e.transparent!==void 0||e.background!==void 0)if(this.sceneConfig.transparent)this.scene.background=null,this.renderer.setClearColor(ax,0);else if(this.sceneConfig.background){let t=new ht(this.sceneConfig.background);this.scene.background=t,this.renderer.setClearColor(t,1)}else this.scene.background=ax,this.renderer.setClearColor(ax,1);typeof e.autoRotate=="boolean"&&(this.controls.autoRotate=e.autoRotate),typeof e.autoRotateSpeed=="number"&&(this.controls.autoRotateSpeed=e.autoRotateSpeed),typeof e.axis=="boolean"&&this.syncAxisHelper(e.axis),this.syncSceneHelpers(),this.syncShadowFeatures(),this.markDirty()}installDefaultLighting(){let e=new sm(16777215,.96);e.name="default-global-ambient";let t=new nm(16777215,7172736,.34);t.name="default-hemi",this.defaultLights.push(e,t);for(let i of this.defaultLights)this.scene.add(i)}installGlobalEnvironment(){this.disposeGlobalEnvironment();let e=new gm(this.renderer),t=new sA;this.environmentTarget=e.fromScene(t,.04),this.scene.environment=this.environmentTarget.texture,this.scene.environmentIntensity=.48,t.dispose(),e.dispose()}syncGlobalEnvironmentForQuality(){if(this.quality==="low"){this.cancelGlobalEnvironmentInstall(),this.disposeGlobalEnvironment(),this.markDirty();return}this.rootObject&&!this.environmentTarget&&this.scheduleGlobalEnvironmentInstall()}scheduleGlobalEnvironmentInstall(){this.quality==="low"||this.environmentTarget||this.environmentInstallHandle||(this.environmentInstallHandle=window.setTimeout(()=>{this.environmentInstallHandle=0,!(this.quality==="low"||this.contextLost||!this.rootObject)&&(this.installGlobalEnvironment(),this.markDirty())},Ece))}cancelGlobalEnvironmentInstall(){this.environmentInstallHandle&&(window.clearTimeout(this.environmentInstallHandle),this.environmentInstallHandle=0)}disposeGlobalEnvironment(){var e;this.cancelGlobalEnvironmentInstall(),this.scene.environment=null,(e=this.environmentTarget)==null||e.dispose(),this.environmentTarget=null}createConfiguredLight(e){var r,s,a,o,l,c,f;let t=e.color?new ht(e.color):new ht(16777215),i=(r=e.intensity)!=null?r:1;switch(e.type){case"ambient":return new sm(t,i);case"hemisphere":{let d=e.groundColor?new ht(e.groundColor):new ht(4473924);return new nm(t,d,i)}case"directional":{let d=new ll(t,i),u=(s=e.position)!=null?s:[-1,2,1],h=(a=e.target)!=null?a:[0,0,0];return d.position.set(...u),d.target.position.set(...h),this.scene.add(d.target),d.castShadow=!!e.castShadow,d}case"point":{let d=new vo(t,i),u=(o=e.position)!=null?o:[0,5,0];return d.position.set(...u),d.castShadow=!!e.castShadow,typeof e.decay=="number"&&(d.decay=e.decay),d}case"spot":{let d=new rc(t,i),u=(l=e.position)!=null?l:[0,5,0],h=(c=e.target)!=null?c:[0,0,0];return d.position.set(...u),d.target.position.set(...h),this.scene.add(d.target),d.angle=e.angle?e.angle*Math.PI/180:Math.PI/4,d.penumbra=(f=e.penumbra)!=null?f:.5,typeof e.decay=="number"&&(d.decay=e.decay),d.castShadow=!!e.castShadow,d}case"attachToCam":{let d=new vo(t,i);return this.camera.add(d),d}default:return null}}disposeConfiguredLight(e){(e instanceof ll||e instanceof rc)&&e.target.removeFromParent(),e.removeFromParent(),e.dispose()}prepareModelForQuality(e){let t=oU(this.renderer.capabilities.getMaxAnisotropy(),this.quality),i=new Set;for(let r of e)for(let s of Ws(r.material))i.has(s.uuid)||(i.add(s.uuid),this.prepareMaterialForQuality(s,t))}prepareMaterialForQuality(e,t){Rce(this.textureAudit,vA(e,t))}applyShadowQuality(){let e=this.shadowMapSize(),t=!1;for(let i of this.allLights())!qC(i)||!i.castShadow||(i.shadow.mapSize.set(e,e),i.shadow.bias=-12e-5,i.shadow.normalBias=.018,i.shadow.needsUpdate=!0,t=!0);t&&(this.syncShadowFeatures(),this.markShadowDirty(),this.markDirty())}updateShadowFraming(e=this.getRootPreviewBounds()){if(!this.rootObject||!e)return;let t=Er(e),i=Xi(e),r=Math.max(i.x,i.y,i.z,Number.EPSILON),s=Math.max(r*1.8,.001),a=new re(t.x,t.y,t.z),o=!1;for(let l of this.allLights())if(!(!qC(l)||!l.castShadow)){if(this.ensureMeshShadowFlags(),l.shadow.mapSize.set(this.shadowMapSize(),this.shadowMapSize()),l.shadow.bias=-12e-5,l.shadow.normalBias=.018,l instanceof ll){let c=l.position.clone().sub(l.target.position);if(c.lengthSq()<.001&&c.set(4,7,5),l.target.position.copy(a),l.target.parent||this.scene.add(l.target),l.position.copy(a).add(c.normalize().multiplyScalar(s*2.4)),l.shadow.camera instanceof ds){let f=l.shadow.camera;f.left=-s,f.right=s,f.top=s,f.bottom=-s,f.near=.1,f.far=s*5,f.updateProjectionMatrix()}}l.shadow.needsUpdate=!0,o=!0}o&&this.markShadowDirty()}shadowMapSize(){return this.quality==="low"?512:this.quality==="medium"?1024:2048}allLights(){return[...this.defaultLights,...this.configLights]}hasActiveShadowFeatures(){return!!this.sceneConfig.groundShadow||this.allLights().some(e=>qC(e)&&e.castShadow)}syncShadowFeatures(){let e=this.hasActiveShadowFeatures();if(this.renderer.shadowMap.enabled!==e&&(this.renderer.shadowMap.enabled=e),!e){this.frameBudgetShadowDeferred=!1,this.renderer.shadowMap.needsUpdate=!1;return}this.ensureMeshShadowFlags(),this.renderer.shadowMap.needsUpdate=!0}ensureMeshShadowFlags(){if(!(!this.rootObject||this.meshShadowFlagsPrepared)){for(let e of this.getRenderableObjects(this.rootObject))Sa(e)&&(e.castShadow=!0,e.receiveShadow=!0);this.meshShadowFlagsPrepared=!0}}syncSceneHelpers(){this.sceneConfig.groundShadow?this.createGroundShadow():this.removeGroundShadow(),this.sceneConfig.grid?this.createGrid():this.removeGrid(),typeof this.sceneConfig.axis=="boolean"&&this.syncAxisHelper(this.sceneConfig.axis)}syncAxisHelper(e){if(!this.axesHelper){this.axesHelper=new om(1.2);let t=this.axesHelper.material;t.depthTest=!1,t.depthWrite=!1,this.axesHelper.renderOrder=999,this.scene.add(this.axesHelper)}this.axesHelper.visible=e,this.axesHelper.position.copy(this.controls.target)}createGroundShadow(){var l;if(!this.rootObject||this.groundShadowMesh)return;this.ensureMeshShadowFlags();let e=(l=this.getRootPreviewBounds())!=null?l:$r(this.rootObject),t=Er(e),i=Xi(e),r=Math.max(i.x,i.z,Number.EPSILON),s=Math.max(r*3,.001),a=e.min.y-Math.max(s*.002,1e-5),o=new ui(new iu(s,s),new c_({color:0,opacity:sce,transparent:!0}));o.name="ai3d-ground-shadow",o.rotation.x=-Math.PI/2,o.position.set(t.x,a,t.z),o.receiveShadow=!0,o.renderOrder=-1,this.scene.add(o),this.groundShadowMesh=o}removeGroundShadow(){if(this.groundShadowMesh){this.groundShadowMesh.removeFromParent(),this.groundShadowMesh.geometry.dispose();for(let e of Ws(this.groundShadowMesh.material))e.dispose();this.groundShadowMesh=null}}createGrid(){var o;if(!this.rootObject||this.gridHelper)return;let e=(o=this.getRootPreviewBounds())!=null?o:$r(this.rootObject),t=Er(e),i=Xi(e),r=Math.max(i.x,i.z,Number.EPSILON),s=Math.max(r*2,.001),a=new __(s,20,7305093,3423046);a.name="ai3d-grid",a.position.set(t.x,e.min.y-Math.max(s*.003,1e-5),t.z);for(let l of Ws(a.material))l.transparent=!0,l.opacity=.42;this.scene.add(a),this.gridHelper=a}removeGrid(){if(this.gridHelper){this.gridHelper.removeFromParent(),this.gridHelper.geometry.dispose();for(let e of Ws(this.gridHelper.material))e.dispose();this.gridHelper=null}}dispatchPick(e){var c,f,d;if(!this.rootObject||(c=this.disassembly)!=null&&c.isEnabled())return;let t=this.renderer.domElement.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.getRenderableObjects(this.rootObject),!1)[0],r=Ff(i==null?void 0:i.object)?i.object:null,s=this.getRenderableMeshes(this.rootObject),a=this.getChildRenderableMeshMap(this.rootObject),o=r?QA(this.rootObject,r,s,a):null,l={mesh:o,pickedPoint:(d=(f=i==null?void 0:i.point)==null?void 0:f.clone())!=null?d:null,screenX:e.clientX,screenY:e.clientY,modifiers:{altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey}};if(this._lastPickResult=l,this.measurementActive&&(i!=null&&i.point)){if(e.altKey){this.setMeasurementSnapKind("free"),this.addMeasurementPoint(i.point.clone());return}if(!this.measurementTargetObject){o&&this.setMeasurementTargetObject(o);return}this.addMeasurementPoint(this.resolveMeasurementPickPoint(i.point.clone(),!1));return}this.focusSelectionEnabled&&o?(this.clearSelectionHighlight(),this.focusedObject!==o&&this.setFocusedObject(o)):this.focusSelectionEnabled?this.clearSelectionHighlight():this.updateSelectionHighlight(o),this._onPickCallbacks.forEach(u=>u(l))}clearLoadedModel(e="model-switch"){var t,i;if(this.cancelGlobalEnvironmentInstall(),(t=this.disassembly)==null||t.dispose(),this.disassembly=null,this.disassemblySetup=!1,this.explodeStateActive=!1,this.meshShadowFlagsPrepared=!1,this.invalidateMeshCache(),this.markDirty(),this.clearFocusedMesh(),this.clearSelectionHighlight(),this.disposeMeasurementOverlays(!0),this.resetMeasurementCalibrationState(),this.wireframeEnabled=!1,this.wireframeOriginalMaterials.clear(),this.stlMaterial=null,this.notifyCameraZoomChanged(),(i=this.bboxHelper)==null||i.removeFromParent(),this.bboxHelper=null,this.bboxEnabled=!1,this.removeGroundShadow(),this.removeGrid(),this.mixer=null,this.animationPlaying=!1,!this.rootObject){this.lastDisposalAudit={reason:e,meshCount:0,geometryCount:0,materialCount:0,textureCount:0,objectCount:0,timestamp:performance.now()};return}this.scene.remove(this.rootObject),this.lastDisposalAudit=this.disposeObjectGraph(this.rootObject,e),this.rootObject=null,this.invalidateMeshCache(),this.markShadowDirty()}disposeObjectGraph(e,t){var c;let i=new Set,r=new Set,s=new Set,a=0,o=0,l=f=>{Sa(f)&&a++;let d=f.geometry;d&&!i.has(d.uuid)&&(d.dispose(),i.add(d.uuid));for(let u of Ws(f.material))this.disposeMaterialWithTextures(u,r,s)};if(this.cachedRenderables&&this.cachedRenderableRoot===e){o=(c=this.cachedRenderableObjectCount)!=null?c:this.cachedRenderables.length;for(let f of this.cachedRenderables)l(f)}else e.traverse(f=>{o++,Ff(f)&&l(f)});return{reason:t,meshCount:a,geometryCount:i.size,materialCount:r.size,textureCount:s.size,objectCount:o,timestamp:performance.now()}}disposeMaterialWithTextures(e,t,i){if(t.has(e.uuid))return;let r=e;for(let s of Object.values(r))if(s instanceof Pr&&!i.has(s.uuid))s.dispose(),i.add(s.uuid);else if(Array.isArray(s))for(let a of s)a instanceof Pr&&!i.has(a.uuid)&&(a.dispose(),i.add(a.uuid));e.dispose(),t.add(e.uuid)}fitCameraToObject(e,t){var l;let i=(l=t!=null?t:this.getRootPreviewBounds(e))!=null?l:$r(e),r=RU(i);this.initialTarget.set(r.target.x,r.target.y,r.target.z),this.initialPosition.set(r.position.x,r.position.y,r.position.z),this.initialFov=45;let s=Xi(i),a=Math.max(s.x,s.y,s.z,Number.EPSILON),o=this.initialPosition.distanceTo(this.initialTarget);this.controls.minDistance=Math.max(r.near*4,a*.02,1e-5),this.controls.maxDistance=Math.max(o*8,this.controls.minDistance*10),this.controls.minZoom=.25,this.controls.maxZoom=8,this.raycaster.params.Points={threshold:Math.max(a*.01,1e-5)},this.raycaster.params.Line={threshold:Math.max(a*.002,1e-5)},this.occlusionRaycaster.params.Points={threshold:Math.max(a*.006,1e-5)},this.occlusionRaycaster.params.Line={threshold:Math.max(a*.001,1e-5)},this.resetView(),this.axesHelper&&(this.axesHelper.position.copy(this.controls.target),this.axesHelper.scale.setScalar(Math.max(a*.25,5e-4))),this.camera.near=r.near,this.camera.far=r.far,this.camera.updateProjectionMatrix(),this.markDirty(),this.notifyCameraZoomChanged()}getAnnotationCameraStateKey(){return OA([{value:this.camera.position.x,digits:3},{value:this.camera.position.y,digits:3},{value:this.camera.position.z,digits:3},{value:this.controls.target.x,digits:2},{value:this.controls.target.y,digits:2},{value:this.controls.target.z,digits:2},{value:this.camera instanceof _r?this.camera.fov:this.camera.zoom,digits:this.camera instanceof _r?2:3}])}projectAnnotationWorldPoint(e,t){let i=this.renderer.domElement;return!i.isConnected||i.clientWidth===0||i.clientHeight===0?!1:(this.scene.updateMatrixWorld(),this.camera.updateMatrixWorld(),this.annotationProjection.set(e.x,e.y,e.z).project(this.camera),PU(this.annotationProjection,i,t))}isAnnotationWorldPointOccluded(e){if(!this.rootObject)return!1;let t=Of(ei(this.camera.position),e);if(!t)return!1;this.rootObject.updateWorldMatrix(!0,!0),this.annotationDirection.set(t.direction.x,t.direction.y,t.direction.z),this.occlusionRaycaster.set(this.camera.position,this.annotationDirection),this.occlusionRaycaster.far=t.distance;let i=this.occlusionRaycaster.intersectObjects(this.getRenderableObjects(this.rootObject),!1)[0];return!!i&&Lf(i.distance,t.distance,t.epsilon)}getRenderableMeshes(e){if(this.cachedMeshes&&this.cachedMeshRoot===e)return this.cachedMeshes;let t=[];return e.traverse(i=>{Sa(i)&&i.geometry&&t.push(i)}),this.cachedMeshes=t,this.cachedMeshRoot=e,t}getRenderableObjects(e){if(this.cachedRenderables&&this.cachedRenderableRoot===e)return this.cachedRenderables;let t=[],i=0;return e.traverse(r=>{i++,Ff(r)&&r.geometry&&t.push(r)}),this.cachedRenderables=t,this.cachedRenderableRoot=e,this.cachedRenderableObjectCount=i,t}getChildRenderableMeshMap(e){return this.cachedChildMeshMap&&this.cachedChildMeshMapRoot===e?this.cachedChildMeshMap:(this.cachedChildMeshMap=wm(e,this.getRenderableMeshes(e)),this.cachedChildMeshMapRoot=e,this.cachedChildMeshMap)}getRenderableBoundsMap(e){return this.cachedRenderableBoundsMap&&this.cachedRenderableBoundsMapRoot===e?this.cachedRenderableBoundsMap:(this.cachedRenderableBoundsMap=kU(this.getRenderableObjects(e)),this.cachedRenderableBoundsMapRoot=e,this.cachedRenderableBoundsMap)}getGeometryQualityStats(){var e;return this.rootObject?(this.cachedGeometryQualityStats||(this.cachedGeometryQualityStats=KU(this.rootObject,this.getRenderableObjects(this.rootObject),(e=this.getRootPreviewBounds())!=null?e:void 0,this.getRenderableBoundsMap(this.rootObject))),this.cachedGeometryQualityStats):{meshCount:0,pointCloudCount:0,smallPartCount:0,smallestPartSpan:null,modelSpan:null}}invalidateMeshCache(){this.cachedMeshes=null,this.cachedMeshRoot=null,this.cachedRenderables=null,this.cachedRenderableRoot=null,this.cachedRenderableObjectCount=null,this.cachedChildMeshMap=null,this.cachedChildMeshMapRoot=null,this.cachedRenderableBoundsMap=null,this.cachedRenderableBoundsMapRoot=null,this.invalidateRootBoundsCache()}invalidateRootBoundsCache(){this.cachedRootPreviewBounds=null,this.cachedRootPreviewBoundsObject=null,this.cachedRenderableBoundsMap=null,this.cachedRenderableBoundsMapRoot=null,this.cachedGeometryQualityStats=null}getRootPreviewBounds(e=this.rootObject){return e?this.cachedRootPreviewBounds&&this.cachedRootPreviewBoundsObject===e?this.cachedRootPreviewBounds:(this.cachedRootPreviewBounds=$r(e),this.cachedRootPreviewBoundsObject=e,this.cachedRootPreviewBounds):null}ensureBoundingBoxHelper(){var e;this.rootObject&&((e=this.bboxHelper)==null||e.removeFromParent(),this.bboxHelper=new cl(this.rootObject,16436245),this.scene.add(this.bboxHelper))}updateSelectionHighlight(e){var t;if(!this.rootObject||!e){this.clearSelectionHighlight();return}this.highlightedObject===e&&this.selectionHelper||((t=this.selectionHelper)==null||t.removeFromParent(),this.selectionHelper=new cl(e,4890367),this.scene.add(this.selectionHelper),this.highlightedObject=e,this.markDirty())}setFocusedObject(e){var r,s;if(!this.rootObject||!e){this.clearFocusedMesh();return}if(this.focusedObject===e)return;let t=this.getRenderableMeshes(this.rootObject),i=Sa(e)?[e]:(r=this.getChildRenderableMeshMap(this.rootObject).get(e))!=null?r:[];if(i.length===0&&!Ff(e)){this.clearFocusedMesh();return}this.originalMaterials.size===0?this.applyInitialFocusMaterials(t,i):this.applyFocusSelectionDelta(i),(s=this.focusHelper)==null||s.removeFromParent(),this.focusHelper=new cl(e,3065087),this.scene.add(this.focusHelper),this.focusedObject=e,this.focusedSelectedMeshes.clear();for(let a of i)this.focusedSelectedMeshes.set(a.id,a);this.markDirty()}clearFocusedMesh(){var e;this.restoreFocusedMaterials(),this.disposeFocusDimMaterials(),this.originalMaterials.clear(),this.focusedSelectedMeshes.clear(),(e=this.focusHelper)==null||e.removeFromParent(),this.focusHelper=null,this.focusedObject=null,this.markDirty()}restoreFocusedMaterials(){if(this.rootObject)for(let e of this.getRenderableMeshes(this.rootObject)){let t=this.originalMaterials.get(e.id);t&&(e.material=t)}}applyInitialFocusMaterials(e,t){let i=new Set(t.map(r=>r.id));for(let r of e)this.originalMaterials.set(r.id,r.material),!i.has(r.id)&&(r.material=this.focusDimMaterialCache.get(r.material))}applyFocusSelectionDelta(e){var i,r;let t=new Set(e.map(s=>s.id));for(let[s,a]of this.focusedSelectedMeshes){if(t.has(s))continue;let o=(i=this.originalMaterials.get(s))!=null?i:a.material;this.originalMaterials.has(s)||this.originalMaterials.set(s,o),a.material=this.focusDimMaterialCache.get(o)}for(let s of e){let a=(r=this.originalMaterials.get(s.id))!=null?r:s.material;this.originalMaterials.has(s.id)||this.originalMaterials.set(s.id,a),s.material=a}}disposeFocusDimMaterials(){this.focusDimMaterialCache.clear()}clearSelectionHighlight(){var e;(e=this.selectionHelper)==null||e.removeFromParent(),this.selectionHelper=null,this.highlightedObject=null,this.markDirty()}setMeasurementTargetObject(e,t=!0){this.clearMeasurementTargetHelper(!1);let i=e&&this.isObjectInLoadedRoot(e)?e:null;this.measurementTargetObject=i,this.setMeasurementSnapKind(null,!1),i&&(this.measurementTargetHelper=new cl(i,6333946),this.scene.add(this.measurementTargetHelper)),this.markDirty(),t&&this.notifyMeasurementsChanged()}clearMeasurementTargetHelper(e=!0){var t;(t=this.measurementTargetHelper)==null||t.removeFromParent(),this.measurementTargetHelper=null,e&&this.markDirty()}updateMeasurementTargetHelper(){!this.measurementTargetHelper||!this.measurementTargetObject||this.measurementTargetHelper.update()}setMeasurementSnapKind(e,t=!0){this.measurementSnapKind!==e&&(this.measurementSnapKind=e,t&&this.notifyMeasurementsChanged())}getCurrentMeasurementTargetObject(){var t,i;if(!this.rootObject)return null;let e=(i=(t=this.focusedObject)!=null?t:this.highlightedObject)!=null?i:QC(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;return!e||!this.isObjectInLoadedRoot(e)?null:e}isObjectInLoadedRoot(e){if(!this.rootObject)return!1;let t=e;for(;t;){if(t===this.rootObject)return!0;t=t.parent}return!1}getMeasurementTargetName(){let e=this.measurementTargetObject;return!e||!this.isObjectInLoadedRoot(e)?null:Ea(e,e.type||`object-${e.id}`)}getMeasurementTargetBounds(){let e=this.measurementTargetObject;return!e||!this.isObjectInLoadedRoot(e)?null:(e.updateWorldMatrix(!0,!0),$r(e))}resolveMeasurementPickPoint(e,t){if(t)return this.setMeasurementSnapKind("free"),e;let i=this.createMeasurementGeometrySnapInput();if(!i)return this.setMeasurementSnapKind("free"),e;let r=VA(this.toMeasurementPoint(e),i);return r?(this.setMeasurementSnapKind(r.kind),new re(r.point.x,r.point.y,r.point.z)):(this.setMeasurementSnapKind("free"),e)}createMeasurementGeometrySnapInput(){var l,c;let e=this.measurementTargetObject;if(!e||!this.isObjectInLoadedRoot(e))return null;let t=this.getMeasurementTargetRenderables();if(t.length===0)return null;let i=[],r=[],s=`three:${e.id}`;for(let f of t){let d=f.geometry.getAttribute("position");if(!d||d.count<=0)continue;f.updateWorldMatrix(!0,!1);let u=[];for(let h=0;h{Ff(r)&&r.geometry&&t.has(r)&&i.push(r)}),i}createThreeMeasurementDraftingLayout(e,t){let i=this.toMeasurementDisplayPoint(e),r=this.toMeasurementDisplayPoint(t),s=this.getMeasurementMarkerSize(),a=this.camera.getWorldPosition(new re),o=new re(0,1,0).applyQuaternion(this.camera.quaternion).normalize(),l=WA(this.toMeasurementPoint(i),this.toMeasurementPoint(r),{viewPosition:this.toMeasurementPoint(a),viewUp:this.toMeasurementPoint(o),offset:s*4.2,extensionGap:s*.55,extensionOvershoot:s*.8,arrowLength:s*2.35,arrowWidth:s*.78,labelGap:s*1.05});return l?{linePoints:l.lineSegments.flatMap(([f,d])=>[new re(f.x,f.y,f.z),new re(d.x,d.y,d.z)]),labelPosition:new re(l.labelPoint.x,l.labelPoint.y,l.labelPoint.z)}:null}getMeasurementMarkerSize(){var r;if(!this.rootObject)return .02;let e=(r=this.getRootPreviewBounds())!=null?r:$r(this.rootObject),t=Xi(e);return Math.max(t.x,t.y,t.z,.001)*.018}cancelPendingMeasurement(e=!0){var r,s;let t=this.pendingMarker,i=(s=(r=this.pendingPoint)==null?void 0:r.clone())!=null?s:null;if(this.pendingPoint=null,this.pendingMarker=null,this.hoveredMarkerIndex=-1,this.removePreviewLine(),t&&i&&!this.isMeasurementPointUsed(i)){let a=this.measurementMarkers.indexOf(t);a>=0&&(this.measurementMarkers.splice(a,1),this.measurementMarkerPoints.splice(a,1)),this.disposeMeasurementMarker(t)}else t&&(t.scale.setScalar(1),t.material.color.setHex(Y_));e&&this.markDirty()}isMeasurementPointUsed(e){return this.measurementSegments.some(t=>t.start.distanceTo(e)<1e-4||t.end.distanceTo(e)<1e-4)}disposeMeasurementMarker(e){e.removeFromParent(),e.geometry.dispose();let t=e.material;if(Array.isArray(t))for(let i of t)i.dispose();else t.dispose()}findNearestMarkerIndex(e){let t=this.getMeasurementMarkerSize()*2.5,i=this.toMeasurementDisplayPoint(e);for(let r=0;r=0?this.measurementMarkerPoints[i].clone():t;if(this.pendingPoint){if(r.distanceTo(this.pendingPoint)<1e-4)return;if(i<0){let s=this.getMeasurementMarkerSize(),a=new im(s*.38,12,12),o=new fs({color:Y_,depthTest:!1,transparent:!0,opacity:.48}),l=new ui(a,o);l.position.copy(this.toMeasurementDisplayPoint(r)),l.renderOrder=999,this.scene.add(l),this.measurementMarkers.push(l),this.measurementMarkerPoints.push(r.clone())}this.createMeasurementSegment(this.pendingPoint,r),this.pendingMarker&&(this.pendingMarker.scale.setScalar(1),this.pendingMarker.material.color.setHex(Y_)),this.pendingPoint=null,this.pendingMarker=null,this.removePreviewLine()}else{if(i<0){let s=this.getMeasurementMarkerSize(),a=new im(s*.38,12,12),o=new fs({color:Y_,depthTest:!1,transparent:!0,opacity:.48}),l=new ui(a,o);l.position.copy(this.toMeasurementDisplayPoint(r)),l.renderOrder=999,this.scene.add(l),this.measurementMarkers.push(l),this.measurementMarkerPoints.push(r.clone()),this.pendingMarker=l}else this.pendingMarker=this.measurementMarkers[i];this.pendingMarker.scale.setScalar(1.6),this.pendingMarker.material.color.setHex(Tce),this.pendingPoint=r,this.ensurePreviewLine()}this.markDirty(),this.notifyMeasurementsChanged()}createMeasurementSegment(e,t){var u,h;let i=this.createThreeMeasurementDraftingLayout(e,t),r=this.toMeasurementDisplayPoint(e),s=this.toMeasurementDisplayPoint(t),a=(u=i==null?void 0:i.linePoints)!=null?u:[r,s],o=new Hi().setFromPoints(a),l=new Cs(o,new Gn({color:Sce,transparent:!0,opacity:1,depthTest:!1,depthWrite:!1}));l.renderOrder=998,this.scene.add(l);let c=Dm(this.createMeasurementReading(e,t)),f=(h=i==null?void 0:i.labelPosition)!=null?h:new re().addVectors(r,s).multiplyScalar(.5),d=this.createMeasurementLabelSprite(c,f,this.getMeasurementMarkerSize()*3.2);this.scene.add(d),this.measurementSegments.push({start:e.clone(),end:t.clone(),line:l,label:d})}createMeasurementLabelSprite(e,t,i){let r=gu("canvas"),s=r.getContext("2d");r.width=oc.width,r.height=oc.height,YA(s,e,r.width,r.height);let a=new o_(r),o=new $h({map:a,depthTest:!1,depthWrite:!1,transparent:!0}),l=new i_(o);return l.position.copy(t),l.scale.set(i*3.7,i*1.08,1),l.renderOrder=1e3,l}ensurePreviewLine(){if(this.previewLine)return;let e=new Hi().setFromPoints(Array.from({length:14},()=>new re));this.previewLine=new Cs(e,new Gn({color:xce,transparent:!0,opacity:.82,depthTest:!1,depthWrite:!1})),this.previewLine.renderOrder=997,this.scene.add(this.previewLine)}updatePreviewLine(){var l;if(this.previewLineUpdateHandle=0,!this.pendingPoint||!this.previewLine||!this.rootObject)return;let e=this.toMeasurementDisplayPoint(this.pendingPoint),t=this.renderer.domElement.getBoundingClientRect();this.pointer.x=(this.lastPointerClient.x-t.left)/t.width*2-1,this.pointer.y=-((this.lastPointerClient.y-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.getRenderableObjects(this.rootObject),!1)[0],r;i!=null&&i.point?r=this.resolveMeasurementPickPoint(i.point.clone(),this.lastPointerClient.altKey):r=e.clone().add(this.raycaster.ray.direction.clone().multiplyScalar(5));let s=this.createThreeMeasurementDraftingLayout(this.pendingPoint,this.toMeasurementBasePoint(r)),a=(l=s==null?void 0:s.linePoints)!=null?l:[e,r],o=this.previewLine.geometry.getAttribute("position");if(o.count!==a.length)this.previewLine.geometry.dispose(),this.previewLine.geometry=new Hi().setFromPoints(a);else{for(let c=0;cthis.updatePreviewLine()))}cancelPreviewLineUpdate(){this.previewLineUpdateHandle&&(window.cancelAnimationFrame(this.previewLineUpdateHandle),this.previewLineUpdateHandle=0)}removePreviewLine(){this.cancelPreviewLineUpdate(),this.previewLine&&(this.previewLine.removeFromParent(),this.previewLine.geometry.dispose(),this.previewLine.material.dispose(),this.previewLine=null)}createMeasurementReading(e,t){return XA(this.toMeasurementPoint(e),this.toMeasurementPoint(t),this.measurementScale,this.measurementUnit)}createMeasurementRecords(){return this.measurementSegments.map((e,t)=>({index:t+1,start:this.toMeasurementPoint(e.start),end:this.toMeasurementPoint(e.end),reading:this.createMeasurementReading(e.start,e.end)}))}toMeasurementPoint(e){return{x:e.x,y:e.y,z:e.z}}notifyMeasurementsChanged(){for(let e of Array.from(this.measurementObservers))e()}}});var Mce,$C,JC,ie,vi=y(()=>{Mce=typeof WeakRef!="undefined",$C=class{constructor(e,t=!1,i,r){this.initialize(e,t,i,r)}initialize(e,t=!1,i,r){return this.mask=e,this.skipNextObservers=t,this.target=i,this.currentTarget=r,this}},JC=class{constructor(e,t,i=null){this.callback=e,this.mask=t,this.scope=i,this._willBeUnregistered=!1,this.unregisterOnNextCall=!1,this._remove=null}remove(e=!1){this._remove&&this._remove(e)}},ie=class n{static FromPromise(e,t){let i=new n;return e.then(r=>{i.notifyObservers(r)}).catch(r=>{if(t)t.notifyObservers(r);else throw r}),i}get observers(){return this._observers}constructor(e,t=!1){this.notifyIfTriggered=t,this._observers=new Array,this._numObserversMarkedAsDeleted=0,this._hasNotified=!1,this._eventState=new $C(0),e&&(this._onObserverAdded=e)}add(e,t=-1,i=!1,r=null,s=!1){if(!e)return null;let a=new JC(e,t,r);a.unregisterOnNextCall=s,i?this._observers.unshift(a):this._observers.push(a),this._onObserverAdded&&this._onObserverAdded(a),this._hasNotified&&this.notifyIfTriggered&&this._lastNotifiedValue!==void 0&&this.notifyObserver(a,this._lastNotifiedValue);let o=Mce?new WeakRef(this):{deref:()=>this};return a._remove=(l=!1)=>{let c=o.deref();c&&(l?c.remove(a):c._remove(a))},a}addOnce(e){return this.add(e,void 0,void 0,void 0,!0)}remove(e){return e?(e._remove=null,this._observers.indexOf(e)!==-1?(this._deferUnregister(e),!0):!1):!1}removeCallback(e,t){for(let i=0;i{this._remove(e)},0))}_remove(e,t=!0){if(!e)return!1;let i=this._observers.indexOf(e);return i!==-1?(t&&this._numObserversMarkedAsDeleted--,this._observers.splice(i,1),!0):!1}makeObserverTopPriority(e){this._remove(e,!1),this._observers.unshift(e)}makeObserverBottomPriority(e){this._remove(e,!1),this._observers.push(e)}notifyObservers(e,t=-1,i,r,s){if(this.notifyIfTriggered&&(this._hasNotified=!0,this._lastNotifiedValue=e),!this._observers.length)return!0;let a=this._eventState;a.mask=t,a.target=i,a.currentTarget=r,a.skipNextObservers=!1,a.lastReturnValue=e,a.userInfo=s;for(let o of this._observers)if(!o._willBeUnregistered&&(o.mask&t&&(o.unregisterOnNextCall&&this._deferUnregister(o),o.scope?a.lastReturnValue=o.callback.apply(o.scope,[e,a]):a.lastReturnValue=o.callback(e,a)),a.skipNextObservers))return!1;return!0}notifyObserver(e,t,i=-1){if(this.notifyIfTriggered&&(this._hasNotified=!0,this._lastNotifiedValue=t),e._willBeUnregistered)return;let r=this._eventState;r.mask=i,r.skipNextObservers=!1,e.unregisterOnNextCall&&this._deferUnregister(e),e.callback(t,r)}hasObservers(){return this._observers.length-this._numObserversMarkedAsDeleted>0}clear(){for(;this._observers.length;){let e=this._observers.pop();e&&(e._remove=null)}this._onObserverAdded=null,this._numObserversMarkedAsDeleted=0,this.cleanLastNotifiedState()}cleanLastNotifiedState(){this._hasNotified=!1,this._lastNotifiedValue=void 0}clone(){let e=new n;return e._observers=this._observers.slice(0),e}hasSpecificMask(e=-1){for(let t of this._observers)if(t.mask&e||t.mask===e)return!0;return!1}}});var lx,fV=y(()=>{lx=class{get wrapU(){return this._cachedWrapU}set wrapU(e){this._cachedWrapU=e}get wrapV(){return this._cachedWrapV}set wrapV(e){this._cachedWrapV=e}get wrapR(){return this._cachedWrapR}set wrapR(e){this._cachedWrapR=e}get anisotropicFilteringLevel(){return this._cachedAnisotropicFilteringLevel}set anisotropicFilteringLevel(e){this._cachedAnisotropicFilteringLevel=e}get comparisonFunction(){return this._comparisonFunction}set comparisonFunction(e){this._comparisonFunction=e}get useMipMaps(){return this._useMipMaps}set useMipMaps(e){this._useMipMaps=e}constructor(){this.samplingMode=-1,this._useMipMaps=!0,this._cachedWrapU=null,this._cachedWrapV=null,this._cachedWrapR=null,this._cachedAnisotropicFilteringLevel=null,this._comparisonFunction=0}setParameters(e=1,t=1,i=1,r=1,s=2,a=0){return this._cachedWrapU=e,this._cachedWrapV=t,this._cachedWrapR=i,this._cachedAnisotropicFilteringLevel=r,this.samplingMode=s,this._comparisonFunction=a,this}compareSampler(e){return this._cachedWrapU===e._cachedWrapU&&this._cachedWrapV===e._cachedWrapV&&this._cachedWrapR===e._cachedWrapR&&this._cachedAnisotropicFilteringLevel===e._cachedAnisotropicFilteringLevel&&this.samplingMode===e.samplingMode&&this._comparisonFunction===e._comparisonFunction&&this._useMipMaps===e._useMipMaps}}});var dV,Vi,zs=y(()=>{vi();fV();(function(n){n[n.Unknown=0]="Unknown",n[n.Url=1]="Url",n[n.Temp=2]="Temp",n[n.Raw=3]="Raw",n[n.Dynamic=4]="Dynamic",n[n.RenderTarget=5]="RenderTarget",n[n.MultiRenderTarget=6]="MultiRenderTarget",n[n.Cube=7]="Cube",n[n.CubeRaw=8]="CubeRaw",n[n.CubePrefiltered=9]="CubePrefiltered",n[n.Raw3D=10]="Raw3D",n[n.Raw2DArray=11]="Raw2DArray",n[n.DepthStencil=12]="DepthStencil",n[n.CubeRawRGBD=13]="CubeRawRGBD",n[n.Depth=14]="Depth"})(dV||(dV={}));Vi=class n extends lx{get useMipMaps(){return this._useMipMaps===null?this.generateMipMaps:this._useMipMaps}set useMipMaps(e){this._useMipMaps=e}get uniqueId(){return this._uniqueId}_setUniqueId(e){this._uniqueId=e}getEngine(){return this._engine}get source(){return this._source}constructor(e,t,i=!1){super(),this.isReady=!1,this.isCube=!1,this.is3D=!1,this.is2DArray=!1,this.isMultiview=!1,this.url="",this.generateMipMaps=!1,this._useMipMaps=null,this.mipLevelCount=1,this.samples=0,this.type=-1,this.format=-1,this.onLoadedObservable=new ie,this.onErrorObservable=new ie,this.onRebuildCallback=null,this.width=0,this.height=0,this.depth=0,this.baseWidth=0,this.baseHeight=0,this.baseDepth=0,this.invertY=!1,this._invertVScale=!1,this._associatedChannel=-1,this._source=0,this._buffer=null,this._bufferView=null,this._bufferViewArray=null,this._bufferViewArrayArray=null,this._size=0,this._extension="",this._files=null,this._workingCanvas=null,this._workingContext=null,this._cachedCoordinatesMode=null,this._isDisabled=!1,this._compression=null,this._sphericalPolynomial=null,this._sphericalPolynomialPromise=null,this._sphericalPolynomialComputed=!1,this._lodGenerationScale=0,this._lodGenerationOffset=0,this._useSRGBBuffer=!1,this._creationFlags=0,this._lodTextureHigh=null,this._lodTextureMid=null,this._lodTextureLow=null,this._isRGBD=!1,this._linearSpecularLOD=!1,this._irradianceTexture=null,this._hardwareTexture=null,this._maxLodLevel=null,this._references=1,this._gammaSpace=null,this._premulAlpha=!1,this._dynamicTextureSource=null,this._autoMSAAManagement=!1,this._engine=e,this._source=t,this._uniqueId=n._Counter++,i||(this._hardwareTexture=e._createHardwareTexture())}incrementReferences(){this._references++}updateSize(e,t,i=1){this._engine.updateTextureDimensions(this,e,t,i),this.width=e,this.height=t,this.depth=i,this.baseWidth=e,this.baseHeight=t,this.baseDepth=i,this._size=e*t*i}_rebuild(){var t,i;if(this.isReady=!1,this._cachedCoordinatesMode=null,this._cachedWrapU=null,this._cachedWrapV=null,this._cachedWrapR=null,this._cachedAnisotropicFilteringLevel=null,this.onRebuildCallback){let r=this.onRebuildCallback(this),s=a=>{a._swapAndDie(this,!1),this.isReady=r.isReady};r.isAsync?r.proxy.then(s):s(r.proxy);return}let e;switch(this.source){case 2:break;case 1:e=this._engine.createTexture((t=this._originalUrl)!=null?t:this.url,!this.generateMipMaps,this.invertY,null,this.samplingMode,r=>{r._swapAndDie(this,!1),this.isReady=!0},null,this._buffer,void 0,this.format,this._extension,void 0,void 0,void 0,this._useSRGBBuffer);return;case 3:if(e=this._engine.createRawTexture(this._bufferView,this.baseWidth,this.baseHeight,this.format,this.generateMipMaps,this.invertY,this.samplingMode,this._compression,this.type,this._creationFlags,this._useSRGBBuffer,this.mipLevelCount),e._swapAndDie(this,!1),this._bufferViewArray)for(let r=0;r{e._swapAndDie(this,!1),this.isReady=!0},null,this.format,this._extension,!1,0,0,null,void 0,this._useSRGBBuffer,ArrayBuffer.isView(this._buffer)?this._buffer:null);return;case 8:e=this._engine.createRawCubeTexture(this._bufferViewArray,this.width,(i=this._originalFormat)!=null?i:this.format,this.type,this.generateMipMaps,this.invertY,this.samplingMode,this._compression),e._swapAndDie(this,!1),this.isReady=!0;break;case 13:return;case 9:e=this._engine.createPrefilteredCubeTexture(this.url,null,this._lodGenerationScale,this._lodGenerationOffset,r=>{r&&r._swapAndDie(this,!1),this.isReady=!0},null,this.format,this._extension),e._sphericalPolynomial=this._sphericalPolynomial;return;case 12:case 14:break}}_swapAndDie(e,t=!0){var s;(s=this._hardwareTexture)==null||s.setUsage(e._source,this.generateMipMaps,this.is2DArray,this.isCube,this.is3D,this.width,this.height,this.depth),e._hardwareTexture=this._hardwareTexture,t&&(e._isRGBD=this._isRGBD),this._lodTextureHigh&&(e._lodTextureHigh&&e._lodTextureHigh.dispose(),e._lodTextureHigh=this._lodTextureHigh),this._lodTextureMid&&(e._lodTextureMid&&e._lodTextureMid.dispose(),e._lodTextureMid=this._lodTextureMid),this._lodTextureLow&&(e._lodTextureLow&&e._lodTextureLow.dispose(),e._lodTextureLow=this._lodTextureLow),this._irradianceTexture&&(e._irradianceTexture&&e._irradianceTexture.dispose(),e._irradianceTexture=this._irradianceTexture);let i=this._engine.getLoadedTexturesCache(),r=i.indexOf(this);r!==-1&&i.splice(r,1),r=i.indexOf(e),r===-1&&i.push(e)}dispose(){this._references--,this._references===0&&(this.onLoadedObservable.clear(),this.onErrorObservable.clear(),this._engine._releaseTexture(this),this._hardwareTexture=null,this._dynamicTextureSource=null)}};Vi._Counter=0});var Oe,Gi=y(()=>{vi();Oe=class{static get LastCreatedEngine(){return this.Instances.length===0?null:this.Instances[this.Instances.length-1]}static get LastCreatedScene(){return this._LastCreatedScene}};Oe.Instances=[];Oe.OnEnginesDisposedObservable=new ie;Oe._LastCreatedScene=null;Oe.UseFallbackTexture=!0;Oe.FallbackTexture=""});var ee,Lt=y(()=>{ee=class n{static _CheckLimit(e,t){let i=n._LogLimitOutputs[e];return i?i.current++:(i={limit:t,current:1},n._LogLimitOutputs[e]=i),i.current<=i.limit}static _GenerateLimitMessage(e,t=1){var s;let i=n._LogLimitOutputs[e];if(!i||!n.MessageLimitReached)return;let r=this._Levels[t];i.current===i.limit&&n[r.name](n.MessageLimitReached.replace(/%LIMIT%/g,""+i.limit).replace(/%TYPE%/g,(s=r.name)!=null?s:""))}static _AddLogEntry(e){n._LogCache=e+n._LogCache,n.OnNewCacheEntry&&n.OnNewCacheEntry(e)}static _FormatMessage(e){let t=r=>r<10?"0"+r:""+r,i=new Date;return"["+t(i.getHours())+":"+t(i.getMinutes())+":"+t(i.getSeconds())+"]: "+e}static _LogDisabled(e,t){}static _LogEnabled(e=1,t,i){let r=Array.isArray(t)?t[0]:t;if(i!==void 0&&!n._CheckLimit(r,i))return;let s=n._FormatMessage(r),a=this._Levels[e],o=Array.isArray(t)?t.slice(1):[];a.logFunc&&a.logFunc("BJS - "+s,...o);let l=`
${s}

`;n._AddLogEntry(l),n._GenerateLimitMessage(r,e)}static get LogCache(){return n._LogCache}static ClearLogCache(){n._LogCache="",n._LogLimitOutputs={},n.errorsCount=0}static set LogLevels(e){n.Log=n._LogDisabled,n.Warn=n._LogDisabled,n.Error=n._LogDisabled;let t=[n.MessageLogLevel,n.WarningLogLevel,n.ErrorLogLevel];for(let i of t)if((e&i)===i){let r=this._Levels[i];n[r.name]=n._LogEnabled.bind(n,i)}}};ee.NoneLogLevel=0;ee.MessageLogLevel=1;ee.WarningLogLevel=2;ee.ErrorLogLevel=4;ee.AllLogLevel=7;ee.MessageLimitReached="Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.";ee._LogCache="";ee._LogLimitOutputs={};ee._Levels=[{},{color:"white",logFunc:console.log,name:"Log"},{color:"orange",logFunc:console.warn,name:"Warn"},{},{color:"red",logFunc:console.error,name:"Error"}];ee.errorsCount=0;ee.Log=ee._LogEnabled.bind(ee,ee.MessageLogLevel);ee.Warn=ee._LogEnabled.bind(ee,ee.WarningLogLevel);ee.Error=ee._LogEnabled.bind(ee,ee.ErrorLogLevel)});var x,W=y(()=>{x=class n{static GetShadersRepository(e=0){return e===0?n.ShadersRepository:n.ShadersRepositoryWGSL}static GetShadersStore(e=0){return e===0?n.ShadersStore:n.ShadersStoreWGSL}static GetIncludesShadersStore(e=0){return e===0?n.IncludesShadersStore:n.IncludesShadersStoreWGSL}};x.ShadersRepository="src/Shaders/";x.ShadersStore={};x.IncludesShadersStore={};x.ShadersRepositoryWGSL="src/ShadersWGSL/";x.ShadersStoreWGSL={};x.IncludesShadersStoreWGSL={}});function Sr(){return typeof window!="undefined"}function lc(){return typeof navigator!="undefined"}function Bf(){return typeof document!="undefined"}function cx(n){let e="",t=n.firstChild;for(;t;)t.nodeType===3&&(e+=t.textContent),t=t.nextSibling;return e}var za=y(()=>{});var fx,uV=y(()=>{fx=class{constructor(){this._valueCache={},this.vertexCompilationError=null,this.fragmentCompilationError=null,this.programLinkError=null,this.programValidationError=null,this._isDisposed=!1}get isAsync(){return this.isParallelCompiled}get isReady(){return this.program?this.isParallelCompiled?this.engine._isRenderingStateCompiled(this):!0:!1}_handlesSpectorRebuildCallback(e){e&&this.program&&e(this.program)}setEngine(e){this.engine=e}_fillEffectInformation(e,t,i,r,s,a,o,l){let c=this.engine;if(c.supportsUniformBuffers)for(let u in t)e.bindUniformBlock(u,t[u]);this.engine.getUniforms(this,i).forEach((u,h)=>{r[i[h]]=u}),this._uniforms=r;let d;for(d=0;d{a[u]=h});for(let u of c.getAttributes(this,o))l.push(u)}dispose(){this._uniforms={},this._isDisposed=!0}_cacheMatrix(e,t){let i=this._valueCache[e],r=t.updateFlag;return i!==void 0&&i===r?!1:(this._valueCache[e]=r,!0)}_cacheFloat2(e,t,i){let r=this._valueCache[e];if(!r||r.length!==2)return r=[t,i],this._valueCache[e]=r,!0;let s=!1;return r[0]!==t&&(r[0]=t,s=!0),r[1]!==i&&(r[1]=i,s=!0),s}_cacheFloat3(e,t,i,r){let s=this._valueCache[e];if(!s||s.length!==3)return s=[t,i,r],this._valueCache[e]=s,!0;let a=!1;return s[0]!==t&&(s[0]=t,a=!0),s[1]!==i&&(s[1]=i,a=!0),s[2]!==r&&(s[2]=r,a=!0),a}_cacheFloat4(e,t,i,r,s){let a=this._valueCache[e];if(!a||a.length!==4)return a=[t,i,r,s],this._valueCache[e]=a,!0;let o=!1;return a[0]!==t&&(a[0]=t,o=!0),a[1]!==i&&(a[1]=i,o=!0),a[2]!==r&&(a[2]=r,o=!0),a[3]!==s&&(a[3]=s,o=!0),o}setInt(e,t){let i=this._valueCache[e];i!==void 0&&i===t||this.engine.setInt(this._uniforms[e],t)&&(this._valueCache[e]=t)}setInt2(e,t,i){this._cacheFloat2(e,t,i)&&(this.engine.setInt2(this._uniforms[e],t,i)||(this._valueCache[e]=null))}setInt3(e,t,i,r){this._cacheFloat3(e,t,i,r)&&(this.engine.setInt3(this._uniforms[e],t,i,r)||(this._valueCache[e]=null))}setInt4(e,t,i,r,s){this._cacheFloat4(e,t,i,r,s)&&(this.engine.setInt4(this._uniforms[e],t,i,r,s)||(this._valueCache[e]=null))}setIntArray(e,t){this._valueCache[e]=null,this.engine.setIntArray(this._uniforms[e],t)}setIntArray2(e,t){this._valueCache[e]=null,this.engine.setIntArray2(this._uniforms[e],t)}setIntArray3(e,t){this._valueCache[e]=null,this.engine.setIntArray3(this._uniforms[e],t)}setIntArray4(e,t){this._valueCache[e]=null,this.engine.setIntArray4(this._uniforms[e],t)}setUInt(e,t){let i=this._valueCache[e];i!==void 0&&i===t||this.engine.setUInt(this._uniforms[e],t)&&(this._valueCache[e]=t)}setUInt2(e,t,i){this._cacheFloat2(e,t,i)&&(this.engine.setUInt2(this._uniforms[e],t,i)||(this._valueCache[e]=null))}setUInt3(e,t,i,r){this._cacheFloat3(e,t,i,r)&&(this.engine.setUInt3(this._uniforms[e],t,i,r)||(this._valueCache[e]=null))}setUInt4(e,t,i,r,s){this._cacheFloat4(e,t,i,r,s)&&(this.engine.setUInt4(this._uniforms[e],t,i,r,s)||(this._valueCache[e]=null))}setUIntArray(e,t){this._valueCache[e]=null,this.engine.setUIntArray(this._uniforms[e],t)}setUIntArray2(e,t){this._valueCache[e]=null,this.engine.setUIntArray2(this._uniforms[e],t)}setUIntArray3(e,t){this._valueCache[e]=null,this.engine.setUIntArray3(this._uniforms[e],t)}setUIntArray4(e,t){this._valueCache[e]=null,this.engine.setUIntArray4(this._uniforms[e],t)}setArray(e,t){this._valueCache[e]=null,this.engine.setArray(this._uniforms[e],t)}setArray2(e,t){this._valueCache[e]=null,this.engine.setArray2(this._uniforms[e],t)}setArray3(e,t){this._valueCache[e]=null,this.engine.setArray3(this._uniforms[e],t)}setArray4(e,t){this._valueCache[e]=null,this.engine.setArray4(this._uniforms[e],t)}setMatrices(e,t){t&&(this._valueCache[e]=null,this.engine.setMatrices(this._uniforms[e],t))}setMatrix(e,t){this._cacheMatrix(e,t)&&(this.engine.setMatrices(this._uniforms[e],t.asArray())||(this._valueCache[e]=null))}setMatrix3x3(e,t){this._valueCache[e]=null,this.engine.setMatrix3x3(this._uniforms[e],t)}setMatrix2x2(e,t){this._valueCache[e]=null,this.engine.setMatrix2x2(this._uniforms[e],t)}setFloat(e,t){let i=this._valueCache[e];i!==void 0&&i===t||this.engine.setFloat(this._uniforms[e],t)&&(this._valueCache[e]=t)}setVector2(e,t){this._cacheFloat2(e,t.x,t.y)&&(this.engine.setFloat2(this._uniforms[e],t.x,t.y)||(this._valueCache[e]=null))}setFloat2(e,t,i){this._cacheFloat2(e,t,i)&&(this.engine.setFloat2(this._uniforms[e],t,i)||(this._valueCache[e]=null))}setVector3(e,t){this._cacheFloat3(e,t.x,t.y,t.z)&&(this.engine.setFloat3(this._uniforms[e],t.x,t.y,t.z)||(this._valueCache[e]=null))}setFloat3(e,t,i,r){this._cacheFloat3(e,t,i,r)&&(this.engine.setFloat3(this._uniforms[e],t,i,r)||(this._valueCache[e]=null))}setVector4(e,t){this._cacheFloat4(e,t.x,t.y,t.z,t.w)&&(this.engine.setFloat4(this._uniforms[e],t.x,t.y,t.z,t.w)||(this._valueCache[e]=null))}setQuaternion(e,t){this._cacheFloat4(e,t.x,t.y,t.z,t.w)&&(this.engine.setFloat4(this._uniforms[e],t.x,t.y,t.z,t.w)||(this._valueCache[e]=null))}setFloat4(e,t,i,r,s){this._cacheFloat4(e,t,i,r,s)&&(this.engine.setFloat4(this._uniforms[e],t,i,r,s)||(this._valueCache[e]=null))}setColor3(e,t){this._cacheFloat3(e,t.r,t.g,t.b)&&(this.engine.setFloat3(this._uniforms[e],t.r,t.g,t.b)||(this._valueCache[e]=null))}setColor4(e,t,i){this._cacheFloat4(e,t.r,t.g,t.b,i)&&(this.engine.setFloat4(this._uniforms[e],t.r,t.g,t.b,i)||(this._valueCache[e]=null))}setDirectColor4(e,t){this._cacheFloat4(e,t.r,t.g,t.b,t.a)&&(this.engine.setFloat4(this._uniforms[e],t.r,t.g,t.b,t.a)||(this._valueCache[e]=null))}_getVertexShaderCode(){return this.vertexShader?this.engine._getShaderSource(this.vertexShader):null}_getFragmentShaderCode(){return this.fragmentShader?this.engine._getShaderSource(this.fragmentShader):null}}});function $e(n,e=!1){if(!(e&&hV[n]))return hV[n]=!0,`${n} needs to be imported before as it contains a side-effect required by your code.`}var hV,An=y(()=>{hV={}});function dx(n,e,t=""){return t+(e?e+` +`)}function NU(n){return`${Pm(n.x,3)}, ${Pm(n.y,3)}, ${Pm(n.z,3)}`}var FC,oc,xle,wA,Rle,GC,Wa,BC,ble,Mle,W_=y(()=>{"use strict";FC={line:"#f8fafc",marker:"#f8fafc",pending:"#f59e0b",hover:"#ffffff",preview:"#e5e7eb",labelPlate:"rgba(248, 250, 252, 0.94)",labelPlateBorder:"rgba(15, 23, 42, 0.58)",labelText:"#111827",labelSecondary:"rgba(51, 65, 85, 0.82)",labelOutline:"rgba(248, 250, 252, 0.22)"},oc={width:760,height:220},xle="ai3d-measurement-active",wA="ai3d-measurement-focus-aggregation",Rle=1100,GC={um:1e-6,mm:.001,cm:.01,m:1},Wa=1e-9,BC=1e6,ble=.9995,Mle={um:"\u03BCm",mm:"mm",cm:"cm",m:"m"}});function Nle(n){let e=typeof activeWindow=="undefined"?window:activeWindow;return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(n):e.setTimeout(()=>n(e.performance.now()),16)}function wle(n){let e=typeof activeWindow=="undefined"?window:activeWindow;if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(n);return}e.clearTimeout(n)}function ZA(n){return new WC(n)}var jA,WC,zC=y(()=>{"use strict";jA=class jA{constructor(e){this.originals=new Map;this.unsubscribe=null;this.active=!1;this.drag=null;this.pendingDrag=null;this.selected=null;this.activePointerId=null;this.frameCount=0;this.pendingDragEvent=null;this.dragUpdateFrame=null;this.adapter=e}isEnabled(){return this.active}setEnabled(e){var t,i,r;return this.active===e?this.active:(this.active=e,this.finishDrag(),this.setSelected(null),this.activePointerId=null,e?this.unsubscribe=this.adapter.subscribe({onPointerDown:(s,a)=>this.handlePointerDown(s,a),onPointerMove:s=>this.handlePointerMove(s),onPointerUp:s=>this.handlePointerUp(s),onRender:()=>this.handleRender()}):((t=this.unsubscribe)==null||t.call(this),this.unsubscribe=null),(r=(i=this.adapter).requestRender)==null||r.call(i),this.active)}toggle(){return this.setEnabled(!this.active)}reset(){var e,t;this.finishDrag(),this.setSelected(null);for(let{part:i,transform:r}of this.originals.values())this.adapter.isDisposed(i)||this.adapter.restoreTransform(i,r);this.activePointerId=null,(t=(e=this.adapter).requestRender)==null||t.call(e)}dispose(){this.setEnabled(!1),this.originals.clear()}handlePointerDown(e,t){if(t.button!==0||t.isPrimary===!1)return;let i=this.adapter.resolvePart(e);if(!i){this.drag=null,this.pendingDrag=null,this.activePointerId=null,this.setSelected(null);return}this.activePointerId=t.pointerId,this.setSelected(i),this.pendingDrag={part:i,event:t,x:t.clientX,y:t.clientY}}handlePointerMove(e){if(!(this.activePointerId!==null&&e.pointerId!==this.activePointerId)){if(!this.drag&&this.pendingDrag){if(e.pointerType==="mouse"&&(e.buttons&1)===0){this.pendingDrag=null,this.activePointerId=null;return}if(Math.hypot(e.clientX-this.pendingDrag.x,e.clientY-this.pendingDrag.y){this.dragUpdateFrame=null,this.flushDragUpdate()}))}flushDragUpdate(){this.dragUpdateFrame!==null&&(wle(this.dragUpdateFrame),this.dragUpdateFrame=null);let e=this.pendingDragEvent;this.pendingDragEvent=null,!(!this.drag||!e)&&this.adapter.updateDrag(this.drag,e)}setSelected(e){this.selected=e,this.frameCount=0,this.adapter.setSelected(e)}captureOriginalTransform(e){let t=this.adapter.getPartId(e);this.originals.has(t)||this.originals.set(t,{part:e,transform:this.adapter.captureTransform(e)})}};jA.DRAG_START_DISTANCE=4;WC=jA});function Wle(n){return!!n&&typeof n=="object"&&!Array.isArray(n)}function qA(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"")}function zle(n){if(typeof n=="string"){let e=n.trim();return e.length>0?e:void 0}if(typeof n=="number"&&Number.isFinite(n))return String(n)}function GU(n,e=0){if(!Wle(n)||e>2)return[];let t=[];for(let i of kle)for(let[r,s]of Object.entries(n))qA(r)===qA(i)&&t.push(...GU(s,e+1));return t.push(n),t}function z_(n,e){let t=new Set(e.map(qA));for(let i of n)for(let[r,s]of Object.entries(i)){if(!t.has(qA(r)))continue;let a=zle(s);if(a)return a}}function va(n,e={}){var c,f;let t=GU(n),i=z_(t,Fle),r=z_(t,Ble),s=z_(t,Ule),a=(c=z_(t,Gle))!=null?c:e.path,o=(f=z_(t,Vle))!=null?f:e.name;return{componentId:i,occurrenceId:r,partNumber:s,componentPath:a,displayName:o,hasExplicitIdentity:!!(i||r||s)}}var Fle,Ble,Ule,Vle,Gle,kle,HC=y(()=>{"use strict";Fle=["ai3dPartId","partId","componentId","componentIdentifier","cadId","persistentId","externalId","id"],Ble=["ai3dOccurrenceId","occurrenceId","instanceId","occurrencePath","assemblyPath","pathId"],Ule=["ai3dPartNumber","partNumber","partNo","partNum","swPartNumber","solidworksPartNumber","part_number"],Vle=["displayName","partName","componentName","cadName","name"],Gle=["componentPath","cadPath","assemblyPath","occurrencePath"],kle=["ai3d","cad","solidworks","sw","metadata","properties","extras","gltf","userData"]});function Sa(n){return n instanceof ui}function H_(n){return n instanceof Ds}function Ff(n){return Sa(n)||H_(n)}function Ws(n){return n?Array.isArray(n)?n:[n]:[]}function X_(n){var r,s,a,o;if(H_(n))return 0;let e=n.geometry,t=(s=(r=e.getIndex())==null?void 0:r.count)!=null?s:0;if(t>0)return Math.floor(t/3);let i=(o=(a=e.getAttribute("position"))==null?void 0:a.count)!=null?o:0;return Math.floor(i/3)}function Om(n){var e,t;return(t=(e=n.geometry.getAttribute("position"))==null?void 0:e.count)!=null?t:0}function Nm(n){return n?n.name||n.type||`material-${n.uuid}`:null}function Ea(n,e){var i;let t=(i=n.userData)==null?void 0:i.name;return typeof t=="string"&&t.trim().length>0?t:n.name||e}function Lm(n,e){let t=[],i=e;for(;i&&i!==n;)t.push(Ea(i,i.type||`object-${i.id}`)),i=i.parent;return t.reverse().join("/")}function $r(n){let e=new kr().setFromObject(n);return ka(ei(e.min),ei(e.max))}function kU(n){let e=new Map;for(let t of n)t.updateWorldMatrix(!0,!1),e.set(t,$r(t));return e}function WU(n){return Ws(n.material).map(e=>Nm(e))}function zU(n){return{name:Ea(n,H_(n)?`points-${n.id}`:`mesh-${n.id}`),triangleCount:H_(n)?null:X_(n),vertexCount:Om(n),materialName:Nm(Ws(n.material)[0])}}function Hle(n,e,t){var a;n.updateWorldMatrix(!0,!1);let i=(a=t==null?void 0:t.get(n))!=null?a:$r(n),r=Ea(n,`mesh-${n.id}`),s=va(n.userData,{name:r,path:e?Lm(e,n):r});return ac({name:JA(s,r),triangleCount:X_(n),vertexCount:Om(n),materialName:Nm(Ws(n.material)[0]),boundingSize:Xi(i),center:Er(i),source:s.hasExplicitIdentity?"component":"mesh",meshNames:[r],childCount:1,componentId:s.componentId,occurrenceId:s.occurrenceId,partNumber:s.partNumber,componentPath:s.componentPath})}function XC(n,e,t){var a;if(Sa(n))return Hle(n,e,t);n.updateWorldMatrix(!0,!1);let i=(a=t==null?void 0:t.get(n))!=null?a:$r(n),r=Ea(n,`points-${n.id}`),s=va(n.userData,{name:r,path:e?Lm(e,n):r});return ac({name:JA(s,r),triangleCount:0,vertexCount:Om(n),materialName:Nm(Ws(n.material)[0]),boundingSize:Xi(i),center:Er(i),source:s.hasExplicitIdentity?"component":"mesh",meshNames:[r],childCount:1,componentId:s.componentId,occurrenceId:s.occurrenceId,partNumber:s.partNumber,componentPath:s.componentPath})}function Xle(n,e){let t=[];return n.traverse(i=>{Sa(i)&&e.has(i)&&t.push(i)}),t}function wm(n,e){let t=new Map;for(let i of e){let r=i.parent;for(;r&&r!==n;){let s=t.get(r);s||(s=[],t.set(r,s)),s.push(i),r=r.parent}}return t}function HU(n,e,t){var i;return(i=t==null?void 0:t.get(n))!=null?i:Xle(n,e)}function Yle(n){let e=n.trim().toLowerCase();return/^(scene|root|model|group|node|object|assembly|component)[-_\s.]?\d*$/i.test(e)||e==="__root__"}function Kle(n){return/->\d+(?:[_\s.-]*primitive\d*)?$/i.test(n.trim())}function XU(n,e,t,i,r){var m;if(Ff(n))return XC(n,e,r);n.updateWorldMatrix(!0,!0);let s=new Set(t!=null?t:[]);s.size===0&&n.traverse(g=>{Sa(g)&&s.add(g)});let a=HU(n,s,i),o=null,l=new Set,c=0,f=0;for(let g of a){g.updateWorldMatrix(!0,!1),o=vu(o,(m=r==null?void 0:r.get(g))!=null?m:$r(g)),c+=X_(g),f+=Om(g);for(let p of Ws(g.material)){let _=Nm(p);_&&l.add(_)}}a.length===0&&(o=$r(n));let d=o!=null?o:ka({x:0,y:0,z:0},{x:0,y:0,z:0}),u=Ea(n,`group-${n.id}`),h=va(n.userData,{name:u,path:e?Lm(e,n):u});return ac({name:JA(h,u),triangleCount:c,vertexCount:f,materialName:Eu(l),boundingSize:Xi(d),center:Er(d),source:h.hasExplicitIdentity?"component":"group",meshNames:a.map(g=>Ea(g,`mesh-${g.id}`)),childCount:a.length,componentId:h.componentId,occurrenceId:h.occurrenceId,partNumber:h.partNumber,componentPath:h.componentPath})}function QA(n,e,t,i){var l,c;let r=new Set(t),s=null,a=null,o=e.parent;for(;o&&o!==n;){let f=HU(o,r,i);if(f.length>0&&f.length1&&u.trim()&&!Yle(u)&&(s=o)}o=o.parent}return(c=s!=null?s:a)!=null?c:e}function YU(n,e,t=wm(n,e),i){let r=[],s=new Set,a=[];return n.updateWorldMatrix(!0,!0),n.traverse(o=>{var f;if(o===n||Sa(o))return;let l=(f=t.get(o))!=null?f:[];if(l.length<2||l.length===e.length){let d=va(o.userData,{name:Ea(o,`component-${o.id}`),path:Lm(n,o)});if(!d.hasExplicitIdentity||l.length<1||l.length===e.length)return;a.push({object:o,childMeshes:l,identity:d});return}let c=va(o.userData,{name:Ea(o,`group-${o.id}`),path:Lm(n,o)});!c.hasExplicitIdentity&&!o.name.trim()||a.push({object:o,childMeshes:l,identity:c})}),a.sort((o,l)=>o.childMeshes.length-l.childMeshes.length).forEach(({object:o,childMeshes:l,identity:c})=>{var p;let f=l.filter(_=>!s.has(_));if(f.length<1||!c.hasExplicitIdentity&&f.length<2)return;for(let _ of f)s.add(_);let d=null;for(let _ of f)_.updateWorldMatrix(!0,!1),d=vu(d,(p=i==null?void 0:i.get(_))!=null?p:$r(_));let u=new Set,h=0,m=0;for(let _ of f){h+=X_(_),m+=Om(_);for(let v of Ws(_.material)){let E=Nm(v);E&&u.add(E)}}let g=d!=null?d:ka({x:0,y:0,z:0},{x:0,y:0,z:0});r.push(ac({name:JA(c,Ea(o,`group-${o.id}`)),triangleCount:h,vertexCount:m,materialName:Eu(u),boundingSize:Xi(g),center:Er(g),source:c.hasExplicitIdentity?"component":"group",meshNames:f.map(_=>Ea(_,`mesh-${_.id}`)),childCount:f.length,componentId:c.componentId,occurrenceId:c.occurrenceId,partNumber:c.partNumber,componentPath:c.componentPath}))}),{parts:r,groupedMeshes:s}}function $A(n,e,t=[],i){return yA({rootName:n.name||"__root__",boundingSize:Xi(i!=null?i:$r(n)),meshes:e.map(r=>({triangleCount:X_(r),vertexCount:Om(r),materialKeys:Ws(r.material).map(s=>s.uuid)})),resourceWarnings:t})}function KU(n,e,t,i){var f;if(!n)return{meshCount:0,pointCloudCount:0,smallPartCount:0,smallestPartSpan:null,modelSpan:null};let r=Xi(t!=null?t:$r(n)),s=Math.max(r.x,r.y,r.z),a=Math.max(s*.04,Number.EPSILON),o=0,l=0,c=Number.POSITIVE_INFINITY;for(let d of e){H_(d)&&o++;let u=Xi((f=i==null?void 0:i.get(d))!=null?f:$r(d)),h=Math.max(u.x,u.y,u.z);Number.isFinite(h)&&h>0&&(c=Math.min(c,h),Sa(d)&&h<=a&&h0?Number(s.toPrecision(6)):null}}function JA(n,e){var t;return((t=n.displayName)==null?void 0:t.trim())||n.partNumber||n.componentId||e}var YC=y(()=>{"use strict";us();gl();HC();G_();ks();IA()});function jle(n){return!!n&&typeof n=="object"&&"object"in n&&"meshes"in n}function Zle(n,e,t=wm(n,e)){let i=new Map;for(let r of e){let s=QA(n,r,e,t),a=i.get(s);a||(a={id:s.id,object:s,meshes:[]},i.set(s,a)),a.meshes.push(r)}return Array.from(i.values())}function qle(n,e){var t;n.updateMatrixWorld(!0),(t=e.parent)==null||t.updateMatrixWorld(!0),e.updateMatrixWorld(!0),n.attach(e),e.updateMatrixWorld(!0)}function ZU(n,e,t,i,r,s,a,o){return ZA(new KC(n,e,t,i,r,s,a,o))}var jU,Qle,KC,qU=y(()=>{"use strict";us();ks();zC();YC();jU=new ht(4890367),Qle=new ht(1722990),KC=class{constructor(e,t,i,r,s,a,o,l=wm(r,s)){this.meshToPart=new Map;this.raycaster=new Af;this.pointer=new yt;this.tempBox=new kr;this.tempCenter=new re;this.tempDirection=new re;this.tempCameraForward=new re;this.tempCameraRight=new re;this.tempCameraUp=new re;this.tempDragOffset=new re;this.tempNextPosition=new re;this.tempHelperDelta=new re;this.partCenterCache=new Map;this.selectionHelper=null;this.lastOccluded=!1;this.selected=null;this.lastPointerDown=null;this.partPointerActive=!1;this.activePointerId=null;this.scene=e,this.camera=t,this.canvas=i,this.meshes=s,this.parts=Zle(r,s,l);for(let c of this.parts)for(let f of c.meshes)this.meshToPart.set(f.id,c);this.controls=a,this.invalidate=o}requestRender(){this.invalidate()}getParts(){return this.parts}getPartId(e){return e.id}isDisposed(e){return!e.object.parent&&!this.scene.children.includes(e.object)}captureTransform(e){return{parent:e.object.parent,position:e.object.position.clone(),quaternion:e.object.quaternion.clone(),scale:e.object.scale.clone()}}restoreTransform(e,t){t.parent?t.parent.add(e.object):this.scene.add(e.object),e.object.position.copy(t.position),e.object.quaternion.copy(t.quaternion),e.object.scale.copy(t.scale),e.object.updateMatrixWorld(!0),this.invalidatePartCenter(e),this.requestRender()}subscribe(e){this.canvas.classList.add("ai3d-disassembly-active");let t=s=>{var o,l;if(s.button!==0||s.isPrimary===!1)return;this.lastPointerDown={x:s.clientX,y:s.clientY};let a=this.resolvePickTarget(s);if(this.partPointerActive=!!a,this.partPointerActive){s.preventDefault(),s.stopPropagation(),this.controls.enabled=!1,this.activePointerId=s.pointerId;try{(l=(o=this.canvas).setPointerCapture)==null||l.call(o,s.pointerId)}catch(c){}}e.onPointerDown(a,s)},i=s=>{this.activePointerId!==null&&s.pointerId!==this.activePointerId||(this.partPointerActive&&(s.preventDefault(),s.stopPropagation()),e.onPointerMove(s))},r=s=>{var a,o;if(!(this.activePointerId!==null&&s.pointerId!==this.activePointerId)){if(this.partPointerActive&&(s.preventDefault(),s.stopPropagation()),this.lastPointerDown=null,e.onPointerUp(s),this.partPointerActive=!1,this.activePointerId!==null&&((o=(a=this.canvas).hasPointerCapture)!=null&&o.call(a,this.activePointerId)))try{this.canvas.releasePointerCapture(this.activePointerId)}catch(l){}this.activePointerId=null,this.controls.enabled=!0}};return this.canvas.addEventListener("pointerdown",t),window.addEventListener("pointermove",i),window.addEventListener("pointerup",r),()=>{var s,a;if(this.canvas.removeEventListener("pointerdown",t),window.removeEventListener("pointermove",i),window.removeEventListener("pointerup",r),this.canvas.classList.remove("ai3d-disassembly-active","ai3d-disassembly-dragging"),this.partPointerActive=!1,this.activePointerId!==null&&((a=(s=this.canvas).hasPointerCapture)!=null&&a.call(s,this.activePointerId)))try{this.canvas.releasePointerCapture(this.activePointerId)}catch(o){}this.activePointerId=null,this.controls.enabled=!0}}resolvePart(e){var t;return jle(e)?this.parts.includes(e)?e:null:e&&(t=this.meshToPart.get(e.id))!=null?t:null}setSelected(e){var t;(t=this.selectionHelper)==null||t.removeFromParent(),this.selectionHelper=null,this.selected=e,this.lastOccluded=!1,e&&!this.isDisposed(e)&&(this.selectionHelper=new cl(e.object,jU),this.scene.add(this.selectionHelper)),this.requestRender()}beginDrag(e,t){let i=this.getPartWorldCenter(e,this.tempCenter).clone(),r=this.getPointOnDragPlane(i,t);if(!r)return null;t.preventDefault(),t.stopPropagation(),qle(this.scene,e.object),this.canvas.classList.add("ai3d-disassembly-dragging");let s="move";t.shiftKey&&(s="rotate");let a=this.tempCameraForward;this.camera.getWorldDirection(a);let o=Mm(ei(r),ei(a));return o?(this.controls.enabled=!1,this.requestRender(),{part:e,mode:s,plane:o,startPoint:r.clone(),startPosition:e.object.position.clone(),startQuaternion:e.object.quaternion.clone(),pivot:i,pointerX:t.clientX,pointerY:t.clientY}):null}updateDrag(e,t){if(t.preventDefault(),t.stopPropagation(),e.mode==="rotate"){this.updateRotation(e,t);return}let i=this.getRayPlanePoint(t,e.plane);if(!i)return;let r=this.tempDragOffset.copy(i).sub(e.startPoint),s=this.tempNextPosition.copy(e.startPosition).add(r),a=this.tempHelperDelta.copy(s).sub(e.part.object.position);e.part.object.position.copy(s),e.part.object.updateMatrixWorld(!0),this.invalidatePartCenter(e.part),this.translateSelectionHelper(a),this.requestRender()}endDrag(e){var t;this.controls.enabled=!0,this.canvas.classList.remove("ai3d-disassembly-dragging"),(t=this.selectionHelper)==null||t.update(),this.requestRender()}updateSelectionOcclusion(e){let t=this.getPartWorldCenter(e,this.tempCenter),i=this.camera.position,r=Of(ei(i),ei(t));if(!r)return;let s=this.tempDirection.set(r.direction.x,r.direction.y,r.direction.z);this.raycaster.set(i,s),this.raycaster.far=r.distance;let a=this.raycaster.intersectObjects(this.meshes,!1)[0],o=!!a&&Lf(a.distance,r.distance,r.epsilon);o!==this.lastOccluded&&(this.lastOccluded=o,this.selectionHelper&&(this.selectionHelper.material.color.set(o?Qle:jU),this.requestRender()))}updateRotation(e,t){var c;let i=t.clientX-e.pointerX,r=t.clientY-e.pointerY,s=this.tempCameraForward;this.camera.getWorldDirection(s);let a=this.tempCameraUp.copy(this.camera.up).normalize(),o=this.tempCameraRight.crossVectors(a,s).normalize(),l=RA({startPosition:ei(e.startPosition),pivot:ei(e.pivot),startRotationQuaternion:xA(e.startQuaternion),yawAxis:ei(a),pitchAxis:ei(o),deltaX:i,deltaY:r,sensitivity:.01});l&&(e.part.object.position.set(l.position.x,l.position.y,l.position.z),e.part.object.quaternion.set(l.rotationQuaternion.x,l.rotationQuaternion.y,l.rotationQuaternion.z,l.rotationQuaternion.w),e.part.object.updateMatrixWorld(!0),this.invalidatePartCenter(e.part),(c=this.selectionHelper)==null||c.update(),this.requestRender())}resolvePickTarget(e){let t=this.canvas.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.meshes,!1)[0];return(i==null?void 0:i.object)instanceof ui?i.object:null}getPointOnDragPlane(e,t){var s;let i=this.tempCameraForward;this.camera.getWorldDirection(i);let r=Mm(ei(e),ei(i));return r&&(s=this.getRayPlanePoint(t,r))!=null?s:e}getRayPlanePoint(e,t){let i=this.canvas.getBoundingClientRect(),r=e.clientX-i.left,s=e.clientY-i.top;this.pointer.set(r/i.width*2-1,-(s/i.height)*2+1),this.raycaster.setFromCamera(this.pointer,this.camera);let a=AA({origin:ei(this.raycaster.ray.origin),direction:ei(this.raycaster.ray.direction)},t);return a?new re(a.x,a.y,a.z):null}getPartWorldCenter(e,t){let i=this.partCenterCache.get(e.id);return i?t.copy(i):(this.tempBox.setFromObject(e.object).getCenter(t),this.partCenterCache.set(e.id,t.clone()),t)}invalidatePartCenter(e){this.partCenterCache.delete(e.id)}translateSelectionHelper(e){if(!this.selectionHelper||e.lengthSq()<=Number.EPSILON)return;let t=this.selectionHelper.geometry.getAttribute("position");for(let i=0;ie.uuid).join("|"):n.uuid}function tce(n){if(n)for(let e of Array.isArray(n)?n:[n])e.dispose()}var $le,ex,$U=y(()=>{"use strict";$le=.242;ex=class{constructor(){this.materials=new Map}get(e){let t=ece(e),i=this.materials.get(t);if(i)return i;let r=Jle(e);return this.materials.set(t,r),r}clear(){for(let e of this.materials.values())tce(e);this.materials.clear()}get size(){return this.materials.size}}});function JU(n){return un(n)}function ice(n,e){return{originalPosition:JU(n),originalCenter:JU(e)}}function tx(n,e,t){let i=n.getRootCenter();for(let r of n.getParts()){let s=n.getPartState(r);s||(s=ice(n.getPartPosition(r),n.getPartCenter(r)),n.setPartState(r,s));let a=(s.originalCenter[t]-i[t])*e;n.setPartPosition(r,SU(s.originalPosition,t,a))}}function ix(n){for(let e of n.getParts()){let t=n.getPartState(e);t&&n.setPartPosition(e,t.originalPosition)}}var jC=y(()=>{"use strict";ks()});function rx(n){return un(n)}function rce(n){return n instanceof ui}function nce(n){let e=[];return n.traverse(t=>{rce(t)&&t.geometry&&e.push(t)}),e}function eV(n,e,t){tx(new nx(n),e,t)}function ZC(n){ix(new nx(n))}var nx,tV=y(()=>{"use strict";us();ks();gl();jC();nx=class{constructor(e){this.root=e}getParts(){return nce(this.root)}getRootCenter(){let e=new kr().setFromObject(this.root);return Er({min:ei(e.min),max:ei(e.max)})}getPartPosition(e){return ei(e.position)}getPartCenter(e){let i=new kr().setFromObject(e).getCenter(new re);return ei(i)}setPartPosition(e,t){e.position.set(t.x,t.y,t.z)}getPartState(e){var i;let t=(i=e.userData)!=null?i:{};return t._previewExplodeState?{originalPosition:rx(t._previewExplodeState.originalPosition),originalCenter:rx(t._previewExplodeState.originalCenter)}:null}setPartState(e,t){e.userData._previewExplodeState={originalPosition:rx(t.originalPosition),originalCenter:rx(t.originalCenter)}}}});function iV(n){return n.cameraMoved||n.animating||n.renderDirty||n.renderObserverCount>0&&n.renderObserverSettleFrames>0}var sx,rV=y(()=>{"use strict";sx=class{constructor(e=120){this.maxSamples=e;this.samples=[];this.renderedFrameCount=0;this.idleFrameSkipCount=0;this.slowFrameCount=0;this.maxRenderMs=0;this.adaptiveScaleChangeCount=0}recordRenderedFrame(e,t){!Number.isFinite(e)||e<0||(this.renderedFrameCount++,e>=t&&this.slowFrameCount++,this.maxRenderMs=Math.max(this.maxRenderMs,e),this.samples.push(e),this.samples.length>this.maxSamples&&this.samples.shift())}recordIdleFrameSkip(){this.idleFrameSkipCount++}recordAdaptiveScaleChange(){this.adaptiveScaleChangeCount++}snapshot(){let e=[...this.samples].sort((r,s)=>r-s),t=this.samples.reduce((r,s)=>r+s,0),i=e.length===0?-1:Math.min(e.length-1,Math.ceil(e.length*.95)-1);return{renderedFrameCount:this.renderedFrameCount,idleFrameSkipCount:this.idleFrameSkipCount,slowFrameCount:this.slowFrameCount,averageRenderMs:e.length?Number((t/e.length).toFixed(2)):0,p95RenderMs:i>=0?Number(e[i].toFixed(2)):0,maxRenderMs:Number(this.maxRenderMs.toFixed(2)),adaptiveScaleChangeCount:this.adaptiveScaleChangeCount}}}});var lV={};Be(lV,{ThreeModelPreview:()=>ox,createThreeModelPreview:()=>bce});function aV(){return{textureCount:0,colorTextureCount:0,srgbColorTextureCount:0}}function Rce(n,e){n.textureCount+=e.textureCount,n.colorTextureCount+=e.colorTextureCount,n.srgbColorTextureCount+=e.srgbColorTextureCount}function qC(n){return n instanceof ll||n instanceof vo||n instanceof rc}function QC(n){return n instanceof ir}function oV(n){return Number.isFinite(n)?Math.max(0,Math.min(n,1)):0}function bce(n){return new ox(n)}var ax,sce,ace,oce,lce,cce,nV,fce,sV,dce,uce,hce,mce,pce,gce,_ce,vce,Ece,Sce,Y_,Tce,Ace,xce,ox,cV=y(()=>{"use strict";us();F2();B2();mU();ga();Rm();gl();bA();DA();F_();wC();ks();G_();W_();qU();$U();tV();ps();CC();rV();YC();ax=new ht("#20242e"),sce=.28,ace=2.5,oce=1.5,lce=1.15,cce=260,nV=30,fce=8,sV=28,dce=18,uce=2,hce=28,mce=.86,pce=1.08,gce=.62,_ce=.86,vce=4,Ece=120,Sce=16317180,Y_=16317180,Tce=16096779,Ace=16777215,xce=15067115;ox=class{constructor(e){this.raycaster=new Af;this.occlusionRaycaster=new Af;this.renderObservers=new Set;this.cameraZoomObservers=new Set;this.pointer=new yt;this.annotationProjection=new re;this.annotationDirection=new re;this.clock={last:performance.now()};this.defaultLights=[];this.configLights=[];this.environmentTarget=null;this.environmentInstallHandle=0;this.rootObject=null;this.loadedExt="";this.resourceWarnings=[];this.textureAudit=aV();this.renderHandle=0;this.contextLost=!1;this.quality="high";this.renderScale=1;this.interactivePixelRatioActive=!1;this.interactionPixelRatioDeadline=0;this.renderObserverSettleFrames=0;this.frameBudgetPixelRatioScale=1;this.frameBudgetSlowStreak=0;this.frameBudgetFastStreak=0;this.frameBudgetObserverStride=1;this.frameBudgetObserverCursor=0;this.frameBudgetShadowDeferred=!1;this.lastFrameDurationMs=0;this.smoothness=new sx;this.viewportVisible=!0;this.viewportObserver=null;this.lastDisposalAudit={reason:"initial",meshCount:0,geometryCount:0,materialCount:0,textureCount:0,objectCount:0,timestamp:performance.now()};this.axesHelper=null;this.bboxHelper=null;this.groundShadowMesh=null;this.meshShadowFlagsPrepared=!1;this.gridHelper=null;this.bboxEnabled=!1;this.wireframeEnabled=!1;this.wireframeOriginalMaterials=new Map;this.sceneConfig={};this.focusSelectionEnabled=!1;this.explodeStateActive=!1;this.focusedObject=null;this.highlightedObject=null;this.selectionHelper=null;this.focusHelper=null;this.mixer=null;this.animationPlaying=!1;this.initialTarget=new re;this.initialPosition=new re(3,2,3);this.initialFov=45;this.initialZoom=1;this.initialCameraMode="perspective";this.cameraMode="perspective";this.lastPointerDown=null;this.measurementActive=!1;this.measurementScale={x:1,y:1,z:1};this.measurementBaseRootScale=new re(1,1,1);this.measurementBaseBounds=null;this.measurementUnit="mm";this.measurementSegments=[];this.measurementMarkers=[];this.measurementMarkerPoints=[];this.measurementTargetObject=null;this.measurementTargetHelper=null;this.measurementSnapInputCache=null;this.measurementSnapInputCacheTarget=null;this.measurementSnapKind=null;this.measurementObservers=new Set;this.pendingPoint=null;this.pendingMarker=null;this.hoveredMarkerIndex=-1;this.lastPointerClient={x:0,y:0,altKey:!1};this.previewLine=null;this.previewLineUpdateHandle=0;this.originalMaterials=new Map;this.focusedSelectedMeshes=new Map;this.focusDimMaterialCache=new ex;this._lastPickResult={mesh:null,pickedPoint:null,screenX:0,screenY:0};this._onPickCallbacks=[];this.disassembly=null;this.disassemblySetup=!1;this.renderDirty=!0;this.stlMaterial=null;this.cachedMeshes=null;this.cachedMeshRoot=null;this.cachedRenderables=null;this.cachedRenderableRoot=null;this.cachedRenderableObjectCount=null;this.cachedChildMeshMap=null;this.cachedChildMeshMapRoot=null;this.cachedRenderableBoundsMap=null;this.cachedRenderableBoundsMapRoot=null;this.cachedRootPreviewBounds=null;this.cachedRootPreviewBoundsObject=null;this.cachedGeometryQualityStats=null;this.cameraAnimHandle=0;this.preventCanvasWheelScroll=e=>{this.prepareInteractiveFrameBudget(),e.preventDefault(),e.stopPropagation(),this.markDirty()};this.handleControlsChange=()=>{this.prepareInteractiveFrameBudget(),this.measurementSegments.length>0&&this.updateMeasurementOverlayPositions(),this.markDirty(),this.notifyCameraZoomChanged()};this.handleViewportIntersection=e=>{let t=e[e.length-1];if(!t)return;let i=t.isIntersecting&&t.intersectionRatio>0;i!==this.viewportVisible&&(this.viewportVisible=i,i?(this.clock.last=performance.now(),this.markDirty(),this.markShadowDirty(),this.startRenderLoop()):(cancelAnimationFrame(this.renderHandle),this.renderHandle=0))};this.handlePointerDown=e=>{e.button!==0||e.isPrimary===!1||(this.lastPointerDown={x:e.clientX,y:e.clientY},this.prepareInteractiveFrameBudget())};this.handlePointerUp=e=>{var i;if(e.button!==0||e.isPrimary===!1)return;let t=this.lastPointerDown;this.lastPointerDown=null,t&&(Math.hypot(e.clientX-t.x,e.clientY-t.y)>4||(i=this.disassembly)!=null&&i.isEnabled()||this.dispatchPick(e))};this.handlePointerMove=e=>{if(this.lastPointerClient={x:e.clientX,y:e.clientY,altKey:e.altKey},e.buttons&1&&this.prepareInteractiveFrameBudget(),!this.measurementActive||(this.pendingPoint&&this.schedulePreviewLineUpdate(),this.measurementMarkers.length===0))return;let t=this.renderer.domElement.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.measurementMarkers,!1),r=i.length>0?this.measurementMarkers.indexOf(i[0].object):-1;if(r!==this.hoveredMarkerIndex){if(this.hoveredMarkerIndex>=0&&this.hoveredMarkerIndex=0&&r{e.preventDefault(),this.contextLost=!0,this.renderHandle&&(cancelAnimationFrame(this.renderHandle),this.renderHandle=0)};this.handleContextRestored=()=>{this.contextLost=!1,this.markDirty(),this.startRenderLoop()};this.renderer=new eA({canvas:e,antialias:!0,alpha:!0,preserveDrawingBuffer:!0,powerPreference:"high-performance"}),this.renderer.outputColorSpace=Li,this.renderer.toneMapping=ws,this.renderer.toneMappingExposure=1,this.renderer.shadowMap.enabled=!1,this.renderer.shadowMap.type=aT,this.renderer.shadowMap.autoUpdate=!1,this.renderer.shadowMap.needsUpdate=!1,this.renderer.setClearColor(ax,1),this.scene=new $d,this.camera=new _r(this.initialFov,1,.01,2e3),this.camera.position.copy(this.initialPosition),this.camera.lookAt(this.initialTarget),this.scene.add(this.camera),this.controls=new nA(this.camera,e),this.controls.enableDamping=!0,this.controls.dampingFactor=.08,this.controls.zoomSpeed=.65,this.controls.screenSpacePanning=!0,this.controls.target.copy(this.initialTarget),this.controls.addEventListener("change",this.handleControlsChange),this.installDefaultLighting(),this.resizeObs=new ResizeObserver(()=>this.resizeRenderer()),this.resizeObs.observe(e),typeof IntersectionObserver!="undefined"&&(this.viewportObserver=new IntersectionObserver(this.handleViewportIntersection,{root:null,threshold:[0,.01]}),this.viewportObserver.observe(e)),e.addEventListener("wheel",this.preventCanvasWheelScroll,{passive:!1}),e.addEventListener("pointerdown",this.handlePointerDown),e.addEventListener("pointerup",this.handlePointerUp),e.addEventListener("pointermove",this.handlePointerMove),e.addEventListener("webglcontextlost",this.handleContextLost),e.addEventListener("webglcontextrestored",this.handleContextRestored),this.resizeRenderer(),this.startRenderLoop()}async loadModel(e,t,i,r,s){var l;Ti(s),this.clearLoadedModel("model-switch"),Ti(s),this.loadedExt=t.toLowerCase(),this.resourceWarnings=[],this.textureAudit=aV();let a=null,o=[];try{if(this.loadedExt==="glb"||this.loadedExt==="gltf"){let u=await fU(e,this.loadedExt,i,r,s);a=u.scene,o=u.animations,this.resourceWarnings=u.warnings}else if(this.loadedExt==="stl")a=await dU(e),this.stlMaterial=Sa(a)?a.material:null;else if(this.loadedExt==="ply")a=await uU(e);else if(this.loadedExt==="obj"){let u=await hU(e,i,r);a=u.object,this.resourceWarnings=u.warnings}else throw new Error(`Three preview does not support .${this.loadedExt} format`);Ti(s),this.rootObject=a,this.scene.add(a),this.invalidateMeshCache();let c=this.getRenderableObjects(a);this.prepareModelForQuality(c),Ti(s),this.syncShadowFeatures();let f=this.getRootPreviewBounds(a);if(this.captureMeasurementBaseState(a,f),this.updateShadowFraming(f),this.syncSceneHelpers(),this.markDirty(),o.length>0){this.mixer=new g_(a);for(let u of o)this.mixer.clipAction(u).play();this.animationPlaying=!0}let d=$A(a,c,this.resourceWarnings,f!=null?f:void 0);return this.cachedGeometryQualityStats=null,this.fitCameraToObject(a,f!=null?f:void 0),this.bboxEnabled&&this.ensureBoundingBoxHelper(),this.scheduleGlobalEnvironmentInstall(),this.disassemblySetup=!1,(l=this.disassembly)==null||l.dispose(),this.disassembly=null,d}catch(c){throw a&&(a.removeFromParent(),this.rootObject===a&&(this.rootObject=null),this.lastDisposalAudit=this.disposeObjectGraph(a,"model-switch"),this.invalidateMeshCache()),c}}applyConfig(e){e.camera&&this.applyCameraConfig(e.camera),e.lights&&this.applyLightConfig(e.lights),e.scene&&this.applySceneConfig(e.scene),e.stl&&this.applySTLConfig(e.stl)}applySTLConfig(e){let t=this.stlMaterial;t&&(e.color!==void 0&&t.color.set(e.color),e.wireframe!==void 0&&(t.wireframe=e.wireframe,t.needsUpdate=!0),this.markDirty())}destroy(){var t,i;cancelAnimationFrame(this.renderHandle),cancelAnimationFrame(this.cameraAnimHandle),this._onPickCallbacks=[],this.renderObservers.clear(),this.cameraZoomObservers.clear(),this.measurementObservers.clear(),(t=this.disassembly)==null||t.dispose(),this.disassembly=null,this.disassemblySetup=!1,this.clearFocusedMesh(),this.clearSelectionHighlight(),this.clearLoadedModel("destroy");for(let r of this.configLights)this.disposeConfiguredLight(r);this.configLights.length=0;for(let r of this.defaultLights)this.disposeConfiguredLight(r);this.defaultLights.length=0,this.disposeGlobalEnvironment(),this.controls.removeEventListener("change",this.handleControlsChange),this.controls.dispose();let e=this.renderer.domElement;e.removeEventListener("wheel",this.preventCanvasWheelScroll),e.removeEventListener("pointerdown",this.handlePointerDown),e.removeEventListener("pointerup",this.handlePointerUp),e.removeEventListener("pointermove",this.handlePointerMove),e.removeEventListener("webglcontextlost",this.handleContextLost),e.removeEventListener("webglcontextrestored",this.handleContextRestored),this.resizeObs.disconnect(),(i=this.viewportObserver)==null||i.disconnect(),this.viewportObserver=null,this.renderer.dispose()}getCanvas(){return this.renderer.domElement}captureSnapshot(){return this.renderNow(0),this.renderer.domElement.toDataURL("image/png")}getAnnotationProvider(){let e=this.renderer.domElement;return LA({canvas:e,observeRender:t=>(this.renderObservers.add(t),this.setRenderObserverSettleFrames(),this.markDirty(),{remove:()=>{this.renderObservers.delete(t),this.renderObservers.size===0&&this.setRenderObserverSettleFrames(0)}}),getCameraStateKey:()=>this.getAnnotationCameraStateKey(),projectWorldPoint:(t,i)=>this.projectAnnotationWorldPoint(t,i),isWorldPointOccluded:t=>this.isAnnotationWorldPointOccluded(t)})}exportModelInfo(e){var s;if(!this.rootObject)return"";let t=this.getRenderableObjects(this.rootObject),i=$A(this.rootObject,t,this.resourceWarnings,(s=this.getRootPreviewBounds())!=null?s:void 0),r=e&&Gs(e)||i.rootName;return CA({title:r,format:this.loadedExt.toUpperCase(),summary:i,meshBreakdown:t.map(zU)})}getModelEvidence(){var o;if(!this.rootObject)return null;let e=this.getRenderableObjects(this.rootObject),t=this.getRenderableMeshes(this.rootObject),i=this.getChildRenderableMeshMap(this.rootObject),r=this.getRenderableBoundsMap(this.rootObject),s=YU(this.rootObject,t,i,r),a={parts:s.parts,groupedMeshes:new Set(s.groupedMeshes)};return NA({summary:$A(this.rootObject,e,this.resourceWarnings,(o=this.getRootPreviewBounds())!=null?o:void 0),renderableMeshes:e,groupedPartCandidates:a,createMeshPart:l=>XC(l,this.rootObject,r),getMeshMaterialNames:WU,resourceWarnings:this.resourceWarnings})}getSelectedPartInfo(){var r;let e=(r=this.focusedObject)!=null?r:QC(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;if(!e)return null;let t=this.rootObject?this.getRenderableMeshes(this.rootObject):[],i=this.rootObject?this.getChildRenderableMeshMap(this.rootObject):void 0;return XU(e,this.rootObject,t,i)}exportSelectedPartInfo(){let e=this.getSelectedPartInfo();return e?PA(e):""}getPickWorldPoint(e){return e.pickedPoint&&typeof e.pickedPoint=="object"?ei(e.pickedPoint):QC(e.mesh)?Er($r(e.mesh)):null}onPick(e){return this._onPickCallbacks.push(e),()=>{this._onPickCallbacks=this._onPickCallbacks.filter(t=>t!==e)}}resetView(){this.rootObject&&this.explodeStateActive&&(ZC(this.rootObject),this.explodeStateActive=!1,this.invalidateRootBoundsCache(),this.markShadowDirty()),this.resetDisassembly(),this.clearFocusedMesh(),this.clearSelectionHighlight(),this.switchCameraMode(this.initialCameraMode),this.camera.position.copy(this.initialPosition),this.controls.target.copy(this.initialTarget),this.camera.lookAt(this.controls.target),this.camera instanceof _r&&(this.camera.fov=this.initialFov),this.camera.zoom=this.initialZoom,this.camera.updateProjectionMatrix(),this.controls.update(),this.markDirty(),this.renderNow(performance.now()),this.notifyCameraZoomChanged()}toggleFocusSelection(){var t;let e=!this.focusSelectionEnabled;return e&&((t=this.disassembly)!=null&&t.isEnabled())&&this.disassembly.setEnabled(!1),e&&this.deactivateMeasurementMode(),this.focusSelectionEnabled=e,this.focusSelectionEnabled?(this.clearSelectionHighlight(),this._lastPickResult.mesh instanceof ir&&this.setFocusedObject(this._lastPickResult.mesh)):this.clearFocusedMesh(),this.markDirty(),this.focusSelectionEnabled}isFocusSelectionEnabled(){return this.focusSelectionEnabled}setWireframe(e){e!==this.wireframeEnabled&&(this.wireframeEnabled=e,this.applyWireframe(e),this.markDirty())}toggleWireframe(){return this.setWireframe(!this.wireframeEnabled),this.wireframeEnabled}applyWireframe(e){if(this.rootObject)for(let t of this.getRenderableMeshes(this.rootObject))if(e){this.wireframeOriginalMaterials.set(t.id,t.material);let r=Ws(t.material).map(s=>{if(s instanceof Mn){let a=new fs({color:s.color,transparent:s.transparent,opacity:s.opacity,side:s.side,visible:s.visible});return a.wireframe=!0,a}if("wireframe"in s){let a=s.clone();return a.wireframe=!0,a}return s});t.material=Array.isArray(t.material)?r:r[0]}else{let i=this.wireframeOriginalMaterials.get(t.id);i&&(t.material=i),this.wireframeOriginalMaterials.delete(t.id)}}toggleOrientationGizmo(){if(!this.axesHelper){this.axesHelper=new om(1.2),this.axesHelper.visible=!1;let e=this.axesHelper.material;e.depthTest=!1,e.depthWrite=!1,this.axesHelper.renderOrder=999,this.scene.add(this.axesHelper)}return this.axesHelper.visible=!this.axesHelper.visible,this.axesHelper.position.copy(this.controls.target),this.markDirty(),this.axesHelper.visible}isOrientationGizmoEnabled(){var e;return!!((e=this.axesHelper)!=null&&e.visible)}toggleBoundingBox(){var e;return this.bboxEnabled=!this.bboxEnabled,this.bboxEnabled?(this.ensureBoundingBoxHelper(),this.markDirty(),!!this.bboxHelper):((e=this.bboxHelper)==null||e.removeFromParent(),this.bboxHelper=null,this.markDirty(),!1)}hasAnimations(){return this.mixer!==null}toggleAnimation(){return this.mixer?(this.animationPlaying=!this.animationPlaying,this.mixer.timeScale=this.animationPlaying?1:0,this.markDirty(),this.animationPlaying):!1}toggleMeasurement(){var t;if(this.measurementActive)return this.deactivateMeasurementMode(),!1;(t=this.disassembly)!=null&&t.isEnabled()&&this.disassembly.setEnabled(!1);let e=this.getCurrentMeasurementTargetObject();return this.clearSelectionHighlight(),this.focusSelectionEnabled&&(this.focusSelectionEnabled=!1,this.clearFocusedMesh()),this.measurementActive=!0,this.setMeasurementTargetObject(e,!1),wf(this.renderer.domElement,this.measurementActive),this.notifyMeasurementsChanged(),this.measurementActive}isMeasurementActive(){return this.measurementActive}clearMeasurements(){this.disposeMeasurementOverlays(!1)}cancelMeasurement(){let e=!!this.pendingPoint;this.cancelPendingMeasurement(),e&&this.notifyMeasurementsChanged()}deactivateMeasurementMode(){return this.measurementActive?(this.measurementActive=!1,wf(this.renderer.domElement,!1),this.setMeasurementTargetObject(null,!1),this.cancelPendingMeasurement(),this.notifyMeasurementsChanged(),!0):!1}disposeMeasurementOverlays(e){var t;e&&(this.measurementActive=!1,wf(this.renderer.domElement,!1),this.setMeasurementTargetObject(null,!1)),this.cancelPendingMeasurement(!1);for(let i of this.measurementSegments){i.line.removeFromParent(),i.line.geometry.dispose(),i.line.material.dispose(),i.label.removeFromParent();let r=i.label.material;(t=r.map)==null||t.dispose(),r.dispose()}this.measurementSegments=[];for(let i of this.measurementMarkers){i.removeFromParent(),i.geometry.dispose();let r=i.material;if(Array.isArray(r))for(let s of r)s.dispose();else r.dispose()}this.measurementMarkers=[],this.measurementMarkerPoints=[],this.markDirty(),this.notifyMeasurementsChanged()}setMeasurementScale(e){this.measurementScale=_s(e),this.invalidateMeasurementSnapInputCache(),this.applyMeasurementModelScale(),this.updateMeasurementOverlayPositions(),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementScale(){return{...this.measurementScale}}setMeasurementUnit(e){this.measurementUnit=k_(e),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementUnit(){return this.measurementUnit}getMeasurementBounds(){var i;if(!this.rootObject)return null;let e=(i=this.measurementBaseBounds)!=null?i:$r(this.rootObject);return Xi(e)}getMeasurementRecords(){return this.createMeasurementRecords()}getMeasurementState(){return zA({active:this.measurementActive,pending:!!this.pendingPoint,records:this.createMeasurementRecords(),unit:this.measurementUnit,scale:this.getMeasurementScale(),bounds:this.getMeasurementBounds(),targetLocked:!!this.measurementTargetObject,targetName:this.getMeasurementTargetName(),snapKind:this.measurementSnapKind})}exportMeasurements(){return KA(this.createMeasurementRecords())}observeMeasurements(e){return this.measurementObservers.add(e),e(),()=>{this.measurementObservers.delete(e)}}updateMeasurementLabels(){var t,i;if(this.measurementSegments.length===0)return;let e=this.getMeasurementMarkerSize()*3.2;for(let r of this.measurementSegments){this.updateMeasurementLineGeometry(r);let s=Dm(this.createMeasurementReading(r.start,r.end));r.label.removeFromParent();let a=r.label.material;(t=a.map)==null||t.dispose(),a.dispose();let o=this.createThreeMeasurementDraftingLayout(r.start,r.end),l=(i=o==null?void 0:o.labelPosition)!=null?i:new re().addVectors(this.toMeasurementDisplayPoint(r.start),this.toMeasurementDisplayPoint(r.end)).multiplyScalar(.5);r.label=this.createMeasurementLabelSprite(s,l,e),this.scene.add(r.label)}this.markDirty()}captureMeasurementBaseState(e,t){this.measurementBaseRootScale.copy(e.scale),this.measurementBaseBounds=t?ka(t.min,t.max):null,this.measurementScale={x:1,y:1,z:1}}resetMeasurementCalibrationState(){this.measurementScale={x:1,y:1,z:1},this.measurementBaseRootScale.set(1,1,1),this.measurementBaseBounds=null,this.measurementMarkerPoints=[],this.invalidateMeasurementSnapInputCache()}applyMeasurementModelScale(){var t;if(!this.rootObject)return;this.applyRootMeasurementScale(),this.invalidateRootBoundsCache();let e=(t=this.getRootPreviewBounds())!=null?t:$r(this.rootObject);this.updateShadowFraming(e),this.bboxEnabled&&this.ensureBoundingBoxHelper(),this.removeGroundShadow(),this.removeGrid(),this.syncSceneHelpers(),this.fitCameraToObject(this.rootObject,e),this.applyRootMeasurementScale(),this.invalidateRootBoundsCache()}applyRootMeasurementScale(){if(!this.rootObject)return;let e=_s(this.measurementScale);this.rootObject.scale.set(this.measurementBaseRootScale.x*e.x,this.measurementBaseRootScale.y*e.y,this.measurementBaseRootScale.z*e.z),this.rootObject.updateMatrixWorld(!0)}getMeasurementPivot(){return this.rootObject?this.rootObject.getWorldPosition(new re):new re}toMeasurementDisplayPoint(e){let t=BA(e,this.getMeasurementPivot(),this.measurementScale);return new re(t.x,t.y,t.z)}toMeasurementBasePoint(e){let t=UA(e,this.getMeasurementPivot(),this.measurementScale);return new re(t.x,t.y,t.z)}updateMeasurementOverlayPositions(){this.updateMeasurementTargetHelper();for(let e=0;e{this.cameraZoomObservers.delete(e)}}getPerformanceSnapshot(){let e=this.smoothness.snapshot(),t=this.getQualitySnapshot();return{backend:"three",renderScale:Number(this.renderScale.toFixed(2)),quality:this.quality,pixelRatio:Number(this.renderer.getPixelRatio().toFixed(2)),interactivePixelRatioActive:this.interactivePixelRatioActive,renderDirty:this.renderDirty,renderObserverCount:this.renderObservers.size,renderObserverSettleFrames:this.renderObserverSettleFrames,frameBudgetPixelRatioScale:Number(this.frameBudgetPixelRatioScale.toFixed(2)),frameBudgetObserverStride:this.frameBudgetObserverStride,frameBudgetShadowDeferred:this.frameBudgetShadowDeferred,lastFrameDurationMs:Number(this.lastFrameDurationMs.toFixed(2)),averageRenderMs:e.averageRenderMs,p95RenderMs:e.p95RenderMs,maxRenderMs:e.maxRenderMs,renderedFrameCount:e.renderedFrameCount,slowFrameCount:e.slowFrameCount,idleFrameSkipCount:e.idleFrameSkipCount,adaptiveScaleChangeCount:e.adaptiveScaleChangeCount,viewportVisible:this.viewportVisible,disposalAudit:{...this.lastDisposalAudit},meshCount:t.geometry.meshCount,qualitySnapshot:t}}getQualitySnapshot(){let e=this.getGeometryQualityStats(),t=this.smoothness.snapshot();return{backend:"three",supportedFormats:["glb","gltf","stl","ply","obj"],colorPipeline:{outputColorSpace:String(this.renderer.outputColorSpace),toneMapping:this.renderer.toneMapping===ws?"NoToneMapping":String(this.renderer.toneMapping),textureCount:this.textureAudit.textureCount,colorTextureCount:this.textureAudit.colorTextureCount,srgbColorTextureCount:this.textureAudit.srgbColorTextureCount},geometry:e,camera:{near:Number(this.camera.near.toPrecision(6)),far:Number(this.camera.far.toPrecision(6)),nearFarRatio:Number((this.camera.far/Math.max(this.camera.near,Number.EPSILON)).toPrecision(6))},performance:{renderScale:Number(this.renderScale.toFixed(2)),pixelRatio:Number(this.renderer.getPixelRatio().toFixed(2)),frameBudgetPixelRatioScale:Number(this.frameBudgetPixelRatioScale.toFixed(2)),frameBudgetObserverStride:this.frameBudgetObserverStride,viewportVisible:this.viewportVisible,renderedFrameCount:t.renderedFrameCount,idleFrameSkipCount:t.idleFrameSkipCount,slowFrameCount:t.slowFrameCount,averageRenderMs:t.averageRenderMs,p95RenderMs:t.p95RenderMs,maxRenderMs:t.maxRenderMs,adaptiveScaleChangeCount:t.adaptiveScaleChangeCount}}}setExplode(e,t){if(!this.rootObject)return;let i=Math.abs(e)>Number.EPSILON;!i&&!this.explodeStateActive||(eV(this.rootObject,e,t),this.explodeStateActive=i,this.invalidateRootBoundsCache(),this.markShadowDirty(),this.markDirty())}resetExplode(){this.rootObject&&this.explodeStateActive&&(ZC(this.rootObject),this.explodeStateActive=!1,this.invalidateRootBoundsCache(),this.markShadowDirty(),this.markDirty())}focusWorldPoint(e){let t=new re(e.x,e.y,e.z),i=this.camera.position.distanceTo(this.controls.target),r=t.clone().sub(this.camera.position).normalize(),s=t.clone().sub(r.multiplyScalar(i));this.animateCamera(s,t)}toggleDisassembly(){if(this.ensureDisassembly(),!this.disassembly)return!1;let e=!this.disassembly.isEnabled();e&&(this.focusSelectionEnabled=!1,this.clearFocusedMesh(),this.clearSelectionHighlight(),this.deactivateMeasurementMode());let t=this.disassembly.setEnabled(e);return t||this.disassembly.reset(),t}resetDisassembly(){this.disassembly&&(this.disassembly.reset(),this.invalidateRootBoundsCache())}isDisassemblyEnabled(){var e,t;return(t=(e=this.disassembly)==null?void 0:e.isEnabled())!=null?t:!1}ensureDisassembly(){if(this.disassemblySetup||(this.disassemblySetup=!0,!this.rootObject))return;let e=this.getRenderableMeshes(this.rootObject);e.length!==0&&(this.disassembly=ZU(this.scene,this.camera,this.renderer.domElement,this.rootObject,e,this.controls,()=>{this.invalidateRootBoundsCache(),this.markShadowDirty(),this.markDirty()},this.getChildRenderableMeshMap(this.rootObject)))}animateCamera(e,t){cancelAnimationFrame(this.cameraAnimHandle);let i=this.camera.position.clone(),r=this.controls.target.clone(),s=500,a=performance.now(),o=()=>{let l=performance.now()-a,c=Math.min(1,l/s),f=c<.5?4*c*c*c:1-Math.pow(-2*c+2,3)/2;this.camera.position.lerpVectors(i,e,f),this.controls.target.lerpVectors(r,t,f),this.controls.update(),this.markDirty(),c<1&&(this.cameraAnimHandle=window.requestAnimationFrame(o))};this.cameraAnimHandle=window.requestAnimationFrame(o)}startRenderLoop(){if(this.renderHandle||!this.viewportVisible||this.contextLost)return;let e=()=>{if(!this.viewportVisible||this.contextLost){this.renderHandle=0;return}let t=this.renderNow(performance.now());this.renderHandle=t?window.requestAnimationFrame(e):0};this.renderHandle=window.requestAnimationFrame(e)}renderNow(e){var l,c,f;let t=this.renderer.domElement;if(!this.viewportVisible||!t.isConnected||t.clientWidth<=0||t.clientHeight<=0)return!1;let i=Math.max(0,(e-this.clock.last)/1e3);this.clock.last=e;let r=this.controls.update(),s=!!this.mixer&&this.animationPlaying;if(s&&this.mixer&&(this.mixer.update(i),this.markShadowDirty()),this.restoreInteractivePixelRatioIfIdle(e,r),!r&&!s&&!this.renderDirty)return this.smoothness.recordIdleFrameSkip(),this.renderObserverSettleFrames>0&&(this.renderObserverSettleFrames--,this.notifyRenderObservers()),this.shouldContinueRenderLoop(r,s);this.renderDirty=!1,this.setRenderObserverSettleFrames(),(l=this.bboxHelper)==null||l.update(),(c=this.selectionHelper)==null||c.update(),(f=this.focusHelper)==null||f.update(),this.axesHelper&&this.axesHelper.visible&&this.axesHelper.position.copy(this.controls.target);let a=performance.now();this.renderer.render(this.scene,this.camera);let o=performance.now()-a;return this.smoothness.recordRenderedFrame(o,sV),this.updateFrameBudget(o),this.notifyRenderObservers(),this.shouldContinueRenderLoop(r,s)}shouldContinueRenderLoop(e,t){return iV({cameraMoved:e,animating:t,renderDirty:this.renderDirty,renderObserverCount:this.renderObservers.size,renderObserverSettleFrames:this.renderObserverSettleFrames})}notifyRenderObservers(){if(!(this.frameBudgetObserverStride>1&&(this.frameBudgetObserverCursor=(this.frameBudgetObserverCursor+1)%this.frameBudgetObserverStride,this.frameBudgetObserverCursor!==0)))for(let e of this.renderObservers)e()}markDirty(){this.renderDirty=!0,this.startRenderLoop()}markShadowDirty(){if(!this.renderer.shadowMap.enabled){this.frameBudgetShadowDeferred=!1,this.renderer.shadowMap.needsUpdate=!1;return}if(this.shouldDeferShadowRefresh()){this.frameBudgetShadowDeferred=!0;return}this.frameBudgetShadowDeferred=!1,this.renderer.shadowMap.needsUpdate=!0}prepareInteractiveFrameBudget(){let e=performance.now();this.interactionPixelRatioDeadline=e+cce,this.activateInteractivePixelRatio()&&this.resizeRenderer()}activateInteractivePixelRatio(){if(this.interactivePixelRatioActive)return!1;let e=this.computePixelRatio(!1);return this.computePixelRatio(!0)>=e?!1:(this.interactivePixelRatioActive=!0,!0)}restoreInteractivePixelRatioIfIdle(e,t){!this.interactivePixelRatioActive||t||e=sV?(this.frameBudgetSlowStreak++,this.frameBudgetFastStreak=0):e<=dce?(this.frameBudgetFastStreak++,this.frameBudgetSlowStreak=0):(this.frameBudgetSlowStreak=0,this.frameBudgetFastStreak=0),this.frameBudgetSlowStreak>=uce){this.frameBudgetSlowStreak=0;let t=Math.max(gce,this.frameBudgetPixelRatioScale*mce);t=hce&&this.frameBudgetPixelRatioScale<1&&(this.frameBudgetFastStreak=0,this.frameBudgetPixelRatioScale=Math.min(1,this.frameBudgetPixelRatioScale*pce),this.frameBudgetObserverStride=Math.max(1,this.frameBudgetObserverStride-1),this.setRenderObserverSettleFrames(),this.smoothness.recordAdaptiveScaleChange(),this.resizeRenderer())}}resetFrameBudget(){let e=this.frameBudgetPixelRatioScale!==1||this.frameBudgetObserverStride!==1;this.frameBudgetPixelRatioScale=1,this.frameBudgetSlowStreak=0,this.frameBudgetFastStreak=0,this.frameBudgetObserverStride=1,this.frameBudgetObserverCursor=0,this.setRenderObserverSettleFrames(),e&&this.markDirty()}setRenderObserverSettleFrames(e=nV){this.renderObserverSettleFrames=this.renderObservers.size>0?e:0}shouldDeferShadowRefresh(){return this.interactivePixelRatioActive&&this.frameBudgetPixelRatioScale<=_ce}resizeRenderer(){let e=this.renderer.domElement,t=Math.max(1,Math.round(e.clientWidth||e.width||1)),i=Math.max(1,Math.round(e.clientHeight||e.height||1));this.renderer.setPixelRatio(this.computePixelRatio()),this.renderer.setSize(t,i,!1),this.camera instanceof ds?this.updateOrthographicFrustum(t/i):this.camera.aspect=t/i,this.camera.updateProjectionMatrix(),this.markDirty()}getCameraZoomRange(){if(!this.rootObject)return null;if(this.camera instanceof ds){let s=Math.max(this.initialZoom*.25,.05),a=Math.max(this.initialZoom*6,s*2),o=Number.isFinite(this.controls.minZoom)&&this.controls.minZoom>0?this.controls.minZoom:s,l=Number.isFinite(this.controls.maxZoom)&&this.controls.maxZoom>o?this.controls.maxZoom:a;return{mode:"zoom",current:Math.max(o,Math.min(this.camera.zoom,l)),min:o,max:l}}let e=this.camera.position.distanceTo(this.controls.target),t=Math.max(e*.08,1e-5),i=Number.isFinite(this.controls.minDistance)&&this.controls.minDistance>0?this.controls.minDistance:t,r=Number.isFinite(this.controls.maxDistance)&&this.controls.maxDistance>i?this.controls.maxDistance:Math.max(e*8,i*10);return{mode:"distance",current:Math.max(i,Math.min(e,r)),min:i,max:r}}notifyCameraZoomChanged(){if(this.cameraZoomObservers.size===0)return;let e=this.getCameraZoomState();for(let t of this.cameraZoomObservers)t(e)}computeOrthographicViewSpan(){var i;if(!this.rootObject)return 2;let e=(i=this.getRootPreviewBounds())!=null?i:$r(this.rootObject),t=Xi(e);return Math.max(Math.max(t.x,t.y,t.z,Number.EPSILON)*1.2,.001)}updateOrthographicFrustum(e){if(!(this.camera instanceof ds))return;let i=this.computeOrthographicViewSpan()/2,r=i*e;this.camera.left=-r,this.camera.right=r,this.camera.top=i,this.camera.bottom=-i}updateOrthographicFrustumForCamera(e,t){let r=this.computeOrthographicViewSpan()/2,s=r*t;e.left=-s,e.right=s,e.top=r,e.bottom=-r,e.updateProjectionMatrix()}switchCameraMode(e){if(this.cameraMode===e&&(e==="perspective"&&this.camera instanceof _r||e==="orthographic"&&this.camera instanceof ds))return;let t=this.renderer.domElement,i=Math.max(1,Math.round(t.clientWidth||t.width||1)),r=Math.max(1,Math.round(t.clientHeight||t.height||1)),s=i/r,a=this.camera,o=a.position.clone(),l=this.controls.target.clone(),c=a.zoom||1,f=a.near,d=a.far;if(this.scene.remove(a),e==="orthographic"){let u=new ds(-1,1,1,-1,f,d);u.position.copy(o),u.zoom=c,u.lookAt(l),this.updateOrthographicFrustumForCamera(u,s),this.camera=u}else{let u=new _r(this.initialFov,s,f,d);u.position.copy(o),u.zoom=c,u.lookAt(l),this.camera=u}this.scene.add(this.camera),this.controls.object=this.camera,this.controls.target.copy(l),this.controls.update(),this.cameraMode=e}applyCameraConfig(e){var i;let t=(i=e.mode)!=null?i:this.cameraMode;e.mode&&(this.initialCameraMode=e.mode),this.switchCameraMode(t),this.camera instanceof _r&&typeof e.fov=="number"&&Number.isFinite(e.fov)&&(this.camera.fov=e.fov,this.initialFov=e.fov),e.position&&(this.camera.position.set(...e.position),this.initialPosition.set(...e.position)),e.lookAt&&(this.controls.target.set(...e.lookAt),this.camera.lookAt(this.controls.target),this.initialTarget.set(...e.lookAt)),typeof e.near=="number"&&Number.isFinite(e.near)&&(this.camera.near=e.near),typeof e.far=="number"&&Number.isFinite(e.far)&&(this.camera.far=e.far),typeof e.zoom=="number"&&Number.isFinite(e.zoom)&&(this.camera.zoom=e.zoom,this.initialZoom=e.zoom),this.camera.updateProjectionMatrix(),this.controls.update(),this.markDirty(),this.notifyCameraZoomChanged()}applyLightConfig(e){for(let i of this.configLights)this.disposeConfiguredLight(i);this.configLights.length=0;let t=e.length>0;for(let i of this.defaultLights)i.visible=!t;for(let i of e){let r=this.createConfiguredLight(i);r&&(this.configLights.push(r),r.parent!==this.camera&&this.scene.add(r))}this.syncShadowFeatures(),this.updateShadowFraming(),this.markShadowDirty(),this.markDirty()}applySceneConfig(e){if(this.sceneConfig={...this.sceneConfig,...e},e.transparent!==void 0||e.background!==void 0)if(this.sceneConfig.transparent)this.scene.background=null,this.renderer.setClearColor(ax,0);else if(this.sceneConfig.background){let t=new ht(this.sceneConfig.background);this.scene.background=t,this.renderer.setClearColor(t,1)}else this.scene.background=ax,this.renderer.setClearColor(ax,1);typeof e.autoRotate=="boolean"&&(this.controls.autoRotate=e.autoRotate),typeof e.autoRotateSpeed=="number"&&(this.controls.autoRotateSpeed=e.autoRotateSpeed),typeof e.axis=="boolean"&&this.syncAxisHelper(e.axis),this.syncSceneHelpers(),this.syncShadowFeatures(),this.markDirty()}installDefaultLighting(){let e=new sm(16777215,.96);e.name="default-global-ambient";let t=new nm(16777215,7172736,.34);t.name="default-hemi",this.defaultLights.push(e,t);for(let i of this.defaultLights)this.scene.add(i)}installGlobalEnvironment(){this.disposeGlobalEnvironment();let e=new gm(this.renderer),t=new sA;this.environmentTarget=e.fromScene(t,.04),this.scene.environment=this.environmentTarget.texture,this.scene.environmentIntensity=.48,t.dispose(),e.dispose()}syncGlobalEnvironmentForQuality(){if(this.quality==="low"){this.cancelGlobalEnvironmentInstall(),this.disposeGlobalEnvironment(),this.markDirty();return}this.rootObject&&!this.environmentTarget&&this.scheduleGlobalEnvironmentInstall()}scheduleGlobalEnvironmentInstall(){this.quality==="low"||this.environmentTarget||this.environmentInstallHandle||(this.environmentInstallHandle=window.setTimeout(()=>{this.environmentInstallHandle=0,!(this.quality==="low"||this.contextLost||!this.rootObject)&&(this.installGlobalEnvironment(),this.markDirty())},Ece))}cancelGlobalEnvironmentInstall(){this.environmentInstallHandle&&(window.clearTimeout(this.environmentInstallHandle),this.environmentInstallHandle=0)}disposeGlobalEnvironment(){var e;this.cancelGlobalEnvironmentInstall(),this.scene.environment=null,(e=this.environmentTarget)==null||e.dispose(),this.environmentTarget=null}createConfiguredLight(e){var r,s,a,o,l,c,f;let t=e.color?new ht(e.color):new ht(16777215),i=(r=e.intensity)!=null?r:1;switch(e.type){case"ambient":return new sm(t,i);case"hemisphere":{let d=e.groundColor?new ht(e.groundColor):new ht(4473924);return new nm(t,d,i)}case"directional":{let d=new ll(t,i),u=(s=e.position)!=null?s:[-1,2,1],h=(a=e.target)!=null?a:[0,0,0];return d.position.set(...u),d.target.position.set(...h),this.scene.add(d.target),d.castShadow=!!e.castShadow,d}case"point":{let d=new vo(t,i),u=(o=e.position)!=null?o:[0,5,0];return d.position.set(...u),d.castShadow=!!e.castShadow,typeof e.decay=="number"&&(d.decay=e.decay),d}case"spot":{let d=new rc(t,i),u=(l=e.position)!=null?l:[0,5,0],h=(c=e.target)!=null?c:[0,0,0];return d.position.set(...u),d.target.position.set(...h),this.scene.add(d.target),d.angle=e.angle?e.angle*Math.PI/180:Math.PI/4,d.penumbra=(f=e.penumbra)!=null?f:.5,typeof e.decay=="number"&&(d.decay=e.decay),d.castShadow=!!e.castShadow,d}case"attachToCam":{let d=new vo(t,i);return this.camera.add(d),d}default:return null}}disposeConfiguredLight(e){(e instanceof ll||e instanceof rc)&&e.target.removeFromParent(),e.removeFromParent(),e.dispose()}prepareModelForQuality(e){let t=oU(this.renderer.capabilities.getMaxAnisotropy(),this.quality),i=new Set;for(let r of e)for(let s of Ws(r.material))i.has(s.uuid)||(i.add(s.uuid),this.prepareMaterialForQuality(s,t))}prepareMaterialForQuality(e,t){Rce(this.textureAudit,vA(e,t))}applyShadowQuality(){let e=this.shadowMapSize(),t=!1;for(let i of this.allLights())!qC(i)||!i.castShadow||(i.shadow.mapSize.set(e,e),i.shadow.bias=-12e-5,i.shadow.normalBias=.018,i.shadow.needsUpdate=!0,t=!0);t&&(this.syncShadowFeatures(),this.markShadowDirty(),this.markDirty())}updateShadowFraming(e=this.getRootPreviewBounds()){if(!this.rootObject||!e)return;let t=Er(e),i=Xi(e),r=Math.max(i.x,i.y,i.z,Number.EPSILON),s=Math.max(r*1.8,.001),a=new re(t.x,t.y,t.z),o=!1;for(let l of this.allLights())if(!(!qC(l)||!l.castShadow)){if(this.ensureMeshShadowFlags(),l.shadow.mapSize.set(this.shadowMapSize(),this.shadowMapSize()),l.shadow.bias=-12e-5,l.shadow.normalBias=.018,l instanceof ll){let c=l.position.clone().sub(l.target.position);if(c.lengthSq()<.001&&c.set(4,7,5),l.target.position.copy(a),l.target.parent||this.scene.add(l.target),l.position.copy(a).add(c.normalize().multiplyScalar(s*2.4)),l.shadow.camera instanceof ds){let f=l.shadow.camera;f.left=-s,f.right=s,f.top=s,f.bottom=-s,f.near=.1,f.far=s*5,f.updateProjectionMatrix()}}l.shadow.needsUpdate=!0,o=!0}o&&this.markShadowDirty()}shadowMapSize(){return this.quality==="low"?512:this.quality==="medium"?1024:2048}allLights(){return[...this.defaultLights,...this.configLights]}hasActiveShadowFeatures(){return!!this.sceneConfig.groundShadow||this.allLights().some(e=>qC(e)&&e.castShadow)}syncShadowFeatures(){let e=this.hasActiveShadowFeatures();if(this.renderer.shadowMap.enabled!==e&&(this.renderer.shadowMap.enabled=e),!e){this.frameBudgetShadowDeferred=!1,this.renderer.shadowMap.needsUpdate=!1;return}this.ensureMeshShadowFlags(),this.renderer.shadowMap.needsUpdate=!0}ensureMeshShadowFlags(){if(!(!this.rootObject||this.meshShadowFlagsPrepared)){for(let e of this.getRenderableObjects(this.rootObject))Sa(e)&&(e.castShadow=!0,e.receiveShadow=!0);this.meshShadowFlagsPrepared=!0}}syncSceneHelpers(){this.sceneConfig.groundShadow?this.createGroundShadow():this.removeGroundShadow(),this.sceneConfig.grid?this.createGrid():this.removeGrid(),typeof this.sceneConfig.axis=="boolean"&&this.syncAxisHelper(this.sceneConfig.axis)}syncAxisHelper(e){if(!this.axesHelper){this.axesHelper=new om(1.2);let t=this.axesHelper.material;t.depthTest=!1,t.depthWrite=!1,this.axesHelper.renderOrder=999,this.scene.add(this.axesHelper)}this.axesHelper.visible=e,this.axesHelper.position.copy(this.controls.target)}createGroundShadow(){var l;if(!this.rootObject||this.groundShadowMesh)return;this.ensureMeshShadowFlags();let e=(l=this.getRootPreviewBounds())!=null?l:$r(this.rootObject),t=Er(e),i=Xi(e),r=Math.max(i.x,i.z,Number.EPSILON),s=Math.max(r*3,.001),a=e.min.y-Math.max(s*.002,1e-5),o=new ui(new iu(s,s),new c_({color:0,opacity:sce,transparent:!0}));o.name="ai3d-ground-shadow",o.rotation.x=-Math.PI/2,o.position.set(t.x,a,t.z),o.receiveShadow=!0,o.renderOrder=-1,this.scene.add(o),this.groundShadowMesh=o}removeGroundShadow(){if(this.groundShadowMesh){this.groundShadowMesh.removeFromParent(),this.groundShadowMesh.geometry.dispose();for(let e of Ws(this.groundShadowMesh.material))e.dispose();this.groundShadowMesh=null}}createGrid(){var o;if(!this.rootObject||this.gridHelper)return;let e=(o=this.getRootPreviewBounds())!=null?o:$r(this.rootObject),t=Er(e),i=Xi(e),r=Math.max(i.x,i.z,Number.EPSILON),s=Math.max(r*2,.001),a=new __(s,20,7305093,3423046);a.name="ai3d-grid",a.position.set(t.x,e.min.y-Math.max(s*.003,1e-5),t.z);for(let l of Ws(a.material))l.transparent=!0,l.opacity=.42;this.scene.add(a),this.gridHelper=a}removeGrid(){if(this.gridHelper){this.gridHelper.removeFromParent(),this.gridHelper.geometry.dispose();for(let e of Ws(this.gridHelper.material))e.dispose();this.gridHelper=null}}dispatchPick(e){var c,f,d;if(!this.rootObject||(c=this.disassembly)!=null&&c.isEnabled())return;let t=this.renderer.domElement.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.getRenderableObjects(this.rootObject),!1)[0],r=Ff(i==null?void 0:i.object)?i.object:null,s=this.getRenderableMeshes(this.rootObject),a=this.getChildRenderableMeshMap(this.rootObject),o=r?QA(this.rootObject,r,s,a):null,l={mesh:o,pickedPoint:(d=(f=i==null?void 0:i.point)==null?void 0:f.clone())!=null?d:null,screenX:e.clientX,screenY:e.clientY,modifiers:{altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey}};if(this._lastPickResult=l,this.measurementActive&&(i!=null&&i.point)){if(e.altKey){this.setMeasurementSnapKind("free"),this.addMeasurementPoint(i.point.clone());return}if(!this.measurementTargetObject){o&&this.setMeasurementTargetObject(o);return}this.addMeasurementPoint(this.resolveMeasurementPickPoint(i.point.clone(),!1));return}this.focusSelectionEnabled&&o?(this.clearSelectionHighlight(),this.focusedObject!==o&&this.setFocusedObject(o)):this.focusSelectionEnabled?this.clearSelectionHighlight():this.updateSelectionHighlight(o),this._onPickCallbacks.forEach(u=>u(l))}clearLoadedModel(e="model-switch"){var t,i;if(this.cancelGlobalEnvironmentInstall(),(t=this.disassembly)==null||t.dispose(),this.disassembly=null,this.disassemblySetup=!1,this.explodeStateActive=!1,this.meshShadowFlagsPrepared=!1,this.invalidateMeshCache(),this.markDirty(),this.clearFocusedMesh(),this.clearSelectionHighlight(),this.disposeMeasurementOverlays(!0),this.resetMeasurementCalibrationState(),this.wireframeEnabled=!1,this.wireframeOriginalMaterials.clear(),this.stlMaterial=null,this.notifyCameraZoomChanged(),(i=this.bboxHelper)==null||i.removeFromParent(),this.bboxHelper=null,this.bboxEnabled=!1,this.removeGroundShadow(),this.removeGrid(),this.mixer=null,this.animationPlaying=!1,!this.rootObject){this.lastDisposalAudit={reason:e,meshCount:0,geometryCount:0,materialCount:0,textureCount:0,objectCount:0,timestamp:performance.now()};return}this.scene.remove(this.rootObject),this.lastDisposalAudit=this.disposeObjectGraph(this.rootObject,e),this.rootObject=null,this.invalidateMeshCache(),this.markShadowDirty()}disposeObjectGraph(e,t){var c;let i=new Set,r=new Set,s=new Set,a=0,o=0,l=f=>{Sa(f)&&a++;let d=f.geometry;d&&!i.has(d.uuid)&&(d.dispose(),i.add(d.uuid));for(let u of Ws(f.material))this.disposeMaterialWithTextures(u,r,s)};if(this.cachedRenderables&&this.cachedRenderableRoot===e){o=(c=this.cachedRenderableObjectCount)!=null?c:this.cachedRenderables.length;for(let f of this.cachedRenderables)l(f)}else e.traverse(f=>{o++,Ff(f)&&l(f)});return{reason:t,meshCount:a,geometryCount:i.size,materialCount:r.size,textureCount:s.size,objectCount:o,timestamp:performance.now()}}disposeMaterialWithTextures(e,t,i){if(t.has(e.uuid))return;let r=e;for(let s of Object.values(r))if(s instanceof Pr&&!i.has(s.uuid))s.dispose(),i.add(s.uuid);else if(Array.isArray(s))for(let a of s)a instanceof Pr&&!i.has(a.uuid)&&(a.dispose(),i.add(a.uuid));e.dispose(),t.add(e.uuid)}fitCameraToObject(e,t){var l;let i=(l=t!=null?t:this.getRootPreviewBounds(e))!=null?l:$r(e),r=RU(i);this.initialTarget.set(r.target.x,r.target.y,r.target.z),this.initialPosition.set(r.position.x,r.position.y,r.position.z),this.initialFov=45;let s=Xi(i),a=Math.max(s.x,s.y,s.z,Number.EPSILON),o=this.initialPosition.distanceTo(this.initialTarget);this.controls.minDistance=Math.max(r.near*4,a*.02,1e-5),this.controls.maxDistance=Math.max(o*8,this.controls.minDistance*10),this.controls.minZoom=.25,this.controls.maxZoom=8,this.raycaster.params.Points={threshold:Math.max(a*.01,1e-5)},this.raycaster.params.Line={threshold:Math.max(a*.002,1e-5)},this.occlusionRaycaster.params.Points={threshold:Math.max(a*.006,1e-5)},this.occlusionRaycaster.params.Line={threshold:Math.max(a*.001,1e-5)},this.resetView(),this.axesHelper&&(this.axesHelper.position.copy(this.controls.target),this.axesHelper.scale.setScalar(Math.max(a*.25,5e-4))),this.camera.near=r.near,this.camera.far=r.far,this.camera.updateProjectionMatrix(),this.markDirty(),this.notifyCameraZoomChanged()}getAnnotationCameraStateKey(){return OA([{value:this.camera.position.x,digits:3},{value:this.camera.position.y,digits:3},{value:this.camera.position.z,digits:3},{value:this.controls.target.x,digits:2},{value:this.controls.target.y,digits:2},{value:this.controls.target.z,digits:2},{value:this.camera instanceof _r?this.camera.fov:this.camera.zoom,digits:this.camera instanceof _r?2:3}])}projectAnnotationWorldPoint(e,t){let i=this.renderer.domElement;return!i.isConnected||i.clientWidth===0||i.clientHeight===0?!1:(this.scene.updateMatrixWorld(),this.camera.updateMatrixWorld(),this.annotationProjection.set(e.x,e.y,e.z).project(this.camera),PU(this.annotationProjection,i,t))}isAnnotationWorldPointOccluded(e){if(!this.rootObject)return!1;let t=Of(ei(this.camera.position),e);if(!t)return!1;this.rootObject.updateWorldMatrix(!0,!0),this.annotationDirection.set(t.direction.x,t.direction.y,t.direction.z),this.occlusionRaycaster.set(this.camera.position,this.annotationDirection),this.occlusionRaycaster.far=t.distance;let i=this.occlusionRaycaster.intersectObjects(this.getRenderableObjects(this.rootObject),!1)[0];return!!i&&Lf(i.distance,t.distance,t.epsilon)}getRenderableMeshes(e){if(this.cachedMeshes&&this.cachedMeshRoot===e)return this.cachedMeshes;let t=[];return e.traverse(i=>{Sa(i)&&i.geometry&&t.push(i)}),this.cachedMeshes=t,this.cachedMeshRoot=e,t}getRenderableObjects(e){if(this.cachedRenderables&&this.cachedRenderableRoot===e)return this.cachedRenderables;let t=[],i=0;return e.traverse(r=>{i++,Ff(r)&&r.geometry&&t.push(r)}),this.cachedRenderables=t,this.cachedRenderableRoot=e,this.cachedRenderableObjectCount=i,t}getChildRenderableMeshMap(e){return this.cachedChildMeshMap&&this.cachedChildMeshMapRoot===e?this.cachedChildMeshMap:(this.cachedChildMeshMap=wm(e,this.getRenderableMeshes(e)),this.cachedChildMeshMapRoot=e,this.cachedChildMeshMap)}getRenderableBoundsMap(e){return this.cachedRenderableBoundsMap&&this.cachedRenderableBoundsMapRoot===e?this.cachedRenderableBoundsMap:(this.cachedRenderableBoundsMap=kU(this.getRenderableObjects(e)),this.cachedRenderableBoundsMapRoot=e,this.cachedRenderableBoundsMap)}getGeometryQualityStats(){var e;return this.rootObject?(this.cachedGeometryQualityStats||(this.cachedGeometryQualityStats=KU(this.rootObject,this.getRenderableObjects(this.rootObject),(e=this.getRootPreviewBounds())!=null?e:void 0,this.getRenderableBoundsMap(this.rootObject))),this.cachedGeometryQualityStats):{meshCount:0,pointCloudCount:0,smallPartCount:0,smallestPartSpan:null,modelSpan:null}}invalidateMeshCache(){this.cachedMeshes=null,this.cachedMeshRoot=null,this.cachedRenderables=null,this.cachedRenderableRoot=null,this.cachedRenderableObjectCount=null,this.cachedChildMeshMap=null,this.cachedChildMeshMapRoot=null,this.cachedRenderableBoundsMap=null,this.cachedRenderableBoundsMapRoot=null,this.invalidateRootBoundsCache()}invalidateRootBoundsCache(){this.cachedRootPreviewBounds=null,this.cachedRootPreviewBoundsObject=null,this.cachedRenderableBoundsMap=null,this.cachedRenderableBoundsMapRoot=null,this.cachedGeometryQualityStats=null}getRootPreviewBounds(e=this.rootObject){return e?this.cachedRootPreviewBounds&&this.cachedRootPreviewBoundsObject===e?this.cachedRootPreviewBounds:(this.cachedRootPreviewBounds=$r(e),this.cachedRootPreviewBoundsObject=e,this.cachedRootPreviewBounds):null}ensureBoundingBoxHelper(){var e;this.rootObject&&((e=this.bboxHelper)==null||e.removeFromParent(),this.bboxHelper=new cl(this.rootObject,16436245),this.scene.add(this.bboxHelper))}updateSelectionHighlight(e){var t;if(!this.rootObject||!e){this.clearSelectionHighlight();return}this.highlightedObject===e&&this.selectionHelper||((t=this.selectionHelper)==null||t.removeFromParent(),this.selectionHelper=new cl(e,4890367),this.scene.add(this.selectionHelper),this.highlightedObject=e,this.markDirty())}setFocusedObject(e){var r,s;if(!this.rootObject||!e){this.clearFocusedMesh();return}if(this.focusedObject===e)return;let t=this.getRenderableMeshes(this.rootObject),i=Sa(e)?[e]:(r=this.getChildRenderableMeshMap(this.rootObject).get(e))!=null?r:[];if(i.length===0&&!Ff(e)){this.clearFocusedMesh();return}this.originalMaterials.size===0?this.applyInitialFocusMaterials(t,i):this.applyFocusSelectionDelta(i),(s=this.focusHelper)==null||s.removeFromParent(),this.focusHelper=new cl(e,3065087),this.scene.add(this.focusHelper),this.focusedObject=e,this.focusedSelectedMeshes.clear();for(let a of i)this.focusedSelectedMeshes.set(a.id,a);this.markDirty()}clearFocusedMesh(){var e;this.restoreFocusedMaterials(),this.disposeFocusDimMaterials(),this.originalMaterials.clear(),this.focusedSelectedMeshes.clear(),(e=this.focusHelper)==null||e.removeFromParent(),this.focusHelper=null,this.focusedObject=null,this.markDirty()}restoreFocusedMaterials(){if(this.rootObject)for(let e of this.getRenderableMeshes(this.rootObject)){let t=this.originalMaterials.get(e.id);t&&(e.material=t)}}applyInitialFocusMaterials(e,t){let i=new Set(t.map(r=>r.id));for(let r of e)this.originalMaterials.set(r.id,r.material),!i.has(r.id)&&(r.material=this.focusDimMaterialCache.get(r.material))}applyFocusSelectionDelta(e){var i,r;let t=new Set(e.map(s=>s.id));for(let[s,a]of this.focusedSelectedMeshes){if(t.has(s))continue;let o=(i=this.originalMaterials.get(s))!=null?i:a.material;this.originalMaterials.has(s)||this.originalMaterials.set(s,o),a.material=this.focusDimMaterialCache.get(o)}for(let s of e){let a=(r=this.originalMaterials.get(s.id))!=null?r:s.material;this.originalMaterials.has(s.id)||this.originalMaterials.set(s.id,a),s.material=a}}disposeFocusDimMaterials(){this.focusDimMaterialCache.clear()}clearSelectionHighlight(){var e;(e=this.selectionHelper)==null||e.removeFromParent(),this.selectionHelper=null,this.highlightedObject=null,this.markDirty()}setMeasurementTargetObject(e,t=!0){this.clearMeasurementTargetHelper(!1),this.invalidateMeasurementSnapInputCache();let i=e&&this.isObjectInLoadedRoot(e)?e:null;this.measurementTargetObject=i,this.setMeasurementSnapKind(null,!1),i&&(this.measurementTargetHelper=new cl(i,6333946),this.scene.add(this.measurementTargetHelper)),this.markDirty(),t&&this.notifyMeasurementsChanged()}clearMeasurementTargetHelper(e=!0){var t;(t=this.measurementTargetHelper)==null||t.removeFromParent(),this.measurementTargetHelper=null,e&&this.markDirty()}updateMeasurementTargetHelper(){!this.measurementTargetHelper||!this.measurementTargetObject||this.measurementTargetHelper.update()}invalidateMeasurementSnapInputCache(){this.measurementSnapInputCache=null,this.measurementSnapInputCacheTarget=null}setMeasurementSnapKind(e,t=!0){this.measurementSnapKind!==e&&(this.measurementSnapKind=e,t&&this.notifyMeasurementsChanged())}getCurrentMeasurementTargetObject(){var t,i;if(!this.rootObject)return null;let e=(i=(t=this.focusedObject)!=null?t:this.highlightedObject)!=null?i:QC(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;return!e||!this.isObjectInLoadedRoot(e)?null:e}isObjectInLoadedRoot(e){if(!this.rootObject)return!1;let t=e;for(;t;){if(t===this.rootObject)return!0;t=t.parent}return!1}getMeasurementTargetName(){let e=this.measurementTargetObject;return!e||!this.isObjectInLoadedRoot(e)?null:Ea(e,e.type||`object-${e.id}`)}getMeasurementTargetBounds(){let e=this.measurementTargetObject;return!e||!this.isObjectInLoadedRoot(e)?null:(e.updateWorldMatrix(!0,!0),$r(e))}resolveMeasurementPickPoint(e,t){if(t)return this.setMeasurementSnapKind("free"),e;let i=this.createMeasurementGeometrySnapInput();if(!i)return this.setMeasurementSnapKind("free"),e;let r=VA(this.toMeasurementPoint(e),i);return r?(this.setMeasurementSnapKind(r.kind),new re(r.point.x,r.point.y,r.point.z)):(this.setMeasurementSnapKind("free"),e)}createMeasurementGeometrySnapInput(){var c,f;let e=this.measurementTargetObject;if(!e||!this.isObjectInLoadedRoot(e))return null;if(this.measurementSnapInputCache&&this.measurementSnapInputCacheTarget===e)return this.measurementSnapInputCache;let t=this.getMeasurementTargetRenderables();if(t.length===0)return null;let i=[],r=[],s=`three:${e.id}`;for(let d of t){let u=d.geometry.getAttribute("position");if(!u||u.count<=0)continue;d.updateWorldMatrix(!0,!1);let h=[];for(let m=0;m{Ff(r)&&r.geometry&&t.has(r)&&i.push(r)}),i}createThreeMeasurementDraftingLayout(e,t){let i=this.toMeasurementDisplayPoint(e),r=this.toMeasurementDisplayPoint(t),s=this.getMeasurementMarkerSize(),a=this.camera.getWorldPosition(new re),o=new re(0,1,0).applyQuaternion(this.camera.quaternion).normalize(),l=WA(this.toMeasurementPoint(i),this.toMeasurementPoint(r),{viewPosition:this.toMeasurementPoint(a),viewUp:this.toMeasurementPoint(o),offset:s*4.2,extensionGap:s*.55,extensionOvershoot:s*.8,arrowLength:s*2.35,arrowWidth:s*.78,labelGap:s*1.05});return l?{linePoints:l.lineSegments.flatMap(([f,d])=>[new re(f.x,f.y,f.z),new re(d.x,d.y,d.z)]),labelPosition:new re(l.labelPoint.x,l.labelPoint.y,l.labelPoint.z)}:null}getMeasurementMarkerSize(){var r;if(!this.rootObject)return .02;let e=(r=this.getRootPreviewBounds())!=null?r:$r(this.rootObject),t=Xi(e);return Math.max(t.x,t.y,t.z,.001)*.018}cancelPendingMeasurement(e=!0){var r,s;let t=this.pendingMarker,i=(s=(r=this.pendingPoint)==null?void 0:r.clone())!=null?s:null;if(this.pendingPoint=null,this.pendingMarker=null,this.hoveredMarkerIndex=-1,this.removePreviewLine(),t&&i&&!this.isMeasurementPointUsed(i)){let a=this.measurementMarkers.indexOf(t);a>=0&&(this.measurementMarkers.splice(a,1),this.measurementMarkerPoints.splice(a,1)),this.disposeMeasurementMarker(t)}else t&&(t.scale.setScalar(1),t.material.color.setHex(Y_));e&&this.markDirty()}isMeasurementPointUsed(e){return this.measurementSegments.some(t=>t.start.distanceTo(e)<1e-4||t.end.distanceTo(e)<1e-4)}disposeMeasurementMarker(e){e.removeFromParent(),e.geometry.dispose();let t=e.material;if(Array.isArray(t))for(let i of t)i.dispose();else t.dispose()}findNearestMarkerIndex(e){let t=this.getMeasurementMarkerSize()*2.5,i=this.toMeasurementDisplayPoint(e);for(let r=0;r=0?this.measurementMarkerPoints[i].clone():t;if(this.pendingPoint){if(r.distanceTo(this.pendingPoint)<1e-4)return;if(i<0){let s=this.getMeasurementMarkerSize(),a=new im(s*.38,12,12),o=new fs({color:Y_,depthTest:!1,transparent:!0,opacity:.48}),l=new ui(a,o);l.position.copy(this.toMeasurementDisplayPoint(r)),l.renderOrder=999,this.scene.add(l),this.measurementMarkers.push(l),this.measurementMarkerPoints.push(r.clone())}this.createMeasurementSegment(this.pendingPoint,r),this.pendingMarker&&(this.pendingMarker.scale.setScalar(1),this.pendingMarker.material.color.setHex(Y_)),this.pendingPoint=null,this.pendingMarker=null,this.removePreviewLine()}else{if(i<0){let s=this.getMeasurementMarkerSize(),a=new im(s*.38,12,12),o=new fs({color:Y_,depthTest:!1,transparent:!0,opacity:.48}),l=new ui(a,o);l.position.copy(this.toMeasurementDisplayPoint(r)),l.renderOrder=999,this.scene.add(l),this.measurementMarkers.push(l),this.measurementMarkerPoints.push(r.clone()),this.pendingMarker=l}else this.pendingMarker=this.measurementMarkers[i];this.pendingMarker.scale.setScalar(1.6),this.pendingMarker.material.color.setHex(Tce),this.pendingPoint=r,this.ensurePreviewLine()}this.markDirty(),this.notifyMeasurementsChanged()}createMeasurementSegment(e,t){var u,h;let i=this.createThreeMeasurementDraftingLayout(e,t),r=this.toMeasurementDisplayPoint(e),s=this.toMeasurementDisplayPoint(t),a=(u=i==null?void 0:i.linePoints)!=null?u:[r,s],o=new Hi().setFromPoints(a),l=new Cs(o,new Gn({color:Sce,transparent:!0,opacity:1,depthTest:!1,depthWrite:!1}));l.renderOrder=998,this.scene.add(l);let c=Dm(this.createMeasurementReading(e,t)),f=(h=i==null?void 0:i.labelPosition)!=null?h:new re().addVectors(r,s).multiplyScalar(.5),d=this.createMeasurementLabelSprite(c,f,this.getMeasurementMarkerSize()*3.2);this.scene.add(d),this.measurementSegments.push({start:e.clone(),end:t.clone(),line:l,label:d})}createMeasurementLabelSprite(e,t,i){let r=gu("canvas"),s=r.getContext("2d");r.width=oc.width,r.height=oc.height,YA(s,e,r.width,r.height);let a=new o_(r),o=new $h({map:a,depthTest:!1,depthWrite:!1,transparent:!0}),l=new i_(o);return l.position.copy(t),l.scale.set(i*3.7,i*1.08,1),l.renderOrder=1e3,l}ensurePreviewLine(){if(this.previewLine)return;let e=new Hi().setFromPoints(Array.from({length:14},()=>new re));this.previewLine=new Cs(e,new Gn({color:xce,transparent:!0,opacity:.82,depthTest:!1,depthWrite:!1})),this.previewLine.renderOrder=997,this.scene.add(this.previewLine)}updatePreviewLine(){var l;if(this.previewLineUpdateHandle=0,!this.pendingPoint||!this.previewLine||!this.rootObject)return;let e=this.toMeasurementDisplayPoint(this.pendingPoint),t=this.renderer.domElement.getBoundingClientRect();this.pointer.x=(this.lastPointerClient.x-t.left)/t.width*2-1,this.pointer.y=-((this.lastPointerClient.y-t.top)/t.height)*2+1,this.raycaster.setFromCamera(this.pointer,this.camera);let i=this.raycaster.intersectObjects(this.getRenderableObjects(this.rootObject),!1)[0],r;i!=null&&i.point?r=this.resolveMeasurementPickPoint(i.point.clone(),this.lastPointerClient.altKey):r=e.clone().add(this.raycaster.ray.direction.clone().multiplyScalar(5));let s=this.createThreeMeasurementDraftingLayout(this.pendingPoint,this.toMeasurementBasePoint(r)),a=(l=s==null?void 0:s.linePoints)!=null?l:[e,r],o=this.previewLine.geometry.getAttribute("position");if(o.count!==a.length)this.previewLine.geometry.dispose(),this.previewLine.geometry=new Hi().setFromPoints(a);else{for(let c=0;cthis.updatePreviewLine()))}cancelPreviewLineUpdate(){this.previewLineUpdateHandle&&(window.cancelAnimationFrame(this.previewLineUpdateHandle),this.previewLineUpdateHandle=0)}removePreviewLine(){this.cancelPreviewLineUpdate(),this.previewLine&&(this.previewLine.removeFromParent(),this.previewLine.geometry.dispose(),this.previewLine.material.dispose(),this.previewLine=null)}createMeasurementReading(e,t){return XA(this.toMeasurementPoint(e),this.toMeasurementPoint(t),this.measurementScale,this.measurementUnit)}createMeasurementRecords(){return this.measurementSegments.map((e,t)=>({index:t+1,start:this.toMeasurementPoint(e.start),end:this.toMeasurementPoint(e.end),reading:this.createMeasurementReading(e.start,e.end)}))}toMeasurementPoint(e){return{x:e.x,y:e.y,z:e.z}}notifyMeasurementsChanged(){for(let e of Array.from(this.measurementObservers))e()}}});var Mce,$C,JC,ie,vi=y(()=>{Mce=typeof WeakRef!="undefined",$C=class{constructor(e,t=!1,i,r){this.initialize(e,t,i,r)}initialize(e,t=!1,i,r){return this.mask=e,this.skipNextObservers=t,this.target=i,this.currentTarget=r,this}},JC=class{constructor(e,t,i=null){this.callback=e,this.mask=t,this.scope=i,this._willBeUnregistered=!1,this.unregisterOnNextCall=!1,this._remove=null}remove(e=!1){this._remove&&this._remove(e)}},ie=class n{static FromPromise(e,t){let i=new n;return e.then(r=>{i.notifyObservers(r)}).catch(r=>{if(t)t.notifyObservers(r);else throw r}),i}get observers(){return this._observers}constructor(e,t=!1){this.notifyIfTriggered=t,this._observers=new Array,this._numObserversMarkedAsDeleted=0,this._hasNotified=!1,this._eventState=new $C(0),e&&(this._onObserverAdded=e)}add(e,t=-1,i=!1,r=null,s=!1){if(!e)return null;let a=new JC(e,t,r);a.unregisterOnNextCall=s,i?this._observers.unshift(a):this._observers.push(a),this._onObserverAdded&&this._onObserverAdded(a),this._hasNotified&&this.notifyIfTriggered&&this._lastNotifiedValue!==void 0&&this.notifyObserver(a,this._lastNotifiedValue);let o=Mce?new WeakRef(this):{deref:()=>this};return a._remove=(l=!1)=>{let c=o.deref();c&&(l?c.remove(a):c._remove(a))},a}addOnce(e){return this.add(e,void 0,void 0,void 0,!0)}remove(e){return e?(e._remove=null,this._observers.indexOf(e)!==-1?(this._deferUnregister(e),!0):!1):!1}removeCallback(e,t){for(let i=0;i{this._remove(e)},0))}_remove(e,t=!0){if(!e)return!1;let i=this._observers.indexOf(e);return i!==-1?(t&&this._numObserversMarkedAsDeleted--,this._observers.splice(i,1),!0):!1}makeObserverTopPriority(e){this._remove(e,!1),this._observers.unshift(e)}makeObserverBottomPriority(e){this._remove(e,!1),this._observers.push(e)}notifyObservers(e,t=-1,i,r,s){if(this.notifyIfTriggered&&(this._hasNotified=!0,this._lastNotifiedValue=e),!this._observers.length)return!0;let a=this._eventState;a.mask=t,a.target=i,a.currentTarget=r,a.skipNextObservers=!1,a.lastReturnValue=e,a.userInfo=s;for(let o of this._observers)if(!o._willBeUnregistered&&(o.mask&t&&(o.unregisterOnNextCall&&this._deferUnregister(o),o.scope?a.lastReturnValue=o.callback.apply(o.scope,[e,a]):a.lastReturnValue=o.callback(e,a)),a.skipNextObservers))return!1;return!0}notifyObserver(e,t,i=-1){if(this.notifyIfTriggered&&(this._hasNotified=!0,this._lastNotifiedValue=t),e._willBeUnregistered)return;let r=this._eventState;r.mask=i,r.skipNextObservers=!1,e.unregisterOnNextCall&&this._deferUnregister(e),e.callback(t,r)}hasObservers(){return this._observers.length-this._numObserversMarkedAsDeleted>0}clear(){for(;this._observers.length;){let e=this._observers.pop();e&&(e._remove=null)}this._onObserverAdded=null,this._numObserversMarkedAsDeleted=0,this.cleanLastNotifiedState()}cleanLastNotifiedState(){this._hasNotified=!1,this._lastNotifiedValue=void 0}clone(){let e=new n;return e._observers=this._observers.slice(0),e}hasSpecificMask(e=-1){for(let t of this._observers)if(t.mask&e||t.mask===e)return!0;return!1}}});var lx,fV=y(()=>{lx=class{get wrapU(){return this._cachedWrapU}set wrapU(e){this._cachedWrapU=e}get wrapV(){return this._cachedWrapV}set wrapV(e){this._cachedWrapV=e}get wrapR(){return this._cachedWrapR}set wrapR(e){this._cachedWrapR=e}get anisotropicFilteringLevel(){return this._cachedAnisotropicFilteringLevel}set anisotropicFilteringLevel(e){this._cachedAnisotropicFilteringLevel=e}get comparisonFunction(){return this._comparisonFunction}set comparisonFunction(e){this._comparisonFunction=e}get useMipMaps(){return this._useMipMaps}set useMipMaps(e){this._useMipMaps=e}constructor(){this.samplingMode=-1,this._useMipMaps=!0,this._cachedWrapU=null,this._cachedWrapV=null,this._cachedWrapR=null,this._cachedAnisotropicFilteringLevel=null,this._comparisonFunction=0}setParameters(e=1,t=1,i=1,r=1,s=2,a=0){return this._cachedWrapU=e,this._cachedWrapV=t,this._cachedWrapR=i,this._cachedAnisotropicFilteringLevel=r,this.samplingMode=s,this._comparisonFunction=a,this}compareSampler(e){return this._cachedWrapU===e._cachedWrapU&&this._cachedWrapV===e._cachedWrapV&&this._cachedWrapR===e._cachedWrapR&&this._cachedAnisotropicFilteringLevel===e._cachedAnisotropicFilteringLevel&&this.samplingMode===e.samplingMode&&this._comparisonFunction===e._comparisonFunction&&this._useMipMaps===e._useMipMaps}}});var dV,Vi,zs=y(()=>{vi();fV();(function(n){n[n.Unknown=0]="Unknown",n[n.Url=1]="Url",n[n.Temp=2]="Temp",n[n.Raw=3]="Raw",n[n.Dynamic=4]="Dynamic",n[n.RenderTarget=5]="RenderTarget",n[n.MultiRenderTarget=6]="MultiRenderTarget",n[n.Cube=7]="Cube",n[n.CubeRaw=8]="CubeRaw",n[n.CubePrefiltered=9]="CubePrefiltered",n[n.Raw3D=10]="Raw3D",n[n.Raw2DArray=11]="Raw2DArray",n[n.DepthStencil=12]="DepthStencil",n[n.CubeRawRGBD=13]="CubeRawRGBD",n[n.Depth=14]="Depth"})(dV||(dV={}));Vi=class n extends lx{get useMipMaps(){return this._useMipMaps===null?this.generateMipMaps:this._useMipMaps}set useMipMaps(e){this._useMipMaps=e}get uniqueId(){return this._uniqueId}_setUniqueId(e){this._uniqueId=e}getEngine(){return this._engine}get source(){return this._source}constructor(e,t,i=!1){super(),this.isReady=!1,this.isCube=!1,this.is3D=!1,this.is2DArray=!1,this.isMultiview=!1,this.url="",this.generateMipMaps=!1,this._useMipMaps=null,this.mipLevelCount=1,this.samples=0,this.type=-1,this.format=-1,this.onLoadedObservable=new ie,this.onErrorObservable=new ie,this.onRebuildCallback=null,this.width=0,this.height=0,this.depth=0,this.baseWidth=0,this.baseHeight=0,this.baseDepth=0,this.invertY=!1,this._invertVScale=!1,this._associatedChannel=-1,this._source=0,this._buffer=null,this._bufferView=null,this._bufferViewArray=null,this._bufferViewArrayArray=null,this._size=0,this._extension="",this._files=null,this._workingCanvas=null,this._workingContext=null,this._cachedCoordinatesMode=null,this._isDisabled=!1,this._compression=null,this._sphericalPolynomial=null,this._sphericalPolynomialPromise=null,this._sphericalPolynomialComputed=!1,this._lodGenerationScale=0,this._lodGenerationOffset=0,this._useSRGBBuffer=!1,this._creationFlags=0,this._lodTextureHigh=null,this._lodTextureMid=null,this._lodTextureLow=null,this._isRGBD=!1,this._linearSpecularLOD=!1,this._irradianceTexture=null,this._hardwareTexture=null,this._maxLodLevel=null,this._references=1,this._gammaSpace=null,this._premulAlpha=!1,this._dynamicTextureSource=null,this._autoMSAAManagement=!1,this._engine=e,this._source=t,this._uniqueId=n._Counter++,i||(this._hardwareTexture=e._createHardwareTexture())}incrementReferences(){this._references++}updateSize(e,t,i=1){this._engine.updateTextureDimensions(this,e,t,i),this.width=e,this.height=t,this.depth=i,this.baseWidth=e,this.baseHeight=t,this.baseDepth=i,this._size=e*t*i}_rebuild(){var t,i;if(this.isReady=!1,this._cachedCoordinatesMode=null,this._cachedWrapU=null,this._cachedWrapV=null,this._cachedWrapR=null,this._cachedAnisotropicFilteringLevel=null,this.onRebuildCallback){let r=this.onRebuildCallback(this),s=a=>{a._swapAndDie(this,!1),this.isReady=r.isReady};r.isAsync?r.proxy.then(s):s(r.proxy);return}let e;switch(this.source){case 2:break;case 1:e=this._engine.createTexture((t=this._originalUrl)!=null?t:this.url,!this.generateMipMaps,this.invertY,null,this.samplingMode,r=>{r._swapAndDie(this,!1),this.isReady=!0},null,this._buffer,void 0,this.format,this._extension,void 0,void 0,void 0,this._useSRGBBuffer);return;case 3:if(e=this._engine.createRawTexture(this._bufferView,this.baseWidth,this.baseHeight,this.format,this.generateMipMaps,this.invertY,this.samplingMode,this._compression,this.type,this._creationFlags,this._useSRGBBuffer,this.mipLevelCount),e._swapAndDie(this,!1),this._bufferViewArray)for(let r=0;r{e._swapAndDie(this,!1),this.isReady=!0},null,this.format,this._extension,!1,0,0,null,void 0,this._useSRGBBuffer,ArrayBuffer.isView(this._buffer)?this._buffer:null);return;case 8:e=this._engine.createRawCubeTexture(this._bufferViewArray,this.width,(i=this._originalFormat)!=null?i:this.format,this.type,this.generateMipMaps,this.invertY,this.samplingMode,this._compression),e._swapAndDie(this,!1),this.isReady=!0;break;case 13:return;case 9:e=this._engine.createPrefilteredCubeTexture(this.url,null,this._lodGenerationScale,this._lodGenerationOffset,r=>{r&&r._swapAndDie(this,!1),this.isReady=!0},null,this.format,this._extension),e._sphericalPolynomial=this._sphericalPolynomial;return;case 12:case 14:break}}_swapAndDie(e,t=!0){var s;(s=this._hardwareTexture)==null||s.setUsage(e._source,this.generateMipMaps,this.is2DArray,this.isCube,this.is3D,this.width,this.height,this.depth),e._hardwareTexture=this._hardwareTexture,t&&(e._isRGBD=this._isRGBD),this._lodTextureHigh&&(e._lodTextureHigh&&e._lodTextureHigh.dispose(),e._lodTextureHigh=this._lodTextureHigh),this._lodTextureMid&&(e._lodTextureMid&&e._lodTextureMid.dispose(),e._lodTextureMid=this._lodTextureMid),this._lodTextureLow&&(e._lodTextureLow&&e._lodTextureLow.dispose(),e._lodTextureLow=this._lodTextureLow),this._irradianceTexture&&(e._irradianceTexture&&e._irradianceTexture.dispose(),e._irradianceTexture=this._irradianceTexture);let i=this._engine.getLoadedTexturesCache(),r=i.indexOf(this);r!==-1&&i.splice(r,1),r=i.indexOf(e),r===-1&&i.push(e)}dispose(){this._references--,this._references===0&&(this.onLoadedObservable.clear(),this.onErrorObservable.clear(),this._engine._releaseTexture(this),this._hardwareTexture=null,this._dynamicTextureSource=null)}};Vi._Counter=0});var Oe,Gi=y(()=>{vi();Oe=class{static get LastCreatedEngine(){return this.Instances.length===0?null:this.Instances[this.Instances.length-1]}static get LastCreatedScene(){return this._LastCreatedScene}};Oe.Instances=[];Oe.OnEnginesDisposedObservable=new ie;Oe._LastCreatedScene=null;Oe.UseFallbackTexture=!0;Oe.FallbackTexture=""});var ee,Lt=y(()=>{ee=class n{static _CheckLimit(e,t){let i=n._LogLimitOutputs[e];return i?i.current++:(i={limit:t,current:1},n._LogLimitOutputs[e]=i),i.current<=i.limit}static _GenerateLimitMessage(e,t=1){var s;let i=n._LogLimitOutputs[e];if(!i||!n.MessageLimitReached)return;let r=this._Levels[t];i.current===i.limit&&n[r.name](n.MessageLimitReached.replace(/%LIMIT%/g,""+i.limit).replace(/%TYPE%/g,(s=r.name)!=null?s:""))}static _AddLogEntry(e){n._LogCache=e+n._LogCache,n.OnNewCacheEntry&&n.OnNewCacheEntry(e)}static _FormatMessage(e){let t=r=>r<10?"0"+r:""+r,i=new Date;return"["+t(i.getHours())+":"+t(i.getMinutes())+":"+t(i.getSeconds())+"]: "+e}static _LogDisabled(e,t){}static _LogEnabled(e=1,t,i){let r=Array.isArray(t)?t[0]:t;if(i!==void 0&&!n._CheckLimit(r,i))return;let s=n._FormatMessage(r),a=this._Levels[e],o=Array.isArray(t)?t.slice(1):[];a.logFunc&&a.logFunc("BJS - "+s,...o);let l=`
${s}

`;n._AddLogEntry(l),n._GenerateLimitMessage(r,e)}static get LogCache(){return n._LogCache}static ClearLogCache(){n._LogCache="",n._LogLimitOutputs={},n.errorsCount=0}static set LogLevels(e){n.Log=n._LogDisabled,n.Warn=n._LogDisabled,n.Error=n._LogDisabled;let t=[n.MessageLogLevel,n.WarningLogLevel,n.ErrorLogLevel];for(let i of t)if((e&i)===i){let r=this._Levels[i];n[r.name]=n._LogEnabled.bind(n,i)}}};ee.NoneLogLevel=0;ee.MessageLogLevel=1;ee.WarningLogLevel=2;ee.ErrorLogLevel=4;ee.AllLogLevel=7;ee.MessageLimitReached="Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.";ee._LogCache="";ee._LogLimitOutputs={};ee._Levels=[{},{color:"white",logFunc:console.log,name:"Log"},{color:"orange",logFunc:console.warn,name:"Warn"},{},{color:"red",logFunc:console.error,name:"Error"}];ee.errorsCount=0;ee.Log=ee._LogEnabled.bind(ee,ee.MessageLogLevel);ee.Warn=ee._LogEnabled.bind(ee,ee.WarningLogLevel);ee.Error=ee._LogEnabled.bind(ee,ee.ErrorLogLevel)});var x,W=y(()=>{x=class n{static GetShadersRepository(e=0){return e===0?n.ShadersRepository:n.ShadersRepositoryWGSL}static GetShadersStore(e=0){return e===0?n.ShadersStore:n.ShadersStoreWGSL}static GetIncludesShadersStore(e=0){return e===0?n.IncludesShadersStore:n.IncludesShadersStoreWGSL}};x.ShadersRepository="src/Shaders/";x.ShadersStore={};x.IncludesShadersStore={};x.ShadersRepositoryWGSL="src/ShadersWGSL/";x.ShadersStoreWGSL={};x.IncludesShadersStoreWGSL={}});function Sr(){return typeof window!="undefined"}function lc(){return typeof navigator!="undefined"}function Bf(){return typeof document!="undefined"}function cx(n){let e="",t=n.firstChild;for(;t;)t.nodeType===3&&(e+=t.textContent),t=t.nextSibling;return e}var za=y(()=>{});var fx,uV=y(()=>{fx=class{constructor(){this._valueCache={},this.vertexCompilationError=null,this.fragmentCompilationError=null,this.programLinkError=null,this.programValidationError=null,this._isDisposed=!1}get isAsync(){return this.isParallelCompiled}get isReady(){return this.program?this.isParallelCompiled?this.engine._isRenderingStateCompiled(this):!0:!1}_handlesSpectorRebuildCallback(e){e&&this.program&&e(this.program)}setEngine(e){this.engine=e}_fillEffectInformation(e,t,i,r,s,a,o,l){let c=this.engine;if(c.supportsUniformBuffers)for(let u in t)e.bindUniformBlock(u,t[u]);this.engine.getUniforms(this,i).forEach((u,h)=>{r[i[h]]=u}),this._uniforms=r;let d;for(d=0;d{a[u]=h});for(let u of c.getAttributes(this,o))l.push(u)}dispose(){this._uniforms={},this._isDisposed=!0}_cacheMatrix(e,t){let i=this._valueCache[e],r=t.updateFlag;return i!==void 0&&i===r?!1:(this._valueCache[e]=r,!0)}_cacheFloat2(e,t,i){let r=this._valueCache[e];if(!r||r.length!==2)return r=[t,i],this._valueCache[e]=r,!0;let s=!1;return r[0]!==t&&(r[0]=t,s=!0),r[1]!==i&&(r[1]=i,s=!0),s}_cacheFloat3(e,t,i,r){let s=this._valueCache[e];if(!s||s.length!==3)return s=[t,i,r],this._valueCache[e]=s,!0;let a=!1;return s[0]!==t&&(s[0]=t,a=!0),s[1]!==i&&(s[1]=i,a=!0),s[2]!==r&&(s[2]=r,a=!0),a}_cacheFloat4(e,t,i,r,s){let a=this._valueCache[e];if(!a||a.length!==4)return a=[t,i,r,s],this._valueCache[e]=a,!0;let o=!1;return a[0]!==t&&(a[0]=t,o=!0),a[1]!==i&&(a[1]=i,o=!0),a[2]!==r&&(a[2]=r,o=!0),a[3]!==s&&(a[3]=s,o=!0),o}setInt(e,t){let i=this._valueCache[e];i!==void 0&&i===t||this.engine.setInt(this._uniforms[e],t)&&(this._valueCache[e]=t)}setInt2(e,t,i){this._cacheFloat2(e,t,i)&&(this.engine.setInt2(this._uniforms[e],t,i)||(this._valueCache[e]=null))}setInt3(e,t,i,r){this._cacheFloat3(e,t,i,r)&&(this.engine.setInt3(this._uniforms[e],t,i,r)||(this._valueCache[e]=null))}setInt4(e,t,i,r,s){this._cacheFloat4(e,t,i,r,s)&&(this.engine.setInt4(this._uniforms[e],t,i,r,s)||(this._valueCache[e]=null))}setIntArray(e,t){this._valueCache[e]=null,this.engine.setIntArray(this._uniforms[e],t)}setIntArray2(e,t){this._valueCache[e]=null,this.engine.setIntArray2(this._uniforms[e],t)}setIntArray3(e,t){this._valueCache[e]=null,this.engine.setIntArray3(this._uniforms[e],t)}setIntArray4(e,t){this._valueCache[e]=null,this.engine.setIntArray4(this._uniforms[e],t)}setUInt(e,t){let i=this._valueCache[e];i!==void 0&&i===t||this.engine.setUInt(this._uniforms[e],t)&&(this._valueCache[e]=t)}setUInt2(e,t,i){this._cacheFloat2(e,t,i)&&(this.engine.setUInt2(this._uniforms[e],t,i)||(this._valueCache[e]=null))}setUInt3(e,t,i,r){this._cacheFloat3(e,t,i,r)&&(this.engine.setUInt3(this._uniforms[e],t,i,r)||(this._valueCache[e]=null))}setUInt4(e,t,i,r,s){this._cacheFloat4(e,t,i,r,s)&&(this.engine.setUInt4(this._uniforms[e],t,i,r,s)||(this._valueCache[e]=null))}setUIntArray(e,t){this._valueCache[e]=null,this.engine.setUIntArray(this._uniforms[e],t)}setUIntArray2(e,t){this._valueCache[e]=null,this.engine.setUIntArray2(this._uniforms[e],t)}setUIntArray3(e,t){this._valueCache[e]=null,this.engine.setUIntArray3(this._uniforms[e],t)}setUIntArray4(e,t){this._valueCache[e]=null,this.engine.setUIntArray4(this._uniforms[e],t)}setArray(e,t){this._valueCache[e]=null,this.engine.setArray(this._uniforms[e],t)}setArray2(e,t){this._valueCache[e]=null,this.engine.setArray2(this._uniforms[e],t)}setArray3(e,t){this._valueCache[e]=null,this.engine.setArray3(this._uniforms[e],t)}setArray4(e,t){this._valueCache[e]=null,this.engine.setArray4(this._uniforms[e],t)}setMatrices(e,t){t&&(this._valueCache[e]=null,this.engine.setMatrices(this._uniforms[e],t))}setMatrix(e,t){this._cacheMatrix(e,t)&&(this.engine.setMatrices(this._uniforms[e],t.asArray())||(this._valueCache[e]=null))}setMatrix3x3(e,t){this._valueCache[e]=null,this.engine.setMatrix3x3(this._uniforms[e],t)}setMatrix2x2(e,t){this._valueCache[e]=null,this.engine.setMatrix2x2(this._uniforms[e],t)}setFloat(e,t){let i=this._valueCache[e];i!==void 0&&i===t||this.engine.setFloat(this._uniforms[e],t)&&(this._valueCache[e]=t)}setVector2(e,t){this._cacheFloat2(e,t.x,t.y)&&(this.engine.setFloat2(this._uniforms[e],t.x,t.y)||(this._valueCache[e]=null))}setFloat2(e,t,i){this._cacheFloat2(e,t,i)&&(this.engine.setFloat2(this._uniforms[e],t,i)||(this._valueCache[e]=null))}setVector3(e,t){this._cacheFloat3(e,t.x,t.y,t.z)&&(this.engine.setFloat3(this._uniforms[e],t.x,t.y,t.z)||(this._valueCache[e]=null))}setFloat3(e,t,i,r){this._cacheFloat3(e,t,i,r)&&(this.engine.setFloat3(this._uniforms[e],t,i,r)||(this._valueCache[e]=null))}setVector4(e,t){this._cacheFloat4(e,t.x,t.y,t.z,t.w)&&(this.engine.setFloat4(this._uniforms[e],t.x,t.y,t.z,t.w)||(this._valueCache[e]=null))}setQuaternion(e,t){this._cacheFloat4(e,t.x,t.y,t.z,t.w)&&(this.engine.setFloat4(this._uniforms[e],t.x,t.y,t.z,t.w)||(this._valueCache[e]=null))}setFloat4(e,t,i,r,s){this._cacheFloat4(e,t,i,r,s)&&(this.engine.setFloat4(this._uniforms[e],t,i,r,s)||(this._valueCache[e]=null))}setColor3(e,t){this._cacheFloat3(e,t.r,t.g,t.b)&&(this.engine.setFloat3(this._uniforms[e],t.r,t.g,t.b)||(this._valueCache[e]=null))}setColor4(e,t,i){this._cacheFloat4(e,t.r,t.g,t.b,i)&&(this.engine.setFloat4(this._uniforms[e],t.r,t.g,t.b,i)||(this._valueCache[e]=null))}setDirectColor4(e,t){this._cacheFloat4(e,t.r,t.g,t.b,t.a)&&(this.engine.setFloat4(this._uniforms[e],t.r,t.g,t.b,t.a)||(this._valueCache[e]=null))}_getVertexShaderCode(){return this.vertexShader?this.engine._getShaderSource(this.vertexShader):null}_getFragmentShaderCode(){return this.fragmentShader?this.engine._getShaderSource(this.fragmentShader):null}}});function $e(n,e=!1){if(!(e&&hV[n]))return hV[n]=!0,`${n} needs to be imported before as it contains a side-effect required by your code.`}var hV,An=y(()=>{hV={}});function dx(n,e,t=""){return t+(e?e+` `:"")+n}function ux(n,e,t,i,r,s,a){let o=a||Fm.loadFile;if(o)return o(n,e,t,i,r,s);throw $e("FileTools")}function hx(n,e,t,i){if(n){e?n.IS_NDC_HALF_ZRANGE="":delete n.IS_NDC_HALF_ZRANGE,t?n.USE_REVERSE_DEPTHBUFFER="":delete n.USE_REVERSE_DEPTHBUFFER,i?n.USE_EXACT_SRGB_CONVERSIONS="":delete n.USE_EXACT_SRGB_CONVERSIONS;return}else{let r="";return e&&(r+="#define IS_NDC_HALF_ZRANGE"),t&&(r&&(r+=` `),r+="#define USE_REVERSE_DEPTHBUFFER"),i&&(r&&(r+=` `),r+="#define USE_EXACT_SRGB_CONVERSIONS"),r}}function mV(n,e,t=!1,i){switch(n){case 3:{let s=new Int8Array(e);return i&&s.set(new Int8Array(i)),s}case 0:{let s=new Uint8Array(e);return i&&s.set(new Uint8Array(i)),s}case 4:{let s=typeof e!="number"?new Int16Array(e):new Int16Array(t?e/2:e);return i&&s.set(new Int16Array(i)),s}case 5:case 8:case 9:case 10:case 2:{let s=typeof e!="number"?new Uint16Array(e):new Uint16Array(t?e/2:e);return i&&s.set(new Uint16Array(i)),s}case 6:{let s=typeof e!="number"?new Int32Array(e):new Int32Array(t?e/4:e);return i&&s.set(new Int32Array(i)),s}case 7:case 11:case 12:case 13:case 14:case 15:{let s=typeof e!="number"?new Uint32Array(e):new Uint32Array(t?e/4:e);return i&&s.set(new Uint32Array(i)),s}case 1:{let s=typeof e!="number"?new Float32Array(e):new Float32Array(t?e/4:e);return i&&s.set(new Float32Array(i)),s}}let r=new Uint8Array(e);return i&&r.set(new Uint8Array(i)),r}var Fm,Uf=y(()=>{An();za();Fm={}});function Yn(n){let e=eP.get(n);if(!e){if(!n)return yce;e={_webGLVersion:n.TEXTURE_BINDING_3D?2:1,_context:n,parallelShaderCompile:n.getExtension("KHR_parallel_shader_compile")||void 0,cachedPipelines:{}},eP.set(n,e)}return e}function mx(n){eP.delete(n)}function iP(n,e,t,i,r,s){var c;let a=Yn(i);s||(s=(c=a._createShaderProgramInjection)!=null?c:px);let o=tP(e,"vertex",i,a._contextWasLost),l=tP(t,"fragment",i,a._contextWasLost);return s(n,o,l,i,r,a.validateShaderPrograms)}function rP(n,e,t,i,r,s=null,a){var d;let o=Yn(r);a||(a=(d=o._createShaderProgramInjection)!=null?d:px);let l=o._webGLVersion>1?`#version 300 es @@ -23811,9 +23811,9 @@ void main(void) { #define CUSTOM_FRAGMENT_MAIN_BEGIN gl_FragColor=color; #define CUSTOM_FRAGMENT_MAIN_END -}`;x.ShadersStore[OF]||(x.ShadersStore[OF]=xQ);TEe={name:OF,shader:xQ}});var MQ,RQ,$M,AEe,xEe,bQ,FF,yQ=y(()=>{Ks();Yi();pp();We();Oo();sp();oL();ts();zL();Kt();vi();Lu();Yf();NL();Sl();Lt();Object.defineProperty(ri.prototype,"forceShowBoundingBoxes",{get:function(){return this._forceShowBoundingBoxes||!1},set:function(n){this._forceShowBoundingBoxes=n,n&&this.getBoundingBoxRenderer()},enumerable:!0,configurable:!0});ri.prototype.getBoundingBoxRenderer=function(){return this._boundingBoxRenderer||(this._boundingBoxRenderer=new FF(this)),this._boundingBoxRenderer};Object.defineProperty(Ir.prototype,"showBoundingBox",{get:function(){return this._showBoundingBox||!1},set:function(n){this._showBoundingBox=n,n&&this.getScene().getBoundingBoxRenderer()},enumerable:!0,configurable:!0});MQ=q.Identity(),RQ=new q,$M=new b,AEe=new b,xEe=MQ.asArray(),bQ=new Qf($M,$M),FF=class{get shaderLanguage(){return this._shaderLanguage}constructor(e){this.name=tt.NAME_BOUNDINGBOXRENDERER,this.frontColor=new Ee(1,1,1),this.backColor=new Ee(.1,.1,.1),this.showBackLines=!0,this.onBeforeBoxRenderingObservable=new ie,this.onAfterBoxRenderingObservable=new ie,this.onResourcesReadyObservable=new ie,this.enabled=!0,this._shaderLanguage=0,this.renderList=new Ki(32),this._vertexBuffers={},this._fillIndexBuffer=null,this._fillIndexData=null,this._matrixBuffer=null,this._matrices=null,this._useInstances=!1,this._drawWrapperFront=null,this._drawWrapperBack=null,this.scene=e,this.scene.getEngine().isWebGPU&&(this._shaderLanguage=1),e._addComponent(this),this._uniformBufferFront=new Tr(this.scene.getEngine(),void 0,void 0,"BoundingBoxRendererFront",!0),this._buildUniformLayout(this._uniformBufferFront),this._uniformBufferBack=new Tr(this.scene.getEngine(),void 0,void 0,"BoundingBoxRendererBack",!0),this._buildUniformLayout(this._uniformBufferBack)}_buildUniformLayout(e){e.addUniform("color",4),e.addUniform("world",16),e.addUniform("viewProjection",16),e.addUniform("viewProjectionR",16),e.create()}register(){this.scene._beforeEvaluateActiveMeshStage.registerStep(tt.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER,this,this.reset),this.scene._preActiveMeshStage.registerStep(tt.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER,this,this._preActiveMesh),this.scene._evaluateSubMeshStage.registerStep(tt.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER,this,this._evaluateSubMesh),this.scene._afterRenderingGroupDrawStage.registerStep(tt.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER,this,this.render)}async whenReadyAsync(e=16,t=3e4){return this._prepareResources(),await new Promise(i=>{El(()=>this._colorShader.isReady(),()=>{i()},(r,s)=>{s?(ee.Error("BoundingBoxRenderer: Timeout while waiting for the renderer to be ready."),r&&ee.Error(r)):(ee.Error("BoundingBoxRenderer: An unexpected error occurred while waiting for the renderer to be ready."),r&&(ee.Error(r),r.stack&&ee.Error(r.stack)))},e,t)})}_evaluateSubMesh(e,t){if(e.showSubMeshesBoundingBox){let i=t.getBoundingInfo();i!=null&&(i.boundingBox._tag=e.renderingGroupId,this.renderList.push(i.boundingBox))}}_preActiveMesh(e){if(e.showBoundingBox||this.scene.forceShowBoundingBoxes){let t=e.getBoundingInfo();t.boundingBox._tag=e.renderingGroupId,this.renderList.push(t.boundingBox)}}_prepareResources(){if(this._colorShader)return;this._colorShader=new Xo("colorShader",this.scene,"boundingBoxRenderer",{attributes:[L.PositionKind,"world0","world1","world2","world3"],uniforms:["world","viewProjection","viewProjectionR","color"],uniformBuffers:["BoundingBoxRenderer"],shaderLanguage:this._shaderLanguage,extraInitializationsAsync:async()=>{this._shaderLanguage===1?await Promise.all([Promise.resolve().then(()=>(bF(),RF)),Promise.resolve().then(()=>(IF(),yF))]):await Promise.all([Promise.resolve().then(()=>(LF(),DF)),Promise.resolve().then(()=>(wF(),NF))])}},!1),this._colorShader.setDefine("INSTANCES",this._useInstances),this._colorShader.doNotSerialize=!0,this._colorShader.reservedDataStore={hidden:!0},this._colorShaderForOcclusionQuery=new Xo("colorShaderOccQuery",this.scene,"boundingBoxRenderer",{attributes:[L.PositionKind],uniforms:["world","viewProjection","viewProjectionR","color"],uniformBuffers:["BoundingBoxRenderer"],shaderLanguage:this._shaderLanguage,extraInitializationsAsync:async()=>{this._shaderLanguage===1?await Promise.all([Promise.resolve().then(()=>(bF(),RF)),Promise.resolve().then(()=>(IF(),yF))]):await Promise.all([Promise.resolve().then(()=>(LF(),DF)),Promise.resolve().then(()=>(wF(),NF))])}},!0),this._colorShaderForOcclusionQuery.doNotSerialize=!0,this._colorShaderForOcclusionQuery.reservedDataStore={hidden:!0};let e=this.scene.getEngine(),t=KR({size:1});this._vertexBuffers[L.PositionKind]=new L(e,t.positions,L.PositionKind,!1),this._createIndexBuffer(),this._fillIndexData=t.indices,this.onResourcesReadyObservable.notifyObservers(this)}_createIndexBuffer(){let e=this.scene.getEngine();this._indexBuffer=e.createIndexBuffer([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,7,1,6,2,5,3,4])}rebuild(){let e=this._vertexBuffers[L.PositionKind];e&&e._rebuild(),this._createIndexBuffer(),this._matrixBuffer&&this._matrixBuffer._rebuild()}reset(){this.renderList.reset()}render(e){var r,s;if(this.renderList.length===0||!this.enabled)return;if(this._useInstances){this._renderInstanced(e);return}if(this._prepareResources(),!this._colorShader.isReady())return;let t=this.scene.getEngine();t.setDepthWrite(!1);let i=this.scene.getTransformMatrix();for(let a=0;ar*2)&&(i=new Float32Array(r),this._matrices=i),this.onBeforeBoxRenderingObservable.notifyObservers(bQ);let s=0,a=this.scene.floatingOriginOffset;for(let _=0;_{"use strict";We();VO();Kt();wo();yQ();ks();mE();zC();Ld=class Ld{constructor(e,t,i,r,s){this.meshToPart=new Map;this.occlusionDirection=b.Zero();this.occlusionRay=new rn(b.Zero(),b.Zero(),1);this.lastOccluded=!1;this.selected=null;this.partPointerActive=!1;this.activePointerId=null;this.scene=e,this.camera=t,this.meshes=r,this.parts=yEe(i,r,s);for(let a of this.parts)for(let o of a.meshes)this.meshToPart.set(o.uniqueId,a);this.setBoundingBoxColor(Ld.BBOX_VISIBLE)}getParts(){return this.parts}getPartId(e){return e.id}isDisposed(e){return MEe(e.node)||e.meshes.every(t=>t.isDisposed())}captureTransform(e){var t,i;return{parent:e.node.parent,position:e.node.position.clone(),rotation:e.node.rotation.clone(),rotationQuaternion:(i=(t=e.node.rotationQuaternion)==null?void 0:t.clone())!=null?i:null,scaling:e.node.scaling.clone()}}restoreTransform(e,t){var i,r;e.node.setParent(t.parent),e.node.position.copyFrom(t.position),e.node.rotation.copyFrom(t.rotation),e.node.rotationQuaternion=(r=(i=t.rotationQuaternion)==null?void 0:i.clone())!=null?r:null,e.node.scaling.copyFrom(t.scaling),e.node.computeWorldMatrix(!0);for(let s of e.meshes)s.computeWorldMatrix(!0)}subscribe(e){let t=this.scene.getEngine().getRenderingCanvas();t==null||t.classList.add("ai3d-disassembly-active");let i=this.scene.onPointerObservable.add(s=>{var o,l,c,f;let a=s.event;if(a.isPrimary!==!1){if(s.type===at.POINTERDOWN){if(a.button!==0)return;let d=(l=(o=s.pickInfo)==null?void 0:o.pickedMesh)!=null?l:null;if(this.partPointerActive=!!this.resolvePart(d),this.partPointerActive){a.preventDefault(),a.stopPropagation(),this.activePointerId=a.pointerId;try{(c=t==null?void 0:t.setPointerCapture)==null||c.call(t,a.pointerId)}catch(u){}this.camera.detachControl()}e.onPointerDown(d,a)}else if(s.type===at.POINTERMOVE){if(this.activePointerId!==null&&a.pointerId!==this.activePointerId)return;this.partPointerActive&&(a.preventDefault(),a.stopPropagation()),e.onPointerMove(a)}else if(s.type===at.POINTERUP){if(this.activePointerId!==null&&a.pointerId!==this.activePointerId)return;if(this.partPointerActive&&(a.preventDefault(),a.stopPropagation()),e.onPointerUp(a),this.activePointerId!==null&&((f=t==null?void 0:t.hasPointerCapture)!=null&&f.call(t,this.activePointerId)))try{t.releasePointerCapture(this.activePointerId)}catch(d){}this.partPointerActive=!1,this.activePointerId=null,this.camera.attachControl(this.scene.getEngine().getRenderingCanvas(),!0)}}}),r=this.scene.onAfterRenderCameraObservable.add(s=>{s===this.camera&&e.onRender()});return()=>{var s;if(this.scene.onPointerObservable.remove(i),this.scene.onAfterRenderCameraObservable.remove(r),t==null||t.classList.remove("ai3d-disassembly-active","ai3d-disassembly-dragging"),this.activePointerId!==null&&((s=t==null?void 0:t.hasPointerCapture)!=null&&s.call(t,this.activePointerId)))try{t.releasePointerCapture(this.activePointerId)}catch(a){}this.partPointerActive=!1,this.activePointerId=null,this.camera.attachControl(t,!0)}}resolvePart(e){var t;return REe(e)?this.parts.includes(e)?e:null:!e||typeof e!="object"?null:(t=this.meshToPart.get(e.uniqueId))!=null?t:null}setSelected(e){if(this.selected)for(let t of this.selected.meshes)t.isDisposed()||(t.showBoundingBox=!1);if(this.selected=e,this.lastOccluded=!1,this.setBoundingBoxColor(Ld.BBOX_VISIBLE),this.selected&&!this.isDisposed(this.selected))for(let t of this.selected.meshes)t.isDisposed()||(t.showBoundingBox=!0)}beginDrag(e,t){var o,l,c;let i=this.getPointOnDragPlane(e,t);if(!i)return null;t.preventDefault(),t.stopPropagation(),(o=this.scene.getEngine().getRenderingCanvas())==null||o.classList.add("ai3d-disassembly-dragging"),e.node.setParent(null),e.node.computeWorldMatrix(!0);for(let f of e.meshes)f.computeWorldMatrix(!0);t.shiftKey&&!e.node.rotationQuaternion&&(e.node.rotationQuaternion=je.FromEulerVector(e.node.rotation),e.node.rotation.set(0,0,0));let r=BF(e),s=Mm(ei(i),ei(this.camera.getForwardRay().direction));if(!s)return null;let a={part:e,mode:t.shiftKey?"rotate":"move",plane:s,startPoint:i,startPosition:e.node.position.clone(),startRotationQuaternion:(c=(l=e.node.rotationQuaternion)==null?void 0:l.clone())!=null?c:null,pivot:r,pointerX:t.clientX,pointerY:t.clientY};return this.camera.detachControl(),a}updateDrag(e,t){if(t.preventDefault(),t.stopPropagation(),e.mode==="rotate"){this.updateRotation(e,t);return}let i=this.getRayPlanePoint(t,e.plane);if(!i)return;let r=i.subtract(e.startPoint);e.part.node.position=e.startPosition.add(r),e.part.node.computeWorldMatrix(!0);for(let s of e.part.meshes)s.computeWorldMatrix(!0)}endDrag(e){var t;(t=this.scene.getEngine().getRenderingCanvas())==null||t.classList.remove("ai3d-disassembly-dragging"),this.camera.attachControl(this.scene.getEngine().getRenderingCanvas(),!0)}updateSelectionOcclusion(e){let t=BF(e),i=this.camera.position,r=Of(ei(i),ei(t));if(!r)return;let s=this.occlusionDirection;s.set(r.direction.x,r.direction.y,r.direction.z),this.occlusionRay.origin=i,this.occlusionRay.direction=s,this.occlusionRay.length=r.distance;let a=this.scene.pickWithRay(this.occlusionRay),o=!!(a!=null&&a.hit)&&Lf(a.distance,r.distance,r.epsilon);o!==this.lastOccluded&&(this.lastOccluded=o,this.setBoundingBoxColor(o?Ld.BBOX_OCCLUDED:Ld.BBOX_VISIBLE))}setBoundingBoxColor(e){var i,r;let t=(r=(i=this.scene).getBoundingBoxRenderer)==null?void 0:r.call(i);t&&(t.frontColor=e,t.backColor=e)}updateRotation(e,t){if(!e.startRotationQuaternion)return;let i=t.clientX-e.pointerX,r=t.clientY-e.pointerY,s=RA({startPosition:ei(e.startPosition),pivot:ei(e.pivot),startRotationQuaternion:xA(e.startRotationQuaternion),yawAxis:ei(this.camera.getDirection(b.Up()).normalize()),pitchAxis:ei(this.camera.getDirection(b.Right()).normalize()),deltaX:i,deltaY:r,sensitivity:.01});if(s){e.part.node.position=new b(s.position.x,s.position.y,s.position.z),e.part.node.rotationQuaternion=new je(s.rotationQuaternion.x,s.rotationQuaternion.y,s.rotationQuaternion.z,s.rotationQuaternion.w),e.part.node.rotation.set(0,0,0),e.part.node.computeWorldMatrix(!0);for(let a of e.part.meshes)a.computeWorldMatrix(!0)}}getPointOnDragPlane(e,t){var s;let i=BF(e),r=Mm(ei(i),ei(this.camera.getForwardRay().direction));return r&&(s=this.getRayPlanePoint(t,r))!=null?s:i}getRayPlanePoint(e,t){let i=this.scene.getEngine().getRenderingCanvas();if(!i)return null;let r=i.getBoundingClientRect(),s=e.clientX-r.left,a=e.clientY-r.top,o=this.scene.createPickingRay(s,a,q.Identity(),this.camera),l=AA({origin:ei(o.origin),direction:ei(o.direction)},t);return l?new b(l.x,l.y,l.z):null}};Ld.BBOX_VISIBLE=new Ee(.25,.7,1),Ld.BBOX_OCCLUDED=new Ee(.1,.25,.4);UF=Ld});var wQ={};Be(wQ,{BabylonModelPreview:()=>e0,createBabylonModelPreview:()=>VEe});function OEe(n){let e=n.getClassName();return e==="DirectionalLight"||e==="PointLight"||e==="SpotLight"}function VF(n){return n.getClassName()==="GaussianSplattingMesh"}function NEe(n){return!!n&&typeof n=="object"&&"getBoundingInfo"in n}function GF(n){return n instanceof $t}function Jc(n){return typeof n.isDisposed=="function"?n.isDisposed():!1}function lg(n,e){let t=n;for(;t;){if(t===e)return!0;t=t.parent}return!1}function kF(n,e=[]){for(let t of n)t.isDisposed()||t.dispose(!0,!0);for(let t of e)t.isDisposed()||t.dispose(!1,!0)}function Ia(n){return new b(n.x,n.y,n.z)}function OQ(n){return Number.isFinite(n)?Math.max(0,Math.min(n,1)):0}function NQ(n){let e=new ze("measure-marker-mat",n);return e.diffuseColor=gE.clone(),e.emissiveColor=gE.clone(),e.specularColor=new Ee(0,0,0),e.disableLighting=!0,e.alpha=.48,e}function pE(n,e){let t=n.material;t&&(t.diffuseColor=e.clone(),t.emissiveColor=e.clone())}function wEe(n){let e=n.replace(/\s+#.*$/,"").trim();if(e.startsWith('"')){let t=e.indexOf('"',1);if(t>1)return e.slice(1,t)}return e}function FEe(n){let e=n.trim().split(/\s+/),t=e.findIndex(i=>!i.startsWith("-")&&!/^[-+]?\d*\.?\d+$/.test(i));return e.slice(Math.max(0,t)).join(" ").replace(/^"|"$/g,"")}function BEe(n){var t,i;let e=(i=(t=n.split(".").pop())==null?void 0:t.toLowerCase())!=null?i:"png";return e==="jpg"||e==="jpeg"?"image/jpeg":e==="png"?"image/png":e==="bmp"?"image/bmp":e==="tga"?"image/x-tga":e==="webp"?"image/webp":`image/${e}`}function UEe(n,e,t){let i=Gs(e),r=i.replace(/\.[^.]+$/,""),s=dn(t),a=[In(n,e),In(n,i)];if(s)for(let o of PQ)a.push(In(n,`${s}.${o}`));for(let o of PQ){let l=`${r}.${o}`;l!==i&&a.push(In(n,l))}return a}function VEe(n){return new e0(n)}var JM,PQ,IEe,CEe,PEe,DQ,gE,DEe,LEe,LQ,Ca,e0,FQ=y(()=>{"use strict";iL();Ks();HR();XR();AH();xH();ML();We();Kt();wi();$f();dO();Yi();jc();lY();VO();sM();E6();pL();Qp();dE();dE();iF();rF();Fq();hQ();_A();ga();ps();mQ();CQ();mE();gl();bA();wC();G_();ks();DA();F_();W_();JM=null,PQ=["jpg","jpeg","png","bmp","tga","webp","tif","tiff"],IEe=/^\s*(map_Kd|map_Ka|map_Ks|map_Ns|map_d|map_bump|bump|disp|decal)\s+(.+)/i,CEe=.242,PEe=320,DQ=new Ee(.97,.98,.99),gE=new Ee(.97,.98,.99),DEe=new Ee(.96,.62,.04),LEe=new Ee(1,1,1),LQ=new Ee(.9,.91,.92);Ca=class Ca{constructor(e){this.rootMesh=null;this.loadedMeshes=[];this.loadedTransformNodes=[];this.cachedRenderableMeshes=null;this.cachedRenderableRoot=null;this.loadedExt="";this.rendering=!1;this.contextLost=!1;this.viewportVisible=!0;this.viewportObserver=null;this.cleanupPicking=null;this.configLights=[];this.shadowGenerator=null;this.groundMesh=null;this.gridMesh=null;this.axisMeshes=[];this.autoRotateBehavior=null;this.wireframeEnabled=!1;this.gizmo=null;this.gizmoEnabled=!1;this.disassembly=null;this.focusSelectionEnabled=!1;this.focusedNode=null;this.originalMeshVisibility=new Map;this.bboxMesh=null;this.bboxEnabled=!1;this.currentQuality="high";this.renderScale=1;this.resourceWarnings=[];this.gltfComponentMetadata=new Map;this.animPlaying=!1;this.initialCamera={alpha:Math.PI/4,beta:Math.PI/3,radius:5,target:b.Zero()};this.focusWorldPointFrame=0;this._lastPickResult={mesh:null,pickedPoint:null,screenX:0,screenY:0};this._onPickCallbacks=[];this.measurementActive=!1;this.measurementScale={x:1,y:1,z:1};this.measurementBaseRootScaling=new b(1,1,1);this.measurementBaseBounds=null;this.measurementUnit="mm";this.measurementSegments=[];this.measurementMarkers=[];this.measurementMarkerPoints=[];this.measurementTargetNode=null;this.measurementTargetMeshes=[];this.measurementSnapKind=null;this.measurementObservers=new Set;this.pendingPoint=null;this.pendingMarker=null;this.hoveredMarkerIndex=-1;this.lastPointerClient={x:0,y:0,altKey:!1};this.previewLine=null;this.cameraZoomObservers=new Set;this.handlePointerMove=e=>{if(this.lastPointerClient={x:e.clientX,y:e.clientY,altKey:e.altKey},!this.measurementActive||(this.pendingPoint&&this.updatePreviewLine(),this.measurementMarkers.length===0))return;let t=this.engine.getRenderingCanvas();if(!t)return;let i=t.getBoundingClientRect(),r=e.clientX-i.left,s=e.clientY-i.top,a=this.scene.pick(r,s,l=>this.measurementMarkers.includes(l)),o=a.hit?this.measurementMarkers.indexOf(a.pickedMesh):-1;if(o!==this.hoveredMarkerIndex){if(this.hoveredMarkerIndex>=0&&this.hoveredMarkerIndex=0&&o{e.preventDefault(),e.stopPropagation()};this.handleViewportIntersection=e=>{let t=e.some(i=>i.isIntersecting);t!==this.viewportVisible&&(this.viewportVisible=t,t?this.startRenderLoop():this.rendering&&(this.engine.stopRenderLoop(),this.rendering=!1))};this.handleContextLost=e=>{e.preventDefault(),this.contextLost=!0,this.rendering&&(this.engine.stopRenderLoop(),this.rendering=!1)};this.handleContextRestored=()=>{this.contextLost=!1,this.engine.resize(),this.startRenderLoop()};this.engine=new ke(e,!0,{preserveDrawingBuffer:!0}),this.scene=new ri(this.engine),this.scene.clearColor=new dt(.12,.12,.14,1),this.scene.setRenderingAutoClearDepthStencil(2,!0,!0,!0),this.camera=new Ri("cam",Math.PI/4,Math.PI/3,5,b.Zero(),this.scene),this.camera.attachControl(e,!0),this.camera.lowerRadiusLimit=.1,this.camera.wheelPrecision=45,this.camera.onViewMatrixChangedObservable.add(()=>{this.measurementSegments.length>0&&this.updateMeasurementOverlayPositions(),this.notifyCameraZoomChanged()}),e.addEventListener("wheel",this.preventCanvasWheelScroll,{passive:!1}),e.addEventListener("pointermove",this.handlePointerMove),e.addEventListener("webglcontextlost",this.handleContextLost),e.addEventListener("webglcontextrestored",this.handleContextRestored),this.scene.ambientColor=new Ee(.3,.3,.3);let t=new Ra("default-light",new b(0,1,.5),this.scene);t.intensity=1.2,this.resizeObs=new ResizeObserver(()=>this.engine.resize()),this.resizeObs.observe(e),typeof IntersectionObserver!="undefined"&&(this.viewportObserver=new IntersectionObserver(this.handleViewportIntersection,{root:null,threshold:[0,.01]}),this.viewportObserver.observe(e)),window.requestAnimationFrame(()=>this.engine.resize())}canRender(){let e=this.engine.getRenderingCanvas();return!!(e!=null&&e.isConnected)&&e.clientWidth>0&&e.clientHeight>0}getCameraZoomRange(){if(!this.rootMesh)return null;let e=this.camera.radius,t=this.camera.lowerRadiusLimit,i=this.camera.upperRadiusLimit,r=typeof t=="number"&&Number.isFinite(t)&&t>0?t:Math.max(e*.08,1e-5),s=typeof i=="number"&&Number.isFinite(i)&&i>r?i:Math.max(e*8,r*10);return{current:Math.max(r,Math.min(e,s)),min:r,max:s}}notifyCameraZoomChanged(){if(this.cameraZoomObservers.size===0)return;let e=this.getCameraZoomState();for(let t of this.cameraZoomObservers)t(e)}ensureDisassemblyController(){return this.rootMesh?(this.disassembly||(this.disassembly=IQ(this.scene,this.camera,this.rootMesh,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata)),this.disassembly):null}isDisassemblyActive(){var e,t;return(t=(e=this.disassembly)==null?void 0:e.isEnabled())!=null?t:!1}async loadModel(e,t,i,r,s){var g,p,_;Ti(s),await fE(),Ti(s),this.rootMesh&&(kF(this.loadedMeshes,this.loadedTransformNodes),this.rootMesh=null,this.notifyCameraZoomChanged()),this.invalidateMeshCache(),this.loadedMeshes=[],this.loadedTransformNodes=[],this.disposeMeasurementOverlays(!0),this.resetMeasurementCalibrationState(),(g=this.disassembly)==null||g.dispose(),this.disassembly=null,this.clearFocusedMesh(),this.originalMeshVisibility.clear();let a=t.toLowerCase().replace(".","");this.loadedExt=a,this.resourceWarnings=[],Ti(s),this.gltfComponentMetadata=Nq(e,a);let o=this.scene,c=(p={glb:".glb",gltf:".gltf",stl:".stl",obj:".obj",splat:".splat",ply:".ply"}[a])!=null?p:`.${a}`;Ti(s);let f=`data:application/octet-stream;base64,${pu(e)}`;Ti(s);let d=v=>{try{Ti(s)}catch(E){throw kF(v.meshes,v.transformNodes),E}this.loadedMeshes=v.meshes,this.loadedTransformNodes=v.transformNodes,v.meshes.length>0&&(this.rootMesh=v.meshes[0])},u=()=>{try{Ti(s)}catch(v){throw kF(this.loadedMeshes,this.loadedTransformNodes),this.loadedMeshes=[],this.loadedTransformNodes=[],this.rootMesh=null,this.invalidateMeshCache(),this.notifyCameraZoomChanged(),v}};if(a==="obj"&&i&&r){JM&&await JM,Ti(s);let v;JM=new Promise(E=>{v=E});try{let{OBJFileLoader:E}=await Promise.resolve().then(()=>(eF(),Tq)),T=E.prototype;typeof T._loadMTL!="function"&&console.warn("[AI3D] OBJFileLoader._loadMTL not found \u2014 MTL vault resolution disabled");let S=T._loadMTL,R=new TextDecoder().decode(new Uint8Array(e)).match(/mtllib\s+(.+)/),M=null;if(R&&i&&r){let C=wEe(R[1]),D=w_(r),w=In(D,C);try{let k=await i(w);Ti(s);let N=new TextDecoder().decode(new Uint8Array(k)).split(` +}`;x.ShadersStore[OF]||(x.ShadersStore[OF]=xQ);TEe={name:OF,shader:xQ}});var MQ,RQ,$M,AEe,xEe,bQ,FF,yQ=y(()=>{Ks();Yi();pp();We();Oo();sp();oL();ts();zL();Kt();vi();Lu();Yf();NL();Sl();Lt();Object.defineProperty(ri.prototype,"forceShowBoundingBoxes",{get:function(){return this._forceShowBoundingBoxes||!1},set:function(n){this._forceShowBoundingBoxes=n,n&&this.getBoundingBoxRenderer()},enumerable:!0,configurable:!0});ri.prototype.getBoundingBoxRenderer=function(){return this._boundingBoxRenderer||(this._boundingBoxRenderer=new FF(this)),this._boundingBoxRenderer};Object.defineProperty(Ir.prototype,"showBoundingBox",{get:function(){return this._showBoundingBox||!1},set:function(n){this._showBoundingBox=n,n&&this.getScene().getBoundingBoxRenderer()},enumerable:!0,configurable:!0});MQ=q.Identity(),RQ=new q,$M=new b,AEe=new b,xEe=MQ.asArray(),bQ=new Qf($M,$M),FF=class{get shaderLanguage(){return this._shaderLanguage}constructor(e){this.name=tt.NAME_BOUNDINGBOXRENDERER,this.frontColor=new Ee(1,1,1),this.backColor=new Ee(.1,.1,.1),this.showBackLines=!0,this.onBeforeBoxRenderingObservable=new ie,this.onAfterBoxRenderingObservable=new ie,this.onResourcesReadyObservable=new ie,this.enabled=!0,this._shaderLanguage=0,this.renderList=new Ki(32),this._vertexBuffers={},this._fillIndexBuffer=null,this._fillIndexData=null,this._matrixBuffer=null,this._matrices=null,this._useInstances=!1,this._drawWrapperFront=null,this._drawWrapperBack=null,this.scene=e,this.scene.getEngine().isWebGPU&&(this._shaderLanguage=1),e._addComponent(this),this._uniformBufferFront=new Tr(this.scene.getEngine(),void 0,void 0,"BoundingBoxRendererFront",!0),this._buildUniformLayout(this._uniformBufferFront),this._uniformBufferBack=new Tr(this.scene.getEngine(),void 0,void 0,"BoundingBoxRendererBack",!0),this._buildUniformLayout(this._uniformBufferBack)}_buildUniformLayout(e){e.addUniform("color",4),e.addUniform("world",16),e.addUniform("viewProjection",16),e.addUniform("viewProjectionR",16),e.create()}register(){this.scene._beforeEvaluateActiveMeshStage.registerStep(tt.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER,this,this.reset),this.scene._preActiveMeshStage.registerStep(tt.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER,this,this._preActiveMesh),this.scene._evaluateSubMeshStage.registerStep(tt.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER,this,this._evaluateSubMesh),this.scene._afterRenderingGroupDrawStage.registerStep(tt.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER,this,this.render)}async whenReadyAsync(e=16,t=3e4){return this._prepareResources(),await new Promise(i=>{El(()=>this._colorShader.isReady(),()=>{i()},(r,s)=>{s?(ee.Error("BoundingBoxRenderer: Timeout while waiting for the renderer to be ready."),r&&ee.Error(r)):(ee.Error("BoundingBoxRenderer: An unexpected error occurred while waiting for the renderer to be ready."),r&&(ee.Error(r),r.stack&&ee.Error(r.stack)))},e,t)})}_evaluateSubMesh(e,t){if(e.showSubMeshesBoundingBox){let i=t.getBoundingInfo();i!=null&&(i.boundingBox._tag=e.renderingGroupId,this.renderList.push(i.boundingBox))}}_preActiveMesh(e){if(e.showBoundingBox||this.scene.forceShowBoundingBoxes){let t=e.getBoundingInfo();t.boundingBox._tag=e.renderingGroupId,this.renderList.push(t.boundingBox)}}_prepareResources(){if(this._colorShader)return;this._colorShader=new Xo("colorShader",this.scene,"boundingBoxRenderer",{attributes:[L.PositionKind,"world0","world1","world2","world3"],uniforms:["world","viewProjection","viewProjectionR","color"],uniformBuffers:["BoundingBoxRenderer"],shaderLanguage:this._shaderLanguage,extraInitializationsAsync:async()=>{this._shaderLanguage===1?await Promise.all([Promise.resolve().then(()=>(bF(),RF)),Promise.resolve().then(()=>(IF(),yF))]):await Promise.all([Promise.resolve().then(()=>(LF(),DF)),Promise.resolve().then(()=>(wF(),NF))])}},!1),this._colorShader.setDefine("INSTANCES",this._useInstances),this._colorShader.doNotSerialize=!0,this._colorShader.reservedDataStore={hidden:!0},this._colorShaderForOcclusionQuery=new Xo("colorShaderOccQuery",this.scene,"boundingBoxRenderer",{attributes:[L.PositionKind],uniforms:["world","viewProjection","viewProjectionR","color"],uniformBuffers:["BoundingBoxRenderer"],shaderLanguage:this._shaderLanguage,extraInitializationsAsync:async()=>{this._shaderLanguage===1?await Promise.all([Promise.resolve().then(()=>(bF(),RF)),Promise.resolve().then(()=>(IF(),yF))]):await Promise.all([Promise.resolve().then(()=>(LF(),DF)),Promise.resolve().then(()=>(wF(),NF))])}},!0),this._colorShaderForOcclusionQuery.doNotSerialize=!0,this._colorShaderForOcclusionQuery.reservedDataStore={hidden:!0};let e=this.scene.getEngine(),t=KR({size:1});this._vertexBuffers[L.PositionKind]=new L(e,t.positions,L.PositionKind,!1),this._createIndexBuffer(),this._fillIndexData=t.indices,this.onResourcesReadyObservable.notifyObservers(this)}_createIndexBuffer(){let e=this.scene.getEngine();this._indexBuffer=e.createIndexBuffer([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,7,1,6,2,5,3,4])}rebuild(){let e=this._vertexBuffers[L.PositionKind];e&&e._rebuild(),this._createIndexBuffer(),this._matrixBuffer&&this._matrixBuffer._rebuild()}reset(){this.renderList.reset()}render(e){var r,s;if(this.renderList.length===0||!this.enabled)return;if(this._useInstances){this._renderInstanced(e);return}if(this._prepareResources(),!this._colorShader.isReady())return;let t=this.scene.getEngine();t.setDepthWrite(!1);let i=this.scene.getTransformMatrix();for(let a=0;ar*2)&&(i=new Float32Array(r),this._matrices=i),this.onBeforeBoxRenderingObservable.notifyObservers(bQ);let s=0,a=this.scene.floatingOriginOffset;for(let _=0;_{"use strict";We();VO();Kt();wo();yQ();ks();mE();zC();Ld=class Ld{constructor(e,t,i,r,s){this.meshToPart=new Map;this.occlusionDirection=b.Zero();this.occlusionRay=new rn(b.Zero(),b.Zero(),1);this.lastOccluded=!1;this.selected=null;this.partPointerActive=!1;this.activePointerId=null;this.scene=e,this.camera=t,this.meshes=r,this.parts=yEe(i,r,s);for(let a of this.parts)for(let o of a.meshes)this.meshToPart.set(o.uniqueId,a);this.setBoundingBoxColor(Ld.BBOX_VISIBLE)}getParts(){return this.parts}getPartId(e){return e.id}isDisposed(e){return MEe(e.node)||e.meshes.every(t=>t.isDisposed())}captureTransform(e){var t,i;return{parent:e.node.parent,position:e.node.position.clone(),rotation:e.node.rotation.clone(),rotationQuaternion:(i=(t=e.node.rotationQuaternion)==null?void 0:t.clone())!=null?i:null,scaling:e.node.scaling.clone()}}restoreTransform(e,t){var i,r;e.node.setParent(t.parent),e.node.position.copyFrom(t.position),e.node.rotation.copyFrom(t.rotation),e.node.rotationQuaternion=(r=(i=t.rotationQuaternion)==null?void 0:i.clone())!=null?r:null,e.node.scaling.copyFrom(t.scaling),e.node.computeWorldMatrix(!0);for(let s of e.meshes)s.computeWorldMatrix(!0)}subscribe(e){let t=this.scene.getEngine().getRenderingCanvas();t==null||t.classList.add("ai3d-disassembly-active");let i=this.scene.onPointerObservable.add(s=>{var o,l,c,f;let a=s.event;if(a.isPrimary!==!1){if(s.type===at.POINTERDOWN){if(a.button!==0)return;let d=(l=(o=s.pickInfo)==null?void 0:o.pickedMesh)!=null?l:null;if(this.partPointerActive=!!this.resolvePart(d),this.partPointerActive){a.preventDefault(),a.stopPropagation(),this.activePointerId=a.pointerId;try{(c=t==null?void 0:t.setPointerCapture)==null||c.call(t,a.pointerId)}catch(u){}this.camera.detachControl()}e.onPointerDown(d,a)}else if(s.type===at.POINTERMOVE){if(this.activePointerId!==null&&a.pointerId!==this.activePointerId)return;this.partPointerActive&&(a.preventDefault(),a.stopPropagation()),e.onPointerMove(a)}else if(s.type===at.POINTERUP){if(this.activePointerId!==null&&a.pointerId!==this.activePointerId)return;if(this.partPointerActive&&(a.preventDefault(),a.stopPropagation()),e.onPointerUp(a),this.activePointerId!==null&&((f=t==null?void 0:t.hasPointerCapture)!=null&&f.call(t,this.activePointerId)))try{t.releasePointerCapture(this.activePointerId)}catch(d){}this.partPointerActive=!1,this.activePointerId=null,this.camera.attachControl(this.scene.getEngine().getRenderingCanvas(),!0)}}}),r=this.scene.onAfterRenderCameraObservable.add(s=>{s===this.camera&&e.onRender()});return()=>{var s;if(this.scene.onPointerObservable.remove(i),this.scene.onAfterRenderCameraObservable.remove(r),t==null||t.classList.remove("ai3d-disassembly-active","ai3d-disassembly-dragging"),this.activePointerId!==null&&((s=t==null?void 0:t.hasPointerCapture)!=null&&s.call(t,this.activePointerId)))try{t.releasePointerCapture(this.activePointerId)}catch(a){}this.partPointerActive=!1,this.activePointerId=null,this.camera.attachControl(t,!0)}}resolvePart(e){var t;return REe(e)?this.parts.includes(e)?e:null:!e||typeof e!="object"?null:(t=this.meshToPart.get(e.uniqueId))!=null?t:null}setSelected(e){if(this.selected)for(let t of this.selected.meshes)t.isDisposed()||(t.showBoundingBox=!1);if(this.selected=e,this.lastOccluded=!1,this.setBoundingBoxColor(Ld.BBOX_VISIBLE),this.selected&&!this.isDisposed(this.selected))for(let t of this.selected.meshes)t.isDisposed()||(t.showBoundingBox=!0)}beginDrag(e,t){var o,l,c;let i=this.getPointOnDragPlane(e,t);if(!i)return null;t.preventDefault(),t.stopPropagation(),(o=this.scene.getEngine().getRenderingCanvas())==null||o.classList.add("ai3d-disassembly-dragging"),e.node.setParent(null),e.node.computeWorldMatrix(!0);for(let f of e.meshes)f.computeWorldMatrix(!0);t.shiftKey&&!e.node.rotationQuaternion&&(e.node.rotationQuaternion=je.FromEulerVector(e.node.rotation),e.node.rotation.set(0,0,0));let r=BF(e),s=Mm(ei(i),ei(this.camera.getForwardRay().direction));if(!s)return null;let a={part:e,mode:t.shiftKey?"rotate":"move",plane:s,startPoint:i,startPosition:e.node.position.clone(),startRotationQuaternion:(c=(l=e.node.rotationQuaternion)==null?void 0:l.clone())!=null?c:null,pivot:r,pointerX:t.clientX,pointerY:t.clientY};return this.camera.detachControl(),a}updateDrag(e,t){if(t.preventDefault(),t.stopPropagation(),e.mode==="rotate"){this.updateRotation(e,t);return}let i=this.getRayPlanePoint(t,e.plane);if(!i)return;let r=i.subtract(e.startPoint);e.part.node.position=e.startPosition.add(r),e.part.node.computeWorldMatrix(!0);for(let s of e.part.meshes)s.computeWorldMatrix(!0)}endDrag(e){var t;(t=this.scene.getEngine().getRenderingCanvas())==null||t.classList.remove("ai3d-disassembly-dragging"),this.camera.attachControl(this.scene.getEngine().getRenderingCanvas(),!0)}updateSelectionOcclusion(e){let t=BF(e),i=this.camera.position,r=Of(ei(i),ei(t));if(!r)return;let s=this.occlusionDirection;s.set(r.direction.x,r.direction.y,r.direction.z),this.occlusionRay.origin=i,this.occlusionRay.direction=s,this.occlusionRay.length=r.distance;let a=this.scene.pickWithRay(this.occlusionRay),o=!!(a!=null&&a.hit)&&Lf(a.distance,r.distance,r.epsilon);o!==this.lastOccluded&&(this.lastOccluded=o,this.setBoundingBoxColor(o?Ld.BBOX_OCCLUDED:Ld.BBOX_VISIBLE))}setBoundingBoxColor(e){var i,r;let t=(r=(i=this.scene).getBoundingBoxRenderer)==null?void 0:r.call(i);t&&(t.frontColor=e,t.backColor=e)}updateRotation(e,t){if(!e.startRotationQuaternion)return;let i=t.clientX-e.pointerX,r=t.clientY-e.pointerY,s=RA({startPosition:ei(e.startPosition),pivot:ei(e.pivot),startRotationQuaternion:xA(e.startRotationQuaternion),yawAxis:ei(this.camera.getDirection(b.Up()).normalize()),pitchAxis:ei(this.camera.getDirection(b.Right()).normalize()),deltaX:i,deltaY:r,sensitivity:.01});if(s){e.part.node.position=new b(s.position.x,s.position.y,s.position.z),e.part.node.rotationQuaternion=new je(s.rotationQuaternion.x,s.rotationQuaternion.y,s.rotationQuaternion.z,s.rotationQuaternion.w),e.part.node.rotation.set(0,0,0),e.part.node.computeWorldMatrix(!0);for(let a of e.part.meshes)a.computeWorldMatrix(!0)}}getPointOnDragPlane(e,t){var s;let i=BF(e),r=Mm(ei(i),ei(this.camera.getForwardRay().direction));return r&&(s=this.getRayPlanePoint(t,r))!=null?s:i}getRayPlanePoint(e,t){let i=this.scene.getEngine().getRenderingCanvas();if(!i)return null;let r=i.getBoundingClientRect(),s=e.clientX-r.left,a=e.clientY-r.top,o=this.scene.createPickingRay(s,a,q.Identity(),this.camera),l=AA({origin:ei(o.origin),direction:ei(o.direction)},t);return l?new b(l.x,l.y,l.z):null}};Ld.BBOX_VISIBLE=new Ee(.25,.7,1),Ld.BBOX_OCCLUDED=new Ee(.1,.25,.4);UF=Ld});var wQ={};Be(wQ,{BabylonModelPreview:()=>e0,createBabylonModelPreview:()=>VEe});function OEe(n){let e=n.getClassName();return e==="DirectionalLight"||e==="PointLight"||e==="SpotLight"}function VF(n){return n.getClassName()==="GaussianSplattingMesh"}function NEe(n){return!!n&&typeof n=="object"&&"getBoundingInfo"in n}function GF(n){return n instanceof $t}function Jc(n){return typeof n.isDisposed=="function"?n.isDisposed():!1}function lg(n,e){let t=n;for(;t;){if(t===e)return!0;t=t.parent}return!1}function kF(n,e=[]){for(let t of n)t.isDisposed()||t.dispose(!0,!0);for(let t of e)t.isDisposed()||t.dispose(!1,!0)}function Ia(n){return new b(n.x,n.y,n.z)}function OQ(n){return Number.isFinite(n)?Math.max(0,Math.min(n,1)):0}function NQ(n){let e=new ze("measure-marker-mat",n);return e.diffuseColor=gE.clone(),e.emissiveColor=gE.clone(),e.specularColor=new Ee(0,0,0),e.disableLighting=!0,e.alpha=.48,e}function pE(n,e){let t=n.material;t&&(t.diffuseColor=e.clone(),t.emissiveColor=e.clone())}function wEe(n){let e=n.replace(/\s+#.*$/,"").trim();if(e.startsWith('"')){let t=e.indexOf('"',1);if(t>1)return e.slice(1,t)}return e}function FEe(n){let e=n.trim().split(/\s+/),t=e.findIndex(i=>!i.startsWith("-")&&!/^[-+]?\d*\.?\d+$/.test(i));return e.slice(Math.max(0,t)).join(" ").replace(/^"|"$/g,"")}function BEe(n){var t,i;let e=(i=(t=n.split(".").pop())==null?void 0:t.toLowerCase())!=null?i:"png";return e==="jpg"||e==="jpeg"?"image/jpeg":e==="png"?"image/png":e==="bmp"?"image/bmp":e==="tga"?"image/x-tga":e==="webp"?"image/webp":`image/${e}`}function UEe(n,e,t){let i=Gs(e),r=i.replace(/\.[^.]+$/,""),s=dn(t),a=[In(n,e),In(n,i)];if(s)for(let o of PQ)a.push(In(n,`${s}.${o}`));for(let o of PQ){let l=`${r}.${o}`;l!==i&&a.push(In(n,l))}return a}function VEe(n){return new e0(n)}var JM,PQ,IEe,CEe,PEe,DQ,gE,DEe,LEe,LQ,Ca,e0,FQ=y(()=>{"use strict";iL();Ks();HR();XR();AH();xH();ML();We();Kt();wi();$f();dO();Yi();jc();lY();VO();sM();E6();pL();Qp();dE();dE();iF();rF();Fq();hQ();_A();ga();ps();mQ();CQ();mE();gl();bA();wC();G_();ks();DA();F_();W_();JM=null,PQ=["jpg","jpeg","png","bmp","tga","webp","tif","tiff"],IEe=/^\s*(map_Kd|map_Ka|map_Ks|map_Ns|map_d|map_bump|bump|disp|decal)\s+(.+)/i,CEe=.242,PEe=320,DQ=new Ee(.97,.98,.99),gE=new Ee(.97,.98,.99),DEe=new Ee(.96,.62,.04),LEe=new Ee(1,1,1),LQ=new Ee(.9,.91,.92);Ca=class Ca{constructor(e){this.rootMesh=null;this.loadedMeshes=[];this.loadedTransformNodes=[];this.cachedRenderableMeshes=null;this.cachedRenderableRoot=null;this.loadedExt="";this.rendering=!1;this.contextLost=!1;this.viewportVisible=!0;this.viewportObserver=null;this.cleanupPicking=null;this.configLights=[];this.shadowGenerator=null;this.groundMesh=null;this.gridMesh=null;this.axisMeshes=[];this.autoRotateBehavior=null;this.wireframeEnabled=!1;this.gizmo=null;this.gizmoEnabled=!1;this.disassembly=null;this.focusSelectionEnabled=!1;this.focusedNode=null;this.originalMeshVisibility=new Map;this.bboxMesh=null;this.bboxEnabled=!1;this.currentQuality="high";this.renderScale=1;this.resourceWarnings=[];this.gltfComponentMetadata=new Map;this.animPlaying=!1;this.initialCamera={alpha:Math.PI/4,beta:Math.PI/3,radius:5,target:b.Zero()};this.focusWorldPointFrame=0;this._lastPickResult={mesh:null,pickedPoint:null,screenX:0,screenY:0};this._onPickCallbacks=[];this.measurementActive=!1;this.measurementScale={x:1,y:1,z:1};this.measurementBaseRootScaling=new b(1,1,1);this.measurementBaseBounds=null;this.measurementUnit="mm";this.measurementSegments=[];this.measurementMarkers=[];this.measurementMarkerPoints=[];this.measurementTargetNode=null;this.measurementTargetMeshes=[];this.measurementSnapInputCache=null;this.measurementSnapInputCacheTargetId=null;this.measurementSnapKind=null;this.measurementObservers=new Set;this.pendingPoint=null;this.pendingMarker=null;this.hoveredMarkerIndex=-1;this.lastPointerClient={x:0,y:0,altKey:!1};this.previewLine=null;this.cameraZoomObservers=new Set;this.handlePointerMove=e=>{if(this.lastPointerClient={x:e.clientX,y:e.clientY,altKey:e.altKey},!this.measurementActive||(this.pendingPoint&&this.updatePreviewLine(),this.measurementMarkers.length===0))return;let t=this.engine.getRenderingCanvas();if(!t)return;let i=t.getBoundingClientRect(),r=e.clientX-i.left,s=e.clientY-i.top,a=this.scene.pick(r,s,l=>this.measurementMarkers.includes(l)),o=a.hit?this.measurementMarkers.indexOf(a.pickedMesh):-1;if(o!==this.hoveredMarkerIndex){if(this.hoveredMarkerIndex>=0&&this.hoveredMarkerIndex=0&&o{e.preventDefault(),e.stopPropagation()};this.handleViewportIntersection=e=>{let t=e.some(i=>i.isIntersecting);t!==this.viewportVisible&&(this.viewportVisible=t,t?this.startRenderLoop():this.rendering&&(this.engine.stopRenderLoop(),this.rendering=!1))};this.handleContextLost=e=>{e.preventDefault(),this.contextLost=!0,this.rendering&&(this.engine.stopRenderLoop(),this.rendering=!1)};this.handleContextRestored=()=>{this.contextLost=!1,this.engine.resize(),this.startRenderLoop()};this.engine=new ke(e,!0,{preserveDrawingBuffer:!0}),this.scene=new ri(this.engine),this.scene.clearColor=new dt(.12,.12,.14,1),this.scene.setRenderingAutoClearDepthStencil(2,!0,!0,!0),this.camera=new Ri("cam",Math.PI/4,Math.PI/3,5,b.Zero(),this.scene),this.camera.attachControl(e,!0),this.camera.lowerRadiusLimit=.1,this.camera.wheelPrecision=45,this.camera.onViewMatrixChangedObservable.add(()=>{this.measurementSegments.length>0&&this.updateMeasurementOverlayPositions(),this.notifyCameraZoomChanged()}),e.addEventListener("wheel",this.preventCanvasWheelScroll,{passive:!1}),e.addEventListener("pointermove",this.handlePointerMove),e.addEventListener("webglcontextlost",this.handleContextLost),e.addEventListener("webglcontextrestored",this.handleContextRestored),this.scene.ambientColor=new Ee(.3,.3,.3);let t=new Ra("default-light",new b(0,1,.5),this.scene);t.intensity=1.2,this.resizeObs=new ResizeObserver(()=>this.engine.resize()),this.resizeObs.observe(e),typeof IntersectionObserver!="undefined"&&(this.viewportObserver=new IntersectionObserver(this.handleViewportIntersection,{root:null,threshold:[0,.01]}),this.viewportObserver.observe(e)),window.requestAnimationFrame(()=>this.engine.resize())}canRender(){let e=this.engine.getRenderingCanvas();return!!(e!=null&&e.isConnected)&&e.clientWidth>0&&e.clientHeight>0}getCameraZoomRange(){if(!this.rootMesh)return null;let e=this.camera.radius,t=this.camera.lowerRadiusLimit,i=this.camera.upperRadiusLimit,r=typeof t=="number"&&Number.isFinite(t)&&t>0?t:Math.max(e*.08,1e-5),s=typeof i=="number"&&Number.isFinite(i)&&i>r?i:Math.max(e*8,r*10);return{current:Math.max(r,Math.min(e,s)),min:r,max:s}}notifyCameraZoomChanged(){if(this.cameraZoomObservers.size===0)return;let e=this.getCameraZoomState();for(let t of this.cameraZoomObservers)t(e)}ensureDisassemblyController(){return this.rootMesh?(this.disassembly||(this.disassembly=IQ(this.scene,this.camera,this.rootMesh,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata)),this.disassembly):null}isDisassemblyActive(){var e,t;return(t=(e=this.disassembly)==null?void 0:e.isEnabled())!=null?t:!1}async loadModel(e,t,i,r,s){var g,p,_;Ti(s),await fE(),Ti(s),this.rootMesh&&(kF(this.loadedMeshes,this.loadedTransformNodes),this.rootMesh=null,this.notifyCameraZoomChanged()),this.invalidateMeshCache(),this.loadedMeshes=[],this.loadedTransformNodes=[],this.disposeMeasurementOverlays(!0),this.resetMeasurementCalibrationState(),(g=this.disassembly)==null||g.dispose(),this.disassembly=null,this.clearFocusedMesh(),this.originalMeshVisibility.clear();let a=t.toLowerCase().replace(".","");this.loadedExt=a,this.resourceWarnings=[],Ti(s),this.gltfComponentMetadata=Nq(e,a);let o=this.scene,c=(p={glb:".glb",gltf:".gltf",stl:".stl",obj:".obj",splat:".splat",ply:".ply"}[a])!=null?p:`.${a}`;Ti(s);let f=`data:application/octet-stream;base64,${pu(e)}`;Ti(s);let d=v=>{try{Ti(s)}catch(E){throw kF(v.meshes,v.transformNodes),E}this.loadedMeshes=v.meshes,this.loadedTransformNodes=v.transformNodes,v.meshes.length>0&&(this.rootMesh=v.meshes[0])},u=()=>{try{Ti(s)}catch(v){throw kF(this.loadedMeshes,this.loadedTransformNodes),this.loadedMeshes=[],this.loadedTransformNodes=[],this.rootMesh=null,this.invalidateMeshCache(),this.notifyCameraZoomChanged(),v}};if(a==="obj"&&i&&r){JM&&await JM,Ti(s);let v;JM=new Promise(E=>{v=E});try{let{OBJFileLoader:E}=await Promise.resolve().then(()=>(eF(),Tq)),T=E.prototype;typeof T._loadMTL!="function"&&console.warn("[AI3D] OBJFileLoader._loadMTL not found \u2014 MTL vault resolution disabled");let S=T._loadMTL,R=new TextDecoder().decode(new Uint8Array(e)).match(/mtllib\s+(.+)/),M=null;if(R&&i&&r){let C=wEe(R[1]),D=w_(r),w=In(D,C);try{let k=await i(w);Ti(s);let N=new TextDecoder().decode(new Uint8Array(k)).split(` `);for(let Z=0;ZZ!=="");if(!B.some(Z=>/^\s*Kd\s+/i.test(Z))){let Z=B.findIndex(j=>/^\s*newmtl\s+/i.test(j));B.splice(Z>=0?Z+1:0,0,"Kd 0.80 0.80 0.80")}M=B.join(` -`)}catch(k){if(Df(k))throw k;this.resourceWarnings.push(`OBJ material library not found: ${w}`)}}T._loadMTL=function(C,D,w){let k=M!=null?M:"";w(k)};let I=await Jv(f,o,{meshNames:"",pluginExtension:c});d(I),T._loadMTL=S}catch(E){throw Df(E)||console.error("[AI3D] OBJ load error:",E),E}finally{v(),JM=null}}else if(a==="stl"){let v=bq(o,e);try{Ti(s)}catch(E){throw v==null||v.dispose(!1,!0),E}this.rootMesh=v,this.rootMesh&&(this.loadedMeshes=[this.rootMesh])}else if(a==="ply"){let v=yq(o,e);try{Ti(s)}catch(E){throw v==null||v.dispose(!1,!0),E}this.rootMesh=v,this.rootMesh&&(this.loadedMeshes=[this.rootMesh])}else{let v=await Jv(f,o,{meshNames:"",pluginExtension:c});d(v)}if(u(),!this.rootMesh)throw new Error("No mesh found in model file");let h=this.getRenderableBounds(this.rootMesh);this.captureMeasurementBaseState(this.rootMesh,h);for(let v of this.getRenderableMeshes(this.rootMesh))v.material&&(v.material.backFaceCulling=!1);let m=V_(h);return this.camera.target=Ia(m.target),this.camera.radius=m.radius,this.camera.lowerRadiusLimit=m.lowerRadiusLimit,this.camera.upperRadiusLimit=m.upperRadiusLimit,this.camera.minZ=m.near,this.camera.maxZ=m.far,this.initialCamera={alpha:this.camera.alpha,beta:this.camera.beta,radius:this.camera.radius,target:this.camera.target.clone()},this.notifyCameraZoomChanged(),this.startRenderLoop(),this.engine.resize(),(_=this.cleanupPicking)==null||_.call(this),this.cleanupPicking=uQ(this.scene,v=>{var S;if(this.isDisassemblyActive())return;let E=v.mesh&&this.rootMesh?hE(this.rootMesh,v.mesh,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata):null,T={mesh:E,pickedPoint:v.pickedPoint,screenX:v.screenX,screenY:v.screenY,modifiers:v.modifiers};if(this._lastPickResult=T,this.measurementActive&&v.pickedPoint){if(((S=v.modifiers)==null?void 0:S.altKey)===!0){this.setMeasurementSnapKind("free"),this.addMeasurementPoint(Ia(v.pickedPoint));return}if(!this.measurementTargetNode){E&&this.setMeasurementTargetNode(E);return}this.addMeasurementPoint(this.resolveMeasurementPickPoint(Ia(v.pickedPoint),!1));return}this.focusSelectionEnabled&&E&&this.setFocusedNode(E),this._onPickCallbacks.forEach(A=>A(T))},()=>!this.focusSelectionEnabled&&!this.measurementActive,v=>this.resolvePickHighlightMeshes(v)),this.ensureDisassemblyController(),this.createModelSummary(this.rootMesh)}applyConfig(e){e.camera&&this.applyCameraConfig(e.camera),e.lights&&this.applyLightConfig(e.lights),e.scene&&this.applySceneConfig(e.scene),e.stl&&this.loadedExt==="stl"&&(e.stl.color&&this.setSTLColor(e.stl.color),e.stl.wireframe!==void 0&&this.setWireframe(e.stl.wireframe))}applyCameraConfig(e){var i;let t=this.engine.getRenderingCanvas();if(t){if(e.mode==="orthographic"){let r=this.camera.radius,s=t.clientWidth/t.clientHeight,a=(i=e.zoom)!=null?i:1,o=r/a;this.camera.mode=1,this.camera.orthoLeft=-o*s,this.camera.orthoRight=o*s,this.camera.orthoTop=o,this.camera.orthoBottom=-o}else this.camera.mode=0,e.fov&&(this.camera.fov=e.fov*Math.PI/180);if(e.position){let[r,s,a]=e.position;this.camera.setPosition(new b(r,s,a))}if(e.lookAt){let[r,s,a]=e.lookAt;this.camera.setTarget(new b(r,s,a))}e.near!==void 0&&(this.camera.minZ=e.near),e.far!==void 0&&(this.camera.maxZ=e.far),this.notifyCameraZoomChanged()}}applyLightConfig(e){var i;for(let r of this.configLights)r.dispose();this.configLights=[],(i=this.shadowGenerator)==null||i.dispose(),this.shadowGenerator=null;let t=this.scene.getLightByName("default-light");t&&t.dispose();for(let r of e){let s=this.createLight(r);s&&this.configLights.push(s)}}createLight(e){var r,s;let t=e.color?Ee.FromHexString(e.color):Ee.White(),i=(r=e.intensity)!=null?r:1;switch(e.type){case"hemisphere":{let a=e.groundColor?Ee.FromHexString(e.groundColor):new Ee(.2,.2,.2),o=new Ra("hemi",new b(0,1,0),this.scene);return o.diffuse=t,o.groundColor=a,o.intensity=i,o}case"directional":{let a=e.position?new b(...e.position).normalize():new b(-1,-2,-1).normalize(),o=new $s("dir",a,this.scene);return o.diffuse=t,o.intensity=i,e.castShadow&&this.rootMesh&&this.setupShadow(o),o}case"point":{let a=e.position?new b(...e.position):new b(0,5,0),o=new cd("point",a,this.scene);return o.diffuse=t,o.intensity=i,e.decay!==void 0&&(o.decay=e.decay),o}case"spot":{let a=e.position?new b(...e.position):new b(0,5,0),l=(e.target?new b(...e.target):b.Zero()).subtract(a).normalize(),c=e.angle?e.angle*Math.PI/180:Math.PI/4,f=(s=e.penumbra)!=null?s:.5,d=new Kr("spot",a,l,c,f,this.scene);return d.diffuse=t,d.intensity=i,e.decay!==void 0&&(d.decay=e.decay),e.castShadow&&this.rootMesh&&this.setupShadow(d),d}case"attachToCam":{let a=new cd("cam-light",b.Zero(),this.scene);return a.diffuse=t,a.intensity=i,a.parent=this.camera,a}default:return null}}setupShadow(e){if(!this.rootMesh)return;if(!OEe(e)){console.warn("[AI3D] Light type does not support shadows:",e.name);return}let t=new Fi(1024,e);t.useBlurExponentialShadowMap=!0,t.blurKernel=32;for(let i of this.getRenderableMeshes(this.rootMesh))t.addShadowCaster(i),i.receiveShadows=!0;this.shadowGenerator=t}applySceneConfig(e){var t,i;if(e.background!==void 0){let r=dt.FromColor3(Ee.FromHexString(e.background),e.transparent?0:1);this.scene.clearColor=r}e.autoRotate&&(this.autoRotateBehavior?this.autoRotateBehavior.idleRotationSpeed=(i=e.autoRotateSpeed)!=null?i:.5:(this.autoRotateBehavior=new wp,this.autoRotateBehavior.idleRotationSpeed=(t=e.autoRotateSpeed)!=null?t:.5,this.autoRotateBehavior.idleRotationWaitTime=1e3,this.autoRotateBehavior.idleRotationSpinupTime=500,this.camera.addBehavior(this.autoRotateBehavior))),e.groundShadow&&this.rootMesh&&this.createGround(),e.grid&&this.createGrid(),e.axis&&this.createAxis()}createGround(){if(!this.rootMesh||this.groundMesh)return;let e=this.getRenderableBounds(this.rootMesh),t=Xi(e),i=Math.max(t.x,t.z)*3,r=e.min.y;this.groundMesh=Nn.CreateGround("ground",{width:i,height:i},this.scene),this.groundMesh.position.y=r;let s=new ze("ground-mat",this.scene);s.diffuseColor=new Ee(.15,.15,.15),s.specularColor=Ee.Black(),s.alpha=.5,this.groundMesh.material=s,this.groundMesh.receiveShadows=!0}createGrid(){if(!this.rootMesh||this.gridMesh)return;let e=this.getRenderableBounds(this.rootMesh),t=Xi(e),i=Math.max(t.x,t.z)*2,r=e.min.y-.01;this.gridMesh=Nn.CreateGround("grid",{width:i,height:i,subdivisions:20},this.scene),this.gridMesh.position.y=r;let s=new ze("grid-mat",this.scene);s.wireframe=!0,s.diffuseColor=new Ee(.3,.3,.3),s.emissiveColor=new Ee(.1,.1,.1),this.gridMesh.material=s}createAxis(){if(!this.rootMesh||this.axisMeshes.length>0)return;let e=this.getRenderableBounds(this.rootMesh),t=xU(e)*1.5,i=Ia(e.min),r=U_(e)*.01,s=[["x",Ee.Red(),new b(t,0,0)],["y",Ee.Green(),new b(0,t,0)],["z",Ee.Blue(),new b(0,0,t)]];for(let[a,o,l]of s){let c=Nn.CreateTube(`axis-${a}`,{path:[i,i.add(l)],radius:r,tessellation:8},this.scene),f=new ze(`axis-${a}-mat`,this.scene);f.emissiveColor=o,f.diffuseColor=Ee.Black(),c.material=f,this.axisMeshes.push(c)}}setSTLColor(e){if(!this.rootMesh)return;let t=Ee.FromHexString(e);for(let i of this.getRenderableMeshes(this.rootMesh))if(i.material&&i.material.name==="stl-mat"){let r=i.material;r.diffuseColor=t,r.emissiveColor=t.scale(.1)}}setWireframe(e){this.rootMesh&&(VF(this.rootMesh)||(this.wireframeEnabled=e,this.scene.forceWireframe=e))}toggleWireframe(){return this.setWireframe(!this.wireframeEnabled),this.wireframeEnabled}hasAnimations(){return this.scene.animationGroups.length>0}toggleAnimation(){let e=this.scene.animationGroups;if(e.length===0)return!1;this.animPlaying=!this.animPlaying;for(let t of e)this.animPlaying?t.play(!0):t.pause();return this.animPlaying}toggleMeasurement(){var t,i;if(this.measurementActive)return this.deactivateMeasurementMode(),!1;this.isDisassemblyActive()&&((t=this.disassembly)==null||t.setEnabled(!1));let e=this.getCurrentMeasurementTargetNode();return(i=this.cleanupPicking)==null||i.clearHighlight(),this.clearFocusedMesh(),this.focusSelectionEnabled&&(this.focusSelectionEnabled=!1),this.measurementActive=!0,this.setMeasurementTargetNode(e,!1),wf(this.engine.getRenderingCanvas(),this.measurementActive),this.notifyMeasurementsChanged(),this.measurementActive}isMeasurementActive(){return this.measurementActive}clearMeasurements(){this.disposeMeasurementOverlays(!1)}cancelMeasurement(){let e=!!this.pendingPoint;this.cancelPendingMeasurement(),e&&this.notifyMeasurementsChanged()}deactivateMeasurementMode(){return this.measurementActive?(this.measurementActive=!1,wf(this.engine.getRenderingCanvas(),!1),this.setMeasurementTargetNode(null,!1),this.cancelPendingMeasurement(),this.notifyMeasurementsChanged(),!0):!1}disposeMeasurementOverlays(e){e&&(this.measurementActive=!1,wf(this.engine.getRenderingCanvas(),!1),this.setMeasurementTargetNode(null,!1)),this.cancelPendingMeasurement(!1);for(let t of this.measurementSegments)t.line.dispose(!1,!0),t.label.dispose(!1,!0);this.measurementSegments=[];for(let t of this.measurementMarkers)t.dispose(!1,!0);this.measurementMarkers=[],this.measurementMarkerPoints=[],this.notifyMeasurementsChanged()}setMeasurementScale(e){this.measurementScale=_s(e),this.applyMeasurementModelScale(),this.updateMeasurementOverlayPositions(),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementScale(){return{...this.measurementScale}}setMeasurementUnit(e){this.measurementUnit=k_(e),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementUnit(){return this.measurementUnit}getMeasurementBounds(){var t;if(!this.rootMesh)return null;let e=(t=this.measurementBaseBounds)!=null?t:this.getRenderableBounds(this.rootMesh);return e?{x:e.max.x-e.min.x,y:e.max.y-e.min.y,z:e.max.z-e.min.z}:null}getMeasurementRecords(){return this.createMeasurementRecords()}getMeasurementState(){return zA({active:this.measurementActive,pending:!!this.pendingPoint,records:this.createMeasurementRecords(),unit:this.measurementUnit,scale:this.getMeasurementScale(),bounds:this.getMeasurementBounds(),targetLocked:!!this.measurementTargetNode,targetName:this.getMeasurementTargetName(),snapKind:this.measurementSnapKind})}exportMeasurements(){return KA(this.createMeasurementRecords())}observeMeasurements(e){return this.measurementObservers.add(e),e(),()=>{this.measurementObservers.delete(e)}}updateMeasurementLabels(){var t;if(this.measurementSegments.length===0)return;let e=this.getMeasurementMarkerSize()*3.2;for(let i of this.measurementSegments){this.updateMeasurementLineGeometry(i);let r=Dm(this.createMeasurementReading(i.start,i.end));i.label.dispose(!1,!0);let s=this.createBabylonMeasurementDraftingLayout(i.start,i.end),a=(t=s==null?void 0:s.labelPosition)!=null?t:b.Center(this.toMeasurementDisplayPoint(i.start),this.toMeasurementDisplayPoint(i.end));i.label=this.createMeasurementLabelMesh(r,a,e)}}captureMeasurementBaseState(e,t){this.measurementBaseRootScaling=e.scaling.clone(),this.measurementBaseBounds=t?ka(t.min,t.max):null,this.measurementScale={x:1,y:1,z:1}}resetMeasurementCalibrationState(){this.measurementScale={x:1,y:1,z:1},this.measurementBaseRootScaling=new b(1,1,1),this.measurementBaseBounds=null,this.measurementMarkerPoints=[]}applyMeasurementModelScale(){if(!this.rootMesh)return;let e=_s(this.measurementScale);this.rootMesh.scaling=new b(this.measurementBaseRootScaling.x*e.x,this.measurementBaseRootScaling.y*e.y,this.measurementBaseRootScaling.z*e.z),this.rootMesh.computeWorldMatrix(!0);for(let t of this.loadedMeshes)t.computeWorldMatrix(!0);this.invalidateMeshCache(),this.rebuildScaledSceneHelpers(),this.refitCameraToModel(),this.startRenderLoop()}rebuildScaledSceneHelpers(){var s,a,o;let e=!!this.bboxMesh,t=!!this.groundMesh,i=!!this.gridMesh,r=this.axisMeshes.length>0;(s=this.bboxMesh)==null||s.dispose(),this.bboxMesh=null,(a=this.groundMesh)==null||a.dispose(),this.groundMesh=null,(o=this.gridMesh)==null||o.dispose(),this.gridMesh=null;for(let l of this.axisMeshes)l.dispose();if(this.axisMeshes=[],e&&this.rootMesh){let l=this.getRenderableBounds(this.rootMesh),c=Ia(Er(l)),f=Ia(Xi(l));this.bboxMesh=Nn.CreateBox("bbox",{width:f.x,height:f.y,depth:f.z},this.scene),this.bboxMesh.position=c;let d=new ze("bbox-mat",this.scene);d.wireframe=!0,d.emissiveColor=new Ee(1,1,0),d.disableLighting=!0,d.alpha=.6,this.bboxMesh.material=d}t&&this.createGround(),i&&this.createGrid(),r&&this.createAxis()}refitCameraToModel(){if(!this.rootMesh)return;let e=V_(this.getRenderableBounds(this.rootMesh));this.camera.target=Ia(e.target),this.camera.radius=e.radius,this.camera.lowerRadiusLimit=e.lowerRadiusLimit,this.camera.upperRadiusLimit=e.upperRadiusLimit,this.camera.minZ=e.near,this.camera.maxZ=e.far,this.initialCamera={alpha:this.camera.alpha,beta:this.camera.beta,radius:this.camera.radius,target:this.camera.target.clone()},this.notifyCameraZoomChanged()}getMeasurementPivot(){var e,t;return(t=(e=this.rootMesh)==null?void 0:e.getAbsolutePosition().clone())!=null?t:b.Zero()}toMeasurementDisplayPoint(e){let t=BA(e,this.getMeasurementPivot(),this.measurementScale);return new b(t.x,t.y,t.z)}toMeasurementBasePoint(e){let t=UA(e,this.getMeasurementPivot(),this.measurementScale);return new b(t.x,t.y,t.z)}updateMeasurementOverlayPositions(){for(let e=0;e{this.cameraZoomObservers.delete(e)}}getPerformanceSnapshot(){return{backend:"babylon",renderScale:Number((1/this.engine.getHardwareScalingLevel()).toFixed(2)),quality:this.currentQuality,meshCount:this.rootMesh?this.getRenderableMeshes(this.rootMesh).length:0}}toggleBoundingBox(){var e;if(this.bboxEnabled=!this.bboxEnabled,this.bboxEnabled){if(!this.rootMesh)return this.bboxEnabled;this.bboxMesh&&this.bboxMesh.dispose();let t=this.getRenderableBounds(this.rootMesh),i=Ia(Er(t)),r=Ia(Xi(t));this.bboxMesh=Nn.CreateBox("bbox",{width:r.x,height:r.y,depth:r.z},this.scene),this.bboxMesh.position=i;let s=new ze("bbox-mat",this.scene);s.wireframe=!0,s.emissiveColor=new Ee(1,1,0),s.disableLighting=!0,s.alpha=.6,this.bboxMesh.material=s}else(e=this.bboxMesh)==null||e.dispose(),this.bboxMesh=null;return this.bboxEnabled}toggleFocusSelection(){var t;let e=!this.focusSelectionEnabled;return e&&this.isDisassemblyActive()&&((t=this.disassembly)==null||t.setEnabled(!1)),e&&this.deactivateMeasurementMode(),this.focusSelectionEnabled=e,this.focusSelectionEnabled?this._lastPickResult.mesh&&this.setFocusedNode(this._lastPickResult.mesh):this.clearFocusedMesh(),this.focusSelectionEnabled}isFocusSelectionEnabled(){return this.focusSelectionEnabled}toggleDisassembly(){let e=this.ensureDisassemblyController();if(!e)return!1;let t=!e.isEnabled();return t&&(this.focusSelectionEnabled=!1,this.clearFocusedMesh(),this.deactivateMeasurementMode()),e.setEnabled(t)}resetDisassembly(){var e;(e=this.disassembly)==null||e.reset()}isDisassemblyEnabled(){return this.isDisassemblyActive()}setExplode(e,t){this.rootMesh&&wq(this.rootMesh,e,t,this.loadedMeshes)}resetExplode(){this.rootMesh&&lF(this.rootMesh,this.loadedMeshes)}resetView(){this.rootMesh&&lF(this.rootMesh,this.loadedMeshes),this.resetDisassembly(),this.clearFocusedMesh(),this.camera.mode=0,this.camera.alpha=this.initialCamera.alpha,this.camera.beta=this.initialCamera.beta,this.camera.radius=this.initialCamera.radius,this.camera.target=this.initialCamera.target.clone(),this.startRenderLoop(),this.notifyCameraZoomChanged()}exportModelInfo(e){if(!this.rootMesh)return"";let t=this.getRenderableMeshes(this.rootMesh),i=VF(this.rootMesh),r=this.createModelSummary(this.rootMesh),s=e&&Gs(e)||r.rootName;return CA({title:s,format:this.loadedExt.toUpperCase(),summary:r,meshBreakdown:t.map(a=>Dq(a,{isSplat:i})),materialNames:t.map(a=>{var o;return(o=a.material)==null?void 0:o.name})})}getModelEvidence(){if(!this.rootMesh)return null;let e=this.getRenderableMeshes(this.rootMesh),t=Oq(e,this.loadedTransformNodes,this.gltfComponentMetadata);return NA({summary:this.createModelSummary(this.rootMesh),renderableMeshes:e,groupedPartCandidates:t,createMeshPart:i=>sF(i,this.gltfComponentMetadata),getMeshMaterialNames:i=>{var r;return[(r=i.material)==null?void 0:r.name]},resourceWarnings:this.resourceWarnings})}getSelectedPartInfo(){var t;if(!this.rootMesh)return null;let e=(t=this.focusedNode)!=null?t:GF(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;return!e||Jc(e)?null:aF(e,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata)}exportSelectedPartInfo(){let e=this.getSelectedPartInfo();return e?PA(e):""}getPickWorldPoint(e){return e.pickedPoint&&typeof e.pickedPoint=="object"?ei(e.pickedPoint):this.rootMesh&&GF(e.mesh)?aF(e.mesh,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata).center:null}focusWorldPoint(e){let t=new b(e.x,e.y,e.z),i=this.camera.target.clone(),r=performance.now();this.focusWorldPointFrame&&(activeWindow.cancelAnimationFrame(this.focusWorldPointFrame),this.focusWorldPointFrame=0);let s=a=>{let o=Math.min(1,Math.max(0,(a-r)/PEe)),l=o<.5?4*o*o*o:1-Math.pow(-2*o+2,3)/2;if(this.camera.target=b.Lerp(i,t,l),o<1&&!this.scene.isDisposed){this.focusWorldPointFrame=window.requestAnimationFrame(s);return}this.focusWorldPointFrame=0};this.focusWorldPointFrame=window.requestAnimationFrame(s)}getAnnotationCameraStateKey(){return OA([{value:this.camera.alpha,digits:3},{value:this.camera.beta,digits:3},{value:this.camera.radius,digits:3},{value:this.camera.target.x,digits:2},{value:this.camera.target.y,digits:2},{value:this.camera.target.z,digits:2}])}projectAnnotationWorldPoint(e,t){let i=this.engine.getRenderingCanvas();if(!i||this.scene.isDisposed)return!1;let r=this.engine.getRenderWidth(),s=this.engine.getRenderHeight();if(r===0||s===0||i.clientWidth===0||i.clientHeight===0)return!1;let a=Ca.annotationWorldPoint;return a.set(e.x,e.y,e.z),b.ProjectToRef(a,Ca.annotationIdentity,this.scene.getTransformMatrix(),this.camera.viewport.toGlobal(r,s),Ca.annotationProjection),DU(Ca.annotationProjection,r,s,i,t)}isAnnotationWorldPointOccluded(e){if(this.scene.isDisposed)return!1;let t=Of(ei(this.camera.position),e);if(!t)return!1;let i=Ca.annotationDirection,r=Ca.annotationRay;i.set(t.direction.x,t.direction.y,t.direction.z),r.origin=this.camera.position,r.direction=i,r.length=t.distance;let s=this.scene.pickWithRay(r);return!!(s!=null&&s.hit)&&Lf(s.distance,t.distance,t.epsilon)}getAnnotationProvider(){let e=this.engine.getRenderingCanvas();if(!e)throw new Error("Preview canvas is unavailable");return LA({canvas:e,observeRender:t=>{let i=this.scene.onAfterRenderCameraObservable.add(r=>{r===this.camera&&t()});return{remove:()=>this.scene.onAfterRenderCameraObservable.remove(i)}},getCameraStateKey:()=>this.getAnnotationCameraStateKey(),projectWorldPoint:(t,i)=>this.projectAnnotationWorldPoint(t,i),isWorldPointOccluded:t=>this.isAnnotationWorldPointOccluded(t)})}getCanvas(){return this.engine.getRenderingCanvas()}getLastPickResult(){return this._lastPickResult}onPick(e){return this._onPickCallbacks.push(e),()=>{this._onPickCallbacks=this._onPickCallbacks.filter(t=>t!==e)}}setRenderQuality(e,t=this.renderScale){this.currentQuality=e,this.renderScale=Math.max(.25,Math.min(t,2));let i={low:2,medium:1.33,high:1},r=Rr()?1.5:1,s=i[e]*r/this.renderScale;if(this.engine.setHardwareScalingLevel(s),this.shadowGenerator){let a={low:0,medium:16,high:32};this.shadowGenerator.blurKernel=a[e],e==="low"?(this.shadowGenerator.useBlurExponentialShadowMap=!1,this.shadowGenerator.useExponentialShadowMap=!0):(this.shadowGenerator.useBlurExponentialShadowMap=!0,this.shadowGenerator.useExponentialShadowMap=!1)}}destroy(){var t,i,r,s,a,o,l,c;this.engine.stopRenderLoop(),this.focusWorldPointFrame&&(activeWindow.cancelAnimationFrame(this.focusWorldPointFrame),this.focusWorldPointFrame=0),this._onPickCallbacks=[],this.cameraZoomObservers.clear(),(t=this.cleanupPicking)==null||t.call(this),this.cleanupPicking=null,(i=this.gizmo)==null||i.dispose(),this.gizmo=null,(r=this.disassembly)==null||r.dispose(),this.disassembly=null,this.disposeMeasurementOverlays(!0),this.measurementObservers.clear(),this.clearFocusedMesh(),this.originalMeshVisibility.clear(),(s=this.bboxMesh)==null||s.dispose(),this.bboxMesh=null,this.camera.detachControl();let e=this.engine.getRenderingCanvas();e==null||e.removeEventListener("wheel",this.preventCanvasWheelScroll),e==null||e.removeEventListener("pointermove",this.handlePointerMove),e==null||e.removeEventListener("webglcontextlost",this.handleContextLost),e==null||e.removeEventListener("webglcontextrestored",this.handleContextRestored),(a=this.viewportObserver)==null||a.disconnect(),this.viewportObserver=null,this.resizeObs.disconnect(),this.invalidateMeshCache(),this.rootMesh=null,this.loadedMeshes=[],this.loadedTransformNodes=[],this.autoRotateBehavior&&(this.camera.removeBehavior(this.autoRotateBehavior),this.autoRotateBehavior=null);for(let f of this.configLights)f.dispose();this.configLights=[],(o=this.shadowGenerator)==null||o.dispose(),this.shadowGenerator=null,(l=this.groundMesh)==null||l.dispose(),this.groundMesh=null,(c=this.gridMesh)==null||c.dispose(),this.gridMesh=null;for(let f of this.axisMeshes)f.dispose();this.axisMeshes=[],this.scene.dispose(),this.engine.dispose()}startRenderLoop(){this.rendering||!this.viewportVisible||this.contextLost||(this.rendering=!0,this.engine.runRenderLoop(()=>{if(!this.canRender()||!this.viewportVisible||this.contextLost){this.engine.stopRenderLoop(),this.rendering=!1;return}this.scene.render(),this.gizmo&&this.gizmoEnabled&&(this.gizmo.syncWith(this.camera),this.gizmo.render())}))}getRenderableMeshes(e){if(this.cachedRenderableMeshes&&this.cachedRenderableRoot===e)return this.cachedRenderableMeshes;let t=sh(e,this.loadedMeshes);return this.cachedRenderableMeshes=t,this.cachedRenderableRoot=e,t}getRenderableBounds(e){return VM(e,this.loadedMeshes)}invalidateMeshCache(){this.cachedRenderableMeshes=null,this.cachedRenderableRoot=null}resolvePickHighlightMeshes(e){if(!this.rootMesh)return[e];let t=this.getRenderableMeshes(this.rootMesh),i=hE(this.rootMesh,e,t,this.gltfComponentMetadata),r=t.filter(s=>lg(s,i));return r.length>0?r:[e]}setFocusedNode(e){if(!this.rootMesh)return;let t=e?this.findSelectableNode(e):null;if(!t||Jc(t)){this.clearFocusedMesh();return}if(this.focusedNode===t)return;let i=this.getRenderableMeshes(this.rootMesh),r=i.filter(a=>lg(a,t));if(r.length===0){this.clearFocusedMesh();return}let s=new Set(r);for(let a of i){this.originalMeshVisibility.has(a.uniqueId)||this.originalMeshVisibility.set(a.uniqueId,a.visibility);let o=s.has(a);a.visibility=o?1:CEe,a.renderOutline=o,a.outlineColor=new Ee(.18,.76,1),a.outlineWidth=o?.045:0}this.focusedNode=t}clearFocusedMesh(){if(!this.rootMesh){this.focusedNode=null;return}for(let e of this.getRenderableMeshes(this.rootMesh)){let t=this.originalMeshVisibility.get(e.uniqueId);t!==void 0&&(e.visibility=t),e.renderOutline=!1,e.outlineWidth=0}this.originalMeshVisibility.clear(),this.focusedNode=null,this.applyMeasurementTargetVisual(this.measurementTargetMeshes)}findSelectableNode(e){if(!this.rootMesh)return null;let t=this.getRenderableMeshes(this.rootMesh);if(t.includes(e)||t.some(r=>lg(r,e)))return e;if(!NEe(e))return null;let i=e.parent;for(;i&&"uniqueId"in i;){let r=i;if(t.includes(r)||t.some(s=>lg(s,r)))return r;i=i.parent}return null}getCurrentMeasurementTargetNode(){var t;let e=(t=this.focusedNode)!=null?t:GF(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;return!e||Jc(e)?null:this.findSelectableNode(e)}setMeasurementTargetNode(e,t=!0){this.clearMeasurementTargetVisual(!1);let i=e&&!Jc(e)?this.findSelectableNode(e):null;if(!i||Jc(i)){this.measurementTargetNode=null,this.measurementTargetMeshes=[],this.setMeasurementSnapKind(null,!1),t&&this.notifyMeasurementsChanged();return}let r=this.getMeasurementTargetMeshes(i);if(r.length===0){this.measurementTargetNode=null,this.measurementTargetMeshes=[],this.setMeasurementSnapKind(null,!1),t&&this.notifyMeasurementsChanged();return}this.measurementTargetNode=i,this.measurementTargetMeshes=r,this.setMeasurementSnapKind(null,!1),this.applyMeasurementTargetVisual(r),this.scene.render(),t&&this.notifyMeasurementsChanged()}clearMeasurementTargetVisual(e=!0){for(let t of this.measurementTargetMeshes)t.isDisposed()||(t.renderOutline=!1,t.outlineWidth=0);this.measurementTargetMeshes=[],e&&!this.scene.isDisposed&&this.scene.render()}applyMeasurementTargetVisual(e){if(!(!this.measurementActive||e.length===0))for(let t of e)t.isDisposed()||(t.renderOutline=!0,t.outlineColor=new Ee(.38,.65,.98),t.outlineWidth=.045)}setMeasurementSnapKind(e,t=!0){this.measurementSnapKind!==e&&(this.measurementSnapKind=e,t&&this.notifyMeasurementsChanged())}getMeasurementTargetName(){let e=this.measurementTargetNode;return!e||Jc(e)?null:Cd(e,e.name||`node-${e.uniqueId}`)}getMeasurementTargetBounds(){if(!this.rootMesh||!this.measurementTargetNode||Jc(this.measurementTargetNode))return null;let e=this.findSelectableNode(this.measurementTargetNode);if(!e)return null;this.measurementTargetNode=e;let t=this.getRenderableMeshes(this.rootMesh).filter(i=>lg(i,e));return Gl(t)}resolveMeasurementPickPoint(e,t){if(t)return this.setMeasurementSnapKind("free"),e;let i=this.createMeasurementGeometrySnapInput();if(!i)return this.setMeasurementSnapKind("free"),e;let r=VA(this.toMeasurementPoint(e),i);return r?(this.setMeasurementSnapKind(r.kind),Ia(r.point)):(this.setMeasurementSnapKind("free"),e)}createMeasurementGeometrySnapInput(){var l;let e=this.measurementTargetNode;if(!this.rootMesh||!e||Jc(e))return null;let t=this.getMeasurementTargetMeshes(e);if(t.length===0)return null;let i=[],r=[],s=`babylon:${e.uniqueId}`;for(let c of t){if(c.isDisposed())continue;let f=c.getVerticesData(L.PositionKind);if(!f||f.length<3)continue;let d=c.computeWorldMatrix(!0),u=[],h=Math.floor(f.length/3);for(let g=0;g!t.isDisposed()&&lg(t,e))}createBabylonMeasurementDraftingLayout(e,t){var l,c,f;let i=this.toMeasurementDisplayPoint(e),r=this.toMeasurementDisplayPoint(t),s=this.getMeasurementMarkerSize(),a=(f=(c=(l=this.camera.upVector)==null?void 0:l.clone)==null?void 0:c.call(l))!=null?f:new b(0,1,0);a.normalize();let o=WA(this.toMeasurementPoint(i),this.toMeasurementPoint(r),{viewPosition:this.toMeasurementPoint(this.camera.position),viewUp:this.toMeasurementPoint(a),offset:s*4.2,extensionGap:s*.55,extensionOvershoot:s*.8,arrowLength:s*2.35,arrowWidth:s*.78,labelGap:s*1.05});return o?{lineSegments:o.lineSegments.map(([d,u])=>[Ia(d),Ia(u)]),labelPosition:Ia(o.labelPoint)}:null}getMeasurementMarkerSize(){if(!this.rootMesh)return .02;let e=this.getRenderableBounds(this.rootMesh);return e?Math.max(e.max.x-e.min.x,e.max.y-e.min.y,e.max.z-e.min.z,.001)*.018:.02}cancelPendingMeasurement(e=!0){var r,s;let t=this.pendingMarker,i=(s=(r=this.pendingPoint)==null?void 0:r.clone())!=null?s:null;if(this.pendingPoint=null,this.pendingMarker=null,this.hoveredMarkerIndex=-1,this.removePreviewLine(),t&&i&&!this.isMeasurementPointUsed(i)){let a=this.measurementMarkers.indexOf(t);a>=0&&(this.measurementMarkers.splice(a,1),this.measurementMarkerPoints.splice(a,1)),t.dispose(!1,!0)}else t&&(t.scaling.setAll(1),pE(t,gE));e&&this.scene.render()}isMeasurementPointUsed(e){return this.measurementSegments.some(t=>b.Distance(t.start,e)<1e-4||b.Distance(t.end,e)<1e-4)}findNearestMarkerIndex(e){let t=this.getMeasurementMarkerSize()*2.5,i=this.toMeasurementDisplayPoint(e);for(let r=0;r=0?this.measurementMarkerPoints[i].clone():t;if(this.pendingPoint){if(b.Distance(r,this.pendingPoint)<1e-4)return;if(i<0){let s=this.getMeasurementMarkerSize(),a=Nn.CreateSphere("measure-marker",{diameter:s*.76,segments:12},this.scene);a.position=this.toMeasurementDisplayPoint(r),a.isPickable=!1,a.material=NQ(this.scene),a.renderingGroupId=2,this.measurementMarkers.push(a),this.measurementMarkerPoints.push(r.clone())}this.createMeasurementSegment(this.pendingPoint,r),this.pendingMarker&&(this.pendingMarker.scaling.setAll(1),pE(this.pendingMarker,gE)),this.pendingPoint=null,this.pendingMarker=null,this.removePreviewLine()}else{if(i<0){let s=this.getMeasurementMarkerSize(),a=Nn.CreateSphere("measure-marker",{diameter:s*.76,segments:12},this.scene);a.position=this.toMeasurementDisplayPoint(r),a.isPickable=!1,a.material=NQ(this.scene),a.renderingGroupId=2,this.measurementMarkers.push(a),this.measurementMarkerPoints.push(r.clone()),this.pendingMarker=a}else this.pendingMarker=this.measurementMarkers[i];this.pendingMarker.scaling.setAll(1.6),pE(this.pendingMarker,DEe),this.pendingPoint=r,this.ensurePreviewLine()}this.notifyMeasurementsChanged()}createMeasurementSegment(e,t){var f,d;let i=this.toMeasurementDisplayPoint(e),r=this.toMeasurementDisplayPoint(t),s=this.createBabylonMeasurementDraftingLayout(e,t),a=Nn.CreateLineSystem("measure-line",{lines:(f=s==null?void 0:s.lineSegments)!=null?f:[[i,r]]},this.scene);a.color=DQ.clone(),a.alpha=1,a.isPickable=!1,a.renderingGroupId=2;let o=Dm(this.createMeasurementReading(e,t)),l=(d=s==null?void 0:s.labelPosition)!=null?d:b.Center(i,r),c=this.createMeasurementLabelMesh(o,l,this.getMeasurementMarkerSize()*3.2);this.measurementSegments.push({start:e.clone(),end:t.clone(),line:a,label:c})}createMeasurementLabelMesh(e,t,i){let r=Nn.CreatePlane("measure-label",{width:i*3.7,height:i*1.08},this.scene);r.position=t,r.billboardMode=Q.BILLBOARDMODE_ALL,r.isPickable=!1,r.renderingGroupId=2;let s=new eM("measure-label-tex",{...oc},this.scene);s.hasAlpha=!0;let a=s.getContext();YA(a,e,oc.width,oc.height),s.update();let o=new ze("measure-label-mat",this.scene);return o.diffuseTexture=s,o.emissiveColor=new Ee(1,1,1),o.disableLighting=!0,o.disableDepthWrite=!0,o.opacityTexture=s,o.useAlphaFromDiffuseTexture=!0,r.material=o,r}ensurePreviewLine(){this.previewLine||(this.previewLine=Nn.CreateLineSystem("measure-preview",{lines:Array.from({length:7},()=>[b.Zero(),b.Zero()]),updatable:!0},this.scene),this.previewLine.color=LQ.clone(),this.previewLine.alpha=.82,this.previewLine.isPickable=!1,this.previewLine.renderingGroupId=2)}updatePreviewLine(){var c;if(!this.pendingPoint||!this.previewLine||!this.rootMesh)return;let e=this.toMeasurementDisplayPoint(this.pendingPoint),t=this.engine.getRenderingCanvas();if(!t)return;let i=t.getBoundingClientRect(),r=this.lastPointerClient.x-i.left,s=this.lastPointerClient.y-i.top,a=this.scene.pick(r,s,f=>f!==this.previewLine&&!this.measurementMarkers.includes(f)),o;if(a.hit&&a.pickedPoint)o=this.resolveMeasurementPickPoint(a.pickedPoint,this.lastPointerClient.altKey);else{let f=this.scene.createPickingRay(r,s,q.Identity(),this.camera);o=e.add(f.direction.scale(5))}let l=this.createBabylonMeasurementDraftingLayout(this.pendingPoint,this.toMeasurementBasePoint(o));this.previewLine=Nn.CreateLineSystem("measure-preview",{lines:(c=l==null?void 0:l.lineSegments)!=null?c:[[e,o]],instance:this.previewLine},this.scene),this.previewLine.color=LQ.clone(),this.previewLine.alpha=.82,this.previewLine.isPickable=!1,this.previewLine.renderingGroupId=2}removePreviewLine(){this.previewLine&&(this.previewLine.dispose(),this.previewLine=null)}createMeasurementReading(e,t){return XA(this.toMeasurementPoint(e),this.toMeasurementPoint(t),this.measurementScale,this.measurementUnit)}createMeasurementRecords(){return this.measurementSegments.map((e,t)=>({index:t+1,start:this.toMeasurementPoint(e.start),end:this.toMeasurementPoint(e.end),reading:this.createMeasurementReading(e.start,e.end)}))}toMeasurementPoint(e){return{x:e.x,y:e.y,z:e.z}}createModelSummary(e){let t=this.getRenderableMeshes(e),i=VF(e),r=t.reduce((s,a)=>s+Pd(a),0);return GM(e.name,this.getRenderableBounds(e),t,{splatCount:i?r:void 0,resourceWarnings:this.resourceWarnings})}};Ca.annotationIdentity=q.Identity(),Ca.annotationWorldPoint=b.Zero(),Ca.annotationProjection=b.Zero(),Ca.annotationDirection=b.Zero(),Ca.annotationRay=new rn(b.Zero(),b.Zero(),1);e0=Ca});async function BQ(n,e){if(bh(e).backend==="three"){let{createThreeModelPreview:r}=await Promise.resolve().then(()=>(cV(),lV));return r(n)}let{createBabylonModelPreview:i}=await Promise.resolve().then(()=>(FQ(),wQ));return i(n)}var UQ=y(()=>{"use strict";$E()});var GQ={};Be(GQ,{createBabylonGridRenderer:()=>kEe});function GEe(n){return n.replace(/\|/g,"\\|").replace(/\r?\n/g," ")}function WF(n){return new b(n.x,n.y,n.z)}function VQ(n){return Number.isFinite(n)?Math.max(0,Math.min(n,1)):0}function kEe(n){return new zF(n)}var cg,zF,kQ=y(()=>{"use strict";iL();Ks();HR();XR();We();Kt();Qm();Qp();$f();jc();dE();dE();mE();_A();ga();gl();bA();cg=32;zF=class{constructor(e){this.cells=[];this.initialCameras=[];this.wireframeEnabled=!1;this.rendering=!1;this.dirty=!0;this.contextLost=!1;this.warmupFrame=null;this.renderScale=1;this.cameraZoomObservers=new Set;this.preventCanvasWheelScroll=e=>{e.preventDefault(),e.stopPropagation()};this.handleContextLost=e=>{e.preventDefault(),this.contextLost=!0,this.rendering&&(this.engine.stopRenderLoop(),this.rendering=!1)};this.handleContextRestored=()=>{this.contextLost=!1,this.engine.resize(),this.startRenderLoop(),this.markDirty(),this.scheduleWarmupFrames()};e.className="ai3d-canvas-full",e.addEventListener("wheel",this.preventCanvasWheelScroll,{passive:!1}),this.engine=new ke(e,!0,{preserveDrawingBuffer:!0}),e.addEventListener("webglcontextlost",this.handleContextLost),e.addEventListener("webglcontextrestored",this.handleContextRestored),this.scene=new ri(this.engine),this.scene.clearColor=new dt(.12,.12,.14,1),this.scene.autoClear=!1,new Ra("default-light",new b(0,1,.5),this.scene),this.resizeObs=new ResizeObserver(()=>{this.engine.resize(),this.markDirty()}),this.resizeObs.observe(e),window.requestAnimationFrame(()=>this.engine.resize())}canRender(){let e=this.engine.getRenderingCanvas();return!!(e!=null&&e.isConnected)&&e.clientWidth>0&&e.clientHeight>0}markDirty(){this.dirty=!0}getCameraZoomRange(e){let t=e.radius,i=e.lowerRadiusLimit,r=e.upperRadiusLimit,s=typeof i=="number"&&Number.isFinite(i)&&i>0?i:Math.max(t*.08,1e-5),a=typeof r=="number"&&Number.isFinite(r)&&r>s?r:Math.max(t*8,s*10);return{current:Math.max(s,Math.min(t,a)),min:s,max:a}}notifyCameraZoomChanged(){if(this.cameraZoomObservers.size===0)return;let e=this.getCameraZoomState();for(let t of this.cameraZoomObservers)t(e)}scheduleWarmupFrames(e=8){this.warmupFrame!==null&&window.cancelAnimationFrame(this.warmupFrame),this.warmupFrame=window.requestAnimationFrame(()=>{this.warmupFrame=null,!(!this.canRender()||this.contextLost)&&(this.markDirty(),e>1&&this.scheduleWarmupFrames(e-1))})}getCellBounds(e){let t=Gl(e);if(!t)throw new Error("Grid cell has no renderable meshes");return t}async loadModels(e,t,i){var d,u,h;await fE();let r=e.length>cg?(console.warn(`[AI3D Grid] Capping ${e.length} models to ${cg} (layerMask limit)`),e.slice(0,cg)):e,s=(d=t.columns)!=null?d:Math.min(r.length,3),a=(u=t.gapX)!=null?u:.02,o=(h=t.gapY)!=null?h:.02,l=Math.ceil(r.length/s),c=(1-a*(s+1))/s,f=(1-o*(l+1))/l;for(let m=0;mcg?(console.warn(`[AI3D Preset] Capping ${e.placements.length} placements to ${cg} (layerMask limit)`),e.placements.slice(0,cg)):e.placements,r=[];for(let f=0;f0&&(u.push(...r[g]),h|=1<{this.markDirty(),this.notifyCameraZoomChanged()})),this.initialCameras.push({alpha:f.alpha,beta:f.beta,radius:f.radius,target:f.target.clone()}),f}async loadOne(e,t,i,r,s,a,o){var u,h;let l=await t(e.path),c=(h=(u=e.path.split(".").pop())==null?void 0:u.replace(".","").toLowerCase())!=null?h:"glb",{renderableMeshes:f}=await this.importMesh(e.path,l,o);if(c==="stl"&&e.color){let m=Ee.FromHexString(e.color);for(let g of f)g.material instanceof ze&&g.material.name==="stl-mat"&&(g.material.diffuseColor=m)}if(c==="stl"&&e.wireframe!==void 0)for(let m of f)m.material instanceof ze&&(m.material.wireframe=e.wireframe);let d=this.createCellCamera(f,o,i,r,s,a);this.cells.push({meshes:f,camera:d})}createCellCamera(e,t,i,r,s,a){let o=V_(this.getCellBounds(e)),l=new Ri(`cell-cam-${t}`,Math.PI/4,Math.PI/3,o.radius,WF(o.target),this.scene);l.fov=45*Math.PI/180,l.minZ=o.near,l.maxZ=o.far,l.lowerRadiusLimit=o.lowerRadiusLimit,l.upperRadiusLimit=o.upperRadiusLimit,l.wheelPrecision=45,l.viewport=new Po(i,r,s,a),l.layerMask=1<{this.markDirty(),this.notifyCameraZoomChanged()})),this.initialCameras.push({alpha:l.alpha,beta:l.beta,radius:l.radius,target:l.target.clone()}),l}renderFrame(){if(!this.canRender()||!this.dirty||this.contextLost)return;this.dirty=!1;let e=this.engine,t=this.scene;e.clear(t.clearColor,!0,!0);for(let i of this.cells){e.setViewport(i.camera.viewport);let r=i.camera.viewport,s=e.getRenderWidth(),a=e.getRenderHeight();e.enableScissor(r.x*s,r.y*a,r.width*s,r.height*a),t.activeCamera=i.camera,t.render(),e.disableScissor()}}startRenderLoop(){this.rendering||(this.rendering=!0,this.engine.runRenderLoop(()=>this.renderFrame()))}captureSnapshot(){let e=this.engine.getRenderingCanvas();return e?(this.renderFrame(),e.toDataURL("image/png")):null}getEngine(){return this.engine}getScene(){return this.scene}getCellCount(){return this.cells.length}getCanvas(){return this.engine.getRenderingCanvas()}getPrimaryCamera(){var e,t;return(t=(e=this.cells[0])==null?void 0:e.camera)!=null?t:null}setRenderScale(e){let t=Math.max(.25,Math.min(e,2));this.renderScale=t;let i=Rr()?1.5:1;return this.engine.setHardwareScalingLevel(i/t),this.getRenderScale()}getRenderScale(){return Number(this.renderScale.toFixed(2))}getCameraZoomState(){var s;let e=(s=this.cells[0])==null?void 0:s.camera;if(!e)return null;let t=this.getCameraZoomRange(e),i=(t.max-t.current)/(t.max-t.min),r=VQ(i);return{value:r,percentage:Math.round(r*100)}}setCameraZoom(e){if(this.cells.length===0)return null;let t=VQ(e);for(let i of this.cells){let r=this.getCameraZoomRange(i.camera);i.camera.radius=r.max-t*(r.max-r.min)}return this.markDirty(),this.startRenderLoop(),this.notifyCameraZoomChanged(),this.getCameraZoomState()}observeCameraZoom(e){return this.cameraZoomObservers.add(e),e(this.getCameraZoomState()),()=>{this.cameraZoomObservers.delete(e)}}resetView(){for(let e=0;e{var S;if(this.isDisassemblyActive())return;let E=v.mesh&&this.rootMesh?hE(this.rootMesh,v.mesh,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata):null,T={mesh:E,pickedPoint:v.pickedPoint,screenX:v.screenX,screenY:v.screenY,modifiers:v.modifiers};if(this._lastPickResult=T,this.measurementActive&&v.pickedPoint){if(((S=v.modifiers)==null?void 0:S.altKey)===!0){this.setMeasurementSnapKind("free"),this.addMeasurementPoint(Ia(v.pickedPoint));return}if(!this.measurementTargetNode){E&&this.setMeasurementTargetNode(E);return}this.addMeasurementPoint(this.resolveMeasurementPickPoint(Ia(v.pickedPoint),!1));return}this.focusSelectionEnabled&&E&&this.setFocusedNode(E),this._onPickCallbacks.forEach(A=>A(T))},()=>!this.focusSelectionEnabled&&!this.measurementActive,v=>this.resolvePickHighlightMeshes(v)),this.ensureDisassemblyController(),this.createModelSummary(this.rootMesh)}applyConfig(e){e.camera&&this.applyCameraConfig(e.camera),e.lights&&this.applyLightConfig(e.lights),e.scene&&this.applySceneConfig(e.scene),e.stl&&this.loadedExt==="stl"&&(e.stl.color&&this.setSTLColor(e.stl.color),e.stl.wireframe!==void 0&&this.setWireframe(e.stl.wireframe))}applyCameraConfig(e){var i;let t=this.engine.getRenderingCanvas();if(t){if(e.mode==="orthographic"){let r=this.camera.radius,s=t.clientWidth/t.clientHeight,a=(i=e.zoom)!=null?i:1,o=r/a;this.camera.mode=1,this.camera.orthoLeft=-o*s,this.camera.orthoRight=o*s,this.camera.orthoTop=o,this.camera.orthoBottom=-o}else this.camera.mode=0,e.fov&&(this.camera.fov=e.fov*Math.PI/180);if(e.position){let[r,s,a]=e.position;this.camera.setPosition(new b(r,s,a))}if(e.lookAt){let[r,s,a]=e.lookAt;this.camera.setTarget(new b(r,s,a))}e.near!==void 0&&(this.camera.minZ=e.near),e.far!==void 0&&(this.camera.maxZ=e.far),this.notifyCameraZoomChanged()}}applyLightConfig(e){var i;for(let r of this.configLights)r.dispose();this.configLights=[],(i=this.shadowGenerator)==null||i.dispose(),this.shadowGenerator=null;let t=this.scene.getLightByName("default-light");t&&t.dispose();for(let r of e){let s=this.createLight(r);s&&this.configLights.push(s)}}createLight(e){var r,s;let t=e.color?Ee.FromHexString(e.color):Ee.White(),i=(r=e.intensity)!=null?r:1;switch(e.type){case"hemisphere":{let a=e.groundColor?Ee.FromHexString(e.groundColor):new Ee(.2,.2,.2),o=new Ra("hemi",new b(0,1,0),this.scene);return o.diffuse=t,o.groundColor=a,o.intensity=i,o}case"directional":{let a=e.position?new b(...e.position).normalize():new b(-1,-2,-1).normalize(),o=new $s("dir",a,this.scene);return o.diffuse=t,o.intensity=i,e.castShadow&&this.rootMesh&&this.setupShadow(o),o}case"point":{let a=e.position?new b(...e.position):new b(0,5,0),o=new cd("point",a,this.scene);return o.diffuse=t,o.intensity=i,e.decay!==void 0&&(o.decay=e.decay),o}case"spot":{let a=e.position?new b(...e.position):new b(0,5,0),l=(e.target?new b(...e.target):b.Zero()).subtract(a).normalize(),c=e.angle?e.angle*Math.PI/180:Math.PI/4,f=(s=e.penumbra)!=null?s:.5,d=new Kr("spot",a,l,c,f,this.scene);return d.diffuse=t,d.intensity=i,e.decay!==void 0&&(d.decay=e.decay),e.castShadow&&this.rootMesh&&this.setupShadow(d),d}case"attachToCam":{let a=new cd("cam-light",b.Zero(),this.scene);return a.diffuse=t,a.intensity=i,a.parent=this.camera,a}default:return null}}setupShadow(e){if(!this.rootMesh)return;if(!OEe(e)){console.warn("[AI3D] Light type does not support shadows:",e.name);return}let t=new Fi(1024,e);t.useBlurExponentialShadowMap=!0,t.blurKernel=32;for(let i of this.getRenderableMeshes(this.rootMesh))t.addShadowCaster(i),i.receiveShadows=!0;this.shadowGenerator=t}applySceneConfig(e){var t,i;if(e.background!==void 0){let r=dt.FromColor3(Ee.FromHexString(e.background),e.transparent?0:1);this.scene.clearColor=r}e.autoRotate&&(this.autoRotateBehavior?this.autoRotateBehavior.idleRotationSpeed=(i=e.autoRotateSpeed)!=null?i:.5:(this.autoRotateBehavior=new wp,this.autoRotateBehavior.idleRotationSpeed=(t=e.autoRotateSpeed)!=null?t:.5,this.autoRotateBehavior.idleRotationWaitTime=1e3,this.autoRotateBehavior.idleRotationSpinupTime=500,this.camera.addBehavior(this.autoRotateBehavior))),e.groundShadow&&this.rootMesh&&this.createGround(),e.grid&&this.createGrid(),e.axis&&this.createAxis()}createGround(){if(!this.rootMesh||this.groundMesh)return;let e=this.getRenderableBounds(this.rootMesh),t=Xi(e),i=Math.max(t.x,t.z)*3,r=e.min.y;this.groundMesh=Nn.CreateGround("ground",{width:i,height:i},this.scene),this.groundMesh.position.y=r;let s=new ze("ground-mat",this.scene);s.diffuseColor=new Ee(.15,.15,.15),s.specularColor=Ee.Black(),s.alpha=.5,this.groundMesh.material=s,this.groundMesh.receiveShadows=!0}createGrid(){if(!this.rootMesh||this.gridMesh)return;let e=this.getRenderableBounds(this.rootMesh),t=Xi(e),i=Math.max(t.x,t.z)*2,r=e.min.y-.01;this.gridMesh=Nn.CreateGround("grid",{width:i,height:i,subdivisions:20},this.scene),this.gridMesh.position.y=r;let s=new ze("grid-mat",this.scene);s.wireframe=!0,s.diffuseColor=new Ee(.3,.3,.3),s.emissiveColor=new Ee(.1,.1,.1),this.gridMesh.material=s}createAxis(){if(!this.rootMesh||this.axisMeshes.length>0)return;let e=this.getRenderableBounds(this.rootMesh),t=xU(e)*1.5,i=Ia(e.min),r=U_(e)*.01,s=[["x",Ee.Red(),new b(t,0,0)],["y",Ee.Green(),new b(0,t,0)],["z",Ee.Blue(),new b(0,0,t)]];for(let[a,o,l]of s){let c=Nn.CreateTube(`axis-${a}`,{path:[i,i.add(l)],radius:r,tessellation:8},this.scene),f=new ze(`axis-${a}-mat`,this.scene);f.emissiveColor=o,f.diffuseColor=Ee.Black(),c.material=f,this.axisMeshes.push(c)}}setSTLColor(e){if(!this.rootMesh)return;let t=Ee.FromHexString(e);for(let i of this.getRenderableMeshes(this.rootMesh))if(i.material&&i.material.name==="stl-mat"){let r=i.material;r.diffuseColor=t,r.emissiveColor=t.scale(.1)}}setWireframe(e){this.rootMesh&&(VF(this.rootMesh)||(this.wireframeEnabled=e,this.scene.forceWireframe=e))}toggleWireframe(){return this.setWireframe(!this.wireframeEnabled),this.wireframeEnabled}hasAnimations(){return this.scene.animationGroups.length>0}toggleAnimation(){let e=this.scene.animationGroups;if(e.length===0)return!1;this.animPlaying=!this.animPlaying;for(let t of e)this.animPlaying?t.play(!0):t.pause();return this.animPlaying}toggleMeasurement(){var t,i;if(this.measurementActive)return this.deactivateMeasurementMode(),!1;this.isDisassemblyActive()&&((t=this.disassembly)==null||t.setEnabled(!1));let e=this.getCurrentMeasurementTargetNode();return(i=this.cleanupPicking)==null||i.clearHighlight(),this.clearFocusedMesh(),this.focusSelectionEnabled&&(this.focusSelectionEnabled=!1),this.measurementActive=!0,this.setMeasurementTargetNode(e,!1),wf(this.engine.getRenderingCanvas(),this.measurementActive),this.notifyMeasurementsChanged(),this.measurementActive}isMeasurementActive(){return this.measurementActive}clearMeasurements(){this.disposeMeasurementOverlays(!1)}cancelMeasurement(){let e=!!this.pendingPoint;this.cancelPendingMeasurement(),e&&this.notifyMeasurementsChanged()}deactivateMeasurementMode(){return this.measurementActive?(this.measurementActive=!1,wf(this.engine.getRenderingCanvas(),!1),this.setMeasurementTargetNode(null,!1),this.cancelPendingMeasurement(),this.notifyMeasurementsChanged(),!0):!1}disposeMeasurementOverlays(e){e&&(this.measurementActive=!1,wf(this.engine.getRenderingCanvas(),!1),this.setMeasurementTargetNode(null,!1)),this.cancelPendingMeasurement(!1);for(let t of this.measurementSegments)t.line.dispose(!1,!0),t.label.dispose(!1,!0);this.measurementSegments=[];for(let t of this.measurementMarkers)t.dispose(!1,!0);this.measurementMarkers=[],this.measurementMarkerPoints=[],this.notifyMeasurementsChanged()}setMeasurementScale(e){this.measurementScale=_s(e),this.invalidateMeasurementSnapInputCache(),this.applyMeasurementModelScale(),this.updateMeasurementOverlayPositions(),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementScale(){return{...this.measurementScale}}setMeasurementUnit(e){this.measurementUnit=k_(e),this.updateMeasurementLabels(),this.notifyMeasurementsChanged()}getMeasurementUnit(){return this.measurementUnit}getMeasurementBounds(){var t;if(!this.rootMesh)return null;let e=(t=this.measurementBaseBounds)!=null?t:this.getRenderableBounds(this.rootMesh);return e?{x:e.max.x-e.min.x,y:e.max.y-e.min.y,z:e.max.z-e.min.z}:null}getMeasurementRecords(){return this.createMeasurementRecords()}getMeasurementState(){return zA({active:this.measurementActive,pending:!!this.pendingPoint,records:this.createMeasurementRecords(),unit:this.measurementUnit,scale:this.getMeasurementScale(),bounds:this.getMeasurementBounds(),targetLocked:!!this.measurementTargetNode,targetName:this.getMeasurementTargetName(),snapKind:this.measurementSnapKind})}exportMeasurements(){return KA(this.createMeasurementRecords())}observeMeasurements(e){return this.measurementObservers.add(e),e(),()=>{this.measurementObservers.delete(e)}}updateMeasurementLabels(){var t;if(this.measurementSegments.length===0)return;let e=this.getMeasurementMarkerSize()*3.2;for(let i of this.measurementSegments){this.updateMeasurementLineGeometry(i);let r=Dm(this.createMeasurementReading(i.start,i.end));i.label.dispose(!1,!0);let s=this.createBabylonMeasurementDraftingLayout(i.start,i.end),a=(t=s==null?void 0:s.labelPosition)!=null?t:b.Center(this.toMeasurementDisplayPoint(i.start),this.toMeasurementDisplayPoint(i.end));i.label=this.createMeasurementLabelMesh(r,a,e)}}captureMeasurementBaseState(e,t){this.measurementBaseRootScaling=e.scaling.clone(),this.measurementBaseBounds=t?ka(t.min,t.max):null,this.measurementScale={x:1,y:1,z:1}}resetMeasurementCalibrationState(){this.measurementScale={x:1,y:1,z:1},this.measurementBaseRootScaling=new b(1,1,1),this.measurementBaseBounds=null,this.measurementMarkerPoints=[],this.invalidateMeasurementSnapInputCache()}applyMeasurementModelScale(){if(!this.rootMesh)return;let e=_s(this.measurementScale);this.rootMesh.scaling=new b(this.measurementBaseRootScaling.x*e.x,this.measurementBaseRootScaling.y*e.y,this.measurementBaseRootScaling.z*e.z),this.rootMesh.computeWorldMatrix(!0);for(let t of this.loadedMeshes)t.computeWorldMatrix(!0);this.invalidateMeshCache(),this.rebuildScaledSceneHelpers(),this.refitCameraToModel(),this.startRenderLoop()}rebuildScaledSceneHelpers(){var s,a,o;let e=!!this.bboxMesh,t=!!this.groundMesh,i=!!this.gridMesh,r=this.axisMeshes.length>0;(s=this.bboxMesh)==null||s.dispose(),this.bboxMesh=null,(a=this.groundMesh)==null||a.dispose(),this.groundMesh=null,(o=this.gridMesh)==null||o.dispose(),this.gridMesh=null;for(let l of this.axisMeshes)l.dispose();if(this.axisMeshes=[],e&&this.rootMesh){let l=this.getRenderableBounds(this.rootMesh),c=Ia(Er(l)),f=Ia(Xi(l));this.bboxMesh=Nn.CreateBox("bbox",{width:f.x,height:f.y,depth:f.z},this.scene),this.bboxMesh.position=c;let d=new ze("bbox-mat",this.scene);d.wireframe=!0,d.emissiveColor=new Ee(1,1,0),d.disableLighting=!0,d.alpha=.6,this.bboxMesh.material=d}t&&this.createGround(),i&&this.createGrid(),r&&this.createAxis()}refitCameraToModel(){if(!this.rootMesh)return;let e=V_(this.getRenderableBounds(this.rootMesh));this.camera.target=Ia(e.target),this.camera.radius=e.radius,this.camera.lowerRadiusLimit=e.lowerRadiusLimit,this.camera.upperRadiusLimit=e.upperRadiusLimit,this.camera.minZ=e.near,this.camera.maxZ=e.far,this.initialCamera={alpha:this.camera.alpha,beta:this.camera.beta,radius:this.camera.radius,target:this.camera.target.clone()},this.notifyCameraZoomChanged()}getMeasurementPivot(){var e,t;return(t=(e=this.rootMesh)==null?void 0:e.getAbsolutePosition().clone())!=null?t:b.Zero()}toMeasurementDisplayPoint(e){let t=BA(e,this.getMeasurementPivot(),this.measurementScale);return new b(t.x,t.y,t.z)}toMeasurementBasePoint(e){let t=UA(e,this.getMeasurementPivot(),this.measurementScale);return new b(t.x,t.y,t.z)}updateMeasurementOverlayPositions(){for(let e=0;e{this.cameraZoomObservers.delete(e)}}getPerformanceSnapshot(){return{backend:"babylon",renderScale:Number((1/this.engine.getHardwareScalingLevel()).toFixed(2)),quality:this.currentQuality,meshCount:this.rootMesh?this.getRenderableMeshes(this.rootMesh).length:0}}toggleBoundingBox(){var e;if(this.bboxEnabled=!this.bboxEnabled,this.bboxEnabled){if(!this.rootMesh)return this.bboxEnabled;this.bboxMesh&&this.bboxMesh.dispose();let t=this.getRenderableBounds(this.rootMesh),i=Ia(Er(t)),r=Ia(Xi(t));this.bboxMesh=Nn.CreateBox("bbox",{width:r.x,height:r.y,depth:r.z},this.scene),this.bboxMesh.position=i;let s=new ze("bbox-mat",this.scene);s.wireframe=!0,s.emissiveColor=new Ee(1,1,0),s.disableLighting=!0,s.alpha=.6,this.bboxMesh.material=s}else(e=this.bboxMesh)==null||e.dispose(),this.bboxMesh=null;return this.bboxEnabled}toggleFocusSelection(){var t;let e=!this.focusSelectionEnabled;return e&&this.isDisassemblyActive()&&((t=this.disassembly)==null||t.setEnabled(!1)),e&&this.deactivateMeasurementMode(),this.focusSelectionEnabled=e,this.focusSelectionEnabled?this._lastPickResult.mesh&&this.setFocusedNode(this._lastPickResult.mesh):this.clearFocusedMesh(),this.focusSelectionEnabled}isFocusSelectionEnabled(){return this.focusSelectionEnabled}toggleDisassembly(){let e=this.ensureDisassemblyController();if(!e)return!1;let t=!e.isEnabled();return t&&(this.focusSelectionEnabled=!1,this.clearFocusedMesh(),this.deactivateMeasurementMode()),e.setEnabled(t)}resetDisassembly(){var e;(e=this.disassembly)==null||e.reset()}isDisassemblyEnabled(){return this.isDisassemblyActive()}setExplode(e,t){this.rootMesh&&wq(this.rootMesh,e,t,this.loadedMeshes)}resetExplode(){this.rootMesh&&lF(this.rootMesh,this.loadedMeshes)}resetView(){this.rootMesh&&lF(this.rootMesh,this.loadedMeshes),this.resetDisassembly(),this.clearFocusedMesh(),this.camera.mode=0,this.camera.alpha=this.initialCamera.alpha,this.camera.beta=this.initialCamera.beta,this.camera.radius=this.initialCamera.radius,this.camera.target=this.initialCamera.target.clone(),this.startRenderLoop(),this.notifyCameraZoomChanged()}exportModelInfo(e){if(!this.rootMesh)return"";let t=this.getRenderableMeshes(this.rootMesh),i=VF(this.rootMesh),r=this.createModelSummary(this.rootMesh),s=e&&Gs(e)||r.rootName;return CA({title:s,format:this.loadedExt.toUpperCase(),summary:r,meshBreakdown:t.map(a=>Dq(a,{isSplat:i})),materialNames:t.map(a=>{var o;return(o=a.material)==null?void 0:o.name})})}getModelEvidence(){if(!this.rootMesh)return null;let e=this.getRenderableMeshes(this.rootMesh),t=Oq(e,this.loadedTransformNodes,this.gltfComponentMetadata);return NA({summary:this.createModelSummary(this.rootMesh),renderableMeshes:e,groupedPartCandidates:t,createMeshPart:i=>sF(i,this.gltfComponentMetadata),getMeshMaterialNames:i=>{var r;return[(r=i.material)==null?void 0:r.name]},resourceWarnings:this.resourceWarnings})}getSelectedPartInfo(){var t;if(!this.rootMesh)return null;let e=(t=this.focusedNode)!=null?t:GF(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;return!e||Jc(e)?null:aF(e,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata)}exportSelectedPartInfo(){let e=this.getSelectedPartInfo();return e?PA(e):""}getPickWorldPoint(e){return e.pickedPoint&&typeof e.pickedPoint=="object"?ei(e.pickedPoint):this.rootMesh&&GF(e.mesh)?aF(e.mesh,this.getRenderableMeshes(this.rootMesh),this.gltfComponentMetadata).center:null}focusWorldPoint(e){let t=new b(e.x,e.y,e.z),i=this.camera.target.clone(),r=performance.now();this.focusWorldPointFrame&&(activeWindow.cancelAnimationFrame(this.focusWorldPointFrame),this.focusWorldPointFrame=0);let s=a=>{let o=Math.min(1,Math.max(0,(a-r)/PEe)),l=o<.5?4*o*o*o:1-Math.pow(-2*o+2,3)/2;if(this.camera.target=b.Lerp(i,t,l),o<1&&!this.scene.isDisposed){this.focusWorldPointFrame=window.requestAnimationFrame(s);return}this.focusWorldPointFrame=0};this.focusWorldPointFrame=window.requestAnimationFrame(s)}getAnnotationCameraStateKey(){return OA([{value:this.camera.alpha,digits:3},{value:this.camera.beta,digits:3},{value:this.camera.radius,digits:3},{value:this.camera.target.x,digits:2},{value:this.camera.target.y,digits:2},{value:this.camera.target.z,digits:2}])}projectAnnotationWorldPoint(e,t){let i=this.engine.getRenderingCanvas();if(!i||this.scene.isDisposed)return!1;let r=this.engine.getRenderWidth(),s=this.engine.getRenderHeight();if(r===0||s===0||i.clientWidth===0||i.clientHeight===0)return!1;let a=Ca.annotationWorldPoint;return a.set(e.x,e.y,e.z),b.ProjectToRef(a,Ca.annotationIdentity,this.scene.getTransformMatrix(),this.camera.viewport.toGlobal(r,s),Ca.annotationProjection),DU(Ca.annotationProjection,r,s,i,t)}isAnnotationWorldPointOccluded(e){if(this.scene.isDisposed)return!1;let t=Of(ei(this.camera.position),e);if(!t)return!1;let i=Ca.annotationDirection,r=Ca.annotationRay;i.set(t.direction.x,t.direction.y,t.direction.z),r.origin=this.camera.position,r.direction=i,r.length=t.distance;let s=this.scene.pickWithRay(r);return!!(s!=null&&s.hit)&&Lf(s.distance,t.distance,t.epsilon)}getAnnotationProvider(){let e=this.engine.getRenderingCanvas();if(!e)throw new Error("Preview canvas is unavailable");return LA({canvas:e,observeRender:t=>{let i=this.scene.onAfterRenderCameraObservable.add(r=>{r===this.camera&&t()});return{remove:()=>this.scene.onAfterRenderCameraObservable.remove(i)}},getCameraStateKey:()=>this.getAnnotationCameraStateKey(),projectWorldPoint:(t,i)=>this.projectAnnotationWorldPoint(t,i),isWorldPointOccluded:t=>this.isAnnotationWorldPointOccluded(t)})}getCanvas(){return this.engine.getRenderingCanvas()}getLastPickResult(){return this._lastPickResult}onPick(e){return this._onPickCallbacks.push(e),()=>{this._onPickCallbacks=this._onPickCallbacks.filter(t=>t!==e)}}setRenderQuality(e,t=this.renderScale){this.currentQuality=e,this.renderScale=Math.max(.25,Math.min(t,2));let i={low:2,medium:1.33,high:1},r=Rr()?1.5:1,s=i[e]*r/this.renderScale;if(this.engine.setHardwareScalingLevel(s),this.shadowGenerator){let a={low:0,medium:16,high:32};this.shadowGenerator.blurKernel=a[e],e==="low"?(this.shadowGenerator.useBlurExponentialShadowMap=!1,this.shadowGenerator.useExponentialShadowMap=!0):(this.shadowGenerator.useBlurExponentialShadowMap=!0,this.shadowGenerator.useExponentialShadowMap=!1)}}destroy(){var t,i,r,s,a,o,l,c;this.engine.stopRenderLoop(),this.focusWorldPointFrame&&(activeWindow.cancelAnimationFrame(this.focusWorldPointFrame),this.focusWorldPointFrame=0),this._onPickCallbacks=[],this.cameraZoomObservers.clear(),(t=this.cleanupPicking)==null||t.call(this),this.cleanupPicking=null,(i=this.gizmo)==null||i.dispose(),this.gizmo=null,(r=this.disassembly)==null||r.dispose(),this.disassembly=null,this.disposeMeasurementOverlays(!0),this.measurementObservers.clear(),this.clearFocusedMesh(),this.originalMeshVisibility.clear(),(s=this.bboxMesh)==null||s.dispose(),this.bboxMesh=null,this.camera.detachControl();let e=this.engine.getRenderingCanvas();e==null||e.removeEventListener("wheel",this.preventCanvasWheelScroll),e==null||e.removeEventListener("pointermove",this.handlePointerMove),e==null||e.removeEventListener("webglcontextlost",this.handleContextLost),e==null||e.removeEventListener("webglcontextrestored",this.handleContextRestored),(a=this.viewportObserver)==null||a.disconnect(),this.viewportObserver=null,this.resizeObs.disconnect(),this.invalidateMeshCache(),this.rootMesh=null,this.loadedMeshes=[],this.loadedTransformNodes=[],this.autoRotateBehavior&&(this.camera.removeBehavior(this.autoRotateBehavior),this.autoRotateBehavior=null);for(let f of this.configLights)f.dispose();this.configLights=[],(o=this.shadowGenerator)==null||o.dispose(),this.shadowGenerator=null,(l=this.groundMesh)==null||l.dispose(),this.groundMesh=null,(c=this.gridMesh)==null||c.dispose(),this.gridMesh=null;for(let f of this.axisMeshes)f.dispose();this.axisMeshes=[],this.scene.dispose(),this.engine.dispose()}startRenderLoop(){this.rendering||!this.viewportVisible||this.contextLost||(this.rendering=!0,this.engine.runRenderLoop(()=>{if(!this.canRender()||!this.viewportVisible||this.contextLost){this.engine.stopRenderLoop(),this.rendering=!1;return}this.scene.render(),this.gizmo&&this.gizmoEnabled&&(this.gizmo.syncWith(this.camera),this.gizmo.render())}))}getRenderableMeshes(e){if(this.cachedRenderableMeshes&&this.cachedRenderableRoot===e)return this.cachedRenderableMeshes;let t=sh(e,this.loadedMeshes);return this.cachedRenderableMeshes=t,this.cachedRenderableRoot=e,t}getRenderableBounds(e){return VM(e,this.loadedMeshes)}invalidateMeshCache(){this.cachedRenderableMeshes=null,this.cachedRenderableRoot=null}resolvePickHighlightMeshes(e){if(!this.rootMesh)return[e];let t=this.getRenderableMeshes(this.rootMesh),i=hE(this.rootMesh,e,t,this.gltfComponentMetadata),r=t.filter(s=>lg(s,i));return r.length>0?r:[e]}setFocusedNode(e){if(!this.rootMesh)return;let t=e?this.findSelectableNode(e):null;if(!t||Jc(t)){this.clearFocusedMesh();return}if(this.focusedNode===t)return;let i=this.getRenderableMeshes(this.rootMesh),r=i.filter(a=>lg(a,t));if(r.length===0){this.clearFocusedMesh();return}let s=new Set(r);for(let a of i){this.originalMeshVisibility.has(a.uniqueId)||this.originalMeshVisibility.set(a.uniqueId,a.visibility);let o=s.has(a);a.visibility=o?1:CEe,a.renderOutline=o,a.outlineColor=new Ee(.18,.76,1),a.outlineWidth=o?.045:0}this.focusedNode=t}clearFocusedMesh(){if(!this.rootMesh){this.focusedNode=null;return}for(let e of this.getRenderableMeshes(this.rootMesh)){let t=this.originalMeshVisibility.get(e.uniqueId);t!==void 0&&(e.visibility=t),e.renderOutline=!1,e.outlineWidth=0}this.originalMeshVisibility.clear(),this.focusedNode=null,this.applyMeasurementTargetVisual(this.measurementTargetMeshes)}findSelectableNode(e){if(!this.rootMesh)return null;let t=this.getRenderableMeshes(this.rootMesh);if(t.includes(e)||t.some(r=>lg(r,e)))return e;if(!NEe(e))return null;let i=e.parent;for(;i&&"uniqueId"in i;){let r=i;if(t.includes(r)||t.some(s=>lg(s,r)))return r;i=i.parent}return null}getCurrentMeasurementTargetNode(){var t;let e=(t=this.focusedNode)!=null?t:GF(this._lastPickResult.mesh)?this._lastPickResult.mesh:null;return!e||Jc(e)?null:this.findSelectableNode(e)}setMeasurementTargetNode(e,t=!0){this.clearMeasurementTargetVisual(!1),this.invalidateMeasurementSnapInputCache();let i=e&&!Jc(e)?this.findSelectableNode(e):null;if(!i||Jc(i)){this.measurementTargetNode=null,this.measurementTargetMeshes=[],this.setMeasurementSnapKind(null,!1),t&&this.notifyMeasurementsChanged();return}let r=this.getMeasurementTargetMeshes(i);if(r.length===0){this.measurementTargetNode=null,this.measurementTargetMeshes=[],this.setMeasurementSnapKind(null,!1),t&&this.notifyMeasurementsChanged();return}this.measurementTargetNode=i,this.measurementTargetMeshes=r,this.setMeasurementSnapKind(null,!1),this.applyMeasurementTargetVisual(r),this.scene.render(),t&&this.notifyMeasurementsChanged()}clearMeasurementTargetVisual(e=!0){for(let t of this.measurementTargetMeshes)t.isDisposed()||(t.renderOutline=!1,t.outlineWidth=0);this.measurementTargetMeshes=[],e&&!this.scene.isDisposed&&this.scene.render()}applyMeasurementTargetVisual(e){if(!(!this.measurementActive||e.length===0))for(let t of e)t.isDisposed()||(t.renderOutline=!0,t.outlineColor=new Ee(.38,.65,.98),t.outlineWidth=.045)}setMeasurementSnapKind(e,t=!0){this.measurementSnapKind!==e&&(this.measurementSnapKind=e,t&&this.notifyMeasurementsChanged())}invalidateMeasurementSnapInputCache(){this.measurementSnapInputCache=null,this.measurementSnapInputCacheTargetId=null}getMeasurementTargetName(){let e=this.measurementTargetNode;return!e||Jc(e)?null:Cd(e,e.name||`node-${e.uniqueId}`)}getMeasurementTargetBounds(){if(!this.rootMesh||!this.measurementTargetNode||Jc(this.measurementTargetNode))return null;let e=this.findSelectableNode(this.measurementTargetNode);if(!e)return null;this.measurementTargetNode=e;let t=this.getRenderableMeshes(this.rootMesh).filter(i=>lg(i,e));return Gl(t)}resolveMeasurementPickPoint(e,t){if(t)return this.setMeasurementSnapKind("free"),e;let i=this.createMeasurementGeometrySnapInput();if(!i)return this.setMeasurementSnapKind("free"),e;let r=VA(this.toMeasurementPoint(e),i);return r?(this.setMeasurementSnapKind(r.kind),Ia(r.point)):(this.setMeasurementSnapKind("free"),e)}createMeasurementGeometrySnapInput(){var c;let e=this.measurementTargetNode;if(!this.rootMesh||!e||Jc(e))return null;if(this.measurementSnapInputCache&&this.measurementSnapInputCacheTargetId===e.uniqueId)return this.measurementSnapInputCache;let t=this.getMeasurementTargetMeshes(e);if(t.length===0)return null;let i=[],r=[],s=`babylon:${e.uniqueId}`;for(let f of t){if(f.isDisposed())continue;let d=f.getVerticesData(L.PositionKind);if(!d||d.length<3)continue;let u=f.computeWorldMatrix(!0),h=[],m=Math.floor(d.length/3);for(let p=0;p!t.isDisposed()&&lg(t,e))}createBabylonMeasurementDraftingLayout(e,t){var l,c,f;let i=this.toMeasurementDisplayPoint(e),r=this.toMeasurementDisplayPoint(t),s=this.getMeasurementMarkerSize(),a=(f=(c=(l=this.camera.upVector)==null?void 0:l.clone)==null?void 0:c.call(l))!=null?f:new b(0,1,0);a.normalize();let o=WA(this.toMeasurementPoint(i),this.toMeasurementPoint(r),{viewPosition:this.toMeasurementPoint(this.camera.position),viewUp:this.toMeasurementPoint(a),offset:s*4.2,extensionGap:s*.55,extensionOvershoot:s*.8,arrowLength:s*2.35,arrowWidth:s*.78,labelGap:s*1.05});return o?{lineSegments:o.lineSegments.map(([d,u])=>[Ia(d),Ia(u)]),labelPosition:Ia(o.labelPoint)}:null}getMeasurementMarkerSize(){if(!this.rootMesh)return .02;let e=this.getRenderableBounds(this.rootMesh);return e?Math.max(e.max.x-e.min.x,e.max.y-e.min.y,e.max.z-e.min.z,.001)*.018:.02}cancelPendingMeasurement(e=!0){var r,s;let t=this.pendingMarker,i=(s=(r=this.pendingPoint)==null?void 0:r.clone())!=null?s:null;if(this.pendingPoint=null,this.pendingMarker=null,this.hoveredMarkerIndex=-1,this.removePreviewLine(),t&&i&&!this.isMeasurementPointUsed(i)){let a=this.measurementMarkers.indexOf(t);a>=0&&(this.measurementMarkers.splice(a,1),this.measurementMarkerPoints.splice(a,1)),t.dispose(!1,!0)}else t&&(t.scaling.setAll(1),pE(t,gE));e&&this.scene.render()}isMeasurementPointUsed(e){return this.measurementSegments.some(t=>b.Distance(t.start,e)<1e-4||b.Distance(t.end,e)<1e-4)}findNearestMarkerIndex(e){let t=this.getMeasurementMarkerSize()*2.5,i=this.toMeasurementDisplayPoint(e);for(let r=0;r=0?this.measurementMarkerPoints[i].clone():t;if(this.pendingPoint){if(b.Distance(r,this.pendingPoint)<1e-4)return;if(i<0){let s=this.getMeasurementMarkerSize(),a=Nn.CreateSphere("measure-marker",{diameter:s*.76,segments:12},this.scene);a.position=this.toMeasurementDisplayPoint(r),a.isPickable=!1,a.material=NQ(this.scene),a.renderingGroupId=2,this.measurementMarkers.push(a),this.measurementMarkerPoints.push(r.clone())}this.createMeasurementSegment(this.pendingPoint,r),this.pendingMarker&&(this.pendingMarker.scaling.setAll(1),pE(this.pendingMarker,gE)),this.pendingPoint=null,this.pendingMarker=null,this.removePreviewLine()}else{if(i<0){let s=this.getMeasurementMarkerSize(),a=Nn.CreateSphere("measure-marker",{diameter:s*.76,segments:12},this.scene);a.position=this.toMeasurementDisplayPoint(r),a.isPickable=!1,a.material=NQ(this.scene),a.renderingGroupId=2,this.measurementMarkers.push(a),this.measurementMarkerPoints.push(r.clone()),this.pendingMarker=a}else this.pendingMarker=this.measurementMarkers[i];this.pendingMarker.scaling.setAll(1.6),pE(this.pendingMarker,DEe),this.pendingPoint=r,this.ensurePreviewLine()}this.notifyMeasurementsChanged()}createMeasurementSegment(e,t){var f,d;let i=this.toMeasurementDisplayPoint(e),r=this.toMeasurementDisplayPoint(t),s=this.createBabylonMeasurementDraftingLayout(e,t),a=Nn.CreateLineSystem("measure-line",{lines:(f=s==null?void 0:s.lineSegments)!=null?f:[[i,r]]},this.scene);a.color=DQ.clone(),a.alpha=1,a.isPickable=!1,a.renderingGroupId=2;let o=Dm(this.createMeasurementReading(e,t)),l=(d=s==null?void 0:s.labelPosition)!=null?d:b.Center(i,r),c=this.createMeasurementLabelMesh(o,l,this.getMeasurementMarkerSize()*3.2);this.measurementSegments.push({start:e.clone(),end:t.clone(),line:a,label:c})}createMeasurementLabelMesh(e,t,i){let r=Nn.CreatePlane("measure-label",{width:i*3.7,height:i*1.08},this.scene);r.position=t,r.billboardMode=Q.BILLBOARDMODE_ALL,r.isPickable=!1,r.renderingGroupId=2;let s=new eM("measure-label-tex",{...oc},this.scene);s.hasAlpha=!0;let a=s.getContext();YA(a,e,oc.width,oc.height),s.update();let o=new ze("measure-label-mat",this.scene);return o.diffuseTexture=s,o.emissiveColor=new Ee(1,1,1),o.disableLighting=!0,o.disableDepthWrite=!0,o.opacityTexture=s,o.useAlphaFromDiffuseTexture=!0,r.material=o,r}ensurePreviewLine(){this.previewLine||(this.previewLine=Nn.CreateLineSystem("measure-preview",{lines:Array.from({length:7},()=>[b.Zero(),b.Zero()]),updatable:!0},this.scene),this.previewLine.color=LQ.clone(),this.previewLine.alpha=.82,this.previewLine.isPickable=!1,this.previewLine.renderingGroupId=2)}updatePreviewLine(){var c;if(!this.pendingPoint||!this.previewLine||!this.rootMesh)return;let e=this.toMeasurementDisplayPoint(this.pendingPoint),t=this.engine.getRenderingCanvas();if(!t)return;let i=t.getBoundingClientRect(),r=this.lastPointerClient.x-i.left,s=this.lastPointerClient.y-i.top,a=this.scene.pick(r,s,f=>f!==this.previewLine&&!this.measurementMarkers.includes(f)),o;if(a.hit&&a.pickedPoint)o=this.resolveMeasurementPickPoint(a.pickedPoint,this.lastPointerClient.altKey);else{let f=this.scene.createPickingRay(r,s,q.Identity(),this.camera);o=e.add(f.direction.scale(5))}let l=this.createBabylonMeasurementDraftingLayout(this.pendingPoint,this.toMeasurementBasePoint(o));this.previewLine=Nn.CreateLineSystem("measure-preview",{lines:(c=l==null?void 0:l.lineSegments)!=null?c:[[e,o]],instance:this.previewLine},this.scene),this.previewLine.color=LQ.clone(),this.previewLine.alpha=.82,this.previewLine.isPickable=!1,this.previewLine.renderingGroupId=2}removePreviewLine(){this.previewLine&&(this.previewLine.dispose(),this.previewLine=null)}createMeasurementReading(e,t){return XA(this.toMeasurementPoint(e),this.toMeasurementPoint(t),this.measurementScale,this.measurementUnit)}createMeasurementRecords(){return this.measurementSegments.map((e,t)=>({index:t+1,start:this.toMeasurementPoint(e.start),end:this.toMeasurementPoint(e.end),reading:this.createMeasurementReading(e.start,e.end)}))}toMeasurementPoint(e){return{x:e.x,y:e.y,z:e.z}}createModelSummary(e){let t=this.getRenderableMeshes(e),i=VF(e),r=t.reduce((s,a)=>s+Pd(a),0);return GM(e.name,this.getRenderableBounds(e),t,{splatCount:i?r:void 0,resourceWarnings:this.resourceWarnings})}};Ca.annotationIdentity=q.Identity(),Ca.annotationWorldPoint=b.Zero(),Ca.annotationProjection=b.Zero(),Ca.annotationDirection=b.Zero(),Ca.annotationRay=new rn(b.Zero(),b.Zero(),1);e0=Ca});async function BQ(n,e){if(bh(e).backend==="three"){let{createThreeModelPreview:r}=await Promise.resolve().then(()=>(cV(),lV));return r(n)}let{createBabylonModelPreview:i}=await Promise.resolve().then(()=>(FQ(),wQ));return i(n)}var UQ=y(()=>{"use strict";$E()});var GQ={};Be(GQ,{createBabylonGridRenderer:()=>kEe});function GEe(n){return n.replace(/\|/g,"\\|").replace(/\r?\n/g," ")}function WF(n){return new b(n.x,n.y,n.z)}function VQ(n){return Number.isFinite(n)?Math.max(0,Math.min(n,1)):0}function kEe(n){return new zF(n)}var cg,zF,kQ=y(()=>{"use strict";iL();Ks();HR();XR();We();Kt();Qm();Qp();$f();jc();dE();dE();mE();_A();ga();gl();bA();cg=32;zF=class{constructor(e){this.cells=[];this.initialCameras=[];this.wireframeEnabled=!1;this.rendering=!1;this.dirty=!0;this.contextLost=!1;this.warmupFrame=null;this.renderScale=1;this.cameraZoomObservers=new Set;this.preventCanvasWheelScroll=e=>{e.preventDefault(),e.stopPropagation()};this.handleContextLost=e=>{e.preventDefault(),this.contextLost=!0,this.rendering&&(this.engine.stopRenderLoop(),this.rendering=!1)};this.handleContextRestored=()=>{this.contextLost=!1,this.engine.resize(),this.startRenderLoop(),this.markDirty(),this.scheduleWarmupFrames()};e.className="ai3d-canvas-full",e.addEventListener("wheel",this.preventCanvasWheelScroll,{passive:!1}),this.engine=new ke(e,!0,{preserveDrawingBuffer:!0}),e.addEventListener("webglcontextlost",this.handleContextLost),e.addEventListener("webglcontextrestored",this.handleContextRestored),this.scene=new ri(this.engine),this.scene.clearColor=new dt(.12,.12,.14,1),this.scene.autoClear=!1,new Ra("default-light",new b(0,1,.5),this.scene),this.resizeObs=new ResizeObserver(()=>{this.engine.resize(),this.markDirty()}),this.resizeObs.observe(e),window.requestAnimationFrame(()=>this.engine.resize())}canRender(){let e=this.engine.getRenderingCanvas();return!!(e!=null&&e.isConnected)&&e.clientWidth>0&&e.clientHeight>0}markDirty(){this.dirty=!0}getCameraZoomRange(e){let t=e.radius,i=e.lowerRadiusLimit,r=e.upperRadiusLimit,s=typeof i=="number"&&Number.isFinite(i)&&i>0?i:Math.max(t*.08,1e-5),a=typeof r=="number"&&Number.isFinite(r)&&r>s?r:Math.max(t*8,s*10);return{current:Math.max(s,Math.min(t,a)),min:s,max:a}}notifyCameraZoomChanged(){if(this.cameraZoomObservers.size===0)return;let e=this.getCameraZoomState();for(let t of this.cameraZoomObservers)t(e)}scheduleWarmupFrames(e=8){this.warmupFrame!==null&&window.cancelAnimationFrame(this.warmupFrame),this.warmupFrame=window.requestAnimationFrame(()=>{this.warmupFrame=null,!(!this.canRender()||this.contextLost)&&(this.markDirty(),e>1&&this.scheduleWarmupFrames(e-1))})}getCellBounds(e){let t=Gl(e);if(!t)throw new Error("Grid cell has no renderable meshes");return t}async loadModels(e,t,i){var d,u,h;await fE();let r=e.length>cg?(console.warn(`[AI3D Grid] Capping ${e.length} models to ${cg} (layerMask limit)`),e.slice(0,cg)):e,s=(d=t.columns)!=null?d:Math.min(r.length,3),a=(u=t.gapX)!=null?u:.02,o=(h=t.gapY)!=null?h:.02,l=Math.ceil(r.length/s),c=(1-a*(s+1))/s,f=(1-o*(l+1))/l;for(let m=0;mcg?(console.warn(`[AI3D Preset] Capping ${e.placements.length} placements to ${cg} (layerMask limit)`),e.placements.slice(0,cg)):e.placements,r=[];for(let f=0;f0&&(u.push(...r[g]),h|=1<{this.markDirty(),this.notifyCameraZoomChanged()})),this.initialCameras.push({alpha:f.alpha,beta:f.beta,radius:f.radius,target:f.target.clone()}),f}async loadOne(e,t,i,r,s,a,o){var u,h;let l=await t(e.path),c=(h=(u=e.path.split(".").pop())==null?void 0:u.replace(".","").toLowerCase())!=null?h:"glb",{renderableMeshes:f}=await this.importMesh(e.path,l,o);if(c==="stl"&&e.color){let m=Ee.FromHexString(e.color);for(let g of f)g.material instanceof ze&&g.material.name==="stl-mat"&&(g.material.diffuseColor=m)}if(c==="stl"&&e.wireframe!==void 0)for(let m of f)m.material instanceof ze&&(m.material.wireframe=e.wireframe);let d=this.createCellCamera(f,o,i,r,s,a);this.cells.push({meshes:f,camera:d})}createCellCamera(e,t,i,r,s,a){let o=V_(this.getCellBounds(e)),l=new Ri(`cell-cam-${t}`,Math.PI/4,Math.PI/3,o.radius,WF(o.target),this.scene);l.fov=45*Math.PI/180,l.minZ=o.near,l.maxZ=o.far,l.lowerRadiusLimit=o.lowerRadiusLimit,l.upperRadiusLimit=o.upperRadiusLimit,l.wheelPrecision=45,l.viewport=new Po(i,r,s,a),l.layerMask=1<{this.markDirty(),this.notifyCameraZoomChanged()})),this.initialCameras.push({alpha:l.alpha,beta:l.beta,radius:l.radius,target:l.target.clone()}),l}renderFrame(){if(!this.canRender()||!this.dirty||this.contextLost)return;this.dirty=!1;let e=this.engine,t=this.scene;e.clear(t.clearColor,!0,!0);for(let i of this.cells){e.setViewport(i.camera.viewport);let r=i.camera.viewport,s=e.getRenderWidth(),a=e.getRenderHeight();e.enableScissor(r.x*s,r.y*a,r.width*s,r.height*a),t.activeCamera=i.camera,t.render(),e.disableScissor()}}startRenderLoop(){this.rendering||(this.rendering=!0,this.engine.runRenderLoop(()=>this.renderFrame()))}captureSnapshot(){let e=this.engine.getRenderingCanvas();return e?(this.renderFrame(),e.toDataURL("image/png")):null}getEngine(){return this.engine}getScene(){return this.scene}getCellCount(){return this.cells.length}getCanvas(){return this.engine.getRenderingCanvas()}getPrimaryCamera(){var e,t;return(t=(e=this.cells[0])==null?void 0:e.camera)!=null?t:null}setRenderScale(e){let t=Math.max(.25,Math.min(e,2));this.renderScale=t;let i=Rr()?1.5:1;return this.engine.setHardwareScalingLevel(i/t),this.getRenderScale()}getRenderScale(){return Number(this.renderScale.toFixed(2))}getCameraZoomState(){var s;let e=(s=this.cells[0])==null?void 0:s.camera;if(!e)return null;let t=this.getCameraZoomRange(e),i=(t.max-t.current)/(t.max-t.min),r=VQ(i);return{value:r,percentage:Math.round(r*100)}}setCameraZoom(e){if(this.cells.length===0)return null;let t=VQ(e);for(let i of this.cells){let r=this.getCameraZoomRange(i.camera);i.camera.radius=r.max-t*(r.max-r.min)}return this.markDirty(),this.startRenderLoop(),this.notifyCameraZoomChanged(),this.getCameraZoomState()}observeCameraZoom(e){return this.cameraZoomObservers.add(e),e(this.getCameraZoomState()),()=>{this.cameraZoomObservers.delete(e)}}resetView(){for(let e=0;e(kQ(),GQ));return e(n)}var zQ=y(()=>{"use strict"});var YQ={};Be(YQ,{createLoggedGridRenderer:()=>HF,createLoggedModelPreview:()=>fg,logGridPreviewSelection:()=>XQ,logModelPreviewSelection:()=>HQ});function HQ(n,e,t){n.info("select preview backend",{...e,backend:t.backend,reason:t.reason,ext:t.ext,annotationMode:t.annotationMode,requireWorkbenchFeatures:t.requireWorkbenchFeatures,rendererRollout:t.rendererRollout})}async function fg(n,e,t,i){let r=bh(i);return HQ(n,e,r),{preview:await BQ(t,i),route:r}}function XQ(n,e,t){n.info("select preview backend",{...e,backend:t.backend,reason:t.reason})}async function HF(n,e,t){let i=I3();return XQ(n,e,i),{renderer:await WQ(t),route:i}}var t0=y(()=>{"use strict";UQ();zQ();$E()});function XF(n){jQ=n}function i0(n){return KQ[n]>=KQ[jQ]}function r0(){return new Date().toISOString()}function n0(n){return n&&Object.keys(n).length>0?n:void 0}function qi(n){let e=`[AI3D][${n}]`;return{debug(t,i){i0("debug")&&console.debug(e,r0(),t,n0(i))},info(t,i){i0("info")&&console.debug(e,r0(),t,n0(i))},warn(t,i){i0("warn")&&console.warn(e,r0(),t,n0(i))},error(t,i){i0("error")&&console.error(e,r0(),t,n0(i))}}}var KQ,jQ,wn=y(()=>{"use strict";KQ={debug:10,info:20,warn:30,error:40},jQ="warn"});var qQ={};Be(qQ,{supportsAnimationPreview:()=>a0,supportsAnnotationPreview:()=>s0,supportsBoundingBoxPreview:()=>l0,supportsCameraZoomPreview:()=>c0,supportsDisassemblyPreview:()=>dg,supportsFocusSelectionPreview:()=>ug,supportsMeasurementPreview:()=>vn,supportsOrientationGizmoPreview:()=>_E,supportsRenderScalePreview:()=>vE,supportsWireframePreview:()=>o0,supportsWorkbenchPreview:()=>ZQ});function rr(n,e){return!!n&&typeof n=="object"&&typeof n[e]=="function"}function s0(n){return rr(n,"getAnnotationProvider")}function a0(n){return rr(n,"hasAnimations")&&rr(n,"toggleAnimation")}function vn(n){return rr(n,"toggleMeasurement")&&rr(n,"isMeasurementActive")&&rr(n,"cancelMeasurement")&&rr(n,"clearMeasurements")&&rr(n,"setMeasurementScale")&&rr(n,"getMeasurementScale")&&rr(n,"setMeasurementUnit")&&rr(n,"getMeasurementUnit")&&rr(n,"getMeasurementBounds")&&rr(n,"getMeasurementRecords")&&rr(n,"getMeasurementState")&&rr(n,"updateMeasurementLabels")&&rr(n,"exportMeasurements")}function dg(n){return rr(n,"toggleDisassembly")&&rr(n,"resetDisassembly")&&rr(n,"isDisassemblyEnabled")}function ug(n){return rr(n,"toggleFocusSelection")&&rr(n,"isFocusSelectionEnabled")}function o0(n){return rr(n,"toggleWireframe")}function _E(n){return rr(n,"toggleOrientationGizmo")}function l0(n){return rr(n,"toggleBoundingBox")}function vE(n){return rr(n,"setRenderScale")}function c0(n){return rr(n,"getCameraZoomState")&&rr(n,"setCameraZoom")}function ZQ(n){return rr(n,"setExplode")&&rr(n,"resetExplode")&&rr(n,"focusWorldPoint")}var ah=y(()=>{"use strict"});function f0(n,e){return gu(n,e)}function QQ(n){return Number.isFinite(n)?Math.max(0,Math.min(n,1)):0}function d0(n,e){let t=f0("div","ai3d-zoom-control is-hidden"),i=f0("div","ai3d-zoom-track"),r=f0("div","ai3d-zoom-fill"),s=f0("input","ai3d-zoom-range");s.type="range",s.min="0",s.max="100",s.step="1",s.value="0",s.setAttribute("aria-label",X("helper.cameraZoomLabel")),s.setAttribute("aria-orientation","vertical"),i.appendChild(r),t.append(i,s),n.appendChild(t);let a=null,o=null,l=null,c=E=>{E.stopPropagation()};t.addEventListener("mousedown",c),t.addEventListener("click",c);function f(){let E=e();return c0(E)?E:null}function d(E){if(!E){t.classList.add("is-hidden"),s.disabled=!0;return}let T=QQ(E.value),S=Math.round(T*100);s.disabled=!1,s.value=String(S),t.style.setProperty("--ai3d-zoom-percent",`${S}%`);let A=Bi("helper.cameraZoomValue",{value:`${E.percentage}%`});s.setAttribute("aria-valuenow",String(S)),s.setAttribute("aria-valuetext",A),t.setAttribute("title",A),t.classList.remove("is-hidden")}function u(E){E!==a&&(o==null||o(),o=null,a=E,E!=null&&E.observeCameraZoom&&(o=E.observeCameraZoom(d)))}function h(){var T;let E=f();u(E),d((T=E==null?void 0:E.getCameraZoomState())!=null?T:null)}function m(){g(s.valueAsNumber/100)}function g(E){let T=a!=null?a:f();if(!T){h();return}u(T),d(T.setCameraZoom(QQ(E)))}function p(E){let T=i.getBoundingClientRect();return T.height<=0?s.valueAsNumber/100:1-(E-T.top)/T.height}function _(E){E.preventDefault(),E.stopPropagation(),s.focus({preventScroll:!0}),g(p(E.clientY))}function v(E){var T;l===E.pointerId&&(E.preventDefault(),E.stopPropagation(),(T=t.hasPointerCapture)!=null&&T.call(t,E.pointerId)&&t.releasePointerCapture(E.pointerId),l=null,t.classList.remove("is-dragging"))}return s.addEventListener("input",m),t.addEventListener("pointerdown",E=>{var T;if(E.button!==0||s.disabled){E.stopPropagation();return}l=E.pointerId,(T=t.setPointerCapture)==null||T.call(t,E.pointerId),t.classList.add("is-dragging"),_(E)}),t.addEventListener("pointermove",E=>{l===E.pointerId&&_(E)}),t.addEventListener("pointerup",v),t.addEventListener("pointercancel",v),t.addEventListener("wheel",E=>{E.preventDefault(),E.stopPropagation();let T=E.deltaY<0?6:-6;s.value=String(Math.max(0,Math.min(100,s.valueAsNumber+T))),m()},{passive:!1}),h(),{sync:h,destroy(){o==null||o(),o=null,a=null,t.remove()}}}var YF=y(()=>{"use strict";En();ah();Rm()});function Zr(n){let e=createSvg("svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","16"),e.setAttribute("height","16");let t=new DOMParser().parseFromString(`${n}`,"image/svg+xml");for(let i of Array.from(t.documentElement.childNodes))e.appendChild(activeDocument.importNode(i,!0));return e}function $Q(n){var a,o;let[e,t]=n.split(","),i=(o=(a=e.match(/:(.*?);/))==null?void 0:a[1])!=null?o:"image/png",r=atob(t),s=new Uint8Array(r.length);for(let l=0;l{let s=Math.abs(i-e),a=Math.abs(hg[t]-e);s{te.stopPropagation()};u.addEventListener("pointerdown",p),u.addEventListener("mousedown",p),u.addEventListener("click",p);let _=te=>{if(te.key!=="Escape"||te.defaultPrevented)return;let Le=te.target;if(Le instanceof Node&&!u.contains(Le)&&!e.contains(Le))return;let Ot=qt();!Ot||!HA(Ot)||(Ht(),te.preventDefault(),te.stopPropagation())};u.addEventListener("keydown",_),e.addEventListener("keydown",_),f&&(u.classList.add("is-mobile"),e$(e,!1));let v=d0(e,i),E=null,T=null,S=te=>(te.classList.add("is-secondary"),te),A=(te,Le)=>{te.classList.toggle("ai3d-btn-active",Le),te.setAttribute("aria-pressed",String(Le))},R=()=>{for(let te of[h,m,g]){let Le=Array.from(te.querySelectorAll(".ai3d-inline-btn")).filter(mi=>!mi.classList.contains("is-hidden")),Ot=Le.length>0,bi=Le.some(mi=>!mi.classList.contains("is-secondary"));te.classList.toggle("is-hidden",!Ot),te.classList.toggle("has-primary-visible",bi)}},M=!1,I=!1,C=f?h.createEl("button",{cls:"ai3d-inline-btn ai3d-mobile-mode-btn",attr:{"aria-label":X("helper.enableInteractionLabel"),"aria-pressed":"false"}}):null;C==null||C.appendChild(Zr(''));let D=(zE=C==null?void 0:C.createSpan({cls:"ai3d-mobile-mode-btn-label"}))!=null?zE:null,w=()=>{f&&C&&(e$(e,M),A(C,M),D==null||D.setText(M?X("helper.scrollAction"):X("helper.interactAction")),C.setAttribute("aria-label",M?X("helper.disableInteractionLabel"):X("helper.enableInteractionLabel"))),A(Pe,I),u.classList.toggle("show-secondary",I),R()},k=te=>{M=te,w()};C==null||C.addEventListener("click",()=>{let te=!M;l==null||l(te),k(te),Ei(C,te?X("helper.interactionOn"):X("helper.interactionOff"))});let O=(te,Le)=>{te.classList.toggle("is-hidden",!Le)},N=null,B=()=>{var mi;let te=i(),Le=te&&ug(te)?te:null,Ot=te&&dg(te)?te:null,bi=te&&vn(te)?te:null;A(me,!!(Le!=null&&Le.isFocusSelectionEnabled())),A(Ue,!!(Ot!=null&&Ot.isDisassemblyEnabled())),A(ue,!!(bi!=null&&bi.isMeasurementActive())),te&&_E(te)&&A(Y,!!((mi=te.isOrientationGizmoEnabled)!=null&&mi.call(te)))},V=()=>{let te=i(),Le=te&&ug(te)?te:null,Ot=te&&dg(te)?te:null,bi=te&&a0(te)?te:null,mi=te&&vE(te)?te:null;te!==N&&(N=te,A(H,!1),A(de,!1),A(Ce,!1),Ce.replaceChildren(Zr('')),O(Z,!!(te!=null&&te.resetView)),O(j,!!(te!=null&&te.exportModelInfo)),O(J,!!(te!=null&&te.exportSelectedPartInfo)),O(H,!!te&&o0(te)),O(Y,!!te&&_E(te)),O(de,!!te&&l0(te)),O(me,!!Le),O(Ue,!!Ot),O(ne,!!mi),O(Ce,!!(bi!=null&&bi.hasAnimations()))),ve(mi),O(ue,!!te&&vn(te)),B(),Ht(),R(),v.sync()},Z=h.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.resetViewLabel")}});sn(Z,"reset-view"),Z.appendChild(Zr('')),Z.addEventListener("click",()=>{let te=i();te!=null&&te.resetView&&(te.resetView(),V(),Ei(Z,X("helper.resetViewDone")))});let j=S(m.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.copyModelInfoLabel")}}));sn(j,"copy-model-info"),j.appendChild(Zr('')),j.addEventListener("click",()=>{let te=i();if(te!=null&&te.exportModelInfo)try{let Le=te.exportModelInfo(r());if(!Le)return;navigator.clipboard.writeText(Le).then(()=>{Ei(j,X("helper.copied"))}).catch(()=>{Ei(j,X("helper.failed"))})}catch(Le){console.error("[AI3D] Export model info failed:",Le),Ei(j,X("helper.failed"))}});let J=S(m.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.copySelectedPartInfoLabel")}}));sn(J,"copy-selected-part-info"),J.appendChild(Zr('')),J.addEventListener("click",()=>{let te=i();if(te!=null&&te.exportSelectedPartInfo)try{let Le=te.exportSelectedPartInfo();if(!Le){Ei(J,X("helper.noSelectedPart"));return}navigator.clipboard.writeText(Le).then(()=>{Ei(J,X("helper.copied"))}).catch(()=>{Ei(J,X("helper.failed"))})}catch(Le){console.error("[AI3D] Export selected part info failed:",Le),Ei(J,X("helper.failed"))}});let H=h.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.toggleWireframeLabel"),"aria-pressed":"false"}});sn(H,"toggle-wireframe"),H.appendChild(Zr('')),H.addEventListener("click",()=>{let te=i();if(!(te!=null&&te.toggleWireframe))return;let Le=te.toggleWireframe();A(H,Le),Ei(H,Le?X("helper.wireframeOn"):X("helper.wireframeOff"))});let Y=h.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.toggleAxesLabel"),"aria-pressed":"false"}});sn(Y,"toggle-axes"),Y.appendChild(Zr('')),Y.addEventListener("click",()=>{let te=i();if(!(te!=null&&te.toggleOrientationGizmo))return;let Le=te.toggleOrientationGizmo();A(Y,Le),Ei(Y,Le?X("helper.axesOn"):X("helper.axesOff"))});let de=h.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.toggleBoundingBoxLabel"),"aria-pressed":"false"}});sn(de,"toggle-bounding-box"),de.appendChild(Zr('')),de.addEventListener("click",()=>{let te=i();if(!(te!=null&&te.toggleBoundingBox))return;let Le=te.toggleBoundingBox();A(de,Le),Ei(de,Le?X("helper.boundingBoxOn"):X("helper.boundingBoxOff"))});let me=m.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.toggleFocusSelectionLabel"),"aria-pressed":"false"}});sn(me,"toggle-focus"),me.appendChild(Zr('')),me.addEventListener("click",()=>{let te=i();if(!te||!ug(te))return;let Le=te.toggleFocusSelection();V(),Ei(me,Le?X("helper.focusSelectionOn"):X("helper.focusSelectionOff"))});let Ue=m.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.toggleDisassemblyLabel"),"aria-pressed":"false"}});sn(Ue,"toggle-disassembly"),Ue.appendChild(Zr('')),Ue.addEventListener("click",()=>{let te=i();if(!te||!dg(te))return;let Le=te.toggleDisassembly();V(),Ei(Ue,Le?X("helper.disassemblyOn"):X("helper.disassemblyOff"))});let ae=u0((HE=a==null?void 0:a().renderScale)!=null?HE:1),_e=KF(ae),ne=S(h.createEl("button",{cls:"ai3d-inline-btn ai3d-res-btn",attr:{"aria-label":X("helper.changeResolutionLabel")}}));sn(ne,"change-resolution");function ve(te=null){var bi,mi;let Le=jF(te,(mi=(bi=a==null?void 0:a().renderScale)!=null?bi:hg[_e])!=null?mi:1);_e=KF(Le);let Ot=JQ(Le);ne.textContent=Ot,ne.setAttribute("title",Bi("helper.resolutionValue",{value:Ot}))}ve(),ne.addEventListener("click",()=>{let te=i();if(!te||!vE(te))return;_e=(KF(jF(te,hg[_e]))+1)%hg.length;let Ot=te.setRenderScale(hg[_e]),bi=jF(te,Ot);ve(te),Ei(ne,Bi("helper.resolutionValue",{value:JQ(bi)}))});let Ce=S(h.createEl("button",{cls:"ai3d-inline-btn is-hidden",attr:{"aria-label":X("helper.toggleAnimationLabel"),"aria-pressed":"false"}}));sn(Ce,"toggle-animation"),Ce.appendChild(Zr('')),Ce.addEventListener("click",()=>{let te=i();if(!(te!=null&&te.toggleAnimation))return;let Le=te.toggleAnimation();Ce.replaceChildren(Zr(Le?'':'')),A(Ce,Le),Ei(Ce,Le?X("helper.playing"):X("helper.paused"))});let ue=m.createEl("button",{cls:"ai3d-inline-btn is-hidden",attr:{"aria-label":X("helper.toggleMeasurementLabel"),"aria-pressed":"false",title:X("helper.toggleMeasurementLabel")}});sn(ue,"toggle-measurement"),ue.appendChild(Zr('')),ue.addEventListener("click",()=>{let te=i();if(!te||!vn(te))return;let Le=te.toggleMeasurement();V(),Ei(ue,Le?X("helper.measurementOn"):X("helper.measurementOff")),Le||A(ct,!1)});function be(te){let Le=i();!Le||!vn(Le)||(Le.clearMeasurements(),A(ue,Le.isMeasurementActive()),Ht(),Ei(te,X("helper.measurementsCleared")))}function Ge(te){let Le=i();if(!Le||!vn(Le))return;let Ot=Le.exportMeasurements();if(!Ot){Ei(te,X("helper.noMeasurements"));return}navigator.clipboard.writeText(Ot).then(()=>{Ei(te,X("helper.measurementsCopied"))}).catch(()=>{Ei(te,X("helper.failed"))})}let Ze=m.createEl("button",{cls:"ai3d-measurement-strip is-hidden",attr:{"aria-expanded":"false","aria-label":X("helper.calibrateLabel")}});sn(Ze,"toggle-measurement-details"),Ze.setAttribute("aria-live","polite");let Ye=Ze.createSpan({cls:"ai3d-measurement-strip-value"}),Ke=Ze.createSpan({cls:"ai3d-measurement-strip-meta"});function qt(){let te=i();return te&&vn(te)?te:null}function Ut(te){te!==E&&(T==null||T(),T=null,E=te,te!=null&&te.observeMeasurements&&(T=te.observeMeasurements(()=>{B(),Ht()})))}function Wi(te){var Ot;if(te.phase==="select-target")return X("helper.measurementSelectTarget");if(te.phase==="picking-end"&&te.snapKind)return oe(te.snapKind);if(te.phase==="picking-end")return X("helper.measurementPickEnd");let Le=(Ot=te.records[te.records.length-1])!=null?Ot:null;return Le?Nf(Le.reading.distance,Le.reading.unit):te.snapKind?oe(te.snapKind):te.phase==="ready"?X("helper.measurementPickStart"):te.phase==="reviewing"?X("helper.measurementReviewing"):X("helper.measurementStripEmpty")}function oe(te){switch(te){case"vertex":return X("helper.measurementSnapVertex");case"edge":return X("helper.measurementSnapEdge");case"free":return X("helper.measurementSnapFree")}}function Qi(te){return te.records.length>0?Bi("helper.measurementStripSaved",{count:String(te.records.length)}):te.phase==="select-target"?X("helper.measurementTargetMissing"):te.targetName?Bi("helper.measurementTargetLabel",{target:te.targetName}):te.unit}function Ht(){let te=qt();if(Ut(te),!te){Ze.classList.add("is-hidden"),Ne.classList.add("is-hidden"),Ze.classList.remove("is-expanded"),Ze.setAttribute("aria-expanded","false"),De.disabled=!0,ct.disabled=!0;return}let Le=te.getMeasurementState(),Ot=Le.active,bi=Le.records,mi=bi.length>0;Ze.classList.toggle("is-hidden",Le.phase==="inactive"),!Ot&&!mi&&(Ne.classList.add("is-hidden"),Ze.classList.remove("is-expanded"),Ze.setAttribute("aria-expanded","false")),Ze.classList.toggle("is-active",Ot),Ze.classList.toggle("is-pending",Le.phase==="picking-end"),Ze.classList.toggle("is-targeting",Le.phase==="select-target"),Ze.classList.toggle("is-reviewing",Le.phase==="reviewing"),Ze.classList.toggle("has-records",mi),Ze.dataset.ai3dMeasurementPhase=Le.phase,Ye.textContent=Wi(Le),Ke.textContent=Qi(Le),Ze.setAttribute("aria-label",[X("helper.measurementStripTitle"),Ye.textContent,Ke.textContent,X("helper.calibrateLabel")].filter(Boolean).join(" ")),ye.textContent=mi?Bi("helper.measurementStripSaved",{count:String(bi.length)}):X("helper.measurementNoRecords");let G=mi;De.disabled=!G,ct.disabled=!G,A(ue,Ot)}let Di=g.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.copySnapshotLabel")}});sn(Di,"copy-snapshot"),Di.appendChild(Zr('')),Di.addEventListener("click",()=>{let te=i();if(te)try{let Le=te.captureSnapshot();if(!Le)return;let Ot=$Q(Le);navigator.clipboard.write([new ClipboardItem({"image/png":Ot})]).then(()=>{Ei(Di,X("helper.copied"))}).catch(()=>{Ei(Di,X("helper.failed"))})}catch(Le){console.error("[AI3D] Copy snapshot failed:",Le),Ei(Di,X("helper.failed"))}});let ot=S(g.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.saveSnapshotLabel")}}));sn(ot,"save-snapshot"),ot.appendChild(Zr('')),ot.addEventListener("click",()=>{var Le,Ot;let te=i();if(te)try{let bi=te.captureSnapshot();if(!bi)return;let mi=r(),G=dn(mi)||"model",le=a==null?void 0:a(),xe=(Le=le==null?void 0:le.snapshotFolder)!=null?Le:"Media/3D Previews",Se=(Ot=le==null?void 0:le.snapshotNaming)!=null?Ot:"model-name",Te=Date.now(),vt=Se==="timestamp"?`snapshot_${Te}.png`:`${G}_snapshot_${Te}.png`,xt=$Q(bi),ft=new FileReader;ft.onload=()=>{let Ct=ft.result;t.vault.adapter.exists(xe).then(Pt=>Pt?Promise.resolve():t.vault.createFolder(xe).catch(pi=>{WEe.warn("Failed to create vault folder",{path:xe,error:String(pi)})})).then(()=>t.vault.createBinary(`${xe}/${vt}`,Ct)).then(()=>{Ei(ot,X("helper.saved"))}).catch(Pt=>{console.error("[AI3D] Save snapshot failed:",Pt),Ei(ot,X("helper.failed"))})},ft.onerror=()=>{console.error("[AI3D] FileReader error"),Ei(ot,X("helper.failed"))},ft.onabort=()=>{console.error("[AI3D] FileReader aborted"),Ei(ot,X("helper.failed"))},ft.readAsArrayBuffer(xt)}catch(bi){console.error("[AI3D] Save snapshot failed:",bi),Ei(ot,X("helper.failed"))}});let ji=S(g.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.downloadSnapshotLabel")}}));sn(ji,"download-snapshot"),ji.appendChild(Zr('')),ji.addEventListener("click",()=>{let te=i();if(te)try{let Le=te.captureSnapshot();if(!Le)return;let Ot=r(),mi=`${dn(Ot)||"model"}_snapshot_${Date.now()}.png`,G=createEl("a");G.href=Le,G.download=mi,activeDocument.body.appendChild(G),G.click(),G.remove(),Ei(ji,X("helper.downloaded"))}catch(Le){console.error("[AI3D] Download snapshot failed:",Le),Ei(ji,X("helper.failed"))}});let K=S(g.createEl("button",{cls:"ai3d-inline-btn",attr:{"aria-label":X("helper.removePreviewLabel")}}));sn(K,"remove-preview"),K.appendChild(Zr('')),K.addEventListener("click",s);let U=m.createEl("button",{cls:"ai3d-inline-btn is-hidden ai3d-annot-btn",attr:{"aria-label":X(d.labelKey),"aria-pressed":"false"}});sn(U,"toggle-annotation"),U.appendChild(Zr(''));let he=U.createSpan({cls:"ai3d-pin-badge is-hidden"});U.addEventListener("click",()=>{if(!o)return;let te=o();A(U,te),Ei(U,te?X(d.activeTooltipKey):X(d.inactiveTooltipKey))});let Pe=u.createEl("button",{cls:"ai3d-inline-btn ai3d-mobile-more-toggle",attr:{"aria-label":X("helper.showMoreActionsLabel"),"aria-pressed":"false"}});Pe.appendChild(Zr('')),Pe.addEventListener("click",()=>{I=!I,Pe.setAttribute("aria-label",I?X("helper.hideMoreActionsLabel"):X("helper.showMoreActionsLabel")),w(),Ei(Pe,I?X("helper.moreActionsShown"):X("helper.moreActionsHidden"))}),n.insertBefore(u,e.nextSibling);let Ne=u.createDiv({cls:"ai3d-measurement-details is-hidden"});Ne.setAttribute("role","group"),Ne.setAttribute("aria-label",X("helper.calibrateTitle")),Ne.addEventListener("pointerdown",p),Ne.addEventListener("mousedown",p),Ne.addEventListener("click",p),Ne.createDiv({cls:"ai3d-measurement-details-title",text:X("helper.calibrateTitle")});let et=Ne.createDiv({cls:"ai3d-measurement-section ai3d-measurement-records-section"});et.createDiv({cls:"ai3d-measurement-section-title",text:X("helper.measurementRecordsTitle")});let rt=et.createDiv({cls:"ai3d-measurement-detail-row ai3d-measurement-detail-actions"}),ye=rt.createSpan({cls:"ai3d-measurement-record-summary"}),De=rt.createEl("button",{cls:"ai3d-inline-btn ai3d-measurement-detail-action",attr:{"aria-label":X("helper.copyMeasurementsLabel")}});sn(De,"copy-measurements"),De.appendChild(Zr('')),De.addEventListener("click",()=>{Ge(De)});let ct=rt.createEl("button",{cls:"ai3d-inline-btn ai3d-measurement-detail-action",attr:{"aria-label":X("helper.clearMeasurementsLabel")}});sn(ct,"clear-measurements"),ct.appendChild(Zr('')),ct.addEventListener("click",()=>{be(ct)});let At=Ne.createDiv({cls:"ai3d-measurement-section ai3d-measurement-calibration-section"});At.createDiv({cls:"ai3d-measurement-section-title",text:X("helper.measurementCalibrationTitle")});let nt=At.createDiv({cls:"ai3d-measurement-detail-row ai3d-measurement-unit-row"});nt.createSpan({cls:"ai3d-measurement-detail-label",text:X("helper.measurementUnitLabel")});let qe=nt.createEl("select",{cls:"ai3d-measurement-detail-select"});for(let te of["um","mm","cm","m"]){let Le=qe.createEl("option");Le.value=te,Le.textContent=te}qe.value="mm";let Vt=At.createDiv({cls:"ai3d-measurement-detail-row ai3d-measurement-reference-row"});Vt.createSpan({cls:"ai3d-measurement-detail-label",text:X("helper.calibrateReference")});let ii=Vt.createSpan({cls:"ai3d-measurement-detail-readonly ai3d-measurement-reference-value"}),hi=Vt.createEl("input",{cls:"ai3d-measurement-detail-input ai3d-measurement-reference-input",attr:{type:"number",step:"any",min:"0",placeholder:X("helper.calibrateReferencePlaceholder")}}),se=Vt.createEl("button",{cls:"ai3d-inline-btn ai3d-measurement-reference-apply",text:X("helper.calibrateReferenceApply"),attr:{type:"button"}});sn(se,"calibrate-reference");let Qe=Ne.createDiv({cls:"ai3d-measurement-section ai3d-measurement-size-section"});Qe.createDiv({cls:"ai3d-measurement-section-title",text:X("helper.measurementModelSizeTitle")});let Ie=Qe.createDiv({cls:"ai3d-measurement-detail-row"});Ie.createSpan({cls:"ai3d-measurement-detail-label",text:X("helper.calibrateCurrent")});let ut=Ie.createSpan({cls:"ai3d-measurement-detail-readonly"}),it=Ie.createSpan({cls:"ai3d-measurement-detail-readonly"}),Ve=Ie.createSpan({cls:"ai3d-measurement-detail-readonly"}),Rt=Qe.createDiv({cls:"ai3d-measurement-detail-row ai3d-measurement-size-row"});Rt.createSpan({cls:"ai3d-measurement-detail-label",text:X("helper.calibrateReal")});let Gt=Rt.createEl("input",{cls:"ai3d-measurement-detail-input",attr:{type:"number",step:"any",placeholder:"X"}}),$i=Rt.createEl("input",{cls:"ai3d-measurement-detail-input",attr:{type:"number",step:"any",placeholder:"Y"}}),li=Rt.createEl("input",{cls:"ai3d-measurement-detail-input",attr:{type:"number",step:"any",placeholder:"Z"}}),xr=Qe.createDiv({cls:"ai3d-measurement-detail-row ai3d-measurement-size-options"}).createEl("label",{cls:"ai3d-measurement-detail-lock"}),Da=xr.createEl("input",{attr:{type:"checkbox",checked:"true"}});xr.appendChild(activeDocument.createTextNode(" "+X("helper.calibrateLock")));let UE=Qe.createDiv({cls:"ai3d-measurement-detail-row ai3d-measurement-detail-scale-actions"}),_h=UE.createEl("button",{cls:"ai3d-inline-btn",text:X("helper.calibrateApply")}),Ig=UE.createEl("button",{cls:"ai3d-inline-btn",text:X("helper.calibrateReset")}),qr=null;function vh(){var Ot;let te=i();if(!te||!vn(te))return null;let Le=te.getMeasurementState().records;return(Ot=Le[Le.length-1])!=null?Ot:null}function VE(){let te=i();if(!te||!vn(te))return;let Le=te.getMeasurementState(),Ot=Le.bounds,bi=Le.scale;if(qe.value=Le.unit,qr=Ot,Ot){let G=Le.unit;ut.textContent=`X: ${Ro(Ot.x*bi.x)} ${G}`,it.textContent=`Y: ${Ro(Ot.y*bi.y)} ${G}`,Ve.textContent=`Z: ${Ro(Ot.z*bi.z)} ${G}`}else ut.textContent="X: -",it.textContent="Y: -",Ve.textContent="Z: -";let mi=vh();ii.textContent=mi?Nf(mi.reading.distance,mi.reading.unit,!1):X("helper.calibrateReferenceEmpty"),hi.disabled=!mi,se.disabled=!mi,hi.placeholder=mi?Ro(mi.reading.distance):X("helper.calibrateReferencePlaceholder")}function GE(){var G,le;let te=i();if(!te||!vn(te)||!qr)return;let Le=parseFloat(Gt.value),Ot=parseFloat($i.value),bi=parseFloat(li.value),mi=FU(qr,{x:Number.isFinite(Le)?Le:void 0,y:Number.isFinite(Ot)?Ot:void 0,z:Number.isFinite(bi)?bi:void 0},te.getMeasurementScale(),Da.checked);if(!mi){Ei(_h,X("helper.calibrateNeedsValue"));return}(G=te.setMeasurementUnit)==null||G.call(te,qe.value),(le=te.setMeasurementScale)==null||le.call(te,mi),sf(),Ht(),Ei(_h,X("helper.calibrated"))}function Eh(){var mi,G;let te=i();if(!te||!vn(te))return;let Le=parseFloat(hi.value);(mi=te.setMeasurementUnit)==null||mi.call(te,qe.value);let Ot=vh();if(!Ot||!Number.isFinite(Le)||Le<=0){Ei(se,X("helper.calibrateNeedsValue"));return}let bi=wU(te.getMeasurementScale(),Ot.reading.distance,Le);if(!bi){Ei(se,X("helper.calibrateNeedsValue"));return}(G=te.setMeasurementScale)==null||G.call(te,bi),hi.value="",sf(),Ht(),Ei(se,X("helper.calibrated"))}function kE(){var Le,Ot;let te=i();!te||!vn(te)||((Le=te.setMeasurementUnit)==null||Le.call(te,qe.value),(Ot=te.setMeasurementScale)==null||Ot.call(te,{x:1,y:1,z:1}),hi.value="",sf(),Ht(),Ei(Ig,X("helper.calibrateResetDone")))}function nf(te){if(!Da.checked||!qr)return;let Ot=parseFloat((te==="x"?Gt:te==="y"?$i:li).value);if(!isFinite(Ot)||Ot===0)return;let bi=qr[te];if(bi<=1e-4)return;let mi=Ot/bi;te!=="x"&&(Gt.value=Ro(qr.x*mi)),te!=="y"&&($i.value=Ro(qr.y*mi)),te!=="z"&&(li.value=Ro(qr.z*mi))}Gt.addEventListener("input",()=>nf("x")),$i.addEventListener("input",()=>nf("y")),li.addEventListener("input",()=>nf("z")),qe.addEventListener("change",()=>{let te=i();!te||!vn(te)||(te.setMeasurementUnit(qe.value),sf(),Ht())}),se.addEventListener("click",Eh),_h.addEventListener("click",GE),Ig.addEventListener("click",kE);function sf(){if(VE(),qr){let te=i(),Le=te&&vn(te)?te.getMeasurementScale():{x:1,y:1,z:1};Gt.value=Ro(qr.x*Le.x),$i.value=Ro(qr.y*Le.y),li.value=Ro(qr.z*Le.z)}else Gt.value="",$i.value="",li.value=""}function WE(te,Le){te&&sf(),Ne.classList.toggle("is-hidden",!te),Ze.classList.toggle("is-expanded",te),Ze.setAttribute("aria-expanded",String(te)),Ht(),Ei(Le,te?X("helper.calibrateOpen"):X("helper.calibrateClose"))}return Ze.addEventListener("click",()=>{Ze.classList.contains("is-hidden")||WE(Ne.classList.contains("is-hidden"),Ze)}),w(),V(),{showAnimButton(){Ce.classList.remove("is-hidden"),R()},showAnnotateButton(){U.classList.remove("is-hidden"),R()},updateAnnotationBadge(te){te>0?(he.textContent=String(te),he.classList.remove("is-hidden")):he.classList.add("is-hidden")},setMobileInteractionMode(te){f&&k(te)},syncCapabilities:V}}function Ei(n,e){var i;(i=ZF.get(n))==null||i.remove();let t=n.createSpan({cls:"ai3d-tooltip"});t.textContent=e,ZF.set(n,t),window.setTimeout(()=>{t.remove(),ZF.delete(n)},1500)}var WEe,hg,zEe,ZF,qF=y(()=>{"use strict";En();wn();ah();ga();ps();W_();YF();WEe=qi("helper-buttons");hg=[.5,.75,1,1.25,1.5,2],zEe=2;ZF=new WeakMap});function t$(n){let e=na(n.sourceExt),t=[];return e!==n.sourceExt&&t.push(`Normalized extension '${n.sourceExt}' -> '${e}'.`),HEe.debug("prepare direct load",{path:n.path,sourceExt:n.sourceExt,normalizedExt:e,warningCount:t.length}),{effectivePath:n.path,effectiveExt:e,warnings:t}}var HEe,i$=y(()=>{"use strict";Oa();wn();HEe=qi("direct-load-service")});var r$={};Be(r$,{MissingConverterError:()=>Od,MobileConversionUnavailableError:()=>oh,describeModelLoadFailure:()=>TE,formatModelLoadFailure:()=>h0,isMissingConverterError:()=>SE});function m0(n){return`.${n.trim().toLowerCase()}`}function SE(n){return n instanceof Od}function h0(n){var e;if(n instanceof Od){let t=(e=XEe[n.converterId])!=null?e:n.converterId;return Bi("modelLoad.warningMessage",{ext:m0(n.sourceExt),converterName:t})}return n instanceof oh?Bi("modelLoad.mobileWarningMessage",{ext:m0(n.sourceExt)}):Bi("modelLoad.errorMessage",{reason:n instanceof Error?n.message:String(n)})}function TE(n){return n instanceof Od?{level:"warning",title:X("modelLoad.warningTitle"),message:h0(n),hint:X("modelLoad.warningHint")}:n instanceof oh?{level:"warning",title:X("modelLoad.warningTitle"),message:h0(n),hint:X("modelLoad.mobileWarningHint")}:{level:"error",title:X("modelLoad.errorTitle"),message:h0(n),hint:X("modelLoad.errorHint")}}var XEe,Od,oh,mg=y(()=>{"use strict";En();XEe={freecad:"FreeCAD",obj2gltf:"obj2gltf",fbx2gltf:"FBX2glTF",assimp:"mesh",sldprt:"SolidWorks"};Od=class extends Error{constructor(t,i){super(`Converter '${t}' is not registered for ${m0(i)}. Enable the matching converter in plugin settings before loading this format.`);this.converterId=t;this.sourceExt=i;this.name="MissingConverterError"}},oh=class extends Error{constructor(t){super(`Format ${m0(t)} requires local conversion tools that are unavailable on iOS, iPadOS, and Android.`);this.sourceExt=t;this.name="MobileConversionUnavailableError"}}});var o$={};Be(o$,{convertForPreview:()=>$Ee});function s$(n,e){let t=n.lastIndexOf("."),i=t>0?n.slice(0,t):n,r=Math.max(i.lastIndexOf("/"),i.lastIndexOf("\\")),s=i.slice(0,r+1),a=i.slice(r+1);return`${s}${a}.ai3d-converted.${e}`}function YEe(n){let e=2166136261;for(let t=0;t>>0).toString(16).padStart(8,"0")}function a$(n){let e=Xn(n);return Hn(n,e).replace(/[^A-Za-z0-9._-]+/g,"_").replace(/^_+|_+$/g,"").slice(0,80)||"model"}function n$(n){return Hn(n,Xn(n)).toLowerCase()}function KEe(n,e,t){if(!t)return s$(n,e);let i=a$(n),r=YEe(`${n}::${e}`);return Ji(t,`${i}-${r}.ai3d-converted.${e}`)}function jEe(n,e,t){return n.converterId!==e?!1:t?n.converterId===t.converterId&&n.converterCacheKey===t.cacheKey:!0}async function ZEe(n){if(!n)return!1;try{return await hs(n,ms),!0}catch(e){return!1}}async function g0(n,e,t){if(!e)return!1;try{let[i,r]=await Promise.all([t!=null?t:hu(n),hu(e)]);return r.size>0&&r.mtimeMs>=i.mtimeMs}catch(i){return!1}}async function qEe(n){return typeof n=="function"?await n():n}async function QEe(n,e,t,i){var l,c;let r=(c=(l=n.convertedAssetCache)==null?void 0:l.entries())!=null?c:[];if(r.length===0)return;let s=n$(n.sourcePath),a=a$(n.sourcePath),o=r.filter(f=>f.sourcePath!==n.sourcePath&&f.sourceExt===n.sourceExt&&f.targetExt===e&&f.outputExt===e&&f.converterId===t&&n$(f.sourcePath)===s&&Hn(f.outputPath).startsWith(`${a}-`)&&Hn(f.outputPath).endsWith(`.ai3d-converted.${e}`)).sort((f,d)=>d.createdAt-f.createdAt);for(let f of o)if(await g0(n.sourcePath,f.outputPath,i))return f}async function $Ee(n){var u,h,m,g,p,_,v,E,T,S;if(n.capability.strategy!=="convert")throw new Error(`Expected convert strategy, got '${n.capability.strategy}'.`);let e=n.capability.converterId,t=(u=n.capability.outputFormat)!=null?u:"glb";if(!e)throw new Error(`Format .${n.sourceExt} does not define a converter id.`);ef.info("prepare conversion route",{sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,converterId:e});let i=null,r=()=>(i!=null||(i=hu(n.sourcePath)),i),s=(h=n.convertedAssetCache)==null?void 0:h.get(n.sourcePath,n.sourceExt,t);if(s)if(!await ZEe(s.outputPath))ef.warn("conversion cache stale",{sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:s.outputPath}),(m=n.convertedAssetCache)==null||m.delete(n.sourcePath,n.sourceExt,t);else if(!jEe(s,e))ef.warn("conversion cache identity mismatch",{sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,cachedConverterId:s.converterId,cachedConverterCacheKey:s.converterCacheKey,currentConverterId:e}),(g=n.convertedAssetCache)==null||g.delete(n.sourcePath,n.sourceExt,t);else if(!await g0(n.sourcePath,s.outputPath,r()))ef.warn("conversion cache output older than source",{sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:s.outputPath}),(p=n.convertedAssetCache)==null||p.delete(n.sourcePath,n.sourceExt,t);else return ef.info("conversion cache hit",{sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:s.outputPath}),{effectivePath:s.outputPath,effectiveExt:s.outputExt,warnings:[...s.warnings,"Using cached conversion output."]};let a=KEe(n.sourcePath,t,n.outputRoot);if(await g0(n.sourcePath,a,r()))return ef.info("conversion output already exists",{sourcePath:n.sourcePath,outputPath:a}),(_=n.convertedAssetCache)==null||_.set({cacheVersion:2,converterId:e,converterCacheKey:e,sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:a,outputExt:t,warnings:["Using existing conversion output."],createdAt:Date.now()}),{effectivePath:a,effectiveExt:t,warnings:["Using existing conversion output."]};let o=s$(n.sourcePath,t);if(o!==a&&await g0(n.sourcePath,o,r()))return ef.info("legacy conversion output already exists",{sourcePath:n.sourcePath,outputPath:o}),(v=n.convertedAssetCache)==null||v.set({cacheVersion:2,converterId:e,converterCacheKey:e,sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:o,outputExt:t,warnings:["Using existing conversion output."],createdAt:Date.now()}),{effectivePath:o,effectiveExt:t,warnings:["Using existing conversion output."]};let l=await QEe(n,t,e,r());if(l)return ef.info("relocated conversion cache hit",{sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,previousSourcePath:l.sourcePath,outputPath:l.outputPath}),(E=n.convertedAssetCache)==null||E.set({cacheVersion:2,converterId:l.converterId,converterCacheKey:l.converterCacheKey,sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:l.outputPath,outputExt:t,warnings:[...l.warnings,"Using relocated conversion output."],createdAt:Date.now()}),{effectivePath:l.outputPath,effectiveExt:t,warnings:[...l.warnings,"Using relocated conversion output."]};let c=await qEe(n.conversionManager);if(!c)throw new Error(`Format .${n.sourceExt} requires conversion support, but no conversion manager is available.`);if(!c.canConvert(n.sourceExt))throw new Od(e,n.sourceExt);let f=await c.getConverterCacheIdentity(n.sourceExt);n.outputRoot&&await Wn(n.outputRoot,{recursive:!0});let d=await c.convert({sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:a});return(S=n.convertedAssetCache)==null||S.set({cacheVersion:2,converterId:e,converterCacheKey:(T=f==null?void 0:f.cacheKey)!=null?T:e,sourcePath:n.sourcePath,sourceExt:n.sourceExt,targetExt:t,outputPath:d.outputPath,outputExt:d.outputExt,warnings:d.warnings,createdAt:Date.now()}),ef.info("conversion route done",{sourcePath:n.sourcePath,outputPath:d.outputPath,warningCount:d.warnings.length}),{effectivePath:d.outputPath,effectiveExt:d.outputExt,warnings:d.warnings}}var ef,l$=y(()=>{"use strict";ty();wn();fr();mg();ef=qi("conversion-service")});var c$={};Be(c$,{prepareModelInput:()=>pg});function JEe(n,e){var t;return!!((t=n.preferConversionExts)!=null&&t.includes(e))}async function pg(n){var a,o;let e=na((a=n.path.split(".").pop())!=null?a:""),t=Cg(e);if(Nd.info("prepare model input",{path:n.path,sourceExt:e}),!t||!t.enabled)throw Nd.warn("unsupported format",{sourceExt:e,path:n.path}),Pg(e)?new Error("SPLAT preview is disabled in packaged builds. Local-only .splat support is planned; .spz and .sog remain unavailable until their decoders can be bundled locally."):new Error(`Unsupported format: .${e}`);let i=JEe(n,e);if(t.strategy==="convert"||i&&!!t.converterId){if(Rr())throw Nd.warn("conversion unavailable on mobile",{sourceExt:e,path:n.path}),new oh(e);if(!n.absolutePath)throw Nd.error("filesystem path missing for conversion",{sourceExt:e,path:n.path}),new Error(`Format .${e} requires a local filesystem path for conversion, but none was resolved for '${n.path}'.`);let l=t.strategy==="convert"?t:{...t,strategy:"convert",outputFormat:(o=t.outputFormat)!=null?o:"glb"};if(!l.converterId)throw Nd.error("preferred conversion route missing converter id",{sourceExt:e,path:n.path}),new Error(`Format .${e} is configured to prefer conversion, but no converter id is defined.`);i&&t.strategy==="direct"&&Nd.info("preferred conversion route",{sourceExt:e,path:n.path,converterId:l.converterId});let{convertForPreview:c}=await Promise.resolve().then(()=>(l$(),o$)),f=await c({sourcePath:n.absolutePath,sourceExt:e,capability:l,conversionManager:n.conversionManager,convertedAssetCache:n.convertedAssetCache,outputRoot:n.conversionOutputRoot});return Nd.info("conversion completed",{sourceExt:e,outputExt:f.effectiveExt,outputPath:f.effectivePath,warningCount:f.warnings.length}),{sourcePath:n.path,sourceExt:e,strategy:"convert",effectivePath:f.effectivePath,effectiveExt:f.effectiveExt,warnings:f.warnings}}let s=t$({path:n.path,sourceExt:e});return Nd.debug("direct route",{sourceExt:e,path:n.path,warningCount:s.warnings.length}),{sourcePath:n.path,sourceExt:e,strategy:t.strategy,effectivePath:s.effectivePath,effectiveExt:s.effectiveExt,warnings:s.warnings}}var Nd,_0=y(()=>{"use strict";Oa();i$();mg();wn();ga();Nd=qi("model-pipeline")});function AE(n){return{path:n.effectivePath,ext:n.effectiveExt,strategy:n.strategy,sourcePath:n.sourcePath,sourceExt:n.sourceExt,warnings:n.warnings}}var QF=y(()=>{"use strict"});function lh(n,e){var r;let i=e.auxiliaryFileFolder.trim()||aU(n,eSe);return(r=sc(n,i))!=null?r:void 0}var eSe,v0=y(()=>{"use strict";ps();eSe="ai-model-workbench/converted-assets"});function ch(n){let e=n.createDiv({cls:"ai3d-loading-overlay"}),t=e.createDiv({cls:"ai3d-loading-skeleton"});t.createDiv({cls:"ai3d-loading-skeleton-canvas"});let i=t.createDiv({cls:"ai3d-loading-skeleton-meta"});i.createDiv({cls:"ai3d-loading-skeleton-line"}),i.createDiv({cls:"ai3d-loading-skeleton-line is-short"}),e.createDiv({cls:"ai3d-loading-spinner"});let r=e.createDiv({cls:"ai3d-loading-text"}),s="loading.default",a="",o=()=>{r.textContent=s?X(s):a};o();let c=e.createDiv({cls:"ai3d-loading-bar-track"}).createDiv({cls:"ai3d-loading-bar-fill is-indeterminate"}),f=!1,d=S3(()=>{!f&&s&&o()});return{el:e,setPhase(u){s=null,a=u,f||o()},setPhaseKey(u){s=u,f||o()},setProgress(u){f||(u<0?(c.className="ai3d-loading-bar-fill is-indeterminate",c.style.removeProperty("--bar-width")):(c.className="ai3d-loading-bar-fill",c.style.setProperty("--bar-width",`${Math.min(100,Math.max(0,u))}%`)))},hide(){f||(f=!0,d(),e.classList.add("is-hiding"),window.setTimeout(()=>e.remove(),300))}}}var E0=y(()=>{"use strict";En()});var $F={};Be($F,{renderModelLoadFailure:()=>xE,renderModelPerformanceFeedback:()=>RE});function xE(n,e){let t=n.createDiv({cls:"ai3d-inline-empty ai3d-load-feedback-shell"});Rr()&&t.classList.add("is-mobile");let i=t.createDiv({cls:`ai3d-load-feedback is-${e.level}`});return i.createDiv({cls:"ai3d-load-feedback-title",text:e.title}),i.createDiv({cls:"ai3d-load-feedback-message",text:e.message}),i.createDiv({cls:"ai3d-load-feedback-hint",text:e.hint}),t}function RE(n,e){var o,l,c,f,d,u,h;if((!e.performanceTier||e.performanceTier==="light")&&!((o=e.resourceWarnings)!=null&&o.length))return null;let t=(l=e.performanceTier)!=null?l:"light",i=((c=e.splatCount)!=null?c:e.triangleCount).toLocaleString(),r=e.splatCount!==void 0?"splats":"triangles",s=n.createDiv({cls:`ai3d-performance-feedback is-${t}`});s.createDiv({cls:"ai3d-performance-feedback-tier",text:(f=e.resourceWarnings)!=null&&f.length?"assets":(d=e.performanceTier)!=null?d:"light"}),s.createDiv({cls:"ai3d-performance-feedback-meta",text:(u=e.resourceWarnings)!=null&&u.length?e.resourceWarnings[0]:`${i} ${r} \xB7 ${e.materialCount.toLocaleString()} materials`});let a=[...(h=e.resourceWarnings)!=null?h:[],...e.performanceHint?[e.performanceHint]:[]];return a.length>0&&(s.title=a.join(` `)),window.setTimeout(()=>s.classList.add("is-subtle"),4200),s}var bE=y(()=>{"use strict";ga()});function tf(n){var t;let e=(t=(n!=null?n:"").split(".").pop())==null?void 0:t.trim().toLowerCase();return tSe.has(e)?e:"glb"}function fh(n,e,t){return typeof n=="string"&&iSe.has(n)?n:e===t?"direct":"convert"}var tSe,iSe,S0=y(()=>{"use strict";tSe=new Set(["glb","gltf","stl","obj","splat","ply","fbx","step","stp","iges","igs","brep","sldprt","3mf","dae"]),iSe=new Set(["direct","convert"])});function gg(n,e,t){p$(n,{label:Bi(u$[e],{model:Gs(t)||X("workbench.modelTitle")}),shortcutKeys:rSe})}function h$(n){p$(n,{label:X(u$.grid),shortcutKeys:nSe})}function _g(n,e){n.addEventListener("keydown",t=>{var s,a,o,l,c;let i=e();if(!i)return;let r=t.key.toLowerCase();r==="r"?((s=i.resetView)==null||s.call(i),t.preventDefault()):r==="w"?((a=i.toggleWireframe)==null||a.call(i),t.preventDefault()):r==="g"?((o=i.toggleOrientationGizmo)==null||o.call(i),t.preventDefault()):r==="b"?((l=i.toggleBoundingBox)==null||l.call(i),t.preventDefault()):r===" "?((c=i.toggleAnimation)==null||c.call(i),t.preventDefault()):r==="m"?(vn(i)&&i.toggleMeasurement(),t.preventDefault()):r==="escape"&&vn(i)&&HA(i)&&t.preventDefault()})}function m$(n,e){n.addEventListener("keydown",t=>{var s,a;let i=e();if(!i)return;let r=t.key.toLowerCase();r==="r"?((s=i.resetView)==null||s.call(i),t.preventDefault()):r==="w"&&((a=i.toggleWireframe)==null||a.call(i),t.preventDefault())})}function p$(n,e){cSe(n),n.setAttribute("role","application"),aSe(n,e.label),n.setAttribute("aria-keyshortcuts",e.shortcutKeys.join(" ")),lSe(n),n.dataset.testid="ai3d-preview-canvas"}function aSe(n,e){let t=n.dataset.ai3dLabelId,i=t?n.ownerDocument.getElementById(t):null,r=i instanceof HTMLElement?i:oSe(n);if(!r){n.removeAttribute("aria-label"),n.removeAttribute("aria-labelledby"),delete n.dataset.ai3dLabelId;return}r.setText(e),n.dataset.ai3dLabelId=r.id,n.setAttribute("aria-labelledby",r.id),n.removeAttribute("aria-label")}function oSe(n){let e=n.parentElement;if(!e)return null;let t=e.createSpan({cls:"ai3d-visually-hidden"});return t.id=`ai3d-preview-canvas-label-${++sSe}`,t}function lSe(n){n.removeAttribute("title"),n.removeAttribute("data-tooltip"),n.removeAttribute("aria-description")}function cSe(n){if(d$(n),f$.has(n)||typeof MutationObserver=="undefined")return;f$.add(n),new MutationObserver(()=>d$(n)).observe(n,{attributes:!0,attributeFilter:["tabindex"]})}function d$(n){n.tabIndex!==0&&(n.tabIndex=0),n.getAttribute("tabindex")!=="0"&&n.setAttribute("tabindex","0")}var rSe,nSe,f$,sSe,u$,T0=y(()=>{"use strict";En();W_();ah();ps();rSe=["R","W","G","B","M","Space"],nSe=["R","W"],f$=new WeakSet,sSe=0,u$={inline:"previewCanvas.inlineLabel",grid:"previewCanvas.gridLabel","live-preview":"previewCanvas.liveLabel","direct-view":"previewCanvas.directLabel"}});function g$(n){let{contentEl:e,filePath:t,mobile:i,getPreview:r}=n,s=e.createDiv({cls:"ai3d-workspace"}),a=s.createDiv({cls:"ai3d-workspace-track-top"}),o=a.createDiv({cls:"ai3d-workspace-main"}),l=a.createDiv({cls:"ai3d-resize-handle ai3d-resize-handle-h"}),c=a.createDiv({cls:"ai3d-workspace-sidebar"}),f=createDiv(),d=f.createDiv({cls:"ai3d-preview-host"}),u=f.createEl("canvas");u.className="ai3d-canvas-full",gg(u,"direct-view",t),_g(u,r),d.appendChild(u);let h=f.createDiv();h.className="ai3d-annot-mode-overlay is-hidden",d.appendChild(h),o.appendChild(d);let m=c.createDiv({cls:"ai3d-sidebar-content"}),g=m.createDiv({cls:"ai3d-direct-workbench-panel is-hidden"}),p=m.createDiv({cls:"ai3d-sidebar-body"}),_=s.createDiv({cls:"ai3d-resize-handle ai3d-resize-handle-v"});return i&&o.createDiv({cls:"ai3d-mobile-mode-hint ai3d-mobile-mode-hint--inline",text:X("directView.mobileHint")}),{workspace:s,topTrack:a,mainArea:o,hHandle:l,host:d,canvas:u,modeOverlay:h,sidebarContent:p,vHandle:_,workbenchPanel:g}}var _$=y(()=>{"use strict";En();T0()});function A0(n){return Math.round(n!=null?n:0).toLocaleString()}function fSe(n){return[n.boundingSize.x,n.boundingSize.y,n.boundingSize.z].map(e=>e.toFixed(2)).join(" x ")}function dSe(n){return n==="three"?"Three.js":"Babylon.js"}function v$(n){var f,d;let{panel:e,summary:t,route:i,registeredPartCount:r}=n;e.empty(),e.removeClass("is-hidden"),e.dataset.ai3dBackend=i.backend,e.dataset.ai3dRouteReason=i.reason;let s=e.createDiv({cls:"ai3d-direct-workbench-overview"}),a=s.createDiv({cls:"ai3d-direct-workbench-status"}),o=a.createDiv({cls:"ai3d-direct-workbench-line"});o.createSpan({cls:"ai3d-direct-workbench-label",text:X("directWorkbench.backendLabel")}),o.createSpan({cls:"ai3d-direct-workbench-value",text:dSe(i.backend)});let l=a.createDiv({cls:"ai3d-direct-workbench-line ai3d-direct-workbench-route"});l.createSpan({cls:"ai3d-direct-workbench-label",text:X("directWorkbench.routeLabel")}),l.createSpan({cls:"ai3d-direct-workbench-value",text:i.reason});let c=s.createDiv({cls:"ai3d-direct-workbench-metrics"});vg(c,X("workbench.meshesLabel"),A0(t.meshCount)),vg(c,X("directWorkbench.partCandidatesLabel"),A0(r)),vg(c,t.splatCount!==void 0?X("workbench.splatsLabel"):X("workbench.trianglesLabel"),A0((f=t.splatCount)!=null?f:t.triangleCount)),vg(c,X("workbench.materialsLabel"),A0(t.materialCount)),vg(c,X("workbench.boundingSizeLabel"),fSe(t)),vg(c,X("directWorkbench.performanceLabel"),(d=t.performanceTier)!=null?d:"light")}function vg(n,e,t){let i=n.createDiv({cls:"ai3d-direct-workbench-metric"});i.createSpan({cls:"ai3d-direct-workbench-label",text:e}),i.createSpan({cls:"ai3d-direct-workbench-value",text:t})}var E$=y(()=>{"use strict";En()});function uSe(n,e){return n.experimentalThreeWorkbench&&n.useThreeRenderer&&e.strategy==="direct"&&x0.has(e.ext)&&x0.has(e.sourceExt)}function hSe(n){return S$.has(n.ext)?n.strategy==="direct"?S$.has(n.sourceExt):n.strategy==="convert"&&x0.has(n.ext):!1}function mSe(n,e){return n.useThreeForConvertedDirectView&&e.strategy==="convert"&&x0.has(e.ext)}function T$(n,e){let t=uSe(n,e),i=hSe(e),r=mSe(n,e);return{ext:e.ext,annotationMode:"edit",allowEditModeOnThree:!0,allowWorkbenchFeaturesOnThree:t,requireWorkbenchFeatures:t||!i,rendererRollout:r?"three-direct-glb":n.previewRendererRollout,useThreeRenderer:r?!0:n.useThreeRenderer}}var S$,x0,A$=y(()=>{"use strict";S$=new Set(["glb","gltf","stl","ply","obj"]),x0=new Set(["glb","gltf"])});function Eg(n){return{renderQuality:n.renderQuality,renderScale:n.renderScale}}function ASe(n,e){return!Number.isFinite(e!=null?e:Number.NaN)||(e!=null?e:0)<=0?Eg(n):(e!=null?e:0)>=gSe?{renderQuality:n.renderQuality==="high"?"medium":n.renderQuality,renderScale:Math.min(n.renderScale,JF)}:(e!=null?e:0)>=pSe?{renderQuality:n.renderQuality==="low"?"low":"medium",renderScale:Math.min(n.renderScale,b$)}:Eg(n)}function t1(n){var e;return(e=n.splatCount)!=null?e:n.triangleCount}function xSe(n){return n.splatCount!==void 0?n.splatCount>=R$:t1(n)>=vSe}function RSe(n){return n.splatCount!==void 0?n.splatCount>=SSe:t1(n)>=ESe}function bSe(n){return n.splatCount!==void 0?n.splatCount>=R$:t1(n)>=_Se}function M$(n,e){return e.performanceTier==="extreme"?RSe(e)?{renderQuality:n.renderQuality==="low"?"low":"medium",renderScale:Math.min(n.renderScale,JF)}:Eg(n):e.performanceTier==="heavy"?xSe(e)?{renderQuality:n.renderQuality==="low"?"low":"medium",renderScale:Math.min(n.renderScale,JF)}:Eg(n):e.performanceTier==="medium"&&bSe(e)?{renderQuality:n.renderQuality,renderScale:Math.min(n.renderScale,b$)}:Eg(n)}function Sg(n){return n.startsWith("/")||n.startsWith("\\")||/^[A-Za-z]:[\\/]/.test(n)}function R0(n){var e;return(e=n.split(/[?#]/,1)[0])!=null?e:n}function y$(n){try{return decodeURIComponent(n)}catch(e){return n}}function e1(n){let e=y$(n).replace(/\\/g,"/"),t=[];for(let i of e.split("/"))if(!(!i||i===".")){if(i===".."){t.pop();continue}t.push(i)}return t.join("/")}function I$(n,e){return e1(n?`${n}/${R0(e)}`:R0(e))}function C$(n){let e=n.replace(/\\/g,"/").replace(/\/+$/,""),t=e.lastIndexOf("/");return t>0?e.slice(0,t):""}function MSe(n){return!n||n.startsWith("data:")?!0:TSe.test(n)&&!Sg(n)}function ySe(n,e){return Sg(n)?e1(R0(e)):I$(C$(n),e)}async function ISe(n,e){let t=await CSe(n,e);return t===null?null:e.toLowerCase().split(/[?#]/,1)[0].endsWith(".gltf")?LSe(n,e,t):t}async function CSe(n,e){if(Sg(e))try{let{stat:i}=await Promise.resolve().then(()=>(fr(),mA));return(await i(e)).size}catch(i){return null}let t=n.vault.getAbstractFileByPath(e);return P$(t)?t.stat.size:null}async function PSe(n,e){if(Sg(e))try{let{readFile:r}=await Promise.resolve().then(()=>(fr(),mA));return new TextDecoder().decode(await r(e))}catch(r){return null}let t=n.vault.getAbstractFileByPath(e),i=n.vault;if(!(t instanceof x$.TFile)||typeof i.read!="function")return null;try{return await i.read(t)}catch(r){return null}}async function DSe(n,e,t){if(Sg(e))try{let{pathJoin:a,pathNormalize:o,stat:l}=await Promise.resolve().then(()=>(fr(),mA)),c=R0(y$(t)),f=o(e.replace(/[\\/][^\\/]*$/,"")),d=Sg(c)?o(c):o(a(f,c));return(await l(d)).size}catch(a){return null}let i=C$(e),r=I$(i,t),s=n.vault.getAbstractFileByPath(r);return P$(s)?s.stat.size:null}async function LSe(n,e,t){var l,c;let i=await PSe(n,e);if(!i)return t;let r;try{r=JSON.parse(i)}catch(f){return t}let s=t,a=new Set,o=async(f,d)=>{var p;let u=f==null?void 0:f.uri;if(!u||MSe(u))return;let h=ySe(e,u);if(!h||a.has(h))return;a.add(h);let m=await DSe(n,e,u);if(m!==null&&Number.isFinite(m)&&m>0){s+=m;return}let g=(p=f==null?void 0:f.byteLength)!=null?p:d;Number.isFinite(g)&&(g!=null?g:0)>0&&(s+=g!=null?g:0)};for(let f of(l=r.buffers)!=null?l:[])await o(f,f.byteLength);for(let f of(c=r.images)!=null?c:[])await o(f);return s}function P$(n){let e=n;return!!e&&typeof e=="object"&&!!e.stat&&typeof e.stat.size=="number"}async function Tg(n,e,t){return ASe(t,await ISe(n,e))}var x$,pSe,gSe,_Se,vSe,ESe,R$,SSe,b$,JF,TSe,b0=y(()=>{"use strict";x$=require("obsidian"),pSe=64*1024*1024,gSe=192*1024*1024,_Se=18e4,vSe=45e4,ESe=12e5,R$=65e4,SSe=15e5,b$=1.25,JF=1,TSe=/^[a-z][a-z0-9+.-]*:/i});function NSe(n,e,t){let i=new Promise((r,s)=>{let a=window.setTimeout(()=>{s(new i1(`Conversion did not complete within ${e}ms`))},e);n.then(()=>window.clearTimeout(a)).catch(()=>window.clearTimeout(a))});return Promise.race([n,i])}var ME,OSe,i1,M0,D$=y(()=>{"use strict";Oa();wn();ME=qi("conversion-manager"),OSe=3e5,i1=class extends Error{constructor(e="Conversion timed out"){super(e),this.name="ConversionTimeoutError"}};M0=class{constructor(){this.converters=new Map;this.pending=new Map}getConverter(e){return this.converters.get(na(e))}registerConverter(e){ME.info("register converter",{converterId:e.id,sourceExts:[...e.sourceExts]});for(let t of e.sourceExts)this.converters.set(na(t),e)}canConvert(e){let t=na(e),i=this.converters.has(t);return ME.debug("can convert",{ext:t,ok:i}),i}async getConverterCacheIdentity(e){let t=this.getConverter(e);if(t)return{converterId:t.id,cacheKey:await t.getCacheKey()}}async convert(e){var o;let t=na(e.sourceExt),i=this.getConverter(t);if(!i)throw ME.error("converter missing",{ext:t,targetExt:e.targetExt}),new Error(`No converter registered for .${t}`);let r=`${e.sourcePath}::${t}::${e.targetExt}`,s=this.pending.get(r);if(s)return ME.info("joining in-flight conversion",{key:r}),s;ME.info("dispatch conversion",{converterId:i.id,ext:t,targetExt:e.targetExt});let a=NSe(i.convert({...e,sourceExt:t}),(o=e.timeoutMs)!=null?o:OSe,{converterId:i.id,ext:t,targetExt:e.targetExt});this.pending.set(r,a);try{return await a}finally{this.pending.delete(r)}}}});var u1={};Be(u1,{describeConverterCommandSource:()=>l1,inspectAllConverterCommands:()=>JSe,inspectConverterCommand:()=>d1,listConverterCommandSpecs:()=>$Se,resolveConverterCommand:()=>eTe,resolveConverterInvocation:()=>Fn});function s1(...n){let e=(He==null?void 0:He.platform)==="darwin"?["/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin"]:["/usr/local/bin","/opt/homebrew/bin","/opt/local/bin","/usr/bin"];return Array.from(new Set(e.flatMap(t=>n.map(i=>`${t}/${i}`))))}function BSe(){var r,s,a;if((He==null?void 0:He.platform)==="darwin")return["/Applications/FreeCAD.app/Contents/MacOS/FreeCADCmd","/Applications/FreeCAD.app/Contents/Resources/bin/FreeCADCmd","/Applications/FreeCAD.app/Contents/Resources/bin/freecadcmd",...s1("FreeCADCmd","freecadcmd")];if((He==null?void 0:He.platform)!=="win32")return["/usr/local/bin/freecadcmd","/opt/homebrew/bin/freecadcmd","/opt/local/bin/freecadcmd","/snap/freecad/current/usr/bin/freecadcmd","/usr/bin/freecadcmd"];let n=[],e=(r=He==null?void 0:He.env)==null?void 0:r.LOCALAPPDATA,t=(s=He==null?void 0:He.env)==null?void 0:s.ProgramFiles,i=(a=He==null?void 0:He.env)==null?void 0:a["ProgramFiles(x86)"];if(e&&n.push(Ji(e,"Programs","FreeCAD","bin","FreeCADCmd.exe")),t&&n.push(Ji(t,"FreeCAD","bin","FreeCADCmd.exe")),e)for(let o of["1.2","1.1","1.0","0.22","0.21","0.20"])n.push(`${e}/Programs/FreeCAD ${o}/bin/FreeCADCmd.exe`);if(t)for(let o of["1.2","1.1","1.0","0.22","0.21","0.20"])n.push(`${t}/FreeCAD ${o}/bin/FreeCADCmd.exe`);return i&&n.push(`${i}/FreeCAD/bin/FreeCADCmd.exe`),n}function USe(n){var a,o,l,c;if((He==null?void 0:He.platform)!=="win32")return[];let e=(a=He==null?void 0:He.env)==null?void 0:a.APPDATA,t=(o=He==null?void 0:He.env)==null?void 0:o.LOCALAPPDATA,i=(l=He==null?void 0:He.env)==null?void 0:l.npm_config_prefix,r=(c=He==null?void 0:He.env)==null?void 0:c.USERPROFILE,s=[i,e?Ji(e,"npm"):void 0,t?Ji(t,"npm"):void 0,r?Ji(r,"AppData","Roaming","npm"):void 0].filter(f=>!!f);return Array.from(new Set(s.map(f=>Ji(f,n))))}function VSe(...n){var s,a,o;if((He==null?void 0:He.platform)!=="win32")return[];let e=(s=He==null?void 0:He.env)==null?void 0:s.ProgramFiles,t=(a=He==null?void 0:He.env)==null?void 0:a["ProgramFiles(x86)"],i=(o=He==null?void 0:He.env)==null?void 0:o.LOCALAPPDATA,r=[e,t,i?Ji(i,"Programs"):void 0].filter(l=>!!l);return Array.from(new Set(r.flatMap(l=>n.map(c=>Ji(l,c)))))}async function f1(n){try{return await hs(n,(He==null?void 0:He.platform)==="win32"?ms:bC),!0}catch(e){return!1}}function r1(n){let e=n==null?void 0:n.trim();if(e)return e}function O$(n){return GSe.test(n)?{ok:!1,reason:"Command contains unsafe shell metacharacters."}:{ok:!0}}function kSe(n,e){for(let t of[n,...e]){let i=O$(t);if(!i.ok)return i}return{ok:!0}}async function WSe(n){try{return(await hu(n)).isFile()}catch(e){return!1}}function zSe(n){let e=[],t="",i=null;for(let r=0;rr.trim().toLowerCase()).filter(Boolean);return e!=null&&e.length?e:wSe}async function KSe(n){var r;let e=(r=He==null?void 0:He.env)==null?void 0:r.PATH;if(!e)return;let t=e.split(MC).map(s=>s.trim()).filter(Boolean),i=(He==null?void 0:He.platform)==="win32"?YSe(n):[""];for(let s of t)for(let a of i){let o=Ji(s,a?`${n}${a}`:n);if(await f1(o))return o}}function a1(n,e,t=15e3){let i=O$(n);return i.ok?new Promise((r,s)=>{pa(n,e,{timeout:t,windowsHide:!0,maxBuffer:4*1024*1024},(a,o,l)=>{if(a){s(new Error((l||o||a.message).toString().trim()||a.message));return}r({stdout:o!=null?o:"",stderr:l!=null?l:""})})}):Promise.reject(new Error(`Refusing to execute converter command: ${i.reason}`))}function o1(n){let t=(n instanceof Error?n.message:String(n)).replace(/\s+/g," ").trim();return t.length>180?`${t.slice(0,177)}...`:t}async function n1(n,e,t,i){let r="";for(let s of t)try{return await a1(n,[...e,...s]),{ok:!0,detail:""}}catch(a){let o=o1(a);if(i.test(o))return{ok:!0,detail:""};r=o}return{ok:!1,detail:r||"Command probe failed."}}async function jSe(n){var i;if(!n.available)return[];let e=(i=n.resolvedPath)!=null?i:n.executable,t=[...n.args];if(n.id==="freecad"){let r=[];for(let s of FSe)try{await a1(e,[...t,"-c",s.probe]),r.push({kind:"cad-python",label:s.label,ok:!0,detail:""})}catch(a){r.push({kind:"cad-python",label:s.label,ok:!1,detail:o1(a)})}return r}if(n.id==="assimp")try{return await a1(e,[...t,"-c","import trimesh, numpy, networkx, collada; print('ok')"]),[{kind:"mesh-python",ok:!0,detail:""}]}catch(r){return[{kind:"mesh-python",ok:!1,detail:o1(r)}]}if(n.id==="freecadcmd"){let r=await n1(e,t,[["--version"],["--help"]],/freecad|usage|help|version/i);return[{kind:"freecadcmd-cli",ok:r.ok,detail:r.detail}]}if(n.id==="obj2gltf"){let r=await n1(e,t,[["--version"],["--help"]],/obj2gltf|usage|help|version/i);return[{kind:"obj2gltf-cli",ok:r.ok,detail:r.detail}]}if(n.id==="fbx2gltf"){let r=await n1(e,t,[["--version"],["--help"]],/fbx2gltf|usage|help|version/i);return[{kind:"fbx2gltf-cli",ok:r.ok,detail:r.detail}]}return[]}function ZSe(n){let e=c1.find(t=>t.id===n);if(!e)throw new Error(`Unknown converter command id: ${n}`);return e}function qSe(n){var s,a,o,l;let e=(a=(s=He==null?void 0:He.env)==null?void 0:s.ProgramFiles)==null?void 0:a.toLowerCase(),t=(l=(o=He==null?void 0:He.env)==null?void 0:o["ProgramFiles(x86)"])==null?void 0:l.toLowerCase(),i=[],r=[];for(let c of n.knownCandidates){let f=c.toLowerCase(),d=(He==null?void 0:He.platform)==="win32"&&((e?f.startsWith(e):!1)||(t?f.startsWith(t):!1)),u=(He==null?void 0:He.platform)!=="win32"&&(c.startsWith("/usr/bin/")||c.startsWith("/snap/freecad/current/usr/bin/"));d||u?r.push(c):i.push(c)}return{userCandidates:i,systemCandidates:r}}async function L$(n,e,t){for(let i of e)if(await f1(i))return{id:n.id,label:n.label,envVar:n.envVar,settingsKey:n.settingsKey,command:i,executable:i,args:[],resolvedPath:i,available:!0,source:"candidate",detail:t,checkedCandidates:[i]}}function QSe(n,e){let t=[];return n.length&&t.push(`Checked common user locations: ${n.join("; ")}`),e.length&&t.push(`Checked system fallback locations: ${e.join("; ")}`),t.join(". ")}async function y0(n,e,t,i){let r=HSe(e),s=kSe(r.executable,r.args);if(!s.ok)return{id:n.id,label:n.label,envVar:n.envVar,settingsKey:n.settingsKey,configuredCommand:i,command:e,executable:r.executable,args:r.args,resolvedPath:void 0,available:!1,source:t,detail:s.reason,checkedCandidates:[r.executable]};if(XSe(r.executable)){let[o,l]=await Promise.all([f1(r.executable),WSe(r.executable)]),c=o&&l;return{id:n.id,label:n.label,envVar:n.envVar,settingsKey:n.settingsKey,configuredCommand:i,command:e,executable:r.executable,args:r.args,resolvedPath:c?r.executable:void 0,available:c,source:t,detail:c?`Using ${l1(t)} path.`:"Configured path was not found or is not executable.",checkedCandidates:[r.executable]}}let a=await KSe(r.executable);return{id:n.id,label:n.label,envVar:n.envVar,settingsKey:n.settingsKey,configuredCommand:i,command:e,executable:r.executable,args:r.args,resolvedPath:a,available:!!a,source:t,detail:a?`Resolved from ${l1(t)} via PATH lookup.`:"Command name was not found on PATH.",checkedCandidates:[r.executable]}}function $Se(){return c1}function l1(n){switch(n){case"settings":return"plugin settings";case"env":return"environment variable";case"candidate":return"known install location";case"path":return"PATH fallback"}}async function d1(n,e){var u,h,m;let t=ZSe(n),{userCandidates:i,systemCandidates:r}=qSe(t),s=r1(e);if(s)return y0(t,s,"settings",s);let a=r1((u=He==null?void 0:He.env)==null?void 0:u[t.envVar]);if(a)return y0(t,a,"env");for(let g of(h=t.envVarAliases)!=null?h:[]){let p=r1((m=He==null?void 0:He.env)==null?void 0:m[g]);if(p)return y0(t,p,"env")}let o=await L$(t,i,"Detected at a common user-managed install location.");if(o)return o;let l=[];for(let g of t.fallbackCommands){let p=await y0(t,g,"path");if(l.push(p),p.available)return p}let c=await L$(t,r,"Detected at a system fallback install location.");if(c)return c;let f=l.flatMap(g=>g.checkedCandidates),d=QSe(i,r);return{...l[0],detail:d?`Command name was not found on PATH. ${d}`:"Command name was not found on PATH.",checkedCandidates:[...i,...f,...r]}}async function JSe(n){let e=await Promise.all(c1.map(t=>d1(t.id,n[t.settingsKey])));return Promise.all(e.map(async t=>({...t,dependencyChecks:await jSe(t)})))}async function eTe(n,e){return(await Fn(n,e)).command}async function Fn(n,e){var i;let t=await d1(n,e);if(!t.available&&t.detail==="Command contains unsafe shell metacharacters.")throw new Error(`Refusing to resolve converter command '${n}': ${t.detail}`);return{command:(i=t.resolvedPath)!=null?i:t.executable,args:[...t.args]}}var He,wSe,FSe,c1,GSe,wd=y(()=>{"use strict";fr();fr();fr();He=Sm(),wSe=[".exe",".cmd",".bat",".com"],FSe=[{label:"CadQuery import",probe:"import cadquery; print('ok')"},{label:"trimesh import",probe:"import trimesh; print('ok')"},{label:"OCP STEP readers",probe:["from OCP.STEPCAFControl import STEPCAFControl_Reader","from OCP.STEPControl import STEPControl_Reader","from OCP.BRepMesh import BRepMesh_IncrementalMesh","print('ok')"].join("; ")},{label:"OCCT GLB writer",probe:"from OCP.RWGltf import RWGltf_CafWriter, RWGltf_WriterTrsfFormat; print('ok')"}];c1=[{id:"freecad",label:"Python (CadQuery/OCCT)",settingsKey:"freecadCommand",envVar:"AI3D_FREECAD_CMD",fallbackCommands:(He==null?void 0:He.platform)==="win32"?["py","python"]:["python3","python"],knownCandidates:(He==null?void 0:He.platform)==="win32"?[]:["/usr/local/bin/python3","/opt/homebrew/bin/python3","/opt/local/bin/python3","/usr/bin/python3"]},{id:"obj2gltf",label:"obj2gltf",settingsKey:"obj2gltfCommand",envVar:"AI3D_OBJ2GLTF_CMD",fallbackCommands:(He==null?void 0:He.platform)==="win32"?["obj2gltf.cmd"]:["obj2gltf"],knownCandidates:(He==null?void 0:He.platform)==="win32"?USe("obj2gltf.cmd"):s1("obj2gltf")},{id:"fbx2gltf",label:"FBX2glTF",settingsKey:"fbx2gltfCommand",envVar:"AI3D_FBX2GLTF_CMD",fallbackCommands:(He==null?void 0:He.platform)==="win32"?["FBX2glTF.exe"]:["FBX2glTF","fbx2gltf"],knownCandidates:(He==null?void 0:He.platform)==="win32"?VSe(Ji("FBX2glTF","FBX2glTF-windows-x64.exe"),Ji("FBX2glTF","FBX2glTF.exe")):s1("FBX2glTF","fbx2gltf")},{id:"assimp",label:"Python (trimesh)",settingsKey:"assimpCommand",envVar:"AI3D_ASSIMP_CMD",fallbackCommands:(He==null?void 0:He.platform)==="win32"?["py","python"]:["python3","python"],knownCandidates:(He==null?void 0:He.platform)==="win32"?[]:["/usr/local/bin/python3","/opt/homebrew/bin/python3","/opt/local/bin/python3","/usr/bin/python3"]},{id:"freecadcmd",label:"FreeCAD (SLDPRT)",settingsKey:"freecadcmdCommand",envVar:"AI3D_FREECADCMD",envVarAliases:["AI3D_FREECMDCMD"],fallbackCommands:(He==null?void 0:He.platform)==="win32"?["FreeCADCmd.exe"]:["freecadcmd","FreeCADCmd"],knownCandidates:BSe()}];GSe=/[;|&<>$`\r\n\t]/});var w$,N$=y(()=>{w$=`import cadquery as cq import trimesh diff --git a/src/render/babylon/scene.ts b/src/render/babylon/scene.ts index 3c630f1..1e5584a 100644 --- a/src/render/babylon/scene.ts +++ b/src/render/babylon/scene.ts @@ -116,6 +116,7 @@ import { setMeasurementCanvasActive, snapMeasurementPointToGeometry, unscaleMeasurementPointToBase, + type MeasurementGeometrySnapInput, type MeasurementSnapEdgeCandidate, type MeasurementSnapVertexCandidate, type MeasurementReading, @@ -312,6 +313,8 @@ export class BabylonModelPreview implements WorkbenchPreview { private measurementMarkerPoints: Vector3[] = []; private measurementTargetNode: BabylonSelectablePartNode | null = null; private measurementTargetMeshes: AbstractMesh[] = []; + private measurementSnapInputCache: MeasurementGeometrySnapInput | null = null; + private measurementSnapInputCacheTargetId: number | null = null; private measurementSnapKind: MeasurementSnapKind | null = null; private readonly measurementObservers = new Set<() => void>(); private pendingPoint: Vector3 | null = null; @@ -1079,6 +1082,7 @@ export class BabylonModelPreview implements WorkbenchPreview { setMeasurementScale(scale: MeasurementScale): void { this.measurementScale = sanitizeMeasurementScale(scale); + this.invalidateMeasurementSnapInputCache(); this.applyMeasurementModelScale(); this.updateMeasurementOverlayPositions(); this.updateMeasurementLabels(); @@ -1167,6 +1171,7 @@ export class BabylonModelPreview implements WorkbenchPreview { this.measurementBaseRootScaling = new Vector3(1, 1, 1); this.measurementBaseBounds = null; this.measurementMarkerPoints = []; + this.invalidateMeasurementSnapInputCache(); } private applyMeasurementModelScale(): void { @@ -1878,6 +1883,7 @@ export class BabylonModelPreview implements WorkbenchPreview { private setMeasurementTargetNode(node: BabylonSelectablePartNode | null, notify = true): void { this.clearMeasurementTargetVisual(false); + this.invalidateMeasurementSnapInputCache(); const target = node && !isBabylonNodeDisposed(node) ? this.findSelectableNode(node) : null; if (!target || isBabylonNodeDisposed(target)) { this.measurementTargetNode = null; @@ -1940,6 +1946,11 @@ export class BabylonModelPreview implements WorkbenchPreview { } } + private invalidateMeasurementSnapInputCache(): void { + this.measurementSnapInputCache = null; + this.measurementSnapInputCacheTargetId = null; + } + private getMeasurementTargetName(): string | null { const target = this.measurementTargetNode; if (!target || isBabylonNodeDisposed(target)) return null; @@ -1977,14 +1988,12 @@ export class BabylonModelPreview implements WorkbenchPreview { return toBabylonVector3(snapped.point); } - private createMeasurementGeometrySnapInput(): { - vertices: MeasurementSnapVertexCandidate[]; - edges: MeasurementSnapEdgeCandidate[]; - targetId?: string; - vertexRadius: number; - } | null { + private createMeasurementGeometrySnapInput(): MeasurementGeometrySnapInput | null { const target = this.measurementTargetNode; if (!this.rootMesh || !target || isBabylonNodeDisposed(target)) return null; + if (this.measurementSnapInputCache && this.measurementSnapInputCacheTargetId === target.uniqueId) { + return this.measurementSnapInputCache; + } const meshes = this.getMeasurementTargetMeshes(target); if (meshes.length === 0) return null; @@ -2013,12 +2022,15 @@ export class BabylonModelPreview implements WorkbenchPreview { if (vertices.length === 0 && edges.length === 0) return null; const bounds = this.getMeasurementTargetBounds(); const size = bounds ? getPreviewBoundsSize(bounds) : { x: 1, y: 1, z: 1 }; - return { + const input = { vertices, edges, targetId, vertexRadius: Math.max(size.x, size.y, size.z, 0.001) * 0.045, }; + this.measurementSnapInputCache = input; + this.measurementSnapInputCacheTargetId = target.uniqueId; + return input; } private getMeasurementTargetMeshes(target = this.measurementTargetNode): AbstractMesh[] { diff --git a/src/render/three/scene.ts b/src/render/three/scene.ts index 8d9a1e8..d033c5c 100644 --- a/src/render/three/scene.ts +++ b/src/render/three/scene.ts @@ -112,6 +112,7 @@ import { setMeasurementCanvasActive, snapMeasurementPointToGeometry, unscaleMeasurementPointToBase, + type MeasurementGeometrySnapInput, type MeasurementSnapEdgeCandidate, type MeasurementSnapVertexCandidate, type MeasurementReading, @@ -299,6 +300,8 @@ export class ThreeModelPreview implements WorkbenchPreview { private measurementMarkerPoints: Vector3[] = []; private measurementTargetObject: Object3D | null = null; private measurementTargetHelper: BoxHelper | null = null; + private measurementSnapInputCache: MeasurementGeometrySnapInput | null = null; + private measurementSnapInputCacheTarget: Object3D | null = null; private measurementSnapKind: MeasurementSnapKind | null = null; private readonly measurementObservers = new Set<() => void>(); private pendingPoint: Vector3 | null = null; @@ -938,6 +941,7 @@ export class ThreeModelPreview implements WorkbenchPreview { setMeasurementScale(scale: MeasurementScale): void { this.measurementScale = sanitizeMeasurementScale(scale); + this.invalidateMeasurementSnapInputCache(); this.applyMeasurementModelScale(); this.updateMeasurementOverlayPositions(); this.updateMeasurementLabels(); @@ -1026,6 +1030,7 @@ export class ThreeModelPreview implements WorkbenchPreview { this.measurementBaseRootScale.set(1, 1, 1); this.measurementBaseBounds = null; this.measurementMarkerPoints = []; + this.invalidateMeasurementSnapInputCache(); } private applyMeasurementModelScale(): void { @@ -2607,6 +2612,7 @@ export class ThreeModelPreview implements WorkbenchPreview { private setMeasurementTargetObject(object: Object3D | null, notify = true): void { this.clearMeasurementTargetHelper(false); + this.invalidateMeasurementSnapInputCache(); const target = object && this.isObjectInLoadedRoot(object) ? object : null; this.measurementTargetObject = target; this.setMeasurementSnapKind(null, false); @@ -2633,6 +2639,11 @@ export class ThreeModelPreview implements WorkbenchPreview { this.measurementTargetHelper.update(); } + private invalidateMeasurementSnapInputCache(): void { + this.measurementSnapInputCache = null; + this.measurementSnapInputCacheTarget = null; + } + private setMeasurementSnapKind(kind: MeasurementSnapKind | null, notify = true): void { if (this.measurementSnapKind === kind) return; this.measurementSnapKind = kind; @@ -2692,14 +2703,12 @@ export class ThreeModelPreview implements WorkbenchPreview { return new Vector3(snapped.point.x, snapped.point.y, snapped.point.z); } - private createMeasurementGeometrySnapInput(): { - vertices: MeasurementSnapVertexCandidate[]; - edges: MeasurementSnapEdgeCandidate[]; - targetId?: string; - vertexRadius: number; - } | null { + private createMeasurementGeometrySnapInput(): MeasurementGeometrySnapInput | null { const target = this.measurementTargetObject; if (!target || !this.isObjectInLoadedRoot(target)) return null; + if (this.measurementSnapInputCache && this.measurementSnapInputCacheTarget === target) { + return this.measurementSnapInputCache; + } const renderables = this.getMeasurementTargetRenderables(); if (renderables.length === 0) return null; const vertices: MeasurementSnapVertexCandidate[] = []; @@ -2726,12 +2735,15 @@ export class ThreeModelPreview implements WorkbenchPreview { if (vertices.length === 0 && edges.length === 0) return null; const bounds = this.getMeasurementTargetBounds(); const size = bounds ? getPreviewBoundsSize(bounds) : { x: 1, y: 1, z: 1 }; - return { + const input = { vertices, edges, targetId, vertexRadius: Math.max(size.x, size.y, size.z, 0.001) * 0.045, }; + this.measurementSnapInputCache = input; + this.measurementSnapInputCacheTarget = target; + return input; } private getMeasurementTargetRenderables(): ThreeRenderableObject[] {