three-live 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +6 -1
  2. package/dist/index.d.ts +65 -2
  3. package/dist/three-author-engine.js +66 -41
  4. package/dist/three-author.cjs +63 -39
  5. package/dist/three-author.d.ts +65 -2
  6. package/dist/three-author.js +63 -39
  7. package/dist/three-convert.cjs +61 -37
  8. package/dist/three-convert.d.ts +65 -2
  9. package/dist/three-convert.js +61 -37
  10. package/dist/three-live-animation.cjs +7 -7
  11. package/dist/three-live-animation.d.ts +65 -2
  12. package/dist/three-live-animation.js +7 -7
  13. package/dist/three-live-animation.min.js +7 -7
  14. package/dist/three-live-cad.cjs +18 -0
  15. package/dist/{three-live-extras.d.ts → three-live-cad.d.ts} +65 -2
  16. package/dist/three-live-cad.js +18 -0
  17. package/dist/three-live-cad.min.js +18 -0
  18. package/dist/three-live-element.cjs +29 -5
  19. package/dist/three-live-element.d.ts +65 -2
  20. package/dist/three-live-element.js +29 -5
  21. package/dist/three-live-full.cjs +159 -56
  22. package/dist/three-live-full.js +159 -56
  23. package/dist/three-live-full.min.js +159 -56
  24. package/dist/three-live-studio.cjs +120 -0
  25. package/dist/three-live-studio.d.ts +509 -0
  26. package/dist/three-live-studio.js +120 -0
  27. package/dist/three-live-studio.min.js +120 -0
  28. package/dist/three-live-viewer.cjs +29 -5
  29. package/dist/three-live-viewer.d.ts +65 -2
  30. package/dist/three-live-viewer.js +29 -5
  31. package/dist/three-live-viewer.min.js +29 -5
  32. package/dist/three-live.cjs +66 -42
  33. package/dist/three-live.js +66 -42
  34. package/dist/three-live.min.js +66 -42
  35. package/dist/three-view.cjs +29 -5
  36. package/dist/three-view.d.ts +65 -2
  37. package/dist/three-view.js +29 -5
  38. package/dist/three-xr.cjs +65 -41
  39. package/dist/three-xr.d.ts +65 -2
  40. package/dist/three-xr.js +65 -41
  41. package/package.json +10 -5
  42. package/dist/three-live-extras.cjs +0 -42
  43. package/dist/three-live-extras.js +0 -42
  44. package/dist/three-live-extras.min.js +0 -42
@@ -48,6 +48,29 @@ import type {
48
48
  } from './xr-live/src/xr-live-element';
49
49
 
50
50
  export * from './three-live/src/core';
51
+ export {
52
+ cadPlugin,
53
+ installCadExtension,
54
+ MAX_BSP_DEPTH,
55
+ MAX_CSG_TRIANGLES,
56
+ MAX_TEXT_GEOMETRY_CHARS,
57
+ type ExtrudeGeometryOptions,
58
+ type TextGeometryOptions,
59
+ } from './three-live/src/plugins/cad';
60
+ export {
61
+ ikPlugin,
62
+ IKSolver,
63
+ quatFromUnitVectors,
64
+ solveFABRIK,
65
+ solveTwoBoneIK,
66
+ type FABRIKSolution,
67
+ type IKQuat,
68
+ type TwoBoneIKSolution,
69
+ } from './three-live/src/plugins/ik';
70
+ export {
71
+ extractNodeInstancing,
72
+ instancingPlugin,
73
+ } from './three-live/src/plugins/instancing';
51
74
  export {
52
75
  getInteractivityVM,
53
76
  interactivityPlugin,
@@ -63,6 +86,30 @@ export {
63
86
  type InteractivityValueSocket,
64
87
  type InteractivityVariableDef,
65
88
  } from './three-live/src/plugins/interactivity';
89
+ export {
90
+ applyMeshoptFilter,
91
+ decodeMeshoptBuffer,
92
+ decodeMeshoptGLB,
93
+ encodeMeshoptBuffer,
94
+ meshoptDecoder,
95
+ meshoptPlugin,
96
+ type MeshoptFilter,
97
+ type MeshoptMode,
98
+ } from './three-live/src/plugins/meshopt';
99
+ export {
100
+ computeOutlineClipOffset,
101
+ evaluateKawaseBloom,
102
+ parseHexRgb,
103
+ postprocessingPlugin,
104
+ resolveViewerBloom,
105
+ } from './three-live/src/plugins/postprocessing';
106
+ export {
107
+ extractMaterialVariants,
108
+ extractPrimitiveVariantMappings,
109
+ selectMaterialVariant,
110
+ variantsPlugin,
111
+ type VariantMapping,
112
+ } from './three-live/src/plugins/variants';
66
113
  export {
67
114
  ThreeLiveElement,
68
115
  type ARLaunchOptions,
@@ -80,7 +127,7 @@ export {
80
127
  type XRProfile,
81
128
  type XRSimulatorRoom,
82
129
  } from './xr-live/src/xr-live-element';
83
- /** Optional spatial plugins (`xr-live/plugins`, `xr-live-plugins.min.js`). */
130
+ /** Optional spatial plugins (`xr-live/spatial`, `xr-live-spatial.min.js`). */
84
131
  export * from './xr-live/src/plugins/index';
85
132
 
86
133
  /**
@@ -119,7 +166,7 @@ export interface ThreeLiveAttributes {
119
166
  'shadow-intensity'?: number | string;
120
167
  /** Radial Gaussian blur falloff of contact shadow (0.0 to 1.0). */
121
168
  'shadow-softness'?: number | string;
122
- /** Tone mapping mode ("neutral", "reinhard", "none"). */
169
+ /** Tone mapping mode ("neutral", "aces", "agx", "reinhard", "none"). */
123
170
  'tone-mapping'?: string;
124
171
  /** Enable or disable interactive camera orbit/pan/zoom controls (default: true). */
125
172
  'camera-controls'?: boolean | string;
@@ -127,6 +174,8 @@ export interface ThreeLiveAttributes {
127
174
  'autoplay'?: boolean | string;
128
175
  /** Name of specific glTF animation clip to play. */
129
176
  'animation-name'?: string;
177
+ /** Name of the active KHR_materials_variants material variant. */
178
+ 'variant-name'?: string;
130
179
  /** Automatically rotate scene around the Y-axis when user is idle. */
131
180
  'auto-rotate'?: boolean | string;
132
181
  /** Delay in milliseconds before auto-rotation resumes after user interaction (default: 3000). */
@@ -162,6 +211,7 @@ export interface ThreeLiveAttributes {
162
211
  onerror?: (e: CustomEvent<{error: any}>) => void;
163
212
  onmeshclick?: (e: CustomEvent<HitDetail>) => void;
164
213
  'oncamera-change'?: (e: CustomEvent<CameraDetail>) => void;
214
+ 'onvariant-applied'?: (e: CustomEvent<{variantName: string | null}>) => void;
165
215
  'onar-status'?: (
166
216
  e: CustomEvent<{
167
217
  status: 'session-started' | 'not-presenting' | 'failed';
@@ -248,6 +298,8 @@ export interface XRLiveAttributes extends ThreeLiveAttributes {
248
298
  'peer-name'?: string;
249
299
  /** Local avatar visor & laser color (`#rrggbb`) in `shared-room`. */
250
300
  'peer-color'?: string;
301
+ /** Opt-in WebRTC spatial voice chat signaling and HRTF distance attenuation in `shared-room`. */
302
+ 'shared-room-voice'?: boolean | string;
251
303
  /** xr-live-sim: character camera mode, or `none` to disable the character. */
252
304
  'character-controller'?:
253
305
  | 'third-person'
@@ -363,6 +415,17 @@ export interface XRLiveAttributes extends ThreeLiveAttributes {
363
415
  onpeergrabconflict?: (
364
416
  e: CustomEvent<{peerId: string; nodeId: string}>,
365
417
  ) => void;
418
+ onpeerrtcsignal?: (
419
+ e: CustomEvent<{
420
+ peerId: string;
421
+ targetPeerId: string;
422
+ signalType: 'offer' | 'answer' | 'ice';
423
+ sdp: string | null;
424
+ candidate: string | null;
425
+ sdpMid: string | null;
426
+ sdpMLineIndex: number | null;
427
+ }>,
428
+ ) => void;
366
429
  /** xr-live-sim events. */
367
430
  oncharacterjump?: (
368
431
  e: CustomEvent<{nodeId: string; position: [number, number, number]}>,
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ var pe="__THREE_LIVE_REGISTRY__";function le(){let C=typeof globalThis<"u"?globalThis:{};if(!C[pe]){let L={plugins:[],decoders:new Map};try{Object.defineProperty(C,pe,{value:L,writable:!1,configurable:!1,enumerable:!1})}catch{C[pe]=L}}return C[pe]}var dn=le().plugins;function Ke(C){let L=le();L.workerExtensionInstallers||(L.workerExtensionInstallers=[]),L.workerExtensionInstallers.includes(C)||L.workerExtensionInstallers.push(C)}function Je(C){let L=le().plugins;L.some(D=>D.name===C.name)||L.push(C),C.onRegister?.()}var xn=8192,pn=512,gn=128;function we(C,L){if(!C||!C.BufferGeometry)return null;let D=C.Vector2,Me=C.Vector3,nn=C.Quaternion,ge=C.Matrix4,tn=C.Color,_=C.BufferAttribute,ee=C.BufferGeometry,sn=C.Material,Ge=C.MeshStandardMaterial,he=C.Mesh,ce=8192,me=512,Ce=128;class ye{constructor(e){this.currentPoint=new D(0,0),this.segments=[],Array.isArray(e)&&e.length>0&&this.fromPoints(e)}fromPoints(e){if(!e.length)return this;this.moveTo(e[0].x,e[0].y);for(let n=1;n<e.length;n++)this.lineTo(e[n].x,e[n].y);return this}moveTo(e,n){let t=Number(e)||0,o=Number(n)||0;return this.currentPoint.set(t,o),this.segments.push({type:"move",pts:[t,o]}),this}lineTo(e,n){let t=Number(e)||0,o=Number(n)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[this.currentPoint.x,this.currentPoint.y]}),this.currentPoint.set(t,o),this.segments.push({type:"line",pts:[t,o]}),this}quadraticCurveTo(e,n,t,o){let c=this.currentPoint.x,r=this.currentPoint.y,i=Number(e)||0,h=Number(n)||0,a=Number(t)||0,m=Number(o)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[c,r]}),this.currentPoint.set(a,m),this.segments.push({type:"quad",pts:[c,r,i,h,a,m]}),this}bezierCurveTo(e,n,t,o,c,r){let i=this.currentPoint.x,h=this.currentPoint.y,a=Number(e)||0,m=Number(n)||0,u=Number(t)||0,l=Number(o)||0,f=Number(c)||0,y=Number(r)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[i,h]}),this.currentPoint.set(f,y),this.segments.push({type:"cubic",pts:[i,h,a,m,u,l,f,y]}),this}absarc(e,n,t,o,c,r=!1){return this.absellipse(e,n,t,t,o,c,r,0)}arc(e,n,t,o,c,r=!1){return this.absarc(this.currentPoint.x+(Number(e)||0),this.currentPoint.y+(Number(n)||0),t,o,c,r)}absellipse(e,n,t,o,c,r,i=!1,h=0){let a=Number(e)||0,m=Number(n)||0,u=Math.max(0,Number(t)||0),l=Math.max(0,Number(o)||0),f=Number(c)||0,y=Number(r)||0,b=i?1:0,x=Number(h)||0;this.segments.push({type:"arc",pts:[a,m,u,l,f,y,b,x]});let p=Math.cos(x),v=Math.sin(x),S=u*Math.cos(y),d=l*Math.sin(y);return this.currentPoint.set(a+S*p-d*v,m+S*v+d*p),this}ellipse(e,n,t,o,c,r,i=!1,h=0){return this.absellipse(this.currentPoint.x+(Number(e)||0),this.currentPoint.y+(Number(n)||0),t,o,c,r,i,h)}closePath(){if(this.segments.length>0){let e=this.segments[0],n=0,t=0;if(e.type==="arc"){let o=e.pts[0],c=e.pts[1],r=e.pts[2],i=e.pts[3],h=e.pts[4],a=e.pts[7],m=Math.cos(a),u=Math.sin(a),l=r*Math.cos(h),f=i*Math.sin(h);n=o+l*m-f*u,t=c+l*u+f*m}else n=e.pts[0],t=e.pts[1];Math.hypot(this.currentPoint.x-n,this.currentPoint.y-t)>1e-6&&this.lineTo(n,t)}return this}getPoints(e=12){let n=Math.max(1,Math.min(128,Math.floor(Number(e)||12))),t=[],o=(c,r)=>{if(t.length>0){let i=t[t.length-1];if(Math.hypot(i.x-c,i.y-r)<1e-6)return}t.push(new D(c,r))};for(let c of this.segments){let r=c.pts;if(c.type==="move"||c.type==="line")o(r[0],r[1]);else if(c.type==="quad"){let i=r[0],h=r[1],a=r[2],m=r[3],u=r[4],l=r[5];o(i,h);for(let f=1;f<=n;f++){let y=f/n,b=1-y;o(b*b*i+2*b*y*a+y*y*u,b*b*h+2*b*y*m+y*y*l)}}else if(c.type==="cubic"){let i=r[0],h=r[1],a=r[2],m=r[3],u=r[4],l=r[5],f=r[6],y=r[7];o(i,h);for(let b=1;b<=n;b++){let x=b/n,p=1-x,v=p*p,S=x*x;o(v*p*i+3*v*x*a+3*p*S*u+S*x*f,v*p*h+3*v*x*m+3*p*S*l+S*x*y)}}else if(c.type==="arc"){let i=r[0],h=r[1],a=r[2],m=r[3],u=r[4],l=r[5],f=r[6]!==0,y=r[7],b=Math.PI*2,x=l-u,p=Math.abs(x)<1e-9;for(;x<0;)x+=b;for(;x>b;)x-=b;x<1e-9&&(x=p?0:b),f&&!p&&(x=x===b?-b:x-b);let v=Math.cos(y),S=Math.sin(y),d=Math.max(2,n);for(let k=0;k<=d;k++){let T=k/d,z=u+T*x,G=a*Math.cos(z),M=m*Math.sin(z);o(i+G*v-M*S,h+G*S+M*v)}}}if(t.length>2){let c=t[0],r=t[t.length-1];Math.hypot(c.x-r.x,c.y-r.y)<1e-6&&t.pop()}return t}getSpacedPoints(e=12){return this.getPoints(e)}}class ae extends ye{constructor(e){super(e),this.holes=[]}extractPoints(e=12){return{shape:this.getPoints(e),holes:this.holes.map(n=>n.getPoints(e))}}}function fe(s){let e=0,n=s.length;for(let t=0,o=n-1;t<n;o=t++)e+=s[o].x*s[t].y-s[t].x*s[o].y;return e*.5}function on(s,e,n,t,o,c,r,i){let h=r-n,a=i-t,m=o-n,u=c-t,l=s-n,f=e-t,y=h*h+a*a,b=h*m+a*u,x=h*l+a*f,p=m*m+u*u,v=m*l+u*f,S=y*p-b*b;if(Math.abs(S)<1e-12)return!1;let d=1/S,k=(p*x-b*v)*d,T=(y*v-b*x)*d;return k>=-1e-7&&T>=-1e-7&&k+T<=1+1e-7}function ke(s,e){let n=s.slice();fe(n)<0&&n.reverse();let t=n.map(r=>new D(r.x,r.y)),o=n.map((r,i)=>i),c=[];for(let r of e){if(!r||r.length<3)continue;let i=r.slice();fe(i)>0&&i.reverse();let h=[],a=-1/0,m=0;for(let u=0;u<i.length;u++){let l=i[u],f=t.length;t.push(new D(l.x,l.y)),h.push(f),l.x>a&&(a=l.x,m=u)}c.push({pts:i,indices:h,maxX:a,maxIdx:m})}c.sort((r,i)=>i.maxX-r.maxX);for(let r of c){let i=r.pts[r.maxIdx].x,h=r.pts[r.maxIdx].y,a=0,m=1/0;for(let l=0;l<o.length;l++){let f=t[o[l]],y=Math.hypot(f.x-i,f.y-h)+(f.x>=i?0:1e3);y<m&&(m=y,a=l)}let u=[];for(let l=0;l<=a;l++)u.push(o[l]);for(let l=0;l<=r.indices.length;l++){let f=r.indices[(r.maxIdx+l)%r.indices.length];u.push(f)}for(let l=a;l<o.length;l++)u.push(o[l]);o=u}return{merged:o.map(r=>t[r]),mergedIndices:o,allVertices:t}}function Te(s,e){let n=[],t=s.slice();if(t.length<3)return n;let o=t.length*t.length+64,c=0;for(;t.length>2&&o-- >0;){let r=t.length,i=t[(c+r-1)%r],h=t[c%r],a=t[(c+1)%r],m=e[i],u=e[h],l=e[a];if((u.x-m.x)*(l.y-m.y)-(u.y-m.y)*(l.x-m.x)>1e-9){let y=!0;for(let b=0;b<r;b++){let x=t[b];if(x===i||x===h||x===a)continue;let p=e[x];if(!(Math.hypot(p.x-m.x,p.y-m.y)<1e-6||Math.hypot(p.x-u.x,p.y-u.y)<1e-6||Math.hypot(p.x-l.x,p.y-l.y)<1e-6)&&on(p.x,p.y,m.x,m.y,u.x,u.y,l.x,l.y)){y=!1;break}}if(y){n.push([i,h,a]),t.splice(c%r,1),c=0;continue}}c++,c>=r*2&&(n.push([i,h,a]),t.splice(c%r,1),c=0)}return n}class rn extends ee{constructor(e=new ae,n=12){super();let t=Array.isArray(e)?e:[e],o=[],c=[],r=[],i=[];for(let h of t){if(!(h instanceof ye))continue;let a=h instanceof ae?h.extractPoints(n):{shape:h.getPoints(n),holes:[]};if(a.shape.length<3)continue;let{mergedIndices:m,allVertices:u}=ke(a.shape,a.holes),l=Te(m,u),f=o.length/3,y=1/0,b=1/0,x=-1/0,p=-1/0;for(let d of u)d.x<y&&(y=d.x),d.y<b&&(b=d.y),d.x>x&&(x=d.x),d.y>p&&(p=d.y);let v=Math.max(1e-6,x-y),S=Math.max(1e-6,p-b);for(let d of u)o.push(d.x,d.y,0),c.push(0,0,1),r.push((d.x-y)/v,(d.y-b)/S);for(let[d,k,T]of l)i.push(f+d,f+k,f+T)}this.setAttribute("position",new _(new Float32Array(o),3)),this.setAttribute("normal",new _(new Float32Array(c),3)),this.setAttribute("uv",new _(new Float32Array(r),2)),this.setIndex(i)}}function cn(s){let e=s.length,n=[];for(let t=0;t<e;t++){let o=s[(t+e-1)%e],c=s[t],r=s[(t+1)%e],i=c.x-o.x,h=c.y-o.y,a=Math.hypot(i,h)||1;i/=a,h/=a;let m=r.x-c.x,u=r.y-c.y,l=Math.hypot(m,u)||1;m/=l,u/=l;let f=h,y=-i,b=u,x=-m,p=f+b,v=y+x,S=Math.hypot(p,v);if(S>1e-6){p/=S,v/=S;let d=Math.max(.35,p*f+v*y);n.push(new D(p/d,v/d))}else n.push(new D(f,y))}return n}class an extends ee{constructor(e=new ae,n={}){super();let t=Array.isArray(e)?e:[e],o=Math.max(1,Math.min(64,Math.floor(Number(n.curveSegments??12)))),c=Number.isFinite(Number(n.depth??n.amount))?Number(n.depth??n.amount):1,r=Math.max(1,Math.min(32,Math.floor(Number(n.steps??1)))),i=!!(n.bevelEnabled??!1),h=i?Math.max(0,Number(n.bevelThickness??.06)):0,a=i?Math.max(0,Number(n.bevelSize??h*.8)):0,m=i?Number(n.bevelOffset??0):0,u=i?Math.max(1,Math.min(8,Math.floor(Number(n.bevelSegments??2)))):0,l=[],f=[],y=[],b=[];for(let x of t){if(!(x instanceof ye))continue;let p=x instanceof ae?x.extractPoints(o):{shape:x.getPoints(o),holes:[]};if(p.shape.length<3)continue;let v=p.shape.slice();fe(v)<0&&v.reverse();let S=[];for(let g of p.holes){if(g.length<3)continue;let P=g.slice();fe(P)>0&&P.reverse(),S.push(P)}let{mergedIndices:d,allVertices:k}=ke(v,S),T=Te(d,k),z=[v,...S],G=[];for(let g of z){let P=cn(g);for(let w of P)G.push(w)}let M=1/0,V=1/0,X=-1/0,F=-1/0;for(let g of k)g.x<M&&(M=g.x),g.y<V&&(V=g.y),g.x>X&&(X=g.x),g.y>F&&(F=g.y);let N=Math.max(1e-6,X-M),B=Math.max(1e-6,F-V),ne=-h,te=c+h,W=l.length/3;for(let g=0;g<k.length;g++){let P=k[g],w=G[g]??new D(0,0),R=P.x+w.x*m,E=P.y+w.y*m;l.push(R,E,ne),f.push(0,0,-1),y.push((R-M)/N,(E-V)/B)}for(let[g,P,w]of T)b.push(W+g,W+w,W+P);let j=l.length/3;for(let g=0;g<k.length;g++){let P=k[g],w=G[g]??new D(0,0),R=P.x+w.x*m,E=P.y+w.y*m;l.push(R,E,te),f.push(0,0,1),y.push((R-M)/N,(E-V)/B)}for(let[g,P,w]of T)b.push(j+g,j+P,j+w);let I=[];if(i&&u>0)for(let g=0;g<u;g++){let w=g/u*Math.PI/2;I.push({z:-h*Math.cos(w),expand:m+a*Math.sin(w)})}for(let g=0;g<=r;g++){let P=g/r;I.push({z:P*c,expand:m+a})}if(i&&u>0)for(let g=1;g<=u;g++){let w=g/u*Math.PI/2;I.push({z:c+h*Math.sin(w),expand:m+a*Math.cos(w)})}let O=0;for(let g of z){let P=g.length;for(let w=0;w<I.length-1;w++){let R=I[w],E=I[w+1];for(let A=0;A<P;A++){let Y=(A+1)%P,H=g[A],U=g[Y],$=G[O+A],Q=G[O+Y],Z=H.x+$.x*R.expand,K=H.y+$.y*R.expand,J=U.x+Q.x*R.expand,q=U.y+Q.y*R.expand,fn=U.x+Q.x*E.expand,bn=U.y+Q.y*E.expand,Fe=H.x+$.x*E.expand,Be=H.y+$.y*E.expand,Oe=J-Z,Ye=q-K,qe=0,We=Fe-Z,je=Be-K,He=E.z-R.z,se=Ye*He-qe*je,oe=qe*We-Oe*He,re=Oe*je-Ye*We,Pe=Math.hypot(se,oe,re)||1;se/=Pe,oe/=Pe,re/=Pe;let ie=l.length/3;l.push(Z,K,R.z,J,q,R.z,fn,bn,E.z,Fe,Be,E.z),f.push(se,oe,re,se,oe,re,se,oe,re,se,oe,re);let Ue=A/P,$e=(A+1)/P,Qe=w/(I.length-1),Ze=(w+1)/(I.length-1);y.push(Ue,Qe,$e,Qe,$e,Ze,Ue,Ze),b.push(ie,ie+1,ie+2,ie,ie+2,ie+3)}}O+=P}}this.setAttribute("position",new _(new Float32Array(l),3)),this.setAttribute("normal",new _(new Float32Array(f),3)),this.setAttribute("uv",new _(new Float32Array(y),2)),this.setIndex(b)}}function Le(s){return{x:s.x,y:s.y,z:s.z,nx:s.nx,ny:s.ny,nz:s.nz,u:s.u,v:s.v}}function un(s){return{x:s.x,y:s.y,z:s.z,nx:-s.nx,ny:-s.ny,nz:-s.nz,u:s.u,v:s.v}}function ln(s,e,n){let t=s.nx+(e.nx-s.nx)*n,o=s.ny+(e.ny-s.ny)*n,c=s.nz+(e.nz-s.nz)*n,r=Math.hypot(t,o,c)||1;return{x:s.x+(e.x-s.x)*n,y:s.y+(e.y-s.y)*n,z:s.z+(e.z-s.z)*n,nx:t/r,ny:o/r,nz:c/r,u:s.u+(e.u-s.u)*n,v:s.v+(e.v-s.v)*n}}function de(s){if(s.length<3)return null;let e=s[0],n=s[1],t=s[2],o=n.x-e.x,c=n.y-e.y,r=n.z-e.z,i=t.x-e.x,h=t.y-e.y,a=t.z-e.z,m=c*a-r*h,u=r*i-o*a,l=o*h-c*i,f=Math.hypot(m,u,l);if(f<1e-9)return null;m/=f,u/=f,l/=f;let y=m*e.x+u*e.y+l*e.z;return{vertices:s,nx:m,ny:u,nz:l,w:y}}function hn(s){s.vertices.reverse();for(let e=0;e<s.vertices.length;e++)s.vertices[e]=un(s.vertices[e]);s.nx=-s.nx,s.ny=-s.ny,s.nz=-s.nz,s.w=-s.w}let Re=1e-5,Ee=0,ve=1,be=2,ze=3;function Ve(s,e,n,t,o,c,r,i,h){let a=0,m=[];for(let u=0;u<o.vertices.length;u++){let l=o.vertices[u],f=s*l.x+e*l.y+n*l.z-t,y=f<-Re?be:f>Re?ve:Ee;a|=y,m.push(y)}switch(a){case Ee:{s*o.nx+e*o.ny+n*o.nz>0?c.push(o):r.push(o);break}case ve:i.push(o);break;case be:h.push(o);break;case ze:{let u=[],l=[],f=o.vertices.length;for(let y=0;y<f;y++){let b=(y+1)%f,x=m[y],p=m[b],v=o.vertices[y],S=o.vertices[b];if(x!==be&&u.push(v),x!==ve&&l.push(x!==be?Le(v):v),(x|p)===ze){let d=S.x-v.x,k=S.y-v.y,T=S.z-v.z,z=s*d+e*k+n*T,G=Math.abs(z)>1e-12?(t-(s*v.x+e*v.y+n*v.z))/z:.5,M=ln(v,S,Math.max(0,Math.min(1,G)));u.push(M),l.push(Le(M))}}if(u.length>=3){let y=de(u);y&&i.push(y)}if(l.length>=3){let y=de(l);y&&h.push(y)}break}default:break}}class ue{constructor(e,n=0){this.nx=0,this.ny=0,this.nz=0,this.w=0,this.hasPlane=!1,this.polygons=[],this.front=null,this.back=null,e&&e.length>0&&this.build(e,n)}invert(){for(let n=0;n<this.polygons.length;n++)hn(this.polygons[n]);this.nx=-this.nx,this.ny=-this.ny,this.nz=-this.nz,this.w=-this.w,this.front&&this.front.invert(),this.back&&this.back.invert();let e=this.front;this.front=this.back,this.back=e}clipPolygons(e,n=0){if(!this.hasPlane||e.length===0||n>=me)return e.slice();let t=[],o=[];for(let c=0;c<e.length;c++)Ve(this.nx,this.ny,this.nz,this.w,e[c],t,o,t,o);return this.front&&t.length>0&&(t=this.front.clipPolygons(t,n+1)),this.back?o=o.length>0?this.back.clipPolygons(o,n+1):[]:o=[],t.concat(o)}clipTo(e,n=0){this.polygons.length>0&&(this.polygons=e.clipPolygons(this.polygons,0)),n<me&&(this.front&&this.front.clipTo(e,n+1),this.back&&this.back.clipTo(e,n+1))}allPolygons(e=[]){for(let n=0;n<this.polygons.length;n++)e.push(this.polygons[n]);return this.front&&this.front.allPolygons(e),this.back&&this.back.allPolygons(e),e}build(e,n=0){if(!e.length)return;if(!this.hasPlane){let c=e[0];this.nx=c.nx,this.ny=c.ny,this.nz=c.nz,this.w=c.w,this.hasPlane=!0}if(n>=me){for(let c=0;c<e.length;c++)this.polygons.push(e[c]);return}let t=[],o=[];for(let c=0;c<e.length;c++)Ve(this.nx,this.ny,this.nz,this.w,e[c],this.polygons,this.polygons,t,o);t.length>0&&(this.front||(this.front=new ue),this.front.build(t,n+1)),o.length>0&&(this.back||(this.back=new ue),this.back.build(o,n+1))}}function Ie(s,e){let n=s.attributes.position;if(!n||n.count===0)return[];let t=s.attributes.normal,o=s.attributes.uv,c=s.index?s.index.array:null,r=Math.floor(c?c.length/3:n.count/3);if(r>ce)throw new RangeError(`SecurityError: CSG input triangle count (${r}) exceeds MAX_CSG_TRIANGLES (${ce})`);let i=e?e.elements:null,h=i?i[0]*(i[5]*i[10]-i[9]*i[6])-i[4]*(i[1]*i[10]-i[9]*i[2])+i[8]*(i[1]*i[6]-i[5]*i[2])<0:!1,a=u=>{let l=n.getX(u),f=n.getY(u),y=n.getZ(u),b=t?t.getX(u):0,x=t?t.getY(u):0,p=t?t.getZ(u):1;if(i){let d=i[0]*l+i[4]*f+i[8]*y+i[12],k=i[1]*l+i[5]*f+i[9]*y+i[13],T=i[2]*l+i[6]*f+i[10]*y+i[14];l=d,f=k,y=T;let z=i[0]*b+i[4]*x+i[8]*p,G=i[1]*b+i[5]*x+i[9]*p,M=i[2]*b+i[6]*x+i[10]*p,V=Math.hypot(z,G,M)||1;b=z/V,x=G/V,p=M/V}let v=o?o.getX(u):0,S=o?o.getY(u):0;return{x:l,y:f,z:y,nx:b,ny:x,nz:p,u:v,v:S}},m=[];for(let u=0;u<r;u++){let l=c?c[u*3]:u*3,f=c?c[u*3+1]:u*3+1,y=c?c[u*3+2]:u*3+2,b=de(h?[a(l),a(y),a(f)]:[a(l),a(f),a(y)]);b&&m.push(b)}return m}function mn(s){let e=[],n=[],t=[],o=[];for(let r of s){let i=r.vertices;if(i.length<3)continue;let h=e.length/3;for(let a of i)e.push(a.x,a.y,a.z),n.push(r.nx,r.ny,r.nz),t.push(a.u,a.v);for(let a=1;a<i.length-1;a++)o.push(h,h+a,h+a+1)}let c=new ee;return c.setAttribute("position",new _(new Float32Array(e),3)),c.setAttribute("normal",new _(new Float32Array(n),3)),c.setAttribute("uv",new _(new Float32Array(t),2)),c.setIndex(o),c}function yn(s,e,n){if(s.length+e.length>ce)throw new RangeError(`SecurityError: Combined CSG triangle count (${s.length+e.length}) exceeds MAX_CSG_TRIANGLES (${ce})`);if(s.length===0)return n==="union"?e:[];if(e.length===0)return n==="intersect"?[]:s;let t=new ue(s),o=new ue(e);return n==="union"?(t.clipTo(o),o.clipTo(t),o.invert(),o.clipTo(t),o.invert(),t.build(o.allPolygons()),t.allPolygons()):n==="subtract"?(t.invert(),t.clipTo(o),o.clipTo(t),o.invert(),o.clipTo(t),o.invert(),t.build(o.allPolygons()),t.invert(),t.allPolygons()):(t.invert(),o.clipTo(t),o.invert(),t.clipTo(o),o.clipTo(t),t.build(o.allPolygons()),t.invert(),t.allPolygons())}function Ae(s,e,n,t=null,o=null){let c=Ie(s,t),r=Ie(e,o);return mn(yn(c,r,n))}function Se(s,e,n){let t=s instanceof he||!!s?.isMesh,o=e instanceof he||!!e?.isMesh,c=t?s.geometry:s,r=o?e.geometry:e,i=null;if(o)if(e.updateMatrix(),t){s.updateMatrix();let u=new ge().makeScale(1/(s.scale.x||1),1/(s.scale.y||1),1/(s.scale.z||1)),l=Math.hypot(s.quaternion.x,s.quaternion.y,s.quaternion.z,s.quaternion.w)||1,f=new ge().compose(new Me(0,0,0),new nn(-s.quaternion.x/l,-s.quaternion.y/l,-s.quaternion.z/l,s.quaternion.w/l),new Me(1,1,1)),y=new ge().makeTranslation(-s.position.x,-s.position.y,-s.position.z);i=u.multiply(f).multiply(y).multiply(e.matrix)}else i=e.matrix;let h=Ae(c,r,n,null,i),a=t?s.material:new Ge,m=new he(h,a);return t&&(m.position.copy(s.position),m.quaternion.copy(s.quaternion),m.scale.copy(s.scale),m.name=s.name),m}let xe={toGeometry:Ae,subtract(s,e){return Se(s,e,"subtract")},union(s,e){return Se(s,e,"union")},intersect(s,e){return Se(s,e,"intersect")}},Ne={0:[[[.15,0],[.85,0],[.85,1],[.15,1],[.15,0]]],1:[[[.3,.8],[.5,1],[.5,0]],[[.2,0],[.8,0]]],2:[[[.15,.8],[.3,1],[.7,1],[.85,.8],[.85,.55],[.15,0],[.85,0]]],3:[[[.15,.85],[.3,1],[.75,1],[.85,.75],[.5,.5],[.85,.25],[.75,0],[.3,0],[.15,.15]]],4:[[[.7,0],[.7,1],[.15,.35],[.9,.35]]],5:[[[.85,1],[.2,1],[.15,.55],[.75,.55],[.85,.3],[.75,0],[.2,0]]],6:[[[.8,.9],[.5,1],[.15,.7],[.15,.15],[.5,0],[.85,.2],[.85,.45],[.5,.55],[.15,.45]]],7:[[[.15,1],[.85,1],[.35,0]]],8:[[[.2,.5],[.15,.75],[.3,1],[.7,1],[.85,.75],[.8,.5],[.2,.5],[.15,.2],[.3,0],[.7,0],[.85,.2],[.8,.5]]],9:[[[.85,.55],[.5,.45],[.15,.55],[.15,.85],[.5,1],[.85,.85],[.85,.2],[.5,0],[.2,.1]]],A:[[[.1,0],[.5,1],[.9,0]],[[.25,.35],[.75,.35]]],B:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.7,.5],[.85,.25],[.7,0],[.15,0]]],C:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.65,0],[.85,.2]]],D:[[[.15,0],[.15,1],[.65,1],[.85,.75],[.85,.25],[.65,0],[.15,0]]],E:[[[.85,1],[.15,1],[.15,0],[.85,0]],[[.15,.5],[.7,.5]]],F:[[[.85,1],[.15,1],[.15,0]],[[.15,.5],[.7,.5]]],G:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.85,0],[.85,.45],[.55,.45]]],H:[[[.15,0],[.15,1]],[[.85,0],[.85,1]],[[.15,.5],[.85,.5]]],I:[[[.25,1],[.75,1]],[[.5,1],[.5,0]],[[.25,0],[.75,0]]],J:[[[.8,1],[.8,.25],[.6,0],[.3,0],[.15,.25]]],K:[[[.15,0],[.15,1]],[[.85,1],[.15,.45],[.85,0]]],L:[[[.15,1],[.15,0],[.85,0]]],M:[[[.1,0],[.1,1],[.5,.35],[.9,1],[.9,0]]],N:[[[.15,0],[.15,1],[.85,0],[.85,1]]],O:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]]],P:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]]],Q:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]],[[.55,.3],[.9,-.05]]],R:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.55,.5],[.85,0]]],S:[[[.85,.85],[.65,1],[.3,1],[.15,.75],[.85,.25],[.7,0],[.3,0],[.15,.15]]],T:[[[.1,1],[.9,1]],[[.5,1],[.5,0]]],U:[[[.15,1],[.15,.25],[.35,0],[.65,0],[.85,.25],[.85,1]]],V:[[[.1,1],[.5,0],[.9,1]]],W:[[[.05,1],[.25,0],[.5,.65],[.75,0],[.95,1]]],X:[[[.15,1],[.85,0]],[[.85,1],[.15,0]]],Y:[[[.15,1],[.5,.5],[.85,1]],[[.5,.5],[.5,0]]],Z:[[[.15,1],[.85,1],[.15,0],[.85,0]]],".":[[[.45,0],[.55,0],[.55,.12],[.45,.12],[.45,0]]],",":[[[.5,.15],[.4,-.1]]],":":[[[.45,.1],[.55,.1]],[[.45,.7],[.55,.7]]],"-":[[[.2,.5],[.8,.5]]],"+":[[[.2,.5],[.8,.5]],[[.5,.2],[.5,.8]]],"=":[[[.2,.35],[.8,.35]],[[.2,.65],[.8,.65]]],"/":[[[.2,0],[.8,1]]],"!":[[[.5,1],[.5,.28]],[[.5,.1],[.5,0]]],"?":[[[.2,.8],[.35,1],[.7,1],[.85,.75],[.5,.45],[.5,.28]],[[.5,.1],[.5,0]]],"(":[[[.65,1],[.35,.65],[.35,.35],[.65,0]]],")":[[[.35,1],[.65,.65],[.65,.35],[.35,0]]],"%":[[[.2,0],[.8,1]],[[.2,.8],[.35,.8],[.35,.95],[.2,.95],[.2,.8]],[[.65,.05],[.8,.05],[.8,.2],[.65,.2],[.65,.05]]],"#":[[[.32,0],[.32,1]],[[.68,0],[.68,1]],[[.12,.35],[.88,.35]],[[.12,.65],[.88,.65]]],$:[[[.8,.8],[.6,.92],[.3,.92],[.18,.72],[.82,.28],[.7,.08],[.4,.08],[.2,.2]],[[.5,1],[.5,0]]],_:[[[.1,0],[.9,0]]],"[":[[[.65,1],[.3,1],[.3,0],[.65,0]]],"]":[[[.35,1],[.7,1],[.7,0],[.35,0]]],"<":[[[.75,.85],[.25,.5],[.75,.15]]],">":[[[.25,.85],[.75,.5],[.25,.15]]],"*":[[[.5,.2],[.5,.8]],[[.2,.35],[.8,.65]],[[.2,.65],[.8,.35]]],"\\":[[[.2,1],[.8,0]]]};class _e extends ee{constructor(e="",n={}){super();let t=String(e??"").slice(0,Ce),o=Math.max(.005,Math.min(100,Number(n.size??.2))),c=!!(n.bevelEnabled??!1),r=c?Math.max(0,Math.min(2,Number(n.bevelThickness??o*.04))):0,i=c?Math.max(0,Math.min(2,Number(n.bevelSize??o*.03))):0,h=Math.max(.001,Math.min(20,Number(n.depth??n.height??o*.2)))+r*2,a=o*.085+i,m=o*.68,u=o*.82,l=[],f=[],y=[],b=[],x=(S,d,k,T,z,G,M)=>{let V=k-S,X=T-d,F=Math.hypot(V,X),N=1,B=0;F>1e-6&&(N=V/F,B=X/F);let ne=-B*z,te=N*z,W=N*z*.6,j=B*z*.6,I=S-W+ne,O=d-j+te,g=S-W-ne,P=d-j-te,w=k+W-ne,R=T+j-te,E=k+W+ne,A=T+j+te,Y=(H,U,$,Q,Z,K,J)=>{let q=l.length/3;l.push(H[0],H[1],H[2],U[0],U[1],U[2],$[0],$[1],$[2],Q[0],Q[1],Q[2]),f.push(Z,K,J,Z,K,J,Z,K,J,Z,K,J),y.push(0,0,1,0,1,1,0,1),b.push(q,q+1,q+2,q,q+2,q+3)};Y([I,O,M],[g,P,M],[w,R,M],[E,A,M],0,0,1),Y([g,P,G],[I,O,G],[E,A,G],[w,R,G],0,0,-1),Y([I,O,G],[g,P,G],[g,P,M],[I,O,M],-N,-B,0),Y([w,R,G],[E,A,G],[E,A,M],[w,R,M],N,B,0),Y([g,P,G],[w,R,G],[w,R,M],[g,P,M],-B,N,0),Y([E,A,G],[I,O,G],[I,O,M],[E,A,M],B,-N,0)},p=0,v=0;for(let S=0;S<t.length;S++){let d=t[S];if(d===`
18
+ `){p=0,v-=o*1.35;continue}if(d===" "){p+=u*.75;continue}let k=d.toUpperCase(),T=d!==k&&d>="a"&&d<="z",z=Ne[k]??Ne["?"],G=T?o*.76:o,M=T?m*.88:m;for(let V of z)for(let X=0;X<V.length-1;X++){let F=V[X],N=V[X+1];x(p+F[0]*M,v+F[1]*G,p+N[0]*M,v+N[1]*G,a,-h*.5,h*.5)}p+=T?u*.88:u}this.setAttribute("position",new _(new Float32Array(l),3)),this.setAttribute("normal",new _(new Float32Array(f),3)),this.setAttribute("uv",new _(new Float32Array(y),2)),this.setIndex(b),n.center!==!1?this.center():this.computeBoundingBox()}}function Xe(s){if(!s)return;let e=s,n=s.userData?.xr?.text;if(n!=null&&n!==!1){let o=e.geometry?.attributes?.position;if(!o||o.count===0){let c="",r=.08,i=.015,h;if(typeof n=="string"||typeof n=="number")c=String(n);else if(typeof n=="object"){let a=n;c=String(a.text??a.value??""),a.size!==void 0&&(r=Number(a.size)||.08),(a.depth!==void 0||a.height!==void 0)&&(i=Number(a.depth??a.height)||r*.2),(typeof a.color=="string"||typeof a.color=="number")&&(h=a.color)}c.trim().length>0&&(e.geometry=new _e(c,{size:r,depth:i}),e.material instanceof sn?h!==void 0&&s.userData._autoTextColorApplied!==!0&&(e.material.color=new tn(h),s.userData._autoTextColorApplied=!0):e.material=new Ge({color:h??16317180}))}}let t=s.userData?.csg;if(t&&typeof t=="object"&&s.userData._csgApplied!==!0&&e.geometry instanceof ee&&e.geometry.attributes.position?.count>0){s.userData._csgApplied=!0;let o=Array.isArray(t)?t:[t];for(let c of o){if(!c||typeof c!="object")continue;let r=c,i=String(r.op??r.operation??"subtract"),h=i==="union"||i==="intersect"?i:"subtract",a=r.target??r.mesh??r.geometry;if(a instanceof he||a instanceof ee){let m=h==="union"?xe.union(e,a):h==="intersect"?xe.intersect(e,a):xe.subtract(e,a);e.geometry=m.geometry}}}}let De={Path:ye,Shape:ae,ShapeGeometry:rn,ExtrudeGeometry:an,TextGeometry:_e,CSG:xe,MAX_CSG_TRIANGLES:ce,MAX_BSP_DEPTH:me,MAX_TEXT_GEOMETRY_CHARS:Ce,materializeDeclarativeGeometry:Xe};return L&&typeof L=="object"&&(L.authorNamespace||(L.authorNamespace={}),Object.assign(L.authorNamespace,De),L.materializeDeclarativeGeometry=Xe),De}var en={name:"cad",onRegister(){Ke(we);let C=le(),L=C.threeNamespace??(typeof globalThis<"u"?globalThis.THREE:void 0);L&&we(L,C)}};Je(en);export{pn as MAX_BSP_DEPTH,xn as MAX_CSG_TRIANGLES,gn as MAX_TEXT_GEOMETRY_CHARS,en as cadPlugin,we as installCadExtension};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ "use strict";var ThreeLiveCAD=(()=>{var Ce=Object.defineProperty;var vn=Object.getOwnPropertyDescriptor;var Sn=Object.getOwnPropertyNames;var Pn=Object.prototype.hasOwnProperty;var wn=(P,G)=>{for(var I in G)Ce(P,I,{get:G[I],enumerable:!0})},Mn=(P,G,I,ae)=>{if(G&&typeof G=="object"||typeof G=="function")for(let J of Sn(G))!Pn.call(P,J)&&J!==I&&Ce(P,J,{get:()=>G[J],enumerable:!(ae=vn(G,J))||ae.enumerable});return P};var Gn=P=>Mn(Ce({},"__esModule",{value:!0}),P);var Cn={};wn(Cn,{MAX_BSP_DEPTH:()=>on,MAX_CSG_TRIANGLES:()=>sn,MAX_TEXT_GEOMETRY_CHARS:()=>rn,cadPlugin:()=>ke,installCadExtension:()=>ve});var de="__THREE_LIVE_REGISTRY__";function me(){let P=typeof globalThis<"u"?globalThis:{};if(!P[de]){let G={plugins:[],decoders:new Map};try{Object.defineProperty(P,de,{value:G,writable:!1,configurable:!1,enumerable:!1})}catch{P[de]=G}}return P[de]}var Tn=me().plugins;function nn(P){let G=me();G.workerExtensionInstallers||(G.workerExtensionInstallers=[]),G.workerExtensionInstallers.includes(P)||G.workerExtensionInstallers.push(P)}function tn(P){let G=me().plugins;G.some(I=>I.name===P.name)||G.push(P),P.onRegister?.()}var sn=8192,on=512,rn=128;function ve(P,G){if(!P||!P.BufferGeometry)return null;let I=P.Vector2,ae=P.Vector3,J=P.Quaternion,Se=P.Matrix4,cn=P.Color,X=P.BufferAttribute,ne=P.BufferGeometry,an=P.Material,Te=P.MeshStandardMaterial,ye=P.Mesh,ue=8192,fe=512,Le=128;class be{constructor(e){this.currentPoint=new I(0,0),this.segments=[],Array.isArray(e)&&e.length>0&&this.fromPoints(e)}fromPoints(e){if(!e.length)return this;this.moveTo(e[0].x,e[0].y);for(let n=1;n<e.length;n++)this.lineTo(e[n].x,e[n].y);return this}moveTo(e,n){let t=Number(e)||0,o=Number(n)||0;return this.currentPoint.set(t,o),this.segments.push({type:"move",pts:[t,o]}),this}lineTo(e,n){let t=Number(e)||0,o=Number(n)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[this.currentPoint.x,this.currentPoint.y]}),this.currentPoint.set(t,o),this.segments.push({type:"line",pts:[t,o]}),this}quadraticCurveTo(e,n,t,o){let c=this.currentPoint.x,r=this.currentPoint.y,i=Number(e)||0,h=Number(n)||0,a=Number(t)||0,m=Number(o)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[c,r]}),this.currentPoint.set(a,m),this.segments.push({type:"quad",pts:[c,r,i,h,a,m]}),this}bezierCurveTo(e,n,t,o,c,r){let i=this.currentPoint.x,h=this.currentPoint.y,a=Number(e)||0,m=Number(n)||0,u=Number(t)||0,l=Number(o)||0,f=Number(c)||0,y=Number(r)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[i,h]}),this.currentPoint.set(f,y),this.segments.push({type:"cubic",pts:[i,h,a,m,u,l,f,y]}),this}absarc(e,n,t,o,c,r=!1){return this.absellipse(e,n,t,t,o,c,r,0)}arc(e,n,t,o,c,r=!1){return this.absarc(this.currentPoint.x+(Number(e)||0),this.currentPoint.y+(Number(n)||0),t,o,c,r)}absellipse(e,n,t,o,c,r,i=!1,h=0){let a=Number(e)||0,m=Number(n)||0,u=Math.max(0,Number(t)||0),l=Math.max(0,Number(o)||0),f=Number(c)||0,y=Number(r)||0,b=i?1:0,x=Number(h)||0;this.segments.push({type:"arc",pts:[a,m,u,l,f,y,b,x]});let p=Math.cos(x),v=Math.sin(x),S=u*Math.cos(y),d=l*Math.sin(y);return this.currentPoint.set(a+S*p-d*v,m+S*v+d*p),this}ellipse(e,n,t,o,c,r,i=!1,h=0){return this.absellipse(this.currentPoint.x+(Number(e)||0),this.currentPoint.y+(Number(n)||0),t,o,c,r,i,h)}closePath(){if(this.segments.length>0){let e=this.segments[0],n=0,t=0;if(e.type==="arc"){let o=e.pts[0],c=e.pts[1],r=e.pts[2],i=e.pts[3],h=e.pts[4],a=e.pts[7],m=Math.cos(a),u=Math.sin(a),l=r*Math.cos(h),f=i*Math.sin(h);n=o+l*m-f*u,t=c+l*u+f*m}else n=e.pts[0],t=e.pts[1];Math.hypot(this.currentPoint.x-n,this.currentPoint.y-t)>1e-6&&this.lineTo(n,t)}return this}getPoints(e=12){let n=Math.max(1,Math.min(128,Math.floor(Number(e)||12))),t=[],o=(c,r)=>{if(t.length>0){let i=t[t.length-1];if(Math.hypot(i.x-c,i.y-r)<1e-6)return}t.push(new I(c,r))};for(let c of this.segments){let r=c.pts;if(c.type==="move"||c.type==="line")o(r[0],r[1]);else if(c.type==="quad"){let i=r[0],h=r[1],a=r[2],m=r[3],u=r[4],l=r[5];o(i,h);for(let f=1;f<=n;f++){let y=f/n,b=1-y;o(b*b*i+2*b*y*a+y*y*u,b*b*h+2*b*y*m+y*y*l)}}else if(c.type==="cubic"){let i=r[0],h=r[1],a=r[2],m=r[3],u=r[4],l=r[5],f=r[6],y=r[7];o(i,h);for(let b=1;b<=n;b++){let x=b/n,p=1-x,v=p*p,S=x*x;o(v*p*i+3*v*x*a+3*p*S*u+S*x*f,v*p*h+3*v*x*m+3*p*S*l+S*x*y)}}else if(c.type==="arc"){let i=r[0],h=r[1],a=r[2],m=r[3],u=r[4],l=r[5],f=r[6]!==0,y=r[7],b=Math.PI*2,x=l-u,p=Math.abs(x)<1e-9;for(;x<0;)x+=b;for(;x>b;)x-=b;x<1e-9&&(x=p?0:b),f&&!p&&(x=x===b?-b:x-b);let v=Math.cos(y),S=Math.sin(y),d=Math.max(2,n);for(let T=0;T<=d;T++){let L=T/d,z=u+L*x,k=a*Math.cos(z),C=m*Math.sin(z);o(i+k*v-C*S,h+k*S+C*v)}}}if(t.length>2){let c=t[0],r=t[t.length-1];Math.hypot(c.x-r.x,c.y-r.y)<1e-6&&t.pop()}return t}getSpacedPoints(e=12){return this.getPoints(e)}}class le extends be{constructor(e){super(e),this.holes=[]}extractPoints(e=12){return{shape:this.getPoints(e),holes:this.holes.map(n=>n.getPoints(e))}}}function xe(s){let e=0,n=s.length;for(let t=0,o=n-1;t<n;o=t++)e+=s[o].x*s[t].y-s[t].x*s[o].y;return e*.5}function un(s,e,n,t,o,c,r,i){let h=r-n,a=i-t,m=o-n,u=c-t,l=s-n,f=e-t,y=h*h+a*a,b=h*m+a*u,x=h*l+a*f,p=m*m+u*u,v=m*l+u*f,S=y*p-b*b;if(Math.abs(S)<1e-12)return!1;let d=1/S,T=(p*x-b*v)*d,L=(y*v-b*x)*d;return T>=-1e-7&&L>=-1e-7&&T+L<=1+1e-7}function Re(s,e){let n=s.slice();xe(n)<0&&n.reverse();let t=n.map(r=>new I(r.x,r.y)),o=n.map((r,i)=>i),c=[];for(let r of e){if(!r||r.length<3)continue;let i=r.slice();xe(i)>0&&i.reverse();let h=[],a=-1/0,m=0;for(let u=0;u<i.length;u++){let l=i[u],f=t.length;t.push(new I(l.x,l.y)),h.push(f),l.x>a&&(a=l.x,m=u)}c.push({pts:i,indices:h,maxX:a,maxIdx:m})}c.sort((r,i)=>i.maxX-r.maxX);for(let r of c){let i=r.pts[r.maxIdx].x,h=r.pts[r.maxIdx].y,a=0,m=1/0;for(let l=0;l<o.length;l++){let f=t[o[l]],y=Math.hypot(f.x-i,f.y-h)+(f.x>=i?0:1e3);y<m&&(m=y,a=l)}let u=[];for(let l=0;l<=a;l++)u.push(o[l]);for(let l=0;l<=r.indices.length;l++){let f=r.indices[(r.maxIdx+l)%r.indices.length];u.push(f)}for(let l=a;l<o.length;l++)u.push(o[l]);o=u}return{merged:o.map(r=>t[r]),mergedIndices:o,allVertices:t}}function Ee(s,e){let n=[],t=s.slice();if(t.length<3)return n;let o=t.length*t.length+64,c=0;for(;t.length>2&&o-- >0;){let r=t.length,i=t[(c+r-1)%r],h=t[c%r],a=t[(c+1)%r],m=e[i],u=e[h],l=e[a];if((u.x-m.x)*(l.y-m.y)-(u.y-m.y)*(l.x-m.x)>1e-9){let y=!0;for(let b=0;b<r;b++){let x=t[b];if(x===i||x===h||x===a)continue;let p=e[x];if(!(Math.hypot(p.x-m.x,p.y-m.y)<1e-6||Math.hypot(p.x-u.x,p.y-u.y)<1e-6||Math.hypot(p.x-l.x,p.y-l.y)<1e-6)&&un(p.x,p.y,m.x,m.y,u.x,u.y,l.x,l.y)){y=!1;break}}if(y){n.push([i,h,a]),t.splice(c%r,1),c=0;continue}}c++,c>=r*2&&(n.push([i,h,a]),t.splice(c%r,1),c=0)}return n}class ln extends ne{constructor(e=new le,n=12){super();let t=Array.isArray(e)?e:[e],o=[],c=[],r=[],i=[];for(let h of t){if(!(h instanceof be))continue;let a=h instanceof le?h.extractPoints(n):{shape:h.getPoints(n),holes:[]};if(a.shape.length<3)continue;let{mergedIndices:m,allVertices:u}=Re(a.shape,a.holes),l=Ee(m,u),f=o.length/3,y=1/0,b=1/0,x=-1/0,p=-1/0;for(let d of u)d.x<y&&(y=d.x),d.y<b&&(b=d.y),d.x>x&&(x=d.x),d.y>p&&(p=d.y);let v=Math.max(1e-6,x-y),S=Math.max(1e-6,p-b);for(let d of u)o.push(d.x,d.y,0),c.push(0,0,1),r.push((d.x-y)/v,(d.y-b)/S);for(let[d,T,L]of l)i.push(f+d,f+T,f+L)}this.setAttribute("position",new X(new Float32Array(o),3)),this.setAttribute("normal",new X(new Float32Array(c),3)),this.setAttribute("uv",new X(new Float32Array(r),2)),this.setIndex(i)}}function hn(s){let e=s.length,n=[];for(let t=0;t<e;t++){let o=s[(t+e-1)%e],c=s[t],r=s[(t+1)%e],i=c.x-o.x,h=c.y-o.y,a=Math.hypot(i,h)||1;i/=a,h/=a;let m=r.x-c.x,u=r.y-c.y,l=Math.hypot(m,u)||1;m/=l,u/=l;let f=h,y=-i,b=u,x=-m,p=f+b,v=y+x,S=Math.hypot(p,v);if(S>1e-6){p/=S,v/=S;let d=Math.max(.35,p*f+v*y);n.push(new I(p/d,v/d))}else n.push(new I(f,y))}return n}class mn extends ne{constructor(e=new le,n={}){super();let t=Array.isArray(e)?e:[e],o=Math.max(1,Math.min(64,Math.floor(Number(n.curveSegments??12)))),c=Number.isFinite(Number(n.depth??n.amount))?Number(n.depth??n.amount):1,r=Math.max(1,Math.min(32,Math.floor(Number(n.steps??1)))),i=!!(n.bevelEnabled??!1),h=i?Math.max(0,Number(n.bevelThickness??.06)):0,a=i?Math.max(0,Number(n.bevelSize??h*.8)):0,m=i?Number(n.bevelOffset??0):0,u=i?Math.max(1,Math.min(8,Math.floor(Number(n.bevelSegments??2)))):0,l=[],f=[],y=[],b=[];for(let x of t){if(!(x instanceof be))continue;let p=x instanceof le?x.extractPoints(o):{shape:x.getPoints(o),holes:[]};if(p.shape.length<3)continue;let v=p.shape.slice();xe(v)<0&&v.reverse();let S=[];for(let g of p.holes){if(g.length<3)continue;let w=g.slice();xe(w)>0&&w.reverse(),S.push(w)}let{mergedIndices:d,allVertices:T}=Re(v,S),L=Ee(d,T),z=[v,...S],k=[];for(let g of z){let w=hn(g);for(let M of w)k.push(M)}let C=1/0,V=1/0,D=-1/0,F=-1/0;for(let g of T)g.x<C&&(C=g.x),g.y<V&&(V=g.y),g.x>D&&(D=g.x),g.y>F&&(F=g.y);let _=Math.max(1e-6,D-C),B=Math.max(1e-6,F-V),te=-h,se=c+h,W=l.length/3;for(let g=0;g<T.length;g++){let w=T[g],M=k[g]??new I(0,0),R=w.x+M.x*m,E=w.y+M.y*m;l.push(R,E,te),f.push(0,0,-1),y.push((R-C)/_,(E-V)/B)}for(let[g,w,M]of L)b.push(W+g,W+M,W+w);let j=l.length/3;for(let g=0;g<T.length;g++){let w=T[g],M=k[g]??new I(0,0),R=w.x+M.x*m,E=w.y+M.y*m;l.push(R,E,se),f.push(0,0,1),y.push((R-C)/_,(E-V)/B)}for(let[g,w,M]of L)b.push(j+g,j+w,j+M);let A=[];if(i&&u>0)for(let g=0;g<u;g++){let M=g/u*Math.PI/2;A.push({z:-h*Math.cos(M),expand:m+a*Math.sin(M)})}for(let g=0;g<=r;g++){let w=g/r;A.push({z:w*c,expand:m+a})}if(i&&u>0)for(let g=1;g<=u;g++){let M=g/u*Math.PI/2;A.push({z:c+h*Math.sin(M),expand:m+a*Math.cos(M)})}let O=0;for(let g of z){let w=g.length;for(let M=0;M<A.length-1;M++){let R=A[M],E=A[M+1];for(let N=0;N<w;N++){let Y=(N+1)%w,H=g[N],U=g[Y],$=k[O+N],Q=k[O+Y],Z=H.x+$.x*R.expand,K=H.y+$.y*R.expand,ee=U.x+Q.x*R.expand,q=U.y+Q.y*R.expand,gn=U.x+Q.x*E.expand,dn=U.y+Q.y*E.expand,Ye=H.x+$.x*E.expand,qe=H.y+$.y*E.expand,We=ee-Z,je=q-K,He=0,Ue=Ye-Z,$e=qe-K,Qe=E.z-R.z,oe=je*Qe-He*$e,re=He*Ue-We*Qe,ie=We*$e-je*Ue,Ge=Math.hypot(oe,re,ie)||1;oe/=Ge,re/=Ge,ie/=Ge;let ce=l.length/3;l.push(Z,K,R.z,ee,q,R.z,gn,dn,E.z,Ye,qe,E.z),f.push(oe,re,ie,oe,re,ie,oe,re,ie,oe,re,ie);let Ze=N/w,Ke=(N+1)/w,Je=M/(A.length-1),en=(M+1)/(A.length-1);y.push(Ze,Je,Ke,Je,Ke,en,Ze,en),b.push(ce,ce+1,ce+2,ce,ce+2,ce+3)}}O+=w}}this.setAttribute("position",new X(new Float32Array(l),3)),this.setAttribute("normal",new X(new Float32Array(f),3)),this.setAttribute("uv",new X(new Float32Array(y),2)),this.setIndex(b)}}function ze(s){return{x:s.x,y:s.y,z:s.z,nx:s.nx,ny:s.ny,nz:s.nz,u:s.u,v:s.v}}function yn(s){return{x:s.x,y:s.y,z:s.z,nx:-s.nx,ny:-s.ny,nz:-s.nz,u:s.u,v:s.v}}function fn(s,e,n){let t=s.nx+(e.nx-s.nx)*n,o=s.ny+(e.ny-s.ny)*n,c=s.nz+(e.nz-s.nz)*n,r=Math.hypot(t,o,c)||1;return{x:s.x+(e.x-s.x)*n,y:s.y+(e.y-s.y)*n,z:s.z+(e.z-s.z)*n,nx:t/r,ny:o/r,nz:c/r,u:s.u+(e.u-s.u)*n,v:s.v+(e.v-s.v)*n}}function Pe(s){if(s.length<3)return null;let e=s[0],n=s[1],t=s[2],o=n.x-e.x,c=n.y-e.y,r=n.z-e.z,i=t.x-e.x,h=t.y-e.y,a=t.z-e.z,m=c*a-r*h,u=r*i-o*a,l=o*h-c*i,f=Math.hypot(m,u,l);if(f<1e-9)return null;m/=f,u/=f,l/=f;let y=m*e.x+u*e.y+l*e.z;return{vertices:s,nx:m,ny:u,nz:l,w:y}}function bn(s){s.vertices.reverse();for(let e=0;e<s.vertices.length;e++)s.vertices[e]=yn(s.vertices[e]);s.nx=-s.nx,s.ny=-s.ny,s.nz=-s.nz,s.w=-s.w}let Ve=1e-5,Ie=0,we=1,pe=2,Ae=3;function Ne(s,e,n,t,o,c,r,i,h){let a=0,m=[];for(let u=0;u<o.vertices.length;u++){let l=o.vertices[u],f=s*l.x+e*l.y+n*l.z-t,y=f<-Ve?pe:f>Ve?we:Ie;a|=y,m.push(y)}switch(a){case Ie:{s*o.nx+e*o.ny+n*o.nz>0?c.push(o):r.push(o);break}case we:i.push(o);break;case pe:h.push(o);break;case Ae:{let u=[],l=[],f=o.vertices.length;for(let y=0;y<f;y++){let b=(y+1)%f,x=m[y],p=m[b],v=o.vertices[y],S=o.vertices[b];if(x!==pe&&u.push(v),x!==we&&l.push(x!==pe?ze(v):v),(x|p)===Ae){let d=S.x-v.x,T=S.y-v.y,L=S.z-v.z,z=s*d+e*T+n*L,k=Math.abs(z)>1e-12?(t-(s*v.x+e*v.y+n*v.z))/z:.5,C=fn(v,S,Math.max(0,Math.min(1,k)));u.push(C),l.push(ze(C))}}if(u.length>=3){let y=Pe(u);y&&i.push(y)}if(l.length>=3){let y=Pe(l);y&&h.push(y)}break}default:break}}class he{constructor(e,n=0){this.nx=0,this.ny=0,this.nz=0,this.w=0,this.hasPlane=!1,this.polygons=[],this.front=null,this.back=null,e&&e.length>0&&this.build(e,n)}invert(){for(let n=0;n<this.polygons.length;n++)bn(this.polygons[n]);this.nx=-this.nx,this.ny=-this.ny,this.nz=-this.nz,this.w=-this.w,this.front&&this.front.invert(),this.back&&this.back.invert();let e=this.front;this.front=this.back,this.back=e}clipPolygons(e,n=0){if(!this.hasPlane||e.length===0||n>=fe)return e.slice();let t=[],o=[];for(let c=0;c<e.length;c++)Ne(this.nx,this.ny,this.nz,this.w,e[c],t,o,t,o);return this.front&&t.length>0&&(t=this.front.clipPolygons(t,n+1)),this.back?o=o.length>0?this.back.clipPolygons(o,n+1):[]:o=[],t.concat(o)}clipTo(e,n=0){this.polygons.length>0&&(this.polygons=e.clipPolygons(this.polygons,0)),n<fe&&(this.front&&this.front.clipTo(e,n+1),this.back&&this.back.clipTo(e,n+1))}allPolygons(e=[]){for(let n=0;n<this.polygons.length;n++)e.push(this.polygons[n]);return this.front&&this.front.allPolygons(e),this.back&&this.back.allPolygons(e),e}build(e,n=0){if(!e.length)return;if(!this.hasPlane){let c=e[0];this.nx=c.nx,this.ny=c.ny,this.nz=c.nz,this.w=c.w,this.hasPlane=!0}if(n>=fe){for(let c=0;c<e.length;c++)this.polygons.push(e[c]);return}let t=[],o=[];for(let c=0;c<e.length;c++)Ne(this.nx,this.ny,this.nz,this.w,e[c],this.polygons,this.polygons,t,o);t.length>0&&(this.front||(this.front=new he),this.front.build(t,n+1)),o.length>0&&(this.back||(this.back=new he),this.back.build(o,n+1))}}function _e(s,e){let n=s.attributes.position;if(!n||n.count===0)return[];let t=s.attributes.normal,o=s.attributes.uv,c=s.index?s.index.array:null,r=Math.floor(c?c.length/3:n.count/3);if(r>ue)throw new RangeError(`SecurityError: CSG input triangle count (${r}) exceeds MAX_CSG_TRIANGLES (${ue})`);let i=e?e.elements:null,h=i?i[0]*(i[5]*i[10]-i[9]*i[6])-i[4]*(i[1]*i[10]-i[9]*i[2])+i[8]*(i[1]*i[6]-i[5]*i[2])<0:!1,a=u=>{let l=n.getX(u),f=n.getY(u),y=n.getZ(u),b=t?t.getX(u):0,x=t?t.getY(u):0,p=t?t.getZ(u):1;if(i){let d=i[0]*l+i[4]*f+i[8]*y+i[12],T=i[1]*l+i[5]*f+i[9]*y+i[13],L=i[2]*l+i[6]*f+i[10]*y+i[14];l=d,f=T,y=L;let z=i[0]*b+i[4]*x+i[8]*p,k=i[1]*b+i[5]*x+i[9]*p,C=i[2]*b+i[6]*x+i[10]*p,V=Math.hypot(z,k,C)||1;b=z/V,x=k/V,p=C/V}let v=o?o.getX(u):0,S=o?o.getY(u):0;return{x:l,y:f,z:y,nx:b,ny:x,nz:p,u:v,v:S}},m=[];for(let u=0;u<r;u++){let l=c?c[u*3]:u*3,f=c?c[u*3+1]:u*3+1,y=c?c[u*3+2]:u*3+2,b=Pe(h?[a(l),a(y),a(f)]:[a(l),a(f),a(y)]);b&&m.push(b)}return m}function xn(s){let e=[],n=[],t=[],o=[];for(let r of s){let i=r.vertices;if(i.length<3)continue;let h=e.length/3;for(let a of i)e.push(a.x,a.y,a.z),n.push(r.nx,r.ny,r.nz),t.push(a.u,a.v);for(let a=1;a<i.length-1;a++)o.push(h,h+a,h+a+1)}let c=new ne;return c.setAttribute("position",new X(new Float32Array(e),3)),c.setAttribute("normal",new X(new Float32Array(n),3)),c.setAttribute("uv",new X(new Float32Array(t),2)),c.setIndex(o),c}function pn(s,e,n){if(s.length+e.length>ue)throw new RangeError(`SecurityError: Combined CSG triangle count (${s.length+e.length}) exceeds MAX_CSG_TRIANGLES (${ue})`);if(s.length===0)return n==="union"?e:[];if(e.length===0)return n==="intersect"?[]:s;let t=new he(s),o=new he(e);return n==="union"?(t.clipTo(o),o.clipTo(t),o.invert(),o.clipTo(t),o.invert(),t.build(o.allPolygons()),t.allPolygons()):n==="subtract"?(t.invert(),t.clipTo(o),o.clipTo(t),o.invert(),o.clipTo(t),o.invert(),t.build(o.allPolygons()),t.invert(),t.allPolygons()):(t.invert(),o.clipTo(t),o.invert(),t.clipTo(o),o.clipTo(t),t.build(o.allPolygons()),t.invert(),t.allPolygons())}function Xe(s,e,n,t=null,o=null){let c=_e(s,t),r=_e(e,o);return xn(pn(c,r,n))}function Me(s,e,n){let t=s instanceof ye||!!s?.isMesh,o=e instanceof ye||!!e?.isMesh,c=t?s.geometry:s,r=o?e.geometry:e,i=null;if(o)if(e.updateMatrix(),t){s.updateMatrix();let u=new Se().makeScale(1/(s.scale.x||1),1/(s.scale.y||1),1/(s.scale.z||1)),l=Math.hypot(s.quaternion.x,s.quaternion.y,s.quaternion.z,s.quaternion.w)||1,f=new Se().compose(new ae(0,0,0),new J(-s.quaternion.x/l,-s.quaternion.y/l,-s.quaternion.z/l,s.quaternion.w/l),new ae(1,1,1)),y=new Se().makeTranslation(-s.position.x,-s.position.y,-s.position.z);i=u.multiply(f).multiply(y).multiply(e.matrix)}else i=e.matrix;let h=Xe(c,r,n,null,i),a=t?s.material:new Te,m=new ye(h,a);return t&&(m.position.copy(s.position),m.quaternion.copy(s.quaternion),m.scale.copy(s.scale),m.name=s.name),m}let ge={toGeometry:Xe,subtract(s,e){return Me(s,e,"subtract")},union(s,e){return Me(s,e,"union")},intersect(s,e){return Me(s,e,"intersect")}},De={0:[[[.15,0],[.85,0],[.85,1],[.15,1],[.15,0]]],1:[[[.3,.8],[.5,1],[.5,0]],[[.2,0],[.8,0]]],2:[[[.15,.8],[.3,1],[.7,1],[.85,.8],[.85,.55],[.15,0],[.85,0]]],3:[[[.15,.85],[.3,1],[.75,1],[.85,.75],[.5,.5],[.85,.25],[.75,0],[.3,0],[.15,.15]]],4:[[[.7,0],[.7,1],[.15,.35],[.9,.35]]],5:[[[.85,1],[.2,1],[.15,.55],[.75,.55],[.85,.3],[.75,0],[.2,0]]],6:[[[.8,.9],[.5,1],[.15,.7],[.15,.15],[.5,0],[.85,.2],[.85,.45],[.5,.55],[.15,.45]]],7:[[[.15,1],[.85,1],[.35,0]]],8:[[[.2,.5],[.15,.75],[.3,1],[.7,1],[.85,.75],[.8,.5],[.2,.5],[.15,.2],[.3,0],[.7,0],[.85,.2],[.8,.5]]],9:[[[.85,.55],[.5,.45],[.15,.55],[.15,.85],[.5,1],[.85,.85],[.85,.2],[.5,0],[.2,.1]]],A:[[[.1,0],[.5,1],[.9,0]],[[.25,.35],[.75,.35]]],B:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.7,.5],[.85,.25],[.7,0],[.15,0]]],C:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.65,0],[.85,.2]]],D:[[[.15,0],[.15,1],[.65,1],[.85,.75],[.85,.25],[.65,0],[.15,0]]],E:[[[.85,1],[.15,1],[.15,0],[.85,0]],[[.15,.5],[.7,.5]]],F:[[[.85,1],[.15,1],[.15,0]],[[.15,.5],[.7,.5]]],G:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.85,0],[.85,.45],[.55,.45]]],H:[[[.15,0],[.15,1]],[[.85,0],[.85,1]],[[.15,.5],[.85,.5]]],I:[[[.25,1],[.75,1]],[[.5,1],[.5,0]],[[.25,0],[.75,0]]],J:[[[.8,1],[.8,.25],[.6,0],[.3,0],[.15,.25]]],K:[[[.15,0],[.15,1]],[[.85,1],[.15,.45],[.85,0]]],L:[[[.15,1],[.15,0],[.85,0]]],M:[[[.1,0],[.1,1],[.5,.35],[.9,1],[.9,0]]],N:[[[.15,0],[.15,1],[.85,0],[.85,1]]],O:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]]],P:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]]],Q:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]],[[.55,.3],[.9,-.05]]],R:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.55,.5],[.85,0]]],S:[[[.85,.85],[.65,1],[.3,1],[.15,.75],[.85,.25],[.7,0],[.3,0],[.15,.15]]],T:[[[.1,1],[.9,1]],[[.5,1],[.5,0]]],U:[[[.15,1],[.15,.25],[.35,0],[.65,0],[.85,.25],[.85,1]]],V:[[[.1,1],[.5,0],[.9,1]]],W:[[[.05,1],[.25,0],[.5,.65],[.75,0],[.95,1]]],X:[[[.15,1],[.85,0]],[[.85,1],[.15,0]]],Y:[[[.15,1],[.5,.5],[.85,1]],[[.5,.5],[.5,0]]],Z:[[[.15,1],[.85,1],[.15,0],[.85,0]]],".":[[[.45,0],[.55,0],[.55,.12],[.45,.12],[.45,0]]],",":[[[.5,.15],[.4,-.1]]],":":[[[.45,.1],[.55,.1]],[[.45,.7],[.55,.7]]],"-":[[[.2,.5],[.8,.5]]],"+":[[[.2,.5],[.8,.5]],[[.5,.2],[.5,.8]]],"=":[[[.2,.35],[.8,.35]],[[.2,.65],[.8,.65]]],"/":[[[.2,0],[.8,1]]],"!":[[[.5,1],[.5,.28]],[[.5,.1],[.5,0]]],"?":[[[.2,.8],[.35,1],[.7,1],[.85,.75],[.5,.45],[.5,.28]],[[.5,.1],[.5,0]]],"(":[[[.65,1],[.35,.65],[.35,.35],[.65,0]]],")":[[[.35,1],[.65,.65],[.65,.35],[.35,0]]],"%":[[[.2,0],[.8,1]],[[.2,.8],[.35,.8],[.35,.95],[.2,.95],[.2,.8]],[[.65,.05],[.8,.05],[.8,.2],[.65,.2],[.65,.05]]],"#":[[[.32,0],[.32,1]],[[.68,0],[.68,1]],[[.12,.35],[.88,.35]],[[.12,.65],[.88,.65]]],$:[[[.8,.8],[.6,.92],[.3,.92],[.18,.72],[.82,.28],[.7,.08],[.4,.08],[.2,.2]],[[.5,1],[.5,0]]],_:[[[.1,0],[.9,0]]],"[":[[[.65,1],[.3,1],[.3,0],[.65,0]]],"]":[[[.35,1],[.7,1],[.7,0],[.35,0]]],"<":[[[.75,.85],[.25,.5],[.75,.15]]],">":[[[.25,.85],[.75,.5],[.25,.15]]],"*":[[[.5,.2],[.5,.8]],[[.2,.35],[.8,.65]],[[.2,.65],[.8,.35]]],"\\":[[[.2,1],[.8,0]]]};class Fe extends ne{constructor(e="",n={}){super();let t=String(e??"").slice(0,Le),o=Math.max(.005,Math.min(100,Number(n.size??.2))),c=!!(n.bevelEnabled??!1),r=c?Math.max(0,Math.min(2,Number(n.bevelThickness??o*.04))):0,i=c?Math.max(0,Math.min(2,Number(n.bevelSize??o*.03))):0,h=Math.max(.001,Math.min(20,Number(n.depth??n.height??o*.2)))+r*2,a=o*.085+i,m=o*.68,u=o*.82,l=[],f=[],y=[],b=[],x=(S,d,T,L,z,k,C)=>{let V=T-S,D=L-d,F=Math.hypot(V,D),_=1,B=0;F>1e-6&&(_=V/F,B=D/F);let te=-B*z,se=_*z,W=_*z*.6,j=B*z*.6,A=S-W+te,O=d-j+se,g=S-W-te,w=d-j-se,M=T+W-te,R=L+j-se,E=T+W+te,N=L+j+se,Y=(H,U,$,Q,Z,K,ee)=>{let q=l.length/3;l.push(H[0],H[1],H[2],U[0],U[1],U[2],$[0],$[1],$[2],Q[0],Q[1],Q[2]),f.push(Z,K,ee,Z,K,ee,Z,K,ee,Z,K,ee),y.push(0,0,1,0,1,1,0,1),b.push(q,q+1,q+2,q,q+2,q+3)};Y([A,O,C],[g,w,C],[M,R,C],[E,N,C],0,0,1),Y([g,w,k],[A,O,k],[E,N,k],[M,R,k],0,0,-1),Y([A,O,k],[g,w,k],[g,w,C],[A,O,C],-_,-B,0),Y([M,R,k],[E,N,k],[E,N,C],[M,R,C],_,B,0),Y([g,w,k],[M,R,k],[M,R,C],[g,w,C],-B,_,0),Y([E,N,k],[A,O,k],[A,O,C],[E,N,C],B,-_,0)},p=0,v=0;for(let S=0;S<t.length;S++){let d=t[S];if(d===`
18
+ `){p=0,v-=o*1.35;continue}if(d===" "){p+=u*.75;continue}let T=d.toUpperCase(),L=d!==T&&d>="a"&&d<="z",z=De[T]??De["?"],k=L?o*.76:o,C=L?m*.88:m;for(let V of z)for(let D=0;D<V.length-1;D++){let F=V[D],_=V[D+1];x(p+F[0]*C,v+F[1]*k,p+_[0]*C,v+_[1]*k,a,-h*.5,h*.5)}p+=L?u*.88:u}this.setAttribute("position",new X(new Float32Array(l),3)),this.setAttribute("normal",new X(new Float32Array(f),3)),this.setAttribute("uv",new X(new Float32Array(y),2)),this.setIndex(b),n.center!==!1?this.center():this.computeBoundingBox()}}function Be(s){if(!s)return;let e=s,n=s.userData?.xr?.text;if(n!=null&&n!==!1){let o=e.geometry?.attributes?.position;if(!o||o.count===0){let c="",r=.08,i=.015,h;if(typeof n=="string"||typeof n=="number")c=String(n);else if(typeof n=="object"){let a=n;c=String(a.text??a.value??""),a.size!==void 0&&(r=Number(a.size)||.08),(a.depth!==void 0||a.height!==void 0)&&(i=Number(a.depth??a.height)||r*.2),(typeof a.color=="string"||typeof a.color=="number")&&(h=a.color)}c.trim().length>0&&(e.geometry=new Fe(c,{size:r,depth:i}),e.material instanceof an?h!==void 0&&s.userData._autoTextColorApplied!==!0&&(e.material.color=new cn(h),s.userData._autoTextColorApplied=!0):e.material=new Te({color:h??16317180}))}}let t=s.userData?.csg;if(t&&typeof t=="object"&&s.userData._csgApplied!==!0&&e.geometry instanceof ne&&e.geometry.attributes.position?.count>0){s.userData._csgApplied=!0;let o=Array.isArray(t)?t:[t];for(let c of o){if(!c||typeof c!="object")continue;let r=c,i=String(r.op??r.operation??"subtract"),h=i==="union"||i==="intersect"?i:"subtract",a=r.target??r.mesh??r.geometry;if(a instanceof ye||a instanceof ne){let m=h==="union"?ge.union(e,a):h==="intersect"?ge.intersect(e,a):ge.subtract(e,a);e.geometry=m.geometry}}}}let Oe={Path:be,Shape:le,ShapeGeometry:ln,ExtrudeGeometry:mn,TextGeometry:Fe,CSG:ge,MAX_CSG_TRIANGLES:ue,MAX_BSP_DEPTH:fe,MAX_TEXT_GEOMETRY_CHARS:Le,materializeDeclarativeGeometry:Be};return G&&typeof G=="object"&&(G.authorNamespace||(G.authorNamespace={}),Object.assign(G.authorNamespace,Oe),G.materializeDeclarativeGeometry=Be),Oe}var ke={name:"cad",onRegister(){nn(ve);let P=me(),G=P.threeNamespace??(typeof globalThis<"u"?globalThis.THREE:void 0);G&&ve(G,P)}};tn(ke);return Gn(Cn);})();