@es3d/es3d 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/es3d-stage.min.js +32 -32
- package/browser/es3d.min.js +73 -73
- package/package.json +1 -1
- package/src/render/geometry-pool.js +103 -41
- package/src/render/webgl2/webgl2-backend.js +68 -16
- package/src/render/webgpu/webgpu-backend.js +42 -11
|
@@ -6,7 +6,7 @@ var e=typeof WorkerGlobalScope<`u`&&typeof self<`u`&&self instanceof WorkerGloba
|
|
|
6
6
|
`,t);return n<0&&(n=this.n),this.i=n,{type:M.COMMENT,text:e.slice(t+2,n).replace(/\r$/,``),start:r,end:n,line:!0}}if(n===42){let n=e.indexOf(`*/`,t+2);return n<0&&this.fail(`E_UNTERMINATED_COMMENT`,`Unterminated comment: missing '*/'.`,t,2),this.i=n+2,{type:M.COMMENT,text:e.slice(t+2,n),start:r,end:n+2,line:!1}}}switch(n){case 123:return this.i=t+1,{type:M.LBRACE,start:r,end:t+1};case 125:return this.i=t+1,{type:M.RBRACE,start:r,end:t+1};case 59:return this.i=t+1,{type:M.SEMI,start:r,end:t+1};case 61:return this.i=t+1,this.afterEq=!0,{type:M.EQ,start:r,end:t+1};case 34:{let e=this.readQuoted(t);return this.i=e.end,{type:M.STRING,value:e.value,start:r,end:e.end,valueStart:r+1,valueEnd:e.end-1}}case 35:case 64:{let i=t+1;for(P(e.charCodeAt(i))||this.fail(`E_SYNTAX`,n===35?`Expected an id after '#'.`:`Expected a reference id after '@'.`,t,1);i<this.n&&F(e.charCodeAt(i));)i++;return this.i=i,{type:n===35?M.ID:M.REF,value:e.slice(t+1,i),start:r,end:i}}}if(P(n)){let n=t+1;for(;n<this.n&&F(e.charCodeAt(n));)n++;return this.i=n,{type:M.NAME,value:e.slice(t,n),start:r,end:n}}this.fail(`E_SYNTAX`,`Unexpected character '${e[t]}'.`,t,1)}},ne=new Set([`es3d`,`v3d`]);function re(e,t=new s(e)){let o=new te(e,t),c=[],d=(e=0)=>{for(;c.length<=e;)c.push(o.next());return c[e]},f=()=>c.length?c.shift():o.next(),p=(e,n,r,i=1,a={})=>{let o=new l({code:e,message:n,offset:r,length:i,...a});throw o.locate(t),new u([o],t)},m=e=>{let n=t.position(e);return`line ${n.line}, column ${n.column}`};function h(e){let t=e.nameEnd;for(;;){let r=d();if(r.type===M.ID||r.type===M.REF){f();let i=r.type===M.ID?`id`:`ref`;e.attrNode(i)&&p(`E_DUPLICATE_ATTRIBUTE`,`Duplicate attribute '${i}' on ${e.name}.`,r.start,r.end-r.start),e.attrs.push(new n(i,r.value,r.start,r.start+1,r.start+1,r.end,r.type===M.ID?`#`:`@`)),t=r.end}else if(r.type===M.STRING)f(),e.text!==null&&p(`E_SYNTAX`,`${e.name} already has text content.`,r.start,r.end-r.start),e.text=r.value,e.textStart=r.start,e.textEnd=r.end,t=r.end;else if(r.type===M.NAME&&d(1).type===M.EQ){f(),f();let i=f();i.type!==M.VALUE&&p(`E_MISSING_VALUE`,`Expected a value for attribute '${r.value}'.`,i.start,1);for(let t of e.attrs)t.name===r.value&&p(`E_DUPLICATE_ATTRIBUTE`,`Duplicate attribute '${r.value}' on ${e.name}.`,r.start,r.end-r.start);let a=new n(r.value,i.value,r.start,r.end,i.valueStart,i.valueEnd,i.quote);a.decoded=!!i.escaped,e.attrs.push(a),t=i.end}else break}e.openEnd=t}function g(e,t){for(;;){let n=d();if(n.type===M.EOF){t&&p(`E_UNCLOSED_ELEMENT`,`Unclosed block of '${e.name}' (opened at ${m(t.start)}): missing '}'.`,t.start,1);return}if(n.type===M.RBRACE){t||p(`E_UNEXPECTED_CLOSE`,`Unexpected '}': no block is open.`,n.start,1),f(),e.closeStart=n.start,e.end=n.end;return}n.type===M.SEMI?f():n.type===M.COMMENT?(f(),e.appendChild(new r(n.text,n.start,n.end))):n.type===M.NAME?(d(1).type===M.EQ&&p(`E_SYNTAX`,`Attribute '${n.value}' must follow an element name.`,n.start,n.end-n.start,{hint:`Attributes belong to the element written before them on the same statement.`}),e.appendChild(_())):(n.type===M.LBRACE&&p(`E_SYNTAX`,`Unexpected '{': a block must follow an element name.`,n.start,1),(n.type===M.STRING||n.type===M.ID||n.type===M.REF)&&p(`E_SYNTAX`,`Expected an element name.`,n.start,n.end-n.start),p(`E_SYNTAX`,`Unexpected token.`,n.start,Math.max(1,n.end-n.start)))}}function _(){let e=f(),t=new i(e.value,e.start);if(t.nameStart=e.start,t.nameEnd=e.end,h(t),t.end=t.openEnd,d().type===M.LBRACE){let e=f();t.selfClosing=!1,g(t,e)}else t.selfClosing=!0;return t}let v=[];for(;d().type===M.COMMENT||d().type===M.SEMI;){let e=f();e.type===M.COMMENT&&v.push(new r(e.text,e.start,e.end))}let y=d();y.type===M.EOF&&p(`E_EMPTY_DOCUMENT`,`Empty document: expected 'es3d version=1'.`,y.start,0),y.type===M.NAME&&ne.has(y.value)||p(`E_COMPACT_ROOT`,`An ES3D compact document must start with the root element 'es3d'.`,y.start,Math.max(1,y.end-y.start),{hint:`Begin the file with: es3d version=1`});let b=f(),x=new i(b.value,b.start);x.nameStart=b.start,x.nameEnd=b.end,h(x),x.end=x.openEnd;let S=[];if(d().type===M.LBRACE){let e=f();for(x.selfClosing=!1,g(x,e);;){let e=d();if(e.type===M.EOF)break;e.type===M.COMMENT?(f(),S.push(new r(e.text,e.start,e.end))):e.type===M.SEMI?f():p(`E_MULTIPLE_ROOTS`,`Content after the end of the root block.`,e.start,Math.max(1,e.end-e.start))}}else x.headerForm=!0,g(x,null),x.selfClosing=x.children.length===0,x.end=e.length;let C=new a({root:x,syntax:`compact`,source:e,leading:v,trailing:S});return C.lineIndex=t,C}var ie=1e5,ae=1e6,oe={id:{type:`id`,desc:`Unique identifier, referenced by <use ref>, material="…" and path="…".`},name:{type:`string`,desc:`Human readable label shown in tools.`}},se={transform:{type:`transform`,alias:`t`,desc:`SVG-style transform list; applied outside position/rotation/scale.`},position:{type:`vec3`,alias:`p`,default:[0,0,0],desc:`Translation x,y,z.`},rotation:{type:`vec3`,alias:`rot`,default:[0,0,0],desc:`Euler angles in degrees, applied about X, then Y, then Z.`},scale:{type:`scale3`,alias:`sc`,default:[1,1,1],desc:`Uniform scale or x,y,z.`},visible:{type:`bool`,default:!0,desc:`When false the element and its children are not rendered.`}},ce={material:{type:`ref`,ref:`material`,alias:`m`,desc:`Material id. Inherited by descendants, like SVG fill.`},color:{type:`color`,alias:`c`,desc:`Base colour override. Inherited by descendants.`}},I={...oe,...se,...ce,collide:{type:`bool`,default:!0,desc:`When false the camera may pass through the element and its children (see <controls collide>).`}},le={d:{type:`path2d`,desc:`SVG path data in the local XY plane (y up): M L H V C S Q T A Z.`},path:{type:`ref`,ref:`path`,desc:`Id of a <path> element whose d is used.`},fillRule:{type:`enum`,values:[`nonzero`,`evenodd`],default:`nonzero`,desc:`How nested contours become holes (SVG fill-rule).`}},L={exclusiveMin:0};function ue(e,t,n,r=t=>e[t]!==void 0){!r(`d`)&&!r(`path`)?t(null,`Missing path data: give either d="…" or path="id".`,`E_MISSING_ATTRIBUTE`):r(`d`)&&r(`path`)&&t(`path`,`Give either d or path, not both.`,`E_CONFLICTING_ATTRIBUTES`)}var de=[`box`,`sphere`,`cylinder`,`cone`,`capsule`,`plane`,`torus`,`line`,`polyline`,`polygon`,`path`,`extrude`,`revolve`,`sweep`,`gear`,`mesh`],fe=[`group`,`repeat`,`scatter`,`lod`],pe=[...de,...fe,`use`,`light`,`camera`,`material`],me={es3d:{category:`root`,children:[`title`,`desc`,`defs`,`scene`,`environment`,`controls`,...pe],desc:`Root element of an ES3D document.`,attrs:{version:{type:`string`,required:!0,desc:`Format version; this implementation reads version 1.`},unit:{type:`enum`,values:[`m`,`cm`,`mm`,`km`,`in`,`ft`],default:`m`,desc:`Length unit (informative).`},xmlns:{type:`string`,desc:`Optional. Ignored if present. A namespace is not required.`},name:oe.name},check(e,t){e.version!==void 0&&!/^1(\.\d+)?$/.test(String(e.version).trim())&&t(`version`,`Unsupported ES3D version '${e.version}'. This reader supports version 1.`,`E_VERSION`)}},title:{category:`meta`,children:`text`,desc:`Document title.`,attrs:{}},desc:{category:`meta`,children:`text`,desc:`Free text description.`,attrs:{}},defs:{category:`defs`,children:[...pe],desc:`Definitions that are not rendered directly; referenced with <use ref>.`,attrs:{}},scene:{category:`container`,children:[...pe,`environment`,`controls`],desc:`Optional wrapper for scene content; behaves like a group.`,attrs:{...I}},environment:{category:`meta`,children:[],desc:`Background and ambient (hemisphere) lighting.`,attrs:{background:{type:`color`,default:[.09,.1,.12,1],desc:`Clear colour.`},sky:{type:`color`,default:[.8,.86,.95,1],desc:`Ambient light colour from above.`},ground:{type:`color`,default:[.25,.22,.2,1],desc:`Ambient light colour from below.`},intensity:{type:`number`,min:0,default:.5,desc:`Ambient / environment intensity.`},exposure:{type:`number`,exclusiveMin:0,default:1,desc:`Tone mapping exposure.`}}},controls:{category:`meta`,children:[],desc:`How a viewer lets people move the camera: orbit limits, collision with the scene, or a camera driven by page scroll.`,attrs:{mode:{type:`enum`,values:[`orbit`,`scroll`,`none`],default:`orbit`,desc:`orbit: drag to orbit, pan and zoom. scroll: the first camera follows its scroll-timeline animations and dragging is off. none: a fixed view.`},zoom:{type:`bool`,default:!0,desc:`Allow zooming (orbit mode).`},pan:{type:`bool`,default:!0,desc:`Allow panning (orbit mode).`},minDistance:{type:`number`,...L,desc:`Closest the camera may get to its target.`},maxDistance:{type:`number`,...L,desc:`Farthest the camera may get from its target.`},minPolar:{type:`angle`,min:0,max:180,default:0,desc:`Smallest angle between the view from the target and straight up, in degrees (0 = from directly above).`},maxPolar:{type:`angle`,min:0,max:180,default:180,desc:`Largest angle from straight up, in degrees (90 = never below the target).`},targetMin:{type:`vec3`,desc:`Lower corner of the box the orbit target must stay in (limits panning).`},targetMax:{type:`vec3`,desc:`Upper corner of the box the orbit target must stay in.`},collide:{type:`bool`,default:!1,desc:`Stop the camera at surfaces instead of letting it pass into objects. Elements with collide="false" are ignored.`}},check(e,t,n,r=t=>e[t]!==void 0){e.minDistance!==void 0&&e.maxDistance!==void 0&&e.maxDistance<e.minDistance&&t(`maxDistance`,`maxDistance must not be smaller than minDistance.`,`E_RANGE`),e.minPolar!==void 0&&e.maxPolar!==void 0&&e.maxPolar<e.minPolar&&t(`maxPolar`,`maxPolar must not be smaller than minPolar.`,`E_RANGE`),r(`targetMin`)!==r(`targetMax`)&&t(r(`targetMin`)?`targetMin`:`targetMax`,`Give both targetMin and targetMax.`,`E_MISSING_ATTRIBUTE`),e.targetMin&&e.targetMax&&e.targetMin.some((t,n)=>t>e.targetMax[n])&&t(`targetMax`,`targetMax must not be smaller than targetMin on any axis.`,`E_RANGE`)}},material:{category:`resource`,children:[],desc:`Minimal physically based material (metallic/roughness).`,attrs:{...oe,color:{type:`color`,alias:`c`,default:[.8,.8,.8,1],desc:`Base colour (sRGB).`},metallic:{type:`number`,min:0,max:1,default:0,desc:`0 = dielectric, 1 = metal.`},roughness:{type:`number`,min:0,max:1,default:.5,desc:`0 = mirror, 1 = fully rough.`},opacity:{type:`number`,min:0,max:1,default:1,desc:`Alpha; values below 1 are blended.`},emissive:{type:`color`,default:[0,0,0,1],desc:`Emitted colour.`},emissiveIntensity:{type:`number`,min:0,default:1,desc:`Multiplier for emissive.`},map:{type:`texture`,desc:`Base colour texture: image URL or checker(), grid(), stripes(), noise(), bricks().`},normalMap:{type:`normalTexture`,desc:`Normal map: image URL or bumps(), tiles(), noise(), waves(), bricks().`},normalScale:{type:`number`,default:1,desc:`Normal map strength.`},uvScale:{type:`vec2`,default:[1,1],desc:`Texture repeat in u and v.`},doubleSided:{type:`bool`,default:!1,desc:`Render back faces too.`},unlit:{type:`bool`,default:!1,desc:`Ignore lighting; output the base colour.`},occlusionMap:{type:`texture`,desc:`Occlusion texture. The red channel darkens indirect light. Image URL or a procedural texture.`},occlusionStrength:{type:`number`,min:0,max:1,default:1,desc:`Strength of occlusionMap. 0 disables it, 1 uses the texture as stored.`},metallicRoughnessMap:{type:`texture`,desc:`Packed texture: green multiplies roughness, blue multiplies metallic.`},emissiveMap:{type:`texture`,desc:`sRGB texture multiplied with emissive.`},alphaMode:{type:`enum`,values:[`auto`,`opaque`,`mask`,`blend`],default:`auto`,desc:`auto blends when opacity is below 1 and is opaque otherwise. mask discards fragments below alphaCutoff. blend uses opacity as coverage. opaque ignores alpha.`},alphaCutoff:{type:`number`,min:0,max:1,default:.5,desc:`Mask threshold.`}}},group:{category:`container`,children:[...pe,`animate`],desc:`Groups children under a common transform and style.`,attrs:{...I}},use:{category:`instance`,children:[`animate`],desc:`Instantiates the element with the given id (like SVG <use>).`,attrs:{...I,ref:{type:`ref`,ref:`node`,required:!0,alias:`href`,desc:`Id of the element to instantiate.`}}},repeat:{category:`container`,children:[...pe,`animate`],desc:`Repeats its children count times; copy i is transformed by step applied i times.`,attrs:{...I,count:{type:`int`,alias:`n`,required:!0,min:0,max:ae,desc:`Number of copies.`},step:{type:`transform`,required:!0,desc:`Transform applied cumulatively between copies.`}}},scatter:{category:`container`,children:[...pe,`animate`],desc:`Deterministic pseudo-random or grid placement of its children (seeded mulberry32).`,attrs:{...I,count:{type:`int`,alias:`n`,min:0,max:ae,desc:`Number of random copies (random layout).`},grid:{type:`count2`,desc:`Grid layout nx,nz (instead of count).`},spacing:{type:`vec2`,default:[1,1],desc:`Grid cell size x,z.`},area:{type:`size2`,desc:`Random layout: rectangle width,depth centred at the origin (XZ plane).`},radius:{type:`number`,...L,desc:`Random layout: disc radius (XZ plane).`},seed:{type:`int`,default:1,min:0,desc:`Random seed.`},jitter:{type:`number`,min:0,max:1,default:0,desc:`Grid layout: random offset as a fraction of the cell.`},randomScale:{type:`range3`,desc:`Per-copy scale: a range (uniform, e.g. 0.8..1.2) or x,y,z ranges.`},randomRotation:{type:`range3`,uniform:!1,desc:`Per-copy Euler ranges in degrees, e.g. 0,0..360,0.`},randomMaterial:{type:`idlist`,ref:`material`,desc:`Per-copy material chosen from this list of ids.`}},check(e,t,n,r=t=>e[t]!==void 0){let i=r(`grid`),a=r(`count`);i&&a?t(`grid`,`Give either count (random layout) or grid (grid layout), not both.`,`E_CONFLICTING_ATTRIBUTES`):!i&&!a&&t(null,`scatter needs count="…" (random layout) or grid="nx,nz" (grid layout).`,`E_MISSING_ATTRIBUTE`),a&&!r(`area`)&&!r(`radius`)&&t(null,`Random scatter needs area="w,d" or radius="r".`,`E_MISSING_ATTRIBUTE`),r(`area`)&&r(`radius`)&&t(`radius`,`Give either area or radius, not both.`,`E_CONFLICTING_ATTRIBUTES`),e.area&&(e.area[0]<0||e.area[1]<0)&&t(`area`,`area must not be negative.`,`E_RANGE`),e.randomScale&&e.randomScale.ranges.some(e=>e[0]<0)&&t(`randomScale`,`Scale ranges must not be negative.`,`E_RANGE`)}},lod:{category:`container`,children:[...pe,`animate`],desc:`Level of detail switch: child i is shown while the camera distance is below distances[i].`,attrs:{...I,distances:{type:`numbers`,required:!0,desc:`Increasing switch distances; one fewer than the number of children.`}},check(e,t,n){let r=e.distances;if(!r)return;for(let e=1;e<r.length;e++)r[e]<=r[e-1]&&t(`distances`,`distances must be strictly increasing.`,`E_RANGE`);r.some(e=>e<=0)&&t(`distances`,`distances must be positive.`,`E_RANGE`);let i=n.children.filter(e=>e.type===`element`&&e.name!==`animate`).length;i!==r.length+1&&t(`distances`,`lod has ${i} children but ${r.length} distances; it needs exactly one distance fewer than children.`,`E_LOD_CHILDREN`)}},animate:{category:`anim`,children:[],desc:`Animates a transform of its parent (position, rotation, scale; target and fov of a camera) over time or over page scroll.`,attrs:{attr:{type:`enum`,values:[`position`,`rotation`,`scale`,`target`,`fov`],required:!0,desc:`Animated attribute. target and fov apply to <camera> only.`},from:{type:`animValue`,desc:`Start value (defaults to the parent value).`},to:{type:`animValue`,desc:`End value.`},values:{type:`keyframes`,desc:`Key values separated by semicolons, e.g. 0,1,0; 2,1,0; 2,3,0 (instead of from/to).`},keyTimes:{type:`numbers`,desc:`Progress (0 to 1) at which each of values is reached; evenly spaced when omitted.`},along:{type:`spine`,desc:`Path to move along at constant speed (position and target): x,y,z points, 3D path data or helix().`},smooth:{type:`bool`,default:!1,desc:`Pass through values or along points on a smooth (centripetal Catmull-Rom) curve.`},dur:{type:`duration`,desc:`Duration of one cycle, e.g. 4s or 500ms (required unless timeline="scroll").`},begin:{type:`duration`,default:0,min:0,desc:`Delay before the animation starts.`},repeat:{type:`repeatCount`,default:1/0,desc:`Number of cycles or 'indefinite'.`},alternate:{type:`bool`,default:!1,desc:`Play every second cycle backwards.`},easing:{type:`enum`,values:[`linear`,`ease-in`,`ease-out`,`ease-in-out`],default:`linear`,desc:`Timing function.`},timeline:{type:`enum`,values:[`time`,`scroll`],default:`time`,desc:`time: plays by the clock. scroll: progress follows page scroll from 0 to 1 (dur, begin, repeat and alternate are not used).`}},check(e,t,n,r=t=>e[t]!==void 0){let i=[`to`,`values`,`along`].filter(e=>r(e));i.length?i.length>1&&t(i[1],`Give only one of to, values and along (found ${i.join(` and `)}).`,`E_CONFLICTING_ATTRIBUTES`):t(null,`animate needs to="…", values="…" or along="…".`,`E_MISSING_ATTRIBUTE`),r(`from`)&&(r(`values`)||r(`along`))&&t(`from`,`from is only used with to.`,`E_CONFLICTING_ATTRIBUTES`),e.timeline!==`scroll`&&!r(`dur`)&&t(null,`animate requires the attribute 'dur' (or timeline="scroll").`,`E_MISSING_ATTRIBUTE`),e.dur!==void 0&&e.dur<=0&&t(`dur`,`dur must be positive.`,`E_RANGE`);let a=n&&n.parent;(e.attr===`target`||e.attr===`fov`)&&a&&a.name!==`camera`&&t(`attr`,`attr="${e.attr}" can only animate a <camera>.`,`E_INVALID_VALUE`),e.attr===`target`&&a&&a.name===`camera`&&a.attrIndex&&a.attrIndex.rotation&&t(`attr`,`This camera is oriented by rotation; give it a target instead to animate the target.`,`E_CONFLICTING_ATTRIBUTES`),r(`along`)&&e.attr&&e.attr!==`position`&&e.attr!==`target`&&t(`along`,`along can only move position or target.`,`E_INVALID_VALUE`);let o=e.attr===`scale`?[1,3]:e.attr===`fov`?[1,1]:[3,3],s=`${e.attr||`value`} animation values need ${o[0]===o[1]?o[0]:`1 or 3`} number${o[1]===1?``:`s`}`;for(let n of[`from`,`to`])e[n]!==void 0&&!o.includes(e[n].length)&&t(n,`${s}.`,`E_TYPE`);if(e.values){e.values.length<2&&t(`values`,`values needs at least 2 key values.`,`E_RANGE`);let n=e.values.findIndex(e=>!o.includes(e.length));n>=0&&t(`values`,`${s}; key value ${n+1} has ${e.values[n].length}.`,`E_TYPE`)}r(`keyTimes`)&&!r(`values`)&&t(`keyTimes`,`keyTimes needs values.`,`E_MISSING_ATTRIBUTE`);let c=e.keyTimes;c&&e.values&&(c.length===e.values.length?c[0]!==0||c[c.length-1]!==1?t(`keyTimes`,`keyTimes must start at 0 and end at 1.`,`E_RANGE`):c.some((e,t)=>t>0&&e<c[t-1])&&t(`keyTimes`,`keyTimes must not decrease.`,`E_RANGE`):t(`keyTimes`,`keyTimes has ${c.length} entries but values has ${e.values.length}.`,`E_RANGE`))}},camera:{category:`camera`,children:[`animate`],desc:`Perspective or orthographic camera. The first camera is the initial view.`,attrs:{...oe,transform:se.transform,position:{type:`vec3`,alias:`p`,default:[0,0,10],desc:`Eye position.`},rotation:{type:`vec3`,alias:`rot`,desc:`Euler orientation (used when no target is given; the camera looks down -Z).`},target:{type:`vec3`,desc:`Point the camera looks at.`},up:{type:`vec3`,default:[0,1,0],desc:`Up vector.`},type:{type:`enum`,values:[`perspective`,`orthographic`],default:`perspective`,desc:`Projection.`},fov:{type:`angle`,min:1,max:179,default:45,desc:`Vertical field of view in degrees (perspective).`},height:{type:`number`,...L,default:10,desc:`Visible height (orthographic).`},near:{type:`number`,...L,desc:`Near clip distance (automatic when omitted).`},far:{type:`number`,...L,desc:`Far clip distance (automatic when omitted).`},aspect:{type:`number`,...L,default:1,desc:`Width / height of the view the author framed (e.g. 1.778 for 16:9). fov is the vertical angle at this aspect ratio.`},fit:{type:`enum`,values:[`contain`,`cover`,`width`,`height`],default:`contain`,desc:`How the framed view adapts to other screens: contain keeps all of it visible, cover fills the screen, width and height keep that extent fixed.`}},check(e,t){e.near!==void 0&&e.far!==void 0&&e.far<=e.near&&t(`far`,`far must be greater than near.`,`E_RANGE`),e.target!==void 0&&e.rotation!==void 0&&t(`rotation`,`Give either target or rotation, not both.`,`E_CONFLICTING_ATTRIBUTES`)}},light:{category:`light`,children:[`animate`],desc:`Directional, point, spot, ambient or hemisphere light.`,attrs:{...oe,transform:se.transform,position:{type:`vec3`,alias:`p`,default:[0,0,0],desc:`Light position (point/spot).`},rotation:se.rotation,visible:se.visible,type:{type:`enum`,values:[`directional`,`point`,`spot`,`ambient`,`hemisphere`],required:!0,desc:`Light kind.`},color:{type:`color`,alias:`c`,default:[1,1,1,1],desc:`Light colour.`},intensity:{type:`number`,min:0,default:1,desc:`Intensity multiplier.`},direction:{type:`vec3`,alias:`dir`,desc:`Direction the light travels (directional/spot).`},target:{type:`vec3`,desc:`Point the light aims at (alternative to direction).`},range:{type:`number`,min:0,default:0,desc:`Point/spot cut-off distance (0 = unlimited).`},angle:{type:`angle`,min:1,max:179,default:45,desc:`Spot cone angle in degrees.`},penumbra:{type:`number`,min:0,max:1,default:.2,desc:`Spot edge softness.`},groundColor:{type:`color`,default:[.25,.22,.2,1],desc:`Hemisphere light colour from below.`}},check(e,t){e.direction&&Math.hypot(...e.direction)<1e-12&&t(`direction`,`direction must not be the zero vector.`,`E_RANGE`),e.direction!==void 0&&e.target!==void 0&&t(`target`,`Give either direction or target, not both.`,`E_CONFLICTING_ATTRIBUTES`)}},box:{category:`shape`,children:[`animate`],desc:`Axis aligned box centred at the origin, optionally with rounded edges.`,attrs:{...I,size:{type:`size3`,alias:`s`,default:[1,1,1],desc:`Edge lengths (one value for a cube).`},radius:{type:`number`,alias:`r`,min:0,default:0,desc:`Edge rounding radius.`},segments:{type:`int`,min:1,max:32,desc:`Rounding segments (automatic when omitted).`}},check(e,t){e.size&&e.size.some(e=>e<=0)&&t(`size`,`size must be positive.`,`E_RANGE`),e.size&&e.radius>0&&e.radius*2>Math.min(...e.size)+1e-12&&t(`radius`,`radius ${e.radius} is larger than half the smallest edge (${Math.min(...e.size)/2}).`,`E_RANGE`)}},sphere:{category:`shape`,children:[`animate`],desc:`Sphere centred at the origin.`,attrs:{...I,radius:{type:`number`,alias:`r`,...L,default:.5,desc:`Radius.`},segments:{type:`int`,min:3,max:512,desc:`Fixed tessellation (automatic level of detail when omitted).`}}},cylinder:{category:`shape`,children:[`animate`],desc:`Cylinder (or truncated cone) along Y, centred at the origin.`,attrs:{...I,radius:{type:`number`,alias:`r`,...L,default:.5,desc:`Bottom radius (and top radius unless radiusTop is set).`},radiusTop:{type:`number`,min:0,desc:`Top radius.`},height:{type:`number`,alias:`h`,...L,default:1,desc:`Height.`},segments:{type:`int`,min:3,max:512,desc:`Fixed number of sides, e.g. 6 for a hexagonal prism.`},caps:{type:`bool`,default:!0,desc:`Close the ends.`}}},cone:{category:`shape`,children:[`animate`],desc:`Cone along Y with its base at -height/2 and apex at +height/2.`,attrs:{...I,radius:{type:`number`,alias:`r`,...L,default:.5,desc:`Base radius.`},height:{type:`number`,alias:`h`,...L,default:1,desc:`Height.`},segments:{type:`int`,min:3,max:512,desc:`Fixed number of sides.`},caps:{type:`bool`,default:!0,desc:`Close the base.`}}},capsule:{category:`shape`,children:[`animate`],desc:`Capsule along Y; height is the total height including both caps.`,attrs:{...I,radius:{type:`number`,alias:`r`,...L,default:.25,desc:`Radius.`},height:{type:`number`,alias:`h`,...L,default:1,desc:`Total height (at least 2 × radius).`},segments:{type:`int`,min:3,max:512,desc:`Fixed tessellation.`}},check(e,t){let n=e.radius??.25,r=e.height??1;r<2*n-1e-12&&t(`height`,`capsule height (${r}) must be at least twice the radius (${2*n}).`,`E_RANGE`)}},plane:{category:`shape`,children:[`animate`],desc:`Flat rectangle in the XZ plane facing +Y (rendered double sided).`,attrs:{...I,size:{type:`size2`,alias:`s`,default:[1,1],desc:`Width (x) and depth (z).`}},check(e,t){e.size&&e.size.some(e=>e<=0)&&t(`size`,`size must be positive.`,`E_RANGE`)}},torus:{category:`shape`,children:[`animate`],desc:`Torus around the Y axis.`,attrs:{...I,radius:{type:`number`,alias:`r`,...L,default:.35,desc:`Distance from the centre to the tube centre.`},tube:{type:`number`,...L,default:.15,desc:`Tube radius.`},arc:{type:`angle`,exclusiveMin:0,max:360,default:360,desc:`Swept angle in degrees (partial torus / pipe elbow).`},segments:{type:`int`,min:3,max:1024,desc:`Fixed segments around the ring.`},tubeSegments:{type:`int`,min:3,max:512,desc:`Fixed segments around the tube.`}}},line:{category:`shape`,children:[`animate`],desc:`Straight line segment; rendered as a tube when radius > 0.`,attrs:{...I,from:{type:`vec3`,required:!0,desc:`Start point.`},to:{type:`vec3`,required:!0,desc:`End point.`},radius:{type:`number`,alias:`r`,min:0,default:0,desc:`Tube radius (0 = hairline).`},segments:{type:`int`,min:3,max:256,desc:`Tube sides.`}},check(e,t){e.from&&e.to&&Math.hypot(e.to[0]-e.from[0],e.to[1]-e.from[1],e.to[2]-e.from[2])<1e-12&&t(`to`,`A line needs two distinct points.`,`E_DEGENERATE`)}},polyline:{category:`shape`,children:[`animate`],desc:`3D polyline or 2D path outline; rendered as a tube when radius > 0.`,attrs:{...I,points:{type:`points3`,desc:`x,y,z x,y,z …`},d:{type:`path2d`,desc:`Outline of 2D path data in the XY plane (alternative to points).`},closed:{type:`bool`,default:!1,desc:`Connect the last point to the first.`},smooth:{type:`bool`,default:!1,desc:`Interpolate the points with a Catmull-Rom spline.`},radius:{type:`number`,alias:`r`,min:0,default:0,desc:`Tube radius (0 = hairline).`},segments:{type:`int`,min:3,max:256,desc:`Tube sides.`}},check(e,t,n,r=t=>e[t]!==void 0){!r(`points`)&&!r(`d`)&&t(null,`polyline needs points="…" or d="…".`,`E_MISSING_ATTRIBUTE`),r(`points`)&&r(`d`)&&t(`d`,`Give either points or d, not both.`,`E_CONFLICTING_ATTRIBUTES`),e.points&&e.points.length<6&&t(`points`,`A polyline needs at least 2 points.`,`E_DEGENERATE`)}},polygon:{category:`shape`,children:[`animate`],desc:`Filled flat polygon in the XY plane (rendered double sided).`,attrs:{...I,points:{type:`points2`,required:!0,desc:`x,y x,y … (at least 3 points).`}},check(e,t){e.points&&e.points.length<6&&t(`points`,`A polygon needs at least 3 points.`,`E_DEGENERATE`)}},path:{category:`shape`,children:[`animate`],desc:`Filled flat 2D path in the XY plane (rendered double sided). In <defs> it is a reusable outline.`,attrs:{...I,...le},check:ue},extrude:{category:`shape`,children:[`animate`],desc:`Extrudes a 2D path along +Z, optionally with a rounded bevel.`,attrs:{...I,...le,depth:{type:`number`,...L,default:1,desc:`Extrusion depth along Z.`},bevel:{type:`number`,min:0,default:0,desc:`Bevel radius on the front and back edges.`},bevelSegments:{type:`int`,min:1,max:16,default:3,desc:`Segments per bevel.`},center:{type:`bool`,default:!1,desc:`Centre the extrusion on z = 0.`}},check(e,t,n,r){ue(e,t,n,r);let i=e.depth??1;e.bevel&&e.bevel*2>i+1e-12&&t(`bevel`,`bevel (${e.bevel}) must be at most half the depth (${i/2}).`,`E_RANGE`)}},revolve:{category:`shape`,children:[`animate`],desc:`Revolves (lathes) a 2D profile around the Y axis; x is the distance from the axis.`,attrs:{...I,...le,angle:{type:`angle`,exclusiveMin:0,max:360,default:360,desc:`Revolution angle in degrees.`},segments:{type:`int`,min:3,max:1024,desc:`Fixed number of radial segments.`}},check:ue},sweep:{category:`shape`,children:[`animate`],desc:`Sweeps a profile (circle or 2D path) along a 3D spine with rotation minimising frames.`,attrs:{...I,...le,radius:{type:`number`,alias:`r`,...L,desc:`Circular profile radius (alternative to d/path).`},along:{type:`spine`,required:!0,desc:`Spine: x,y,z points, 3D path data (M L C S Q T Z) or helix(r,pitch,turns).`},smooth:{type:`bool`,default:!1,desc:`Interpolate spine points with a Catmull-Rom spline.`},twist:{type:`angle`,default:0,desc:`Profile rotation in degrees from start to end.`},taper:{type:`number`,min:0,default:1,desc:`Profile scale at the end (1 = constant).`},caps:{type:`bool`,default:!0,desc:`Close open ends.`},segments:{type:`int`,min:3,max:256,desc:`Circle profile sides.`}},check(e,t,n,r=t=>e[t]!==void 0){let i=r(`d`)||r(`path`);!i&&!r(`radius`)&&t(null,`sweep needs a profile: radius="…" or d="…" / path="…".`,`E_MISSING_ATTRIBUTE`),i&&r(`radius`)&&t(`radius`,`Give either radius or a path profile, not both.`,`E_CONFLICTING_ATTRIBUTES`),r(`d`)&&r(`path`)&&t(`path`,`Give either d or path, not both.`,`E_CONFLICTING_ATTRIBUTES`)}},gear:{category:`shape`,children:[`animate`],desc:`Involute spur gear in the XY plane, extruded along Z.`,attrs:{...I,teeth:{type:`int`,min:5,max:400,default:24,desc:`Number of teeth.`},module:{type:`number`,...L,default:.04,desc:`Module: pitch diameter / teeth.`},pressureAngle:{type:`angle`,min:10,max:35,default:20,desc:`Pressure angle in degrees.`},depth:{type:`number`,...L,default:.2,desc:`Face width (extrusion depth).`},bore:{type:`number`,min:0,default:0,desc:`Radius of the centre hole.`},bevel:{type:`number`,min:0,default:0,desc:`Edge bevel radius.`},center:{type:`bool`,default:!0,desc:`Centre the gear on z = 0.`}},check(e,t){let n=e.teeth??24,r=e.module??.04,i=r*n/2-1.25*r;e.bore&&e.bore>=i*.95&&t(`bore`,`bore (${e.bore}) must be smaller than the root radius (${(i*.95).toFixed(4)}).`,`E_RANGE`);let a=e.depth??.2;e.bevel&&e.bevel*2>a+1e-12&&t(`bevel`,`bevel must be at most half the depth (${a/2}).`,`E_RANGE`)}},mesh:{category:`shape`,children:[`animate`],desc:`Explicit indexed triangle mesh (escape hatch for data that is not procedural).`,attrs:{...I,positions:{type:`floats`,required:!0,desc:`x y z for every vertex.`},indices:{type:`indices`,desc:`Triangle vertex indices (3 per triangle); omitted = non-indexed triangles.`},normals:{type:`floats`,desc:`Optional x y z normal per vertex (computed when omitted).`},uvs:{type:`floats`,desc:`Optional u v per vertex.`},smooth:{type:`angle`,min:0,max:180,default:30,desc:`Crease angle for computed normals (0 = flat).`}},check(e,t){let n=e.positions;if(!n)return;n.length%3!=0&&t(`positions`,`positions needs 3 numbers per vertex; found ${n.length} numbers.`,`E_MESH`);let r=Math.floor(n.length/3);if(r<3&&t(`positions`,`A mesh needs at least 3 vertices.`,`E_MESH`),e.indices){e.indices.length%3!=0&&t(`indices`,`indices must contain 3 entries per triangle; found ${e.indices.length}.`,`E_MESH`);for(let n=0;n<e.indices.length;n++)if(e.indices[n]>=r){t(`indices`,`Index ${e.indices[n]} at position ${n} is out of range (the mesh has ${r} vertices).`,`E_MESH`);break}}else r%3!=0&&t(`positions`,`Without indices the vertex count must be a multiple of 3.`,`E_MESH`);e.normals&&e.normals.length!==n.length&&t(`normals`,`normals must have one x y z per vertex (${n.length} numbers); found ${e.normals.length}.`,`E_MESH`),e.uvs&&e.uvs.length!==r*2&&t(`uvs`,`uvs must have one u v per vertex (${r*2} numbers); found ${e.uvs.length}.`,`E_MESH`);for(let e=0;e<n.length;e++)if(!Number.isFinite(n[e])){t(`positions`,`Non-finite coordinate at position ${e}.`,`E_MESH`);break}}}},he=[`es3d`,`v3d`],ge=new Map;function _e(e){let t=ge.get(e);if(t)return t;t=new Map;let n=me[e===`v3d`?`es3d`:e];if(n)for(let[e,r]of Object.entries(n.attrs))t.set(e,e),r.alias&&t.set(r.alias,e);return ge.set(e,t),t}function ve(e){return me[e===`v3d`?`es3d`:e]||null}function ye(e,t){let n=ve(e);return n&&n.attrs[t]||null}function R(e,t){let n=e.values?e.values[t]:void 0;if(n!==void 0)return n;let r=ye(e.name,t);return r?r.default:void 0}var be=Object.keys(me),z=class extends Error{constructor(e,t=0,n=0,r={}){super(e),this.name=`ValueError`,this.offset=t,this.length=n,this.hint=r.hint||null,this.suggestion=r.suggestion||null,this.code=r.code||null}},xe=new Map(`aliceblue:f0f8ff,antiquewhite:faebd7,aqua:00ffff,aquamarine:7fffd4,azure:f0ffff,beige:f5f5dc,bisque:ffe4c4,black:000000,blanchedalmond:ffebcd,blue:0000ff,blueviolet:8a2be2,brown:a52a2a,burlywood:deb887,cadetblue:5f9ea0,chartreuse:7fff00,chocolate:d2691e,coral:ff7f50,cornflowerblue:6495ed,cornsilk:fff8dc,crimson:dc143c,cyan:00ffff,darkblue:00008b,darkcyan:008b8b,darkgoldenrod:b8860b,darkgray:a9a9a9,darkgreen:006400,darkgrey:a9a9a9,darkkhaki:bdb76b,darkmagenta:8b008b,darkolivegreen:556b2f,darkorange:ff8c00,darkorchid:9932cc,darkred:8b0000,darksalmon:e9967a,darkseagreen:8fbc8f,darkslateblue:483d8b,darkslategray:2f4f4f,darkslategrey:2f4f4f,darkturquoise:00ced1,darkviolet:9400d3,deeppink:ff1493,deepskyblue:00bfff,dimgray:696969,dimgrey:696969,dodgerblue:1e90ff,firebrick:b22222,floralwhite:fffaf0,forestgreen:228b22,fuchsia:ff00ff,gainsboro:dcdcdc,ghostwhite:f8f8ff,gold:ffd700,goldenrod:daa520,gray:808080,green:008000,greenyellow:adff2f,grey:808080,honeydew:f0fff0,hotpink:ff69b4,indianred:cd5c5c,indigo:4b0082,ivory:fffff0,khaki:f0e68c,lavender:e6e6fa,lavenderblush:fff0f5,lawngreen:7cfc00,lemonchiffon:fffacd,lightblue:add8e6,lightcoral:f08080,lightcyan:e0ffff,lightgoldenrodyellow:fafad2,lightgray:d3d3d3,lightgreen:90ee90,lightgrey:d3d3d3,lightpink:ffb6c1,lightsalmon:ffa07a,lightseagreen:20b2aa,lightskyblue:87cefa,lightslategray:778899,lightslategrey:778899,lightsteelblue:b0c4de,lightyellow:ffffe0,lime:00ff00,limegreen:32cd32,linen:faf0e6,magenta:ff00ff,maroon:800000,mediumaquamarine:66cdaa,mediumblue:0000cd,mediumorchid:ba55d3,mediumpurple:9370db,mediumseagreen:3cb371,mediumslateblue:7b68ee,mediumspringgreen:00fa9a,mediumturquoise:48d1cc,mediumvioletred:c71585,midnightblue:191970,mintcream:f5fffa,mistyrose:ffe4e1,moccasin:ffe4b5,navajowhite:ffdead,navy:000080,oldlace:fdf5e6,olive:808000,olivedrab:6b8e23,orange:ffa500,orangered:ff4500,orchid:da70d6,palegoldenrod:eee8aa,palegreen:98fb98,paleturquoise:afeeee,palevioletred:db7093,papayawhip:ffefd5,peachpuff:ffdab9,peru:cd853f,pink:ffc0cb,plum:dda0dd,powderblue:b0e0e6,purple:800080,rebeccapurple:663399,red:ff0000,rosybrown:bc8f8f,royalblue:4169e1,saddlebrown:8b4513,salmon:fa8072,sandybrown:f4a460,seagreen:2e8b57,seashell:fff5ee,sienna:a0522d,silver:c0c0c0,skyblue:87ceeb,slateblue:6a5acd,slategray:708090,slategrey:708090,snow:fffafa,springgreen:00ff7f,steelblue:4682b4,tan:d2b48c,teal:008080,thistle:d8bfd8,tomato:ff6347,turquoise:40e0d0,violet:ee82ee,wheat:f5deb3,white:ffffff,whitesmoke:f5f5f5,yellow:ffff00,yellowgreen:9acd32`.split(`,`).map(e=>e.split(`:`))),Se=/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;function Ce(e){let t=e.trim();if(t[0]===`#`){if(!Se.test(t))return null;let e=t.slice(1);e.length<=4&&(e=[...e].map(e=>e+e).join(``));let n=e.length===6?e+`ff`:e;return[0,2,4,6].map(e=>parseInt(n.slice(e,e+2),16)/255)}let n=t.toLowerCase();if(n===`transparent`)return[0,0,0,0];let r=xe.get(n);if(r)return Ce(`#`+r);let i=/^rgba?\(\s*([^)]*)\)$/i.exec(t);if(i){let e=i[1].split(/\s*,\s*|\s+/).filter(Boolean);if(e.length!==3&&e.length!==4)return null;let t=[];for(let n=0;n<e.length;n++){let r=e[n],i;if(i=r.endsWith(`%`)?Number(r.slice(0,-1))/100:n<3?Number(r)/255:Number(r),!Number.isFinite(i)||i<0||i>1)return null;t.push(i)}return t.length===3&&t.push(1),t}return null}function we(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function Te(e){return[we(e[0]),we(e[1]),we(e[2]),e[3]]}function Ee(e){let t=e=>Math.round(Math.max(0,Math.min(1,e))*255).toString(16).padStart(2,`0`),n=`#`+t(e[0])+t(e[1])+t(e[2]);return e[3]!==void 0&&e[3]<1?n+t(e[3]):n}var B=class extends Error{constructor(e,t,n=1,r=null){super(e),this.name=`PathError`,this.offset=t,this.length=n,this.code=r}},De={M:2,L:2,H:1,V:1,C:6,S:4,Q:4,T:2,A:7,Z:0},Oe={M:3,L:3,C:9,S:6,Q:6,T:3,Z:0};function ke(e){return e===32||e===9||e===10||e===13||e===12}var Ae=Array.from({length:23},(e,t)=>Number(`1e${t}`)),je=0;function Me(e,t){let n=t,r=e.charCodeAt(t),i=r===45;(r===43||r===45)&&(r=e.charCodeAt(++t));let a=0,o=t;for(;r>=48&&r<=57;)a=a*10+(r-48),r=e.charCodeAt(++t);let s=t-o,c=0;if(r===46){let n=++t;for(r=e.charCodeAt(t);r>=48&&r<=57;)a=a*10+(r-48),r=e.charCodeAt(++t);c=t-n,s+=c}if(!s)return-1;let l=0;if(r===101||r===69){let n=t+1,r=e.charCodeAt(n),i=r===45;if((r===43||r===45)&&(r=e.charCodeAt(++n)),r>=48&&r<=57){for(;r>=48&&r<=57;)l=l*10+(r-48),r=e.charCodeAt(++n);i&&(l=-l),t=n}}if(l-=c,a>9007199254740992||l>22||l<-22)je=Number(e.slice(n,t));else{let e=l>=0?a*Ae[l]:a/Ae[-l];je=i?-e:e}return t}function Ne(e,t=2){let n=t===3?Oe:De,r=e.length,i=0,a=[],o=0,s=0,c=0,l=0,u=0,d=0,f=0,p=0,m=0,h=``,g=``,_=0,v=!1,y=()=>{for(;i<r&&ke(e.charCodeAt(i));)i++},b=()=>{y(),e.charCodeAt(i)===44&&(i++,y())},x=()=>{b();let t=Me(e,i);if(t<0)throw i>=r?new B(`Command '${g}' expects ${n[g.toUpperCase()]} numbers but the path data ended.`,Math.max(0,r-1),1):new B(`Expected a number in '${g}' command but found '${e[i]}'.`,i,1);return i=t,je},S=()=>{b();let t=e.charCodeAt(i);if(t!==48&&t!==49)throw new B(`Arc flags must be '0' or '1'.`,i,1);return i++,+(t===49)},C=()=>{let t=i;for(;t<r&&ke(e.charCodeAt(t));)t++;if(e.charCodeAt(t)===44)for(t++;t<r&&ke(e.charCodeAt(t));)t++;let n=e.charCodeAt(t);return n>=48&&n<=57||n===45||n===43||n===46};if(y(),i>=r)return{segments:a,subpaths:0};for(;y(),!(i>=r);){if(a.length>=1e5)throw new B(`Path data has more than ${ie.toLocaleString(`en-US`)} commands.`,i,1,`E_PATH_LIMIT`);let b=e[i],w=e.charCodeAt(i),T=w>=65&&w<=90||w>=97&&w<=122,E=i;if(T){let e=b.toUpperCase();if(!(e in De))throw new B(`Unknown path command '${b}'. Valid commands: M L H V C S Q T A Z.`,i,1);if(!(e in n))throw new B(`Command '${b}' is not available in 3D path data (use M L C S Q T Z).`,i,1);if(!g&&e!==`M`)throw new B(`Path data must begin with a moveto command (M or m).`,i,1);if(g=b,i++,e===`Z`){a.push({c:`Z`,o:E}),o=l,s=u,c=d,h=`Z`,v=!0;continue}if(!C())throw y(),new B(`Command '${b}' expects ${n[e]} numbers.`,Math.min(i,r-1),1)}else{if(!g)throw new B(`Path data must begin with a moveto command (M or m).`,i,1);if(g===`Z`||g===`z`)throw new B(`Unexpected '${b}' after closepath; start a new command.`,i,1);if(!C())throw new B(`Unexpected character '${b}' in path data.`,i,1);g===`M`?g=`L`:g===`m`&&(g=`l`)}let D=g===g.toLowerCase(),O=g.toUpperCase();v&&O!==`M`&&(a.push({c:`M`,x:l,y:u,z:d,o:E,implicit:!0}),_++),v=!1;let k=D?o:0,A=D?s:0,j=D?c:0;switch(O){case`M`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0;a.push({c:`M`,x:e,y:n,z:r,o:E}),o=l=e,s=u=n,c=d=r,_++;break}case`L`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0;a.push({c:`L`,x:e,y:n,z:r,o:E}),o=e,s=n,c=r;break}case`H`:{let e=x()+k;a.push({c:`L`,x:e,y:s,z:0,o:E}),o=e;break}case`V`:{let e=x()+A;a.push({c:`L`,x:o,y:e,z:0,o:E}),s=e;break}case`C`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0,i=x()+k,l=x()+A,u=t===3?x()+j:0,d=x()+k,h=x()+A,g=t===3?x()+j:0;a.push({c:`C`,x1:e,y1:n,z1:r,x2:i,y2:l,z2:u,x:d,y:h,z:g,o:E}),f=i,p=l,m=u,o=d,s=h,c=g;break}case`S`:{let e=o,n=s,r=c;(h===`C`||h===`S`)&&(e=2*o-f,n=2*s-p,r=2*c-m);let i=x()+k,l=x()+A,u=t===3?x()+j:0,d=x()+k,g=x()+A,_=t===3?x()+j:0;a.push({c:`C`,x1:e,y1:n,z1:r,x2:i,y2:l,z2:u,x:d,y:g,z:_,o:E}),f=i,p=l,m=u,o=d,s=g,c=_;break}case`Q`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0,i=x()+k,l=x()+A,u=t===3?x()+j:0;a.push({c:`Q`,x1:e,y1:n,z1:r,x:i,y:l,z:u,o:E}),f=e,p=n,m=r,o=i,s=l,c=u;break}case`T`:{let e=o,n=s,r=c;(h===`Q`||h===`T`)&&(e=2*o-f,n=2*s-p,r=2*c-m);let i=x()+k,l=x()+A,u=t===3?x()+j:0;a.push({c:`Q`,x1:e,y1:n,z1:r,x:i,y:l,z:u,o:E}),f=e,p=n,m=r,o=i,s=l,c=u;break}case`A`:{let e=x(),t=x(),n=x(),r=S(),c=S(),l=x()+k,u=x()+A;if(e<0||t<0)throw new B(`Arc radii must not be negative.`,E,i-E);a.push({c:`A`,rx:e,ry:t,rot:n,large:r,sweep:c,x0:o,y0:s,x:l,y:u,z:0,o:E}),o=l,s=u;break}default:throw new B(`Unsupported command '${g}'.`,E,1)}h=O}return{segments:a,subpaths:_}}function Pe(e){let t=1/0,n=1/0,r=-1/0,i=-1/0,a=(e,a)=>{e<t&&(t=e),a<n&&(n=a),e>r&&(r=e),a>i&&(i=a)};for(let t of e)if(t.c!==`Z`){if(a(t.x,t.y),t.c===`C`)a(t.x1,t.y1),a(t.x2,t.y2);else if(t.c===`Q`)a(t.x1,t.y1);else if(t.c===`A`){let e=Math.max(t.rx,t.ry);a(t.x-e,t.y-e),a(t.x+e,t.y+e),a(t.x0-e,t.y0-e),a(t.x0+e,t.y0+e)}}return{minX:t,minY:n,maxX:r,maxY:i}}var Fe=Math.PI,Ie=Fe*2,Le=Fe*.5,Re=Fe*.25,ze=-.16666666666666632,Be=.00833333333332249,Ve=-.0001984126982985795,He=27557313707070068e-22,Ue=-2.5050760253406863e-8,We=158969099521155e-24,Ge=.0416666666666666,Ke=-.001388888888887411,qe=2480158728947673e-20,Je=-2.7557314351390663e-7,Ye=2.087572321298175e-9,Xe=-11359647557788195e-27;function Ze(e){let t=e*e;return e+t*e*(ze+t*(Be+t*(Ve+t*(He+t*(Ue+t*We)))))}function Qe(e){let t=e*e,n=t*(Ge+t*(Ke+t*(qe+t*(Je+t*(Ye+t*Xe)))));return 1-.5*t+t*n}function $e(e){if(!Number.isFinite(e))return e;let t=e-Ie*Math.round(e/Ie),n=1;t<0&&(n=-1,t=-t),t>Le&&(t=Fe-t),t<0&&(t=0);let r=t>Re?Qe(Le-t):Ze(t);return n<0?-r:r}function et(e){return $e(e+Le)}var tt=Math.PI/180;function nt(){let e=new Float32Array(16);return e[0]=e[5]=e[10]=e[15]=1,e}function V(){let e=new Float64Array(16);return e[0]=e[5]=e[10]=e[15]=1,e}function rt(e){return e.fill(0),e[0]=e[5]=e[10]=e[15]=1,e}function it(e,t=1e-12){for(let n=0;n<16;n++){let r=+(n%5==0);if(Math.abs(e[n]-r)>t)return!1}return!0}function at(e,t,n){let r=t[0],i=t[1],a=t[2],o=t[3],s=t[4],c=t[5],l=t[6],u=t[7],d=t[8],f=t[9],p=t[10],m=t[11],h=t[12],g=t[13],_=t[14],v=t[15],y=n[0],b=n[1],x=n[2],S=n[3];return e[0]=y*r+b*s+x*d+S*h,e[1]=y*i+b*c+x*f+S*g,e[2]=y*a+b*l+x*p+S*_,e[3]=y*o+b*u+x*m+S*v,y=n[4],b=n[5],x=n[6],S=n[7],e[4]=y*r+b*s+x*d+S*h,e[5]=y*i+b*c+x*f+S*g,e[6]=y*a+b*l+x*p+S*_,e[7]=y*o+b*u+x*m+S*v,y=n[8],b=n[9],x=n[10],S=n[11],e[8]=y*r+b*s+x*d+S*h,e[9]=y*i+b*c+x*f+S*g,e[10]=y*a+b*l+x*p+S*_,e[11]=y*o+b*u+x*m+S*v,y=n[12],b=n[13],x=n[14],S=n[15],e[12]=y*r+b*s+x*d+S*h,e[13]=y*i+b*c+x*f+S*g,e[14]=y*a+b*l+x*p+S*_,e[15]=y*o+b*u+x*m+S*v,e}function ot(e,t,n,r){return rt(e),e[12]=t,e[13]=n,e[14]=r,e}function st(e,t,n,r){return rt(e),e[0]=t,e[5]=n,e[10]=r,e}function ct(e,t){let n=et(t),r=$e(t);return rt(e),e[5]=n,e[6]=r,e[9]=-r,e[10]=n,e}function lt(e,t){let n=et(t),r=$e(t);return rt(e),e[0]=n,e[2]=-r,e[8]=r,e[10]=n,e}function ut(e,t){let n=et(t),r=$e(t);return rt(e),e[0]=n,e[1]=r,e[4]=-r,e[5]=n,e}function dt(e,t,n,r){let i=t*tt,a=n*tt,o=r*tt,s=et(i),c=$e(i),l=et(a),u=$e(a),d=et(o),f=$e(o);return e[0]=d*l,e[1]=f*l,e[2]=-u,e[3]=0,e[4]=d*u*c-f*s,e[5]=f*u*c+d*s,e[6]=l*c,e[7]=0,e[8]=d*u*s+f*c,e[9]=f*u*s-d*c,e[10]=l*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function ft(e,t,n,r,i){let a=Math.hypot(t,n,r);if(a<1e-12)return rt(e);a=1/a;let o=t*a,s=n*a,c=r*a,l=$e(i),u=et(i),d=1-u;return e[0]=o*o*d+u,e[1]=s*o*d+c*l,e[2]=c*o*d-s*l,e[3]=0,e[4]=o*s*d-c*l,e[5]=s*s*d+u,e[6]=c*s*d+o*l,e[7]=0,e[8]=o*c*d+s*l,e[9]=s*c*d-o*l,e[10]=c*c*d+u,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function pt(e,t,n,r,i){let a=Math.hypot(t,n,r,i)||1;t/=a,n/=a,r/=a,i/=a;let o=t+t,s=n+n,c=r+r,l=t*o,u=n*o,d=n*s,f=r*o,p=r*s,m=r*c,h=i*o,g=i*s,_=i*c;return e[0]=1-d-m,e[1]=u+_,e[2]=f-g,e[3]=0,e[4]=u-_,e[5]=1-l-m,e[6]=p+h,e[7]=0,e[8]=f+g,e[9]=p-h,e[10]=1-l-d,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function mt(e,t,n,r){dt(e,n[0],n[1],n[2]);let i=r[0],a=r[1],o=r[2];return e[0]*=i,e[1]*=i,e[2]*=i,e[4]*=a,e[5]*=a,e[6]*=a,e[8]*=o,e[9]*=o,e[10]*=o,e[12]=t[0],e[13]=t[1],e[14]=t[2],e}function ht(e,t){let n=t[0],r=t[1],i=t[2],a=t[3],o=t[4],s=t[5],c=t[6],l=t[7],u=t[8],d=t[9],f=t[10],p=t[11],m=t[12],h=t[13],g=t[14],_=t[15],v=n*s-r*o,y=n*c-i*o,b=n*l-a*o,x=r*c-i*s,S=r*l-a*s,C=i*l-a*c,w=u*h-d*m,T=u*g-f*m,E=u*_-p*m,D=d*g-f*h,O=d*_-p*h,k=f*_-p*g,A=v*k-y*O+b*D+x*E-S*T+C*w;return A?(A=1/A,e[0]=(s*k-c*O+l*D)*A,e[1]=(i*O-r*k-a*D)*A,e[2]=(h*C-g*S+_*x)*A,e[3]=(f*S-d*C-p*x)*A,e[4]=(c*E-o*k-l*T)*A,e[5]=(n*k-i*E+a*T)*A,e[6]=(g*b-m*C-_*y)*A,e[7]=(u*C-f*b+p*y)*A,e[8]=(o*O-s*E+l*w)*A,e[9]=(r*E-n*O-a*w)*A,e[10]=(m*S-h*b+_*v)*A,e[11]=(d*b-u*S-p*v)*A,e[12]=(s*T-o*D-c*w)*A,e[13]=(n*D-r*T+i*w)*A,e[14]=(h*y-m*x-g*v)*A,e[15]=(u*x-d*y+f*v)*A,e):null}function gt(e){return e[0]*(e[5]*e[10]-e[6]*e[9])-e[4]*(e[1]*e[10]-e[2]*e[9])+e[8]*(e[1]*e[6]-e[2]*e[5])}function _t(e,t,n,r,i){let a=t[3]*n+t[7]*r+t[11]*i+t[15]||1;return e[0]=(t[0]*n+t[4]*r+t[8]*i+t[12])/a,e[1]=(t[1]*n+t[5]*r+t[9]*i+t[13])/a,e[2]=(t[2]*n+t[6]*r+t[10]*i+t[14])/a,e}function vt(e,t,n,r,i){return e[0]=t[0]*n+t[4]*r+t[8]*i,e[1]=t[1]*n+t[5]*r+t[9]*i,e[2]=t[2]*n+t[6]*r+t[10]*i,e}function yt(e,t,n,r,i,a=!1){let o=1/Math.tan(t/2);return e.fill(0),e[0]=o/n,e[5]=o,e[11]=-1,a?(e[10]=i/(r-i),e[14]=i*r/(r-i)):(e[10]=(i+r)/(r-i),e[14]=2*i*r/(r-i)),e}function bt(e,t,n,r,i,a,o,s=!1){let c=1/(t-n),l=1/(r-i),u=1/(a-o);return e.fill(0),e[0]=-2*c,e[5]=-2*l,e[12]=(t+n)*c,e[13]=(i+r)*l,s?(e[10]=u,e[14]=a*u):(e[10]=2*u,e[14]=(o+a)*u),e[15]=1,e}function xt(e,t,n,r){let i=t[0]-n[0],a=t[1]-n[1],o=t[2]-n[2],s=Math.hypot(i,a,o);if(s<1e-12)return rt(e);i/=s,a/=s,o/=s;let c=r[1]*o-r[2]*a,l=r[2]*i-r[0]*o,u=r[0]*a-r[1]*i;if(s=Math.hypot(c,l,u),s<1e-12){let e=Math.abs(a)<.9?[0,1,0]:[0,0,1];c=e[1]*o-e[2]*a,l=e[2]*i-e[0]*o,u=e[0]*a-e[1]*i,s=Math.hypot(c,l,u)}c/=s,l/=s,u/=s;let d=a*u-o*l,f=o*c-i*u,p=i*l-a*c;return e[0]=c,e[1]=d,e[2]=i,e[3]=0,e[4]=l,e[5]=f,e[6]=a,e[7]=0,e[8]=u,e[9]=p,e[10]=o,e[11]=0,e[12]=-(c*t[0]+l*t[1]+u*t[2]),e[13]=-(d*t[0]+f*t[1]+p*t[2]),e[14]=-(i*t[0]+a*t[1]+o*t[2]),e[15]=1,e}var St={translate:[1,3],rotate:[3,4],rotateX:[1,1],rotateY:[1,1],rotateZ:[1,1],scale:[1,3],matrix:[16,16],quat:[4,4]};function Ct(e){return e===32||e===9||e===10||e===13||e===44}function wt(e){let t=[],n=e.length,r=0;for(;;){for(;r<n&&Ct(e.charCodeAt(r));)r++;if(r>=n)break;let i=r;for(;r<n&&/[A-Za-z0-9]/.test(e[r]);)r++;let a=e.slice(i,r);if(!a)throw new z(`Unexpected character '${e[r]}' in transform.`,r,1);if(!(a in St))throw new z(`Unknown transform function '${a}'.`,i,a.length,{suggestion:f(a,Object.keys(St)),hint:`Valid functions: translate, rotate, rotateX, rotateY, rotateZ, scale, matrix, quat.`});for(;r<n&&(e[r]===` `||e[r]===` `);)r++;if(e[r]!==`(`)throw new z(`Expected '(' after '${a}'.`,r,1);r++;let o=[];for(;;){for(;r<n&&/[\s,]/.test(e[r]);)r++;if(e[r]===`)`){r++;break}if(r>=n)throw new z(`Missing ')' to close '${a}('.`,i,a.length+1);let t=Me(e,r);if(t<0)throw new z(`Expected a number in '${a}()' but found '${e[r]}'.`,r,1);o.push(je),r=t}let[s,c]=St[a];if(o.length<s||o.length>c){let e;throw a===`rotate`&&o.length===1&&(e=`rotate() takes Euler angles rotate(x,y,z) or an axis-angle rotate(a,ax,ay,az); use rotateY(a) for a single angle.`),a===`rotate`&&o.length===2&&(e=`rotate() takes 3 Euler angles in degrees, e.g. rotate(0,45,0).`),new z(`${a}() takes ${s===c?s:`${s} to ${c}`} numbers but ${o.length} ${o.length===1?`was`:`were`} given.`,i,r-i,{hint:e})}if(a===`rotate`&&o.length===4&&Math.hypot(o[1],o[2],o[3])<1e-12)throw new z(`rotate(angle, ax, ay, az): the rotation axis must not be zero.`,i,r-i);if(a===`scale`&&o.length===2)throw new z(`scale() takes 1 (uniform) or 3 numbers.`,i,r-i);t.push({fn:a,args:o,offset:i})}return t}function Tt(e,t=V()){let n=e.args;switch(e.fn){case`translate`:return ot(t,n[0],n[1]||0,n[2]||0);case`rotate`:return n.length===4?ft(t,n[1],n[2],n[3],n[0]*tt):dt(t,n[0],n[1],n[2]);case`rotateX`:return ct(t,n[0]*tt);case`rotateY`:return lt(t,n[0]*tt);case`rotateZ`:return ut(t,n[0]*tt);case`scale`:return n.length===1?st(t,n[0],n[0],n[0]):st(t,n[0],n[1],n[2]);case`matrix`:for(let e=0;e<16;e++)t[e]=n[e];return t;case`quat`:return pt(t,n[0],n[1],n[2],n[3]);default:throw Error(`unknown transform ${e.fn}`)}}function Et(e){let t=V(),n=V();for(let r of e)Tt(r,n),at(t,t,n);return t}function Dt(e){let t=wt(e);return{ops:t,matrix:Et(t)}}var Ot=[0,0,0],kt=[1,1,1];function At(e,t=V(),n=null){mt(t,n&&n.position||e.position||Ot,n&&n.rotation||e.rotation||Ot,n&&n.scale||e.scale||kt);let r=e.transform;return r&&r.ops.length&&at(t,r.matrix,t),t}var jt=`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AwAgA0GgAWogDkGgAWopAwA3AwAgA0GoAWogDkGoAWopAwA3AwAgA0GwAWogDkGwAWopAwA3AwAgA0G4AWogDkG4AWopAwA3AwAgDUHAAWohDSAMIAtBBGoiC0cNAAsLIAlFDQAgAiALQTBsIg5qIQMgCiAOaiEOA0AgAyAOKQMANwMAIANBKGogDkEoaikDADcDACADQSBqIA5BIGopAwA3AwAgA0EYaiAOQRhqKQMANwMAIANBEGogDkEQaikDADcDACADQQhqIA5BCGopAwA3AwAgA0EwaiEDIA5BMGohDiAJQX9qIgkNAAsLQQAgCDYC1IqAgABBACACNgLQioCAAAsgAiAHQTBsaiIDIAY2AhAgAyAEOQMIIAMgBTkDACADQv////8PNwIkIANCfzcCHCADQoCAgIBwNwIUQQAgB0EBaiIKNgLYioCAAAwBC0EAIQdBAEEBOgDoioCAAEEAKALUioCAACEIQQAoAtiKgIAAIQpBACgC0IqAgAAhAgsgAiABQTBsaiIDKwMIIQQgAysDACEFIAMoAhAhBgJAAkAgCiAIRw0AIAhBAXRBEGoiD0EwbBCfgICAACICRQ0BAkBBACgC2IqAgAAiCkEBSA0AIApBA3EhCUEAKALQioCAACEIQQAhCwJAIApBBEkNACAKQfz///8HcSEMQQAhDUEAIQsDQCACIA1qIgMgCCANaiIOKQMANwMAIANBKGogDkEoaikDADcDACADQSBqIA5BIGopAwA3AwAgA0EYaiAOQRhqKQMANwMAIANBEGogDkEQaikDADcDACADQQhqIA5BCGopAwA3AwAgA0EwaiAOQTBqKQMANwMAIANBOGogDkE4aikDADcDACADQcAAaiAOQcAAaikDADcDACADQcgAaiAOQcgAaikDADcDACADQdAAaiAOQdAAaikDADcDACADQdgAaiAOQdgAaikDADcDACADQYgBaiAOQYgBaikDADcDACADQYABaiAOQYABaikDADcDACADQfgAaiAOQfgAaikDADcDACADQfAAaiAOQfAAaikDADcDACADQegAaiAOQegAaikDADcDACADQeAAaiAOQeAAaikDADcDACADQZABaiAOQZABaikDADcDACADQZgBaiAOQZgBaikDADcDACADQaABaiAOQaABaikDADcDACADQagBaiAOQagBaikDADcDACADQbABaiAOQbABaikDADcDACADQbgBaiAOQbgBaikDADcDACANQcABaiENIAwgC0EEaiILRw0ACwsgCUUNACACIAtBMGwiDmohAyAIIA5qIQ4DQCADIA4pAwA3AwAgA0EoaiAOQShqKQMANwMAIANBIGogDkEgaikDADcDACADQRhqIA5BGGopAwA3AwAgA0EQaiAOQRBqKQMANwMAIANBCGogDkEIaikDADcDACADQTBqIQMgDkEwaiEOIAlBf2oiCQ0ACwtBACAPNgLUioCAAEEAIAI2AtCKgIAACyACIApBMGxqIgMgBjYCECADIAQ5AwggAyAFOQMAIANC/////w83AiQgA0J/NwIcIANCgICAgHA3AhRBACAKQQFqNgLYioCAAEF/IQ4CQEEALQDoioCAAA0AIAIgAEEwbGoiDSgCHCEOIA0gATYCHCACIAFBMGxqIgkoAhghDSAJIAA2AhggAiAHQTBsaiIJIA42AhwgAiAOQTBsaiAHNgIYIANBHGogBzYCACAJIAo2AhggAiANQTBsaiAKNgIcIANBGGogDTYCACAKIQ4LIA4PC0EAQQE6AOiKgIAAQX8LugIDBX8EfAF/AkAgAEEATg0AIAAPCyAAIAEgAUEASBshAkEAKALQioCAACEDAkADQCADIABBMGxqIgEoAhwhAEEAIQQCQCABKAIoDQAgASgCGCEFIAMgAEEwbGoiBisDCCEHIAErAwghCAJAAkAgASsDACIJIAYrAwAiCmINACAIIAdhDQELIAogCaEgCCADIAVBMGxqIgsrAwihoiAJIAsrAwChIAcgCKGioUQAAAAAAAAAAGINAQsgAyAFQTBsaiAANgIcIAYgBTYCGCABKAIkIQACQCABKAIgIgRBAEgNACADIARBMGxqIAA2AiQLIAFBGGohAQJAIABBAEgNACADIABBMGxqIAQ2AiALQQEhBCABKAIAIgIhACACIAMgAkEwbGooAhxGDQILIAQNACAAIAJHDQALCyACC7gqCQV/AXwBfwF8CX8CfAF/DXwEfwJAA0AgAEEASA0BQQAtAOiKgIAAQQFxDQEgBUGRAyAFQZEDShshBgNAAkAgBSAGRw0AQQBBAToA6IqAgAAPC0EAKALQioCAACEHAkAgA0QAAAAAAAAAAGQgA0QAAAAAAAAAAGNyQQFHIggNACAEDQAg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gICAAJohFkEAKAL8i4CAAEUNASAVIA4gFhCigICAACERDAILIAUgA0EMbCIXaiAVIACitjgCACAFIBdBBGoiGGpBgICA+AM2AgAgBSAXQQhqIh5qIBEgAKK2OAIAIAggGGogGTgCACAIIBdqIBo4AgAgCCAeaiAbOAIAIBQgAzYCACAJIANBA3RqIgNBBGpBgICA/AM2AgAgAyAcOAIAIAFBAmohASAEIAZGDQMMAgsgFSAOIBYQhICAgAAhEQsgBSADQQxsIhdqQoCAgICAgICAPzcCACAFIBdBCGoiGGpBADYCACAIIBdqIhdBBGogDiARo7Y4AgAgFyAVIBGjtjgCACAIIBhqIBYgEaO2OAIAIBQgAzYCACAJIANBA3RqIgNBBGpBgICA/AM2AgAgAyAdtjgCACABQQJqIQEgBCAGRw0AIARB/v///wdxIQYgBEEBcSESQQAhDyAKIQMDQCAHKQIAIR8gA0EIaiANKAIANgIAIAMgHzcCACAHQQRqKQIAIR8gA0EUaiANQQRqKAIANgIAIANBDGogHzcCACADQRhqIQMgDUEIaiENIAdBCGohByAPQQZqIQ8gBkF+aiIGDQALIBJFDQMgBykCACEfIANBCGogDSgCADYCACADIB83AgAgD0EDaiEPDAMLIA9BCGohDyASQQhqIRIgE0EEaiETIBRBBGohFCAGQQFqIQYMAQsLIARBBmwhDyAKIQMgBCESA0AgB0EEaiITKAIAIRQgDUEEaiIXKAIAIQYgBygCACEHIANBFGogDSgCADYCACADQRBqIAY2AgAgA0EMaiAHNgIAIANBCGogBjYCACADQQRqIBQ2AgAgAyAHNgIAIANBGGohAyATIQcgFyENIBJBf2oiEg0ACwsCQAJAIAINACABIR4MAQsgBSABQQxsIgNqIhRBADYCACAFIANBBHIiBmpBgICA+Hs2AgAgBSADQQhqIgdqQQA2AgAgCCAGakGAgID8ezYCACAIIANqIhdBADYCACAIIAdqQQA2AgAgCSABQQN0aiIDQoCAgPiDgICAPzcCACAEQX9zIRggAUEBciECIANBFGohAyALIQYgDCENQQAhE0EAIQcDQCAUIAdqIhJBFGogDSsDACIRtjgCACASQRBqQYCAgPh7NgIAIBJBDGogBisDACIVtjgCACAXIAdqIhJBFGpBADYCACAS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IAFvQRhsaiIfKwMAIRQgACASQQFqIhIgAW8gAWogAW9BGGxqIiArAwAhHiAYQRBqKwMAIRkgGEEIaisDACEaIBNBEGorAwAhFSATQQhqKwMAIRYgH0EQaisDACEhIB9BCGorAwAhIiAgQRBqKwMAIRwgIEEIaisDACEdDAILIAAgGEEYbGoiEysDACEeIBNBEGorAwAhHCATQQhqKwMAIR0LAkACQCASQQJqIhIgAUgNACAKKwMAIhQgFKAgCSsDAKEhISAMKwMAIhQgFKAgCysDAKEhIiAOKwMAIhQgFKAgDSsDAKEhFAwBCyAAIBJBGGxqIhIrAwAhFCASQRBqKwMAISEgEkEIaisDACEiCyAYIRILIBkgFaEhIyAaIBahISQgGyAXoSElAkACQEEAKAL8i4CAAEUNACAlICQgIxCigICAACEmDAELICUgJCAjEISAgIAAISYLIBwgGaEhJyAdIBqhISggHiAboSEpAkACQEEAKAL8i4CAAEUNACApICggJxCigICAACEqDAELICkgKCAnEISAgIAAISoLICEgHKEhKyAiIB2hISwgFCAeoSEtAkACQEEAKAL8i4CAAEUNACAtICwgKxCigICAACEUDAELIC0gLCArEISAgIAAIRQLAkAgA0EBSA0AIAggBmohEyAmn0SN7bWg98awPqVEAAAAAAAAAACgIiIgKp9Eje21oPfGsD6loCIuICKhIS8gByAGQQN0aiEGIC4gFJ9Eje21oPfGsD6loCIUICKhITAgFCAuoSExRAAAAAAAAAAAISYgAyEYA0AgBkEQaiAVICMgIiAvICaiIA+joCIhICKjIiqioCIyICEgLqMiMyAZICcgISAioSI0IC+jIhSioCI1IDKhoqAiNiAUIDUgNCAwoyIyIBwgKyAhIC6hIDGjIiGioCA1oaKgIDahoqA5AwAgBkEIaiAWICQgKqKgIjQgMyAaICggFKKgIjUgNKGioCI0IBQgNSAyIB0gLCAhoqAgNaGioCA0oaKgOQMAIAYgFyAlICqioCI1IDMgGyApIBSioCIqIDWhoqAiMyAUICogMiAeIC0gIaKgICqhoqAgM6GioDkDACAGQRhqIQYgJkQAAAAAAADwP6AhJiAYQX9qIhgNAAsgEyEGCyASIAVIDQALCwJAIAINAAJAAkAgAUEASg0AIAArAxAiFCAUoCAA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`,Mt=`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DP0AADAief3yAf3wASAP/QoDECJ6IAz9AABQInz98gH98AEgDP0AAHD98AEidyAP/QoDGCKEASB1/ewB/fIBIA/9CgMgIoUBIHn97AH98gH98AEgD/0KAygieSB8/ewB/fIB/fABInX98AEifCAbIHwgG/1K/VIhGyAZIAz9AAAAInz98gEgdiAM/QAAICKGAf3yAf3wASB6IAz9AABAInb98gH98AEgDP0AAGD98AEiGSCEASB8/ewB/fIBIIUBIIYB/ewB/fIB/fABIHkgdv3sAf3yAf3wASJ2/fABInkgJSB5ICX9Sv1SISUgdyB1/fEBInkgHCB5IBz9Sf1SIRwgGSB2/fEBInkgJiB5ICb9Sf1SISYgdyB2IHb98gEidv0hACB2/SEBoCB1IHX98gH9IQCgn/0iASF1CyAOIGNBBHRqIBn9XiB1/V79DQABAgMEBQYHEBESExQVFhf9CwAAIGNBAWohYwsgggFBEGohggEggQFBBGoigQEgB0gNAAsLAkAgMg0AICEgUv3yASEZICMgU/3yASF1IB8gUf3yASF2ICIgUv3yASF3ICQgU/3yASF5ICAgUf3yASF6ICEgVv3yASF8ICMgV/3yASGEASAiIFb98gEhhQEgJCBX/fIBIYYBICMgW/3yASGHASAkIFv98gEhiAEgIyBf/fIBICEgXv3yAf3wASAfIF398gH98AEgHSBc/fIB/fABISMgJCBf/fIBICIgXv3yAf3wASAgIF398gH98AEgHiBc/fIB/fABISQgiAEgIiBa/fIB/fABICAgWf3yAf3wASAeIFj98gH98AEhIiCHASAhIFr98gH98AEgHyBZ/fIB/fABIB0gWP3yAf3wASEhIIYBIIUB/fABICAgVf3yAf3wASAeIFT98gH98AEhICCEASB8/fABIB8gVf3yAf3wASAdIFT98gH98AEhHyB6IHkgd/3wAf3wASAeIFD98gH98AEhHiB2IHUgGf3wAf3wASAdIFD98gH98AEhHQsgZEEBaiJkIApHDQALCyABICX9CwCoBCABICb9CwCQBCABIB39CwPwASABIB79CwPgASABIB/9CwPQASABICD9CwPAASABICH9CwOwASABICL9CwOgASABICP9CwOQASABICT9CwOAASABIBz9IQA5A6AEIAAgGjYCDCABIBv9IQA5A7gECyAWCxEAQQBBkIiEgAA2AoCIgIAAC2sBAn8CQEEAKAKAiICAACIBDQBBkIiEgAAhAUEAQZCIhIAANgKAiICAAAsCQCABQQdqQXhxIgIgAGoiAT8AQRB0IgBNDQAgASAAa0H//wNqQRB2QABBf0cNAEEADwtBACABNgKAiICAACACCw0AQQAgADYChIiAgAALhQIDAX8CfAF/AkACQCAAIABiIgJFDQBEAAAAAAAAAAAhA0QAAAAAAAAAACEEDAELRAAAAAAAAAAAIQQgAJkhAyAARAAAAAAAAAAAZCAARAAAAAAAAAAAY3JBAUcNACADIQQLAkAgASABYQ0ARAAAAAAAAPB/RAAAAAAAAPh/IAREAAAAAAAA8H9hGw8LRAAAAAAAAPB/RAAAAAAAAPh/IAGZIgEgBCABIARkGyIERAAAAAAAAPB/YSIFGyEAAkAgBQ0AIAINAEQAAAAAAAAAACEAIAREAAAAAAAAAABhDQAgBCADIASjIgAgAKIiACABIASjIgEgAaIgACAAoaCgn6IhAAsgAAvMAgQCfAF/AXwBf0QAAAAAAAAAACEDRAAAAAAAAAAAIQRBASEFRAAAAAAAAAAAIQYCQCAAIABiDQBEAAAAAAAAAAAhBiAAmSEEQQAhBSAARAAAAAAAAAAAZCAARAAAAAAAAAAAY3JBAUcNACAEIQYLAkACQCABIAFhDQBBASEFDAELIAGZIgMgBmRFDQAgAyEGCwJAIAIgAmENAEQAAAAAAADwf0QAAAAAAAD4fyAGRAAAAAAAAPB/YRsPC0QAAAAAAADwf0QAAAAAAAD4fyACmSICIAYgAiAGZBsiAEQAAAAAAADwf2EiBxshBgJAIAcNACAFDQBEAAAAAAAAAAAhBiAARAAAAAAAAAAAYQ0AIAAgBCAAoyIGIAaiIgYgAyAAoyIBIAGiIAYgBqGgIgGgIgQgAiAAoyICIAKiIAEgBiAEoaCgoJ+iIQYLIAYL`,Nt=``,Pt=null,Ft={env:{sin:Math.sin,cos:Math.cos,atan2:Math.atan2,tan:Math.tan,acos:Math.acos,hypot2:Math.hypot,hypot3:Math.hypot,number:(e,t)=>Number(Nt.slice(e,t)),material:e=>Pt(e)}};function It(e){if(typeof Uint8Array.fromBase64==`function`)return Uint8Array.fromBase64(e);if(typeof Buffer==`function`)return Buffer.from(e,`base64`);let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}async function Lt(e){try{if(typeof WebAssembly!=`object`)return null;let{instance:t}=await WebAssembly.instantiate(It(e),Ft);return t.exports}catch{return null}}var[H,Rt]=await Promise.all([Lt(jt),Lt(Mt)]),U=H!==null;function zt(){let e=[0,-0,3,-4,5e-324,1e308,1/0,NaN];for(let t of e)for(let n of e)if(!Object.is(H.hypot2(t,n),Math.hypot(t,n)))return!1;let t=12345,n=()=>(t=Math.imul(t,1103515245)+12345>>>0,(t/4294967296-.5)*10**(t%41-20));for(let e=0;e<100;e++){let e=n(),t=n(),r=n();if(!Object.is(H.hypot3(e,t,r),Math.hypot(e,t,r))||!Object.is(H.hypot2(e,t),Math.hypot(e,t)))return!1}return!0}H&&H.set_native_hypot(+!!zt());function Bt(){return U&&Rt!==null}var W=()=>H.memory.buffer;function G(e,t=H){let n=t.alloc(Math.max(1,e.byteLength));return n&&new Uint8Array(t.memory.buffer,n,e.byteLength).set(new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),n}var Vt=new TextEncoder,Ht={f64:[0,Float64Array],f32:[1,Float32Array],index:[2,Uint32Array]};function Ut(e,t){if(!U)return null;let[n,r]=Ht[t],i=e.length;H.reset();let a=H.alloc(Math.max(1,i)),o=a&&H.alloc((Math.floor(i/2)+1)*r.BYTES_PER_ELEMENT);if(!o)return null;let s=Vt.encodeInto(e,new Uint8Array(W(),a,i));if(s.read!==i||s.written!==i)return null;Nt=e;let c=H.numbers(a,i,o,n);return Nt=``,c<0?null:new r(W(),o,c).slice()}function Wt(e,t,n,r,i){if(!U||!(e instanceof Float32Array)||!(t instanceof Uint32Array)||i&&!(i instanceof Float32Array))return null;H.reset();let a=G(e),o=G(t),s=i?G(i):0;if(!a||!o||i&&!s)return null;let c=H.normals(a,e.length/3,o,t.length,s,n,r);if(!c)return null;let[l,u,d,f,p,m]=new Uint32Array(W(),c,6);return{positions:new Float32Array(W(),d,l*3).slice(),normals:new Float32Array(W(),f,l*3).slice(),uvs:new Float32Array(W(),p,l*2).slice(),indices:new Uint32Array(W(),m,u).slice()}}var Gt=e=>e instanceof Float64Array?e:Float64Array.from(e),Kt=e=>e instanceof Uint8Array?e:Uint8Array.from(e);function qt(e){let t=new Int32Array(e.length*4);for(let n=0;n<e.length;n++){let r=e[n],i=G(Gt(r.points)),a=r.smooth?G(Kt(r.smooth)):0;if(!i||r.smooth&&!a)return 0;t[n*4]=r.points.length/2,t[n*4+1]=i,t[n*4+2]=a,t[n*4+3]=r.isWall===!1?0:1}return G(t)}function Jt(e,t){let n=new Int32Array(Math.max(1,e.length*2));return e.forEach((e,r)=>{n[r*2]=t.length,n[r*2+1]=1+e.holes.length,t.push(e.outer,...e.holes)}),n}var Yt=(e,t)=>{let[n,r,i,a,o,s]=new Uint32Array(W(),e,6),c=new ArrayBuffer((n*8+r)*4),l=new Float32Array(c,0,n*3),u=new Float32Array(c,n*12,n*3),d=new Float32Array(c,n*24,n*2),f=new Uint32Array(c,n*32,r);return l.set(new Float32Array(W(),i,n*3)),u.set(new Float32Array(W(),a,n*3)),d.set(new Float32Array(W(),o,n*2)),f.set(new Uint32Array(W(),s,r)),{positions:l,normals:u,uvs:d,indices:f,...t}};function Xt(e,t,n,r,i,a,o){if(!U)return null;H.reset();let s=[...t],c=n?null:Jt(r,s),l=qt(s),u=new Int32Array(Math.max(1,e.length*3));for(let t=0;t<e.length;t++)if(u[t*3]=G(Gt(e[t].points)),u[t*3+1]=e[t].points.length/3,u[t*3+2]=+!!e[t].closed,!u[t*3])return null;let d=G(Int32Array.from(t,(e,t)=>t)),f=G(u),p=G(n?Gt(n):c),m=G(Int32Array.of(e.length,f,s.length,l,t.length,d,n?1:2,n?n.length/2:r.length,p,+!!o));if(!l||!d||!f||!p||!m)return null;let h=H.sweep(m,i,a);if(!h)return null;let[g,_,v]=new Uint32Array(W(),h+24,3);return Yt(h,{open:g!==0,degenerate:Array.from(new Uint8Array(W(),_,e.length),e=>e!==0),errors:n?[]:Array.from(new Float64Array(W(),v,r.length))})}function Zt(e,t){if(!U)return null;H.reset();let n=G(Gt(e)),r=t&&t.length?Int32Array.from(t):null,i=r?G(r):0;if(!n||r&&!i)return null;let a;try{a=H.triangulate(n,e.length,i,r?r.length:0)}catch{return null}if(!a)return null;let[o,s]=new Uint32Array(W(),a,2);return o?Array.from(new Uint32Array(W(),s,o)):[]}function Qt(e,t,n,r,i,a,o,s){if(!U)return null;H.reset();let c=[],l=G(Jt(e.regions,c)),u=G(Int32Array.from(e.walls,(e,t)=>c.length+t));c.push(...e.walls);let d=qt(c),f=new Float64Array(Math.max(1,n.length*4));n.forEach((e,t)=>f.set([e.inset,e.z,e.nr,e.nz],t*4));let p=G(f),m=G(Int32Array.of(c.length,d,e.regions.length,l,e.walls.length,u,n.length,p));if(!l||!u||!d||!p||!m)return null;let h=H.extrude(m,t,r,i,a,o,s);if(!h)return null;let g=new Uint32Array(W(),h+24,1)[0];return Yt(h,{errors:Array.from(new Float64Array(W(),g,e.regions.length))})}function $t(e){if(!U)return null;H.reset();let t=H.sphere_deviation(e);return t<0?null:t}var en=(...e)=>e.every(e=>Number.isInteger(e)&&e>=0&&e<2**30),tn=e=>e?Yt(e):null,nn={sphere:e=>U&&en(e)?(H.reset(),tn(H.sphere(e))):null,cylinder:(e,t,n)=>U&&en(t)?(H.reset(),tn(H.cylinder(e,t,+!!n))):null,capsule:(e,t)=>U&&en(t)?(H.reset(),tn(H.capsule(e,t))):null,torus:(e,t,n,r)=>U&&en(n,r)?(H.reset(),tn(H.torus(e,t,n,r))):null,roundedBox:(e,t,n,r,i)=>U&&en(i)&&i>=1?(H.reset(),tn(H.rounded_box(e,t,n,r,i))):null};function rn(e,t,n){if(!U||!en(n)||e.length<6||e.length%3)return null;H.reset();let r=G(Gt(e)),i=r&&H.catmull_rom(r,e.length/3,+!!t,n);if(!i)return null;let[a,o]=new Uint32Array(W(),i,2);return new Float64Array(W(),o,a*3).slice()}function an(e,t,n,r){if(!U||!en(e,n,r)||e<1)return null;H.reset();let i=H.gear_outline(e,t,n,r);if(!i)return null;let[a,o,s,c]=new Uint32Array(W(),i,4),[l,u]=new Float64Array(W(),c,2);return{outline:{points:new Float64Array(W(),o,a*2).slice(),smooth:new Uint8Array(W(),s,a).slice(),closed:!0},outerRadius:l,rootRadius:u}}var K={KIND:0,FIRST:1,COUNT:2,STATE:3,MODE:4,NX:5,NZ:6,RANDOM:7,CHOICES:8,OPS:9,NOPS:10,MATS:11,ROWS:12,NROWS:13,BOUNDS:14,MATERIALS:15,LODS:16,OUTER_LOD:17,SWITCH:18,SLOTS:19,OUT:20,SIZE:29},q={WORLD:0,ACC:16,STEP:32,SPACING:48,JITTER:50,RADIUS:51,AREA:52,ROTATION:54,SCALE:60,BOUNDS:66,SIZE:72};function on(e,t,n,r,i){if(!U||!Rt)return null;Rt.reset();let a=K;e[a.OPS]=G(n.ops,Rt),e[a.MATS]=G(n.mats,Rt),e[a.ROWS]=G(n.table,Rt),e[a.BOUNDS]=G(n.bounds,Rt),e[a.MATERIALS]=G(r,Rt);let o=G(e,Rt),s=G(t,Rt);if(!e[a.OPS]||!e[a.MATS]||!e[a.ROWS]||!e[a.BOUNDS]||!e[a.MATERIALS]||!o||!s)return null;Pt=i;try{if(!Rt.instances(o,s))return null}finally{Pt=null}let c=Rt.memory.buffer;e.set(new Int32Array(c,o,a.SIZE)),t.set(new Float64Array(c,s,q.SIZE)),r.set(new Int32Array(c,e[a.MATERIALS],r.length));let l=e[a.COUNT]*e[a.NROWS],u=a.OUT;return{matrices:new Float32Array(c,e[u],l*16),spheres:new Float32Array(c,e[u+1],l*4),geom:new Uint32Array(c,e[u+2],l),mat:new Uint32Array(c,e[u+3],l),uid:new Uint32Array(c,e[u+4],l),lodNode:new Int32Array(c,e[u+5],l),lodChild:new Uint16Array(c,e[u+6],l),flags:new Uint8Array(c,e[u+7],l),switches:new Float64Array(c,e[u+8],e[a.COUNT]*e[a.LODS]*4)}}function sn(e){return e===32||e===9||e===10||e===13}function cn(e){return`'${e.length>24?e.slice(0,24)+`…`:e}'`}function ln(e){let t=0,n=e.length;for(;t<n&&sn(e.charCodeAt(t));)t++;if(t>=n)throw new z(`Expected a number but the value is empty.`,0,0);let r=Me(e,t);if(r<0)throw new z(`Expected a number but found ${cn(e.trim())}.`,t,Math.max(1,e.trim().length));let i=je,a=r;for(;a<n&&sn(e.charCodeAt(a));)a++;if(a<n)throw e[a]===`,`||sn(e.charCodeAt(r))?new z(`Expected a single number but found a list ${cn(e.trim())}.`,a,1):new z(`Unexpected '${e[a]}' after number.`,a,1);return i}var un=1024,dn=(e,t)=>e.length>=un?Ut(e,t):null,fn=new Float64Array(64);function pn(e){let t=e.length,n=fn,r=0,i=0;for(;i<t&&sn(e.charCodeAt(i));)i++;for(;i<t;){let a=Me(e,i);if(a<0){let n=i;for(;n<t&&!sn(e.charCodeAt(n))&&e[n]!==`,`;)n++;throw new z(`Expected a number but found ${cn(e.slice(i,n)||e[i])}.`,i,Math.max(1,n-i))}if(r===n.length){let e=new Float64Array(n.length*2);e.set(n),n=e}n[r++]=je,i=a;let o=!1;for(;i<t&&sn(e.charCodeAt(i));)i++,o=!0;if(i<t&&e.charCodeAt(i)===44){for(i++,o=!0;i<t&&sn(e.charCodeAt(i));)i++;if(i>=t)throw new z(`Trailing comma in number list.`,i-1,1)}if(i<t&&!o)throw new z(`Expected a separator (space or comma) but found '${e[i]}'.`,i,1)}return n.length<=4096&&(fn=n),n.subarray(0,r)}function mn(e,t=[]){let n=pn(e);for(let e=0;e<n.length;e++)t.push(n[e]);return t}function hn(e){let t=ln(e);if(!Number.isInteger(t))throw new z(`Expected a whole number but found ${cn(e.trim())}.`,0,e.length);return t}function gn(e){let t=e.trim();if(t===`true`)return!0;if(t===`false`)return!1;throw new z(`Expected 'true' or 'false' but found ${cn(t)}.`,0,e.length,{suggestion:f(t,[`true`,`false`])||null})}function _n(e,t,n){let r=mn(e);if(r.length!==t)throw new z(`${n} needs ${t} numbers (e.g. ${Array.from({length:t},(e,t)=>t+1).join(`,`)}) but ${r.length} ${r.length===1?`was`:`were`} given.`,0,e.length);return r}var vn=/^[A-Za-z_][A-Za-z0-9_.:-]*$/;function yn(e){let t=e.trim();if(!vn.test(t))throw new z(`Invalid id ${cn(t)}: ids start with a letter or '_' and contain letters, digits, '_', '-', '.' or ':'.`,0,e.length);return t}function bn(e){let t=e.trim();return t.startsWith(`url(#`)&&t.endsWith(`)`)&&(t=t.slice(5,-1)),t[0]===`#`&&(t=t.slice(1)),yn(t)}function xn(e){let t=e.trim(),n=t.indexOf(`..`);if(n<0){let e=ln(t);return[e,e]}let r=ln(t.slice(0,n)),i;try{i=ln(t.slice(n+2))}catch(e){throw new z(e.message,n+2+e.offset,e.length)}if(i<r)throw new z(`Range ${cn(t)} is reversed: the lower bound must come first.`,0,e.length);return[r,i]}function Sn(e,t){let n=e.split(`,`);if(n.length===1){if(!t)throw new z(`Expected three comma-separated components, e.g. 0,0..360,0.`,0,e.length);return{uniform:!0,ranges:[xn(n[0])]}}if(n.length!==3)throw new z(`Expected three comma-separated components but found ${n.length}.`,0,e.length);let r=[],i=0;for(let e of n){try{r.push(xn(e))}catch(t){throw new z(t.message,i+(t.offset||0),t.length||e.length)}i+=e.length+1}return{uniform:!1,ranges:r}}function Cn(e){let t=e.split(/[\s,]+/).filter(Boolean);if(!t.length)throw new z(`Expected at least one id.`,0,e.length);let n=0;return t.map(t=>{let r=e.indexOf(t,n);n=r+t.length;try{return bn(t)}catch(e){throw new z(e.message,r,t.length)}})}function wn(e){let t=Ce(e);if(t)return t;let n=e.trim(),r=null;throw/^[a-z]+$/i.test(n)&&(r=f(n.toLowerCase(),[...xe.keys()])),new z(`Invalid color ${cn(n)}.`,0,e.length,{suggestion:r,hint:`Colors are written #rgb, #rrggbb, #rrggbbaa, rgb(r,g,b), rgba(r,g,b,a) or as a CSS color name.`})}function Tn(e){let t=e.trim(),n=1,r=t;return t.endsWith(`ms`)?(n=.001,r=t.slice(0,-2)):t.endsWith(`s`)&&(r=t.slice(0,-1)),ln(r)*n}function En(e){let t=e.trim(),n=/^([A-Za-z][A-Za-z0-9_-]*)\s*\(([\s\S]*)\)$/.exec(t);if(!n)return null;let r=n[2].trim(),i=r?r.split(/\s*,\s*/):[];return{name:n[1],args:i,argOffset:e.indexOf(`(`)+1}}var Dn={checker:[[`count`,`number`,8],[`color1`,`color`,`#ffffff`],[`color2`,`color`,`#1a1a1a`]],grid:[[`count`,`number`,8],[`width`,`number`,.06],[`line`,`color`,`#222222`],[`background`,`color`,`#ffffff`]],stripes:[[`count`,`number`,8],[`color1`,`color`,`#ffffff`],[`color2`,`color`,`#1a1a1a`]],noise:[[`scale`,`number`,8],[`color1`,`color`,`#ffffff`],[`color2`,`color`,`#000000`],[`seed`,`number`,1]],bricks:[[`count`,`number`,6],[`brick`,`color`,`#b5543a`],[`mortar`,`color`,`#d8d0c4`]]},On={bumps:[[`count`,`number`,8],[`strength`,`number`,1]],tiles:[[`count`,`number`,4],[`strength`,`number`,1],[`gap`,`number`,.06]],noise:[[`scale`,`number`,8],[`strength`,`number`,1],[`seed`,`number`,1]],waves:[[`count`,`number`,6],[`strength`,`number`,1]],bricks:[[`count`,`number`,6],[`strength`,`number`,1]]};function kn(e,t,n){let r=En(e);if(r){let i=t[r.name];if(!i)throw new z(`Unknown procedural ${n} '${r.name}'.`,0,r.name.length,{suggestion:f(r.name,Object.keys(t)),hint:`Available: ${Object.keys(t).map(e=>e+`()`).join(`, `)}. Any other value is treated as an image URL.`});if(r.args.length>i.length)throw new z(`${r.name}() takes at most ${i.length} arguments but ${r.args.length} were given.`,0,e.length);let a={};return i.forEach(([t,n,i],o)=>{let s=r.args[o],c=s===void 0||s===``?i:s;try{a[t]=n===`number`?ln(String(c)):wn(String(c))}catch(n){throw new z(`${r.name}(): argument '${t}': ${n.message}`,r.argOffset,e.length-r.argOffset-1)}}),{kind:`procedural`,fn:r.name,params:a,key:e.trim()}}let i=e.trim();if(!i)throw new z(`Expected an image URL or a procedural texture such as checker(8).`,0,0);if(/\s/.test(i)&&!i.startsWith(`data:`))throw new z(`Image URLs must not contain spaces (escape them as %20).`,i.search(/\s/),1);return{kind:`url`,url:i,key:i}}function An(e){let t=e.trim(),n=En(t);if(n){if(n.name!==`helix`)throw new z(`Unknown spine function '${n.name}'.`,0,n.name.length,{suggestion:f(n.name,[`helix`])});if(n.args.length<3||n.args.length>4)throw new z(`helix() takes (radius, pitch, turns[, segmentsPerTurn]).`,0,t.length);let e=n.args.map(e=>ln(e));if(e[0]<=0)throw new z(`helix(): radius must be positive.`,n.argOffset,n.args[0].length);if(e[2]<=0)throw new z(`helix(): turns must be positive.`,n.argOffset,t.length-n.argOffset);if(e[3]!==void 0&&(!Number.isInteger(e[3])||e[3]<3))throw new z(`helix(): segmentsPerTurn must be an integer of at least 3.`,n.argOffset,t.length-n.argOffset);return{kind:`helix`,radius:e[0],pitch:e[1],turns:e[2],segmentsPerTurn:e[3]||0}}if(/^[Mm]/.test(t))try{let t=Ne(e,3);if(!t.segments.length)throw new z(`Empty 3D path.`,0,e.length);return{kind:`path`,segments:t.segments}}catch(e){throw e instanceof B?new z(e.message,e.offset,e.length,{code:e.code}):e}let r=mn(e);if(r.length%3!=0)throw new z(`Point lists need 3 numbers per point; found ${r.length} numbers.`,0,e.length);if(r.length<6)throw new z(`A spine needs at least 2 points.`,0,e.length);return{kind:`points`,points:Float64Array.from(r)}}function jn(e){let t=[],n=0;for(let r of e.split(`;`)){if(r.trim()===``){if(n+r.length<e.length||!t.length)throw new z(`Empty key value between semicolons.`,n,Math.max(1,r.length))}else try{t.push(mn(r))}catch(e){throw e instanceof z?new z(e.message,n+e.offset,e.length,{suggestion:e.suggestion,hint:e.hint}):e}n+=r.length+1}return t}function Mn(e,t){switch(e.type){case`number`:case`angle`:return ln(t);case`int`:return hn(t);case`bool`:return gn(t);case`string`:return t;case`id`:return yn(t);case`ref`:return bn(t);case`vec2`:return _n(t,2,`A 2D vector`);case`vec3`:return _n(t,3,`A 3D vector`);case`vec4`:return _n(t,4,`A 4D vector`);case`size2`:{let e=mn(t);if(e.length===1)return[e[0],e[0]];if(e.length===2)return e;throw new z(`Expected 1 or 2 numbers but found ${e.length}.`,0,t.length)}case`size3`:case`scale3`:{let e=mn(t);if(e.length===1)return[e[0],e[0],e[0]];if(e.length===3)return e;throw new z(`Expected 1 or 3 numbers but found ${e.length}.`,0,t.length)}case`count2`:{let e=mn(t);if(e.length!==2||!e.every(e=>Number.isInteger(e)&&e>=1))throw new z(`Expected two positive whole numbers, e.g. 10,10.`,0,t.length);return e}case`numbers`:return mn(t);case`color`:return wn(t);case`enum`:{let n=t.trim();if(e.values.includes(n))return n;throw new z(`Invalid value ${cn(n)}. Expected one of: ${e.values.join(`, `)}.`,0,t.length,{suggestion:f(n,e.values)})}case`transform`:return Dt(t);case`path2d`:try{let e=Ne(t,2);if(!e.segments.length)throw new z(`Empty path data.`,0,t.length);return{segments:e.segments,subpaths:e.subpaths}}catch(e){throw e instanceof B?new z(e.message,e.offset,e.length,{code:e.code}):e}case`spine`:return An(t);case`points2`:case`points3`:{let n=e.type===`points2`?2:3,r=dn(t,`f64`),i=r||pn(t);if(i.length%n!==0)throw new z(`Point lists need ${n} numbers per point; found ${i.length} numbers.`,0,t.length);return r||i.slice()}case`floats`:{let e=dn(t,`f32`);if(e)return e;let n=pn(t),r=new Float32Array(n.length);return r.set(n),r}case`indices`:{let e=dn(t,`index`);if(e)return e;let n=pn(t),r=new Uint32Array(n.length);for(let e=0;e<n.length;e++){let i=n[e];if(!Number.isInteger(i)||i<0)throw new z(`Indices must be non-negative whole numbers; found ${i} at position ${e}.`,0,t.length);r[e]=i}return r}case`range`:return xn(t);case`range3`:return Sn(t,e.uniform!==!1);case`idlist`:return Cn(t);case`texture`:return kn(t,Dn,`texture`);case`normalTexture`:return kn(t,On,`normal map`);case`duration`:return Tn(t);case`repeatCount`:{let e=t.trim();if(e===`indefinite`)return 1/0;let n=ln(e);if(n<=0)throw new z(`repeat must be positive or 'indefinite'.`,0,t.length);return n}case`animValue`:return mn(t);case`keyframes`:return jn(t);case`text`:return t;default:throw Error(`Unknown schema type '${e.type}'`)}}var Nn=new Set([...de,...fe,`use`,`light`]);function Pn(e){let t=[];for(let n=e;n;n=n.parent){let e=n.name;if(n.parent){let t=-1,r=0;for(let e of n.parent.children)e.type===`element`&&e.name===n.name&&(e===n&&(t=r),r++);r>1&&(e+=`[${t}]`)}let r=n.attr&&n.attr(`id`);r&&(e+=`#${r}`),t.unshift(e)}return t.join(` > `)}function Fn(e){let t=[];return e.exclusiveMin===void 0?e.min!==void 0&&t.push(`at least ${e.min}`):t.push(`greater than ${e.exclusiveMin}`),e.max!==void 0&&t.push(`at most ${e.max}`),t.join(` and `)}function In(e,t){return typeof t==`number`&&(e.exclusiveMin!==void 0&&!(t>e.exclusiveMin)||e.min!==void 0&&t<e.min||e.max!==void 0&&t>e.max)?Fn(e):null}var Ln=new WeakMap;function Rn(e){let t=Ln.get(e);return t||(t=Object.entries(e.attrs).filter(([,e])=>e.required).map(([e])=>e),Ln.set(e,t)),t}function zn(e){let t=new m(e.lineIndex);o(e),e.ids=new Map;let n=[],r=e=>e.nameStart>=0?{offset:e.nameStart,length:e.nameEnd-e.nameStart}:{offset:-1,length:0,path:Pn(e)},i=(e,t)=>t&&t.nameStart>=0?{offset:t.nameStart,length:t.nameEnd-t.nameStart}:r(e),a=(e,t,n)=>{if(!t||t.valueStart<0)return r(e);if(n&&!t.decoded&&n.offset!==void 0){let e=Math.min(t.valueStart+n.offset,t.valueEnd);return{offset:e,length:Math.max(1,Math.min(n.length||1,t.valueEnd-e))}}return{offset:t.valueStart,length:Math.max(1,t.valueEnd-t.valueStart)}},s=(e,n,r,i,a={},o=null)=>{t.add({severity:e,code:n,message:r,offset:i.offset,length:i.length,path:i.path||(i.offset<0&&o?Pn(o):null),uid:o?o.uid:0,...a})},c=e.root;if(!he.includes(c.name))return s(`error`,`E_ROOT`,`The root element must be <es3d> but found <${c.name}>.`,r(c),{suggestion:`es3d`},c),e.diagnostics=t.sorted(),e;c.name===`v3d`&&s(`warning`,`W_LEGACY_ROOT`,`The root element <v3d> is a legacy alias; write <es3d>.`,r(c),{},c);let l=0,u=0,d=0,p=(t,o,c)=>{let m=ve(t.name);if(!m){t.name.startsWith(`x-`)?s(`warning`,`W_EXTENSION`,`Extension element <${t.name}> is not supported by this reader; it and its children are not rendered.`,r(t),{},t):s(`error`,`E_UNKNOWN_ELEMENT`,`Unknown element: ${t.name}`,r(t),{suggestion:f(t.name,be.concat([`es3d`]))},t),t.values={},t.attrIndex={},t.unknown=!0;return}t.unknown=!1,t.name===`scene`&&++l>1&&s(`error`,`E_MULTIPLE_SCENES`,`Only one <scene> element is allowed.`,r(t),{},t),t.name===`environment`&&++u>1&&s(`warning`,`W_MULTIPLE_ENVIRONMENTS`,`More than one <environment>: only the first one is used.`,r(t),{},t),t.name===`controls`&&++d>1&&s(`warning`,`W_MULTIPLE_CONTROLS`,`More than one <controls>: only the first one is used.`,r(t),{},t);let h=_e(t.name),g={},_={};for(let r of t.attrs){let o=h.get(r.name);if(!o){if(r.name===`xmlns`||r.name.startsWith(`xmlns:`))continue;let e=[...h.keys()],n=f(r.name,e),a=null;if(!n){let e=Object.keys(m.attrs).filter(e=>![`id`,`name`,`transform`,`position`,`rotation`,`scale`,`visible`,`material`,`color`].includes(e));e.length&&(a=`<${t.name}> accepts: ${e.join(`, `)} (plus id, name, transform, position, rotation, scale, material, color).`)}s(`error`,`E_UNKNOWN_ATTRIBUTE`,`Unknown attribute: ${r.name}`,i(t,r),{suggestion:n,hint:a},t);continue}if(_[o]){s(`error`,`E_DUPLICATE_ATTRIBUTE`,`Attribute '${o}' is given twice (as '${_[o].name}' and '${r.name}').`,i(t,r),{},t);continue}_[o]=r;let c=m.attrs[o],l;try{l=r.typed===void 0?Mn(c,r.value):r.typed}catch(e){if(!(e instanceof z))throw e;s(`error`,e.code||`E_INVALID_VALUE`,`Invalid value for '${r.name}': ${e.message}`,a(t,r,e),{suggestion:e.suggestion,hint:e.hint},t);continue}let u=In(c,l);if(u)s(`error`,`E_RANGE`,`'${r.name}' must be ${u}; found ${l}.`,a(t,r),{},t);else{if(g[o]=l,c.type===`id`&&o===`id`){let n=e.ids.get(l);if(n){let i=``;n.nameStart>=0&&e.lineIndex&&(i=` (first defined at line ${e.lineIndex.position(n.nameStart).line})`),s(`error`,`E_DUPLICATE_ID`,`Duplicate id '${l}'${i}.`,a(t,r),{},t)}else e.ids.set(l,t)}if(c.type===`ref`&&n.push({el:t,attr:r,canonical:o,id:l,kind:c.ref}),c.type===`idlist`&&c.ref)for(let e of l)n.push({el:t,attr:r,canonical:o,id:e,kind:c.ref})}}t.values=g,t.attrIndex=_;for(let e of Rn(m))g[e]===void 0&&!_[e]&&s(`error`,`E_MISSING_ATTRIBUTE`,`<${t.name}> requires the attribute '${e}'.`,r(t),{hint:m.attrs[e].desc},t);if(m.check&&m.check(g,(e,n,i=`E_INVALID_VALUE`)=>{let o=e?_[e]:null;s(`error`,i,n,o?a(t,o):r(t),{},t)},t,e=>g[e]!==void 0||!!_[e]),t.text!==null&&t.text.trim()!==``&&m.children!==`text`){let e=t.textStart>=0?{offset:t.textStart,length:Math.max(1,Math.min(20,t.textEnd-t.textStart))}:r(t);s(`error`,`E_TEXT_NOT_ALLOWED`,`Text content is not allowed inside <${t.name}>.`,e,{},t)}c&&t.parent&&t.parent.name===`defs`&&g.id===void 0&&!_.id&&s(`warning`,`W_DEF_WITHOUT_ID`,`<${t.name}> inside <defs> has no id, so it can never be used.`,r(t),{},t),t.name===`material`&&g.id===void 0&&!_.id&&s(`warning`,`W_MATERIAL_WITHOUT_ID`,`<material> without an id can never be referenced.`,r(t),{},t);let v=m.children;for(let e of t.children)if(e.type===`element`){if(v===`text`||!Array.isArray(v)||!v.includes(e.name)){let n=ve(e.name);if((n||!e.name.startsWith(`x-`))&&n){let n=null;e.name===`animate`?n=`<animate> can only be placed inside an element with a transform (shapes, group, use, repeat, scatter, lod, light, camera).`:e.name===`scene`||e.name===`defs`?n=`<${e.name}> is only allowed directly inside <es3d>.`:e.name===`controls`?n=`<controls> is only allowed directly inside <es3d> or <scene>.`:m.category===`shape`&&(n=`Shapes cannot contain other shapes; wrap them in a <group>.`),s(`error`,`E_MISPLACED_ELEMENT`,`<${e.name}> is not allowed inside <${t.name}>.`,r(e),{hint:n},e)}}p(e,m,c||t.name===`defs`)}};p(c,null,!1);let h={material:`material`,path:`path`,node:`element`};for(let i of n){let n=e.ids.get(i.id),a=()=>i.attr.valueStart>=0?{offset:i.attr.valueStart,length:Math.max(1,i.attr.valueEnd-i.attr.valueStart)}:r(i.el);if(!n){let n=a(),r=[...e.ids.entries()].filter(([,e])=>i.kind===`material`?e.name===`material`:i.kind===`path`?e.name===`path`:Nn.has(e.name)).map(([e])=>e);t.add({phase:`reference`,code:`E_UNKNOWN_REFERENCE`,message:`Unknown ${h[i.kind]} '${i.id}' referenced by ${i.attr.name}.`,offset:n.offset,length:n.length,path:n.path||null,suggestion:f(i.id,r),uid:i.el.uid});continue}let o=!0;if(i.kind===`material`?o=n.name===`material`:i.kind===`path`?o=n.name===`path`:i.kind===`node`&&(o=Nn.has(n.name)),!o){let e=a();t.add({phase:`reference`,code:`E_REFERENCE_KIND`,message:`${i.attr.name}="${i.id}" refers to a <${n.name}>, but a ${i.kind===`node`?`shape, group, use, repeat, scatter, lod or light`:`<${i.kind}>`} is required.`,offset:e.offset,length:e.length,path:e.path||null,uid:i.el.uid})}else i.canonical===`ref`&&(i.el.target=n),i.kind===`path`&&(i.el.pathTarget=n)}let g=new Map,_=e=>{if(g.has(e))return g.get(e);let t=[],n=[e];for(;n.length;){let e=n.pop();e.name===`use`&&e.target&&t.push(e);for(let t of e.children)t.type===`element`&&n.push(t)}return g.set(e,t),t},v=new Map,y=new Set,b=(e,n)=>{v.set(e,1);for(let r of _(e)){let e=r.target,i=v.get(e);if(i===1){if(!y.has(r)){y.add(r);let i=[...n.map(e=>e.values.id||e.name),e.values.id||e.name],a=r.attrIndex.ref;t.add({phase:`reference`,code:`E_CIRCULAR_REFERENCE`,message:`Circular reference: ${i.join(` → `)}.`,offset:a&&a.valueStart>=0?a.valueStart:r.nameStart,length:a&&a.valueStart>=0?a.valueEnd-a.valueStart:r.nameEnd-r.nameStart,path:r.nameStart<0?Pn(r):null,hint:`An element cannot (directly or indirectly) contain a <use> of itself.`,uid:r.uid})}r.circular=!0}else i||b(e,[...n,e])}v.set(e,2)};for(let t of new Set([...e.ids.values()]))v.has(t)||b(t,[t]);return e.diagnostics=t.sorted(),e}function Bn(e){let t=(e,t)=>{throw new u([new l({code:`E_JSON_STRUCTURE`,message:e,path:t})])},o=(e,a)=>{if(Array.isArray(e)&&typeof e[0]==`string`||t(`Expected an element array ["name", {attributes}, ...children].`,a),e[0]===`#comment`)return new r(String(e[1]??``));let s=new i(e[0]),c=1;if(e.length>1&&e[1]!==null&&typeof e[1]==`object`&&!Array.isArray(e[1])){for(let[r,i]of Object.entries(e[1]))typeof i==`object`&&i&&t(`Attribute '${r}' must be a string or number.`,`${a} > @${r}`),s.attrs.push(new n(r,String(i)));c=2}for(;c<e.length;c++){let t=e[c];typeof t==`string`?s.text=(s.text||``)+t:s.appendChild(o(t,`${a} > ${Array.isArray(t)?t[0]:`?`}[${c}]`))}return s.selfClosing=s.children.length===0&&s.text===null,s},s=o(e,Array.isArray(e)?String(e[0]):`root`);return s.type!==`element`&&t(`The root must be an element.`,`root`),new a({root:s,syntax:`json`})}function Vn(e){let t=0,n=e.length;for(e.charCodeAt(0)===65279&&(t=1);;){for(;t<n&&/\s/.test(e[t]);)t++;if(e.startsWith(`//`,t)){let r=e.indexOf(`
|
|
7
7
|
`,t);t=r<0?n:r+1}else if(e.startsWith(`/*`,t)){let r=e.indexOf(`*/`,t+2);t=r<0?n:r+2}else break}let r=e[t];return r===`<`?`xml`:r===`[`||r===`{`?`json`:`compact`}function Hn(e,t,n,r){let i=new a({root:null,syntax:t,source:n});return i.lineIndex=r,i.diagnostics=e instanceof u?e.diagnostics:[new l({code:`E_INTERNAL`,message:String(e&&e.message?e.message:e)})],i}function Un(e,t={}){typeof e!=`string`&&(e=new TextDecoder(`utf-8`).decode(e instanceof Uint8Array?e:new Uint8Array(e)));let n=e,r=t.syntax||Vn(n),i=new s(n),a;try{if(r===`xml`)a=j(n,i);else if(r===`compact`)a=re(n,i);else if(r===`json`){let e;try{e=JSON.parse(n)}catch(e){let t=/position (\d+)/.exec(e.message),n=new l({code:`E_JSON`,message:`Invalid JSON: ${e.message}`,offset:t?Number(t[1]):0,length:1});throw n.locate(i),new u([n],i)}a=Bn(e),a.source=n}else throw Error(`Unknown syntax '${r}'`)}catch(e){return Hn(e,r,n,i)}return!a.lineIndex&&r!==`json`&&(a.lineIndex=i),t.validate===!1?a:zn(a)}function Wn(e){let t=/<([^<>\s]+)>/.exec(e||``);return t?t[1]:``}function Gn(e,t){if(!e)return``;let n=Array.isArray(e)?e:e.diagnostics||[],r=t||e.lineIndex||e.doc&&e.doc.lineIndex||null,i=new Map,a=[];for(let e of n){if(!e||e.severity!==`warning`){a.push(e);continue}let t=`${e.code}\0${Wn(e.message)}\0${e.message}`,n=i.get(t);if(n){n.count++;continue}let r={d:e,count:1};i.set(t,r),a.push(r)}return a.map(e=>{if(!e||!e.d)return e.format(r);let t=e.d.format(r);return e.count<2?t:`${t}\n\nReported ${e.count} times. Showing the first.`}).join(`
|
|
8
8
|
|
|
9
|
-
`)}var Kn=Math.cos(8*Math.PI/180),qn=256;function Jn(e,t){let n=Math.hypot(e,t);return n>1e-12?[e/n,t/n,0]:null}function Yn(e,t,n){let r=Math.hypot(e,t,n);return r>1e-12?[e/r,t/r,n/r]:null}var Xn=class{constructor(e){this.dim=e,this.pts=[],this.smooth=[],this.firstTan=null,this.lastTan=null,this.closed=!1}get count(){return this.smooth.length}lastPoint(){let e=this.dim,t=this.pts,n=t.length-e;return e===3?[t[n],t[n+1],t[n+2]]:[t[n],t[n+1],0]}start(e,t,n){this.pts.push(e,t),this.dim===3&&this.pts.push(n),this.smooth.push(0)}joint(e){if(e){if(this.lastTan){let t=this.lastTan[0]*e[0]+this.lastTan[1]*e[1]+this.lastTan[2]*e[2];this.smooth[this.smooth.length-1]=+(t>=Kn)}else this.firstTan=e}}push(e,t,n,r){let i=this.dim,a=this.pts,o=a.length-i;Math.abs(a[o]-e)<1e-12&&Math.abs(a[o+1]-t)<1e-12&&(i===2||Math.abs(a[o+2]-n)<1e-12)||(a.push(e,t),i===3&&a.push(n),this.smooth.push(+!!r))}end(e){e&&(this.lastTan=e)}};function Zn(e,t,n,r){return e===3?Yn(t,n,r):Jn(t,n)}function Qn(e,t){let n=t.dim||2,r=Math.max(t.tolerance,1e-9),i=t.maxSegments||qn,a=[],o=null,s=()=>{if(o){if(o.closed){let e=n,t=o.pts,r=o.count;if(r>1){let i=(r-1)*e;if(Math.abs(t[i]-t[0])<1e-9&&Math.abs(t[i+1]-t[1])<1e-9&&(e===2||Math.abs(t[i+2]-t[2])<1e-9))t.length-=e,o.smooth.pop();else{let r=Zn(n,t[0]-t[i],t[1]-t[i+1],e===3?t[2]-t[i+2]:0);o.joint(r),o.end(r)}}if(o.firstTan&&o.lastTan){let e=o.lastTan[0]*o.firstTan[0]+o.lastTan[1]*o.firstTan[1]+o.lastTan[2]*o.firstTan[2];o.smooth[0]=+(e>=Kn)}}o.count>=(o.closed?3:2)?a.push({points:Float64Array.from(o.pts),smooth:Uint8Array.from(o.smooth),closed:o.closed}):o.count>=2&&a.push({points:Float64Array.from(o.pts),smooth:Uint8Array.from(o.smooth),closed:!1,degenerate:!0}),o=null}};for(let t of e){if(t.c===`M`){s(),o=new Xn(n),o.start(t.x,t.y,t.z||0);continue}if(!o)continue;let[e,a,c]=o.lastPoint();switch(t.c){case`L`:{let r=Zn(n,t.x-e,t.y-a,(t.z||0)-c);if(!r)break;o.joint(r),o.push(t.x,t.y,t.z||0,!1),o.end(r);break}case`Q`:{let s=e,l=a,u=c,d=s-2*t.x1+t.x,f=l-2*t.y1+t.y,p=n===3?u-2*t.z1+t.z:0,m=Math.max(1,Math.min(i,Math.ceil(Math.sqrt(.25*Math.hypot(d,f,p)/r)))),h=Zn(n,t.x1-s,t.y1-l,(t.z1||0)-u)||Zn(n,t.x-s,t.y-l,(t.z||0)-u),g=Zn(n,t.x-t.x1,t.y-t.y1,(t.z||0)-(t.z1||0))||h;if(!h)break;o.joint(h);for(let e=1;e<=m;e++){let n=e/m,r=1-n,i=r*r,a=2*r*n,c=n*n;o.push(i*s+a*t.x1+c*t.x,i*l+a*t.y1+c*t.y,i*u+a*(t.z1||0)+c*(t.z||0),e<m)}o.end(g);break}case`C`:{let s=e,l=a,u=c,d=t.z1||0,f=t.z2||0,p=t.z||0,m=Math.hypot(s-2*t.x1+t.x2,l-2*t.y1+t.y2,n===3?u-2*d+f:0),h=Math.hypot(t.x1-2*t.x2+t.x,t.y1-2*t.y2+t.y,n===3?d-2*f+p:0),g=Math.max(1,Math.min(i,Math.ceil(Math.sqrt(.75*Math.max(m,h)/r)))),_=Zn(n,t.x1-s,t.y1-l,d-u)||Zn(n,t.x2-s,t.y2-l,f-u)||Zn(n,t.x-s,t.y-l,p-u),v=Zn(n,t.x-t.x2,t.y-t.y2,p-f)||Zn(n,t.x-t.x1,t.y-t.y1,p-d)||_;if(!_)break;o.joint(_);for(let e=1;e<=g;e++){let n=e/g,r=1-n,i=r*r*r,a=3*r*r*n,c=3*r*n*n,m=n*n*n;o.push(i*s+a*t.x1+c*t.x2+m*t.x,i*l+a*t.y1+c*t.y2+m*t.y,i*u+a*d+c*f+m*p,e<g)}o.end(v);break}case`A`:{let n=$n(e,a,t.rx,t.ry,t.rot,t.large,t.sweep,t.x,t.y);if(!n){let n=Zn(2,t.x-e,t.y-a,0);if(!n)break;o.joint(n),o.push(t.x,t.y,0,!1),o.end(n);break}let s=Math.max(n.rx,n.ry),c=r>=s?Math.PI/2:2*Math.acos(1-r/s),l=Math.max(1,Math.min(i,Math.ceil(Math.abs(n.dtheta)/c)));o.joint(n.tangentAt(n.theta1));for(let e=1;e<=l;e++){let r=n.theta1+n.dtheta*e/l;if(e===l)o.push(t.x,t.y,0,!1);else{let e=n.pointAt(r);o.push(e[0],e[1],0,!0)}}o.end(n.tangentAt(n.theta1+n.dtheta));break}case`Z`:o.closed=!0,s()}}return s(),a}function $n(e,t,n,r,i,a,o,s,c){if(e===s&&t===c||(n=Math.abs(n),r=Math.abs(r),n<1e-12||r<1e-12))return null;let l=i*Math.PI/180,u=Math.cos(l),d=Math.sin(l),f=(e-s)/2,p=(t-c)/2,m=u*f+d*p,h=-d*f+u*p,g=m*m/(n*n)+h*h/(r*r);if(g>1){let e=Math.sqrt(g);n*=e,r*=e}let _=n*n,v=r*r,y=_*v-_*h*h-v*m*m,b=_*h*h+v*m*m,x=b>0?Math.sqrt(Math.max(0,y/b)):0;a===o&&(x=-x);let S=x*n*h/r,C=-x*r*m/n,w=u*S-d*C+(e+s)/2,T=d*S+u*C+(t+c)/2,E=(e,t,n,r)=>Math.atan2(e*r-t*n,e*n+t*r),D=(m-S)/n,O=(h-C)/r,k=(-m-S)/n,A=(-h-C)/r,j=Math.atan2(O,D),M=E(D,O,k,A);!o&&M>0?M-=2*Math.PI:o&&M<0&&(M+=2*Math.PI);let N=M>=0?1:-1;return{cx:w,cy:T,rx:n,ry:r,theta1:j,dtheta:M,pointAt(e){let t=Math.cos(e),i=Math.sin(e);return[w+n*u*t-r*d*i,T+n*d*t+r*u*i]},tangentAt(e){let t=Math.cos(e),i=Math.sin(e);return Jn(N*(-n*u*i-r*d*t),N*(-n*d*i+r*u*t))}}}function er(e,t){let n=new Float64Array(t*2);for(let r=0;r<t;r++){let i=r/t*Math.PI*2;n[r*2]=Math.cos(i)*e,n[r*2+1]=Math.sin(i)*e}return{points:n,smooth:new Uint8Array(t).fill(1),closed:!0}}function tr(e){let t=0,n=e.length/2;for(let r=0,i=n-1;r<n;i=r++)t+=(e[i*2]-e[r*2])*(e[i*2+1]+e[r*2+1]);return t/2}function nr(e,t=2){let n=e.points.length/t,r=new Float64Array(e.points.length),i=new Uint8Array(n);for(let a=0;a<n;a++){let o=n-1-a;for(let n=0;n<t;n++)r[a*t+n]=e.points[o*t+n];i[a]=e.smooth[o]}return{...e,points:r,smooth:i}}function rr(e,t=null){let n=Zt(e,t);if(n)return n;let r=t&&t.length,i=r?t[0]*2:e.length,a=ar(e,0,i,2,!0),o=[];if(!a||a.next===a.prev)return o;r&&(a=fr(e,t,a,2));let s=0,c=0,l=0;if(e.length>160){s=1/0,c=1/0;let t=-1/0,n=-1/0;for(let r=0;r<i;r+=2){let i=e[r],a=e[r+1];i<s&&(s=i),a<c&&(c=a),i>t&&(t=i),a>n&&(n=a)}l=Math.max(t-s,n-c),l=l===0?0:32767/l}return sr(a,o,2,s,c,l,0),o}var ir=class{constructor(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}};ir.shapeKeeper=new ir(0,.5,.5);function ar(e,t,n,r,i){let a=null;if(i===Pr(e,t,n,r)>0)for(let i=t;i<n;i+=r)a=Mr(i/r,e[i],e[i+1],a);else for(let i=n-r;i>=t;i-=r)a=Mr(i/r,e[i],e[i+1],a);return a&&wr(a,a.next)&&(Nr(a),a=a.next),a}function or(e,t){if(!e)return e;t||=e;let n=e,r;do if(r=!1,!n.steiner&&(wr(n,n.next)||J(n.prev,n,n.next)===0)){if(Nr(n),n=t=n.prev,n===n.next)break;r=!0}else n=n.next;while(r||n!==t);return t}function sr(e,t,n,r,i,a,o){if(!e)return;!o&&a&&_r(e,r,i,a);let s=e;for(;e.prev!==e.next;){let c=e.prev,l=e.next;if(a?lr(e,r,i,a):cr(e))t.push(c.i,e.i,l.i),Nr(e),e=l.next,s=l.next;else if(e=l,e===s){o?o===1?(e=ur(or(e),t),sr(e,t,n,r,i,a,2)):o===2&&dr(e,t,n,r,i,a):sr(or(e),t,n,r,i,a,1);break}}}function cr(e){let t=e.prev,n=e,r=e.next;if(J(t,n,r)>=0)return!1;let i=t.x,a=n.x,o=r.x,s=t.y,c=n.y,l=r.y,u=Math.min(i,a,o),d=Math.min(s,c,l),f=Math.max(i,a,o),p=Math.max(s,c,l),m=r.next;for(;m!==t;){if(m.x>=u&&m.x<=f&&m.y>=d&&m.y<=p&&Sr(i,s,a,c,o,l,m.x,m.y)&&J(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function lr(e,t,n,r){let i=e.prev,a=e,o=e.next;if(J(i,a,o)>=0)return!1;let s=i.x,c=a.x,l=o.x,u=i.y,d=a.y,f=o.y,p=Math.min(s,c,l),m=Math.min(u,d,f),h=Math.max(s,c,l),g=Math.max(u,d,f),_=yr(p,m,t,n,r),v=yr(h,g,t,n,r),y=e.prevZ,b=e.nextZ;for(;y&&y.z>=_&&b&&b.z<=v;){if(y.x>=p&&y.x<=h&&y.y>=m&&y.y<=g&&y!==i&&y!==o&&Sr(s,u,c,d,l,f,y.x,y.y)&&J(y.prev,y,y.next)>=0||(y=y.prevZ,b.x>=p&&b.x<=h&&b.y>=m&&b.y<=g&&b!==i&&b!==o&&Sr(s,u,c,d,l,f,b.x,b.y)&&J(b.prev,b,b.next)>=0))return!1;b=b.nextZ}for(;y&&y.z>=_;){if(y.x>=p&&y.x<=h&&y.y>=m&&y.y<=g&&y!==i&&y!==o&&Sr(s,u,c,d,l,f,y.x,y.y)&&J(y.prev,y,y.next)>=0)return!1;y=y.prevZ}for(;b&&b.z<=v;){if(b.x>=p&&b.x<=h&&b.y>=m&&b.y<=g&&b!==i&&b!==o&&Sr(s,u,c,d,l,f,b.x,b.y)&&J(b.prev,b,b.next)>=0)return!1;b=b.nextZ}return!0}function ur(e,t){let n=e;do{let r=n.prev,i=n.next.next;!wr(r,i)&&Tr(r,n,n.next,i)&&kr(r,i)&&kr(i,r)&&(t.push(r.i,n.i,i.i),Nr(n),Nr(n.next),n=e=i),n=n.next}while(n!==e);return or(n)}function dr(e,t,n,r,i,a){let o=e;do{let e=o.next.next;for(;e!==o.prev;){if(o.i!==e.i&&Cr(o,e)){let s=jr(o,e);o=or(o,o.next),s=or(s,s.next),sr(o,t,n,r,i,a,0),sr(s,t,n,r,i,a,0);return}e=e.next}o=o.next}while(o!==e)}function fr(e,t,n,r){let i=[];for(let n=0,a=t.length;n<a;n++){let o=ar(e,t[n]*r,n<a-1?t[n+1]*r:e.length,r,!1);o&&(o===o.next&&(o.steiner=!0),i.push(br(o)))}i.sort(pr);for(let e=0;e<i.length;e++)n=mr(i[e],n);return n}function pr(e,t){let n=e.x-t.x;return n===0&&(n=e.y-t.y,n===0&&(n=(e.next.y-e.y)/(e.next.x-e.x)-(t.next.y-t.y)/(t.next.x-t.x))),n}function mr(e,t){let n=hr(e,t);if(!n)return t;let r=jr(n,e);return or(r,r.next),or(n,n.next)}function hr(e,t){let n=t,r=e.x,i=e.y,a=-1/0,o=null;if(wr(e,n))return n;do{if(wr(e,n.next))return n.next;if(i<=n.y&&i>=n.next.y&&n.next.y!==n.y){let e=n.x+(i-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(e<=r&&e>a&&(a=e,o=n.x<n.next.x?n:n.next,e===r))return o}n=n.next}while(n!==t);if(!o)return null;let s=o,c=o.x,l=o.y,u=1/0;n=o;do{if(r>=n.x&&n.x>=c&&r!==n.x&&xr(i<l?r:a,i,c,l,i<l?a:r,i,n.x,n.y)){let t=Math.abs(i-n.y)/(r-n.x);kr(n,e)&&(t<u||t===u&&(n.x>o.x||n.x===o.x&&gr(o,n)))&&(o=n,u=t)}n=n.next}while(n!==s);return o}function gr(e,t){return J(e.prev,e,t.prev)<0&&J(t.next,e,e.next)<0}function _r(e,t,n,r){let i=e;do i.z===0&&(i.z=yr(i.x,i.y,t,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,vr(i)}function vr(e){let t,n=1;do{let r=e,i;e=null;let a=null;for(t=0;r;){t++;let o=r,s=0;for(let e=0;e<n&&(s++,o=o.nextZ,o);e++);let c=n;for(;s>0||c>0&&o;)s!==0&&(c===0||!o||r.z<=o.z)?(i=r,r=r.nextZ,s--):(i=o,o=o.nextZ,c--),a?a.nextZ=i:e=i,i.prevZ=a,a=i;r=o}a.nextZ=null,n*=2}while(t>1);return e}function yr(e,t,n,r,i){return e=(e-n)*i|0,t=(t-r)*i|0,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e|t<<1}function br(e){let t=e,n=e;do(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next;while(t!==e);return n}function xr(e,t,n,r,i,a,o,s){return(i-o)*(t-s)>=(e-o)*(a-s)&&(e-o)*(r-s)>=(n-o)*(t-s)&&(n-o)*(a-s)>=(i-o)*(r-s)}function Sr(e,t,n,r,i,a,o,s){return(e!==o||t!==s)&&xr(e,t,n,r,i,a,o,s)}function Cr(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!Or(e,t)&&(kr(e,t)&&kr(t,e)&&Ar(e,t)&&(J(e.prev,e,t.prev)||J(e,t.prev,t))||wr(e,t)&&J(e.prev,e,e.next)>0&&J(t.prev,t,t.next)>0)}function J(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function wr(e,t){return e.x===t.x&&e.y===t.y}function Tr(e,t,n,r){let i=Dr(J(e,t,n)),a=Dr(J(e,t,r)),o=Dr(J(n,r,e)),s=Dr(J(n,r,t));return!!(i!==a&&o!==s||i===0&&Er(e,n,t)||a===0&&Er(e,r,t)||o===0&&Er(n,e,r)||s===0&&Er(n,t,r))}function Er(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function Dr(e){return e>0?1:e<0?-1:0}function Or(e,t){let n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&Tr(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}function kr(e,t){return J(e.prev,e,e.next)<0?J(e,t,e.next)>=0&&J(e,e.prev,t)>=0:J(e,t,e.prev)<0||J(e,e.next,t)<0}function Ar(e,t){let n=e,r=!1,i=(e.x+t.x)/2,a=(e.y+t.y)/2;do n.y>a!=n.next.y>a&&n.next.y!==n.y&&i<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==e);return r}function jr(e,t){let n=new ir(e.i,e.x,e.y),r=new ir(t.i,t.x,t.y),i=e.next,a=t.prev;return e.next=t,t.prev=e,n.next=i,i.prev=n,r.next=n,n.prev=r,a.next=r,r.prev=a,r}function Mr(e,t,n,r){let i=new ir(e,t,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function Nr(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Pr(e,t,n,r){let i=0;for(let a=t,o=n-r;a<n;a+=r)i+=(e[o]-e[a])*(e[a+1]+e[o+1]),o=a;return i}function Fr(e,t,n){let r=(t,n)=>{let r=0;for(let i=t,a=n-2;i<n;i+=2)r+=(e[a]-e[i])*(e[i+1]+e[a+1]),a=i;return Math.abs(r/2)},i=r(0,t&&t.length?t[0]*2:e.length);if(t)for(let n=0;n<t.length;n++){let a=t[n]*2,o=n<t.length-1?t[n+1]*2:e.length;i-=r(a,o)}let a=0;for(let t=0;t<n.length;t+=3){let r=n[t]*2,i=n[t+1]*2,o=n[t+2]*2;a+=Math.abs((e[r]-e[o])*(e[i+1]-e[r+1])-(e[r]-e[i])*(e[o+1]-e[r+1]))/2}return i===0&&a===0?0:Math.abs(i-a)/Math.max(Math.abs(i),1e-12)}function Ir(e,t,n){let r=!1,i=e.length/2;for(let a=0,o=i-1;a<i;o=a++){let i=e[a*2],s=e[a*2+1],c=e[o*2],l=e[o*2+1];s>n!=l>n&&t<(c-i)*(n-s)/(l-s)+i&&(r=!r)}return r}function Lr(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a=0;a<e.length;a+=2){let o=e[a],s=e[a+1];o<t&&(t=o),s<n&&(n=s),o>r&&(r=o),s>i&&(i=s)}return{minX:t,minY:n,maxX:r,maxY:i}}function Rr(e){let t=e.length/2;for(let n=0;n<Math.min(t,8);n++){let r=(n-1+t)%t*2,i=n*2,a=(n+1)%t*2,o=(e[r]+e[i]+e[a])/3,s=(e[r+1]+e[i+1]+e[a+1])/3;if(Ir(e,o,s))return[o,s]}return[e[0],e[1]]}function zr(e,t=`nonzero`){let n=[];for(let t of e){if(t.points.length<6)continue;let e=tr(t.points);Math.abs(e)<1e-14||n.push({c:t,area:e,abs:Math.abs(e),box:Lr(t.points),parent:-1,depth:0,winding:0,children:[]})}n.sort((e,t)=>t.abs-e.abs);for(let e=0;e<n.length;e++){let r=n[e],[i,a]=Rr(r.c.points);for(let t=e-1;t>=0;t--){let e=n[t],o=e.box;if(!(i<o.minX||i>o.maxX||a<o.minY||a>o.maxY)&&Ir(e.c.points,i,a)){r.parent=t;break}}let o=r.area>0?1:-1;if(r.parent>=0){let t=n[r.parent];r.depth=t.depth+1,r.winding=t.winding+o,t.children.push(e)}else r.depth=0,r.winding=o;r.filled=t===`evenodd`?r.depth%2==0:r.winding!==0}for(let e of n)e.isWall=e.filled!==(e.parent>=0&&n[e.parent].filled);let r=(e,t)=>({...tr(e.c.points)>0===t?e.c:nr(e.c),isWall:e.isWall}),i=[],a=[];for(let e=0;e<n.length;e++){let t=n[e];t.filled&&i.push({outer:r(t,!0),holes:t.children.map(e=>r(n[e],!1))}),t.isWall&&a.push(r(t,t.filled))}return{regions:i,walls:a}}function Br(e){let t=e.outer.points.length;for(let n of e.holes)t+=n.points.length;let n=new Float64Array(t),r=new Uint8Array(t/2);n.set(e.outer.points,0),r.set(e.outer.smooth,0);let i=[],a=e.outer.points.length;for(let t of e.holes)i.push(a/2),n.set(t.points,a),r.set(t.smooth,a/2),a+=t.points.length;let o=rr(n,i.length?i:null);return{positions:n,smooth:r,indices:o,holeIndices:i,error:Fr(n,i.length?i:null,o)}}var Y=class e{constructor(e){this.positions=e.positions;let t=this.positions.length/3;this.normals=e.normals||new Float32Array(t*3),this.uvs=e.uvs||new Float32Array(t*2),this.indices=e.indices,this.kind=e.kind||`triangles`,this._bounds=null,this._edges=null,this._normalLines=null}get vertexCount(){return this.positions.length/3}get primitiveCount(){return this.kind===`lines`?this.indices.length/2:this.indices.length/3}get byteSize(){return this.positions.byteLength+this.normals.byteLength+this.uvs.byteLength+this.indices.byteLength}get bounds(){if(!this._bounds){let e=this.positions,t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let r=0;r<e.length;r+=3)for(let i=0;i<3;i++){let a=e[r+i];a<t[i]&&(t[i]=a),a>n[i]&&(n[i]=a)}e.length===0&&(t.fill(0),n.fill(0)),this._bounds={min:t,max:n}}return this._bounds}edges(){if(this._edges)return this._edges;if(this.kind===`lines`)return this._edges=this.indices;let e=Vr(this.positions),t=new Set,n=[],r=this.indices,i=this.vertexCount;for(let a=0;a<r.length;a+=3)for(let o=0;o<3;o++){let s=r[a+o],c=r[a+(o+1)%3],l=e[s],u=e[c];if(l===u)continue;let d=l<u?l*i+u:u*i+l;t.has(d)||(t.add(d),n.push(s,c))}return this._edges=Uint32Array.from(n),this._edges}normalLines(){if(this._normalLines)return this._normalLines;let t=this.vertexCount,n=new Float32Array(t*6),r=new Float32Array(t*6),i=new Float32Array(t*4),a=new Uint32Array(t*2);for(let e=0;e<t;e++){for(let t=0;t<3;t++)n[e*6+t]=this.positions[e*3+t],n[e*6+3+t]=this.positions[e*3+t],r[e*6+t]=this.normals[e*3+t],r[e*6+3+t]=this.normals[e*3+t];i[e*4+2]=1,a[e*2]=e*2,a[e*2+1]=e*2+1}return this._normalLines=new e({positions:n,normals:r,uvs:i,indices:a,kind:`lines`}),this._normalLines}};function Vr(e){let t=e.length/3,n=new Uint32Array(t),r=16;for(;r<t*2;)r*=2;let i=r-1,a=new Int32Array(r).fill(-1),o=new Float64Array(t*3);for(let n=0;n<t*3;n++)o[n]=Math.round(e[n]*1e6);for(let e=0;e<t;e++){let t=o[e*3],r=o[e*3+1],s=o[e*3+2],c=(Math.imul(t|0,73856093)^Math.imul(r|0,19349663)^Math.imul(s|0,83492791))&i;for(;;){let l=a[c];if(l<0){a[c]=e,n[e]=e;break}if(o[l*3]===t&&o[l*3+1]===r&&o[l*3+2]===s){n[e]=l;break}c=c+1&i}}return n}var X=class{constructor(e=`triangles`,t=256,n=768){this.kind=e,t=Math.max(1,t),n=Math.max(1,n),this.p=new Float32Array(t*3),this.n=new Float32Array(t*3),this.t=new Float32Array(t*2),this.i=new Uint32Array(n),this.vc=0,this.ic=0}growV(e){let t=this.vc+e;if(t*3<=this.p.length)return;let n=this.p.length/3;for(;n<t;)n*=2;let r=new Float32Array(n*3);r.set(this.p);let i=new Float32Array(n*3);i.set(this.n);let a=new Float32Array(n*2);a.set(this.t),this.p=r,this.n=i,this.t=a}growI(e){let t=this.ic+e;if(t<=this.i.length)return;let n=this.i.length;for(;n<t;)n*=2;let r=new Uint32Array(n);r.set(this.i),this.i=r}vertex(e,t,n,r=0,i=0,a=0,o=0,s=0){this.vc*3>=this.p.length&&this.growV(1);let c=this.vc;return this.p[c*3]=e,this.p[c*3+1]=t,this.p[c*3+2]=n,this.n[c*3]=r,this.n[c*3+1]=i,this.n[c*3+2]=a,this.t[c*2]=o,this.t[c*2+1]=s,this.vc++,c}tri(e,t,n){this.ic+3>this.i.length&&this.growI(3),this.i[this.ic++]=e,this.i[this.ic++]=t,this.i[this.ic++]=n}quad(e,t,n,r){this.tri(e,t,n),this.tri(e,n,r)}line(e,t){this.ic+2>this.i.length&&this.growI(2),this.i[this.ic++]=e,this.i[this.ic++]=t}get vertexCount(){return this.vc}build(){let e=(e,t)=>e.length===t?e:e.slice(0,t);return new Y({positions:e(this.p,this.vc*3),normals:e(this.n,this.vc*3),uvs:e(this.t,this.vc*2),indices:e(this.i,this.ic),kind:this.kind})}};X.shapeKeeper=new X(`triangles`,1,1);function Hr(e,t,n=30,r=null){let i=Math.min(Math.max(n,0),180),a=Math.cos(i*Math.PI/180);if(i===i){let n=Wt(e,t,i,a,r);if(n)return new Y({...n,kind:`triangles`})}let o=t.length/3,s=new Float64Array(o*3),c=new Float64Array(o*3);for(let n=0;n<o;n++){let r=t[n*3]*3,i=t[n*3+1]*3,a=t[n*3+2]*3,o=e[i]-e[r],l=e[i+1]-e[r+1],u=e[i+2]-e[r+2],d=e[a]-e[r],f=e[a+1]-e[r+1],p=e[a+2]-e[r+2],m=l*p-u*f,h=u*d-o*p,g=o*f-l*d;s[n*3]=m,s[n*3+1]=h,s[n*3+2]=g;let _=Math.sqrt(m*m+h*h+g*g)||1;c[n*3]=m/_,c[n*3+1]=h/_,c[n*3+2]=g/_}let l=Vr(e),u=e.length/3,d=null,f=null;if(i>0&&i<180){d=new Uint32Array(u+1);for(let e=0;e<t.length;e++)d[l[t[e]]+1]++;for(let e=0;e<u;e++)d[e+1]+=d[e];f=new Uint32Array(t.length);let e=d.slice(0,u);for(let n=0;n<t.length;n++)f[e[l[t[n]]]++]=n/3|0}let p=null;if(i>=180){p=new Float64Array(u*3);for(let e=0;e<t.length;e++){let n=l[t[e]]*3,r=(e/3|0)*3;p[n]+=s[r],p[n+1]+=s[r+1],p[n+2]+=s[r+2]}for(let e=0;e<u*3;e+=3){let t=p[e],n=p[e+1],r=p[e+2],i=Math.sqrt(t*t+n*n+r*r)||1;p[e]=t/i,p[e+1]=n/i,p[e+2]=r/i}}let m=Math.max(1,u),h=new Float32Array(m*3),g=new Float32Array(m*3),_=new Float32Array(m*2),v=new Uint32Array(t.length),y=0,b=p!==null;for(let e=0;b&&e<u*3;e++)p[e]!==p[e]&&(b=!1);if(b){let n=new Int32Array(u).fill(-1);for(let i=0;i<t.length;i++){let a=t[i],o=n[a];if(o<0){o=n[a]=y++;let t=l[a]*3;h[o*3]=e[a*3],h[o*3+1]=e[a*3+1],h[o*3+2]=e[a*3+2],g[o*3]=p[t],g[o*3+1]=p[t+1],g[o*3+2]=p[t+2],r&&(_[o*2]=r[a*2],_[o*2+1]=r[a*2+1])}v[i]=o}}else{let n=new Int32Array(u).fill(-1),o=new Int32Array(m),b=new Int32Array(m*3);for(let u=0;u<t.length;u++){let x=u/3|0,S=t[u],C=l[S],w=0,T=0,E=0;if(i<=0)w=c[x*3],T=c[x*3+1],E=c[x*3+2];else if(p)w=p[C*3],T=p[C*3+1],E=p[C*3+2];else{let e=c[x*3],t=c[x*3+1],n=c[x*3+2];for(let r=d[C];r<d[C+1];r++){let i=f[r];(i===x||c[i*3]*e+c[i*3+1]*t+c[i*3+2]*n>=a)&&(w+=s[i*3],T+=s[i*3+1],E+=s[i*3+2])}let r=Math.sqrt(w*w+T*T+E*E)||1;w/=r,T/=r,E/=r}let D=Math.round(w*1e4),O=Math.round(T*1e4),k=Math.round(E*1e4),A=n[S];for(;A>=0&&(b[A*3]!==D||b[A*3+1]!==O||b[A*3+2]!==k);)A=o[A];if(A<0){if(A=y++,A>=m){m*=2;let e=(e,t)=>{let n=new e.constructor(m*t);return n.set(e),n};h=e(h,3),g=e(g,3),_=e(_,2),o=e(o,1),b=e(b,3)}h[A*3]=e[S*3],h[A*3+1]=e[S*3+1],h[A*3+2]=e[S*3+2],g[A*3]=w,g[A*3+1]=T,g[A*3+2]=E,r&&(_[A*2]=r[S*2],_[A*2+1]=r[S*2+1]),o[A]=n[S],n[S]=A,b[A*3]=D,b[A*3+1]=O,b[A*3+2]=k}v[u]=A}}let x=(e,t)=>e.length===t?e:e.slice(0,t);return new Y({positions:x(h,y*3),normals:x(g,y*3),uvs:x(_,y*2),indices:v,kind:`triangles`})}var Ur=Math.PI*2;function Z(e,t,n=1,r=3){return Math.max(r,Math.round(e*n/(1<<t)))}function Wr(){let e=new X(`triangles`,24,36);for(let[t,n,r]of[[[1,0,0],[0,0,-1],[0,1,0]],[[-1,0,0],[0,0,1],[0,1,0]],[[0,1,0],[1,0,0],[0,0,-1]],[[0,-1,0],[1,0,0],[0,0,1]],[[0,0,1],[1,0,0],[0,1,0]],[[0,0,-1],[-1,0,0],[0,1,0]]]){let i=[];for(let[a,o,s,c]of[[-1,-1,0,0],[1,-1,1,0],[1,1,1,1],[-1,1,0,1]])i.push(e.vertex(t[0]*.5+n[0]*.5*a+r[0]*.5*o,t[1]*.5+n[1]*.5*a+r[1]*.5*o,t[2]*.5+n[2]*.5*a+r[2]*.5*o,t[0],t[1],t[2],s,c));e.quad(i[0],i[1],i[2],i[3])}return e.build()}function Gr(e,t,n,r,i){let a=nn.roundedBox(e,t,n,r,i);if(a)return new Y({...a,kind:`triangles`});let o=[e/2,t/2,n/2],s=2*i+2,c=new X(`triangles`,6*s*s,6*(s-1)*(s-1)*6),l=new Float64Array(3),u=e=>{let t=e-r,n=[];for(let e=i;e>=1;e--)n.push(-t-r*Math.tan(e/i*Math.PI/4));n.push(-t,t);for(let e=1;e<=i;e++)n.push(t+r*Math.tan(e/i*Math.PI/4));return n};for(let[e,t,n,i]of[[0,1,[0,0,-1],[0,1,0]],[0,-1,[0,0,1],[0,1,0]],[1,1,[1,0,0],[0,0,-1]],[1,-1,[1,0,0],[0,0,1]],[2,1,[1,0,0],[0,1,0]],[2,-1,[-1,0,0],[0,1,0]]]){let a=n.findIndex(e=>e!==0),s=i.findIndex(e=>e!==0),d=u(o[a]).map(e=>e*n[a]),f=u(o[s]).map(e=>e*i[s]),p=d.length,m=c.vertexCount;for(let u=0;u<p;u++)for(let m=0;m<p;m++){l[e]=t*o[e],l[a]=d[m],l[s]=f[u];let p=Math.max(-(o[0]-r),Math.min(o[0]-r,l[0])),h=Math.max(-(o[1]-r),Math.min(o[1]-r,l[1])),g=Math.max(-(o[2]-r),Math.min(o[2]-r,l[2])),_=l[0]-p,v=l[1]-h,y=l[2]-g,b=Math.hypot(_,v,y);b>1e-12?(_/=b,v/=b,y/=b):(_=e===0?t:0,v=e===1?t:0,y=e===2?t:0),c.vertex(p+_*r,h+v*r,g+y*r,_,v,y,(d[m]/o[a]/n[a]+1)/2,(f[u]/o[s]/i[s]+1)/2)}for(let e=0;e<p-1;e++)for(let t=0;t<p-1;t++){let n=m+e*p+t;c.quad(n,n+1,n+p+1,n+p)}}return c.build()}function Kr(e){let t=nn.sphere(e);if(t)return new Y({...t,kind:`triangles`});let n=Math.max(3,e),r=Math.max(2,Math.round(n/2)),i=new X(`triangles`,(n+1)*(r+1),n*(r-1)*6);for(let e=0;e<=r;e++){let t=e/r*Math.PI,a=Math.sin(t),o=Math.cos(t);for(let t=0;t<=n;t++){let s=t%n/n*Ur,c=a*Math.cos(s),l=o,u=-a*Math.sin(s);i.vertex(c,l,u,c,l,u,t/n,1-e/r)}}let a=n+1;for(let e=0;e<r;e++)for(let t=0;t<n;t++){let n=e*a+t,o=(e+1)*a+t,s=o+1,c=n+1;e!==r-1&&i.tri(n,o,s),e!==0&&i.tri(n,s,c)}return i.build()}function qr(e,t,n){let r=nn.cylinder(e,t,n);if(r)return new Y({...r,kind:`triangles`});let i=Math.max(3,t),a=new X(`triangles`,(i+1)*2+(n?i+2+(e>0?i+2:0):0),i*(e>0?6:3)+(n?i*3*(e>0?2:1):0)),o=1-e,s=[];for(let e=0;e<=i;e++){let t=e%i/i*Ur;s.push([Math.cos(t),-Math.sin(t)])}let c=(e,t)=>{let n=Math.hypot(e,o,t);return[e/n,o/n,t/n]},l=[],u=[];for(let t=0;t<=i;t++){let[n,r]=s[t],o=c(n,r);if(l.push(a.vertex(n,-.5,r,o[0],o[1],o[2],t/i,0)),e>0)u.push(a.vertex(n*e,.5,r*e,o[0],o[1],o[2],t/i,1));else{let e=(t+.5)/i*Ur,n=c(Math.cos(e),-Math.sin(e));u.push(a.vertex(0,.5,0,n[0],n[1],n[2],(t+.5)/i,1))}}for(let t=0;t<i;t++)e>0?a.quad(l[t],l[t+1],u[t+1],u[t]):a.tri(l[t],l[t+1],u[t]);if(n){let t=a.vertex(0,-.5,0,0,-1,0,.5,.5),n=[];for(let e=0;e<=i;e++)n.push(a.vertex(s[e][0],-.5,s[e][1],0,-1,0,s[e][0]*.5+.5,s[e][1]*.5+.5));for(let e=0;e<i;e++)a.tri(t,n[e+1],n[e]);if(e>0){let t=a.vertex(0,.5,0,0,1,0,.5,.5),n=[];for(let t=0;t<=i;t++)n.push(a.vertex(s[t][0]*e,.5,s[t][1]*e,0,1,0,s[t][0]*.5+.5,s[t][1]*.5+.5));for(let e=0;e<i;e++)a.tri(t,n[e],n[e+1])}}return a.build()}function Jr(e,t){let n=nn.capsule(e,t);if(n)return new Y({...n,kind:`triangles`});let r=Math.max(3,t),i=Math.max(1,Math.round(r/4)),a=[];for(let t=0;t<=i;t++)a.push([t/i*(Math.PI/2),e/2]);for(let t=0;t<=i;t++)a.push([Math.PI/2+t/i*(Math.PI/2),-e/2]);let o=e+2,s=a.length,c=new X(`triangles`,s*(r+1),r*3*(2*(s-1)-2));for(let e=0;e<a.length;e++){let[t,n]=a[e],i=Math.sin(t),s=Math.cos(t),l=s+n;for(let e=0;e<=r;e++){let t=e%r/r*Ur,n=i*Math.cos(t),a=-i*Math.sin(t);c.vertex(n,l,a,n,s,a,e/r,(l+o/2)/o)}}let l=r+1,u=a.length;for(let e=0;e<u-1;e++)for(let t=0;t<r;t++){let n=e*l+t,r=(e+1)*l+t,i=r+1,a=n+1;e!==u-2&&c.tri(n,r,i),e!==0&&c.tri(n,i,a)}return c.build()}function Yr(){let e=new X(`triangles`,4,6),t=e.vertex(-.5,0,.5,0,1,0,0,0),n=e.vertex(.5,0,.5,0,1,0,1,0),r=e.vertex(.5,0,-.5,0,1,0,1,1),i=e.vertex(-.5,0,-.5,0,1,0,0,1);return e.quad(t,n,r,i),e.build()}function Xr(e,t,n,r){let i=nn.torus(e,t,n,r);if(i)return new Y({...i,kind:`triangles`});let a=t>=360-1e-9,o=Math.min(t,360)*Math.PI/180,s=Math.max(3,Math.round(n*(a?1:t/360))||3),c=Math.max(3,r),l=new X(`triangles`,(s+1)*(c+1)+(a?0:2*(c+2)),s*c*6+(a?0:2*c*3));for(let t=0;t<=s;t++){let n=a?t%s/s*Ur:t/s*o,r=Math.cos(n),i=Math.sin(n);for(let n=0;n<=c;n++){let a=n%c/c*Ur,o=Math.cos(a),u=Math.sin(a),d=1+e*o;l.vertex(d*r,e*u,-d*i,o*r,u,-o*i,t/s,n/c)}}let u=c+1;for(let e=0;e<s;e++)for(let t=0;t<c;t++){let n=e*u+t;l.quad(n,n+u,n+u+1,n+1)}if(!a)for(let[t,n]of[[0,1],[o,-1]]){let r=Math.cos(t),i=Math.sin(t),a=-i,o=-r,s=-a*n,u=-o*n,d=l.vertex(r,0,-i,s,0,u,.5,.5),f=[];for(let t=0;t<=c;t++){let n=t%c/c*Ur,a=1+e*Math.cos(n);f.push(l.vertex(a*r,e*Math.sin(n),-a*i,s,0,u,.5+Math.cos(n)*.5,.5+Math.sin(n)*.5))}for(let e=0;e<c;e++)n>0?l.tri(d,f[e],f[e+1]):l.tri(d,f[e+1],f[e])}return l.build()}function Zr(e,t){let n=e.length/3,r=new X(`lines`,n,2*(n-1)+(t&&n>2?2:0));for(let t=0;t<n;t++)r.vertex(e[t*3],e[t*3+1],e[t*3+2],0,0,0,t/Math.max(1,n-1),0);for(let e=0;e<n-1;e++)r.line(e,e+1);return t&&n>2&&r.line(n-1,0),r.build()}function Qr(e){return 1-Math.cos(Math.PI/Math.max(3,e))}function $r(e,t,n,r,i,a,o,s,c){let l=r-e,u=i-t,d=a-n,f=o-e,p=s-t,m=c-n,h=u*m-d*p,g=d*f-l*m,_=l*p-u*f,v=Math.hypot(h,g,_);if(v<1e-14)return 1;h/=v,g/=v,_/=v;let y=e*h+t*g+n*_,b=y*h,x=y*g,S=y*_,C=f,w=p,T=m,E=l,D=u,O=d,k=b-e,A=x-t,j=S-n,M=C*C+w*w+T*T,N=C*E+w*D+T*O,P=E*E+D*D+O*O,F=C*k+w*A+T*j,ee=E*k+D*A+O*j,te=M*P-N*N;if(Math.abs(te)>1e-18){let e=1/te,t=(P*F-N*ee)*e,n=(M*ee-N*F)*e;if(t>=-1e-5&&n>=-1e-5&&t+n<=1+1e-5)return Math.abs(y)}return Math.min(ei(e,t,n,r,i,a),ei(r,i,a,o,s,c),ei(o,s,c,e,t,n))}function ei(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n,l=o*o+s*s+c*c,u=l>0?-(e*o+t*s+n*c)/l:0;return u<0?u=0:u>1&&(u=1),Math.hypot(e+o*u,t+s*u,n+c*u)}var ti=new Map;function ni(e){let t=Math.max(3,e|0),n=ti.get(t);return n===void 0&&(n=ri(t),ti.set(t,n)),n}function ri(e){let t=$t(e);if(t!==null)return t;let n=Math.max(2,Math.round(e/2)),r=Math.PI*2,i=new Float64Array(n+1),a=new Float64Array(n+1);for(let e=0;e<=n;e++){let t=e/n*Math.PI;i[e]=Math.sin(t),a[e]=Math.cos(t)}let o=new Float64Array(e+1),s=new Float64Array(e+1);for(let t=0;t<=e;t++){let n=t%e/e*r;o[t]=Math.cos(n),s[t]=Math.sin(n)}let c=0;for(let t=0;t<n;t++)for(let r=0;r<e;r++){let e=i[t]*o[r],l=a[t],u=-i[t]*s[r],d=i[t+1]*o[r],f=a[t+1],p=-i[t+1]*s[r],m=i[t+1]*o[r+1],h=a[t+1],g=-i[t+1]*s[r+1],_=i[t]*o[r+1],v=a[t],y=-i[t]*s[r+1];if(t!==n-1){let t=1-$r(e,l,u,d,f,p,m,h,g);t>c&&(c=t)}if(t!==0){let t=1-$r(e,l,u,m,h,g,_,v,y);t>c&&(c=t)}}return c}function ii(e,t){return Math.max(1,e,0)*Qr(t)}function ai(e){let t=Math.max(3,e|0),n=Math.max(1,Math.round(t/4));return Math.max(Qr(t),1-Math.cos(Math.PI/(2*n)))}function oi(e,t,n,r){let i=Math.max(3,Math.round(n*(t>=360-1e-9?1:t/360))||3);return e*Qr(Math.max(3,r))+(1+e)*Qr(i)}function si(e,t){return e*(1-Math.cos(Math.PI/(4*Math.max(1,t))))}function ci(e,t){return(e/2+1)*Qr(Math.max(3,t))}var li=[6e-4,.0025,.01,.035];function ui(e,t){return(e>0&&Number.isFinite(e)?e:1)*li[Math.min(li.length-1,Math.max(0,t))]}function di(e,t){return e>0?e*(1-Math.cos(Math.PI/(2*Math.max(1,t)))):0}var fi=4;function pi(e,t,n=!0){let r=e.length/2,i=n?r:r-1,a=new Float64Array(i*2);for(let t=0;t<i;t++){let n=(t+1)%r,i=e[n*2]-e[t*2],o=e[n*2+1]-e[t*2+1],s=Math.hypot(i,o)||1;a[t*2]=o/s,a[t*2+1]=-i/s}let o=new Float64Array(r*2),s=new Float64Array(r*2),c=new Uint8Array(r);for(let e=0;e<r;e++){let l=n||e>0,u=n||e<r-1,d=l?(e-1+i)%i:-1,f=u?e%i:-1,p,m,h,g;d>=0&&(p=a[d*2],m=a[d*2+1]),f>=0&&(h=a[f*2],g=a[f*2+1]),d<0&&(p=h,m=g),f<0&&(h=p,g=m);let _=p+h,v=m+g,y=Math.hypot(_,v);y<1e-9&&(_=p,v=m,y=1),_/=y,v/=y,o[e*2]=_,o[e*2+1]=v;let b=Math.max(_*p+v*m,1/fi);s[e*2]=_/b,s[e*2+1]=v/b,c[e]=t&&t[e]?0:1}let l=new Float64Array(r+1);for(let t=1;t<=r;t++){if(!n&&t===r){l[t]=l[t-1];break}let i=(t-1)%r,a=t%r;l[t]=l[t-1]+Math.hypot(e[a*2]-e[i*2],e[a*2+1]-e[i*2+1])}return{n:r,edges:i,edgeN:a,vertN:o,miter:s,corner:c,arc:l,length:l[n?r:r-1]}}function mi(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)for(let e=0;e<a.length;e+=2){let o=a[e],s=a[e+1];o<t&&(t=o),s<n&&(n=s),o>r&&(r=o),s>i&&(i=s)}return{minX:t,minY:n,maxX:r,maxY:i,size:Math.max(r-t,i-n)||1}}function hi(e){let t=[];for(let n of e){t.push(n.outer.points);for(let e of n.holes)t.push(e.points)}return mi(t)}function gi(e,t){e>.01&&t&&t(`warning`,`W_SELF_INTERSECTION`,`A filled contour appears to be self-intersecting; the triangulation covers ${(100*(1-e)).toFixed(1)}% of the expected area.`)}function _i(e,t){let n=[];for(let r of e){let e=Br(r);gi(e.error,t),n.push({region:r,...e})}return n}function vi(e,t){let n=_i(e,t),r=0,i=0;for(let e of n)r+=e.positions.length/2,i+=e.indices.length;let a=new X(`triangles`,r,i),o=hi(e);for(let e of n){let t=a.vertexCount,n=e.positions;for(let e=0;e<n.length;e+=2)a.vertex(n[e],n[e+1],0,0,0,1,(n[e]-o.minX)/o.size,(n[e+1]-o.minY)/o.size);let r=e.indices;for(let e=0;e<r.length;e+=3)a.tri(t+r[e],t+r[e+1],t+r[e+2])}return a.build()}function yi(e,t){let n=e.points;if(!t||e.isWall===!1)return n;let r=pi(n,e.smooth,!0),i=new Float64Array(n.length);for(let e=0;e<n.length;e+=2)i[e]=n[e]-r.miter[e]*t,i[e+1]=n[e+1]-r.miter[e+1]*t;return i}function bi(e,t,n){let r=[];if(!(t>0))return r.push({inset:0,z:0,nr:1,nz:0},{inset:0,z:e,nr:1,nz:0}),r;for(let e=0;e<=n;e++){let i=e/n*(Math.PI/2);r.push({inset:t*(1-Math.sin(i)),z:t*(1-Math.cos(i)),nr:Math.sin(i),nz:-Math.cos(i)})}for(let i=n;i>=0;i--){let a=i/n*(Math.PI/2),o={inset:t*(1-Math.sin(a)),z:e-t*(1-Math.cos(a)),nr:Math.sin(a),nz:Math.cos(a)};i===n&&Math.abs(o.z-r[r.length-1].z)<1e-12||r.push(o)}return r}function xi(e,t,n){let r=t.depth,i=Math.min(t.bevel||0,r/2),a=t.bevelSegments||3,o=t.center?-r/2:0,s=hi(e.regions),c=s.size,l=bi(r,i,a),u=Qt(e,i,l,o,o+r,s.minX,s.minY,c);if(u){for(let e of u.errors)gi(e,n);return new Y({positions:u.positions,normals:u.normals,uvs:u.uvs,indices:u.indices,kind:`triangles`})}let d=_i(e.regions.map(e=>({outer:{...e.outer,points:yi(e.outer,i)},holes:e.holes.map(e=>({...e,points:yi(e,i)}))})),n),f=e.walls.map(e=>({pts:e.points,f:pi(e.points,e.smooth,!0)})),p=0,m=0;for(let e of d)p+=e.positions.length,m+=2*e.indices.length;for(let{f:e}of f)p+=e.n*l.length*2,m+=e.n*(l.length-1)*6;let h=new X(`triangles`,p,m);for(let e of d){let t=e.positions,n=e.indices;for(let[e,i]of[[o+r,1],[o,-1]]){let r=h.vertexCount;for(let n=0;n<t.length;n+=2)h.vertex(t[n],t[n+1],e,0,0,i,(t[n]-s.minX)/c,(t[n+1]-s.minY)/c);for(let e=0;e<n.length;e+=3)i>0?h.tri(r+n[e],r+n[e+1],r+n[e+2]):h.tri(r+n[e],r+n[e+2],r+n[e+1])}}for(let{pts:e,f:t}of f){let n=t.n;for(let r=0;r<n;r++){let i=r,a=(r+1)%n,s=t.corner[i]?t.edgeN[r*2]:t.vertN[i*2],u=t.corner[i]?t.edgeN[r*2+1]:t.vertN[i*2+1],d=t.corner[a]?t.edgeN[r*2]:t.vertN[a*2],f=t.corner[a]?t.edgeN[r*2+1]:t.vertN[a*2+1],p=t.arc[r]/c,m=t.arc[r+1]/c,g=-1,_=-1;for(let n of l){let r=e[i*2]-t.miter[i*2]*n.inset,l=e[i*2+1]-t.miter[i*2+1]*n.inset,v=e[a*2]-t.miter[a*2]*n.inset,y=e[a*2+1]-t.miter[a*2+1]*n.inset,b=o+n.z,x=h.vertex(r,l,b,s*n.nr,u*n.nr,n.nz,p,n.z/c),S=h.vertex(v,y,b,d*n.nr,f*n.nr,n.nz,m,n.z/c);g>=0&&h.quad(g,_,S,x),g=x,_=S}}}return h.build()}function Si(e){let t=e.points,n=t.length/2,r=new Float64Array(t.length+4);return r.set(t),r[t.length]=0,r[t.length+1]=t[(n-1)*2+1],r[t.length+2]=0,r[t.length+3]=t[1],tr(r)>=0?e:nr(e)}function Ci(e,t,n){let r=t.angle>=360-1e-9,i=Math.min(t.angle,360)*Math.PI/180,a=Math.max(2,t.segments),o=!1,s=[];for(let t of e){let e=t.points;for(let t=0;t<e.length;t+=2)if(e[t]<-1e-9){n&&n(`error`,`E_REVOLVE_AXIS`,`The revolve profile crosses the axis: point (${e[t]}, ${e[t+1]}) has x < 0. Profiles must stay at x ≥ 0.`);break}let i=t.closed;i||(o=!0);let a=i?tr(t.points)>0?t:nr(t):Si(t),c=a.points,l=c.length/2;if(l<2)continue;let u=pi(c,a.smooth,i),d=u.length||1,f=[],p=new Int32Array(l).fill(-1),m=new Int32Array(l).fill(-1),h=(e,t,n,r,i)=>f.push(e,t,n,r,i)/5-1;for(let e=0;e<l;e++){let t=i?(e-1+l)%l:e-1,n=i||e<l-1?e:-1,r=Math.max(0,c[e*2]),a=c[e*2+1],o=u.arc[e]/d;if(t>=0&&n>=0&&u.corner[e])p[e]=h(r,a,u.edgeN[t*2],u.edgeN[t*2+1],o),m[e]=h(r,a,u.edgeN[n*2],u.edgeN[n*2+1],o);else{let i=n>=0?n:t,s=u.corner[e]?h(r,a,u.edgeN[i*2],u.edgeN[i*2+1],o):h(r,a,u.vertN[e*2],u.vertN[e*2+1],o);p[e]=s,m[e]=s}}let g=!r&&i?rr(c):null;s.push({closed:i,pts:c,n:l,entries:f,entryIn:p,entryOut:m,tri:g})}let c=0,l=0;for(let e of s)c+=e.entries.length/5*(a+1),l+=(e.closed?e.n:e.n-1)*a*6,e.tri&&(c+=2*e.n,l+=2*e.tri.length);let u=new X(`triangles`,c,l),d=new Float64Array(a+1),f=new Float64Array(a+1);for(let e=0;e<=a;e++){let t=i*e/a;d[e]=Math.cos(t),f[e]=Math.sin(t)}for(let{closed:e,pts:t,n,entries:r,entryIn:o,entryOut:c,tri:l}of s){let s=u.vertexCount,p=a+1;for(let e=0;e<r.length;e+=5){let t=r[e],n=r[e+1],i=r[e+2],o=r[e+3],s=r[e+4];for(let e=0;e<=a;e++){let r=d[e],c=f[e];u.vertex(t*r,n,-t*c,i*r,o,-i*c,e/a,s)}}let m=e?n:n-1;for(let e=0;e<m;e++){let t=c[e],r=o[(e+1)%n];for(let e=0;e<a;e++){let n=s+t*p+e,i=s+r*p+e;u.quad(n,n+1,i+1,i)}}if(l)for(let[e,r]of[[0,1],[i,-1]]){let i=Math.cos(e),a=Math.sin(e),o=u.vertexCount;for(let e=0;e<n;e++){let n=Math.max(0,t[e*2]),o=t[e*2+1];u.vertex(n*i,o,-n*a,r>0?0:-a,0,r>0?1:-i,n,o)}for(let e=0;e<l.length;e+=3)r>0?u.tri(o+l[e],o+l[e+1],o+l[e+2]):u.tri(o+l[e],o+l[e+2],o+l[e+1])}}return{mesh:u.build(),doubleSided:o}}var wi=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]];function Ti(e){let t=Math.hypot(e[0],e[1],e[2]);return t>1e-20?[e[0]/t,e[1]/t,e[2]/t]:[0,0,0]}function Ei(e){let t=Math.abs(e[0]),n=Math.abs(e[1]),r=Math.abs(e[2]);return Ti(wi(e,t<=n&&t<=r?[1,0,0]:n<=r?[0,1,0]:[0,0,1]))}var Di=Math.PI*2;function Oi(e,t,n,r){let i=Math.max(2,Math.ceil(n*r)),a=new Float64Array((i+1)*3),o=n*Di;for(let n=0;n<=i;n++){let r=n/i*o;a[n*3]=e*Math.cos(r),a[n*3+1]=t*r/Di,a[n*3+2]=-e*Math.sin(r)}return a}function ki(e,t,n){let r=e.length/3;if(r<2)return Float64Array.from(e);let i=rn(e,t,n);if(i)return i;let a=n=>{if(t){let t=(n%r+r)%r;return[e[t*3],e[t*3+1],e[t*3+2]]}if(n<0){let e=a(0),t=a(1);return[2*e[0]-t[0],2*e[1]-t[1],2*e[2]-t[2]]}if(n>r-1){let e=a(r-1),t=a(r-2);return[2*e[0]-t[0],2*e[1]-t[1],2*e[2]-t[2]]}return[e[n*3],e[n*3+1],e[n*3+2]]},o=[],s=t?r:r-1,c=(e,t)=>Math.max(Math.sqrt(Math.hypot(t[0]-e[0],t[1]-e[1],t[2]-e[2])),1e-6);for(let e=0;e<s;e++){let t=a(e-1),r=a(e),i=a(e+1),s=a(e+2),l=0+c(t,r),u=l+c(r,i),d=u+c(i,s);for(let e=0;e<n;e++){let a=l+(u-l)*e/n,c=(e,t,n,r)=>{let i=(a-n)/(r-n);return[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i,e[2]+(t[2]-e[2])*i]},f=c(t,r,0,l),p=c(r,i,l,u),m=c(i,s,u,d),h=c(c(f,p,0,u),c(p,m,l,d),l,u);o.push(h[0],h[1],h[2])}}if(!t){let e=a(r-1);o.push(e[0],e[1],e[2])}return Float64Array.from(o)}function Ai(e,{tolerance:t,segmentsPerTurn:n,smooth:r,subdivisions:i}){if(e.kind===`helix`)return[{points:Oi(e.radius,e.pitch,e.turns,e.segmentsPerTurn||n),closed:!1}];if(e.kind===`path`)return Qn(e.segments,{dim:3,tolerance:t}).map(e=>({points:e.points,closed:e.closed}));let a=e.points,o=a.length/3,s=!1;return o>2&&Math.hypot(a[0]-a[(o-1)*3],a[1]-a[(o-1)*3+1],a[2]-a[(o-1)*3+2])<1e-12&&(s=!0,a=a.slice(0,(o-1)*3)),r&&(a=ki(a,s,i)),[{points:a,closed:s}]}function ji(e,t){let n=[],r=e.length/3;for(let t=0;t<r;t++){let r=e[t*3],i=e[t*3+1],a=e[t*3+2],o=n.length;o&&Math.hypot(n[o-3]-r,n[o-2]-i,n[o-1]-a)<1e-9||n.push(r,i,a)}if(t&&n.length>6){let e=n.length;Math.hypot(n[0]-n[e-3],n[1]-n[e-2],n[2]-n[e-1])<1e-9&&(n.length-=3)}return n}function Mi(e,t){let n=ji(e,t),r=n.length/3;if(r<2)return null;let i=t?r+1:r,a=new Float64Array(i*3);for(let e=0;e<i;e++){let t=e%r*3;a[e*3]=n[t],a[e*3+1]=n[t+1],a[e*3+2]=n[t+2]}let o=i-1,s=new Float64Array(o*3);for(let e=0;e<o;e++)Ni(s,e*3,a[e*3+3]-a[e*3],a[e*3+4]-a[e*3+1],a[e*3+5]-a[e*3+2]);let c=new Float64Array(i*3),l=new Float64Array(i*3),u=new Float64Array(i);for(let e=0;e<i;e++){let n=3*(t?(e-1+o)%o:Math.max(0,e-1)),r=3*(t?e%o:Math.min(o-1,e)),i=e*3;Ni(c,i,s[n]+s[r],s[n+1]+s[r+1],s[n+2]+s[r+2]),c[i]===0&&c[i+1]===0&&c[i+2]===0&&(c[i]=s[r],c[i+1]=s[r+1],c[i+2]=s[r+2]);let a=Math.max(c[i]*s[r]+c[i+1]*s[r+1]+c[i+2]*s[r+2],.25);Ni(l,i,s[r]-s[n],s[r+1]-s[n+1],s[r+2]-s[n+2]),u[e]=1/a}let d=new Float64Array(i*3),f=c[0],p=c[1],m=c[2],h=Math.abs(p)<.99?0:1,g=+(Math.abs(p)<.99),_=p*0-m*g,v=m*h-f*0,y=f*g-p*h;Ni(d,0,v*m-y*p,y*f-_*m,_*p-v*f),d[0]===0&&d[1]===0&&d[2]===0&&d.set(Ei([f,p,m]));for(let e=0;e<i-1;e++){let t=e*3,n=a[t+3]-a[t],r=a[t+4]-a[t+1],i=a[t+5]-a[t+2],o=n*n+r*r+i*i,s=d[t],l=d[t+1],u=d[t+2],f=c[t],p=c[t+1],m=c[t+2];if(o>0){let e=2/o*(n*s+r*l+i*u);s-=n*e,l-=r*e,u-=i*e;let t=2/o*(n*f+r*p+i*m);f-=n*t,p-=r*t,m-=i*t}let h=c[t+3]-f,g=c[t+4]-p,_=c[t+5]-m,v=h*h+g*g+_*_;if(v>1e-20){let e=2/v*(h*s+g*l+_*u);s-=h*e,l-=g*e,u-=_*e}Ni(d,t+3,s,l,u)}if(t){let e=(i-1)*3,t=d[e+1]*d[2]-d[e+2]*d[1],n=d[e+2]*d[0]-d[e]*d[2],r=d[e]*d[1]-d[e+1]*d[0],a=Math.atan2(t*c[0]+n*c[1]+r*c[2],d[e]*d[0]+d[e+1]*d[1]+d[e+2]*d[2]);for(let e=0;e<i;e++){let t=a*e/(i-1),n=Math.cos(t),r=Math.sin(t),o=e*3,s=d[o],l=d[o+1],u=d[o+2],f=c[o],p=c[o+1],m=c[o+2],h=p*u-m*l,g=m*s-f*u,_=f*l-p*s,v=(f*s+p*l+m*u)*(1-n);d[o]=s*n+h*r+f*v,d[o+1]=l*n+g*r+p*v,d[o+2]=u*n+_*r+m*v}d[e]=d[0],d[e+1]=d[1],d[e+2]=d[2]}let b=new Float64Array(i*3);for(let e=0;e<i*3;e+=3)b[e]=c[e+1]*d[e+2]-c[e+2]*d[e+1],b[e+1]=c[e+2]*d[e]-c[e]*d[e+2],b[e+2]=c[e]*d[e+1]-c[e+1]*d[e];let x=new Float64Array(i);for(let e=1;e<i;e++)x[e]=x[e-1]+Math.hypot(a[e*3]-a[e*3-3],a[e*3+1]-a[e*3-2],a[e*3+2]-a[e*3-1]);return{count:i,pos:a,T:c,N:d,B:b,K:l,stretch:u,arc:x,length:x[i-1],closed:t}}function Ni(e,t,n,r,i){let a=Math.hypot(n,r,i);a>1e-20?(e[t]=n/a,e[t+1]=r/a,e[t+2]=i/a):e[t]=e[t+1]=e[t+2]=0}function Pi(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=a[n],m=o[n],h=s[n],g=(r*m-i*h)*p,_=(r*h+i*m)*p,v=n*3,y=c[v]*g+l[v]*_,b=c[v+1]*g+l[v+1]*_,x=c[v+2]*g+l[v+2]*_,S=f[n];if(S>1.0001){let e=(y*d[v]+b*d[v+1]+x*d[v+2])*(S-1);y+=d[v]*e,b+=d[v+1]*e,x+=d[v+2]*e}e[t]=u[v]+y,e[t+1]=u[v+1]+b,e[t+2]=u[v+2]+x}function Fi(e,t,n,r,i,a,o,s,c,l,u,d){let f=o[t],p=s[t],m=i*f-a*p,h=i*p+a*f,g=t*3,_=c[g]*m+l[g]*h,v=c[g+1]*m+l[g+1]*h,y=c[g+2]*m+l[g+2]*h;if(d!==0){let e=d*(n*i+r*a),t=_-u[g]*e,o=v-u[g+1]*e,s=y-u[g+2]*e,c=Math.hypot(t,o,s);c>1e-20?(_=t/c,v=o/c,y=s/c):_=v=y=0}e[0]=_,e[1]=v,e[2]=y}function Ii(e,t,n,r,i,a,o,s,c,l,u,d){for(let f=0;f<r;f++)for(let r=0;r<n;r++)Pi(e,(f*n+r)*3,f,t[r*2],t[r*2+1],i,a,o,s,c,l,u,d)}function Li(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=n.n,m=n.length||1;for(let h=0;h<p;h++){let g=h,_=(h+1)%p,v=n.corner[g],y=n.corner[_],b=v?n.edgeN[h*2]:n.vertN[g*2],x=v?n.edgeN[h*2+1]:n.vertN[g*2+1],S=y?n.edgeN[h*2]:n.vertN[_*2],C=y?n.edgeN[h*2+1]:n.vertN[_*2+1],w=n.arc[h]/m,T=n.arc[h+1]/m,E=r[g*2],D=r[g*2+1],O=r[_*2],k=r[_*2+1],A=-1,j=-1;for(let n=0;n<i;n++){let r=a[n]/m;Fi(f,n,E,D,b,x,o,s,c,l,u,d);let i=(n*p+g)*3,h=e.vertex(t[i],t[i+1],t[i+2],f[0],f[1],f[2],w,r);Fi(f,n,O,k,S,C,o,s,c,l,u,d),i=(n*p+_)*3;let v=e.vertex(t[i],t[i+1],t[i+2],f[0],f[1],f[2],T,r);A>=0&&e.quad(A,j,v,h),A=h,j=v}}}function Ri(e,t,n,r){let i=(n.twist||0)*Math.PI/180,a=n.taper===void 0?1:n.taper,o=n.caps!==!1,s=!1,c,l=null;if(e.kind===`circle`){let t=Math.max(3,e.segments),n=new Float64Array(t*2);for(let r=0;r<t;r++){let i=r/t*Di;n[r*2]=Math.cos(i)*e.radius,n[r*2+1]=Math.sin(i)*e.radius}c=[{points:n,smooth:new Uint8Array(t).fill(1),closed:!0}],l={circle:!0,pts:n}}else c=e.walls;let u=t.every(e=>e.points.length%3==0)?Xt(t,c,l&&l.pts,e.regions,i,a,o):null;if(u){for(let e of u.errors)gi(e,r);for(let e of u.degenerate)e&&r&&r(`error`,`E_DEGENERATE_SPINE`,`The sweep spine needs at least two distinct points.`);return{mesh:new Y({positions:u.positions,normals:u.normals,uvs:u.uvs,indices:u.indices,kind:`triangles`}),doubleSided:u.open}}l||=_i(e.regions,r);let d=c.map(e=>({pts:e.points,f:pi(e.points,e.smooth,!0)})),f=[],p=0,m=0;for(let e of t){let t=Mi(e.points,e.closed);if(!t)r&&r(`error`,`E_DEGENERATE_SPINE`,`The sweep spine needs at least two distinct points.`);else{f.push(t);for(let{f:e}of d)p+=e.n*t.count*2,m+=e.n*(t.count-1)*6;if(!t.closed&&o){if(l.circle){let e=l.pts.length/2;p+=2*(e+1),m+=2*e*3}else for(let e of l)p+=e.positions.length,m+=2*e.indices.length}}}let h=new X(`triangles`,p,m),g=new Float64Array(3);for(let e of f){let t=e.count,n=e.length||1,r=(a-1)/n,c=e.N,u=e.B,f=e.T,p=e.pos,m=e.K,_=e.stretch,v=e.arc,y=new Float64Array(t),b=new Float64Array(t),x=new Float64Array(t);for(let e=0;e<t;e++){let t=v[e]/n;y[e]=1+(a-1)*t;let r=i*t;b[e]=Math.cos(r),x[e]=Math.sin(r)}for(let{pts:e,f:n}of d){let i=new Float64Array(t*n.n*3);Ii(i,e,n.n,t,y,b,x,c,u,p,m,_),Li(h,i,n,e,t,v,b,x,c,u,f,r,g)}if(!e.closed){if(!o)s=!0;else for(let[e,n]of[[0,-1],[t-1,1]]){let t=f[e*3]*n,r=f[e*3+1]*n,i=f[e*3+2]*n;if(l.circle){Pi(g,0,e,0,0,y,b,x,c,u,p,m,_);let a=h.vertex(g[0],g[1],g[2],t,r,i,.5,.5),o=l.pts.length/2,s=h.vertexCount;for(let n=0;n<o;n++)Pi(g,0,e,l.pts[n*2],l.pts[n*2+1],y,b,x,c,u,p,m,_),h.vertex(g[0],g[1],g[2],t,r,i,.5+Math.cos(n/o*Di)/2,.5+Math.sin(n/o*Di)/2);for(let e=0;e<o;e++){let t=s+e,r=s+(e+1)%o;n>0?h.tri(a,t,r):h.tri(a,r,t)}}else for(let a of l){let o=h.vertexCount,s=a.positions;for(let n=0;n<s.length;n+=2)Pi(g,0,e,s[n],s[n+1],y,b,x,c,u,p,m,_),h.vertex(g[0],g[1],g[2],t,r,i,s[n],s[n+1]);let l=a.indices;for(let e=0;e<l.length;e+=3)n>0?h.tri(o+l[e],o+l[e+1],o+l[e+2]):h.tri(o+l[e],o+l[e+2],o+l[e+1])}}}}return{mesh:h.build(),doubleSided:s}}var zi=Math.PI*2;function Bi(e){return Math.tan(e)-e}function Vi(e,t,n=6,r=3){let i=an(e,t,n,r);if(i)return i;let a=e,o=t*Math.PI/180,s=a/2,c=s*Math.cos(o),l=s+1,u=s-1.25,d=Math.PI/(2*a),f=Bi(o),p=e=>{let t=Math.acos(Math.min(1,c/e));return d+f-Bi(t)};if(p(l)<d*.15){let e=Math.max(c,u),t=l;for(let n=0;n<40;n++){let n=(e+t)/2;p(n)>d*.15?e=n:t=n}l=e}let m=Math.max(c,u),h=[],g=[],_=(e,t,n)=>{h.push(e*Math.cos(t),e*Math.sin(t)),g.push(+!!n)},v=zi/a;for(let e=0;e<a;e++){let t=e*v,i=t-p(m),a=t+p(m),o=t-v+p(m);for(let e=1;e<r;e++)_(u,o+(i-o)*e/r,!0);_(u,i,!1),u<m-1e-9&&_(m,i,!1);for(let e=1;e<=n;e++){let r=m+(l-m)*e/n;_(r,t-p(r),e<n)}let s=t-p(l),c=t+p(l);for(let e=1;e<r;e++)_(l,s+(c-s)*e/r,!0);for(let e=n;e>=1;e--){let r=m+(l-m)*e/n;_(r,t+p(r),e<n)}u<m-1e-9&&_(m,a,!1),_(u,a,!1)}return{outline:{points:Float64Array.from(h),smooth:Uint8Array.from(g),closed:!0},outerRadius:l,rootRadius:u}}function Hi(e){let t=[,,,,];for(let n=0;n<4;n++)t[n]=e(n);return t}function Ui(e,t,n){return n?[n]:Hi(n=>Z(e,n,1,t))}var Wi=new Map,Gi=null;function Q(e,t){Wi.set(e,t),Gi&&Gi.delete(e)}function Ki(e){return Wi.has(e)}var qi=null;function Ji(e,t){let n=Wi.get(e.name);if(!n)return null;qi=Gi&&Gi.has(e.name)?[]:null;try{let r=n(e,t);return r&&qi&&(r.identity=[r.key,...qi].map(e=>`${e.length}:${e}`).join(``)),r}finally{qi=null}}var $=(e,t,n,r,i,a)=>({min:[e,t,n],max:[r,i,a]}),Yi=(e,t,n)=>st(V(),e,t,n);function Xi(e){qi&&qi.push(e);let t=2166136261,n=16777619;for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);t=Math.imul(t^i,16777619),n=Math.imul(n^i,1540483477)}return(t>>>0).toString(36)+(n>>>0).toString(36)+`:`+e.length}function Zi(e){if(qi=null,!e)return``;let t=new Uint32Array(e.buffer,e.byteOffset,e.byteLength>>2),n=2538058380,r=16777619;for(let e=0;e<t.length;e++){let i=Math.imul(t[e],3432918353);i=Math.imul(i<<15|i>>>17,461845907),n^=i,n=Math.imul(n<<13|n>>>19,5)+3864292196|0,r=Math.imul(r^t[e],2246822507),r^=r>>>13}return(n>>>0).toString(36)+(r>>>0).toString(36)+`:`+e.length}function Qi(e,t){let n=e.attrIndex&&e.attrIndex[t];return n?n.value.trim():``}function $i(e){if(e.values.d)return{path:e.values.d,raw:Qi(e,`d`),fillRule:R(e,`fillRule`)};let t=e.pathTarget;if(t&&t.values&&t.values.d){let n=e.values.fillRule===void 0?R(t,`fillRule`):e.values.fillRule;return{path:t.values.d,raw:Qi(t,`d`),fillRule:n}}return null}function ea(e){let t=Pe(e);return Math.hypot(t.maxX-t.minX,t.maxY-t.minY)||1}function ta(e,t,n){return ui(ea(e),t)/n}function na(e){let t=!1,n=!1,r=!1;for(let i of e)i.c===`M`?(n&&!r&&(t=!0),n=!0,r=!1):i.c===`Z`&&(r=!0);return n&&!r&&(t=!0),t}function ra(e,t,n,r){let i=Qn(e.path.segments,{tolerance:ta(e.path.segments,t,n)});for(let e of i)e.degenerate&&r&&r(`warning`,`W_DEGENERATE_CONTOUR`,`A subpath has fewer than three distinct points and encloses no area.`);let a=zr(i,e.fillRule);return!a.regions.length&&r&&r(`warning`,`W_EMPTY_FILL`,`The path encloses no area; nothing is filled.`),a}Q(`box`,e=>{let t=R(e,`size`),n=R(e,`radius`);if(n>0){let r=e.values.segments;return{key:`rbox:${t.join(`,`)}:${n}:${r||``}`,unit:null,lods:r?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-t[0]/2,-t[1]/2,-t[2]/2,t[0]/2,t[1]/2,t[2]/2),lodDeviation:Ui(4,1,r).map(e=>si(n,e)),generate:(e,i)=>Gr(t[0],t[1],t[2],n,r||Z(4,e,i,1))}}return{key:`box`,unit:Yi(t[0],t[1],t[2]),lods:1,kind:`triangles`,doubleSided:!1,bounds:$(-.5,-.5,-.5,.5,.5,.5),lodDeviation:[0],generate:()=>Wr()}}),Q(`sphere`,e=>{let t=R(e,`radius`),n=e.values.segments;return{key:`sphere:${n||``}`,unit:Yi(t,t,t),lods:n?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-1,-1,-1,1,1,1),lodDeviation:Ui(48,8,n).map(ni),generate:(e,t)=>Kr(n||Z(48,e,t,8))}});function ia(e,t){let n=R(e,`radius`),r=R(e,`height`),i=R(e,`caps`),a=e.values.segments,o=t/n,s=Math.max(1,o);return{key:`cyl:${o}:${i}:${a||``}`,unit:Yi(n,r,n),lods:a?1:4,kind:`triangles`,doubleSided:!i,bounds:$(-s,-.5,-s,s,.5,s),lodDeviation:Ui(48,8,a).map(e=>ii(o,e)),generate:(e,t)=>qr(o,a||Z(48,e,t,8),i)}}Q(`cylinder`,e=>{let t=R(e,`radius`);return ia(e,e.values.radiusTop===void 0?t:e.values.radiusTop)}),Q(`cone`,e=>ia(e,0)),Q(`capsule`,e=>{let t=R(e,`radius`),n=R(e,`height`),r=Math.max(0,n/t-2),i=e.values.segments;return{key:`capsule:${r}:${i||``}`,unit:Yi(t,t,t),lods:i?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-1,-(r/2+1),-1,1,r/2+1,1),lodDeviation:Ui(32,8,i).map(ai),generate:(e,t)=>Jr(r,i||Z(32,e,t,8))}}),Q(`plane`,e=>{let t=R(e,`size`);return{key:`plane`,unit:Yi(t[0],1,t[1]),lods:1,kind:`triangles`,doubleSided:!0,bounds:$(-.5,0,-.5,.5,0,.5),lodDeviation:[0],generate:()=>Yr()}}),Q(`torus`,e=>{let t=R(e,`radius`),n=R(e,`tube`),r=R(e,`arc`),i=n/t,a=e.values.segments,o=e.values.tubeSegments;return{key:`torus:${i}:${r}:${a||``}:${o||``}`,unit:Yi(t,t,t),lods:a&&o?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-(1+i),-i,-(1+i),1+i,i,1+i),lodDeviation:(a&&o?[0]:Hi(e=>0)).map((e,t)=>oi(i,r,a||Z(64,t,1,8),o||Z(24,t,1,6))),generate:(e,t)=>Xr(i,r,a||Z(64,e,t,8),o||Z(24,e,t,6))}});function aa(e,t,n=0){let r=$(1/0,1/0,1/0,-1/0,-1/0,-1/0);for(let n=0;n<e.length;n+=t)for(let i=0;i<3;i++){let a=i<t?e[n+i]:0;a<r.min[i]&&(r.min[i]=a),a>r.max[i]&&(r.max[i]=a)}for(let e=0;e<3;e++)r.min[e]-=n,r.max[e]+=n;return r}Q(`line`,e=>{let t=e.values.from,n=e.values.to,r=R(e,`radius`);if(r>0){let i=[n[0]-t[0],n[1]-t[1],n[2]-t[2]],a=Math.hypot(i[0],i[1],i[2]),o=[i[0]/a,i[1]/a,i[2]/a],s=Math.abs(o[1])<.99?[0,1,0]:[1,0,0],c=[s[1]*o[2]-s[2]*o[1],s[2]*o[0]-s[0]*o[2],s[0]*o[1]-s[1]*o[0]],l=Math.hypot(...c);c=c.map(e=>e/l);let u=[c[1]*o[2]-c[2]*o[1],c[2]*o[0]-c[0]*o[2],c[0]*o[1]-c[1]*o[0]],d=V();d.set([c[0]*r,c[1]*r,c[2]*r,0,o[0]*a,o[1]*a,o[2]*a,0,u[0]*r,u[1]*r,u[2]*r,0,(t[0]+n[0])/2,(t[1]+n[1])/2,(t[2]+n[2])/2,1]);let f=e.values.segments;return{key:`cyl:1:true:${f||``}`,unit:d,lods:f?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-1,-.5,-1,1,.5,1),lodDeviation:Ui(48,8,f).map(e=>ii(1,e)),generate:(e,t)=>qr(1,f||Z(48,e,t,8),!0)}}return{key:`line:${t.join(`,`)}:${n.join(`,`)}`,unit:null,lods:1,kind:`lines`,doubleSided:!1,bounds:aa([...t,...n],3),lodDeviation:[0],generate:()=>Zr([...t,...n],!1)}}),Q(`polyline`,e=>{let t=R(e,`radius`),n=R(e,`closed`),r=R(e,`smooth`),i=e.values.segments,a=e.values.points,o=e.values.d,s=a?`pts:${Xi(Qi(e,`points`))}`:`d:${Xi(Qi(e,`d`))}`,c=(e,t)=>{if(a){let i=a;return r&&(i=ki(a,n,Z(12,e,t,2))),[{points:i,closed:n}]}let i=ta(o.segments,e,t);return Qn(o.segments,{tolerance:i}).map(e=>{let t=e.points.length/2,r=new Float64Array(t*3);for(let n=0;n<t;n++)r[n*3]=e.points[n*2],r[n*3+1]=e.points[n*2+1];return{points:r,closed:e.closed||n}})},l;if(a){let e=aa(a,3),n=Math.hypot(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2]);l=aa(a,3,t+(r?.1*n:0))}else{let e=Pe(o.segments);l=$(e.minX-t,e.minY-t,-t,e.maxX+t,e.maxY+t,t)}return t>0?{key:`tube:${s}:${t}:${n}:${r}:${i||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:!1,bounds:l,lodDeviation:Hi(e=>(a?Math.hypot(l.max[0]-l.min[0],l.max[1]-l.min[1],l.max[2]-l.min[2])*(r?.05/Z(12,e,1,2):0):ui(ea(o.segments),e))+t*Qr(i||Z(24,e,1,6))),generate:(e,n,r)=>Ri({kind:`circle`,radius:t,segments:i||Z(24,e,n,6)},c(e,n),{caps:!0},r).mesh}:{key:`polyline:${s}:${n}:${r}`,unit:null,lods:r||o?4:1,kind:`lines`,doubleSided:!1,bounds:l,lodDeviation:r||o?Hi(e=>a?Math.hypot(l.max[0]-l.min[0],l.max[1]-l.min[1],l.max[2]-l.min[2])*(r?.05/Z(12,e,1,2):0):ui(ea(o.segments),e)):[0],generate:(e,t)=>{let n=c(e,t);if(n.length===1)return Zr(n[0].points,n[0].closed);let r=n.map(e=>Zr(e.points,e.closed)),i=0,a=0;for(let e of r)i+=e.vertexCount,a+=e.indices.length;let o=new Float32Array(i*3),s=new Uint32Array(a),l=0,u=0;for(let e of r){o.set(e.positions,l*3);for(let t=0;t<e.indices.length;t++)s[u+t]=e.indices[t]+l;l+=e.vertexCount,u+=e.indices.length}return new Y({positions:o,indices:s,kind:`lines`})}}}),Q(`polygon`,e=>{let t=e.values.points,n={points:Float64Array.from(t),smooth:new Uint8Array(t.length/2),closed:!0};return{key:`polygon:${Xi(Qi(e,`points`))}`,unit:null,lods:1,kind:`triangles`,doubleSided:!0,bounds:aa(t,2),lodDeviation:[0],generate:(e,t,r)=>vi(zr([n],`nonzero`).regions,r)}}),Q(`path`,e=>{let t=$i(e);if(!t)return null;let n=Pe(t.path.segments);return{key:`path:${Xi(t.raw)}:${t.fillRule}`,unit:null,lods:4,kind:`triangles`,doubleSided:!0,bounds:$(n.minX,n.minY,0,n.maxX,n.maxY,0),lodDeviation:Hi(e=>ui(ea(t.path.segments),e)),generate:(e,n,r)=>vi(ra(t,e,n,r).regions,r)}}),Q(`extrude`,e=>{let t=$i(e);if(!t)return null;let n=R(e,`depth`),r=R(e,`bevel`),i=R(e,`bevelSegments`),a=R(e,`center`),o=Pe(t.path.segments),s=a?-n/2:0;return{key:`extrude:${Xi(t.raw)}:${t.fillRule}:${n}:${r}:${i}:${a}`,unit:null,lods:4,kind:`triangles`,doubleSided:!1,bounds:$(o.minX,o.minY,s,o.maxX,o.maxY,s+n),lodDeviation:Hi(e=>ui(ea(t.path.segments),e)+di(r,Math.max(1,Math.round(i/(e>=2?2:1))))),generate:(e,o,s)=>xi(ra(t,e,o,s),{depth:n,bevel:r,bevelSegments:Math.max(1,Math.round(i/(e>=2?2:1))),center:a},s)}}),Q(`revolve`,e=>{let t=$i(e);if(!t)return null;let n=R(e,`angle`),r=e.values.segments,i=Pe(t.path.segments),a=Math.max(Math.abs(i.maxX),Math.abs(i.minX));return{key:`revolve:${Xi(t.raw)}:${n}:${r||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:na(t.path.segments),bounds:$(-a,i.minY,-a,a,i.maxY,a),lodDeviation:Hi(e=>{let i=r||Math.max(3,Math.round(Z(48,e,1,8)*Math.min(1,n/360)+ +(n<360)));return ui(ea(t.path.segments),e)+a*Qr(i)}),generate:(e,i,a)=>{let o=Qn(t.path.segments,{tolerance:ta(t.path.segments,e,i)}),s=r||Math.max(3,Math.round(Z(48,e,i,8)*Math.min(1,n/360)+ +(n<360)));return Ci(o,{angle:n,segments:s},a).mesh}}});function oa(e){if(e.kind===`helix`)return $(-e.radius,Math.min(0,e.pitch*e.turns),-e.radius,e.radius,Math.max(0,e.pitch*e.turns),e.radius);if(e.kind===`points`){let t=aa(e.points,3),n=.15*Math.hypot(t.max[0]-t.min[0],t.max[1]-t.min[1],t.max[2]-t.min[2]);return aa(e.points,3,n)}let t=$(1/0,1/0,1/0,-1/0,-1/0,-1/0);for(let n of e.segments){if(n.c===`Z`)continue;let e=[[n.x,n.y,n.z]];n.c===`C`&&e.push([n.x1,n.y1,n.z1],[n.x2,n.y2,n.z2]),n.c===`Q`&&e.push([n.x1,n.y1,n.z1]);for(let n of e)for(let e=0;e<3;e++)t.min[e]=Math.min(t.min[e],n[e]||0),t.max[e]=Math.max(t.max[e],n[e]||0)}return t}Q(`sweep`,e=>{let t=e.values.along,n=e.values.radius,r=n===void 0?$i(e):null;if(n===void 0&&!r)return null;let i=R(e,`smooth`),a=R(e,`twist`),o=R(e,`taper`),s=R(e,`caps`),c=e.values.segments,l=n;if(r){let e=Pe(r.path.segments);l=Math.max(Math.abs(e.minX),Math.abs(e.maxX),Math.abs(e.minY),Math.abs(e.maxY))}let u=oa(t),d=l*Math.max(1,o)*1.5,f=t.kind===`helix`||(t.kind===`path`?na(t.segments):!(t.points.length>6&&t.points[0]===t.points[t.points.length-3]&&t.points[1]===t.points[t.points.length-2]&&t.points[2]===t.points[t.points.length-1])),p=Math.hypot(u.max[0]-u.min[0],u.max[1]-u.min[1],u.max[2]-u.min[2])||1;return{key:`sweep:${r?Xi(r.raw)+`:`+r.fillRule:`r`+n}:${Xi(Qi(e,`along`))}:${i}:${a}:${o}:${s}:${c||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:!s&&f,bounds:$(u.min[0]-d,u.min[1]-d,u.min[2]-d,u.max[0]+d,u.max[1]+d,u.max[2]+d),lodDeviation:Hi(e=>{let t=r?ui(ea(r.path.segments),e):(n||0)*Qr(c||Z(24,e,1,6));return ui(p,e)+t}),generate:(e,l,u)=>{let d=Ai(t,{tolerance:ui(p,e)/l,segmentsPerTurn:Z(48,e,l,8),smooth:i,subdivisions:Z(12,e,l,2)});return Ri(r?{kind:`shape`,...ra(r,e,l,u)}:{kind:`circle`,radius:n,segments:c||Z(24,e,l,6)},d,{twist:a,taper:o,caps:s},u).mesh}}}),Q(`gear`,e=>{let t=R(e,`teeth`),n=R(e,`module`),r=R(e,`pressureAngle`),i=R(e,`depth`)/n,a=R(e,`bore`)/n,o=R(e,`bevel`)/n,s=R(e,`center`),c=t/2+1,l=s?-i/2:0;return{key:`gear:${t}:${r}:${i}:${a}:${o}:${s}`,unit:Yi(n,n,n),lods:4,kind:`triangles`,doubleSided:!1,bounds:$(-c,-c,l,c,c,l+i),lodDeviation:Hi(e=>ci(t,Z(8,e,1,2))+di(o,e>=2?1:2)),generate:(e,n,c)=>{let l=Z(8,e,n,2),u=Z(4,e,n,2),d={...Vi(t,r,l,u).outline,isWall:!0},f=[];if(a>0){let t=er(a,Z(48,e,n,8)),r=t.points.length/2,i=new Float64Array(t.points.length);for(let e=0;e<r;e++)i[e*2]=t.points[(r-1-e)*2],i[e*2+1]=t.points[(r-1-e)*2+1];f.push({points:i,smooth:t.smooth,closed:!0,isWall:!0})}return xi({regions:[{outer:d,holes:f}],walls:[d,...f]},{depth:i,bevel:o,bevelSegments:e>=2?1:2,center:s},c)}}}),Q(`mesh`,e=>{let t=e.values.positions,n=e.values.indices||Uint32Array.from({length:t.length/3},(e,t)=>t),r=e.values.normals,i=e.values.uvs,a=R(e,`smooth`);return{key:`mesh:${Zi(t)}:${Zi(e.values.indices)}:${Zi(r)}:${Zi(i)}:${a}`,unit:null,lods:1,kind:`triangles`,doubleSided:!1,bounds:aa(t,3),lodDeviation:[0],generate:()=>r?new Y({positions:Float32Array.from(t),normals:Float32Array.from(r),uvs:i?Float32Array.from(i):null,indices:Uint32Array.from(n)}):Hr(t,n,a,i)}}),Gi=new Set(Wi.keys());var sa={color:[.8,.8,.8,1],metallic:0,roughness:.5,opacity:1,emissive:[0,0,0,1],emissiveIntensity:1,map:null,normalMap:null,normalScale:1,occlusionMap:null,occlusionStrength:1,metallicRoughnessMap:null,emissiveMap:null,alphaMode:`auto`,alphaCutoff:.5,uvScale:[1,1],doubleSided:!1,unlit:!1},ca=class{constructor(e,t,n=null){this.index=t,this.name=n,this.params=e,this.baseColor=Te(e.color),this.baseColorSrgb=e.color,this.metallic=e.metallic,this.roughness=e.roughness,this.opacity=e.opacity*e.color[3];let r=Te(e.emissive);this.emissive=[r[0]*e.emissiveIntensity,r[1]*e.emissiveIntensity,r[2]*e.emissiveIntensity],this.map=e.map,this.normalMap=e.normalMap,this.normalScale=e.normalScale,this.occlusionMap=e.occlusionMap,this.occlusionStrength=e.occlusionStrength,this.metallicRoughnessMap=e.metallicRoughnessMap,this.emissiveMap=e.emissiveMap,this.alphaCutoff=e.alphaCutoff;let i=e.opacity*e.color[3],a=e.alphaMode||`auto`;this.alphaMode=a===`auto`?i<.999?`blend`:`opaque`:a,this.uvScale=e.uvScale,this.doubleSided=e.doubleSided,this.unlit=e.unlit,this.key=la(e)}get transparent(){return this.alphaMode===`blend`&&this.opacity<.999}};function la(e){return[Ee(e.color),e.metallic,e.roughness,e.opacity,Ee(e.emissive),e.emissiveIntensity,e.map?e.map.key:``,e.normalMap?e.normalMap.key:``,e.normalScale,e.occlusionMap?e.occlusionMap.key:``,e.occlusionStrength,e.metallicRoughnessMap?e.metallicRoughnessMap.key:``,e.emissiveMap?e.emissiveMap.key:``,e.alphaMode,e.alphaCutoff,e.uvScale.join(`,`),+!!e.doubleSided,+!!e.unlit].join(`|`)}function ua(e){let t={};for(let n of Object.keys(sa)){let r=R(e,n);t[n]=r===void 0?sa[n]:r}return t}var da=class{constructor(){this.list=[],this.byKey=new Map,this.defs=new Map,this.resolved=new Map,this.fast=new Map}define(e,t){this.defs.set(e,t)}intern(e,t){let n=la(e),r=this.byKey.get(n);return r===void 0&&(r=this.list.length,this.list.push(new ca(e,r,t)),this.byKey.set(n,r)),r}resolve(e,t){let n=this.fast.get(e);n===void 0&&(n=new Map,this.fast.set(e,n));let r=n.get(t);return r===void 0&&(r=this.resolveSlow(e,t),n.set(t,r)),r}resolveSlow(e,t){let n=t?Ee(t):``,r=(e||``)+`|`+n,i=this.resolved.get(r);if(i!==void 0)return i;let a=e&&this.defs.get(e)||sa,o=t?{...a,color:t}:a;return i=this.intern(o,e||(t?n:`default`)),this.resolved.set(r,i),i}},fa={linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>1-(1-e)*(1-e),"ease-in-out":e=>e<.5?2*e*e:1-2*(1-e)*(1-e)},pa=e=>e<0?0:e>1?1:e;function ma(e,t){let n=R(e,`attr`),r=e=>n===`scale`&&e.length===1?[e[0],e[0],e[0]]:e.slice(),i=e.values,a={attr:n,dur:R(e,`dur`)||1,begin:R(e,`begin`),repeat:R(e,`repeat`),alternate:R(e,`alternate`),ease:fa[R(e,`easing`)]||fa.linear,timeline:R(e,`timeline`),smooth:R(e,`smooth`),from:null,to:null,keys:null,keyTimes:null,path:null};if(i.along)a.path=ya(i.along,a.smooth);else if(i.values){a.keys=i.values.map(r);let e=a.keys.length;a.keyTimes=i.keyTimes&&i.keyTimes.length===e?i.keyTimes.slice():a.keys.map((t,n)=>n/(e-1))}else a.from=i.from===void 0?t[n]:r(i.from),a.to=r(i.to);return a}function ha(e,t,n=0){if(e.timeline===`scroll`)return e.ease(pa(n));let r=t-e.begin;if(r<0)return-1;let i=r/e.dur,a;if(i>=e.repeat){let t=Math.ceil(e.repeat)-1;a=e.repeat-t,e.alternate&&t%2==1&&(a=1-a)}else{let t=Math.floor(i);a=i-t,e.alternate&&t%2==1&&(a=1-a)}return e.ease(a)}function ga(e,t,n=0){let r=ha(e,t,n);if(r<0)return null;if(e.path)return ba(e.path,r);if(e.keys)return _a(e,r);let i=Array(e.from.length);for(let t=0;t<i.length;t++)i[t]=e.from[t]+(e.to[t]-e.from[t])*r;return i}function _a(e,t){let n=e.keys,r=e.keyTimes,i=n.length,a=0;for(;a<i-2&&t>=r[a+1];)a++;let o=r[a+1]-r[a],s=o>0?pa((t-r[a])/o):1,c=n[a],l=n[a+1];return!e.smooth||i<3?c.map((e,t)=>e+(l[t]-e)*s):va(a>0?n[a-1]:c.map((e,t)=>2*e-l[t]),c,l,a+2<i?n[a+2]:l.map((e,t)=>2*e-c[t]),s)}function va(e,t,n,r,i){let a=(e,t)=>{let n=0;for(let r=0;r<e.length;r++)n+=(t[r]-e[r])**2;return Math.max(Math.sqrt(Math.sqrt(n)),1e-9)},o=0+a(e,t),s=o+a(t,n),c=s+a(n,r),l=o+(s-o)*i,u=(e,t,n,r)=>e.map((e,i)=>e+(t[i]-e)*(l-n)/(r-n)),d=u(e,t,0,o),f=u(t,n,o,s),p=u(n,r,s,c);return u(u(d,f,0,s),u(f,p,o,c),o,s)}function ya(e,t){let n=e=>({tolerance:e,segmentsPerTurn:64,smooth:t,subdivisions:24}),r=Ai(e,n(.01));if(e.kind===`path`){let t=0;for(let e of r)for(let n=0;n<e.points.length;n++)t=Math.max(t,Math.abs(e.points[n]));r=Ai(e,n(Math.max(t,1e-6)*1e-4))}let i=[];for(let e of r){for(let t=0;t<e.points.length;t++)i.push(e.points[t]);e.closed&&e.points.length>=3&&i.push(e.points[0],e.points[1],e.points[2])}let a=i.length/3,o=new Float64Array(Math.max(a,1));for(let e=1;e<a;e++)o[e]=o[e-1]+Math.hypot(i[e*3]-i[e*3-3],i[e*3+1]-i[e*3-2],i[e*3+2]-i[e*3-1]);return{points:Float64Array.from(i),lengths:o,total:a?o[a-1]:0}}function ba(e,t){let n=e.points,r=e.lengths,i=n.length/3;if(i===0)return[0,0,0];if(i===1||e.total<=0)return[n[0],n[1],n[2]];let a=pa(t)*e.total,o=0,s=i-1;for(;s-o>1;){let e=o+s>>1;r[e]<=a?o=e:s=e}let c=r[s]-r[o],l=c>0?(a-r[o])/c:0;return[n[o*3]+(n[s*3]-n[o*3])*l,n[o*3+1]+(n[s*3+1]-n[o*3+1])*l,n[o*3+2]+(n[s*3+2]-n[o*3+2])*l]}var xa=class{constructor(e,t){this.el=e,this.uid=e.uid,this.kind=t,this.local=null,this.visible=!0,this.material=null,this.color=null,this.anims=[],this.children=[],this.geometry=null,this.unit=null,this.target=null,this.count=0,this.step=null,this.params=null,this.scriptLocal=null,this.place=null,this.parent=null}get animated(){return this.anims.length>0}},Sa={background:[.09,.1,.12,1],sky:[.8,.86,.95,1],ground:[.25,.22,.2,1],intensity:.5,exposure:1};function Ca(e){return it(e,1e-15)}function wa(e,t,n={}){let r=n.maxInstances||2e6,i=[],a=new da,o=new Map,s=new Map,c={...Sa,explicit:!1},l=!1,u=null,d={time:!1,scroll:!1},f={nodes:0,shapes:0,uses:0,defs:0,lights:0,cameras:0,materials:0},p=(e,t,n,r,a=`reference`)=>{i.push({severity:t,code:n,message:r,element:e,phase:a})},m=e=>{if(!e.unknown){e.name===`material`&&e.values&&e.values.id!==void 0&&(a.define(e.values.id,ua(e)),f.materials++),e.name===`environment`&&!l&&(l=!0,c={background:R(e,`background`),sky:R(e,`sky`),ground:R(e,`ground`),intensity:R(e,`intensity`),exposure:R(e,`exposure`),explicit:!0,uid:e.uid}),e.name===`controls`&&!u&&(u=Ta(e)),e.name===`defs`&&(f.defs+=e.children.filter(e=>e.type===`element`).length);for(let t of e.children)t.type===`element`&&m(t)}};m(e.root),t.beginBuild(n.owner);let h=(e,n=0)=>{if(o.has(e))return o.get(e);if(n>64)return p(e,`error`,`E_TOO_DEEP`,`Nesting is deeper than 64. Flatten the tree or shorten the use chain.`),o.set(e,null),null;if(e.unknown||!ve(e.name))return o.set(e,null),null;let r=e.name,a;if(r===`es3d`||r===`v3d`||r===`scene`||r===`group`)a=`group`;else if(r===`use`)a=`use`;else if(r===`repeat`)a=`repeat`;else if(r===`scatter`)a=`scatter`;else if(r===`lod`)a=`lod`;else if(r===`light`)a=`light`;else if(r===`camera`)a=`camera`;else if(Ki(r))a=`shape`;else return o.set(e,null),null;let c=new xa(e,a);o.set(e,c),f.nodes++;let l=e.values||{};if(l.id!==void 0&&s.set(l.id,c),a!==`camera`&&a!==`light`){let e=At(l);c.local=Ca(e)?null:e}c.visible=R(e,`visible`)!==!1,c.collide=l.collide!==!1,c.material=l.material===void 0?null:l.material,c.color=l.color===void 0?null:l.color;let u=R(e,`position`)||[0,0,0];c.base={position:u,rotation:R(e,`rotation`)||[0,0,0],scale:R(e,`scale`)||[1,1,1]},a===`camera`&&(c.base.target=l.target||[u[0],u[1],u[2]-1],c.base.fov=[R(e,`fov`)]);for(let t of e.children){if(t.type!==`element`)continue;if(t.name===`animate`){if(!t.unknown&&t.values&&t.values.attr){let e=ma(t,c.base);c.anims.push(e),d[e.timeline===`scroll`?`scroll`:`time`]=!0}continue}if((r===`es3d`||r===`v3d`)&&(t.name===`defs`||t.name===`title`||t.name===`desc`||t.name===`environment`||t.name===`material`)||t.name===`material`||t.name===`environment`||t.name===`controls`)continue;let e=h(t,n+1);e&&(e.parent=c,c.children.push(e))}switch(a){case`shape`:{f.shapes++;let n=null;try{n=Ji(e,{})}catch(t){p(e,`error`,`E_GEOMETRY`,`Cannot describe <${r}>: ${t.message}`,`geometry`)}n?(c.geometry=t.acquire(n,e),c.unit=n.unit&&!Ca(n.unit)?n.unit:null):i.some(t=>t.element===e)||p(e,`error`,`E_GEOMETRY`,`<${r}> has no usable geometry source.`,`geometry`);break}case`use`:f.uses++,e.target&&!e.circular&&(c.target=h(e.target,n+1));break;case`repeat`:c.count=l.count||0,c.step=l.step?l.step.matrix:V();break;case`scatter`:c.params={grid:l.grid||null,count:l.grid?l.grid[0]*l.grid[1]:l.count||0,spacing:R(e,`spacing`),area:l.area||null,radius:l.radius||null,seed:R(e,`seed`),jitter:R(e,`jitter`),randomScale:l.randomScale||null,randomRotation:l.randomRotation||null,randomMaterial:l.randomMaterial||null};break;case`lod`:c.params={distances:l.distances||[]};break;case`light`:{f.lights++;let t=V();l.transform&&t.set(l.transform.matrix),c.params={type:l.type,color:R(e,`color`),intensity:R(e,`intensity`),position:R(e,`position`),rotation:l.rotation||null,direction:l.direction||null,target:l.target||null,range:R(e,`range`),angle:R(e,`angle`),penumbra:R(e,`penumbra`),groundColor:R(e,`groundColor`),transform:l.transform?t:null};break}case`camera`:f.cameras++,c.params={type:R(e,`type`),position:R(e,`position`),target:l.target||null,rotation:l.rotation||null,up:R(e,`up`),fov:R(e,`fov`),height:R(e,`height`),near:l.near||null,far:l.far||null,aspect:R(e,`aspect`),fit:R(e,`fit`),transform:l.transform?l.transform.matrix:null,name:l.name||l.id||`camera ${f.cameras}`}}return c},g=e.root?h(e.root):null;t.endBuild();let _=new Map,v=e=>{if(!e)return 0;if(_.has(e))return _.get(e);_.set(e,0);let t=0,n=()=>e.children.reduce((e,t)=>e+v(t),0);switch(e.kind){case`shape`:t=+!!e.geometry;break;case`use`:t=v(e.target);break;case`repeat`:t=e.count*n();break;case`scatter`:t=e.params.count*n();break;case`light`:case`camera`:t=0;break;default:t=n()}return e.visible||(t=0),_.set(e,t),t},y=v(g);return f.expandedInstances=y,y>r&&p(e.root,`error`,`E_TOO_MANY_INSTANCES`,`The scene expands to ${y.toLocaleString(`en-US`)} instances, more than the limit of ${r.toLocaleString(`en-US`)}. Reduce repeat or scatter counts.`,`render`),{doc:e,root:g,materials:a,environment:c,controls:u,animation:d,cache:t,diagnostics:i,stats:f,tooLarge:y>r,expanded:y,byId:s}}function Ta(e){let t=e.values||{};return{mode:R(e,`mode`),zoom:R(e,`zoom`),pan:R(e,`pan`),minDistance:t.minDistance??null,maxDistance:t.maxDistance??null,minPolar:R(e,`minPolar`),maxPolar:R(e,`maxPolar`),targetMin:t.targetMin&&t.targetMax?t.targetMin:null,targetMax:t.targetMin&&t.targetMax?t.targetMax:null,collide:R(e,`collide`),uid:e.uid}}function Ea(e){let t=e>>>0;return function(){t=t+1831565813>>>0;let e=t;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}}function Da(e,t,n){let r=Math.imul(e|0,668265261)^Math.imul(t|0,374761393)^Math.imul(n|0,2654435769);return r=Math.imul(r^r>>>15,2246822507),r=Math.imul(r^r>>>13,3266489909),((r^r>>>16)>>>0)/4294967296}var Oa=class{constructor(e=256){this.count=0,this.capacity=0,this.geometries=[],this.geomIndex=new Map,this.materials=[],this.lights=[],this.cameras=[],this.lodSwitches=[],this.environment=null,this.controls=null,this.animation={time:!1,scroll:!1},this.dynamic=[],this.bounds={min:[1/0,1/0,1/0],max:[-1/0,-1/0,-1/0]},this.version=0,this.templates=new Map,this.alloc(e)}alloc(e){let t=(t,n,r)=>{let i=new t(e*r);return n&&i.set(n.subarray(0,Math.min(n.length,i.length))),i};this.matrices=t(Float32Array,this.matrices,16),this.geom=t(Uint32Array,this.geom,1),this.mat=t(Uint32Array,this.mat,1),this.uid=t(Uint32Array,this.uid,1),this.lodNode=t(Int32Array,this.lodNode,1),this.lodChild=t(Uint16Array,this.lodChild,1),this.flags=t(Uint8Array,this.flags,1),this.spheres=t(Float32Array,this.spheres,4),this.capacity=e}geometryIndex(e){let t=this.geomIndex.get(e);return t===void 0&&(t=this.geometries.length,this.geometries.push(e),this.geomIndex.set(e,t)),t}setInstance(e,t,n,r,i,a,o,s=0){e>=this.capacity&&this.alloc(Math.max(this.capacity*2,e+1));let c=this.matrices,l=e*16;for(let e=0;e<16;e++)c[l+e]=r[e];this.geom[e]=t,this.mat[e]=n,this.uid[e]=i,this.lodNode[e]=a,this.lodChild[e]=o;let u=gt(r);this.flags[e]=+(u<0)|s;let d=this.geometries[t].bounds,f=0,p=0,m=0,h=0;if(d){let e=(d.min[0]+d.max[0])/2,t=(d.min[1]+d.max[1])/2,n=(d.min[2]+d.max[2])/2;f=r[0]*e+r[4]*t+r[8]*n+r[12],p=r[1]*e+r[5]*t+r[9]*n+r[13],m=r[2]*e+r[6]*t+r[10]*n+r[14];let i=(d.max[0]-d.min[0])/2,a=(d.max[1]-d.min[1])/2,o=(d.max[2]-d.min[2])/2,s=Math.abs(r[0])*i+Math.abs(r[4])*a+Math.abs(r[8])*o,c=Math.abs(r[1])*i+Math.abs(r[5])*a+Math.abs(r[9])*o,l=Math.abs(r[2])*i+Math.abs(r[6])*a+Math.abs(r[10])*o;h=Math.sqrt(s*s+c*c+l*l);let u=this.bounds;f-s<u.min[0]&&(u.min[0]=f-s),p-c<u.min[1]&&(u.min[1]=p-c),m-l<u.min[2]&&(u.min[2]=m-l),f+s>u.max[0]&&(u.max[0]=f+s),p+c>u.max[1]&&(u.max[1]=p+c),m+l>u.max[2]&&(u.max[2]=m+l)}let g=this.spheres;g[e*4]=f,g[e*4+1]=p,g[e*4+2]=m,g[e*4+3]=h}reserve(e){let t=this.capacity;for(;t<e;)t=Math.max(t*2,t+1);t!==this.capacity&&this.alloc(t)}trim(){this.capacity>this.count*2+64&&this.alloc(Math.max(this.count,1))}get empty(){return this.count===0}},ka=V(),Aa=class{constructor(e,t,n,r=0){this.scene=e,this.graph=t,this.time=n,this.progress=r,this.noCollide=0,this.cursor=0,this.lightCursor=0,this.cameraCursor=0,this.switchCursor=0,this.overwrite=!1,this.stack=[],this.tmp=V(),this.segmentDepth=0}mat(e){for(;this.stack.length<=e;)this.stack.push(new Float64Array(16));return this.stack[e]}notePlace(e,t,n,r,i,a,o){if(e.place===`many`)return;if(e.place){e.place=`many`;return}let s=new Float64Array(16);s.set(t),e.place={parent:s,material:n,color:r,sel:i,lodNode:a,lodChild:o,noCollide:this.noCollide,rowStart:this.cursor,lightStart:this.lightCursor,cameraStart:this.cameraCursor,switchStart:this.switchCursor}}localOf(e,t){if(!e.anims.length)return e.local?t.set(e.local):rt(t),t;let n={};for(let t of e.anims){let e=ga(t,this.time,this.progress);e&&(n[t.attr]=e)}return At(e.el.values,t,n)}walk(e,t,n,r,i,a,o,s){if(!e||!e.visible)return;this.overwrite||this.notePlace(e,t,n,r,i,a,o);let c=e.anims.length>0&&this.segmentDepth===0&&!this.overwrite,l=null;c&&(l={node:e,parent:new Float64Array(t),material:n,color:r,sel:i,lodNode:a,lodChild:o,noCollide:this.noCollide,start:this.cursor,end:0,lightStart:this.lightCursor,cameraStart:this.cameraCursor,switchStart:this.switchCursor}),e.anims.length&&this.segmentDepth++,e.collide===!1&&this.noCollide++;let u=n,d=r;if(e.material!==null&&(u=e.material,d=null),e.color!==null&&(d=e.color),e.kind===`light`)this.emitLight(e,t);else if(e.kind===`camera`)this.emitCamera(e,t);else{let n,r=e.scriptLocal;if(!r&&!e.local&&!e.anims.length)n=t;else{n=this.mat(s);let i=r||(e.anims.length?this.localOf(e,this.tmp):e.local);at(n,t,i)}switch(e.kind){case`shape`:this.emitShape(e,n,u,d,i===0?e.uid:i,a,o,s);break;case`group`:for(let t of e.children)this.walk(t,n,u,d,i,a,o,s+1);break;case`use`:e.target&&this.walk(e.target,n,u,d,i===0?e.uid:i,a,o,s+1);for(let t of e.children)this.walk(t,n,u,d,i,a,o,s+1);break;case`repeat`:this.emitRepeat(e,n,u,d,i,a,o,s);break;case`scatter`:this.emitScatter(e,n,u,d,i,a,o,s);break;case`lod`:this.emitLod(e,n,u,d,i,a,o,s)}}e.anims.length&&this.segmentDepth--,e.collide===!1&&this.noCollide--,l&&(l.end=this.cursor,l.lightEnd=this.lightCursor,l.cameraEnd=this.cameraCursor,l.switchEnd=this.switchCursor,this.scene.dynamic.push(l)),!this.overwrite&&e.place&&e.place!==`many`&&(e.place.rowEnd=this.cursor,e.place.lightEnd=this.lightCursor,e.place.cameraEnd=this.cameraCursor,e.place.switchEnd=this.switchCursor)}emitShape(e,t,n,r,i,a,o,s){if(!e.geometry)return;let c=this.scene,l=t;e.unit&&(l=this.mat(s+1),at(l,t,e.unit));let u=c.geometryIndex(e.geometry),d=this.graph.materials.resolve(n,r);c.setInstance(this.cursor++,u,d,l,i,a,o,this.noCollide?2:0)}emitRepeat(e,t,n,r,i,a,o,s){if(this.expand(e,e.count,t,n,r,i,a,o))return;let c=V(),l=V(),u=this.mat(s+1);for(let d=0;d<e.count;d++){at(u,t,c);for(let t of e.children)this.walk(t,u,n,r,i,a,o,s+2);at(l,c,e.step),c.set(l)}}emitScatter(e,t,n,r,i,a,o,s){let c=e.params;if(this.expand(e,c.count,t,n,r,i,a,o))return;let l=Ea(c.seed),u=V(),d=new Float64Array(9),f=(e,t)=>e[0]+(e[1]-e[0])*t,p=c.grid?c.grid[0]:0,m=c.grid?c.grid[1]:0,h=new Float64Array(16),g=[0,0,0],_=[0,0,0],v=[1,1,1];for(let y=0;y<c.count;y++){for(let e=0;e<9;e++)d[e]=l();if(c.grid){let e=y%p,t=Math.floor(y/p);g[0]=(e-(p-1)/2)*c.spacing[0]+(d[0]-.5)*c.jitter*c.spacing[0],g[2]=(t-(m-1)/2)*c.spacing[1]+(d[1]-.5)*c.jitter*c.spacing[1]}else if(c.radius){let e=c.radius*Math.sqrt(d[0]),t=d[1]*Math.PI*2;g[0]=e*et(t),g[2]=e*$e(t)}else g[0]=(d[0]-.5)*c.area[0],g[2]=(d[1]-.5)*c.area[1];if(c.randomRotation){let e=c.randomRotation.ranges;_[0]=f(e[0],d[2]),_[1]=f(e[1],d[3]),_[2]=f(e[2],d[4])}if(c.randomScale){let e=c.randomScale.ranges;c.randomScale.uniform?v[0]=v[1]=v[2]=f(e[0],d[5]):(v[0]=f(e[0],d[5]),v[1]=f(e[1],d[6]),v[2]=f(e[2],d[7]))}mt(u,g,_,v),at(h,t,u);let b=n,x=r;c.randomMaterial&&(b=c.randomMaterial[Math.min(c.randomMaterial.length-1,Math.floor(d[8]*c.randomMaterial.length))],x=null);for(let t of e.children)this.walk(t,h,b,x,i,a,o,s+1)}}expand(e,t,n,r,i,a,o,s){if(!Bt()||!Number.isInteger(t)||t<1)return!1;let c=this.template(e,a,s);if(!c||c.rows.length*t<ja)return!1;let l=e.kind===`scatter`,u=e.params,d=new Int32Array(K.SIZE),f=new Float64Array(q.SIZE);if(l&&!Ka(u,d,f))return!1;let p=this.scene,m=c.rows.length,h=c.lods.length;c.geometries||(c.geometries=!0,c.rows.forEach((e,t)=>{let n=e.entry.bounds;if(c.table.set([p.geometryIndex(e.entry),e.uid,e.lod,e.child,e.flags,+!!n],t*6),n){let e=[(n.max[0]-n.min[0])/2,(n.max[1]-n.min[1])/2,(n.max[2]-n.min[2])/2];c.bounds.set([(n.min[0]+n.max[0])/2,(n.min[1]+n.max[1])/2,(n.min[2]+n.max[2])/2,...e],t*6)}})),d[K.KIND]=l?za:Ra,d[K.NOPS]=c.ops.length,d[K.NROWS]=m,d[K.LODS]=h,d[K.OUTER_LOD]=o,d[K.SLOTS]=c.slots,f.set(n,q.WORLD),l||(f.set(ka,q.ACC),f.set(e.step,q.STEP));let g=p.bounds;f.set(g.min,q.BOUNDS),f.set(g.max,q.BOUNDS+3);let _=l&&u.randomMaterial,v=new Int32Array(m*(_?_.length:1)).fill(-1),y=e=>{let t=Math.floor(e/m),n=c.rows[e-t*m],a=_?_[t]:r,o=_?null:i;return this.graph.materials.resolve(n.material===Ga?a:n.material,n.color===Ga?o:n.color)},b=Math.max(1,Math.floor(Ma/m)),x=this.cursor,S=this.switchCursor;for(let e=0;e<t;e+=b){d[K.FIRST]=e,d[K.COUNT]=Math.min(b,t-e),d[K.SWITCH]=S;let n=on(d,f,c,v,y);if(!n){if(e>0)throw Error(`WebAssembly memory ran out while expanding instances`);return!1}let r=n.mat.length;p.reserve(x+r),p.matrices.set(n.matrices,x*16),p.spheres.set(n.spheres,x*4),p.geom.set(n.geom,x),p.mat.set(n.mat,x),p.uid.set(n.uid,x),p.lodNode.set(n.lodNode,x),p.lodChild.set(n.lodChild,x),p.flags.set(n.flags,x);let i=n.switches;for(let e=0;e<i.length/4;e++){let t=c.lods[e%h],n=Math.cbrt(Math.abs(i[e*4+3])||1);p.lodSwitches[S+e]={pos:[i[e*4],i[e*4+1],i[e*4+2]],distances:t.distances.map(e=>e*n),parent:t.ref>=0?S+e-e%h+t.ref:o,parentChild:t.child}}x+=r,S+=i.length/4}for(let e=0;e<3;e++)g.min[e]=f[q.BOUNDS+e],g.max[e]=f[q.BOUNDS+3+e];return this.cursor=x,this.switchCursor=S,Qa(e),!0}template(e,t,n){let r=this.noCollide>0,i=this.scene.templates.get(e);return i&&i.sel===t&&i.lodChild===n&&i.noCollide===r||(i={sel:t,lodChild:n,noCollide:r,template:qa(e.children,t,n,r)},this.scene.templates.set(e,i)),i.template}emitLod(e,t,n,r,i,a,o,s){let c=this.scene,l={pos:[t[12],t[13],t[14]],distances:e.params.distances.map(e=>e*Math.cbrt(Math.abs(gt(t))||1)),parent:a,parentChild:o},u=this.switchCursor++;c.lodSwitches[u]=l,e.children.forEach((e,a)=>this.walk(e,t,n,r,i,u,a,s+1))}emitLight(e,t){let n=e.params,r=V();r.set(t),n.transform&&at(r,r,n.transform);let i=e.anims.length?Xa(e,this,`position`,n.position):n.position,a=e.anims.length?Xa(e,this,`rotation`,n.rotation||[0,0,0]):n.rotation,o=V();mt(o,i,a||[0,0,0],[1,1,1]),at(o,r,o);let s=[o[12],o[13],o[14]],c=n.direction,l=o;if(!c&&n.target){let e=[0,0,0];_t(e,r,n.target[0],n.target[1],n.target[2]),c=[e[0]-s[0],e[1]-s[1],e[2]-s[2]],l=ka}c||=[0,-1,0];let u=[0,0,0];vt(u,l,c[0],c[1],c[2]);let d=Math.hypot(u[0],u[1],u[2])||1,f=Te(n.color),p={type:n.type,color:[f[0]*n.intensity,f[1]*n.intensity,f[2]*n.intensity],position:s,direction:[u[0]/d,u[1]/d,u[2]/d],range:n.range,outer:Math.cos(n.angle/2*Math.PI/180),inner:Math.cos(n.angle/2*(1-n.penumbra)*Math.PI/180),ground:Te(n.groundColor).map(e=>e*n.intensity),uid:e.uid};this.scene.lights[this.lightCursor++]=p}emitCamera(e,t){let n=e.params,r=V();r.set(t),n.transform&&at(r,r,n.transform);let i=e.anims.length>0,a=i?Xa(e,this,`position`,n.position):n.position,o=[0,0,0];_t(o,r,a[0],a[1],a[2]);let s,c=[0,0,0],l=i?Xa(e,this,`target`,n.target):n.target;if(l)s=[0,0,0],_t(s,r,l[0],l[1],l[2]),vt(c,r,n.up[0],n.up[1],n.up[2]);else{let t=V(),a=i?Xa(e,this,`rotation`,n.rotation||[0,0,0]):n.rotation||[0,0,0];dt(t,a[0],a[1],a[2]),at(t,r,t);let l=[0,0,0];vt(l,t,0,0,-1),s=[o[0]+l[0],o[1]+l[1],o[2]+l[2]],vt(c,t,n.up[0],n.up[1],n.up[2])}this.scene.cameras[this.cameraCursor++]={type:n.type,position:o,target:s,up:c.map(e=>e/(Math.hypot(c[0],c[1],c[2])||1)),fov:i?Xa(e,this,`fov`,[n.fov])[0]:n.fov,height:n.height,near:n.near,far:n.far,aspect:n.aspect,fit:n.fit,name:n.name,uid:e.uid}}};Aa.shapeKeeper=new Aa(null,null,.5,.5);var ja=16,Ma=16384,Na=4096,Pa=4*Na,Fa=0,Ia=1,La=2,Ra=0,za=1,Ba=0,Va=1,Ha=2,Ua=1,Wa=2,Ga=Symbol(`inherit`);function Ka(e,t,n){if(t[K.STATE]=e.seed>>>0,e.grid){let[r,i]=e.grid;if(!Number.isInteger(r)||!Number.isInteger(i)||r<1||!e.spacing)return!1;t[K.MODE]=Ba,t[K.NX]=r,t[K.NZ]=i,n[q.SPACING]=e.spacing[0],n[q.SPACING+1]=e.spacing[1],n[q.JITTER]=e.jitter}else if(e.radius)t[K.MODE]=Va,n[q.RADIUS]=e.radius;else{if(!e.area)return!1;t[K.MODE]=Ha,n[q.AREA]=e.area[0],n[q.AREA+1]=e.area[1]}let r=(e,t)=>{for(let r=0;r<e.length;r++)n.set(e[r],t+r*2)};if(e.randomRotation){if(e.randomRotation.ranges.length!==3)return!1;t[K.RANDOM]|=Ua,r(e.randomRotation.ranges,q.ROTATION)}if(e.randomScale){let n=e.randomScale;if(n.ranges.length<(n.uniform?1:3))return!1;t[K.RANDOM]|=n.uniform?6:Wa,r(n.uniform?n.ranges.slice(0,1):n.ranges.slice(0,3),q.SCALE)}return t[K.CHOICES]=e.randomMaterial?e.randomMaterial.length:0,!0}function qa(e,t,n,r){let i={ops:[],matrices:[],index:new Map,slots:1,rows:[],lods:[],geometries:!1};for(let a of e)if(!Ya(i,a,0,Ga,Ga,t,-1,n,r))return null;return i.ops=Int32Array.from(i.ops),i.mats=new Float64Array(Math.max(1,i.matrices.length)*16),i.matrices.forEach((e,t)=>i.mats.set(e,t*16)),i.table=new Int32Array(i.rows.length*6),i.bounds=new Float64Array(Math.max(1,i.rows.length*6)),i}function Ja(e,t,n){let r=e.index.get(n);r===void 0&&(r=e.matrices.length,e.matrices.push(n),e.index.set(n,r));let i=e.slots++;return e.ops.push(Fa,i,t,r),i}function Ya(e,t,n,r,i,a,o,s,c){if(!t||!t.visible)return!0;let l=t.kind;if(t.anims.length||l===`light`||l===`camera`||l===`scatter`||e.rows.length>Na||e.slots>Pa)return!1;t.collide===!1&&(c=!0);let u=r,d=i;t.material!==null&&(u=t.material,d=null),t.color!==null&&(d=t.color);let f=t.local?Ja(e,n,t.local):n,p=t=>Ya(e,t,f,u,d,a,o,s,c);switch(l){case`shape`:if(t.geometry){let n=t.unit?Ja(e,f,t.unit):f;e.ops.push(Ia,e.rows.length,n,0),e.rows.push({entry:t.geometry,uid:a===0?t.uid:a,lod:o,child:s,flags:c?2:0,material:u,color:d})}return!0;case`group`:return t.children.every(p);case`use`:return t.target&&!Ya(e,t.target,f,u,d,a===0?t.uid:a,o,s,c)?!1:t.children.every(p);case`repeat`:{let n=V(),r=V();for(let i=0;i<t.count;i++){if(e.slots>Pa)return!1;let i=Ja(e,f,new Float64Array(n));if(!t.children.every(t=>Ya(e,t,i,u,d,a,o,s,c)))return!1;at(r,n,t.step),n.set(r)}return!0}case`lod`:{let n=e.lods.length;return e.lods.push({ref:o,child:s,distances:t.params.distances}),e.ops.push(La,n,f,0),t.children.every((t,r)=>Ya(e,t,f,u,d,a,n,r,c))}default:return!0}}function Xa(e,t,n,r){let i=r;for(let r of e.anims){if(r.attr!==n)continue;let e=ga(r,t.time,t.progress);e&&(i=e)}return i}function Za(e,t={}){let n=new Oa(Math.min(Math.max(64,e.expanded||64),1<<20));if(n.environment=e.environment,n.controls=e.controls||null,e.animation&&(n.animation={...e.animation}),e.tooLarge||!e.root)return n.materials=e.materials.list,n;let r=new Aa(n,e,t.time||0,t.progress||0);return r.walk(e.root,ka,null,null,0,-1,0,0),n.count=r.cursor,n.lights.length=r.lightCursor,n.cameras.length=r.cameraCursor,n.lodSwitches.length=r.switchCursor,n.materials=e.materials.list,n.trim(),n.bounds.min[0]<=n.bounds.max[0]||(n.bounds={min:[-1,-1,-1],max:[1,1,1]}),n.version++,n}function Qa(e){let t=e=>{if(e&&e.place!==`many`&&(e.place=`many`,e.target&&t(e.target),e.children))for(let n of e.children)t(n)};if(e.target&&t(e.target),e.children)for(let n of e.children)t(n)}function $a(e,t){for(let n of e.dynamic)for(let e=t;e;e=e.parent)if(e===n.node)return n;return null}function eo(e){if(!e||e.length<16)return!1;for(let t=0;t<16;t++)if(!Number.isFinite(+e[t]))return!1;return!0}function to(e,t){let n=e.scriptLocal;n||=e.scriptLocal=new Float64Array(16);for(let e=0;e<16;e++)n[e]=+t[e]}function no(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}function ro(e){for(let t=e[0];t;t=t.parent)if(e.every(e=>e===t||no(e,t)))return t;return null}function io(e,t){if(e.length<=1)return e.slice();let n=ro(e);if(n&&n!==t&&n.place&&n.place!==`many`)return[n];let r=new Map;for(let n of e){let e=n;for(let r=n.parent;r&&r!==t&&r.place&&r.place!==`many`;r=r.parent)e=r;let i=r.get(e);i||r.set(e,i=[]),i.push(n)}let i=[];for(let[n,a]of r)if(a.length>1&&n.place&&n.place!==`many`&&n!==t)i.push(n);else if(a.length===e.length)for(let e of a)i.push(e);else i.push(...io(a,t));return i}function ao(e,t,n,r,i,a,o,s,c,l,u,d,f){e.cursor=t,e.lightCursor=n,e.cameraCursor=r,e.switchCursor=i,e.segmentDepth=0,e.noCollide=a,e.walk(o,s,c,l,u,d,f,0)}function oo(e,t,n,r,i=0,a=0){let o=n||[],s=Array(o.length),c=[],l=new Set;for(let n=0;n<o.length;n++){let i=o[n],a=r&&r[n];!e||!t||!i||!i.place||i.place===`many`||!eo(a)?s[n]=!1:(to(i,a),s[n]=!0,l.has(i)||(l.add(i),c.push(i)))}if(!c.length)return s;let u=[],d=[],f=new Set;for(let t of c){let n=$a(e,t);n?f.has(n)||(f.add(n),u.push(n)):d.push(t)}let p=io(d,t.root),m=new Aa(e,t,i,a);m.overwrite=!0;for(let e of p){let t=e.place;ao(m,t.rowStart,t.lightStart,t.cameraStart,t.switchStart,t.noCollide,e,t.parent,t.material,t.color,t.sel,t.lodNode,t.lodChild)}for(let e of u)p.some(t=>no(e.node,t))||ao(m,e.start,e.lightStart,e.cameraStart,e.switchStart,e.noCollide,e.node,e.parent,e.material,e.color,e.sel,e.lodNode,e.lodChild);return e.version++,s}function so(e,t,n,r=0){if(!e.dynamic.length)return!1;let i=new Aa(e,t,n,r);i.overwrite=!0;for(let t of e.dynamic)i.cursor=t.start,i.lightCursor=t.lightStart,i.cameraCursor=t.cameraStart,i.switchCursor=t.switchStart,i.segmentDepth=0,i.noCollide=t.noCollide,i.walk(t.node,t.parent,t.material,t.color,t.sel,t.lodNode,t.lodChild,0);return e.version++,!0}var co=1,lo=class{constructor(e,t){this.id=co++,this.key=e.key,this.identity=e.identity||null,this.desc=e,this.kind=e.kind,this.lods=e.lods,this.doubleSided=e.doubleSided,this.bounds=e.bounds,this.lodDeviation=e.lodDeviation||[0],this.meshes=Array(e.lods).fill(null),this.reports=Array(e.lods).fill(null),this.owner=t,this.owners=new Set,this.epoch=0,this.useCount=0,this.failed=!1,this.failedLods=0}},uo=`document`,fo=class{constructor(){this.entries=new Map,this.held=new Map,this.building=null,this.buildSet=null,this.onGenerate=null,this.quality=1,this.epoch=0,this.version=0,this.stats={generated:0,generateMs:0,triangles:0,restored:0},this.diagnostics=[],this.onDiagnostic=null}beginBuild(e=uo){if(this.epoch++,this.building=e,this.buildSet=new Set,e===`document`)for(let e of this.entries.values())e.useCount=0}acquire(e,t){let n=this.entries.get(e.key);return n?n.epoch!==this.epoch&&!this.heldByOthers(n)&&(n.desc=e,n.identity=e.identity||null,n.owner=t,n.bounds=e.bounds,n.doubleSided=e.doubleSided):(n=new lo(e,t),this.entries.set(e.key,n)),n.epoch=this.epoch,n.useCount++,this.buildSet&&this.buildSet.add(n),n}heldByOthers(e){for(let t of e.owners)if(t!==this.building)return!0;return!1}endBuild(){let e=this.building===null?uo:this.building,t=this.buildSet||new Set,n=this.held.get(e);this.held.set(e,t);for(let n of t)n.owners.add(e);let r=[];if(n)for(let i of n)t.has(i)||(i.owners.delete(e),r.push(i));if(this.building=null,this.buildSet=null,e===`document`)return this.evictUnheld();let i=[];for(let e of r)e.owners.size===0&&this.entries.get(e.key)===e&&(this.entries.delete(e.key),i.push(e));return i}release(e){let t=this.held.get(e);if(!t)return[];this.held.delete(e);for(let n of t)n.owners.delete(e);let n=[];for(let e of t)e.owners.size===0&&this.entries.get(e.key)===e&&(this.entries.delete(e.key),n.push(e));return n}owned(e=uo){return this.held.get(e)||new Set}evictUnheld(){let e=[];for(let[t,n]of this.entries)n.owners.size===0&&(this.entries.delete(t),e.push(n));return e}setQuality(e){if(e!==this.quality){this.quality=e;for(let e of this.entries.values())e.meshes.fill(null),e.reports.fill(null),e.failedLods=0;this.version++}}mesh(e,t=0){let n=Math.min(Math.max(t,0),e.lods-1),r=e.meshes[n];if(r)return r;let i=typeof performance<`u`?performance.now():Date.now(),a=[],o=(t,n,r)=>{a.push({severity:t,code:n,message:r}),this.emit(e,t,n,r)};try{r=e.desc.generate(n,this.quality,o)}catch(e){o(`error`,`E_GEOMETRY`,`Geometry generation failed: ${e&&e.message?e.message:e}`),r=null}r||=(e.failed=!0,e.failedLods|=1<<n,po(e.kind));let s=typeof performance<`u`?performance.now():Date.now();return this.stats.generated++,this.stats.generateMs+=s-i,e.meshes[n]=r,e.reports[n]=a.length?a:null,this.onGenerate&&this.onGenerate(e),r}emit(e,t,n,r){let i={severity:t,code:n,message:r,element:e.owner,phase:`geometry`};this.diagnostics.push(i),this.onDiagnostic&&this.onDiagnostic(i)}adopt(e,t,n,r=null){if(t<0||t>=e.lods||e.meshes[t])return!1;if(e.meshes[t]=n,e.reports[t]=r&&r.length?r:null,r)for(let t of r)this.emit(e,t.severity,t.code,t.message);return this.stats.restored++,!0}generateAll(e=0){for(let t of this.entries.values())for(let n=0;n<=Math.min(e,t.lods-1);n++)this.mesh(t,n)}takeDiagnostics(){let e=this.diagnostics;return this.diagnostics=[],e}};function po(e){return new Y({positions:new Float32Array,indices:new Uint32Array,kind:e})}var mo=()=>typeof performance<`u`?performance.now():Date.now();function ho(e,t){let n=t.element,r=new l({severity:t.severity,phase:t.phase||`geometry`,code:t.code,message:n?`<${n.name}${n.values&&n.values.id?` id="${n.values.id}"`:``}>: ${t.message}`:t.message,offset:n&&n.nameStart>=0?n.nameStart:-1,length:n&&n.nameStart>=0?n.nameEnd-n.nameStart:0,uid:n?n.uid:0});return r.locate(e&&e.lineIndex),r}function go(e,t={}){let n=mo(),r=Un(e),i=mo(),a={parse:i-n,build:0,flatten:0};if(!r.ok)return{ok:!1,doc:r,graph:null,scene:null,cache:t.cache||null,diagnostics:r.diagnostics,timings:a};let o=t.cache||new fo,s=wa(r,o,t),c=mo(),l=Za(s,{time:t.time||0,progress:t.progress||0}),u=mo();a.build=c-i,a.flatten=u-c;let d=s.diagnostics.map(e=>ho(r,e)),f=[...r.diagnostics,...d];return{ok:!f.some(e=>e.severity===`error`),doc:r,graph:s,scene:l,cache:o,diagnostics:f,timings:a}}function _o(e,t,n,r,i,a,o,s,c,l){let u=o-e,d=s-t,f=c-n,p=u*r+d*i+f*a,m=u*u+d*d+f*f-p*p;if(m>l*l)return 1/0;let h=Math.sqrt(l*l-m),g=p-h;return p+h<0?1/0:g<0?0:g}function vo(e,t,n){let r=-1/0,i=1/0;for(let a=0;a<3;a++){let o=1e-6+(n.max[a]-n.min[a])*1e-4,s=n.min[a]-o,c=n.max[a]+o;if(Math.abs(t[a])<1e-20){if(e[a]<s||e[a]>c)return!1}else{let n=(s-e[a])/t[a],o=(c-e[a])/t[a];if(n>o&&([n,o]=[o,n]),r=Math.max(r,n),i=Math.min(i,o),r>i)return!1}}return i>=0}var yo=-1;function bo(e,t,n,r,i=0){let a=n.positions,o=n.indices,s=r;yo=-1;for(let n=0;n<o.length;n+=3){let r=o[n]*3,c=o[n+1]*3,l=o[n+2]*3,u=a[c]-a[r],d=a[c+1]-a[r+1],f=a[c+2]-a[r+2],p=a[l]-a[r],m=a[l+1]-a[r+1],h=a[l+2]-a[r+2],g=t[1]*h-t[2]*m,_=t[2]*p-t[0]*h,v=t[0]*m-t[1]*p,y=u*g+d*_+f*v;if(Math.abs(y)<1e-18||i&&y*i<0)continue;let b=1/y,x=e[0]-a[r],S=e[1]-a[r+1],C=e[2]-a[r+2],w=(x*g+S*_+C*v)*b;if(w<0||w>1)continue;let T=S*f-C*d,E=C*u-x*f,D=x*d-S*u,O=(t[0]*T+t[1]*E+t[2]*D)*b;if(O<0||w+O>1)continue;let k=(p*T+m*E+h*D)*b;k>1e-9&&k<s&&(s=k,yo=n)}return s}function xo(e,t,n,r,i={}){if(e&&e.parts)return So(e,t,n,r,i);let{isVisible:a=null,maxDistance:o=1/0,skipFlags:s=0,facing:c=!1}=i,l=[],u=e.spheres;for(let t=0;t<e.count;t++){if(s&&e.flags[t]&s||a&&!a(t)||e.geometries[e.geom[t]].kind!==`triangles`)continue;let i=_o(n[0],n[1],n[2],r[0],r[1],r[2],u[t*4],u[t*4+1],u[t*4+2],u[t*4+3]);i<o&&l.push([i,t])}l.sort((e,t)=>e[0]-t[0]);let d=o,f=-1,p=-1,m=[0,0,0],h=new Float64Array(16),g=new Float64Array(16),_=[0,0,0],v=[0,0,0];for(let[i,a]of l){if(i>d)break;for(let t=0;t<16;t++)h[t]=e.matrices[a*16+t];if(!ht(g,h))continue;_t(_,g,n[0],n[1],n[2]),vt(v,g,r[0],r[1],r[2]);let o=e.geometries[e.geom[a]];if(o.bounds&&!vo(_,v,o.bounds))continue;let s=t(o,0),l=e.materials[e.mat[a]],u=o.doubleSided||l&&l.doubleSided,y=c&&!u?e.flags[a]&1?-1:1:0,b=bo(_,v,s,d,y);if(b<d){d=b,f=a,p=yo;let e=s.positions,t=s.indices,n=t[p]*3,r=t[p+1]*3,i=t[p+2]*3,o=[e[r]-e[n],e[r+1]-e[n+1],e[r+2]-e[n+2]],c=[e[i]-e[n],e[i+1]-e[n+1],e[i+2]-e[n+2]],l=[o[1]*c[2]-o[2]*c[1],o[2]*c[0]-o[0]*c[2],o[0]*c[1]-o[1]*c[0]];for(let e=0;e<3;e++)m[e]=g[e*4]*l[0]+g[e*4+1]*l[1]+g[e*4+2]*l[2]}}if(f<0)return null;let y=Math.hypot(m[0],m[1],m[2])||1,b=m[0]*r[0]+m[1]*r[1]+m[2]*r[2]>0?-1:1;return{index:f,uid:e.uid[f],distance:d,point:[n[0]+r[0]*d,n[1]+r[1]*d,n[2]+r[2]*d],normal:[m[0]/y*b,m[1]/y*b,m[2]/y*b]}}function So(e,t,n,r,i){let a=null;for(let o of e.parts){if(!o.scene||!o.visible)continue;let e=o.scene,s=i.isVisible?t=>i.isVisible(t,e):null,c=a?a.distance:i.maxDistance??1/0,l=xo(e,t,n,r,{...i,isVisible:s,maxDistance:c});l&&(!a||l.distance<a.distance)&&(a={...l,part:o})}return a}function Co(e,t,n,r,i=null){return xo(e,t,n,r,{isVisible:i})}function wo(e,t){let n=[],r=e&&e.byUid.get(t);for(;r;){let e=r.values&&(r.values.name||r.values.id);e&&n.push(e),r=r.parent}return n}var To=()=>({min:[-1,-1,-1],max:[1,1,1]}),Eo=class{constructor(e,t=`fragment`){this.id=e,this.kind=t,this.scene=null,this.geomMap=null,this.matMap=null,this.visible=!0,this.selectable=t===`host`}get drawn(){return!!(this.scene&&this.visible)}},Do=class{constructor(){this.parts=[],this.host=null,this.geometries=[],this.geomIndex=new Map,this.geomUsers=[],this.freeGeometries=[],this.materials=[],this.matIndex=new Map,this.matUsers=[],this.freeMaterials=[],this.released=[],this.version=0,this.boundsDirty=!0,this.cachedBounds=To()}insert(e){if(e.kind===`host`){if(this.host)throw Error(`A scene set has one host.`);this.host=e,this.parts.unshift(e)}else this.parts.push(e);return this.changed(),e}remove(e){let t=this.parts.indexOf(e);return t<0?!1:(this.unplace(e),this.parts.splice(t,1),e===this.host&&(this.host=null),this.changed(),!0)}place(e,t){let n=new Uint32Array(t.geometries.length);for(let e=0;e<t.geometries.length;e++)n[e]=this.useGeometry(t.geometries[e]);let r=new Uint32Array(t.materials.length);for(let e=0;e<t.materials.length;e++)r[e]=this.useMaterial(t.materials[e]);this.unplace(e),e.scene=t,e.geomMap=n,e.matMap=r,this.changed()}unplace(e){if(e.scene){for(let t of e.geomMap)this.dropGeometry(t);for(let t of e.matMap)this.dropMaterial(t);e.scene=null,e.geomMap=null,e.matMap=null,this.changed()}}setVisible(e,t){let n=!!t;e.visible!==n&&(e.visible=n,this.changed())}changed(){this.version++,this.boundsDirty=!0}invalidateBounds(){this.boundsDirty=!0}useGeometry(e){let t=this.geomIndex.get(e);return t===void 0&&(t=this.freeGeometries.length?this.freeGeometries.pop():this.geometries.length,this.geometries[t]=e,this.geomUsers[t]=0,this.geomIndex.set(e,t)),this.geomUsers[t]++,t}dropGeometry(e){if(--this.geomUsers[e]>0)return;let t=this.geometries[e];this.geomIndex.delete(t),this.geometries[e]=null,this.freeGeometries.push(e),this.released.push(t)}useMaterial(e){let t=this.matIndex.get(e.key);return t===void 0&&(t=this.freeMaterials.length?this.freeMaterials.pop():this.materials.length,this.materials[t]=new ca(e.params,t,e.name),this.matUsers[t]=0,this.matIndex.set(e.key,t)),this.matUsers[t]++,t}dropMaterial(e){--this.matUsers[e]>0||(this.matIndex.delete(this.materials[e].key),this.materials[e]=null,this.freeMaterials.push(e))}takeReleased(){let e=this.released;return this.released=[],e}drawnParts(){let e=[];for(let t of this.parts)t.scene&&t.visible&&e.push(t);return e}get count(){let e=0;for(let t of this.parts)t.scene&&t.visible&&(e+=t.scene.count);return e}get bounds(){if(!this.boundsDirty)return this.cachedBounds;let e=[1/0,1/0,1/0],t=[-1/0,-1/0,-1/0];for(let n of this.parts){if(!n.scene||!n.visible||!n.scene.count)continue;let r=n.scene.bounds;for(let n=0;n<3;n++)r.min[n]<e[n]&&(e[n]=r.min[n]),r.max[n]>t[n]&&(t[n]=r.max[n])}return this.cachedBounds=e[0]<=t[0]?{min:e,max:t}:To(),this.boundsDirty=!1,this.cachedBounds}get lights(){let e=this.parts;if(e.length===1&&e[0].scene&&e[0].visible)return e[0].scene.lights;let t=[];for(let n of e)if(n.scene&&n.visible)for(let e of n.scene.lights)t.push(e);return t}get animation(){let e={time:!1,scroll:!1};for(let t of this.parts)t.scene&&t.visible&&(t.scene.animation.time&&(e.time=!0),t.scene.animation.scroll&&(e.scroll=!0));return e}get environment(){return this.host&&this.host.scene?this.host.scene.environment:null}get controls(){return this.host&&this.host.scene?this.host.scene.controls:null}get cameras(){return this.host&&this.host.scene?this.host.scene.cameras:[]}},Oo=`STAGE_HOST_ONLY`,ko={environment:`the environment`,camera:`a camera`,controls:`the controls`};function Ao(e){let t=e&&e.doc;if(!t||!t.root)return[];let n=[],r=e=>{if(e.unknown)return;let i=ko[e.name];i&&n.push(ho(t,{severity:`warning`,phase:`render`,code:Oo,message:`A fragment cannot set ${i}: the stage's document does. This element is ignored.`,element:e}));for(let t of e.children)t.type===`element`&&r(t)};return r(t.root),n}var jo=[`severity`,`phase`,`code`,`message`,`offset`,`length`,`suggestion`,`hint`,`path`,`line`,`column`,`uid`];function Mo(e){let t={};for(let n of jo)t[n]=e[n]===void 0?null:e[n];return t}function No(e){let t=new l(e);return t.line=e.line??0,t.column=e.column??0,t}var Po=[`triangles`,`lines`],Fo=e=>Math.max(0,Po.indexOf(e)),Io=(e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0},Lo=(e,t)=>e.kind===t.kind&&Io(e.indices,t.indices)&&Io(e.positions,t.positions)&&Io(e.normals,t.normals)&&Io(e.uvs,t.uvs);function Ro(e,t,n){let r=e.length,i=e.reduce((e,t)=>Math.max(e,t.lods),1),a=Array(r),o=Array(r),s=new Uint8Array(r),c=new Uint8Array(r),l=new Uint8Array(r),u=new Float64Array(r*6),d=new Float64Array(r*i),f=new Uint8Array(r),p=new Int32Array(r*i).fill(-1),m=[],h=[],g=[];e.forEach((e,r)=>{a[r]=e.key,o[r]=e.identity,s[r]=e.lods,l[r]=Fo(e.kind),c[r]=+!!e.doubleSided|(e.bounds?2:0),e.bounds&&u.set([...e.bounds.min,...e.bounds.max],r*6),f[r]=Math.min(e.lodDeviation.length,i);for(let t=0;t<f[r];t++)d[r*i+t]=e.lodDeviation[t];let _=`${t.quality}:${e.key}`;if(n&&n.has(_))return;let v=null;for(let n=0;n<e.lods;n++){let a=t.mesh(e,n);e.reports[n]&&m.push([r,n,e.reports[n]]),e.failedLods&1<<n&&h.push([r,n]),v&&Lo(v,a)?p[r*i+n]=p[r*i+n-1]:(p[r*i+n]=g.length,g.push(a),v=a)}n&&n.add(_)});let _=new Uint32Array(g.length*8),v=new Uint8Array(g.length),y=[0,0,0,0];g.forEach((e,t)=>{[e.positions,e.normals,e.uvs,e.indices].forEach((e,n)=>{_[t*8+n*2]=y[n],_[t*8+n*2+1]=e.length,y[n]+=e.length}),v[t]=Fo(e.kind)});let b=new Float32Array(y[0]),x=new Float32Array(y[1]),S=new Float32Array(y[2]),C=new Uint32Array(y[3]);return g.forEach((e,t)=>{b.set(e.positions,_[t*8]),x.set(e.normals,_[t*8+2]),S.set(e.uvs,_[t*8+4]),C.set(e.indices,_[t*8+6])}),{columns:{keys:a,identities:o,lods:s,flags:c,kinds:l,bounds:u,deviation:d,devLength:f,levels:p,maxLods:i,reports:m,failed:h},packed:{table:_,meshKinds:v,positions:b,normals:x,uvs:S,indices:C},buffers:[s,c,l,u,d,f,p,_,v,b,x,S,C].map(e=>e.buffer)}}function zo(e){let{table:t,meshKinds:n,positions:r,normals:i,uvs:a,indices:o}=e,s=Array(n.length);for(let e=0;e<s.length;e++){let c=e*8;s[e]=new Y({positions:r.subarray(t[c],t[c]+t[c+1]),normals:i.subarray(t[c+2],t[c+2]+t[c+3]),uvs:a.subarray(t[c+4],t[c+4]+t[c+5]),indices:o.subarray(t[c+6],t[c+6]+t[c+7]),kind:Po[n[e]]})}return s}var Bo=e=>{let t=e.params;return!!(t.map||t.normalMap||t.occlusionMap||t.metallicRoughnessMap||t.emissiveMap)},Vo=e=>e.byteOffset===0&&e.byteLength===e.buffer.byteLength?e:e.slice();function Ho(e,t={}){let n=new fo;t.quality&&(n.quality=t.quality);let r=go(e,{cache:n,time:t.time||0,progress:t.progress||0}),i=r.doc&&r.doc.lineIndex,a={ok:r.ok,diagnostics:r.diagnostics.map(Mo),hostOnly:r.ok?Ao(r).map(Mo):[],timings:r.timings,lineText:i&&typeof i.text==`string`&&i.text!==e?i.text:null,lineIndex:!!i};if(!r.ok)return{message:a,transfer:[]};let o=r.scene;if(o.dynamic.length||o.materials.some(Bo))return{message:{...a,main:!0},transfer:[]};let s=new Set,c=e=>{let t=Vo(e);return s.add(t.buffer),t},l=o.count,u={count:l,matrices:c(o.matrices.slice(0,l*16)),geom:c(o.geom.slice(0,l)),mat:c(o.mat.slice(0,l)),uid:c(o.uid.slice(0,l)),lodNode:c(o.lodNode.slice(0,l)),lodChild:c(o.lodChild.slice(0,l)),flags:c(o.flags.slice(0,l)),spheres:c(o.spheres.slice(0,l*4))},d=t.sent,f=Ro(o.geometries,n,d);for(let e of f.buffers)s.add(e);return{message:{...a,scene:{rows:u,geometries:f.columns,meshes:f.packed,materials:o.materials.map(e=>({params:e.params,name:e.name})),lights:o.lights,cameras:o.cameras,lodSwitches:o.lodSwitches,environment:o.environment,controls:o.controls,animation:o.animation,bounds:o.bounds}},transfer:[...s]}}var Uo=class{constructor(e){this.as=e.as||`fragment`,this.source=e.source,this.payload=e.payload||null,this.result=e.result||null,this.owner=e.owner??null,this.used=!1;let t=this.payload;t?(this.ok=t.ok,this.documentDiagnostics=t.diagnostics.map(No),this.hostOnly=t.hostOnly.map(No),this.timings=t.timings,this.lineText=t.lineText,this.hasLineIndex=t.lineIndex):(this.ok=this.result.ok,this.documentDiagnostics=this.result.diagnostics,this.hostOnly=e.hostOnly||[],this.timings=this.result.timings,this.lineText=null,this.hasLineIndex=!!(this.result.doc&&this.result.doc.lineIndex)),this.lineIndexCache=void 0}get diagnostics(){return this.as===`fragment`?[...this.documentDiagnostics,...this.hostOnly]:this.documentDiagnostics}get lineIndex(){if(this.lineIndexCache!==void 0)return this.lineIndexCache;if(this.result&&this.result.doc)return this.lineIndexCache=this.result.doc.lineIndex;let e=this.lineText||(typeof this.source==`string`?this.source:null);return this.lineIndexCache=this.hasLineIndex&&e?new s(e):null}};function Wo(e,t,n,r){let i=e.scene,a=new Oa(1),o=i.rows;a.count=o.count,a.capacity=o.count,a.matrices=o.matrices,a.geom=o.geom,a.mat=o.mat,a.uid=o.uid,a.lodNode=o.lodNode,a.lodChild=o.lodChild,a.flags=o.flags,a.spheres=o.spheres;let s=i.geometries,c=zo(i.meshes),l=s.maxLods,u=new Map(s.reports.map(([e,t,n])=>[e*l+t,n])),d=new Set(s.failed.map(([e,t])=>e*l+t));t.beginBuild(n);for(let e=0;e<s.keys.length;e++){let n=s.keys[e],i=Array.from(s.deviation.subarray(e*l,e*l+s.devLength[e])),o=s.bounds,f={key:n,identity:s.identities[e],kind:Po[s.kinds[e]],lods:s.lods[e],doubleSided:!!(s.flags[e]&1),bounds:s.flags[e]&2?{min:[o[e*6],o[e*6+1],o[e*6+2]],max:[o[e*6+3],o[e*6+4],o[e*6+5]]}:null,lodDeviation:i,generate:(e,t,i)=>r(n).generate(e,t,i)},p=t.acquire(f,null);for(let n=0;n<f.lods;n++){let r=s.levels[e*l+n];r<0||p.meshes[n]||(d.has(e*l+n)&&(p.failed=!0,p.failedLods|=1<<n),t.adopt(p,n,c[r],u.get(e*l+n)||null))}a.geometryIndex(p)}return t.endBuild(),a.materials=i.materials.map((e,t)=>new ca(e.params,t,e.name)),a.lights=i.lights,a.cameras=i.cameras,a.lodSwitches=i.lodSwitches,a.environment=i.environment,a.controls=i.controls,a.animation=i.animation,a.bounds=i.bounds,a.version=1,a}var Go=e=>!!e&&typeof e.then==`function`,Ko=class{constructor(e,t){this.stage=e,this.id=t,this.part=new Eo(t,`fragment`),this.result=null,this.owner=null,this.source=null,this.warnings=[],this.tasks=[],this.removed=!1,this.time=NaN,this.progress=NaN,this.ready=null}get placed(){return!!this.part.scene}get visible(){return this.part.visible}set visible(e){this.removed||(this.stage.set.setVisible(this.part,e),this.stage.changed=!0)}get diagnostics(){return this.result?[...this.result.diagnostics,...this.warnings]:[]}replace(e,t={}){return this.removed?Promise.resolve({ok:!1,diagnostics:[],fragment:this.id,removed:!0}):(this.ready=this.stage.enqueue(this,e,!!t.immediate),this.ready)}setTransforms(e){let t=Array.from(e||[]);if(this.removed||!this.result)return t.map(()=>!1);let n=this.stage.materialize(this),r=n.graph.byId,i=t.map(e=>r.get(Array.isArray(e)?e[0]:e&&e.id)),a=t.map(e=>Array.isArray(e)?e[1]:e&&e.matrix),{time:o,progress:s}=this.stage.clock(),c=oo(n.scene,n.graph,i,a,o,s);return c.some(Boolean)&&(this.stage.set.invalidateBounds(),this.stage.changed=!0),c}setTransform(e,t){return this.setTransforms([[e,t]])[0]===!0}remove(){this.stage.removeFragment(this)}},qo=class{constructor(e={}){this.cache=e.cache||new fo,this.clock=e.clock||(()=>({time:0,progress:0})),this.report=e.report||null,this.compiler=e.compiler||null,this.forget=e.forget||null,this.restore=e.restore||null,this.now=e.now||mo,this.set=new Do,this.host=this.set.insert(new Eo(null,`host`)),this.hostResult=null,this.hostOwner=uo,this.byId=new Map,this.queue=[],this.waiting=0,this.nextId=1,this.changed=!1}get list(){return[...this.byId.values()]}get queued(){return this.queue.length}get pending(){return this.queue.length>0}takeChanged(){let e=this.changed;return this.changed=!1,e}newOwner(e){return{owner:e}}setHost(e,t){this.set.place(this.host,e.scene),this.adoptHost(e,t)}adoptHost(e,t){this.hostOwner!==t&&this.release(this.hostOwner),this.hostResult=e,this.hostOwner=t,this.changed=!0}release(e){e!=null&&(this.cache.release(e),this.forget&&e!==`document`&&this.forget(e))}fromPrepared(e,t=`fragment`){if(e.used)throw Error(`A prepared document can be shown or added once; prepare it again.`);if(e.used=!0,e.claimed=!0,!e.ok)return{result:{ok:!1,doc:null,graph:null,scene:null,cache:this.cache,diagnostics:e.documentDiagnostics,timings:e.timings,lineIndex:e.lineIndex},owner:null};if(e.result)return{result:e.result,owner:e.owner};let n=this.newOwner(t);if(e.payload.main){let{time:t,progress:r}=this.clock();return{result:go(e.source,{cache:this.cache,owner:n,time:t,progress:r}),owner:n}}let r=e.source,i=this.cache,a=null,o=Wo(e.payload,i,n,e=>{a||(a=new fo,a.quality=i.quality,go(r,{cache:a}));let t=a.entries.get(e);if(!t)throw Error(`The document has no geometry ${e}.`);return t.desc});e.payload=null;let s=null;return{result:{ok:!0,scene:o,cache:i,graph:null,diagnostics:e.documentDiagnostics,timings:e.timings,prepared:!0,source:r,get doc(){return s||=Un(r),s}},owner:n}}add(e,t={}){let n=t.id==null?null:String(t.id);if(n===null){for(;this.byId.has(`fragment-${this.nextId}`);)this.nextId++;n=`fragment-${this.nextId++}`}if(this.byId.has(n))throw Error(`The stage has a fragment "${n}" already. Replace it, or remove it first.`);let r=new Ko(this,n);return this.byId.set(n,r),this.set.insert(r.part),r.ready=this.enqueue(r,e,!!t.immediate),r}enqueue(e,t,n){this.claim(t);let r,i=new Promise(e=>r=e),a={frag:e,input:t,ready:!Go(t),cancelled:!1,finished:!1,immediate:n,placing:null,resolve:null};a.resolve=e=>{a.finished=!0,r(e)};for(let t of e.tasks)this.cancel(t),i.then(t.resolve);return e.tasks=[a],Go(t)&&(this.waiting++,t.then(e=>{a.input=e},e=>{a.input=null,a.error=e}).then(()=>{this.waiting--,a.ready=!0,a.cancelled&&this.discard(a.input)})),n&&a.ready?this.run(a):this.queue.push(a),i}claim(e){if(e instanceof Uo){if(e.claimed)throw Error(`A prepared document can be shown or added once; prepare it again.`);e.claimed=!0}}cancel(e){e.cancelled=!0,e.finished=!0,e.placing&&this.release(e.placing.owner);let t=this.queue.indexOf(e);t>=0&&this.queue.splice(t,1),e.ready&&this.discard(e.input)}discard(e){e instanceof Uo&&!e.used&&e.owner&&(e.used=!0,this.release(e.owner))}applyQueued(e=1/0){let t=this.now(),n=0,r=0;for(;this.queue.length&&!(n&&this.now()-t>=e);){let e=this.queue.findIndex(e=>e.ready);if(e<0)break;let t=this.queue.splice(e,1)[0];r+=this.run(t),n++}return{applied:n,changeMs:n?this.now()-t:0,compileMs:r}}run(e){let t=e.frag;if(t.tasks=t.tasks.filter(t=>t!==e),e.cancelled||t.removed)return 0;if(e.placing){let n=e.placing;return e.placing=null,this.place(t,n.result,n.owner,n.warnings,n.input),e.resolve({ok:!0,diagnostics:t.diagnostics,fragment:t.id}),0}let n=this.now(),r,i,a,o,s=e.input;try{if(s instanceof Uo)({result:r,owner:i}=this.fromPrepared(s,`fragment`)),a=r.ok?s.hostOnly:[],o=s.lineIndex;else if(s==null)r={ok:!1,diagnostics:[],error:e.error};else{i=this.newOwner(`fragment`);let{time:e,progress:t}=this.clock();r=go(s,{cache:this.cache,owner:i,time:e,progress:t}),a=r.ok?Ao(r):[]}}catch(e){r={ok:!1,diagnostics:[],error:e}}let c=this.now()-n;if(!r.ok){i&&this.release(i);let n=r.error?String(r.error&&r.error.message?r.error.message:r.error):Gn({diagnostics:r.diagnostics,lineIndex:o||r.doc&&r.doc.lineIndex});return this.report&&this.report(n,{...r,fragment:t.id}),e.resolve({ok:!1,diagnostics:r.diagnostics,fragment:t.id}),c}let l=this.restore&&!e.immediate&&!r.prepared?this.restore(this.cache,i):null;return l?(e.placing={result:r,owner:i,warnings:a,input:s},e.ready=!1,t.tasks.push(e),this.queue.push(e),this.waiting++,Promise.resolve(l).catch(()=>{}).then(()=>{this.waiting--,e.ready=!0}),c):(this.place(t,r,i,a,s),e.resolve({ok:!0,diagnostics:t.diagnostics,fragment:t.id}),c)}place(e,t,n,r,i,a=!1){let o=e.owner;this.set.place(e.part,t.scene),e.result=t,e.owner=n,e.source=i instanceof Uo?i.source:i,e.warnings=r||[];let{time:s,progress:c}=this.clock();e.time=s,e.progress=c,o&&o!==n&&this.release(o),this.changed=!0,!a&&e.warnings.length&&this.report&&this.report(Gn({diagnostics:e.warnings,lineIndex:t.doc&&!t.prepared?t.doc.lineIndex:null}),{ok:!0,diagnostics:e.warnings,fragment:e.id})}materialize(e){let t=e.result;if(t.graph)return t;let n=this.newOwner(`fragment`),{time:r,progress:i}=this.clock(),a=go(e.source,{cache:this.cache,owner:n,time:r,progress:i});return this.place(e,a,n,e.warnings,e.source,!0),a}removeFragment(e){if(!e.removed){e.removed=!0;for(let t of e.tasks)this.cancel(t),t.resolve({ok:!1,diagnostics:[],fragment:e.id,removed:!0});e.tasks=[],this.set.remove(e.part),this.release(e.owner),e.owner=null,this.byId.delete(e.id),this.changed=!0}}clear(){for(let e of this.list)this.removeFragment(e)}prepare(e,t={}){let n=t.as===`document`?`document`:`fragment`,{time:r,progress:i}=this.clock(),a=()=>{let t=this.newOwner(n),a=go(e,{cache:this.cache,owner:t,time:r,progress:i});return a.ok||this.release(t),new Uo({as:n,source:e,result:a,owner:a.ok?t:null,hostOnly:a.ok?Ao(a):[]})};return this.compiler?this.compiler.compile(e,{time:r,progress:i,quality:this.cache.quality}).then(t=>t?new Uo({as:n,source:e,payload:t}):a()):Promise.resolve(a())}updateDynamic(e,t){let n=!1;for(let r of this.byId.values()){let i=r.result;i&&r.part.drawn&&i.scene.dynamic.length&&i.graph&&(r.time!==e||r.progress!==t)&&(so(i.scene,i.graph,e,t),r.time=e,r.progress=t,n=!0)}return n&&this.set.invalidateBounds(),n}names(e,t){if(!e||e===this.host)return wo(this.hostResult&&this.hostResult.doc,t);let n=this.byId.get(e.id);return n&&n.result?wo(n.result.doc,t):[]}dispose(){this.clear(),this.compiler&&this.compiler.dispose&&this.compiler.dispose()}},Jo=class{constructor(e=65536,t=1<<17){this.vertices=new Float32Array(e*8),this.indices=new Uint32Array(t),this.vertexCount=0,this.indexCount=0,this.ranges=new Map,this.edgeRanges=new Map,this.normalRanges=new Map,this.generation=0,this.uploadedVertices=0,this.uploadedIndices=0}reset(){this.vertexCount=0,this.indexCount=0,this.ranges.clear(),this.edgeRanges.clear(),this.normalRanges.clear(),this.generation++,this.uploadedVertices=0,this.uploadedIndices=0}get byteSize(){return this.vertexCount*32+this.indexCount*4}ensure(e,t){let n=!1;if((this.vertexCount+e)*8>this.vertices.length){let t=this.vertices.length/8;for(;t<this.vertexCount+e;)t*=2;let r=new Float32Array(t*8);r.set(this.vertices.subarray(0,this.vertexCount*8)),this.vertices=r,n=!0}if(this.indexCount+t>this.indices.length){let e=this.indices.length;for(;e<this.indexCount+t;)e*=2;let r=new Uint32Array(e);r.set(this.indices.subarray(0,this.indexCount)),this.indices=r,n=!0}n&&(this.generation++,this.uploadedVertices=0,this.uploadedIndices=0)}appendVertices(e){let t=e.vertexCount,n=this.vertexCount,r=this.vertices,i=e.positions,a=e.normals,o=e.uvs,s=n*8;for(let e=0;e<t;e++)r[s]=i[e*3],r[s+1]=i[e*3+1],r[s+2]=i[e*3+2],r[s+3]=a[e*3],r[s+4]=a[e*3+1],r[s+5]=a[e*3+2],r[s+6]=o[e*2],r[s+7]=o[e*2+1],s+=8;return this.vertexCount+=t,n}appendIndices(e,t){let n=this.indexCount,r=this.indices;for(let i=0;i<e.length;i++)r[n+i]=e[i]+t;return this.indexCount+=e.length,n}meshRange(e){let t=this.ranges.get(e);if(t)return t;this.ensure(e.vertexCount,e.indices.length);let n=this.appendVertices(e);return t={firstIndex:this.appendIndices(e.indices,n),indexCount:e.indices.length,baseVertex:n,kind:e.kind},this.ranges.set(e,t),t}edgeRange(e){let t=this.edgeRanges.get(e);if(t)return t;let n=this.meshRange(e).baseVertex,r=e.edges();return this.ensure(0,r.length),t={firstIndex:this.appendIndices(r,n),indexCount:r.length,kind:`lines`},this.edgeRanges.set(e,t),t}normalRange(e){let t=this.normalRanges.get(e);if(t)return t;let n=e.normalLines();return t=this.meshRange(n),this.normalRanges.set(e,t),t}pending(){return{full:this.uploadedVertices===0&&this.uploadedIndices===0,vertexStart:this.uploadedVertices,vertexEnd:this.vertexCount,indexStart:this.uploadedIndices,indexEnd:this.indexCount}}markUploaded(){this.uploadedVertices=this.vertexCount,this.uploadedIndices=this.indexCount}};function Yo(e,t,n){return Math.sqrt(e*e+t*t+n*n)}function Xo(e,t){let n=e.aspect||1,r=Math.tan(e.verticalFov(n)/2);return{orthographic:e.type===`orthographic`,ppuFactor:e.pixelsPerUnit(1,t),view:e.view,cornerStretch:1+r*r*(1+n*n)}}function Zo(e,t,n,r,i){if(e.orthographic)return e.ppuFactor;let a=e.view,o=-(a[2]*t+a[6]*n+a[10]*r+a[14]),s=o>0?Math.min(i*i/(o*o),e.cornerStretch):e.cornerStretch;return e.ppuFactor*s/Math.max(i,1e-6)}function Qo(e,t){for(let n=t+1;n<e.length;n++)if(e[n])return n;for(let n=t-1;n>=0;n--)if(e[n])return n;return e.length-1}function $o(e,t){let n=t*16,r=0;for(let t=0;t<3;t++){let i=Yo(e[n+t*4],e[n+t*4+1],e[n+t*4+2]);i>r&&(r=i)}return r||1}function es(e,t,n,r,i){if(!(t>1)||!e)return 0;let a=1/(i>0?i:1),o=n*r,s=0,c=Math.min(t,e.length)-1;for(let t=c;t>=1;t--)if(e[t]*o<=a){s=t;break}return s}function ts(e){let t=t=>[e[t],e[4+t],e[8+t],e[12+t]],n=t(0),r=t(1),i=t(3),a=t(2),o=[[i[0]+n[0],i[1]+n[1],i[2]+n[2],i[3]+n[3]],[i[0]-n[0],i[1]-n[1],i[2]-n[2],i[3]-n[3]],[i[0]+r[0],i[1]+r[1],i[2]+r[2],i[3]+r[3]],[i[0]-r[0],i[1]-r[1],i[2]-r[2],i[3]-r[3]],[i[0]-a[0],i[1]-a[1],i[2]-a[2],i[3]-a[3]]];for(let e of o){let t=Math.hypot(e[0],e[1],e[2])||1;e[0]/=t,e[1]/=t,e[2]/=t,e[3]/=t}return o}var ns=class{constructor(){this.instanceData=new Float32Array(16384),this.keys=new Int32Array(1024),this.lods=new Uint8Array(1024),this.last=null,this.lastSignature=``}ensure(e){if(this.instanceData.length<e*16){let t=this.instanceData.length/16;for(;t<e;)t*=2;this.instanceData=new Float32Array(t*16)}if(this.keys.length<e){let t=this.keys.length;for(;t<e;)t*=2;this.keys=new Int32Array(t),this.lods=new Uint8Array(t)}}lodStates(e,t,n){let r=e.lodSwitches,i=new Int32Array(r.length),a=new Uint8Array(r.length);for(let e=0;e<r.length;e++){let t=r[e],o=n(t.pos),s=0;for(;s<t.distances.length&&o>=t.distances[s];)s++;i[e]=s,a[e]=t.parent<0||a[t.parent]&&i[t.parent]===t.parentChild?1:0}return{active:i,visible:a}}build(e){let{scene:t,camera:n,pool:r,meshOf:i,options:a}=e,o=t.parts?t.drawnParts():[{scene:t,geomMap:null,matMap:null,selectable:!0}],s=0;for(let e of o)s+=e.scene.count;let c=0;if(a.selection&&a.selection.size)for(let e of o){if(!e.selectable)continue;let t=e.scene;for(let e=0;e<t.count;e++)a.selection.has(t.uid[e])&&c++}this.ensure(s+(a.bbox?s:0)+c+64);let l=n.position,u=e=>Math.hypot(e[0]-l[0],e[1]-l[1],e[2]-l[2]),d=a.culling===!1?null:ts(n.viewProj),f=this.keys,p=this.lods,m=new Map,h=[],g=t.geometries,_=t.materials,v=Math.max(1,_.length),y=[0,0,0,0],b=0,x=0,S=e.viewportHeight,C=a.lodBias||1,w=a.autoLod===!1?a.fixedLod||0:-1,T=Xo(n,S),E=0;for(let e of o){let t=e.scene,n=e.geomMap,r=e.matMap,i=t.count,a=this.lodStates(t,l,u),o=t.spheres;for(let e=0;e<i;e++){let i=E+e;f[i]=-1;let s=t.lodNode[e];if(s>=0&&!(a.visible[s]&&a.active[s]===t.lodChild[e]))continue;let c=o[e*4],u=o[e*4+1],S=o[e*4+2],D=o[e*4+3];if(d){let e=!1;for(let t=0;t<5;t++){let n=d[t];if(n[0]*c+n[1]*u+n[2]*S+n[3]<-D){e=!0;break}}if(e){x++;continue}}let O=n?n[t.geom[e]]:t.geom[e],k=g[O],A=0;if(k.lods>1){if(w>=0)A=Math.min(w,k.lods-1);else{let n=Zo(T,c,u,S,Yo(c-l[0],u-l[1],S-l[2]));A=es(k.lodDeviation,k.lods,$o(t.matrices,e),n,C)}}p[i]=A,y[A]++;let j=t.flags[e]&1,M=r?r[t.mat[e]]:t.mat[e],N=((O*4+A)*v+M)*2+j,P=m.get(N);if(P===void 0){P=h.length,m.set(N,P);let e=_[M];h.push({gi:O,entry:k,lod:A,mi:M,material:e,mirrored:!!j,count:0,firstInstance:0,depth:0,instances:null})}h[P].count++,f[i]=P,b++}E+=i}let D=a.tessellationBudget,O=D>=0&&D<1/0,k=O?performance.now():0,A=0,j=0,M=0;for(let e of h){let t=e.lod,n=e.entry.meshes;O&&n&&!n[t]&&(A&&performance.now()-k>=D?(t=Qo(n,t),j++):A++);let a=i(e.entry,t);e.mesh=a,e.kind=a.kind,e.range=r.meshRange(a),e.doubleSided=!!(e.entry.doubleSided||e.material.doubleSided),e.transparent=e.material.transparent,e.kind===`triangles`&&(M+=e.range.indexCount/3*e.count)}let N=0,P=h.slice().sort((e,t)=>e.transparent===t.transparent?e.kind===t.kind?e.doubleSided===t.doubleSided?e.mirrored===t.mirrored?e.mi-t.mi:e.mirrored?1:-1:e.doubleSided?1:-1:e.kind===`triangles`?-1:1:e.transparent?1:-1);for(let e of P)e.firstInstance=N,N+=e.count,e.cursor=e.firstInstance;let F=this.instanceData,ee=[];E=0;for(let e of o){let t=e.scene,n=t.matrices,r=t.spheres;for(let e=0;e<t.count;e++){let t=f[E+e];if(t<0)continue;let i=h[t];if(i.transparent){ee.push({M:n,r:e,b:i,depth:-Yo(r[e*4]-l[0],r[e*4+1]-l[1],r[e*4+2]-l[2])});continue}let a=i.cursor++*16;for(let t=0;t<16;t++)F[a+t]=n[e*16+t]}E+=t.count}if(ee.length){ee.sort((e,t)=>e.depth-t.depth);for(let e of ee){let t=e.b,n=t.cursor++*16;for(let t=0;t<16;t++)F[n+t]=e.M[e.r*16+t];t.depth=Math.max(t.depth,-e.depth)}let e=P.filter(e=>!e.transparent),t=P.filter(e=>e.transparent).sort((e,t)=>t.depth-e.depth);P.length=0,P.push(...e,...t)}let te={wireframe:[],normals:[],bbox:null,selection:null};if(a.wireframe||a.normals)for(let e of P)e.kind===`triangles`&&(a.wireframe&&te.wireframe.push({range:r.edgeRange(e.mesh),firstInstance:e.firstInstance,count:e.count,mirrored:e.mirrored}),a.normals&&te.normals.push({range:r.normalRange(e.mesh),firstInstance:e.firstInstance,count:e.count}));let ne=(e,t,n)=>{let r=e.scene,i=g[e.geomMap?e.geomMap[r.geom[t]]:r.geom[t]].bounds,a=(i.min[0]+i.max[0])/2,o=(i.min[1]+i.max[1])/2,s=(i.min[2]+i.max[2])/2,c=Math.max(i.max[0]-i.min[0],1e-4),l=Math.max(i.max[1]-i.min[1],1e-4),u=Math.max(i.max[2]-i.min[2],1e-4),d=r.matrices.subarray(t*16,t*16+16);for(let e=0;e<3;e++)F[n+e]=d[e]*c,F[n+4+e]=d[4+e]*l,F[n+8+e]=d[8+e]*u,F[n+12+e]=d[e]*a+d[4+e]*o+d[8+e]*s+d[12+e];F[n+3]=0,F[n+7]=0,F[n+11]=0,F[n+15]=1};if(a.bbox){let e=N;E=0;for(let e of o){for(let t=0;t<e.scene.count;t++)f[E+t]<0||(ne(e,t,N*16),N++);E+=e.scene.count}te.bbox={firstInstance:e,count:N-e}}if(c){let e=N,t=a.selection;E=0;for(let e of o){let n=e.scene;if(e.selectable)for(let r=0;r<n.count;r++)t.has(n.uid[r])&&(f[E+r]<0&&n.lodNode[r]>=0||(ne(e,r,N*16),N++));E+=n.count}te.selection={firstInstance:e,count:N-e}}let re={batches:P,overlays:te,instanceData:this.instanceData,instanceCount:N,lights:t.lights,environment:t.environment,stats:{instances:s,visible:b,culled:x,batches:P.length,drawCalls:P.length+te.wireframe.length+te.normals.length+ +!!te.bbox+ +!!te.selection,triangles:M,lodHistogram:y,refining:j}};return this.last=re,re}},rs=256;function is(e){return[Math.round(e[0]*255),Math.round(e[1]*255),Math.round(e[2]*255),Math.round((e[3]??1)*255)]}function as(e,t,n){let r=Math.max(0,Math.min(1,(n-e)/(t-e)));return r*r*(3-2*r)}function os(e,t,n,r){let i=e*n,a=t*n,o=Math.floor(i),s=Math.floor(a),c=i-o,l=a-s,u=c*c*(3-2*c),d=l*l*(3-2*l),f=(e,t)=>Da((e%n+n)%n,(t%n+n)%n,r),p=f(o,s),m=f(o+1,s),h=f(o,s+1),g=f(o+1,s+1);return p+(m-p)*u+(h-p)*d+(p-m-h+g)*u*d}function ss(e,t,n,r){let i=0,a=.5,o=Math.max(1,Math.round(n)),s=0;for(let n=0;n<5;n++)i+=os(e,t,o,r+n*17)*a,s+=a,a*=.5,o*=2;return i/s}function cs(e,t){let n=new Uint8ClampedArray(e*e*4);for(let r=0;r<e;r++)for(let i=0;i<e;i++){let a=t((i+.5)/e,(r+.5)/e),o=(r*e+i)*4;n[o]=a[0],n[o+1]=a[1],n[o+2]=a[2],n[o+3]=a[3]}return{width:e,height:e,data:n}}function ls(e,t,n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n,e[3]+(t[3]-e[3])*n]}function us(e,t=rs){let n=e.params;switch(e.fn){case`checker`:{let e=is(n.color1),r=is(n.color2),i=Math.max(1,Math.round(n.count));return cs(t,(t,n)=>(Math.floor(t*i)+Math.floor(n*i))%2==0?e:r)}case`stripes`:{let e=is(n.color1),r=is(n.color2),i=Math.max(1,Math.round(n.count));return cs(t,t=>Math.floor(t*i*2)%2==0?e:r)}case`grid`:{let e=is(n.line),r=is(n.background),i=Math.max(1,Math.round(n.count)),a=n.width/2;return cs(t,(t,n)=>{let o=t*i%1,s=n*i%1,c=Math.min(o,1-o,s,1-s);return ls(e,r,as(a*.6,a,c))})}case`noise`:{let e=is(n.color1),r=is(n.color2);return cs(t,(t,i)=>ls(r,e,ss(t,i,n.scale,n.seed)))}case`bricks`:{let e=is(n.brick),r=is(n.mortar),i=Math.max(1,Math.round(n.count));return cs(t,(t,n)=>{let a=Math.floor(n*i),o=(t*i*.5+a%2*.5)%1,s=n*i%1,c=Math.min(o,1-o,s,1-s),l=.88+.24*Da(Math.floor(t*i*.5+a%2*.5),a,7),u=[e[0]*l,e[1]*l,e[2]*l,255];return ls(r,u,as(.03,.06,c))})}default:throw Error(`unknown procedural texture ${e.fn}`)}}function ds(e){let t=e.params;switch(e.fn){case`bumps`:{let e=Math.max(1,Math.round(t.count));return(t,n)=>{let r=t*e%1-.5,i=n*e%1-.5,a=Math.hypot(r,i)*2.4;return a<1?Math.sqrt(1-a*a):0}}case`tiles`:{let e=Math.max(1,Math.round(t.count));return(n,r)=>{let i=n*e%1,a=r*e%1,o=Math.min(i,1-i,a,1-a);return as(t.gap*.5,t.gap*1.5,o)}}case`noise`:return(e,n)=>ss(e,n,t.scale,t.seed);case`waves`:{let e=Math.max(1,Math.round(t.count));return t=>.5+.5*Math.sin(t*e*Math.PI*2)}case`bricks`:{let e=Math.max(1,Math.round(t.count));return(t,n)=>{let r=Math.floor(n*e),i=(t*e*.5+r%2*.5)%1,a=n*e%1;return as(.02,.07,Math.min(i,1-i,a,1-a))}}default:throw Error(`unknown procedural normal map ${e.fn}`)}}function fs(e,t=rs){let n=ds(e),r=e.params.strength??1,i=new Float32Array(t*t);for(let e=0;e<t;e++)for(let r=0;r<t;r++)i[e*t+r]=n((r+.5)/t,(e+.5)/t);let a=new Uint8ClampedArray(t*t*4),o=r*t*.02;for(let e=0;e<t;e++)for(let n=0;n<t;n++){let r=(e,n)=>i[(n+t)%t*t+(e+t)%t],s=(r(n+1,e)-r(n-1,e))*o,c=(r(n,e+1)-r(n,e-1))*o,l=-s,u=-c,d=1,f=Math.hypot(l,u,d);l/=f,u/=f,d/=f;let p=(e*t+n)*4;a[p]=Math.round((l*.5+.5)*255),a[p+1]=Math.round((u*.5+.5)*255),a[p+2]=Math.round((d*.5+.5)*255),a[p+3]=255}return{width:t,height:t,data:a}}function ps(e){let t=[e],n=e;for(;n.width>1||n.height>1;){let e=Math.max(1,n.width>>1),r=Math.max(1,n.height>>1),i=new Uint8ClampedArray(e*r*4);for(let t=0;t<r;t++)for(let r=0;r<e;r++)for(let a=0;a<4;a++){let o=0,s=0;for(let e=0;e<2;e++)for(let i=0;i<2;i++){let c=Math.min(n.width-1,r*2+i),l=Math.min(n.height-1,t*2+e);o+=n.data[(l*n.width+c)*4+a],s++}i[(t*e+r)*4+a]=o/s}n={width:e,height:r,data:i},t.push(n)}return t}async function ms(e){let t=await fetch(e);if(!t.ok)throw Error(`HTTP ${t.status} for ${e}`);let n=await t.blob(),r=await createImageBitmap(n),i=e=>Math.min(2048,2**Math.round(Math.log2(Math.max(1,e)))),a=i(r.width),o=i(r.height),s=(typeof OffscreenCanvas<`u`?new OffscreenCanvas(a,o):Object.assign(document.createElement(`canvas`),{width:a,height:o})).getContext(`2d`);return s.drawImage(r,0,0,a,o),{width:a,height:o,data:s.getImageData(0,0,a,o).data}}function hs(e,t){return e.kind===`procedural`?Promise.resolve(t===`normal`?fs(e):us(e)):ms(e.url)}var gs=class{constructor(){this.entries=new Map,this.onReady=null,this.onError=null}get(e,t){let n=`${t}:${e.key}`,r=this.entries.get(n);return r||(r={id:n,spec:e,kind:t,status:`pending`,pixels:null,error:null,gpu:null},this.entries.set(n,r),hs(e,t).then(e=>{r.pixels=e,r.status=`ready`,this.onReady&&this.onReady(r)},e=>{r.status=`failed`,r.error=e,this.onError&&this.onError(r,e)}),r)}clear(e){for(let t of this.entries.values())t.gpu&&e&&e(t.gpu);this.entries.clear()}},_s=1216,vs={directional:0,point:1,spot:2,ambient:3,hemisphere:4},ys=[{type:`directional`,color:[1.1,1.08,1.04],direction:bs([-.45,-.85,-.35]),position:[0,0,0],range:0,outer:0,inner:0,ground:[0,0,0]},{type:`directional`,color:[.22,.25,.32],direction:bs([.6,-.2,.75]),position:[0,0,0],range:0,outer:0,inner:0,ground:[0,0,0]}];function bs(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function xs(e,{viewProj:t,view:n,cameraPos:r,time:i,environment:a,lights:o,normalLength:s=.1,lineBias:c=.0015,viewportHeight:l=1}){e.fill(0),e.set(t,0),e.set(n,16),e[32]=r[0],e[33]=r[1],e[34]=r[2],e[35]=i||0;let u=Te(a.sky),d=Te(a.ground);e[36]=u[0],e[37]=u[1],e[38]=u[2],e[39]=a.intensity,e[40]=d[0],e[41]=d[1],e[42]=d[2],e[43]=a.exposure;let f=o&&o.length?o:ys,p=Math.min(f.length,16);e[44]=p,e[45]=s,e[46]=c,e[47]=l;for(let t=0;t<p;t++){let n=f[t],r=48+t*4,i=112+t*4,a=176+t*4,o=240+t*4;e[r]=n.position[0],e[r+1]=n.position[1],e[r+2]=n.position[2],e[r+3]=vs[n.type]??0,e[i]=n.direction[0],e[i+1]=n.direction[1],e[i+2]=n.direction[2],e[i+3]=n.range||0,e[a]=n.color[0],e[a+1]=n.color[1],e[a+2]=n.color[2],e[a+3]=n.outer||0,e[o]=Math.max(n.inner||0,(n.outer||0)+1e-4),e[o+1]=n.ground?n.ground[0]:0,e[o+2]=n.ground?n.ground[1]:0,e[o+3]=n.ground?n.ground[2]:0}return{data:e,lightCount:p,truncated:Math.max(0,f.length-16),usedDefaults:!(o&&o.length)}}function Ss(e){let t=Math.round(e[44]),n=``;for(let r=0;r<t;r++)n+=(r?`,`:``)+Math.round(e[48+r*4+3]);return n}function Cs(e,t,{hasMap:n=!1,hasNormalMap:r=!1,hasMrMap:i=!1,hasOcclusionMap:a=!1,hasEmissiveMap:o=!1,doubleSided:s=!1}={}){return e.fill(0),e[0]=t.baseColor[0],e[1]=t.baseColor[1],e[2]=t.baseColor[2],e[3]=t.alphaMode===`opaque`?1:t.opacity,e[4]=t.emissive[0],e[5]=t.emissive[1],e[6]=t.emissive[2],e[7]=t.normalScale,e[8]=t.metallic,e[9]=t.roughness,e[10]=!!n|(r?2:0)|(s?4:0)|(t.unlit?8:0)|(i?32:0)|(a?64:0)|(o?128:0)|(t.alphaMode===`mask`?256:0),e[11]=t.alphaCutoff??.5,e[12]=t.uvScale[0],e[13]=t.uvScale[1],e[14]=t.occlusionStrength??1,e}function ws(e,t){return e.fill(0),e[16]=t[0],e[17]=t[1],e[18]=t[2],e[19]=t[3],e[10]=16,e[12]=1,e[13]=1,e}var Ts=`
|
|
9
|
+
`)}var Kn=Math.cos(8*Math.PI/180),qn=256;function Jn(e,t){let n=Math.hypot(e,t);return n>1e-12?[e/n,t/n,0]:null}function Yn(e,t,n){let r=Math.hypot(e,t,n);return r>1e-12?[e/r,t/r,n/r]:null}var Xn=class{constructor(e){this.dim=e,this.pts=[],this.smooth=[],this.firstTan=null,this.lastTan=null,this.closed=!1}get count(){return this.smooth.length}lastPoint(){let e=this.dim,t=this.pts,n=t.length-e;return e===3?[t[n],t[n+1],t[n+2]]:[t[n],t[n+1],0]}start(e,t,n){this.pts.push(e,t),this.dim===3&&this.pts.push(n),this.smooth.push(0)}joint(e){if(e){if(this.lastTan){let t=this.lastTan[0]*e[0]+this.lastTan[1]*e[1]+this.lastTan[2]*e[2];this.smooth[this.smooth.length-1]=+(t>=Kn)}else this.firstTan=e}}push(e,t,n,r){let i=this.dim,a=this.pts,o=a.length-i;Math.abs(a[o]-e)<1e-12&&Math.abs(a[o+1]-t)<1e-12&&(i===2||Math.abs(a[o+2]-n)<1e-12)||(a.push(e,t),i===3&&a.push(n),this.smooth.push(+!!r))}end(e){e&&(this.lastTan=e)}};function Zn(e,t,n,r){return e===3?Yn(t,n,r):Jn(t,n)}function Qn(e,t){let n=t.dim||2,r=Math.max(t.tolerance,1e-9),i=t.maxSegments||qn,a=[],o=null,s=()=>{if(o){if(o.closed){let e=n,t=o.pts,r=o.count;if(r>1){let i=(r-1)*e;if(Math.abs(t[i]-t[0])<1e-9&&Math.abs(t[i+1]-t[1])<1e-9&&(e===2||Math.abs(t[i+2]-t[2])<1e-9))t.length-=e,o.smooth.pop();else{let r=Zn(n,t[0]-t[i],t[1]-t[i+1],e===3?t[2]-t[i+2]:0);o.joint(r),o.end(r)}}if(o.firstTan&&o.lastTan){let e=o.lastTan[0]*o.firstTan[0]+o.lastTan[1]*o.firstTan[1]+o.lastTan[2]*o.firstTan[2];o.smooth[0]=+(e>=Kn)}}o.count>=(o.closed?3:2)?a.push({points:Float64Array.from(o.pts),smooth:Uint8Array.from(o.smooth),closed:o.closed}):o.count>=2&&a.push({points:Float64Array.from(o.pts),smooth:Uint8Array.from(o.smooth),closed:!1,degenerate:!0}),o=null}};for(let t of e){if(t.c===`M`){s(),o=new Xn(n),o.start(t.x,t.y,t.z||0);continue}if(!o)continue;let[e,a,c]=o.lastPoint();switch(t.c){case`L`:{let r=Zn(n,t.x-e,t.y-a,(t.z||0)-c);if(!r)break;o.joint(r),o.push(t.x,t.y,t.z||0,!1),o.end(r);break}case`Q`:{let s=e,l=a,u=c,d=s-2*t.x1+t.x,f=l-2*t.y1+t.y,p=n===3?u-2*t.z1+t.z:0,m=Math.max(1,Math.min(i,Math.ceil(Math.sqrt(.25*Math.hypot(d,f,p)/r)))),h=Zn(n,t.x1-s,t.y1-l,(t.z1||0)-u)||Zn(n,t.x-s,t.y-l,(t.z||0)-u),g=Zn(n,t.x-t.x1,t.y-t.y1,(t.z||0)-(t.z1||0))||h;if(!h)break;o.joint(h);for(let e=1;e<=m;e++){let n=e/m,r=1-n,i=r*r,a=2*r*n,c=n*n;o.push(i*s+a*t.x1+c*t.x,i*l+a*t.y1+c*t.y,i*u+a*(t.z1||0)+c*(t.z||0),e<m)}o.end(g);break}case`C`:{let s=e,l=a,u=c,d=t.z1||0,f=t.z2||0,p=t.z||0,m=Math.hypot(s-2*t.x1+t.x2,l-2*t.y1+t.y2,n===3?u-2*d+f:0),h=Math.hypot(t.x1-2*t.x2+t.x,t.y1-2*t.y2+t.y,n===3?d-2*f+p:0),g=Math.max(1,Math.min(i,Math.ceil(Math.sqrt(.75*Math.max(m,h)/r)))),_=Zn(n,t.x1-s,t.y1-l,d-u)||Zn(n,t.x2-s,t.y2-l,f-u)||Zn(n,t.x-s,t.y-l,p-u),v=Zn(n,t.x-t.x2,t.y-t.y2,p-f)||Zn(n,t.x-t.x1,t.y-t.y1,p-d)||_;if(!_)break;o.joint(_);for(let e=1;e<=g;e++){let n=e/g,r=1-n,i=r*r*r,a=3*r*r*n,c=3*r*n*n,m=n*n*n;o.push(i*s+a*t.x1+c*t.x2+m*t.x,i*l+a*t.y1+c*t.y2+m*t.y,i*u+a*d+c*f+m*p,e<g)}o.end(v);break}case`A`:{let n=$n(e,a,t.rx,t.ry,t.rot,t.large,t.sweep,t.x,t.y);if(!n){let n=Zn(2,t.x-e,t.y-a,0);if(!n)break;o.joint(n),o.push(t.x,t.y,0,!1),o.end(n);break}let s=Math.max(n.rx,n.ry),c=r>=s?Math.PI/2:2*Math.acos(1-r/s),l=Math.max(1,Math.min(i,Math.ceil(Math.abs(n.dtheta)/c)));o.joint(n.tangentAt(n.theta1));for(let e=1;e<=l;e++){let r=n.theta1+n.dtheta*e/l;if(e===l)o.push(t.x,t.y,0,!1);else{let e=n.pointAt(r);o.push(e[0],e[1],0,!0)}}o.end(n.tangentAt(n.theta1+n.dtheta));break}case`Z`:o.closed=!0,s()}}return s(),a}function $n(e,t,n,r,i,a,o,s,c){if(e===s&&t===c||(n=Math.abs(n),r=Math.abs(r),n<1e-12||r<1e-12))return null;let l=i*Math.PI/180,u=Math.cos(l),d=Math.sin(l),f=(e-s)/2,p=(t-c)/2,m=u*f+d*p,h=-d*f+u*p,g=m*m/(n*n)+h*h/(r*r);if(g>1){let e=Math.sqrt(g);n*=e,r*=e}let _=n*n,v=r*r,y=_*v-_*h*h-v*m*m,b=_*h*h+v*m*m,x=b>0?Math.sqrt(Math.max(0,y/b)):0;a===o&&(x=-x);let S=x*n*h/r,C=-x*r*m/n,w=u*S-d*C+(e+s)/2,T=d*S+u*C+(t+c)/2,E=(e,t,n,r)=>Math.atan2(e*r-t*n,e*n+t*r),D=(m-S)/n,O=(h-C)/r,k=(-m-S)/n,A=(-h-C)/r,j=Math.atan2(O,D),M=E(D,O,k,A);!o&&M>0?M-=2*Math.PI:o&&M<0&&(M+=2*Math.PI);let N=M>=0?1:-1;return{cx:w,cy:T,rx:n,ry:r,theta1:j,dtheta:M,pointAt(e){let t=Math.cos(e),i=Math.sin(e);return[w+n*u*t-r*d*i,T+n*d*t+r*u*i]},tangentAt(e){let t=Math.cos(e),i=Math.sin(e);return Jn(N*(-n*u*i-r*d*t),N*(-n*d*i+r*u*t))}}}function er(e,t){let n=new Float64Array(t*2);for(let r=0;r<t;r++){let i=r/t*Math.PI*2;n[r*2]=Math.cos(i)*e,n[r*2+1]=Math.sin(i)*e}return{points:n,smooth:new Uint8Array(t).fill(1),closed:!0}}function tr(e){let t=0,n=e.length/2;for(let r=0,i=n-1;r<n;i=r++)t+=(e[i*2]-e[r*2])*(e[i*2+1]+e[r*2+1]);return t/2}function nr(e,t=2){let n=e.points.length/t,r=new Float64Array(e.points.length),i=new Uint8Array(n);for(let a=0;a<n;a++){let o=n-1-a;for(let n=0;n<t;n++)r[a*t+n]=e.points[o*t+n];i[a]=e.smooth[o]}return{...e,points:r,smooth:i}}function rr(e,t=null){let n=Zt(e,t);if(n)return n;let r=t&&t.length,i=r?t[0]*2:e.length,a=ar(e,0,i,2,!0),o=[];if(!a||a.next===a.prev)return o;r&&(a=fr(e,t,a,2));let s=0,c=0,l=0;if(e.length>160){s=1/0,c=1/0;let t=-1/0,n=-1/0;for(let r=0;r<i;r+=2){let i=e[r],a=e[r+1];i<s&&(s=i),a<c&&(c=a),i>t&&(t=i),a>n&&(n=a)}l=Math.max(t-s,n-c),l=l===0?0:32767/l}return sr(a,o,2,s,c,l,0),o}var ir=class{constructor(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}};ir.shapeKeeper=new ir(0,.5,.5);function ar(e,t,n,r,i){let a=null;if(i===Pr(e,t,n,r)>0)for(let i=t;i<n;i+=r)a=Mr(i/r,e[i],e[i+1],a);else for(let i=n-r;i>=t;i-=r)a=Mr(i/r,e[i],e[i+1],a);return a&&wr(a,a.next)&&(Nr(a),a=a.next),a}function or(e,t){if(!e)return e;t||=e;let n=e,r;do if(r=!1,!n.steiner&&(wr(n,n.next)||J(n.prev,n,n.next)===0)){if(Nr(n),n=t=n.prev,n===n.next)break;r=!0}else n=n.next;while(r||n!==t);return t}function sr(e,t,n,r,i,a,o){if(!e)return;!o&&a&&_r(e,r,i,a);let s=e;for(;e.prev!==e.next;){let c=e.prev,l=e.next;if(a?lr(e,r,i,a):cr(e))t.push(c.i,e.i,l.i),Nr(e),e=l.next,s=l.next;else if(e=l,e===s){o?o===1?(e=ur(or(e),t),sr(e,t,n,r,i,a,2)):o===2&&dr(e,t,n,r,i,a):sr(or(e),t,n,r,i,a,1);break}}}function cr(e){let t=e.prev,n=e,r=e.next;if(J(t,n,r)>=0)return!1;let i=t.x,a=n.x,o=r.x,s=t.y,c=n.y,l=r.y,u=Math.min(i,a,o),d=Math.min(s,c,l),f=Math.max(i,a,o),p=Math.max(s,c,l),m=r.next;for(;m!==t;){if(m.x>=u&&m.x<=f&&m.y>=d&&m.y<=p&&Sr(i,s,a,c,o,l,m.x,m.y)&&J(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function lr(e,t,n,r){let i=e.prev,a=e,o=e.next;if(J(i,a,o)>=0)return!1;let s=i.x,c=a.x,l=o.x,u=i.y,d=a.y,f=o.y,p=Math.min(s,c,l),m=Math.min(u,d,f),h=Math.max(s,c,l),g=Math.max(u,d,f),_=yr(p,m,t,n,r),v=yr(h,g,t,n,r),y=e.prevZ,b=e.nextZ;for(;y&&y.z>=_&&b&&b.z<=v;){if(y.x>=p&&y.x<=h&&y.y>=m&&y.y<=g&&y!==i&&y!==o&&Sr(s,u,c,d,l,f,y.x,y.y)&&J(y.prev,y,y.next)>=0||(y=y.prevZ,b.x>=p&&b.x<=h&&b.y>=m&&b.y<=g&&b!==i&&b!==o&&Sr(s,u,c,d,l,f,b.x,b.y)&&J(b.prev,b,b.next)>=0))return!1;b=b.nextZ}for(;y&&y.z>=_;){if(y.x>=p&&y.x<=h&&y.y>=m&&y.y<=g&&y!==i&&y!==o&&Sr(s,u,c,d,l,f,y.x,y.y)&&J(y.prev,y,y.next)>=0)return!1;y=y.prevZ}for(;b&&b.z<=v;){if(b.x>=p&&b.x<=h&&b.y>=m&&b.y<=g&&b!==i&&b!==o&&Sr(s,u,c,d,l,f,b.x,b.y)&&J(b.prev,b,b.next)>=0)return!1;b=b.nextZ}return!0}function ur(e,t){let n=e;do{let r=n.prev,i=n.next.next;!wr(r,i)&&Tr(r,n,n.next,i)&&kr(r,i)&&kr(i,r)&&(t.push(r.i,n.i,i.i),Nr(n),Nr(n.next),n=e=i),n=n.next}while(n!==e);return or(n)}function dr(e,t,n,r,i,a){let o=e;do{let e=o.next.next;for(;e!==o.prev;){if(o.i!==e.i&&Cr(o,e)){let s=jr(o,e);o=or(o,o.next),s=or(s,s.next),sr(o,t,n,r,i,a,0),sr(s,t,n,r,i,a,0);return}e=e.next}o=o.next}while(o!==e)}function fr(e,t,n,r){let i=[];for(let n=0,a=t.length;n<a;n++){let o=ar(e,t[n]*r,n<a-1?t[n+1]*r:e.length,r,!1);o&&(o===o.next&&(o.steiner=!0),i.push(br(o)))}i.sort(pr);for(let e=0;e<i.length;e++)n=mr(i[e],n);return n}function pr(e,t){let n=e.x-t.x;return n===0&&(n=e.y-t.y,n===0&&(n=(e.next.y-e.y)/(e.next.x-e.x)-(t.next.y-t.y)/(t.next.x-t.x))),n}function mr(e,t){let n=hr(e,t);if(!n)return t;let r=jr(n,e);return or(r,r.next),or(n,n.next)}function hr(e,t){let n=t,r=e.x,i=e.y,a=-1/0,o=null;if(wr(e,n))return n;do{if(wr(e,n.next))return n.next;if(i<=n.y&&i>=n.next.y&&n.next.y!==n.y){let e=n.x+(i-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(e<=r&&e>a&&(a=e,o=n.x<n.next.x?n:n.next,e===r))return o}n=n.next}while(n!==t);if(!o)return null;let s=o,c=o.x,l=o.y,u=1/0;n=o;do{if(r>=n.x&&n.x>=c&&r!==n.x&&xr(i<l?r:a,i,c,l,i<l?a:r,i,n.x,n.y)){let t=Math.abs(i-n.y)/(r-n.x);kr(n,e)&&(t<u||t===u&&(n.x>o.x||n.x===o.x&&gr(o,n)))&&(o=n,u=t)}n=n.next}while(n!==s);return o}function gr(e,t){return J(e.prev,e,t.prev)<0&&J(t.next,e,e.next)<0}function _r(e,t,n,r){let i=e;do i.z===0&&(i.z=yr(i.x,i.y,t,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,vr(i)}function vr(e){let t,n=1;do{let r=e,i;e=null;let a=null;for(t=0;r;){t++;let o=r,s=0;for(let e=0;e<n&&(s++,o=o.nextZ,o);e++);let c=n;for(;s>0||c>0&&o;)s!==0&&(c===0||!o||r.z<=o.z)?(i=r,r=r.nextZ,s--):(i=o,o=o.nextZ,c--),a?a.nextZ=i:e=i,i.prevZ=a,a=i;r=o}a.nextZ=null,n*=2}while(t>1);return e}function yr(e,t,n,r,i){return e=(e-n)*i|0,t=(t-r)*i|0,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e|t<<1}function br(e){let t=e,n=e;do(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next;while(t!==e);return n}function xr(e,t,n,r,i,a,o,s){return(i-o)*(t-s)>=(e-o)*(a-s)&&(e-o)*(r-s)>=(n-o)*(t-s)&&(n-o)*(a-s)>=(i-o)*(r-s)}function Sr(e,t,n,r,i,a,o,s){return(e!==o||t!==s)&&xr(e,t,n,r,i,a,o,s)}function Cr(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!Or(e,t)&&(kr(e,t)&&kr(t,e)&&Ar(e,t)&&(J(e.prev,e,t.prev)||J(e,t.prev,t))||wr(e,t)&&J(e.prev,e,e.next)>0&&J(t.prev,t,t.next)>0)}function J(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function wr(e,t){return e.x===t.x&&e.y===t.y}function Tr(e,t,n,r){let i=Dr(J(e,t,n)),a=Dr(J(e,t,r)),o=Dr(J(n,r,e)),s=Dr(J(n,r,t));return!!(i!==a&&o!==s||i===0&&Er(e,n,t)||a===0&&Er(e,r,t)||o===0&&Er(n,e,r)||s===0&&Er(n,t,r))}function Er(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function Dr(e){return e>0?1:e<0?-1:0}function Or(e,t){let n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&Tr(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}function kr(e,t){return J(e.prev,e,e.next)<0?J(e,t,e.next)>=0&&J(e,e.prev,t)>=0:J(e,t,e.prev)<0||J(e,e.next,t)<0}function Ar(e,t){let n=e,r=!1,i=(e.x+t.x)/2,a=(e.y+t.y)/2;do n.y>a!=n.next.y>a&&n.next.y!==n.y&&i<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==e);return r}function jr(e,t){let n=new ir(e.i,e.x,e.y),r=new ir(t.i,t.x,t.y),i=e.next,a=t.prev;return e.next=t,t.prev=e,n.next=i,i.prev=n,r.next=n,n.prev=r,a.next=r,r.prev=a,r}function Mr(e,t,n,r){let i=new ir(e,t,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function Nr(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Pr(e,t,n,r){let i=0;for(let a=t,o=n-r;a<n;a+=r)i+=(e[o]-e[a])*(e[a+1]+e[o+1]),o=a;return i}function Fr(e,t,n){let r=(t,n)=>{let r=0;for(let i=t,a=n-2;i<n;i+=2)r+=(e[a]-e[i])*(e[i+1]+e[a+1]),a=i;return Math.abs(r/2)},i=r(0,t&&t.length?t[0]*2:e.length);if(t)for(let n=0;n<t.length;n++){let a=t[n]*2,o=n<t.length-1?t[n+1]*2:e.length;i-=r(a,o)}let a=0;for(let t=0;t<n.length;t+=3){let r=n[t]*2,i=n[t+1]*2,o=n[t+2]*2;a+=Math.abs((e[r]-e[o])*(e[i+1]-e[r+1])-(e[r]-e[i])*(e[o+1]-e[r+1]))/2}return i===0&&a===0?0:Math.abs(i-a)/Math.max(Math.abs(i),1e-12)}function Ir(e,t,n){let r=!1,i=e.length/2;for(let a=0,o=i-1;a<i;o=a++){let i=e[a*2],s=e[a*2+1],c=e[o*2],l=e[o*2+1];s>n!=l>n&&t<(c-i)*(n-s)/(l-s)+i&&(r=!r)}return r}function Lr(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a=0;a<e.length;a+=2){let o=e[a],s=e[a+1];o<t&&(t=o),s<n&&(n=s),o>r&&(r=o),s>i&&(i=s)}return{minX:t,minY:n,maxX:r,maxY:i}}function Rr(e){let t=e.length/2;for(let n=0;n<Math.min(t,8);n++){let r=(n-1+t)%t*2,i=n*2,a=(n+1)%t*2,o=(e[r]+e[i]+e[a])/3,s=(e[r+1]+e[i+1]+e[a+1])/3;if(Ir(e,o,s))return[o,s]}return[e[0],e[1]]}function zr(e,t=`nonzero`){let n=[];for(let t of e){if(t.points.length<6)continue;let e=tr(t.points);Math.abs(e)<1e-14||n.push({c:t,area:e,abs:Math.abs(e),box:Lr(t.points),parent:-1,depth:0,winding:0,children:[]})}n.sort((e,t)=>t.abs-e.abs);for(let e=0;e<n.length;e++){let r=n[e],[i,a]=Rr(r.c.points);for(let t=e-1;t>=0;t--){let e=n[t],o=e.box;if(!(i<o.minX||i>o.maxX||a<o.minY||a>o.maxY)&&Ir(e.c.points,i,a)){r.parent=t;break}}let o=r.area>0?1:-1;if(r.parent>=0){let t=n[r.parent];r.depth=t.depth+1,r.winding=t.winding+o,t.children.push(e)}else r.depth=0,r.winding=o;r.filled=t===`evenodd`?r.depth%2==0:r.winding!==0}for(let e of n)e.isWall=e.filled!==(e.parent>=0&&n[e.parent].filled);let r=(e,t)=>({...tr(e.c.points)>0===t?e.c:nr(e.c),isWall:e.isWall}),i=[],a=[];for(let e=0;e<n.length;e++){let t=n[e];t.filled&&i.push({outer:r(t,!0),holes:t.children.map(e=>r(n[e],!1))}),t.isWall&&a.push(r(t,t.filled))}return{regions:i,walls:a}}function Br(e){let t=e.outer.points.length;for(let n of e.holes)t+=n.points.length;let n=new Float64Array(t),r=new Uint8Array(t/2);n.set(e.outer.points,0),r.set(e.outer.smooth,0);let i=[],a=e.outer.points.length;for(let t of e.holes)i.push(a/2),n.set(t.points,a),r.set(t.smooth,a/2),a+=t.points.length;let o=rr(n,i.length?i:null);return{positions:n,smooth:r,indices:o,holeIndices:i,error:Fr(n,i.length?i:null,o)}}var Y=class e{constructor(e){this.positions=e.positions;let t=this.positions.length/3;this.normals=e.normals||new Float32Array(t*3),this.uvs=e.uvs||new Float32Array(t*2),this.indices=e.indices,this.kind=e.kind||`triangles`,this._bounds=null,this._edges=null,this._normalLines=null}get vertexCount(){return this.positions.length/3}get primitiveCount(){return this.kind===`lines`?this.indices.length/2:this.indices.length/3}get byteSize(){return this.positions.byteLength+this.normals.byteLength+this.uvs.byteLength+this.indices.byteLength}get bounds(){if(!this._bounds){let e=this.positions,t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let r=0;r<e.length;r+=3)for(let i=0;i<3;i++){let a=e[r+i];a<t[i]&&(t[i]=a),a>n[i]&&(n[i]=a)}e.length===0&&(t.fill(0),n.fill(0)),this._bounds={min:t,max:n}}return this._bounds}edges(){if(this._edges)return this._edges;if(this.kind===`lines`)return this._edges=this.indices;let e=Vr(this.positions),t=new Set,n=[],r=this.indices,i=this.vertexCount;for(let a=0;a<r.length;a+=3)for(let o=0;o<3;o++){let s=r[a+o],c=r[a+(o+1)%3],l=e[s],u=e[c];if(l===u)continue;let d=l<u?l*i+u:u*i+l;t.has(d)||(t.add(d),n.push(s,c))}return this._edges=Uint32Array.from(n),this._edges}normalLines(){if(this._normalLines)return this._normalLines;let t=this.vertexCount,n=new Float32Array(t*6),r=new Float32Array(t*6),i=new Float32Array(t*4),a=new Uint32Array(t*2);for(let e=0;e<t;e++){for(let t=0;t<3;t++)n[e*6+t]=this.positions[e*3+t],n[e*6+3+t]=this.positions[e*3+t],r[e*6+t]=this.normals[e*3+t],r[e*6+3+t]=this.normals[e*3+t];i[e*4+2]=1,a[e*2]=e*2,a[e*2+1]=e*2+1}return this._normalLines=new e({positions:n,normals:r,uvs:i,indices:a,kind:`lines`}),this._normalLines}};function Vr(e){let t=e.length/3,n=new Uint32Array(t),r=16;for(;r<t*2;)r*=2;let i=r-1,a=new Int32Array(r).fill(-1),o=new Float64Array(t*3);for(let n=0;n<t*3;n++)o[n]=Math.round(e[n]*1e6);for(let e=0;e<t;e++){let t=o[e*3],r=o[e*3+1],s=o[e*3+2],c=(Math.imul(t|0,73856093)^Math.imul(r|0,19349663)^Math.imul(s|0,83492791))&i;for(;;){let l=a[c];if(l<0){a[c]=e,n[e]=e;break}if(o[l*3]===t&&o[l*3+1]===r&&o[l*3+2]===s){n[e]=l;break}c=c+1&i}}return n}var X=class{constructor(e=`triangles`,t=256,n=768){this.kind=e,t=Math.max(1,t),n=Math.max(1,n),this.p=new Float32Array(t*3),this.n=new Float32Array(t*3),this.t=new Float32Array(t*2),this.i=new Uint32Array(n),this.vc=0,this.ic=0}growV(e){let t=this.vc+e;if(t*3<=this.p.length)return;let n=this.p.length/3;for(;n<t;)n*=2;let r=new Float32Array(n*3);r.set(this.p);let i=new Float32Array(n*3);i.set(this.n);let a=new Float32Array(n*2);a.set(this.t),this.p=r,this.n=i,this.t=a}growI(e){let t=this.ic+e;if(t<=this.i.length)return;let n=this.i.length;for(;n<t;)n*=2;let r=new Uint32Array(n);r.set(this.i),this.i=r}vertex(e,t,n,r=0,i=0,a=0,o=0,s=0){this.vc*3>=this.p.length&&this.growV(1);let c=this.vc;return this.p[c*3]=e,this.p[c*3+1]=t,this.p[c*3+2]=n,this.n[c*3]=r,this.n[c*3+1]=i,this.n[c*3+2]=a,this.t[c*2]=o,this.t[c*2+1]=s,this.vc++,c}tri(e,t,n){this.ic+3>this.i.length&&this.growI(3),this.i[this.ic++]=e,this.i[this.ic++]=t,this.i[this.ic++]=n}quad(e,t,n,r){this.tri(e,t,n),this.tri(e,n,r)}line(e,t){this.ic+2>this.i.length&&this.growI(2),this.i[this.ic++]=e,this.i[this.ic++]=t}get vertexCount(){return this.vc}build(){let e=(e,t)=>e.length===t?e:e.slice(0,t);return new Y({positions:e(this.p,this.vc*3),normals:e(this.n,this.vc*3),uvs:e(this.t,this.vc*2),indices:e(this.i,this.ic),kind:this.kind})}};X.shapeKeeper=new X(`triangles`,1,1);function Hr(e,t,n=30,r=null){let i=Math.min(Math.max(n,0),180),a=Math.cos(i*Math.PI/180);if(i===i){let n=Wt(e,t,i,a,r);if(n)return new Y({...n,kind:`triangles`})}let o=t.length/3,s=new Float64Array(o*3),c=new Float64Array(o*3);for(let n=0;n<o;n++){let r=t[n*3]*3,i=t[n*3+1]*3,a=t[n*3+2]*3,o=e[i]-e[r],l=e[i+1]-e[r+1],u=e[i+2]-e[r+2],d=e[a]-e[r],f=e[a+1]-e[r+1],p=e[a+2]-e[r+2],m=l*p-u*f,h=u*d-o*p,g=o*f-l*d;s[n*3]=m,s[n*3+1]=h,s[n*3+2]=g;let _=Math.sqrt(m*m+h*h+g*g)||1;c[n*3]=m/_,c[n*3+1]=h/_,c[n*3+2]=g/_}let l=Vr(e),u=e.length/3,d=null,f=null;if(i>0&&i<180){d=new Uint32Array(u+1);for(let e=0;e<t.length;e++)d[l[t[e]]+1]++;for(let e=0;e<u;e++)d[e+1]+=d[e];f=new Uint32Array(t.length);let e=d.slice(0,u);for(let n=0;n<t.length;n++)f[e[l[t[n]]]++]=n/3|0}let p=null;if(i>=180){p=new Float64Array(u*3);for(let e=0;e<t.length;e++){let n=l[t[e]]*3,r=(e/3|0)*3;p[n]+=s[r],p[n+1]+=s[r+1],p[n+2]+=s[r+2]}for(let e=0;e<u*3;e+=3){let t=p[e],n=p[e+1],r=p[e+2],i=Math.sqrt(t*t+n*n+r*r)||1;p[e]=t/i,p[e+1]=n/i,p[e+2]=r/i}}let m=Math.max(1,u),h=new Float32Array(m*3),g=new Float32Array(m*3),_=new Float32Array(m*2),v=new Uint32Array(t.length),y=0,b=p!==null;for(let e=0;b&&e<u*3;e++)p[e]!==p[e]&&(b=!1);if(b){let n=new Int32Array(u).fill(-1);for(let i=0;i<t.length;i++){let a=t[i],o=n[a];if(o<0){o=n[a]=y++;let t=l[a]*3;h[o*3]=e[a*3],h[o*3+1]=e[a*3+1],h[o*3+2]=e[a*3+2],g[o*3]=p[t],g[o*3+1]=p[t+1],g[o*3+2]=p[t+2],r&&(_[o*2]=r[a*2],_[o*2+1]=r[a*2+1])}v[i]=o}}else{let n=new Int32Array(u).fill(-1),o=new Int32Array(m),b=new Int32Array(m*3);for(let u=0;u<t.length;u++){let x=u/3|0,S=t[u],C=l[S],w=0,T=0,E=0;if(i<=0)w=c[x*3],T=c[x*3+1],E=c[x*3+2];else if(p)w=p[C*3],T=p[C*3+1],E=p[C*3+2];else{let e=c[x*3],t=c[x*3+1],n=c[x*3+2];for(let r=d[C];r<d[C+1];r++){let i=f[r];(i===x||c[i*3]*e+c[i*3+1]*t+c[i*3+2]*n>=a)&&(w+=s[i*3],T+=s[i*3+1],E+=s[i*3+2])}let r=Math.sqrt(w*w+T*T+E*E)||1;w/=r,T/=r,E/=r}let D=Math.round(w*1e4),O=Math.round(T*1e4),k=Math.round(E*1e4),A=n[S];for(;A>=0&&(b[A*3]!==D||b[A*3+1]!==O||b[A*3+2]!==k);)A=o[A];if(A<0){if(A=y++,A>=m){m*=2;let e=(e,t)=>{let n=new e.constructor(m*t);return n.set(e),n};h=e(h,3),g=e(g,3),_=e(_,2),o=e(o,1),b=e(b,3)}h[A*3]=e[S*3],h[A*3+1]=e[S*3+1],h[A*3+2]=e[S*3+2],g[A*3]=w,g[A*3+1]=T,g[A*3+2]=E,r&&(_[A*2]=r[S*2],_[A*2+1]=r[S*2+1]),o[A]=n[S],n[S]=A,b[A*3]=D,b[A*3+1]=O,b[A*3+2]=k}v[u]=A}}let x=(e,t)=>e.length===t?e:e.slice(0,t);return new Y({positions:x(h,y*3),normals:x(g,y*3),uvs:x(_,y*2),indices:v,kind:`triangles`})}var Ur=Math.PI*2;function Z(e,t,n=1,r=3){return Math.max(r,Math.round(e*n/(1<<t)))}function Wr(){let e=new X(`triangles`,24,36);for(let[t,n,r]of[[[1,0,0],[0,0,-1],[0,1,0]],[[-1,0,0],[0,0,1],[0,1,0]],[[0,1,0],[1,0,0],[0,0,-1]],[[0,-1,0],[1,0,0],[0,0,1]],[[0,0,1],[1,0,0],[0,1,0]],[[0,0,-1],[-1,0,0],[0,1,0]]]){let i=[];for(let[a,o,s,c]of[[-1,-1,0,0],[1,-1,1,0],[1,1,1,1],[-1,1,0,1]])i.push(e.vertex(t[0]*.5+n[0]*.5*a+r[0]*.5*o,t[1]*.5+n[1]*.5*a+r[1]*.5*o,t[2]*.5+n[2]*.5*a+r[2]*.5*o,t[0],t[1],t[2],s,c));e.quad(i[0],i[1],i[2],i[3])}return e.build()}function Gr(e,t,n,r,i){let a=nn.roundedBox(e,t,n,r,i);if(a)return new Y({...a,kind:`triangles`});let o=[e/2,t/2,n/2],s=2*i+2,c=new X(`triangles`,6*s*s,6*(s-1)*(s-1)*6),l=new Float64Array(3),u=e=>{let t=e-r,n=[];for(let e=i;e>=1;e--)n.push(-t-r*Math.tan(e/i*Math.PI/4));n.push(-t,t);for(let e=1;e<=i;e++)n.push(t+r*Math.tan(e/i*Math.PI/4));return n};for(let[e,t,n,i]of[[0,1,[0,0,-1],[0,1,0]],[0,-1,[0,0,1],[0,1,0]],[1,1,[1,0,0],[0,0,-1]],[1,-1,[1,0,0],[0,0,1]],[2,1,[1,0,0],[0,1,0]],[2,-1,[-1,0,0],[0,1,0]]]){let a=n.findIndex(e=>e!==0),s=i.findIndex(e=>e!==0),d=u(o[a]).map(e=>e*n[a]),f=u(o[s]).map(e=>e*i[s]),p=d.length,m=c.vertexCount;for(let u=0;u<p;u++)for(let m=0;m<p;m++){l[e]=t*o[e],l[a]=d[m],l[s]=f[u];let p=Math.max(-(o[0]-r),Math.min(o[0]-r,l[0])),h=Math.max(-(o[1]-r),Math.min(o[1]-r,l[1])),g=Math.max(-(o[2]-r),Math.min(o[2]-r,l[2])),_=l[0]-p,v=l[1]-h,y=l[2]-g,b=Math.hypot(_,v,y);b>1e-12?(_/=b,v/=b,y/=b):(_=e===0?t:0,v=e===1?t:0,y=e===2?t:0),c.vertex(p+_*r,h+v*r,g+y*r,_,v,y,(d[m]/o[a]/n[a]+1)/2,(f[u]/o[s]/i[s]+1)/2)}for(let e=0;e<p-1;e++)for(let t=0;t<p-1;t++){let n=m+e*p+t;c.quad(n,n+1,n+p+1,n+p)}}return c.build()}function Kr(e){let t=nn.sphere(e);if(t)return new Y({...t,kind:`triangles`});let n=Math.max(3,e),r=Math.max(2,Math.round(n/2)),i=new X(`triangles`,(n+1)*(r+1),n*(r-1)*6);for(let e=0;e<=r;e++){let t=e/r*Math.PI,a=Math.sin(t),o=Math.cos(t);for(let t=0;t<=n;t++){let s=t%n/n*Ur,c=a*Math.cos(s),l=o,u=-a*Math.sin(s);i.vertex(c,l,u,c,l,u,t/n,1-e/r)}}let a=n+1;for(let e=0;e<r;e++)for(let t=0;t<n;t++){let n=e*a+t,o=(e+1)*a+t,s=o+1,c=n+1;e!==r-1&&i.tri(n,o,s),e!==0&&i.tri(n,s,c)}return i.build()}function qr(e,t,n){let r=nn.cylinder(e,t,n);if(r)return new Y({...r,kind:`triangles`});let i=Math.max(3,t),a=new X(`triangles`,(i+1)*2+(n?i+2+(e>0?i+2:0):0),i*(e>0?6:3)+(n?i*3*(e>0?2:1):0)),o=1-e,s=[];for(let e=0;e<=i;e++){let t=e%i/i*Ur;s.push([Math.cos(t),-Math.sin(t)])}let c=(e,t)=>{let n=Math.hypot(e,o,t);return[e/n,o/n,t/n]},l=[],u=[];for(let t=0;t<=i;t++){let[n,r]=s[t],o=c(n,r);if(l.push(a.vertex(n,-.5,r,o[0],o[1],o[2],t/i,0)),e>0)u.push(a.vertex(n*e,.5,r*e,o[0],o[1],o[2],t/i,1));else{let e=(t+.5)/i*Ur,n=c(Math.cos(e),-Math.sin(e));u.push(a.vertex(0,.5,0,n[0],n[1],n[2],(t+.5)/i,1))}}for(let t=0;t<i;t++)e>0?a.quad(l[t],l[t+1],u[t+1],u[t]):a.tri(l[t],l[t+1],u[t]);if(n){let t=a.vertex(0,-.5,0,0,-1,0,.5,.5),n=[];for(let e=0;e<=i;e++)n.push(a.vertex(s[e][0],-.5,s[e][1],0,-1,0,s[e][0]*.5+.5,s[e][1]*.5+.5));for(let e=0;e<i;e++)a.tri(t,n[e+1],n[e]);if(e>0){let t=a.vertex(0,.5,0,0,1,0,.5,.5),n=[];for(let t=0;t<=i;t++)n.push(a.vertex(s[t][0]*e,.5,s[t][1]*e,0,1,0,s[t][0]*.5+.5,s[t][1]*.5+.5));for(let e=0;e<i;e++)a.tri(t,n[e],n[e+1])}}return a.build()}function Jr(e,t){let n=nn.capsule(e,t);if(n)return new Y({...n,kind:`triangles`});let r=Math.max(3,t),i=Math.max(1,Math.round(r/4)),a=[];for(let t=0;t<=i;t++)a.push([t/i*(Math.PI/2),e/2]);for(let t=0;t<=i;t++)a.push([Math.PI/2+t/i*(Math.PI/2),-e/2]);let o=e+2,s=a.length,c=new X(`triangles`,s*(r+1),r*3*(2*(s-1)-2));for(let e=0;e<a.length;e++){let[t,n]=a[e],i=Math.sin(t),s=Math.cos(t),l=s+n;for(let e=0;e<=r;e++){let t=e%r/r*Ur,n=i*Math.cos(t),a=-i*Math.sin(t);c.vertex(n,l,a,n,s,a,e/r,(l+o/2)/o)}}let l=r+1,u=a.length;for(let e=0;e<u-1;e++)for(let t=0;t<r;t++){let n=e*l+t,r=(e+1)*l+t,i=r+1,a=n+1;e!==u-2&&c.tri(n,r,i),e!==0&&c.tri(n,i,a)}return c.build()}function Yr(){let e=new X(`triangles`,4,6),t=e.vertex(-.5,0,.5,0,1,0,0,0),n=e.vertex(.5,0,.5,0,1,0,1,0),r=e.vertex(.5,0,-.5,0,1,0,1,1),i=e.vertex(-.5,0,-.5,0,1,0,0,1);return e.quad(t,n,r,i),e.build()}function Xr(e,t,n,r){let i=nn.torus(e,t,n,r);if(i)return new Y({...i,kind:`triangles`});let a=t>=360-1e-9,o=Math.min(t,360)*Math.PI/180,s=Math.max(3,Math.round(n*(a?1:t/360))||3),c=Math.max(3,r),l=new X(`triangles`,(s+1)*(c+1)+(a?0:2*(c+2)),s*c*6+(a?0:2*c*3));for(let t=0;t<=s;t++){let n=a?t%s/s*Ur:t/s*o,r=Math.cos(n),i=Math.sin(n);for(let n=0;n<=c;n++){let a=n%c/c*Ur,o=Math.cos(a),u=Math.sin(a),d=1+e*o;l.vertex(d*r,e*u,-d*i,o*r,u,-o*i,t/s,n/c)}}let u=c+1;for(let e=0;e<s;e++)for(let t=0;t<c;t++){let n=e*u+t;l.quad(n,n+u,n+u+1,n+1)}if(!a)for(let[t,n]of[[0,1],[o,-1]]){let r=Math.cos(t),i=Math.sin(t),a=-i,o=-r,s=-a*n,u=-o*n,d=l.vertex(r,0,-i,s,0,u,.5,.5),f=[];for(let t=0;t<=c;t++){let n=t%c/c*Ur,a=1+e*Math.cos(n);f.push(l.vertex(a*r,e*Math.sin(n),-a*i,s,0,u,.5+Math.cos(n)*.5,.5+Math.sin(n)*.5))}for(let e=0;e<c;e++)n>0?l.tri(d,f[e],f[e+1]):l.tri(d,f[e+1],f[e])}return l.build()}function Zr(e,t){let n=e.length/3,r=new X(`lines`,n,2*(n-1)+(t&&n>2?2:0));for(let t=0;t<n;t++)r.vertex(e[t*3],e[t*3+1],e[t*3+2],0,0,0,t/Math.max(1,n-1),0);for(let e=0;e<n-1;e++)r.line(e,e+1);return t&&n>2&&r.line(n-1,0),r.build()}function Qr(e){return 1-Math.cos(Math.PI/Math.max(3,e))}function $r(e,t,n,r,i,a,o,s,c){let l=r-e,u=i-t,d=a-n,f=o-e,p=s-t,m=c-n,h=u*m-d*p,g=d*f-l*m,_=l*p-u*f,v=Math.hypot(h,g,_);if(v<1e-14)return 1;h/=v,g/=v,_/=v;let y=e*h+t*g+n*_,b=y*h,x=y*g,S=y*_,C=f,w=p,T=m,E=l,D=u,O=d,k=b-e,A=x-t,j=S-n,M=C*C+w*w+T*T,N=C*E+w*D+T*O,P=E*E+D*D+O*O,F=C*k+w*A+T*j,ee=E*k+D*A+O*j,te=M*P-N*N;if(Math.abs(te)>1e-18){let e=1/te,t=(P*F-N*ee)*e,n=(M*ee-N*F)*e;if(t>=-1e-5&&n>=-1e-5&&t+n<=1+1e-5)return Math.abs(y)}return Math.min(ei(e,t,n,r,i,a),ei(r,i,a,o,s,c),ei(o,s,c,e,t,n))}function ei(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n,l=o*o+s*s+c*c,u=l>0?-(e*o+t*s+n*c)/l:0;return u<0?u=0:u>1&&(u=1),Math.hypot(e+o*u,t+s*u,n+c*u)}var ti=new Map;function ni(e){let t=Math.max(3,e|0),n=ti.get(t);return n===void 0&&(n=ri(t),ti.set(t,n)),n}function ri(e){let t=$t(e);if(t!==null)return t;let n=Math.max(2,Math.round(e/2)),r=Math.PI*2,i=new Float64Array(n+1),a=new Float64Array(n+1);for(let e=0;e<=n;e++){let t=e/n*Math.PI;i[e]=Math.sin(t),a[e]=Math.cos(t)}let o=new Float64Array(e+1),s=new Float64Array(e+1);for(let t=0;t<=e;t++){let n=t%e/e*r;o[t]=Math.cos(n),s[t]=Math.sin(n)}let c=0;for(let t=0;t<n;t++)for(let r=0;r<e;r++){let e=i[t]*o[r],l=a[t],u=-i[t]*s[r],d=i[t+1]*o[r],f=a[t+1],p=-i[t+1]*s[r],m=i[t+1]*o[r+1],h=a[t+1],g=-i[t+1]*s[r+1],_=i[t]*o[r+1],v=a[t],y=-i[t]*s[r+1];if(t!==n-1){let t=1-$r(e,l,u,d,f,p,m,h,g);t>c&&(c=t)}if(t!==0){let t=1-$r(e,l,u,m,h,g,_,v,y);t>c&&(c=t)}}return c}function ii(e,t){return Math.max(1,e,0)*Qr(t)}function ai(e){let t=Math.max(3,e|0),n=Math.max(1,Math.round(t/4));return Math.max(Qr(t),1-Math.cos(Math.PI/(2*n)))}function oi(e,t,n,r){let i=Math.max(3,Math.round(n*(t>=360-1e-9?1:t/360))||3);return e*Qr(Math.max(3,r))+(1+e)*Qr(i)}function si(e,t){return e*(1-Math.cos(Math.PI/(4*Math.max(1,t))))}function ci(e,t){return(e/2+1)*Qr(Math.max(3,t))}var li=[6e-4,.0025,.01,.035];function ui(e,t){return(e>0&&Number.isFinite(e)?e:1)*li[Math.min(li.length-1,Math.max(0,t))]}function di(e,t){return e>0?e*(1-Math.cos(Math.PI/(2*Math.max(1,t)))):0}var fi=4;function pi(e,t,n=!0){let r=e.length/2,i=n?r:r-1,a=new Float64Array(i*2);for(let t=0;t<i;t++){let n=(t+1)%r,i=e[n*2]-e[t*2],o=e[n*2+1]-e[t*2+1],s=Math.hypot(i,o)||1;a[t*2]=o/s,a[t*2+1]=-i/s}let o=new Float64Array(r*2),s=new Float64Array(r*2),c=new Uint8Array(r);for(let e=0;e<r;e++){let l=n||e>0,u=n||e<r-1,d=l?(e-1+i)%i:-1,f=u?e%i:-1,p,m,h,g;d>=0&&(p=a[d*2],m=a[d*2+1]),f>=0&&(h=a[f*2],g=a[f*2+1]),d<0&&(p=h,m=g),f<0&&(h=p,g=m);let _=p+h,v=m+g,y=Math.hypot(_,v);y<1e-9&&(_=p,v=m,y=1),_/=y,v/=y,o[e*2]=_,o[e*2+1]=v;let b=Math.max(_*p+v*m,1/fi);s[e*2]=_/b,s[e*2+1]=v/b,c[e]=t&&t[e]?0:1}let l=new Float64Array(r+1);for(let t=1;t<=r;t++){if(!n&&t===r){l[t]=l[t-1];break}let i=(t-1)%r,a=t%r;l[t]=l[t-1]+Math.hypot(e[a*2]-e[i*2],e[a*2+1]-e[i*2+1])}return{n:r,edges:i,edgeN:a,vertN:o,miter:s,corner:c,arc:l,length:l[n?r:r-1]}}function mi(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)for(let e=0;e<a.length;e+=2){let o=a[e],s=a[e+1];o<t&&(t=o),s<n&&(n=s),o>r&&(r=o),s>i&&(i=s)}return{minX:t,minY:n,maxX:r,maxY:i,size:Math.max(r-t,i-n)||1}}function hi(e){let t=[];for(let n of e){t.push(n.outer.points);for(let e of n.holes)t.push(e.points)}return mi(t)}function gi(e,t){e>.01&&t&&t(`warning`,`W_SELF_INTERSECTION`,`A filled contour appears to be self-intersecting; the triangulation covers ${(100*(1-e)).toFixed(1)}% of the expected area.`)}function _i(e,t){let n=[];for(let r of e){let e=Br(r);gi(e.error,t),n.push({region:r,...e})}return n}function vi(e,t){let n=_i(e,t),r=0,i=0;for(let e of n)r+=e.positions.length/2,i+=e.indices.length;let a=new X(`triangles`,r,i),o=hi(e);for(let e of n){let t=a.vertexCount,n=e.positions;for(let e=0;e<n.length;e+=2)a.vertex(n[e],n[e+1],0,0,0,1,(n[e]-o.minX)/o.size,(n[e+1]-o.minY)/o.size);let r=e.indices;for(let e=0;e<r.length;e+=3)a.tri(t+r[e],t+r[e+1],t+r[e+2])}return a.build()}function yi(e,t){let n=e.points;if(!t||e.isWall===!1)return n;let r=pi(n,e.smooth,!0),i=new Float64Array(n.length);for(let e=0;e<n.length;e+=2)i[e]=n[e]-r.miter[e]*t,i[e+1]=n[e+1]-r.miter[e+1]*t;return i}function bi(e,t,n){let r=[];if(!(t>0))return r.push({inset:0,z:0,nr:1,nz:0},{inset:0,z:e,nr:1,nz:0}),r;for(let e=0;e<=n;e++){let i=e/n*(Math.PI/2);r.push({inset:t*(1-Math.sin(i)),z:t*(1-Math.cos(i)),nr:Math.sin(i),nz:-Math.cos(i)})}for(let i=n;i>=0;i--){let a=i/n*(Math.PI/2),o={inset:t*(1-Math.sin(a)),z:e-t*(1-Math.cos(a)),nr:Math.sin(a),nz:Math.cos(a)};i===n&&Math.abs(o.z-r[r.length-1].z)<1e-12||r.push(o)}return r}function xi(e,t,n){let r=t.depth,i=Math.min(t.bevel||0,r/2),a=t.bevelSegments||3,o=t.center?-r/2:0,s=hi(e.regions),c=s.size,l=bi(r,i,a),u=Qt(e,i,l,o,o+r,s.minX,s.minY,c);if(u){for(let e of u.errors)gi(e,n);return new Y({positions:u.positions,normals:u.normals,uvs:u.uvs,indices:u.indices,kind:`triangles`})}let d=_i(e.regions.map(e=>({outer:{...e.outer,points:yi(e.outer,i)},holes:e.holes.map(e=>({...e,points:yi(e,i)}))})),n),f=e.walls.map(e=>({pts:e.points,f:pi(e.points,e.smooth,!0)})),p=0,m=0;for(let e of d)p+=e.positions.length,m+=2*e.indices.length;for(let{f:e}of f)p+=e.n*l.length*2,m+=e.n*(l.length-1)*6;let h=new X(`triangles`,p,m);for(let e of d){let t=e.positions,n=e.indices;for(let[e,i]of[[o+r,1],[o,-1]]){let r=h.vertexCount;for(let n=0;n<t.length;n+=2)h.vertex(t[n],t[n+1],e,0,0,i,(t[n]-s.minX)/c,(t[n+1]-s.minY)/c);for(let e=0;e<n.length;e+=3)i>0?h.tri(r+n[e],r+n[e+1],r+n[e+2]):h.tri(r+n[e],r+n[e+2],r+n[e+1])}}for(let{pts:e,f:t}of f){let n=t.n;for(let r=0;r<n;r++){let i=r,a=(r+1)%n,s=t.corner[i]?t.edgeN[r*2]:t.vertN[i*2],u=t.corner[i]?t.edgeN[r*2+1]:t.vertN[i*2+1],d=t.corner[a]?t.edgeN[r*2]:t.vertN[a*2],f=t.corner[a]?t.edgeN[r*2+1]:t.vertN[a*2+1],p=t.arc[r]/c,m=t.arc[r+1]/c,g=-1,_=-1;for(let n of l){let r=e[i*2]-t.miter[i*2]*n.inset,l=e[i*2+1]-t.miter[i*2+1]*n.inset,v=e[a*2]-t.miter[a*2]*n.inset,y=e[a*2+1]-t.miter[a*2+1]*n.inset,b=o+n.z,x=h.vertex(r,l,b,s*n.nr,u*n.nr,n.nz,p,n.z/c),S=h.vertex(v,y,b,d*n.nr,f*n.nr,n.nz,m,n.z/c);g>=0&&h.quad(g,_,S,x),g=x,_=S}}}return h.build()}function Si(e){let t=e.points,n=t.length/2,r=new Float64Array(t.length+4);return r.set(t),r[t.length]=0,r[t.length+1]=t[(n-1)*2+1],r[t.length+2]=0,r[t.length+3]=t[1],tr(r)>=0?e:nr(e)}function Ci(e,t,n){let r=t.angle>=360-1e-9,i=Math.min(t.angle,360)*Math.PI/180,a=Math.max(2,t.segments),o=!1,s=[];for(let t of e){let e=t.points;for(let t=0;t<e.length;t+=2)if(e[t]<-1e-9){n&&n(`error`,`E_REVOLVE_AXIS`,`The revolve profile crosses the axis: point (${e[t]}, ${e[t+1]}) has x < 0. Profiles must stay at x ≥ 0.`);break}let i=t.closed;i||(o=!0);let a=i?tr(t.points)>0?t:nr(t):Si(t),c=a.points,l=c.length/2;if(l<2)continue;let u=pi(c,a.smooth,i),d=u.length||1,f=[],p=new Int32Array(l).fill(-1),m=new Int32Array(l).fill(-1),h=(e,t,n,r,i)=>f.push(e,t,n,r,i)/5-1;for(let e=0;e<l;e++){let t=i?(e-1+l)%l:e-1,n=i||e<l-1?e:-1,r=Math.max(0,c[e*2]),a=c[e*2+1],o=u.arc[e]/d;if(t>=0&&n>=0&&u.corner[e])p[e]=h(r,a,u.edgeN[t*2],u.edgeN[t*2+1],o),m[e]=h(r,a,u.edgeN[n*2],u.edgeN[n*2+1],o);else{let i=n>=0?n:t,s=u.corner[e]?h(r,a,u.edgeN[i*2],u.edgeN[i*2+1],o):h(r,a,u.vertN[e*2],u.vertN[e*2+1],o);p[e]=s,m[e]=s}}let g=!r&&i?rr(c):null;s.push({closed:i,pts:c,n:l,entries:f,entryIn:p,entryOut:m,tri:g})}let c=0,l=0;for(let e of s)c+=e.entries.length/5*(a+1),l+=(e.closed?e.n:e.n-1)*a*6,e.tri&&(c+=2*e.n,l+=2*e.tri.length);let u=new X(`triangles`,c,l),d=new Float64Array(a+1),f=new Float64Array(a+1);for(let e=0;e<=a;e++){let t=i*e/a;d[e]=Math.cos(t),f[e]=Math.sin(t)}for(let{closed:e,pts:t,n,entries:r,entryIn:o,entryOut:c,tri:l}of s){let s=u.vertexCount,p=a+1;for(let e=0;e<r.length;e+=5){let t=r[e],n=r[e+1],i=r[e+2],o=r[e+3],s=r[e+4];for(let e=0;e<=a;e++){let r=d[e],c=f[e];u.vertex(t*r,n,-t*c,i*r,o,-i*c,e/a,s)}}let m=e?n:n-1;for(let e=0;e<m;e++){let t=c[e],r=o[(e+1)%n];for(let e=0;e<a;e++){let n=s+t*p+e,i=s+r*p+e;u.quad(n,n+1,i+1,i)}}if(l)for(let[e,r]of[[0,1],[i,-1]]){let i=Math.cos(e),a=Math.sin(e),o=u.vertexCount;for(let e=0;e<n;e++){let n=Math.max(0,t[e*2]),o=t[e*2+1];u.vertex(n*i,o,-n*a,r>0?0:-a,0,r>0?1:-i,n,o)}for(let e=0;e<l.length;e+=3)r>0?u.tri(o+l[e],o+l[e+1],o+l[e+2]):u.tri(o+l[e],o+l[e+2],o+l[e+1])}}return{mesh:u.build(),doubleSided:o}}var wi=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]];function Ti(e){let t=Math.hypot(e[0],e[1],e[2]);return t>1e-20?[e[0]/t,e[1]/t,e[2]/t]:[0,0,0]}function Ei(e){let t=Math.abs(e[0]),n=Math.abs(e[1]),r=Math.abs(e[2]);return Ti(wi(e,t<=n&&t<=r?[1,0,0]:n<=r?[0,1,0]:[0,0,1]))}var Di=Math.PI*2;function Oi(e,t,n,r){let i=Math.max(2,Math.ceil(n*r)),a=new Float64Array((i+1)*3),o=n*Di;for(let n=0;n<=i;n++){let r=n/i*o;a[n*3]=e*Math.cos(r),a[n*3+1]=t*r/Di,a[n*3+2]=-e*Math.sin(r)}return a}function ki(e,t,n){let r=e.length/3;if(r<2)return Float64Array.from(e);let i=rn(e,t,n);if(i)return i;let a=n=>{if(t){let t=(n%r+r)%r;return[e[t*3],e[t*3+1],e[t*3+2]]}if(n<0){let e=a(0),t=a(1);return[2*e[0]-t[0],2*e[1]-t[1],2*e[2]-t[2]]}if(n>r-1){let e=a(r-1),t=a(r-2);return[2*e[0]-t[0],2*e[1]-t[1],2*e[2]-t[2]]}return[e[n*3],e[n*3+1],e[n*3+2]]},o=[],s=t?r:r-1,c=(e,t)=>Math.max(Math.sqrt(Math.hypot(t[0]-e[0],t[1]-e[1],t[2]-e[2])),1e-6);for(let e=0;e<s;e++){let t=a(e-1),r=a(e),i=a(e+1),s=a(e+2),l=0+c(t,r),u=l+c(r,i),d=u+c(i,s);for(let e=0;e<n;e++){let a=l+(u-l)*e/n,c=(e,t,n,r)=>{let i=(a-n)/(r-n);return[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i,e[2]+(t[2]-e[2])*i]},f=c(t,r,0,l),p=c(r,i,l,u),m=c(i,s,u,d),h=c(c(f,p,0,u),c(p,m,l,d),l,u);o.push(h[0],h[1],h[2])}}if(!t){let e=a(r-1);o.push(e[0],e[1],e[2])}return Float64Array.from(o)}function Ai(e,{tolerance:t,segmentsPerTurn:n,smooth:r,subdivisions:i}){if(e.kind===`helix`)return[{points:Oi(e.radius,e.pitch,e.turns,e.segmentsPerTurn||n),closed:!1}];if(e.kind===`path`)return Qn(e.segments,{dim:3,tolerance:t}).map(e=>({points:e.points,closed:e.closed}));let a=e.points,o=a.length/3,s=!1;return o>2&&Math.hypot(a[0]-a[(o-1)*3],a[1]-a[(o-1)*3+1],a[2]-a[(o-1)*3+2])<1e-12&&(s=!0,a=a.slice(0,(o-1)*3)),r&&(a=ki(a,s,i)),[{points:a,closed:s}]}function ji(e,t){let n=[],r=e.length/3;for(let t=0;t<r;t++){let r=e[t*3],i=e[t*3+1],a=e[t*3+2],o=n.length;o&&Math.hypot(n[o-3]-r,n[o-2]-i,n[o-1]-a)<1e-9||n.push(r,i,a)}if(t&&n.length>6){let e=n.length;Math.hypot(n[0]-n[e-3],n[1]-n[e-2],n[2]-n[e-1])<1e-9&&(n.length-=3)}return n}function Mi(e,t){let n=ji(e,t),r=n.length/3;if(r<2)return null;let i=t?r+1:r,a=new Float64Array(i*3);for(let e=0;e<i;e++){let t=e%r*3;a[e*3]=n[t],a[e*3+1]=n[t+1],a[e*3+2]=n[t+2]}let o=i-1,s=new Float64Array(o*3);for(let e=0;e<o;e++)Ni(s,e*3,a[e*3+3]-a[e*3],a[e*3+4]-a[e*3+1],a[e*3+5]-a[e*3+2]);let c=new Float64Array(i*3),l=new Float64Array(i*3),u=new Float64Array(i);for(let e=0;e<i;e++){let n=3*(t?(e-1+o)%o:Math.max(0,e-1)),r=3*(t?e%o:Math.min(o-1,e)),i=e*3;Ni(c,i,s[n]+s[r],s[n+1]+s[r+1],s[n+2]+s[r+2]),c[i]===0&&c[i+1]===0&&c[i+2]===0&&(c[i]=s[r],c[i+1]=s[r+1],c[i+2]=s[r+2]);let a=Math.max(c[i]*s[r]+c[i+1]*s[r+1]+c[i+2]*s[r+2],.25);Ni(l,i,s[r]-s[n],s[r+1]-s[n+1],s[r+2]-s[n+2]),u[e]=1/a}let d=new Float64Array(i*3),f=c[0],p=c[1],m=c[2],h=Math.abs(p)<.99?0:1,g=+(Math.abs(p)<.99),_=p*0-m*g,v=m*h-f*0,y=f*g-p*h;Ni(d,0,v*m-y*p,y*f-_*m,_*p-v*f),d[0]===0&&d[1]===0&&d[2]===0&&d.set(Ei([f,p,m]));for(let e=0;e<i-1;e++){let t=e*3,n=a[t+3]-a[t],r=a[t+4]-a[t+1],i=a[t+5]-a[t+2],o=n*n+r*r+i*i,s=d[t],l=d[t+1],u=d[t+2],f=c[t],p=c[t+1],m=c[t+2];if(o>0){let e=2/o*(n*s+r*l+i*u);s-=n*e,l-=r*e,u-=i*e;let t=2/o*(n*f+r*p+i*m);f-=n*t,p-=r*t,m-=i*t}let h=c[t+3]-f,g=c[t+4]-p,_=c[t+5]-m,v=h*h+g*g+_*_;if(v>1e-20){let e=2/v*(h*s+g*l+_*u);s-=h*e,l-=g*e,u-=_*e}Ni(d,t+3,s,l,u)}if(t){let e=(i-1)*3,t=d[e+1]*d[2]-d[e+2]*d[1],n=d[e+2]*d[0]-d[e]*d[2],r=d[e]*d[1]-d[e+1]*d[0],a=Math.atan2(t*c[0]+n*c[1]+r*c[2],d[e]*d[0]+d[e+1]*d[1]+d[e+2]*d[2]);for(let e=0;e<i;e++){let t=a*e/(i-1),n=Math.cos(t),r=Math.sin(t),o=e*3,s=d[o],l=d[o+1],u=d[o+2],f=c[o],p=c[o+1],m=c[o+2],h=p*u-m*l,g=m*s-f*u,_=f*l-p*s,v=(f*s+p*l+m*u)*(1-n);d[o]=s*n+h*r+f*v,d[o+1]=l*n+g*r+p*v,d[o+2]=u*n+_*r+m*v}d[e]=d[0],d[e+1]=d[1],d[e+2]=d[2]}let b=new Float64Array(i*3);for(let e=0;e<i*3;e+=3)b[e]=c[e+1]*d[e+2]-c[e+2]*d[e+1],b[e+1]=c[e+2]*d[e]-c[e]*d[e+2],b[e+2]=c[e]*d[e+1]-c[e+1]*d[e];let x=new Float64Array(i);for(let e=1;e<i;e++)x[e]=x[e-1]+Math.hypot(a[e*3]-a[e*3-3],a[e*3+1]-a[e*3-2],a[e*3+2]-a[e*3-1]);return{count:i,pos:a,T:c,N:d,B:b,K:l,stretch:u,arc:x,length:x[i-1],closed:t}}function Ni(e,t,n,r,i){let a=Math.hypot(n,r,i);a>1e-20?(e[t]=n/a,e[t+1]=r/a,e[t+2]=i/a):e[t]=e[t+1]=e[t+2]=0}function Pi(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=a[n],m=o[n],h=s[n],g=(r*m-i*h)*p,_=(r*h+i*m)*p,v=n*3,y=c[v]*g+l[v]*_,b=c[v+1]*g+l[v+1]*_,x=c[v+2]*g+l[v+2]*_,S=f[n];if(S>1.0001){let e=(y*d[v]+b*d[v+1]+x*d[v+2])*(S-1);y+=d[v]*e,b+=d[v+1]*e,x+=d[v+2]*e}e[t]=u[v]+y,e[t+1]=u[v+1]+b,e[t+2]=u[v+2]+x}function Fi(e,t,n,r,i,a,o,s,c,l,u,d){let f=o[t],p=s[t],m=i*f-a*p,h=i*p+a*f,g=t*3,_=c[g]*m+l[g]*h,v=c[g+1]*m+l[g+1]*h,y=c[g+2]*m+l[g+2]*h;if(d!==0){let e=d*(n*i+r*a),t=_-u[g]*e,o=v-u[g+1]*e,s=y-u[g+2]*e,c=Math.hypot(t,o,s);c>1e-20?(_=t/c,v=o/c,y=s/c):_=v=y=0}e[0]=_,e[1]=v,e[2]=y}function Ii(e,t,n,r,i,a,o,s,c,l,u,d){for(let f=0;f<r;f++)for(let r=0;r<n;r++)Pi(e,(f*n+r)*3,f,t[r*2],t[r*2+1],i,a,o,s,c,l,u,d)}function Li(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=n.n,m=n.length||1;for(let h=0;h<p;h++){let g=h,_=(h+1)%p,v=n.corner[g],y=n.corner[_],b=v?n.edgeN[h*2]:n.vertN[g*2],x=v?n.edgeN[h*2+1]:n.vertN[g*2+1],S=y?n.edgeN[h*2]:n.vertN[_*2],C=y?n.edgeN[h*2+1]:n.vertN[_*2+1],w=n.arc[h]/m,T=n.arc[h+1]/m,E=r[g*2],D=r[g*2+1],O=r[_*2],k=r[_*2+1],A=-1,j=-1;for(let n=0;n<i;n++){let r=a[n]/m;Fi(f,n,E,D,b,x,o,s,c,l,u,d);let i=(n*p+g)*3,h=e.vertex(t[i],t[i+1],t[i+2],f[0],f[1],f[2],w,r);Fi(f,n,O,k,S,C,o,s,c,l,u,d),i=(n*p+_)*3;let v=e.vertex(t[i],t[i+1],t[i+2],f[0],f[1],f[2],T,r);A>=0&&e.quad(A,j,v,h),A=h,j=v}}}function Ri(e,t,n,r){let i=(n.twist||0)*Math.PI/180,a=n.taper===void 0?1:n.taper,o=n.caps!==!1,s=!1,c,l=null;if(e.kind===`circle`){let t=Math.max(3,e.segments),n=new Float64Array(t*2);for(let r=0;r<t;r++){let i=r/t*Di;n[r*2]=Math.cos(i)*e.radius,n[r*2+1]=Math.sin(i)*e.radius}c=[{points:n,smooth:new Uint8Array(t).fill(1),closed:!0}],l={circle:!0,pts:n}}else c=e.walls;let u=t.every(e=>e.points.length%3==0)?Xt(t,c,l&&l.pts,e.regions,i,a,o):null;if(u){for(let e of u.errors)gi(e,r);for(let e of u.degenerate)e&&r&&r(`error`,`E_DEGENERATE_SPINE`,`The sweep spine needs at least two distinct points.`);return{mesh:new Y({positions:u.positions,normals:u.normals,uvs:u.uvs,indices:u.indices,kind:`triangles`}),doubleSided:u.open}}l||=_i(e.regions,r);let d=c.map(e=>({pts:e.points,f:pi(e.points,e.smooth,!0)})),f=[],p=0,m=0;for(let e of t){let t=Mi(e.points,e.closed);if(!t)r&&r(`error`,`E_DEGENERATE_SPINE`,`The sweep spine needs at least two distinct points.`);else{f.push(t);for(let{f:e}of d)p+=e.n*t.count*2,m+=e.n*(t.count-1)*6;if(!t.closed&&o){if(l.circle){let e=l.pts.length/2;p+=2*(e+1),m+=2*e*3}else for(let e of l)p+=e.positions.length,m+=2*e.indices.length}}}let h=new X(`triangles`,p,m),g=new Float64Array(3);for(let e of f){let t=e.count,n=e.length||1,r=(a-1)/n,c=e.N,u=e.B,f=e.T,p=e.pos,m=e.K,_=e.stretch,v=e.arc,y=new Float64Array(t),b=new Float64Array(t),x=new Float64Array(t);for(let e=0;e<t;e++){let t=v[e]/n;y[e]=1+(a-1)*t;let r=i*t;b[e]=Math.cos(r),x[e]=Math.sin(r)}for(let{pts:e,f:n}of d){let i=new Float64Array(t*n.n*3);Ii(i,e,n.n,t,y,b,x,c,u,p,m,_),Li(h,i,n,e,t,v,b,x,c,u,f,r,g)}if(!e.closed){if(!o)s=!0;else for(let[e,n]of[[0,-1],[t-1,1]]){let t=f[e*3]*n,r=f[e*3+1]*n,i=f[e*3+2]*n;if(l.circle){Pi(g,0,e,0,0,y,b,x,c,u,p,m,_);let a=h.vertex(g[0],g[1],g[2],t,r,i,.5,.5),o=l.pts.length/2,s=h.vertexCount;for(let n=0;n<o;n++)Pi(g,0,e,l.pts[n*2],l.pts[n*2+1],y,b,x,c,u,p,m,_),h.vertex(g[0],g[1],g[2],t,r,i,.5+Math.cos(n/o*Di)/2,.5+Math.sin(n/o*Di)/2);for(let e=0;e<o;e++){let t=s+e,r=s+(e+1)%o;n>0?h.tri(a,t,r):h.tri(a,r,t)}}else for(let a of l){let o=h.vertexCount,s=a.positions;for(let n=0;n<s.length;n+=2)Pi(g,0,e,s[n],s[n+1],y,b,x,c,u,p,m,_),h.vertex(g[0],g[1],g[2],t,r,i,s[n],s[n+1]);let l=a.indices;for(let e=0;e<l.length;e+=3)n>0?h.tri(o+l[e],o+l[e+1],o+l[e+2]):h.tri(o+l[e],o+l[e+2],o+l[e+1])}}}}return{mesh:h.build(),doubleSided:s}}var zi=Math.PI*2;function Bi(e){return Math.tan(e)-e}function Vi(e,t,n=6,r=3){let i=an(e,t,n,r);if(i)return i;let a=e,o=t*Math.PI/180,s=a/2,c=s*Math.cos(o),l=s+1,u=s-1.25,d=Math.PI/(2*a),f=Bi(o),p=e=>{let t=Math.acos(Math.min(1,c/e));return d+f-Bi(t)};if(p(l)<d*.15){let e=Math.max(c,u),t=l;for(let n=0;n<40;n++){let n=(e+t)/2;p(n)>d*.15?e=n:t=n}l=e}let m=Math.max(c,u),h=[],g=[],_=(e,t,n)=>{h.push(e*Math.cos(t),e*Math.sin(t)),g.push(+!!n)},v=zi/a;for(let e=0;e<a;e++){let t=e*v,i=t-p(m),a=t+p(m),o=t-v+p(m);for(let e=1;e<r;e++)_(u,o+(i-o)*e/r,!0);_(u,i,!1),u<m-1e-9&&_(m,i,!1);for(let e=1;e<=n;e++){let r=m+(l-m)*e/n;_(r,t-p(r),e<n)}let s=t-p(l),c=t+p(l);for(let e=1;e<r;e++)_(l,s+(c-s)*e/r,!0);for(let e=n;e>=1;e--){let r=m+(l-m)*e/n;_(r,t+p(r),e<n)}u<m-1e-9&&_(m,a,!1),_(u,a,!1)}return{outline:{points:Float64Array.from(h),smooth:Uint8Array.from(g),closed:!0},outerRadius:l,rootRadius:u}}function Hi(e){let t=[,,,,];for(let n=0;n<4;n++)t[n]=e(n);return t}function Ui(e,t,n){return n?[n]:Hi(n=>Z(e,n,1,t))}var Wi=new Map,Gi=null;function Q(e,t){Wi.set(e,t),Gi&&Gi.delete(e)}function Ki(e){return Wi.has(e)}var qi=null;function Ji(e,t){let n=Wi.get(e.name);if(!n)return null;qi=Gi&&Gi.has(e.name)?[]:null;try{let r=n(e,t);return r&&qi&&(r.identity=[r.key,...qi].map(e=>`${e.length}:${e}`).join(``)),r}finally{qi=null}}var $=(e,t,n,r,i,a)=>({min:[e,t,n],max:[r,i,a]}),Yi=(e,t,n)=>st(V(),e,t,n);function Xi(e){qi&&qi.push(e);let t=2166136261,n=16777619;for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);t=Math.imul(t^i,16777619),n=Math.imul(n^i,1540483477)}return(t>>>0).toString(36)+(n>>>0).toString(36)+`:`+e.length}function Zi(e){if(qi=null,!e)return``;let t=new Uint32Array(e.buffer,e.byteOffset,e.byteLength>>2),n=2538058380,r=16777619;for(let e=0;e<t.length;e++){let i=Math.imul(t[e],3432918353);i=Math.imul(i<<15|i>>>17,461845907),n^=i,n=Math.imul(n<<13|n>>>19,5)+3864292196|0,r=Math.imul(r^t[e],2246822507),r^=r>>>13}return(n>>>0).toString(36)+(r>>>0).toString(36)+`:`+e.length}function Qi(e,t){let n=e.attrIndex&&e.attrIndex[t];return n?n.value.trim():``}function $i(e){if(e.values.d)return{path:e.values.d,raw:Qi(e,`d`),fillRule:R(e,`fillRule`)};let t=e.pathTarget;if(t&&t.values&&t.values.d){let n=e.values.fillRule===void 0?R(t,`fillRule`):e.values.fillRule;return{path:t.values.d,raw:Qi(t,`d`),fillRule:n}}return null}function ea(e){let t=Pe(e);return Math.hypot(t.maxX-t.minX,t.maxY-t.minY)||1}function ta(e,t,n){return ui(ea(e),t)/n}function na(e){let t=!1,n=!1,r=!1;for(let i of e)i.c===`M`?(n&&!r&&(t=!0),n=!0,r=!1):i.c===`Z`&&(r=!0);return n&&!r&&(t=!0),t}function ra(e,t,n,r){let i=Qn(e.path.segments,{tolerance:ta(e.path.segments,t,n)});for(let e of i)e.degenerate&&r&&r(`warning`,`W_DEGENERATE_CONTOUR`,`A subpath has fewer than three distinct points and encloses no area.`);let a=zr(i,e.fillRule);return!a.regions.length&&r&&r(`warning`,`W_EMPTY_FILL`,`The path encloses no area; nothing is filled.`),a}Q(`box`,e=>{let t=R(e,`size`),n=R(e,`radius`);if(n>0){let r=e.values.segments;return{key:`rbox:${t.join(`,`)}:${n}:${r||``}`,unit:null,lods:r?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-t[0]/2,-t[1]/2,-t[2]/2,t[0]/2,t[1]/2,t[2]/2),lodDeviation:Ui(4,1,r).map(e=>si(n,e)),generate:(e,i)=>Gr(t[0],t[1],t[2],n,r||Z(4,e,i,1))}}return{key:`box`,unit:Yi(t[0],t[1],t[2]),lods:1,kind:`triangles`,doubleSided:!1,bounds:$(-.5,-.5,-.5,.5,.5,.5),lodDeviation:[0],generate:()=>Wr()}}),Q(`sphere`,e=>{let t=R(e,`radius`),n=e.values.segments;return{key:`sphere:${n||``}`,unit:Yi(t,t,t),lods:n?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-1,-1,-1,1,1,1),lodDeviation:Ui(48,8,n).map(ni),generate:(e,t)=>Kr(n||Z(48,e,t,8))}});function ia(e,t){let n=R(e,`radius`),r=R(e,`height`),i=R(e,`caps`),a=e.values.segments,o=t/n,s=Math.max(1,o);return{key:`cyl:${o}:${i}:${a||``}`,unit:Yi(n,r,n),lods:a?1:4,kind:`triangles`,doubleSided:!i,bounds:$(-s,-.5,-s,s,.5,s),lodDeviation:Ui(48,8,a).map(e=>ii(o,e)),generate:(e,t)=>qr(o,a||Z(48,e,t,8),i)}}Q(`cylinder`,e=>{let t=R(e,`radius`);return ia(e,e.values.radiusTop===void 0?t:e.values.radiusTop)}),Q(`cone`,e=>ia(e,0)),Q(`capsule`,e=>{let t=R(e,`radius`),n=R(e,`height`),r=Math.max(0,n/t-2),i=e.values.segments;return{key:`capsule:${r}:${i||``}`,unit:Yi(t,t,t),lods:i?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-1,-(r/2+1),-1,1,r/2+1,1),lodDeviation:Ui(32,8,i).map(ai),generate:(e,t)=>Jr(r,i||Z(32,e,t,8))}}),Q(`plane`,e=>{let t=R(e,`size`);return{key:`plane`,unit:Yi(t[0],1,t[1]),lods:1,kind:`triangles`,doubleSided:!0,bounds:$(-.5,0,-.5,.5,0,.5),lodDeviation:[0],generate:()=>Yr()}}),Q(`torus`,e=>{let t=R(e,`radius`),n=R(e,`tube`),r=R(e,`arc`),i=n/t,a=e.values.segments,o=e.values.tubeSegments;return{key:`torus:${i}:${r}:${a||``}:${o||``}`,unit:Yi(t,t,t),lods:a&&o?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-(1+i),-i,-(1+i),1+i,i,1+i),lodDeviation:(a&&o?[0]:Hi(e=>0)).map((e,t)=>oi(i,r,a||Z(64,t,1,8),o||Z(24,t,1,6))),generate:(e,t)=>Xr(i,r,a||Z(64,e,t,8),o||Z(24,e,t,6))}});function aa(e,t,n=0){let r=$(1/0,1/0,1/0,-1/0,-1/0,-1/0);for(let n=0;n<e.length;n+=t)for(let i=0;i<3;i++){let a=i<t?e[n+i]:0;a<r.min[i]&&(r.min[i]=a),a>r.max[i]&&(r.max[i]=a)}for(let e=0;e<3;e++)r.min[e]-=n,r.max[e]+=n;return r}Q(`line`,e=>{let t=e.values.from,n=e.values.to,r=R(e,`radius`);if(r>0){let i=[n[0]-t[0],n[1]-t[1],n[2]-t[2]],a=Math.hypot(i[0],i[1],i[2]),o=[i[0]/a,i[1]/a,i[2]/a],s=Math.abs(o[1])<.99?[0,1,0]:[1,0,0],c=[s[1]*o[2]-s[2]*o[1],s[2]*o[0]-s[0]*o[2],s[0]*o[1]-s[1]*o[0]],l=Math.hypot(...c);c=c.map(e=>e/l);let u=[c[1]*o[2]-c[2]*o[1],c[2]*o[0]-c[0]*o[2],c[0]*o[1]-c[1]*o[0]],d=V();d.set([c[0]*r,c[1]*r,c[2]*r,0,o[0]*a,o[1]*a,o[2]*a,0,u[0]*r,u[1]*r,u[2]*r,0,(t[0]+n[0])/2,(t[1]+n[1])/2,(t[2]+n[2])/2,1]);let f=e.values.segments;return{key:`cyl:1:true:${f||``}`,unit:d,lods:f?1:4,kind:`triangles`,doubleSided:!1,bounds:$(-1,-.5,-1,1,.5,1),lodDeviation:Ui(48,8,f).map(e=>ii(1,e)),generate:(e,t)=>qr(1,f||Z(48,e,t,8),!0)}}return{key:`line:${t.join(`,`)}:${n.join(`,`)}`,unit:null,lods:1,kind:`lines`,doubleSided:!1,bounds:aa([...t,...n],3),lodDeviation:[0],generate:()=>Zr([...t,...n],!1)}}),Q(`polyline`,e=>{let t=R(e,`radius`),n=R(e,`closed`),r=R(e,`smooth`),i=e.values.segments,a=e.values.points,o=e.values.d,s=a?`pts:${Xi(Qi(e,`points`))}`:`d:${Xi(Qi(e,`d`))}`,c=(e,t)=>{if(a){let i=a;return r&&(i=ki(a,n,Z(12,e,t,2))),[{points:i,closed:n}]}let i=ta(o.segments,e,t);return Qn(o.segments,{tolerance:i}).map(e=>{let t=e.points.length/2,r=new Float64Array(t*3);for(let n=0;n<t;n++)r[n*3]=e.points[n*2],r[n*3+1]=e.points[n*2+1];return{points:r,closed:e.closed||n}})},l;if(a){let e=aa(a,3),n=Math.hypot(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2]);l=aa(a,3,t+(r?.1*n:0))}else{let e=Pe(o.segments);l=$(e.minX-t,e.minY-t,-t,e.maxX+t,e.maxY+t,t)}return t>0?{key:`tube:${s}:${t}:${n}:${r}:${i||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:!1,bounds:l,lodDeviation:Hi(e=>(a?Math.hypot(l.max[0]-l.min[0],l.max[1]-l.min[1],l.max[2]-l.min[2])*(r?.05/Z(12,e,1,2):0):ui(ea(o.segments),e))+t*Qr(i||Z(24,e,1,6))),generate:(e,n,r)=>Ri({kind:`circle`,radius:t,segments:i||Z(24,e,n,6)},c(e,n),{caps:!0},r).mesh}:{key:`polyline:${s}:${n}:${r}`,unit:null,lods:r||o?4:1,kind:`lines`,doubleSided:!1,bounds:l,lodDeviation:r||o?Hi(e=>a?Math.hypot(l.max[0]-l.min[0],l.max[1]-l.min[1],l.max[2]-l.min[2])*(r?.05/Z(12,e,1,2):0):ui(ea(o.segments),e)):[0],generate:(e,t)=>{let n=c(e,t);if(n.length===1)return Zr(n[0].points,n[0].closed);let r=n.map(e=>Zr(e.points,e.closed)),i=0,a=0;for(let e of r)i+=e.vertexCount,a+=e.indices.length;let o=new Float32Array(i*3),s=new Uint32Array(a),l=0,u=0;for(let e of r){o.set(e.positions,l*3);for(let t=0;t<e.indices.length;t++)s[u+t]=e.indices[t]+l;l+=e.vertexCount,u+=e.indices.length}return new Y({positions:o,indices:s,kind:`lines`})}}}),Q(`polygon`,e=>{let t=e.values.points,n={points:Float64Array.from(t),smooth:new Uint8Array(t.length/2),closed:!0};return{key:`polygon:${Xi(Qi(e,`points`))}`,unit:null,lods:1,kind:`triangles`,doubleSided:!0,bounds:aa(t,2),lodDeviation:[0],generate:(e,t,r)=>vi(zr([n],`nonzero`).regions,r)}}),Q(`path`,e=>{let t=$i(e);if(!t)return null;let n=Pe(t.path.segments);return{key:`path:${Xi(t.raw)}:${t.fillRule}`,unit:null,lods:4,kind:`triangles`,doubleSided:!0,bounds:$(n.minX,n.minY,0,n.maxX,n.maxY,0),lodDeviation:Hi(e=>ui(ea(t.path.segments),e)),generate:(e,n,r)=>vi(ra(t,e,n,r).regions,r)}}),Q(`extrude`,e=>{let t=$i(e);if(!t)return null;let n=R(e,`depth`),r=R(e,`bevel`),i=R(e,`bevelSegments`),a=R(e,`center`),o=Pe(t.path.segments),s=a?-n/2:0;return{key:`extrude:${Xi(t.raw)}:${t.fillRule}:${n}:${r}:${i}:${a}`,unit:null,lods:4,kind:`triangles`,doubleSided:!1,bounds:$(o.minX,o.minY,s,o.maxX,o.maxY,s+n),lodDeviation:Hi(e=>ui(ea(t.path.segments),e)+di(r,Math.max(1,Math.round(i/(e>=2?2:1))))),generate:(e,o,s)=>xi(ra(t,e,o,s),{depth:n,bevel:r,bevelSegments:Math.max(1,Math.round(i/(e>=2?2:1))),center:a},s)}}),Q(`revolve`,e=>{let t=$i(e);if(!t)return null;let n=R(e,`angle`),r=e.values.segments,i=Pe(t.path.segments),a=Math.max(Math.abs(i.maxX),Math.abs(i.minX));return{key:`revolve:${Xi(t.raw)}:${n}:${r||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:na(t.path.segments),bounds:$(-a,i.minY,-a,a,i.maxY,a),lodDeviation:Hi(e=>{let i=r||Math.max(3,Math.round(Z(48,e,1,8)*Math.min(1,n/360)+ +(n<360)));return ui(ea(t.path.segments),e)+a*Qr(i)}),generate:(e,i,a)=>{let o=Qn(t.path.segments,{tolerance:ta(t.path.segments,e,i)}),s=r||Math.max(3,Math.round(Z(48,e,i,8)*Math.min(1,n/360)+ +(n<360)));return Ci(o,{angle:n,segments:s},a).mesh}}});function oa(e){if(e.kind===`helix`)return $(-e.radius,Math.min(0,e.pitch*e.turns),-e.radius,e.radius,Math.max(0,e.pitch*e.turns),e.radius);if(e.kind===`points`){let t=aa(e.points,3),n=.15*Math.hypot(t.max[0]-t.min[0],t.max[1]-t.min[1],t.max[2]-t.min[2]);return aa(e.points,3,n)}let t=$(1/0,1/0,1/0,-1/0,-1/0,-1/0);for(let n of e.segments){if(n.c===`Z`)continue;let e=[[n.x,n.y,n.z]];n.c===`C`&&e.push([n.x1,n.y1,n.z1],[n.x2,n.y2,n.z2]),n.c===`Q`&&e.push([n.x1,n.y1,n.z1]);for(let n of e)for(let e=0;e<3;e++)t.min[e]=Math.min(t.min[e],n[e]||0),t.max[e]=Math.max(t.max[e],n[e]||0)}return t}Q(`sweep`,e=>{let t=e.values.along,n=e.values.radius,r=n===void 0?$i(e):null;if(n===void 0&&!r)return null;let i=R(e,`smooth`),a=R(e,`twist`),o=R(e,`taper`),s=R(e,`caps`),c=e.values.segments,l=n;if(r){let e=Pe(r.path.segments);l=Math.max(Math.abs(e.minX),Math.abs(e.maxX),Math.abs(e.minY),Math.abs(e.maxY))}let u=oa(t),d=l*Math.max(1,o)*1.5,f=t.kind===`helix`||(t.kind===`path`?na(t.segments):!(t.points.length>6&&t.points[0]===t.points[t.points.length-3]&&t.points[1]===t.points[t.points.length-2]&&t.points[2]===t.points[t.points.length-1])),p=Math.hypot(u.max[0]-u.min[0],u.max[1]-u.min[1],u.max[2]-u.min[2])||1;return{key:`sweep:${r?Xi(r.raw)+`:`+r.fillRule:`r`+n}:${Xi(Qi(e,`along`))}:${i}:${a}:${o}:${s}:${c||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:!s&&f,bounds:$(u.min[0]-d,u.min[1]-d,u.min[2]-d,u.max[0]+d,u.max[1]+d,u.max[2]+d),lodDeviation:Hi(e=>{let t=r?ui(ea(r.path.segments),e):(n||0)*Qr(c||Z(24,e,1,6));return ui(p,e)+t}),generate:(e,l,u)=>{let d=Ai(t,{tolerance:ui(p,e)/l,segmentsPerTurn:Z(48,e,l,8),smooth:i,subdivisions:Z(12,e,l,2)});return Ri(r?{kind:`shape`,...ra(r,e,l,u)}:{kind:`circle`,radius:n,segments:c||Z(24,e,l,6)},d,{twist:a,taper:o,caps:s},u).mesh}}}),Q(`gear`,e=>{let t=R(e,`teeth`),n=R(e,`module`),r=R(e,`pressureAngle`),i=R(e,`depth`)/n,a=R(e,`bore`)/n,o=R(e,`bevel`)/n,s=R(e,`center`),c=t/2+1,l=s?-i/2:0;return{key:`gear:${t}:${r}:${i}:${a}:${o}:${s}`,unit:Yi(n,n,n),lods:4,kind:`triangles`,doubleSided:!1,bounds:$(-c,-c,l,c,c,l+i),lodDeviation:Hi(e=>ci(t,Z(8,e,1,2))+di(o,e>=2?1:2)),generate:(e,n,c)=>{let l=Z(8,e,n,2),u=Z(4,e,n,2),d={...Vi(t,r,l,u).outline,isWall:!0},f=[];if(a>0){let t=er(a,Z(48,e,n,8)),r=t.points.length/2,i=new Float64Array(t.points.length);for(let e=0;e<r;e++)i[e*2]=t.points[(r-1-e)*2],i[e*2+1]=t.points[(r-1-e)*2+1];f.push({points:i,smooth:t.smooth,closed:!0,isWall:!0})}return xi({regions:[{outer:d,holes:f}],walls:[d,...f]},{depth:i,bevel:o,bevelSegments:e>=2?1:2,center:s},c)}}}),Q(`mesh`,e=>{let t=e.values.positions,n=e.values.indices||Uint32Array.from({length:t.length/3},(e,t)=>t),r=e.values.normals,i=e.values.uvs,a=R(e,`smooth`);return{key:`mesh:${Zi(t)}:${Zi(e.values.indices)}:${Zi(r)}:${Zi(i)}:${a}`,unit:null,lods:1,kind:`triangles`,doubleSided:!1,bounds:aa(t,3),lodDeviation:[0],generate:()=>r?new Y({positions:Float32Array.from(t),normals:Float32Array.from(r),uvs:i?Float32Array.from(i):null,indices:Uint32Array.from(n)}):Hr(t,n,a,i)}}),Gi=new Set(Wi.keys());var sa={color:[.8,.8,.8,1],metallic:0,roughness:.5,opacity:1,emissive:[0,0,0,1],emissiveIntensity:1,map:null,normalMap:null,normalScale:1,occlusionMap:null,occlusionStrength:1,metallicRoughnessMap:null,emissiveMap:null,alphaMode:`auto`,alphaCutoff:.5,uvScale:[1,1],doubleSided:!1,unlit:!1},ca=class{constructor(e,t,n=null){this.index=t,this.name=n,this.params=e,this.baseColor=Te(e.color),this.baseColorSrgb=e.color,this.metallic=e.metallic,this.roughness=e.roughness,this.opacity=e.opacity*e.color[3];let r=Te(e.emissive);this.emissive=[r[0]*e.emissiveIntensity,r[1]*e.emissiveIntensity,r[2]*e.emissiveIntensity],this.map=e.map,this.normalMap=e.normalMap,this.normalScale=e.normalScale,this.occlusionMap=e.occlusionMap,this.occlusionStrength=e.occlusionStrength,this.metallicRoughnessMap=e.metallicRoughnessMap,this.emissiveMap=e.emissiveMap,this.alphaCutoff=e.alphaCutoff;let i=e.opacity*e.color[3],a=e.alphaMode||`auto`;this.alphaMode=a===`auto`?i<.999?`blend`:`opaque`:a,this.uvScale=e.uvScale,this.doubleSided=e.doubleSided,this.unlit=e.unlit,this.key=la(e)}get transparent(){return this.alphaMode===`blend`&&this.opacity<.999}};function la(e){return[Ee(e.color),e.metallic,e.roughness,e.opacity,Ee(e.emissive),e.emissiveIntensity,e.map?e.map.key:``,e.normalMap?e.normalMap.key:``,e.normalScale,e.occlusionMap?e.occlusionMap.key:``,e.occlusionStrength,e.metallicRoughnessMap?e.metallicRoughnessMap.key:``,e.emissiveMap?e.emissiveMap.key:``,e.alphaMode,e.alphaCutoff,e.uvScale.join(`,`),+!!e.doubleSided,+!!e.unlit].join(`|`)}function ua(e){let t={};for(let n of Object.keys(sa)){let r=R(e,n);t[n]=r===void 0?sa[n]:r}return t}var da=class{constructor(){this.list=[],this.byKey=new Map,this.defs=new Map,this.resolved=new Map,this.fast=new Map}define(e,t){this.defs.set(e,t)}intern(e,t){let n=la(e),r=this.byKey.get(n);return r===void 0&&(r=this.list.length,this.list.push(new ca(e,r,t)),this.byKey.set(n,r)),r}resolve(e,t){let n=this.fast.get(e);n===void 0&&(n=new Map,this.fast.set(e,n));let r=n.get(t);return r===void 0&&(r=this.resolveSlow(e,t),n.set(t,r)),r}resolveSlow(e,t){let n=t?Ee(t):``,r=(e||``)+`|`+n,i=this.resolved.get(r);if(i!==void 0)return i;let a=e&&this.defs.get(e)||sa,o=t?{...a,color:t}:a;return i=this.intern(o,e||(t?n:`default`)),this.resolved.set(r,i),i}},fa={linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>1-(1-e)*(1-e),"ease-in-out":e=>e<.5?2*e*e:1-2*(1-e)*(1-e)},pa=e=>e<0?0:e>1?1:e;function ma(e,t){let n=R(e,`attr`),r=e=>n===`scale`&&e.length===1?[e[0],e[0],e[0]]:e.slice(),i=e.values,a={attr:n,dur:R(e,`dur`)||1,begin:R(e,`begin`),repeat:R(e,`repeat`),alternate:R(e,`alternate`),ease:fa[R(e,`easing`)]||fa.linear,timeline:R(e,`timeline`),smooth:R(e,`smooth`),from:null,to:null,keys:null,keyTimes:null,path:null};if(i.along)a.path=ya(i.along,a.smooth);else if(i.values){a.keys=i.values.map(r);let e=a.keys.length;a.keyTimes=i.keyTimes&&i.keyTimes.length===e?i.keyTimes.slice():a.keys.map((t,n)=>n/(e-1))}else a.from=i.from===void 0?t[n]:r(i.from),a.to=r(i.to);return a}function ha(e,t,n=0){if(e.timeline===`scroll`)return e.ease(pa(n));let r=t-e.begin;if(r<0)return-1;let i=r/e.dur,a;if(i>=e.repeat){let t=Math.ceil(e.repeat)-1;a=e.repeat-t,e.alternate&&t%2==1&&(a=1-a)}else{let t=Math.floor(i);a=i-t,e.alternate&&t%2==1&&(a=1-a)}return e.ease(a)}function ga(e,t,n=0){let r=ha(e,t,n);if(r<0)return null;if(e.path)return ba(e.path,r);if(e.keys)return _a(e,r);let i=Array(e.from.length);for(let t=0;t<i.length;t++)i[t]=e.from[t]+(e.to[t]-e.from[t])*r;return i}function _a(e,t){let n=e.keys,r=e.keyTimes,i=n.length,a=0;for(;a<i-2&&t>=r[a+1];)a++;let o=r[a+1]-r[a],s=o>0?pa((t-r[a])/o):1,c=n[a],l=n[a+1];return!e.smooth||i<3?c.map((e,t)=>e+(l[t]-e)*s):va(a>0?n[a-1]:c.map((e,t)=>2*e-l[t]),c,l,a+2<i?n[a+2]:l.map((e,t)=>2*e-c[t]),s)}function va(e,t,n,r,i){let a=(e,t)=>{let n=0;for(let r=0;r<e.length;r++)n+=(t[r]-e[r])**2;return Math.max(Math.sqrt(Math.sqrt(n)),1e-9)},o=0+a(e,t),s=o+a(t,n),c=s+a(n,r),l=o+(s-o)*i,u=(e,t,n,r)=>e.map((e,i)=>e+(t[i]-e)*(l-n)/(r-n)),d=u(e,t,0,o),f=u(t,n,o,s),p=u(n,r,s,c);return u(u(d,f,0,s),u(f,p,o,c),o,s)}function ya(e,t){let n=e=>({tolerance:e,segmentsPerTurn:64,smooth:t,subdivisions:24}),r=Ai(e,n(.01));if(e.kind===`path`){let t=0;for(let e of r)for(let n=0;n<e.points.length;n++)t=Math.max(t,Math.abs(e.points[n]));r=Ai(e,n(Math.max(t,1e-6)*1e-4))}let i=[];for(let e of r){for(let t=0;t<e.points.length;t++)i.push(e.points[t]);e.closed&&e.points.length>=3&&i.push(e.points[0],e.points[1],e.points[2])}let a=i.length/3,o=new Float64Array(Math.max(a,1));for(let e=1;e<a;e++)o[e]=o[e-1]+Math.hypot(i[e*3]-i[e*3-3],i[e*3+1]-i[e*3-2],i[e*3+2]-i[e*3-1]);return{points:Float64Array.from(i),lengths:o,total:a?o[a-1]:0}}function ba(e,t){let n=e.points,r=e.lengths,i=n.length/3;if(i===0)return[0,0,0];if(i===1||e.total<=0)return[n[0],n[1],n[2]];let a=pa(t)*e.total,o=0,s=i-1;for(;s-o>1;){let e=o+s>>1;r[e]<=a?o=e:s=e}let c=r[s]-r[o],l=c>0?(a-r[o])/c:0;return[n[o*3]+(n[s*3]-n[o*3])*l,n[o*3+1]+(n[s*3+1]-n[o*3+1])*l,n[o*3+2]+(n[s*3+2]-n[o*3+2])*l]}var xa=class{constructor(e,t){this.el=e,this.uid=e.uid,this.kind=t,this.local=null,this.visible=!0,this.material=null,this.color=null,this.anims=[],this.children=[],this.geometry=null,this.unit=null,this.target=null,this.count=0,this.step=null,this.params=null,this.scriptLocal=null,this.place=null,this.parent=null}get animated(){return this.anims.length>0}},Sa={background:[.09,.1,.12,1],sky:[.8,.86,.95,1],ground:[.25,.22,.2,1],intensity:.5,exposure:1};function Ca(e){return it(e,1e-15)}function wa(e,t,n={}){let r=n.maxInstances||2e6,i=[],a=new da,o=new Map,s=new Map,c={...Sa,explicit:!1},l=!1,u=null,d={time:!1,scroll:!1},f={nodes:0,shapes:0,uses:0,defs:0,lights:0,cameras:0,materials:0},p=(e,t,n,r,a=`reference`)=>{i.push({severity:t,code:n,message:r,element:e,phase:a})},m=e=>{if(!e.unknown){e.name===`material`&&e.values&&e.values.id!==void 0&&(a.define(e.values.id,ua(e)),f.materials++),e.name===`environment`&&!l&&(l=!0,c={background:R(e,`background`),sky:R(e,`sky`),ground:R(e,`ground`),intensity:R(e,`intensity`),exposure:R(e,`exposure`),explicit:!0,uid:e.uid}),e.name===`controls`&&!u&&(u=Ta(e)),e.name===`defs`&&(f.defs+=e.children.filter(e=>e.type===`element`).length);for(let t of e.children)t.type===`element`&&m(t)}};m(e.root),t.beginBuild(n.owner);let h=(e,n=0)=>{if(o.has(e))return o.get(e);if(n>64)return p(e,`error`,`E_TOO_DEEP`,`Nesting is deeper than 64. Flatten the tree or shorten the use chain.`),o.set(e,null),null;if(e.unknown||!ve(e.name))return o.set(e,null),null;let r=e.name,a;if(r===`es3d`||r===`v3d`||r===`scene`||r===`group`)a=`group`;else if(r===`use`)a=`use`;else if(r===`repeat`)a=`repeat`;else if(r===`scatter`)a=`scatter`;else if(r===`lod`)a=`lod`;else if(r===`light`)a=`light`;else if(r===`camera`)a=`camera`;else if(Ki(r))a=`shape`;else return o.set(e,null),null;let c=new xa(e,a);o.set(e,c),f.nodes++;let l=e.values||{};if(l.id!==void 0&&s.set(l.id,c),a!==`camera`&&a!==`light`){let e=At(l);c.local=Ca(e)?null:e}c.visible=R(e,`visible`)!==!1,c.collide=l.collide!==!1,c.material=l.material===void 0?null:l.material,c.color=l.color===void 0?null:l.color;let u=R(e,`position`)||[0,0,0];c.base={position:u,rotation:R(e,`rotation`)||[0,0,0],scale:R(e,`scale`)||[1,1,1]},a===`camera`&&(c.base.target=l.target||[u[0],u[1],u[2]-1],c.base.fov=[R(e,`fov`)]);for(let t of e.children){if(t.type!==`element`)continue;if(t.name===`animate`){if(!t.unknown&&t.values&&t.values.attr){let e=ma(t,c.base);c.anims.push(e),d[e.timeline===`scroll`?`scroll`:`time`]=!0}continue}if((r===`es3d`||r===`v3d`)&&(t.name===`defs`||t.name===`title`||t.name===`desc`||t.name===`environment`||t.name===`material`)||t.name===`material`||t.name===`environment`||t.name===`controls`)continue;let e=h(t,n+1);e&&(e.parent=c,c.children.push(e))}switch(a){case`shape`:{f.shapes++;let n=null;try{n=Ji(e,{})}catch(t){p(e,`error`,`E_GEOMETRY`,`Cannot describe <${r}>: ${t.message}`,`geometry`)}n?(c.geometry=t.acquire(n,e),c.unit=n.unit&&!Ca(n.unit)?n.unit:null):i.some(t=>t.element===e)||p(e,`error`,`E_GEOMETRY`,`<${r}> has no usable geometry source.`,`geometry`);break}case`use`:f.uses++,e.target&&!e.circular&&(c.target=h(e.target,n+1));break;case`repeat`:c.count=l.count||0,c.step=l.step?l.step.matrix:V();break;case`scatter`:c.params={grid:l.grid||null,count:l.grid?l.grid[0]*l.grid[1]:l.count||0,spacing:R(e,`spacing`),area:l.area||null,radius:l.radius||null,seed:R(e,`seed`),jitter:R(e,`jitter`),randomScale:l.randomScale||null,randomRotation:l.randomRotation||null,randomMaterial:l.randomMaterial||null};break;case`lod`:c.params={distances:l.distances||[]};break;case`light`:{f.lights++;let t=V();l.transform&&t.set(l.transform.matrix),c.params={type:l.type,color:R(e,`color`),intensity:R(e,`intensity`),position:R(e,`position`),rotation:l.rotation||null,direction:l.direction||null,target:l.target||null,range:R(e,`range`),angle:R(e,`angle`),penumbra:R(e,`penumbra`),groundColor:R(e,`groundColor`),transform:l.transform?t:null};break}case`camera`:f.cameras++,c.params={type:R(e,`type`),position:R(e,`position`),target:l.target||null,rotation:l.rotation||null,up:R(e,`up`),fov:R(e,`fov`),height:R(e,`height`),near:l.near||null,far:l.far||null,aspect:R(e,`aspect`),fit:R(e,`fit`),transform:l.transform?l.transform.matrix:null,name:l.name||l.id||`camera ${f.cameras}`}}return c},g=e.root?h(e.root):null;t.endBuild();let _=new Map,v=e=>{if(!e)return 0;if(_.has(e))return _.get(e);_.set(e,0);let t=0,n=()=>e.children.reduce((e,t)=>e+v(t),0);switch(e.kind){case`shape`:t=+!!e.geometry;break;case`use`:t=v(e.target);break;case`repeat`:t=e.count*n();break;case`scatter`:t=e.params.count*n();break;case`light`:case`camera`:t=0;break;default:t=n()}return e.visible||(t=0),_.set(e,t),t},y=v(g);return f.expandedInstances=y,y>r&&p(e.root,`error`,`E_TOO_MANY_INSTANCES`,`The scene expands to ${y.toLocaleString(`en-US`)} instances, more than the limit of ${r.toLocaleString(`en-US`)}. Reduce repeat or scatter counts.`,`render`),{doc:e,root:g,materials:a,environment:c,controls:u,animation:d,cache:t,diagnostics:i,stats:f,tooLarge:y>r,expanded:y,byId:s}}function Ta(e){let t=e.values||{};return{mode:R(e,`mode`),zoom:R(e,`zoom`),pan:R(e,`pan`),minDistance:t.minDistance??null,maxDistance:t.maxDistance??null,minPolar:R(e,`minPolar`),maxPolar:R(e,`maxPolar`),targetMin:t.targetMin&&t.targetMax?t.targetMin:null,targetMax:t.targetMin&&t.targetMax?t.targetMax:null,collide:R(e,`collide`),uid:e.uid}}function Ea(e){let t=e>>>0;return function(){t=t+1831565813>>>0;let e=t;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}}function Da(e,t,n){let r=Math.imul(e|0,668265261)^Math.imul(t|0,374761393)^Math.imul(n|0,2654435769);return r=Math.imul(r^r>>>15,2246822507),r=Math.imul(r^r>>>13,3266489909),((r^r>>>16)>>>0)/4294967296}var Oa=class{constructor(e=256){this.count=0,this.capacity=0,this.geometries=[],this.geomIndex=new Map,this.materials=[],this.lights=[],this.cameras=[],this.lodSwitches=[],this.environment=null,this.controls=null,this.animation={time:!1,scroll:!1},this.dynamic=[],this.bounds={min:[1/0,1/0,1/0],max:[-1/0,-1/0,-1/0]},this.version=0,this.templates=new Map,this.alloc(e)}alloc(e){let t=(t,n,r)=>{let i=new t(e*r);return n&&i.set(n.subarray(0,Math.min(n.length,i.length))),i};this.matrices=t(Float32Array,this.matrices,16),this.geom=t(Uint32Array,this.geom,1),this.mat=t(Uint32Array,this.mat,1),this.uid=t(Uint32Array,this.uid,1),this.lodNode=t(Int32Array,this.lodNode,1),this.lodChild=t(Uint16Array,this.lodChild,1),this.flags=t(Uint8Array,this.flags,1),this.spheres=t(Float32Array,this.spheres,4),this.capacity=e}geometryIndex(e){let t=this.geomIndex.get(e);return t===void 0&&(t=this.geometries.length,this.geometries.push(e),this.geomIndex.set(e,t)),t}setInstance(e,t,n,r,i,a,o,s=0){e>=this.capacity&&this.alloc(Math.max(this.capacity*2,e+1));let c=this.matrices,l=e*16;for(let e=0;e<16;e++)c[l+e]=r[e];this.geom[e]=t,this.mat[e]=n,this.uid[e]=i,this.lodNode[e]=a,this.lodChild[e]=o;let u=gt(r);this.flags[e]=+(u<0)|s;let d=this.geometries[t].bounds,f=0,p=0,m=0,h=0;if(d){let e=(d.min[0]+d.max[0])/2,t=(d.min[1]+d.max[1])/2,n=(d.min[2]+d.max[2])/2;f=r[0]*e+r[4]*t+r[8]*n+r[12],p=r[1]*e+r[5]*t+r[9]*n+r[13],m=r[2]*e+r[6]*t+r[10]*n+r[14];let i=(d.max[0]-d.min[0])/2,a=(d.max[1]-d.min[1])/2,o=(d.max[2]-d.min[2])/2,s=Math.abs(r[0])*i+Math.abs(r[4])*a+Math.abs(r[8])*o,c=Math.abs(r[1])*i+Math.abs(r[5])*a+Math.abs(r[9])*o,l=Math.abs(r[2])*i+Math.abs(r[6])*a+Math.abs(r[10])*o;h=Math.sqrt(s*s+c*c+l*l);let u=this.bounds;f-s<u.min[0]&&(u.min[0]=f-s),p-c<u.min[1]&&(u.min[1]=p-c),m-l<u.min[2]&&(u.min[2]=m-l),f+s>u.max[0]&&(u.max[0]=f+s),p+c>u.max[1]&&(u.max[1]=p+c),m+l>u.max[2]&&(u.max[2]=m+l)}let g=this.spheres;g[e*4]=f,g[e*4+1]=p,g[e*4+2]=m,g[e*4+3]=h}reserve(e){let t=this.capacity;for(;t<e;)t=Math.max(t*2,t+1);t!==this.capacity&&this.alloc(t)}trim(){this.capacity>this.count*2+64&&this.alloc(Math.max(this.count,1))}get empty(){return this.count===0}},ka=V(),Aa=class{constructor(e,t,n,r=0){this.scene=e,this.graph=t,this.time=n,this.progress=r,this.noCollide=0,this.cursor=0,this.lightCursor=0,this.cameraCursor=0,this.switchCursor=0,this.overwrite=!1,this.stack=[],this.tmp=V(),this.segmentDepth=0}mat(e){for(;this.stack.length<=e;)this.stack.push(new Float64Array(16));return this.stack[e]}notePlace(e,t,n,r,i,a,o){if(e.place===`many`)return;if(e.place){e.place=`many`;return}let s=new Float64Array(16);s.set(t),e.place={parent:s,material:n,color:r,sel:i,lodNode:a,lodChild:o,noCollide:this.noCollide,rowStart:this.cursor,lightStart:this.lightCursor,cameraStart:this.cameraCursor,switchStart:this.switchCursor}}localOf(e,t){if(!e.anims.length)return e.local?t.set(e.local):rt(t),t;let n={};for(let t of e.anims){let e=ga(t,this.time,this.progress);e&&(n[t.attr]=e)}return At(e.el.values,t,n)}walk(e,t,n,r,i,a,o,s){if(!e||!e.visible)return;this.overwrite||this.notePlace(e,t,n,r,i,a,o);let c=e.anims.length>0&&this.segmentDepth===0&&!this.overwrite,l=null;c&&(l={node:e,parent:new Float64Array(t),material:n,color:r,sel:i,lodNode:a,lodChild:o,noCollide:this.noCollide,start:this.cursor,end:0,lightStart:this.lightCursor,cameraStart:this.cameraCursor,switchStart:this.switchCursor}),e.anims.length&&this.segmentDepth++,e.collide===!1&&this.noCollide++;let u=n,d=r;if(e.material!==null&&(u=e.material,d=null),e.color!==null&&(d=e.color),e.kind===`light`)this.emitLight(e,t);else if(e.kind===`camera`)this.emitCamera(e,t);else{let n,r=e.scriptLocal;if(!r&&!e.local&&!e.anims.length)n=t;else{n=this.mat(s);let i=r||(e.anims.length?this.localOf(e,this.tmp):e.local);at(n,t,i)}switch(e.kind){case`shape`:this.emitShape(e,n,u,d,i===0?e.uid:i,a,o,s);break;case`group`:for(let t of e.children)this.walk(t,n,u,d,i,a,o,s+1);break;case`use`:e.target&&this.walk(e.target,n,u,d,i===0?e.uid:i,a,o,s+1);for(let t of e.children)this.walk(t,n,u,d,i,a,o,s+1);break;case`repeat`:this.emitRepeat(e,n,u,d,i,a,o,s);break;case`scatter`:this.emitScatter(e,n,u,d,i,a,o,s);break;case`lod`:this.emitLod(e,n,u,d,i,a,o,s)}}e.anims.length&&this.segmentDepth--,e.collide===!1&&this.noCollide--,l&&(l.end=this.cursor,l.lightEnd=this.lightCursor,l.cameraEnd=this.cameraCursor,l.switchEnd=this.switchCursor,this.scene.dynamic.push(l)),!this.overwrite&&e.place&&e.place!==`many`&&(e.place.rowEnd=this.cursor,e.place.lightEnd=this.lightCursor,e.place.cameraEnd=this.cameraCursor,e.place.switchEnd=this.switchCursor)}emitShape(e,t,n,r,i,a,o,s){if(!e.geometry)return;let c=this.scene,l=t;e.unit&&(l=this.mat(s+1),at(l,t,e.unit));let u=c.geometryIndex(e.geometry),d=this.graph.materials.resolve(n,r);c.setInstance(this.cursor++,u,d,l,i,a,o,this.noCollide?2:0)}emitRepeat(e,t,n,r,i,a,o,s){if(this.expand(e,e.count,t,n,r,i,a,o))return;let c=V(),l=V(),u=this.mat(s+1);for(let d=0;d<e.count;d++){at(u,t,c);for(let t of e.children)this.walk(t,u,n,r,i,a,o,s+2);at(l,c,e.step),c.set(l)}}emitScatter(e,t,n,r,i,a,o,s){let c=e.params;if(this.expand(e,c.count,t,n,r,i,a,o))return;let l=Ea(c.seed),u=V(),d=new Float64Array(9),f=(e,t)=>e[0]+(e[1]-e[0])*t,p=c.grid?c.grid[0]:0,m=c.grid?c.grid[1]:0,h=new Float64Array(16),g=[0,0,0],_=[0,0,0],v=[1,1,1];for(let y=0;y<c.count;y++){for(let e=0;e<9;e++)d[e]=l();if(c.grid){let e=y%p,t=Math.floor(y/p);g[0]=(e-(p-1)/2)*c.spacing[0]+(d[0]-.5)*c.jitter*c.spacing[0],g[2]=(t-(m-1)/2)*c.spacing[1]+(d[1]-.5)*c.jitter*c.spacing[1]}else if(c.radius){let e=c.radius*Math.sqrt(d[0]),t=d[1]*Math.PI*2;g[0]=e*et(t),g[2]=e*$e(t)}else g[0]=(d[0]-.5)*c.area[0],g[2]=(d[1]-.5)*c.area[1];if(c.randomRotation){let e=c.randomRotation.ranges;_[0]=f(e[0],d[2]),_[1]=f(e[1],d[3]),_[2]=f(e[2],d[4])}if(c.randomScale){let e=c.randomScale.ranges;c.randomScale.uniform?v[0]=v[1]=v[2]=f(e[0],d[5]):(v[0]=f(e[0],d[5]),v[1]=f(e[1],d[6]),v[2]=f(e[2],d[7]))}mt(u,g,_,v),at(h,t,u);let b=n,x=r;c.randomMaterial&&(b=c.randomMaterial[Math.min(c.randomMaterial.length-1,Math.floor(d[8]*c.randomMaterial.length))],x=null);for(let t of e.children)this.walk(t,h,b,x,i,a,o,s+1)}}expand(e,t,n,r,i,a,o,s){if(!Bt()||!Number.isInteger(t)||t<1)return!1;let c=this.template(e,a,s);if(!c||c.rows.length*t<ja)return!1;let l=e.kind===`scatter`,u=e.params,d=new Int32Array(K.SIZE),f=new Float64Array(q.SIZE);if(l&&!Ka(u,d,f))return!1;let p=this.scene,m=c.rows.length,h=c.lods.length;c.geometries||(c.geometries=!0,c.rows.forEach((e,t)=>{let n=e.entry.bounds;if(c.table.set([p.geometryIndex(e.entry),e.uid,e.lod,e.child,e.flags,+!!n],t*6),n){let e=[(n.max[0]-n.min[0])/2,(n.max[1]-n.min[1])/2,(n.max[2]-n.min[2])/2];c.bounds.set([(n.min[0]+n.max[0])/2,(n.min[1]+n.max[1])/2,(n.min[2]+n.max[2])/2,...e],t*6)}})),d[K.KIND]=l?za:Ra,d[K.NOPS]=c.ops.length,d[K.NROWS]=m,d[K.LODS]=h,d[K.OUTER_LOD]=o,d[K.SLOTS]=c.slots,f.set(n,q.WORLD),l||(f.set(ka,q.ACC),f.set(e.step,q.STEP));let g=p.bounds;f.set(g.min,q.BOUNDS),f.set(g.max,q.BOUNDS+3);let _=l&&u.randomMaterial,v=new Int32Array(m*(_?_.length:1)).fill(-1),y=e=>{let t=Math.floor(e/m),n=c.rows[e-t*m],a=_?_[t]:r,o=_?null:i;return this.graph.materials.resolve(n.material===Ga?a:n.material,n.color===Ga?o:n.color)},b=Math.max(1,Math.floor(Ma/m)),x=this.cursor,S=this.switchCursor;for(let e=0;e<t;e+=b){d[K.FIRST]=e,d[K.COUNT]=Math.min(b,t-e),d[K.SWITCH]=S;let n=on(d,f,c,v,y);if(!n){if(e>0)throw Error(`WebAssembly memory ran out while expanding instances`);return!1}let r=n.mat.length;p.reserve(x+r),p.matrices.set(n.matrices,x*16),p.spheres.set(n.spheres,x*4),p.geom.set(n.geom,x),p.mat.set(n.mat,x),p.uid.set(n.uid,x),p.lodNode.set(n.lodNode,x),p.lodChild.set(n.lodChild,x),p.flags.set(n.flags,x);let i=n.switches;for(let e=0;e<i.length/4;e++){let t=c.lods[e%h],n=Math.cbrt(Math.abs(i[e*4+3])||1);p.lodSwitches[S+e]={pos:[i[e*4],i[e*4+1],i[e*4+2]],distances:t.distances.map(e=>e*n),parent:t.ref>=0?S+e-e%h+t.ref:o,parentChild:t.child}}x+=r,S+=i.length/4}for(let e=0;e<3;e++)g.min[e]=f[q.BOUNDS+e],g.max[e]=f[q.BOUNDS+3+e];return this.cursor=x,this.switchCursor=S,Qa(e),!0}template(e,t,n){let r=this.noCollide>0,i=this.scene.templates.get(e);return i&&i.sel===t&&i.lodChild===n&&i.noCollide===r||(i={sel:t,lodChild:n,noCollide:r,template:qa(e.children,t,n,r)},this.scene.templates.set(e,i)),i.template}emitLod(e,t,n,r,i,a,o,s){let c=this.scene,l={pos:[t[12],t[13],t[14]],distances:e.params.distances.map(e=>e*Math.cbrt(Math.abs(gt(t))||1)),parent:a,parentChild:o},u=this.switchCursor++;c.lodSwitches[u]=l,e.children.forEach((e,a)=>this.walk(e,t,n,r,i,u,a,s+1))}emitLight(e,t){let n=e.params,r=V();r.set(t),n.transform&&at(r,r,n.transform);let i=e.anims.length?Xa(e,this,`position`,n.position):n.position,a=e.anims.length?Xa(e,this,`rotation`,n.rotation||[0,0,0]):n.rotation,o=V();mt(o,i,a||[0,0,0],[1,1,1]),at(o,r,o);let s=[o[12],o[13],o[14]],c=n.direction,l=o;if(!c&&n.target){let e=[0,0,0];_t(e,r,n.target[0],n.target[1],n.target[2]),c=[e[0]-s[0],e[1]-s[1],e[2]-s[2]],l=ka}c||=[0,-1,0];let u=[0,0,0];vt(u,l,c[0],c[1],c[2]);let d=Math.hypot(u[0],u[1],u[2])||1,f=Te(n.color),p={type:n.type,color:[f[0]*n.intensity,f[1]*n.intensity,f[2]*n.intensity],position:s,direction:[u[0]/d,u[1]/d,u[2]/d],range:n.range,outer:Math.cos(n.angle/2*Math.PI/180),inner:Math.cos(n.angle/2*(1-n.penumbra)*Math.PI/180),ground:Te(n.groundColor).map(e=>e*n.intensity),uid:e.uid};this.scene.lights[this.lightCursor++]=p}emitCamera(e,t){let n=e.params,r=V();r.set(t),n.transform&&at(r,r,n.transform);let i=e.anims.length>0,a=i?Xa(e,this,`position`,n.position):n.position,o=[0,0,0];_t(o,r,a[0],a[1],a[2]);let s,c=[0,0,0],l=i?Xa(e,this,`target`,n.target):n.target;if(l)s=[0,0,0],_t(s,r,l[0],l[1],l[2]),vt(c,r,n.up[0],n.up[1],n.up[2]);else{let t=V(),a=i?Xa(e,this,`rotation`,n.rotation||[0,0,0]):n.rotation||[0,0,0];dt(t,a[0],a[1],a[2]),at(t,r,t);let l=[0,0,0];vt(l,t,0,0,-1),s=[o[0]+l[0],o[1]+l[1],o[2]+l[2]],vt(c,t,n.up[0],n.up[1],n.up[2])}this.scene.cameras[this.cameraCursor++]={type:n.type,position:o,target:s,up:c.map(e=>e/(Math.hypot(c[0],c[1],c[2])||1)),fov:i?Xa(e,this,`fov`,[n.fov])[0]:n.fov,height:n.height,near:n.near,far:n.far,aspect:n.aspect,fit:n.fit,name:n.name,uid:e.uid}}};Aa.shapeKeeper=new Aa(null,null,.5,.5);var ja=16,Ma=16384,Na=4096,Pa=4*Na,Fa=0,Ia=1,La=2,Ra=0,za=1,Ba=0,Va=1,Ha=2,Ua=1,Wa=2,Ga=Symbol(`inherit`);function Ka(e,t,n){if(t[K.STATE]=e.seed>>>0,e.grid){let[r,i]=e.grid;if(!Number.isInteger(r)||!Number.isInteger(i)||r<1||!e.spacing)return!1;t[K.MODE]=Ba,t[K.NX]=r,t[K.NZ]=i,n[q.SPACING]=e.spacing[0],n[q.SPACING+1]=e.spacing[1],n[q.JITTER]=e.jitter}else if(e.radius)t[K.MODE]=Va,n[q.RADIUS]=e.radius;else{if(!e.area)return!1;t[K.MODE]=Ha,n[q.AREA]=e.area[0],n[q.AREA+1]=e.area[1]}let r=(e,t)=>{for(let r=0;r<e.length;r++)n.set(e[r],t+r*2)};if(e.randomRotation){if(e.randomRotation.ranges.length!==3)return!1;t[K.RANDOM]|=Ua,r(e.randomRotation.ranges,q.ROTATION)}if(e.randomScale){let n=e.randomScale;if(n.ranges.length<(n.uniform?1:3))return!1;t[K.RANDOM]|=n.uniform?6:Wa,r(n.uniform?n.ranges.slice(0,1):n.ranges.slice(0,3),q.SCALE)}return t[K.CHOICES]=e.randomMaterial?e.randomMaterial.length:0,!0}function qa(e,t,n,r){let i={ops:[],matrices:[],index:new Map,slots:1,rows:[],lods:[],geometries:!1};for(let a of e)if(!Ya(i,a,0,Ga,Ga,t,-1,n,r))return null;return i.ops=Int32Array.from(i.ops),i.mats=new Float64Array(Math.max(1,i.matrices.length)*16),i.matrices.forEach((e,t)=>i.mats.set(e,t*16)),i.table=new Int32Array(i.rows.length*6),i.bounds=new Float64Array(Math.max(1,i.rows.length*6)),i}function Ja(e,t,n){let r=e.index.get(n);r===void 0&&(r=e.matrices.length,e.matrices.push(n),e.index.set(n,r));let i=e.slots++;return e.ops.push(Fa,i,t,r),i}function Ya(e,t,n,r,i,a,o,s,c){if(!t||!t.visible)return!0;let l=t.kind;if(t.anims.length||l===`light`||l===`camera`||l===`scatter`||e.rows.length>Na||e.slots>Pa)return!1;t.collide===!1&&(c=!0);let u=r,d=i;t.material!==null&&(u=t.material,d=null),t.color!==null&&(d=t.color);let f=t.local?Ja(e,n,t.local):n,p=t=>Ya(e,t,f,u,d,a,o,s,c);switch(l){case`shape`:if(t.geometry){let n=t.unit?Ja(e,f,t.unit):f;e.ops.push(Ia,e.rows.length,n,0),e.rows.push({entry:t.geometry,uid:a===0?t.uid:a,lod:o,child:s,flags:c?2:0,material:u,color:d})}return!0;case`group`:return t.children.every(p);case`use`:return t.target&&!Ya(e,t.target,f,u,d,a===0?t.uid:a,o,s,c)?!1:t.children.every(p);case`repeat`:{let n=V(),r=V();for(let i=0;i<t.count;i++){if(e.slots>Pa)return!1;let i=Ja(e,f,new Float64Array(n));if(!t.children.every(t=>Ya(e,t,i,u,d,a,o,s,c)))return!1;at(r,n,t.step),n.set(r)}return!0}case`lod`:{let n=e.lods.length;return e.lods.push({ref:o,child:s,distances:t.params.distances}),e.ops.push(La,n,f,0),t.children.every((t,r)=>Ya(e,t,f,u,d,a,n,r,c))}default:return!0}}function Xa(e,t,n,r){let i=r;for(let r of e.anims){if(r.attr!==n)continue;let e=ga(r,t.time,t.progress);e&&(i=e)}return i}function Za(e,t={}){let n=new Oa(Math.min(Math.max(64,e.expanded||64),1<<20));if(n.environment=e.environment,n.controls=e.controls||null,e.animation&&(n.animation={...e.animation}),e.tooLarge||!e.root)return n.materials=e.materials.list,n;let r=new Aa(n,e,t.time||0,t.progress||0);return r.walk(e.root,ka,null,null,0,-1,0,0),n.count=r.cursor,n.lights.length=r.lightCursor,n.cameras.length=r.cameraCursor,n.lodSwitches.length=r.switchCursor,n.materials=e.materials.list,n.trim(),n.bounds.min[0]<=n.bounds.max[0]||(n.bounds={min:[-1,-1,-1],max:[1,1,1]}),n.version++,n}function Qa(e){let t=e=>{if(e&&e.place!==`many`&&(e.place=`many`,e.target&&t(e.target),e.children))for(let n of e.children)t(n)};if(e.target&&t(e.target),e.children)for(let n of e.children)t(n)}function $a(e,t){for(let n of e.dynamic)for(let e=t;e;e=e.parent)if(e===n.node)return n;return null}function eo(e){if(!e||e.length<16)return!1;for(let t=0;t<16;t++)if(!Number.isFinite(+e[t]))return!1;return!0}function to(e,t){let n=e.scriptLocal;n||=e.scriptLocal=new Float64Array(16);for(let e=0;e<16;e++)n[e]=+t[e]}function no(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}function ro(e){for(let t=e[0];t;t=t.parent)if(e.every(e=>e===t||no(e,t)))return t;return null}function io(e,t){if(e.length<=1)return e.slice();let n=ro(e);if(n&&n!==t&&n.place&&n.place!==`many`)return[n];let r=new Map;for(let n of e){let e=n;for(let r=n.parent;r&&r!==t&&r.place&&r.place!==`many`;r=r.parent)e=r;let i=r.get(e);i||r.set(e,i=[]),i.push(n)}let i=[];for(let[n,a]of r)if(a.length>1&&n.place&&n.place!==`many`&&n!==t)i.push(n);else if(a.length===e.length)for(let e of a)i.push(e);else i.push(...io(a,t));return i}function ao(e,t,n,r,i,a,o,s,c,l,u,d,f){e.cursor=t,e.lightCursor=n,e.cameraCursor=r,e.switchCursor=i,e.segmentDepth=0,e.noCollide=a,e.walk(o,s,c,l,u,d,f,0)}function oo(e,t,n,r,i=0,a=0){let o=n||[],s=Array(o.length),c=[],l=new Set;for(let n=0;n<o.length;n++){let i=o[n],a=r&&r[n];!e||!t||!i||!i.place||i.place===`many`||!eo(a)?s[n]=!1:(to(i,a),s[n]=!0,l.has(i)||(l.add(i),c.push(i)))}if(!c.length)return s;let u=[],d=[],f=new Set;for(let t of c){let n=$a(e,t);n?f.has(n)||(f.add(n),u.push(n)):d.push(t)}let p=io(d,t.root),m=new Aa(e,t,i,a);m.overwrite=!0;for(let e of p){let t=e.place;ao(m,t.rowStart,t.lightStart,t.cameraStart,t.switchStart,t.noCollide,e,t.parent,t.material,t.color,t.sel,t.lodNode,t.lodChild)}for(let e of u)p.some(t=>no(e.node,t))||ao(m,e.start,e.lightStart,e.cameraStart,e.switchStart,e.noCollide,e.node,e.parent,e.material,e.color,e.sel,e.lodNode,e.lodChild);return e.version++,s}function so(e,t,n,r=0){if(!e.dynamic.length)return!1;let i=new Aa(e,t,n,r);i.overwrite=!0;for(let t of e.dynamic)i.cursor=t.start,i.lightCursor=t.lightStart,i.cameraCursor=t.cameraStart,i.switchCursor=t.switchStart,i.segmentDepth=0,i.noCollide=t.noCollide,i.walk(t.node,t.parent,t.material,t.color,t.sel,t.lodNode,t.lodChild,0);return e.version++,!0}var co=1,lo=class{constructor(e,t){this.id=co++,this.key=e.key,this.identity=e.identity||null,this.desc=e,this.kind=e.kind,this.lods=e.lods,this.doubleSided=e.doubleSided,this.bounds=e.bounds,this.lodDeviation=e.lodDeviation||[0],this.meshes=Array(e.lods).fill(null),this.reports=Array(e.lods).fill(null),this.owner=t,this.owners=new Set,this.epoch=0,this.useCount=0,this.failed=!1,this.failedLods=0}},uo=`document`,fo=class{constructor(){this.entries=new Map,this.held=new Map,this.building=null,this.buildSet=null,this.onGenerate=null,this.quality=1,this.epoch=0,this.version=0,this.stats={generated:0,generateMs:0,triangles:0,restored:0},this.diagnostics=[],this.onDiagnostic=null}beginBuild(e=uo){if(this.epoch++,this.building=e,this.buildSet=new Set,e===`document`)for(let e of this.entries.values())e.useCount=0}acquire(e,t){let n=this.entries.get(e.key);return n?n.epoch!==this.epoch&&!this.heldByOthers(n)&&(n.desc=e,n.identity=e.identity||null,n.owner=t,n.bounds=e.bounds,n.doubleSided=e.doubleSided):(n=new lo(e,t),this.entries.set(e.key,n)),n.epoch=this.epoch,n.useCount++,this.buildSet&&this.buildSet.add(n),n}heldByOthers(e){for(let t of e.owners)if(t!==this.building)return!0;return!1}endBuild(){let e=this.building===null?uo:this.building,t=this.buildSet||new Set,n=this.held.get(e);this.held.set(e,t);for(let n of t)n.owners.add(e);let r=[];if(n)for(let i of n)t.has(i)||(i.owners.delete(e),r.push(i));if(this.building=null,this.buildSet=null,e===`document`)return this.evictUnheld();let i=[];for(let e of r)e.owners.size===0&&this.entries.get(e.key)===e&&(this.entries.delete(e.key),i.push(e));return i}release(e){let t=this.held.get(e);if(!t)return[];this.held.delete(e);for(let n of t)n.owners.delete(e);let n=[];for(let e of t)e.owners.size===0&&this.entries.get(e.key)===e&&(this.entries.delete(e.key),n.push(e));return n}owned(e=uo){return this.held.get(e)||new Set}evictUnheld(){let e=[];for(let[t,n]of this.entries)n.owners.size===0&&(this.entries.delete(t),e.push(n));return e}setQuality(e){if(e!==this.quality){this.quality=e;for(let e of this.entries.values())e.meshes.fill(null),e.reports.fill(null),e.failedLods=0;this.version++}}mesh(e,t=0){let n=Math.min(Math.max(t,0),e.lods-1),r=e.meshes[n];if(r)return r;let i=typeof performance<`u`?performance.now():Date.now(),a=[],o=(t,n,r)=>{a.push({severity:t,code:n,message:r}),this.emit(e,t,n,r)};try{r=e.desc.generate(n,this.quality,o)}catch(e){o(`error`,`E_GEOMETRY`,`Geometry generation failed: ${e&&e.message?e.message:e}`),r=null}r||=(e.failed=!0,e.failedLods|=1<<n,po(e.kind));let s=typeof performance<`u`?performance.now():Date.now();return this.stats.generated++,this.stats.generateMs+=s-i,e.meshes[n]=r,e.reports[n]=a.length?a:null,this.onGenerate&&this.onGenerate(e),r}emit(e,t,n,r){let i={severity:t,code:n,message:r,element:e.owner,phase:`geometry`};this.diagnostics.push(i),this.onDiagnostic&&this.onDiagnostic(i)}adopt(e,t,n,r=null){if(t<0||t>=e.lods||e.meshes[t])return!1;if(e.meshes[t]=n,e.reports[t]=r&&r.length?r:null,r)for(let t of r)this.emit(e,t.severity,t.code,t.message);return this.stats.restored++,!0}generateAll(e=0){for(let t of this.entries.values())for(let n=0;n<=Math.min(e,t.lods-1);n++)this.mesh(t,n)}takeDiagnostics(){let e=this.diagnostics;return this.diagnostics=[],e}};function po(e){return new Y({positions:new Float32Array,indices:new Uint32Array,kind:e})}var mo=()=>typeof performance<`u`?performance.now():Date.now();function ho(e,t){let n=t.element,r=new l({severity:t.severity,phase:t.phase||`geometry`,code:t.code,message:n?`<${n.name}${n.values&&n.values.id?` id="${n.values.id}"`:``}>: ${t.message}`:t.message,offset:n&&n.nameStart>=0?n.nameStart:-1,length:n&&n.nameStart>=0?n.nameEnd-n.nameStart:0,uid:n?n.uid:0});return r.locate(e&&e.lineIndex),r}function go(e,t={}){let n=mo(),r=Un(e),i=mo(),a={parse:i-n,build:0,flatten:0};if(!r.ok)return{ok:!1,doc:r,graph:null,scene:null,cache:t.cache||null,diagnostics:r.diagnostics,timings:a};let o=t.cache||new fo,s=wa(r,o,t),c=mo(),l=Za(s,{time:t.time||0,progress:t.progress||0}),u=mo();a.build=c-i,a.flatten=u-c;let d=s.diagnostics.map(e=>ho(r,e)),f=[...r.diagnostics,...d];return{ok:!f.some(e=>e.severity===`error`),doc:r,graph:s,scene:l,cache:o,diagnostics:f,timings:a}}function _o(e,t,n,r,i,a,o,s,c,l){let u=o-e,d=s-t,f=c-n,p=u*r+d*i+f*a,m=u*u+d*d+f*f-p*p;if(m>l*l)return 1/0;let h=Math.sqrt(l*l-m),g=p-h;return p+h<0?1/0:g<0?0:g}function vo(e,t,n){let r=-1/0,i=1/0;for(let a=0;a<3;a++){let o=1e-6+(n.max[a]-n.min[a])*1e-4,s=n.min[a]-o,c=n.max[a]+o;if(Math.abs(t[a])<1e-20){if(e[a]<s||e[a]>c)return!1}else{let n=(s-e[a])/t[a],o=(c-e[a])/t[a];if(n>o&&([n,o]=[o,n]),r=Math.max(r,n),i=Math.min(i,o),r>i)return!1}}return i>=0}var yo=-1;function bo(e,t,n,r,i=0){let a=n.positions,o=n.indices,s=r;yo=-1;for(let n=0;n<o.length;n+=3){let r=o[n]*3,c=o[n+1]*3,l=o[n+2]*3,u=a[c]-a[r],d=a[c+1]-a[r+1],f=a[c+2]-a[r+2],p=a[l]-a[r],m=a[l+1]-a[r+1],h=a[l+2]-a[r+2],g=t[1]*h-t[2]*m,_=t[2]*p-t[0]*h,v=t[0]*m-t[1]*p,y=u*g+d*_+f*v;if(Math.abs(y)<1e-18||i&&y*i<0)continue;let b=1/y,x=e[0]-a[r],S=e[1]-a[r+1],C=e[2]-a[r+2],w=(x*g+S*_+C*v)*b;if(w<0||w>1)continue;let T=S*f-C*d,E=C*u-x*f,D=x*d-S*u,O=(t[0]*T+t[1]*E+t[2]*D)*b;if(O<0||w+O>1)continue;let k=(p*T+m*E+h*D)*b;k>1e-9&&k<s&&(s=k,yo=n)}return s}function xo(e,t,n,r,i={}){if(e&&e.parts)return So(e,t,n,r,i);let{isVisible:a=null,maxDistance:o=1/0,skipFlags:s=0,facing:c=!1}=i,l=[],u=e.spheres;for(let t=0;t<e.count;t++){if(s&&e.flags[t]&s||a&&!a(t)||e.geometries[e.geom[t]].kind!==`triangles`)continue;let i=_o(n[0],n[1],n[2],r[0],r[1],r[2],u[t*4],u[t*4+1],u[t*4+2],u[t*4+3]);i<o&&l.push([i,t])}l.sort((e,t)=>e[0]-t[0]);let d=o,f=-1,p=-1,m=[0,0,0],h=new Float64Array(16),g=new Float64Array(16),_=[0,0,0],v=[0,0,0];for(let[i,a]of l){if(i>d)break;for(let t=0;t<16;t++)h[t]=e.matrices[a*16+t];if(!ht(g,h))continue;_t(_,g,n[0],n[1],n[2]),vt(v,g,r[0],r[1],r[2]);let o=e.geometries[e.geom[a]];if(o.bounds&&!vo(_,v,o.bounds))continue;let s=t(o,0),l=e.materials[e.mat[a]],u=o.doubleSided||l&&l.doubleSided,y=c&&!u?e.flags[a]&1?-1:1:0,b=bo(_,v,s,d,y);if(b<d){d=b,f=a,p=yo;let e=s.positions,t=s.indices,n=t[p]*3,r=t[p+1]*3,i=t[p+2]*3,o=[e[r]-e[n],e[r+1]-e[n+1],e[r+2]-e[n+2]],c=[e[i]-e[n],e[i+1]-e[n+1],e[i+2]-e[n+2]],l=[o[1]*c[2]-o[2]*c[1],o[2]*c[0]-o[0]*c[2],o[0]*c[1]-o[1]*c[0]];for(let e=0;e<3;e++)m[e]=g[e*4]*l[0]+g[e*4+1]*l[1]+g[e*4+2]*l[2]}}if(f<0)return null;let y=Math.hypot(m[0],m[1],m[2])||1,b=m[0]*r[0]+m[1]*r[1]+m[2]*r[2]>0?-1:1;return{index:f,uid:e.uid[f],distance:d,point:[n[0]+r[0]*d,n[1]+r[1]*d,n[2]+r[2]*d],normal:[m[0]/y*b,m[1]/y*b,m[2]/y*b]}}function So(e,t,n,r,i){let a=null;for(let o of e.parts){if(!o.scene||!o.visible)continue;let e=o.scene,s=i.isVisible?t=>i.isVisible(t,e):null,c=a?a.distance:i.maxDistance??1/0,l=xo(e,t,n,r,{...i,isVisible:s,maxDistance:c});l&&(!a||l.distance<a.distance)&&(a={...l,part:o})}return a}function Co(e,t,n,r,i=null){return xo(e,t,n,r,{isVisible:i})}function wo(e,t){let n=[],r=e&&e.byUid.get(t);for(;r;){let e=r.values&&(r.values.name||r.values.id);e&&n.push(e),r=r.parent}return n}var To=()=>({min:[-1,-1,-1],max:[1,1,1]}),Eo=class{constructor(e,t=`fragment`){this.id=e,this.kind=t,this.scene=null,this.geomMap=null,this.matMap=null,this.visible=!0,this.selectable=t===`host`}get drawn(){return!!(this.scene&&this.visible)}},Do=class{constructor(){this.parts=[],this.host=null,this.geometries=[],this.geomIndex=new Map,this.geomUsers=[],this.freeGeometries=[],this.materials=[],this.matIndex=new Map,this.matUsers=[],this.freeMaterials=[],this.released=[],this.version=0,this.boundsDirty=!0,this.cachedBounds=To()}insert(e){if(e.kind===`host`){if(this.host)throw Error(`A scene set has one host.`);this.host=e,this.parts.unshift(e)}else this.parts.push(e);return this.changed(),e}remove(e){let t=this.parts.indexOf(e);return t<0?!1:(this.unplace(e),this.parts.splice(t,1),e===this.host&&(this.host=null),this.changed(),!0)}place(e,t){let n=new Uint32Array(t.geometries.length);for(let e=0;e<t.geometries.length;e++)n[e]=this.useGeometry(t.geometries[e]);let r=new Uint32Array(t.materials.length);for(let e=0;e<t.materials.length;e++)r[e]=this.useMaterial(t.materials[e]);this.unplace(e),e.scene=t,e.geomMap=n,e.matMap=r,this.changed()}unplace(e){if(e.scene){for(let t of e.geomMap)this.dropGeometry(t);for(let t of e.matMap)this.dropMaterial(t);e.scene=null,e.geomMap=null,e.matMap=null,this.changed()}}setVisible(e,t){let n=!!t;e.visible!==n&&(e.visible=n,this.changed())}changed(){this.version++,this.boundsDirty=!0}invalidateBounds(){this.boundsDirty=!0}useGeometry(e){let t=this.geomIndex.get(e);return t===void 0&&(t=this.freeGeometries.length?this.freeGeometries.pop():this.geometries.length,this.geometries[t]=e,this.geomUsers[t]=0,this.geomIndex.set(e,t)),this.geomUsers[t]++,t}dropGeometry(e){if(--this.geomUsers[e]>0)return;let t=this.geometries[e];this.geomIndex.delete(t),this.geometries[e]=null,this.freeGeometries.push(e),this.released.push(t)}useMaterial(e){let t=this.matIndex.get(e.key);return t===void 0&&(t=this.freeMaterials.length?this.freeMaterials.pop():this.materials.length,this.materials[t]=new ca(e.params,t,e.name),this.matUsers[t]=0,this.matIndex.set(e.key,t)),this.matUsers[t]++,t}dropMaterial(e){--this.matUsers[e]>0||(this.matIndex.delete(this.materials[e].key),this.materials[e]=null,this.freeMaterials.push(e))}takeReleased(){let e=this.released;return this.released=[],e}drawnParts(){let e=[];for(let t of this.parts)t.scene&&t.visible&&e.push(t);return e}get count(){let e=0;for(let t of this.parts)t.scene&&t.visible&&(e+=t.scene.count);return e}get bounds(){if(!this.boundsDirty)return this.cachedBounds;let e=[1/0,1/0,1/0],t=[-1/0,-1/0,-1/0];for(let n of this.parts){if(!n.scene||!n.visible||!n.scene.count)continue;let r=n.scene.bounds;for(let n=0;n<3;n++)r.min[n]<e[n]&&(e[n]=r.min[n]),r.max[n]>t[n]&&(t[n]=r.max[n])}return this.cachedBounds=e[0]<=t[0]?{min:e,max:t}:To(),this.boundsDirty=!1,this.cachedBounds}get lights(){let e=this.parts;if(e.length===1&&e[0].scene&&e[0].visible)return e[0].scene.lights;let t=[];for(let n of e)if(n.scene&&n.visible)for(let e of n.scene.lights)t.push(e);return t}get animation(){let e={time:!1,scroll:!1};for(let t of this.parts)t.scene&&t.visible&&(t.scene.animation.time&&(e.time=!0),t.scene.animation.scroll&&(e.scroll=!0));return e}get environment(){return this.host&&this.host.scene?this.host.scene.environment:null}get controls(){return this.host&&this.host.scene?this.host.scene.controls:null}get cameras(){return this.host&&this.host.scene?this.host.scene.cameras:[]}},Oo=`STAGE_HOST_ONLY`,ko={environment:`the environment`,camera:`a camera`,controls:`the controls`};function Ao(e){let t=e&&e.doc;if(!t||!t.root)return[];let n=[],r=e=>{if(e.unknown)return;let i=ko[e.name];i&&n.push(ho(t,{severity:`warning`,phase:`render`,code:Oo,message:`A fragment cannot set ${i}: the stage's document does. This element is ignored.`,element:e}));for(let t of e.children)t.type===`element`&&r(t)};return r(t.root),n}var jo=[`severity`,`phase`,`code`,`message`,`offset`,`length`,`suggestion`,`hint`,`path`,`line`,`column`,`uid`];function Mo(e){let t={};for(let n of jo)t[n]=e[n]===void 0?null:e[n];return t}function No(e){let t=new l(e);return t.line=e.line??0,t.column=e.column??0,t}var Po=[`triangles`,`lines`],Fo=e=>Math.max(0,Po.indexOf(e)),Io=(e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0},Lo=(e,t)=>e.kind===t.kind&&Io(e.indices,t.indices)&&Io(e.positions,t.positions)&&Io(e.normals,t.normals)&&Io(e.uvs,t.uvs);function Ro(e,t,n){let r=e.length,i=e.reduce((e,t)=>Math.max(e,t.lods),1),a=Array(r),o=Array(r),s=new Uint8Array(r),c=new Uint8Array(r),l=new Uint8Array(r),u=new Float64Array(r*6),d=new Float64Array(r*i),f=new Uint8Array(r),p=new Int32Array(r*i).fill(-1),m=[],h=[],g=[];e.forEach((e,r)=>{a[r]=e.key,o[r]=e.identity,s[r]=e.lods,l[r]=Fo(e.kind),c[r]=+!!e.doubleSided|(e.bounds?2:0),e.bounds&&u.set([...e.bounds.min,...e.bounds.max],r*6),f[r]=Math.min(e.lodDeviation.length,i);for(let t=0;t<f[r];t++)d[r*i+t]=e.lodDeviation[t];let _=`${t.quality}:${e.key}`;if(n&&n.has(_))return;let v=null;for(let n=0;n<e.lods;n++){let a=t.mesh(e,n);e.reports[n]&&m.push([r,n,e.reports[n]]),e.failedLods&1<<n&&h.push([r,n]),v&&Lo(v,a)?p[r*i+n]=p[r*i+n-1]:(p[r*i+n]=g.length,g.push(a),v=a)}n&&n.add(_)});let _=new Uint32Array(g.length*8),v=new Uint8Array(g.length),y=[0,0,0,0];g.forEach((e,t)=>{[e.positions,e.normals,e.uvs,e.indices].forEach((e,n)=>{_[t*8+n*2]=y[n],_[t*8+n*2+1]=e.length,y[n]+=e.length}),v[t]=Fo(e.kind)});let b=new Float32Array(y[0]),x=new Float32Array(y[1]),S=new Float32Array(y[2]),C=new Uint32Array(y[3]);return g.forEach((e,t)=>{b.set(e.positions,_[t*8]),x.set(e.normals,_[t*8+2]),S.set(e.uvs,_[t*8+4]),C.set(e.indices,_[t*8+6])}),{columns:{keys:a,identities:o,lods:s,flags:c,kinds:l,bounds:u,deviation:d,devLength:f,levels:p,maxLods:i,reports:m,failed:h},packed:{table:_,meshKinds:v,positions:b,normals:x,uvs:S,indices:C},buffers:[s,c,l,u,d,f,p,_,v,b,x,S,C].map(e=>e.buffer)}}function zo(e){let{table:t,meshKinds:n,positions:r,normals:i,uvs:a,indices:o}=e,s=Array(n.length);for(let e=0;e<s.length;e++){let c=e*8;s[e]=new Y({positions:r.subarray(t[c],t[c]+t[c+1]),normals:i.subarray(t[c+2],t[c+2]+t[c+3]),uvs:a.subarray(t[c+4],t[c+4]+t[c+5]),indices:o.subarray(t[c+6],t[c+6]+t[c+7]),kind:Po[n[e]]})}return s}var Bo=e=>{let t=e.params;return!!(t.map||t.normalMap||t.occlusionMap||t.metallicRoughnessMap||t.emissiveMap)},Vo=e=>e.byteOffset===0&&e.byteLength===e.buffer.byteLength?e:e.slice();function Ho(e,t={}){let n=new fo;t.quality&&(n.quality=t.quality);let r=go(e,{cache:n,time:t.time||0,progress:t.progress||0}),i=r.doc&&r.doc.lineIndex,a={ok:r.ok,diagnostics:r.diagnostics.map(Mo),hostOnly:r.ok?Ao(r).map(Mo):[],timings:r.timings,lineText:i&&typeof i.text==`string`&&i.text!==e?i.text:null,lineIndex:!!i};if(!r.ok)return{message:a,transfer:[]};let o=r.scene;if(o.dynamic.length||o.materials.some(Bo))return{message:{...a,main:!0},transfer:[]};let s=new Set,c=e=>{let t=Vo(e);return s.add(t.buffer),t},l=o.count,u={count:l,matrices:c(o.matrices.slice(0,l*16)),geom:c(o.geom.slice(0,l)),mat:c(o.mat.slice(0,l)),uid:c(o.uid.slice(0,l)),lodNode:c(o.lodNode.slice(0,l)),lodChild:c(o.lodChild.slice(0,l)),flags:c(o.flags.slice(0,l)),spheres:c(o.spheres.slice(0,l*4))},d=t.sent,f=Ro(o.geometries,n,d);for(let e of f.buffers)s.add(e);return{message:{...a,scene:{rows:u,geometries:f.columns,meshes:f.packed,materials:o.materials.map(e=>({params:e.params,name:e.name})),lights:o.lights,cameras:o.cameras,lodSwitches:o.lodSwitches,environment:o.environment,controls:o.controls,animation:o.animation,bounds:o.bounds}},transfer:[...s]}}var Uo=class{constructor(e){this.as=e.as||`fragment`,this.source=e.source,this.payload=e.payload||null,this.result=e.result||null,this.owner=e.owner??null,this.used=!1;let t=this.payload;t?(this.ok=t.ok,this.documentDiagnostics=t.diagnostics.map(No),this.hostOnly=t.hostOnly.map(No),this.timings=t.timings,this.lineText=t.lineText,this.hasLineIndex=t.lineIndex):(this.ok=this.result.ok,this.documentDiagnostics=this.result.diagnostics,this.hostOnly=e.hostOnly||[],this.timings=this.result.timings,this.lineText=null,this.hasLineIndex=!!(this.result.doc&&this.result.doc.lineIndex)),this.lineIndexCache=void 0}get diagnostics(){return this.as===`fragment`?[...this.documentDiagnostics,...this.hostOnly]:this.documentDiagnostics}get lineIndex(){if(this.lineIndexCache!==void 0)return this.lineIndexCache;if(this.result&&this.result.doc)return this.lineIndexCache=this.result.doc.lineIndex;let e=this.lineText||(typeof this.source==`string`?this.source:null);return this.lineIndexCache=this.hasLineIndex&&e?new s(e):null}};function Wo(e,t,n,r){let i=e.scene,a=new Oa(1),o=i.rows;a.count=o.count,a.capacity=o.count,a.matrices=o.matrices,a.geom=o.geom,a.mat=o.mat,a.uid=o.uid,a.lodNode=o.lodNode,a.lodChild=o.lodChild,a.flags=o.flags,a.spheres=o.spheres;let s=i.geometries,c=zo(i.meshes),l=s.maxLods,u=new Map(s.reports.map(([e,t,n])=>[e*l+t,n])),d=new Set(s.failed.map(([e,t])=>e*l+t));t.beginBuild(n);for(let e=0;e<s.keys.length;e++){let n=s.keys[e],i=Array.from(s.deviation.subarray(e*l,e*l+s.devLength[e])),o=s.bounds,f={key:n,identity:s.identities[e],kind:Po[s.kinds[e]],lods:s.lods[e],doubleSided:!!(s.flags[e]&1),bounds:s.flags[e]&2?{min:[o[e*6],o[e*6+1],o[e*6+2]],max:[o[e*6+3],o[e*6+4],o[e*6+5]]}:null,lodDeviation:i,generate:(e,t,i)=>r(n).generate(e,t,i)},p=t.acquire(f,null);for(let n=0;n<f.lods;n++){let r=s.levels[e*l+n];r<0||p.meshes[n]||(d.has(e*l+n)&&(p.failed=!0,p.failedLods|=1<<n),t.adopt(p,n,c[r],u.get(e*l+n)||null))}a.geometryIndex(p)}return t.endBuild(),a.materials=i.materials.map((e,t)=>new ca(e.params,t,e.name)),a.lights=i.lights,a.cameras=i.cameras,a.lodSwitches=i.lodSwitches,a.environment=i.environment,a.controls=i.controls,a.animation=i.animation,a.bounds=i.bounds,a.version=1,a}var Go=e=>!!e&&typeof e.then==`function`,Ko=class{constructor(e,t){this.stage=e,this.id=t,this.part=new Eo(t,`fragment`),this.result=null,this.owner=null,this.source=null,this.warnings=[],this.tasks=[],this.removed=!1,this.time=NaN,this.progress=NaN,this.ready=null}get placed(){return!!this.part.scene}get visible(){return this.part.visible}set visible(e){this.removed||(this.stage.set.setVisible(this.part,e),this.stage.changed=!0)}get diagnostics(){return this.result?[...this.result.diagnostics,...this.warnings]:[]}replace(e,t={}){return this.removed?Promise.resolve({ok:!1,diagnostics:[],fragment:this.id,removed:!0}):(this.ready=this.stage.enqueue(this,e,!!t.immediate),this.ready)}setTransforms(e){let t=Array.from(e||[]);if(this.removed||!this.result)return t.map(()=>!1);let n=this.stage.materialize(this),r=n.graph.byId,i=t.map(e=>r.get(Array.isArray(e)?e[0]:e&&e.id)),a=t.map(e=>Array.isArray(e)?e[1]:e&&e.matrix),{time:o,progress:s}=this.stage.clock(),c=oo(n.scene,n.graph,i,a,o,s);return c.some(Boolean)&&(this.stage.set.invalidateBounds(),this.stage.changed=!0),c}setTransform(e,t){return this.setTransforms([[e,t]])[0]===!0}remove(){this.stage.removeFragment(this)}},qo=class{constructor(e={}){this.cache=e.cache||new fo,this.clock=e.clock||(()=>({time:0,progress:0})),this.report=e.report||null,this.compiler=e.compiler||null,this.forget=e.forget||null,this.restore=e.restore||null,this.now=e.now||mo,this.set=new Do,this.host=this.set.insert(new Eo(null,`host`)),this.hostResult=null,this.hostOwner=uo,this.byId=new Map,this.queue=[],this.waiting=0,this.nextId=1,this.changed=!1}get list(){return[...this.byId.values()]}get queued(){return this.queue.length}get pending(){return this.queue.length>0}takeChanged(){let e=this.changed;return this.changed=!1,e}newOwner(e){return{owner:e}}setHost(e,t){this.set.place(this.host,e.scene),this.adoptHost(e,t)}adoptHost(e,t){this.hostOwner!==t&&this.release(this.hostOwner),this.hostResult=e,this.hostOwner=t,this.changed=!0}release(e){e!=null&&(this.cache.release(e),this.forget&&e!==`document`&&this.forget(e))}fromPrepared(e,t=`fragment`){if(e.used)throw Error(`A prepared document can be shown or added once; prepare it again.`);if(e.used=!0,e.claimed=!0,!e.ok)return{result:{ok:!1,doc:null,graph:null,scene:null,cache:this.cache,diagnostics:e.documentDiagnostics,timings:e.timings,lineIndex:e.lineIndex},owner:null};if(e.result)return{result:e.result,owner:e.owner};let n=this.newOwner(t);if(e.payload.main){let{time:t,progress:r}=this.clock();return{result:go(e.source,{cache:this.cache,owner:n,time:t,progress:r}),owner:n}}let r=e.source,i=this.cache,a=null,o=Wo(e.payload,i,n,e=>{a||(a=new fo,a.quality=i.quality,go(r,{cache:a}));let t=a.entries.get(e);if(!t)throw Error(`The document has no geometry ${e}.`);return t.desc});e.payload=null;let s=null;return{result:{ok:!0,scene:o,cache:i,graph:null,diagnostics:e.documentDiagnostics,timings:e.timings,prepared:!0,source:r,get doc(){return s||=Un(r),s}},owner:n}}add(e,t={}){let n=t.id==null?null:String(t.id);if(n===null){for(;this.byId.has(`fragment-${this.nextId}`);)this.nextId++;n=`fragment-${this.nextId++}`}if(this.byId.has(n))throw Error(`The stage has a fragment "${n}" already. Replace it, or remove it first.`);let r=new Ko(this,n);return this.byId.set(n,r),this.set.insert(r.part),r.ready=this.enqueue(r,e,!!t.immediate),r}enqueue(e,t,n){this.claim(t);let r,i=new Promise(e=>r=e),a={frag:e,input:t,ready:!Go(t),cancelled:!1,finished:!1,immediate:n,placing:null,resolve:null};a.resolve=e=>{a.finished=!0,r(e)};for(let t of e.tasks)this.cancel(t),i.then(t.resolve);return e.tasks=[a],Go(t)&&(this.waiting++,t.then(e=>{a.input=e},e=>{a.input=null,a.error=e}).then(()=>{this.waiting--,a.ready=!0,a.cancelled&&this.discard(a.input)})),n&&a.ready?this.run(a):this.queue.push(a),i}claim(e){if(e instanceof Uo){if(e.claimed)throw Error(`A prepared document can be shown or added once; prepare it again.`);e.claimed=!0}}cancel(e){e.cancelled=!0,e.finished=!0,e.placing&&this.release(e.placing.owner);let t=this.queue.indexOf(e);t>=0&&this.queue.splice(t,1),e.ready&&this.discard(e.input)}discard(e){e instanceof Uo&&!e.used&&e.owner&&(e.used=!0,this.release(e.owner))}applyQueued(e=1/0){let t=this.now(),n=0,r=0;for(;this.queue.length&&!(n&&this.now()-t>=e);){let e=this.queue.findIndex(e=>e.ready);if(e<0)break;let t=this.queue.splice(e,1)[0];r+=this.run(t),n++}return{applied:n,changeMs:n?this.now()-t:0,compileMs:r}}run(e){let t=e.frag;if(t.tasks=t.tasks.filter(t=>t!==e),e.cancelled||t.removed)return 0;if(e.placing){let n=e.placing;return e.placing=null,this.place(t,n.result,n.owner,n.warnings,n.input),e.resolve({ok:!0,diagnostics:t.diagnostics,fragment:t.id}),0}let n=this.now(),r,i,a,o,s=e.input;try{if(s instanceof Uo)({result:r,owner:i}=this.fromPrepared(s,`fragment`)),a=r.ok?s.hostOnly:[],o=s.lineIndex;else if(s==null)r={ok:!1,diagnostics:[],error:e.error};else{i=this.newOwner(`fragment`);let{time:e,progress:t}=this.clock();r=go(s,{cache:this.cache,owner:i,time:e,progress:t}),a=r.ok?Ao(r):[]}}catch(e){r={ok:!1,diagnostics:[],error:e}}let c=this.now()-n;if(!r.ok){i&&this.release(i);let n=r.error?String(r.error&&r.error.message?r.error.message:r.error):Gn({diagnostics:r.diagnostics,lineIndex:o||r.doc&&r.doc.lineIndex});return this.report&&this.report(n,{...r,fragment:t.id}),e.resolve({ok:!1,diagnostics:r.diagnostics,fragment:t.id}),c}let l=this.restore&&!e.immediate&&!r.prepared?this.restore(this.cache,i):null;return l?(e.placing={result:r,owner:i,warnings:a,input:s},e.ready=!1,t.tasks.push(e),this.queue.push(e),this.waiting++,Promise.resolve(l).catch(()=>{}).then(()=>{this.waiting--,e.ready=!0}),c):(this.place(t,r,i,a,s),e.resolve({ok:!0,diagnostics:t.diagnostics,fragment:t.id}),c)}place(e,t,n,r,i,a=!1){let o=e.owner;this.set.place(e.part,t.scene),e.result=t,e.owner=n,e.source=i instanceof Uo?i.source:i,e.warnings=r||[];let{time:s,progress:c}=this.clock();e.time=s,e.progress=c,o&&o!==n&&this.release(o),this.changed=!0,!a&&e.warnings.length&&this.report&&this.report(Gn({diagnostics:e.warnings,lineIndex:t.doc&&!t.prepared?t.doc.lineIndex:null}),{ok:!0,diagnostics:e.warnings,fragment:e.id})}materialize(e){let t=e.result;if(t.graph)return t;let n=this.newOwner(`fragment`),{time:r,progress:i}=this.clock(),a=go(e.source,{cache:this.cache,owner:n,time:r,progress:i});return this.place(e,a,n,e.warnings,e.source,!0),a}removeFragment(e){if(!e.removed){e.removed=!0;for(let t of e.tasks)this.cancel(t),t.resolve({ok:!1,diagnostics:[],fragment:e.id,removed:!0});e.tasks=[],this.set.remove(e.part),this.release(e.owner),e.owner=null,this.byId.delete(e.id),this.changed=!0}}clear(){for(let e of this.list)this.removeFragment(e)}prepare(e,t={}){let n=t.as===`document`?`document`:`fragment`,{time:r,progress:i}=this.clock(),a=()=>{let t=this.newOwner(n),a=go(e,{cache:this.cache,owner:t,time:r,progress:i});return a.ok||this.release(t),new Uo({as:n,source:e,result:a,owner:a.ok?t:null,hostOnly:a.ok?Ao(a):[]})};return this.compiler?this.compiler.compile(e,{time:r,progress:i,quality:this.cache.quality}).then(t=>t?new Uo({as:n,source:e,payload:t}):a()):Promise.resolve(a())}updateDynamic(e,t){let n=!1;for(let r of this.byId.values()){let i=r.result;i&&r.part.drawn&&i.scene.dynamic.length&&i.graph&&(r.time!==e||r.progress!==t)&&(so(i.scene,i.graph,e,t),r.time=e,r.progress=t,n=!0)}return n&&this.set.invalidateBounds(),n}names(e,t){if(!e||e===this.host)return wo(this.hostResult&&this.hostResult.doc,t);let n=this.byId.get(e.id);return n&&n.result?wo(n.result.doc,t):[]}dispose(){this.clear(),this.compiler&&this.compiler.dispose&&this.compiler.dispose()}},Jo=class{constructor(e,t,n){this.Type=e,this.stride=t,this.chunks=[{start:0,length:n,data:new e(n*t)}],this.capacity=n}reserve(e){if(e<=this.capacity)return!1;let t=Math.max(1,this.capacity);for(;t<e;)t*=2;let n=t-this.capacity;return this.chunks.push({start:this.capacity,length:n,data:new this.Type(n*this.stride)}),this.capacity=t,!0}forEach(e,t,n){let r=this.stride;for(let i of this.chunks){let a=Math.max(e,i.start),o=Math.min(t,i.start+i.length);a<o&&n(a,i.data.subarray((a-i.start)*r,(o-i.start)*r))}}},Yo=class{constructor(e=65536,t=1<<17){this.vertexStore=new Jo(Float32Array,8,e),this.indexStore=new Jo(Uint32Array,1,t),this.vertexCount=0,this.indexCount=0,this.ranges=new Map,this.edgeRanges=new Map,this.normalRanges=new Map,this.generation=0,this.uploadedVertices=0,this.uploadedIndices=0}get vertexCapacity(){return this.vertexStore.capacity}get indexCapacity(){return this.indexStore.capacity}get vertexCapacityBytes(){return this.vertexStore.capacity*32}get indexCapacityBytes(){return this.indexStore.capacity*4}reset(){this.vertexCount=0,this.indexCount=0,this.ranges.clear(),this.edgeRanges.clear(),this.normalRanges.clear(),this.generation++,this.uploadedVertices=0,this.uploadedIndices=0}get byteSize(){return this.vertexCount*32+this.indexCount*4}ensure(e,t){this.vertexStore.reserve(this.vertexCount+e),this.indexStore.reserve(this.indexCount+t)}appendVertices(e){let t=e.vertexCount,n=this.vertexCount,r=e.positions,i=e.normals,a=e.uvs;return this.vertexStore.forEach(n,n+t,(e,t)=>{let o=t.length/8,s=0;for(let c=e-n,l=c+o;c<l;c++)t[s]=r[c*3],t[s+1]=r[c*3+1],t[s+2]=r[c*3+2],t[s+3]=i[c*3],t[s+4]=i[c*3+1],t[s+5]=i[c*3+2],t[s+6]=a[c*2],t[s+7]=a[c*2+1],s+=8}),this.vertexCount+=t,n}appendIndices(e,t){let n=this.indexCount;return this.indexStore.forEach(n,n+e.length,(r,i)=>{let a=r-n;for(let n=0;n<i.length;n++)i[n]=e[a+n]+t}),this.indexCount+=e.length,n}forEachVertices(e,t,n){this.vertexStore.forEach(e,t,n)}forEachIndices(e,t,n){this.indexStore.forEach(e,t,n)}meshRange(e){let t=this.ranges.get(e);if(t)return t;this.ensure(e.vertexCount,e.indices.length);let n=this.appendVertices(e);return t={firstIndex:this.appendIndices(e.indices,n),indexCount:e.indices.length,baseVertex:n,kind:e.kind},this.ranges.set(e,t),t}edgeRange(e){let t=this.edgeRanges.get(e);if(t)return t;let n=this.meshRange(e).baseVertex,r=e.edges();return this.ensure(0,r.length),t={firstIndex:this.appendIndices(r,n),indexCount:r.length,kind:`lines`},this.edgeRanges.set(e,t),t}normalRange(e){let t=this.normalRanges.get(e);if(t)return t;let n=e.normalLines();return t=this.meshRange(n),this.normalRanges.set(e,t),t}pending(){return{full:this.uploadedVertices===0&&this.uploadedIndices===0,vertexStart:this.uploadedVertices,vertexEnd:this.vertexCount,indexStart:this.uploadedIndices,indexEnd:this.indexCount}}markUploaded(){this.uploadedVertices=this.vertexCount,this.uploadedIndices=this.indexCount}};function Xo(e,t,n){return Math.sqrt(e*e+t*t+n*n)}function Zo(e,t){let n=e.aspect||1,r=Math.tan(e.verticalFov(n)/2);return{orthographic:e.type===`orthographic`,ppuFactor:e.pixelsPerUnit(1,t),view:e.view,cornerStretch:1+r*r*(1+n*n)}}function Qo(e,t,n,r,i){if(e.orthographic)return e.ppuFactor;let a=e.view,o=-(a[2]*t+a[6]*n+a[10]*r+a[14]),s=o>0?Math.min(i*i/(o*o),e.cornerStretch):e.cornerStretch;return e.ppuFactor*s/Math.max(i,1e-6)}function $o(e,t){for(let n=t+1;n<e.length;n++)if(e[n])return n;for(let n=t-1;n>=0;n--)if(e[n])return n;return e.length-1}function es(e,t){let n=t*16,r=0;for(let t=0;t<3;t++){let i=Xo(e[n+t*4],e[n+t*4+1],e[n+t*4+2]);i>r&&(r=i)}return r||1}function ts(e,t,n,r,i){if(!(t>1)||!e)return 0;let a=1/(i>0?i:1),o=n*r,s=0,c=Math.min(t,e.length)-1;for(let t=c;t>=1;t--)if(e[t]*o<=a){s=t;break}return s}function ns(e){let t=t=>[e[t],e[4+t],e[8+t],e[12+t]],n=t(0),r=t(1),i=t(3),a=t(2),o=[[i[0]+n[0],i[1]+n[1],i[2]+n[2],i[3]+n[3]],[i[0]-n[0],i[1]-n[1],i[2]-n[2],i[3]-n[3]],[i[0]+r[0],i[1]+r[1],i[2]+r[2],i[3]+r[3]],[i[0]-r[0],i[1]-r[1],i[2]-r[2],i[3]-r[3]],[i[0]-a[0],i[1]-a[1],i[2]-a[2],i[3]-a[3]]];for(let e of o){let t=Math.hypot(e[0],e[1],e[2])||1;e[0]/=t,e[1]/=t,e[2]/=t,e[3]/=t}return o}var rs=class{constructor(){this.instanceData=new Float32Array(16384),this.keys=new Int32Array(1024),this.lods=new Uint8Array(1024),this.last=null,this.lastSignature=``}ensure(e){if(this.instanceData.length<e*16){let t=this.instanceData.length/16;for(;t<e;)t*=2;this.instanceData=new Float32Array(t*16)}if(this.keys.length<e){let t=this.keys.length;for(;t<e;)t*=2;this.keys=new Int32Array(t),this.lods=new Uint8Array(t)}}lodStates(e,t,n){let r=e.lodSwitches,i=new Int32Array(r.length),a=new Uint8Array(r.length);for(let e=0;e<r.length;e++){let t=r[e],o=n(t.pos),s=0;for(;s<t.distances.length&&o>=t.distances[s];)s++;i[e]=s,a[e]=t.parent<0||a[t.parent]&&i[t.parent]===t.parentChild?1:0}return{active:i,visible:a}}build(e){let{scene:t,camera:n,pool:r,meshOf:i,options:a}=e,o=t.parts?t.drawnParts():[{scene:t,geomMap:null,matMap:null,selectable:!0}],s=0;for(let e of o)s+=e.scene.count;let c=0;if(a.selection&&a.selection.size)for(let e of o){if(!e.selectable)continue;let t=e.scene;for(let e=0;e<t.count;e++)a.selection.has(t.uid[e])&&c++}this.ensure(s+(a.bbox?s:0)+c+64);let l=n.position,u=e=>Math.hypot(e[0]-l[0],e[1]-l[1],e[2]-l[2]),d=a.culling===!1?null:ns(n.viewProj),f=this.keys,p=this.lods,m=new Map,h=[],g=t.geometries,_=t.materials,v=Math.max(1,_.length),y=[0,0,0,0],b=0,x=0,S=e.viewportHeight,C=a.lodBias||1,w=a.autoLod===!1?a.fixedLod||0:-1,T=Zo(n,S),E=0;for(let e of o){let t=e.scene,n=e.geomMap,r=e.matMap,i=t.count,a=this.lodStates(t,l,u),o=t.spheres;for(let e=0;e<i;e++){let i=E+e;f[i]=-1;let s=t.lodNode[e];if(s>=0&&!(a.visible[s]&&a.active[s]===t.lodChild[e]))continue;let c=o[e*4],u=o[e*4+1],S=o[e*4+2],D=o[e*4+3];if(d){let e=!1;for(let t=0;t<5;t++){let n=d[t];if(n[0]*c+n[1]*u+n[2]*S+n[3]<-D){e=!0;break}}if(e){x++;continue}}let O=n?n[t.geom[e]]:t.geom[e],k=g[O],A=0;if(k.lods>1){if(w>=0)A=Math.min(w,k.lods-1);else{let n=Qo(T,c,u,S,Xo(c-l[0],u-l[1],S-l[2]));A=ts(k.lodDeviation,k.lods,es(t.matrices,e),n,C)}}p[i]=A,y[A]++;let j=t.flags[e]&1,M=r?r[t.mat[e]]:t.mat[e],N=((O*4+A)*v+M)*2+j,P=m.get(N);if(P===void 0){P=h.length,m.set(N,P);let e=_[M];h.push({gi:O,entry:k,lod:A,mi:M,material:e,mirrored:!!j,count:0,firstInstance:0,depth:0,instances:null})}h[P].count++,f[i]=P,b++}E+=i}let D=a.tessellationBudget,O=D>=0&&D<1/0,k=O?performance.now():0,A=0,j=0,M=0;for(let e of h){let t=e.lod,n=e.entry.meshes;O&&n&&!n[t]&&(A&&performance.now()-k>=D?(t=$o(n,t),j++):A++);let a=i(e.entry,t);e.mesh=a,e.kind=a.kind,e.range=r.meshRange(a),e.doubleSided=!!(e.entry.doubleSided||e.material.doubleSided),e.transparent=e.material.transparent,e.kind===`triangles`&&(M+=e.range.indexCount/3*e.count)}let N=0,P=h.slice().sort((e,t)=>e.transparent===t.transparent?e.kind===t.kind?e.doubleSided===t.doubleSided?e.mirrored===t.mirrored?e.mi-t.mi:e.mirrored?1:-1:e.doubleSided?1:-1:e.kind===`triangles`?-1:1:e.transparent?1:-1);for(let e of P)e.firstInstance=N,N+=e.count,e.cursor=e.firstInstance;let F=this.instanceData,ee=[];E=0;for(let e of o){let t=e.scene,n=t.matrices,r=t.spheres;for(let e=0;e<t.count;e++){let t=f[E+e];if(t<0)continue;let i=h[t];if(i.transparent){ee.push({M:n,r:e,b:i,depth:-Xo(r[e*4]-l[0],r[e*4+1]-l[1],r[e*4+2]-l[2])});continue}let a=i.cursor++*16;for(let t=0;t<16;t++)F[a+t]=n[e*16+t]}E+=t.count}if(ee.length){ee.sort((e,t)=>e.depth-t.depth);for(let e of ee){let t=e.b,n=t.cursor++*16;for(let t=0;t<16;t++)F[n+t]=e.M[e.r*16+t];t.depth=Math.max(t.depth,-e.depth)}let e=P.filter(e=>!e.transparent),t=P.filter(e=>e.transparent).sort((e,t)=>t.depth-e.depth);P.length=0,P.push(...e,...t)}let te={wireframe:[],normals:[],bbox:null,selection:null};if(a.wireframe||a.normals)for(let e of P)e.kind===`triangles`&&(a.wireframe&&te.wireframe.push({range:r.edgeRange(e.mesh),firstInstance:e.firstInstance,count:e.count,mirrored:e.mirrored}),a.normals&&te.normals.push({range:r.normalRange(e.mesh),firstInstance:e.firstInstance,count:e.count}));let ne=(e,t,n)=>{let r=e.scene,i=g[e.geomMap?e.geomMap[r.geom[t]]:r.geom[t]].bounds,a=(i.min[0]+i.max[0])/2,o=(i.min[1]+i.max[1])/2,s=(i.min[2]+i.max[2])/2,c=Math.max(i.max[0]-i.min[0],1e-4),l=Math.max(i.max[1]-i.min[1],1e-4),u=Math.max(i.max[2]-i.min[2],1e-4),d=r.matrices.subarray(t*16,t*16+16);for(let e=0;e<3;e++)F[n+e]=d[e]*c,F[n+4+e]=d[4+e]*l,F[n+8+e]=d[8+e]*u,F[n+12+e]=d[e]*a+d[4+e]*o+d[8+e]*s+d[12+e];F[n+3]=0,F[n+7]=0,F[n+11]=0,F[n+15]=1};if(a.bbox){let e=N;E=0;for(let e of o){for(let t=0;t<e.scene.count;t++)f[E+t]<0||(ne(e,t,N*16),N++);E+=e.scene.count}te.bbox={firstInstance:e,count:N-e}}if(c){let e=N,t=a.selection;E=0;for(let e of o){let n=e.scene;if(e.selectable)for(let r=0;r<n.count;r++)t.has(n.uid[r])&&(f[E+r]<0&&n.lodNode[r]>=0||(ne(e,r,N*16),N++));E+=n.count}te.selection={firstInstance:e,count:N-e}}let re={batches:P,overlays:te,instanceData:this.instanceData,instanceCount:N,lights:t.lights,environment:t.environment,stats:{instances:s,visible:b,culled:x,batches:P.length,drawCalls:P.length+te.wireframe.length+te.normals.length+ +!!te.bbox+ +!!te.selection,triangles:M,lodHistogram:y,refining:j}};return this.last=re,re}},is=256;function as(e){return[Math.round(e[0]*255),Math.round(e[1]*255),Math.round(e[2]*255),Math.round((e[3]??1)*255)]}function os(e,t,n){let r=Math.max(0,Math.min(1,(n-e)/(t-e)));return r*r*(3-2*r)}function ss(e,t,n,r){let i=e*n,a=t*n,o=Math.floor(i),s=Math.floor(a),c=i-o,l=a-s,u=c*c*(3-2*c),d=l*l*(3-2*l),f=(e,t)=>Da((e%n+n)%n,(t%n+n)%n,r),p=f(o,s),m=f(o+1,s),h=f(o,s+1),g=f(o+1,s+1);return p+(m-p)*u+(h-p)*d+(p-m-h+g)*u*d}function cs(e,t,n,r){let i=0,a=.5,o=Math.max(1,Math.round(n)),s=0;for(let n=0;n<5;n++)i+=ss(e,t,o,r+n*17)*a,s+=a,a*=.5,o*=2;return i/s}function ls(e,t){let n=new Uint8ClampedArray(e*e*4);for(let r=0;r<e;r++)for(let i=0;i<e;i++){let a=t((i+.5)/e,(r+.5)/e),o=(r*e+i)*4;n[o]=a[0],n[o+1]=a[1],n[o+2]=a[2],n[o+3]=a[3]}return{width:e,height:e,data:n}}function us(e,t,n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n,e[3]+(t[3]-e[3])*n]}function ds(e,t=is){let n=e.params;switch(e.fn){case`checker`:{let e=as(n.color1),r=as(n.color2),i=Math.max(1,Math.round(n.count));return ls(t,(t,n)=>(Math.floor(t*i)+Math.floor(n*i))%2==0?e:r)}case`stripes`:{let e=as(n.color1),r=as(n.color2),i=Math.max(1,Math.round(n.count));return ls(t,t=>Math.floor(t*i*2)%2==0?e:r)}case`grid`:{let e=as(n.line),r=as(n.background),i=Math.max(1,Math.round(n.count)),a=n.width/2;return ls(t,(t,n)=>{let o=t*i%1,s=n*i%1,c=Math.min(o,1-o,s,1-s);return us(e,r,os(a*.6,a,c))})}case`noise`:{let e=as(n.color1),r=as(n.color2);return ls(t,(t,i)=>us(r,e,cs(t,i,n.scale,n.seed)))}case`bricks`:{let e=as(n.brick),r=as(n.mortar),i=Math.max(1,Math.round(n.count));return ls(t,(t,n)=>{let a=Math.floor(n*i),o=(t*i*.5+a%2*.5)%1,s=n*i%1,c=Math.min(o,1-o,s,1-s),l=.88+.24*Da(Math.floor(t*i*.5+a%2*.5),a,7),u=[e[0]*l,e[1]*l,e[2]*l,255];return us(r,u,os(.03,.06,c))})}default:throw Error(`unknown procedural texture ${e.fn}`)}}function fs(e){let t=e.params;switch(e.fn){case`bumps`:{let e=Math.max(1,Math.round(t.count));return(t,n)=>{let r=t*e%1-.5,i=n*e%1-.5,a=Math.hypot(r,i)*2.4;return a<1?Math.sqrt(1-a*a):0}}case`tiles`:{let e=Math.max(1,Math.round(t.count));return(n,r)=>{let i=n*e%1,a=r*e%1,o=Math.min(i,1-i,a,1-a);return os(t.gap*.5,t.gap*1.5,o)}}case`noise`:return(e,n)=>cs(e,n,t.scale,t.seed);case`waves`:{let e=Math.max(1,Math.round(t.count));return t=>.5+.5*Math.sin(t*e*Math.PI*2)}case`bricks`:{let e=Math.max(1,Math.round(t.count));return(t,n)=>{let r=Math.floor(n*e),i=(t*e*.5+r%2*.5)%1,a=n*e%1;return os(.02,.07,Math.min(i,1-i,a,1-a))}}default:throw Error(`unknown procedural normal map ${e.fn}`)}}function ps(e,t=is){let n=fs(e),r=e.params.strength??1,i=new Float32Array(t*t);for(let e=0;e<t;e++)for(let r=0;r<t;r++)i[e*t+r]=n((r+.5)/t,(e+.5)/t);let a=new Uint8ClampedArray(t*t*4),o=r*t*.02;for(let e=0;e<t;e++)for(let n=0;n<t;n++){let r=(e,n)=>i[(n+t)%t*t+(e+t)%t],s=(r(n+1,e)-r(n-1,e))*o,c=(r(n,e+1)-r(n,e-1))*o,l=-s,u=-c,d=1,f=Math.hypot(l,u,d);l/=f,u/=f,d/=f;let p=(e*t+n)*4;a[p]=Math.round((l*.5+.5)*255),a[p+1]=Math.round((u*.5+.5)*255),a[p+2]=Math.round((d*.5+.5)*255),a[p+3]=255}return{width:t,height:t,data:a}}function ms(e){let t=[e],n=e;for(;n.width>1||n.height>1;){let e=Math.max(1,n.width>>1),r=Math.max(1,n.height>>1),i=new Uint8ClampedArray(e*r*4);for(let t=0;t<r;t++)for(let r=0;r<e;r++)for(let a=0;a<4;a++){let o=0,s=0;for(let e=0;e<2;e++)for(let i=0;i<2;i++){let c=Math.min(n.width-1,r*2+i),l=Math.min(n.height-1,t*2+e);o+=n.data[(l*n.width+c)*4+a],s++}i[(t*e+r)*4+a]=o/s}n={width:e,height:r,data:i},t.push(n)}return t}async function hs(e){let t=await fetch(e);if(!t.ok)throw Error(`HTTP ${t.status} for ${e}`);let n=await t.blob(),r=await createImageBitmap(n),i=e=>Math.min(2048,2**Math.round(Math.log2(Math.max(1,e)))),a=i(r.width),o=i(r.height),s=(typeof OffscreenCanvas<`u`?new OffscreenCanvas(a,o):Object.assign(document.createElement(`canvas`),{width:a,height:o})).getContext(`2d`);return s.drawImage(r,0,0,a,o),{width:a,height:o,data:s.getImageData(0,0,a,o).data}}function gs(e,t){return e.kind===`procedural`?Promise.resolve(t===`normal`?ps(e):ds(e)):hs(e.url)}var _s=class{constructor(){this.entries=new Map,this.onReady=null,this.onError=null}get(e,t){let n=`${t}:${e.key}`,r=this.entries.get(n);return r||(r={id:n,spec:e,kind:t,status:`pending`,pixels:null,error:null,gpu:null},this.entries.set(n,r),gs(e,t).then(e=>{r.pixels=e,r.status=`ready`,this.onReady&&this.onReady(r)},e=>{r.status=`failed`,r.error=e,this.onError&&this.onError(r,e)}),r)}clear(e){for(let t of this.entries.values())t.gpu&&e&&e(t.gpu);this.entries.clear()}},vs=1216,ys={directional:0,point:1,spot:2,ambient:3,hemisphere:4},bs=[{type:`directional`,color:[1.1,1.08,1.04],direction:xs([-.45,-.85,-.35]),position:[0,0,0],range:0,outer:0,inner:0,ground:[0,0,0]},{type:`directional`,color:[.22,.25,.32],direction:xs([.6,-.2,.75]),position:[0,0,0],range:0,outer:0,inner:0,ground:[0,0,0]}];function xs(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function Ss(e,{viewProj:t,view:n,cameraPos:r,time:i,environment:a,lights:o,normalLength:s=.1,lineBias:c=.0015,viewportHeight:l=1}){e.fill(0),e.set(t,0),e.set(n,16),e[32]=r[0],e[33]=r[1],e[34]=r[2],e[35]=i||0;let u=Te(a.sky),d=Te(a.ground);e[36]=u[0],e[37]=u[1],e[38]=u[2],e[39]=a.intensity,e[40]=d[0],e[41]=d[1],e[42]=d[2],e[43]=a.exposure;let f=o&&o.length?o:bs,p=Math.min(f.length,16);e[44]=p,e[45]=s,e[46]=c,e[47]=l;for(let t=0;t<p;t++){let n=f[t],r=48+t*4,i=112+t*4,a=176+t*4,o=240+t*4;e[r]=n.position[0],e[r+1]=n.position[1],e[r+2]=n.position[2],e[r+3]=ys[n.type]??0,e[i]=n.direction[0],e[i+1]=n.direction[1],e[i+2]=n.direction[2],e[i+3]=n.range||0,e[a]=n.color[0],e[a+1]=n.color[1],e[a+2]=n.color[2],e[a+3]=n.outer||0,e[o]=Math.max(n.inner||0,(n.outer||0)+1e-4),e[o+1]=n.ground?n.ground[0]:0,e[o+2]=n.ground?n.ground[1]:0,e[o+3]=n.ground?n.ground[2]:0}return{data:e,lightCount:p,truncated:Math.max(0,f.length-16),usedDefaults:!(o&&o.length)}}function Cs(e){let t=Math.round(e[44]),n=``;for(let r=0;r<t;r++)n+=(r?`,`:``)+Math.round(e[48+r*4+3]);return n}function ws(e,t,{hasMap:n=!1,hasNormalMap:r=!1,hasMrMap:i=!1,hasOcclusionMap:a=!1,hasEmissiveMap:o=!1,doubleSided:s=!1}={}){return e.fill(0),e[0]=t.baseColor[0],e[1]=t.baseColor[1],e[2]=t.baseColor[2],e[3]=t.alphaMode===`opaque`?1:t.opacity,e[4]=t.emissive[0],e[5]=t.emissive[1],e[6]=t.emissive[2],e[7]=t.normalScale,e[8]=t.metallic,e[9]=t.roughness,e[10]=!!n|(r?2:0)|(s?4:0)|(t.unlit?8:0)|(i?32:0)|(a?64:0)|(o?128:0)|(t.alphaMode===`mask`?256:0),e[11]=t.alphaCutoff??.5,e[12]=t.uvScale[0],e[13]=t.uvScale[1],e[14]=t.occlusionStrength??1,e}function Ts(e,t){return e.fill(0),e[16]=t[0],e[17]=t[1],e[18]=t[2],e[19]=t[3],e[10]=16,e[12]=1,e[13]=1,e}var Es=`
|
|
10
10
|
layout(std140) uniform Frame {
|
|
11
11
|
mat4 uViewProj;
|
|
12
12
|
mat4 uView;
|
|
@@ -19,7 +19,7 @@ layout(std140) uniform Frame {
|
|
|
19
19
|
vec4 uLightColor[16];
|
|
20
20
|
vec4 uLightExtra[16];
|
|
21
21
|
};
|
|
22
|
-
`,
|
|
22
|
+
`,Ds=`
|
|
23
23
|
layout(std140) uniform Material {
|
|
24
24
|
vec4 mBaseColor;
|
|
25
25
|
vec4 mEmissive;
|
|
@@ -27,7 +27,7 @@ layout(std140) uniform Material {
|
|
|
27
27
|
vec4 mUv;
|
|
28
28
|
vec4 mOverlay;
|
|
29
29
|
};
|
|
30
|
-
`,
|
|
30
|
+
`,Os=`
|
|
31
31
|
layout(location = 0) in vec3 aPosition;
|
|
32
32
|
layout(location = 1) in vec3 aNormal;
|
|
33
33
|
layout(location = 2) in vec2 aUv;
|
|
@@ -35,7 +35,7 @@ layout(location = 3) in vec4 iM0;
|
|
|
35
35
|
layout(location = 4) in vec4 iM1;
|
|
36
36
|
layout(location = 5) in vec4 iM2;
|
|
37
37
|
layout(location = 6) in vec4 iM3;
|
|
38
|
-
`,
|
|
38
|
+
`,ks=`
|
|
39
39
|
const float PI = 3.14159265359;
|
|
40
40
|
vec3 linearToSrgb(vec3 c) {
|
|
41
41
|
c = max(c, vec3(0.0));
|
|
@@ -44,10 +44,10 @@ vec3 linearToSrgb(vec3 c) {
|
|
|
44
44
|
vec3 aces(vec3 x) {
|
|
45
45
|
return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
|
|
46
46
|
}
|
|
47
|
-
`,
|
|
47
|
+
`,As=e=>`#version 300 es
|
|
48
48
|
precision highp float;
|
|
49
|
-
${
|
|
50
|
-
${
|
|
49
|
+
${Es}
|
|
50
|
+
${Os}
|
|
51
51
|
out vec3 vWorld;
|
|
52
52
|
out vec3 vNormal;
|
|
53
53
|
${e?`out vec2 vUv;`:``}
|
|
@@ -64,15 +64,15 @@ void main() {
|
|
|
64
64
|
${e?`vUv = aUv;`:``}
|
|
65
65
|
gl_Position = uViewProj * wp;
|
|
66
66
|
}
|
|
67
|
-
`,
|
|
67
|
+
`,js=227;function Ms(e,t){let n=t=>(e&t)!==0,r=n(1),i=n(2),a=n(32),o=n(64),s=n(128),c=r||i||a||o||s,l=n(256),u=e=>l?`textureGrad(${e}, uv, duv1, duv2)`:`texture(${e}, uv)`,d=[];return d.push(`#version 300 es
|
|
68
68
|
precision highp float;
|
|
69
69
|
precision highp int;
|
|
70
|
-
${
|
|
71
|
-
${
|
|
70
|
+
${Es}
|
|
71
|
+
${Ds}`),r&&d.push(`uniform sampler2D uMap;`),i&&d.push(`uniform sampler2D uNormalMap;`),a&&d.push(`uniform sampler2D uMrMap;`),o&&d.push(`uniform sampler2D uOcclusionMap;`),s&&d.push(`uniform sampler2D uEmissiveMap;`),d.push(`in vec3 vWorld;
|
|
72
72
|
in vec3 vNormal;
|
|
73
73
|
${c?`in vec2 vUv;`:``}
|
|
74
74
|
out vec4 outColor;
|
|
75
|
-
${
|
|
75
|
+
${ks}`),n(8)||d.push(Ns),d.push(`void main() {`),c&&d.push(` vec2 uv = vUv * mUv.xy;`),(c&&l||i)&&d.push(` vec2 duv1 = dFdx(uv);`,` vec2 duv2 = dFdy(uv);`),d.push(` vec4 base = mBaseColor;`),r&&d.push(` base *= ${u(`uMap`)};`),n(256)&&d.push(` if (base.a < mParams.w) discard;`),d.push(` vec3 emitted = mEmissive.rgb;`),s&&d.push(` emitted *= ${u(`uEmissiveMap`)}.rgb;`),n(8)?(d.push(` outColor = vec4(linearToSrgb(base.rgb + emitted), base.a);`,`}`),d.join(`
|
|
76
76
|
`)):(d.push(` vec3 N = normalize(vNormal);`),n(4)&&d.push(` N = gl_FrontFacing ? N : -N;`),i&&d.push(` vec3 dp1 = dFdx(vWorld);
|
|
77
77
|
vec3 dp2 = dFdy(vWorld);
|
|
78
78
|
vec3 dp2perp = cross(dp2, N);
|
|
@@ -91,7 +91,7 @@ ${Os}`),n(8)||d.push(Ms),d.push(`void main() {`),c&&d.push(` vec2 uv = vUv * mU
|
|
|
91
91
|
vec3 f0 = mix(vec3(0.04), base.rgb, metal);
|
|
92
92
|
vec3 diffuse = base.rgb * (1.0 - metal);
|
|
93
93
|
vec3 color = vec3(0.0);
|
|
94
|
-
vec3 ambient = vec3(0.0);`),t&&t.split(`,`).forEach((e,t)=>d.push(
|
|
94
|
+
vec3 ambient = vec3(0.0);`),t&&t.split(`,`).forEach((e,t)=>d.push(Ps(Number(e),t))),d.push(` float envI = uSky.w;
|
|
95
95
|
vec3 hemi = mix(uGround.rgb, uSky.rgb, N.y * 0.5 + 0.5) * envI + ambient;
|
|
96
96
|
vec3 R = reflect(-V, N);
|
|
97
97
|
vec3 envSpec = mix(uGround.rgb, uSky.rgb, smoothstep(-0.25 - rough, 0.25 + rough, R.y)) * envI;
|
|
@@ -102,7 +102,7 @@ ${Os}`),n(8)||d.push(Ms),d.push(`void main() {`),c&&d.push(` vec2 uv = vUv * mU
|
|
|
102
102
|
color *= uGround.w;
|
|
103
103
|
outColor = vec4(linearToSrgb(aces(color)), base.a);
|
|
104
104
|
}`),d.join(`
|
|
105
|
-
`))}var
|
|
105
|
+
`))}var Ns=`
|
|
106
106
|
float D_GGX(float NdotH, float a) {
|
|
107
107
|
float a2 = a * a;
|
|
108
108
|
float d = NdotH * NdotH * (a2 - 1.0) + 1.0;
|
|
@@ -137,7 +137,7 @@ vec3 shade(vec3 N, vec3 V, vec3 L, vec3 radiance, float NdotV, vec3 f0, vec3 dif
|
|
|
137
137
|
vec3 kd = (vec3(1.0) - F) * diffuse / PI;
|
|
138
138
|
return (kd + spec) * radiance * NdotL;
|
|
139
139
|
}
|
|
140
|
-
`;function
|
|
140
|
+
`;function Ps(e,t){return e===3?` ambient += uLightColor[${t}].rgb;`:e===4?` ambient += mix(uLightExtra[${t}].yzw, uLightColor[${t}].rgb, N.y * 0.5 + 0.5);`:e===0?` color += shade(N, V, -uLightDir[${t}].xyz, uLightColor[${t}].rgb * PI, NdotV, f0, diffuse, a);`:` {
|
|
141
141
|
vec3 Lv = uLightPos[${t}].xyz - vWorld;
|
|
142
142
|
float d = length(Lv);
|
|
143
143
|
vec3 L = Lv / max(d, 1e-5);
|
|
@@ -149,10 +149,10 @@ vec3 shade(vec3 N, vec3 V, vec3 L, vec3 radiance, float NdotV, vec3 f0, vec3 dif
|
|
|
149
149
|
att *= w * w;
|
|
150
150
|
}${e===2?`\n att *= smoothstep(uLightColor[${t}].w, uLightExtra[${t}].x, dot(-L, uLightDir[${t}].xyz));`:``}
|
|
151
151
|
color += shade(N, V, L, uLightColor[${t}].rgb * PI * att, NdotV, f0, diffuse, a);
|
|
152
|
-
}`}var
|
|
152
|
+
}`}var Fs=`#version 300 es
|
|
153
153
|
precision highp float;
|
|
154
|
-
${
|
|
155
|
-
${
|
|
154
|
+
${Es}
|
|
155
|
+
${Os}
|
|
156
156
|
void main() {
|
|
157
157
|
mat4 M = mat4(iM0, iM1, iM2, iM3);
|
|
158
158
|
vec4 wp = M * vec4(aPosition, 1.0);
|
|
@@ -161,10 +161,10 @@ void main() {
|
|
|
161
161
|
wp.xyz = mix(wp.xyz, uCameraPos.xyz, uParams.z);
|
|
162
162
|
gl_Position = uViewProj * wp;
|
|
163
163
|
}
|
|
164
|
-
`,
|
|
164
|
+
`,Is=`#version 300 es
|
|
165
165
|
precision highp float;
|
|
166
|
-
${
|
|
167
|
-
${
|
|
166
|
+
${Es}
|
|
167
|
+
${Os}
|
|
168
168
|
void main() {
|
|
169
169
|
mat4 M = mat4(iM0, iM1, iM2, iM3);
|
|
170
170
|
vec4 wp = M * vec4(aPosition, 1.0);
|
|
@@ -178,13 +178,13 @@ void main() {
|
|
|
178
178
|
wp.xyz = mix(wp.xyz, uCameraPos.xyz, uParams.z);
|
|
179
179
|
gl_Position = uViewProj * wp;
|
|
180
180
|
}
|
|
181
|
-
`,
|
|
181
|
+
`,Ls=`#version 300 es
|
|
182
182
|
precision highp float;
|
|
183
183
|
precision highp int;
|
|
184
|
-
${Ts}
|
|
185
184
|
${Es}
|
|
185
|
+
${Ds}
|
|
186
186
|
out vec4 outColor;
|
|
187
|
-
${
|
|
187
|
+
${ks}
|
|
188
188
|
void main() {
|
|
189
189
|
int flags = int(mParams.z + 0.5);
|
|
190
190
|
if ((flags & 16) != 0) {
|
|
@@ -193,7 +193,7 @@ void main() {
|
|
|
193
193
|
}
|
|
194
194
|
outColor = vec4(linearToSrgb(mBaseColor.rgb + mEmissive.rgb), mBaseColor.a);
|
|
195
195
|
}
|
|
196
|
-
`,Ls=8;function Rs(e,t,n,r){let i=e.createShader(t);if(e.shaderSource(i,n),e.compileShader(i),!e.getShaderParameter(i,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(i);throw e.deleteShader(i),Error(`WebGL2 ${r} shader compile error: ${t}`)}return i}function zs(e,t,n,r){let i=e.createProgram();if(e.attachShader(i,Rs(e,e.VERTEX_SHADER,t,r+` vertex`)),e.attachShader(i,Rs(e,e.FRAGMENT_SHADER,n,r+` fragment`)),e.linkProgram(i),!e.getProgramParameter(i,e.LINK_STATUS))throw Error(`WebGL2 ${r} link error: ${e.getProgramInfoLog(i)}`);let a=e.getUniformBlockIndex(i,`Frame`);a!==e.INVALID_INDEX&&e.uniformBlockBinding(i,a,0);let o=e.getUniformBlockIndex(i,`Material`);o!==e.INVALID_INDEX&&e.uniformBlockBinding(i,o,1),e.useProgram(i);let s=(t,n)=>{let r=e.getUniformLocation(i,t);r&&e.uniform1i(r,n)};return s(`uMap`,0),s(`uNormalMap`,1),s(`uMrMap`,2),s(`uOcclusionMap`,3),s(`uEmissiveMap`,4),i}var Bs=class{constructor(e){this.canvas=e,this.kind=`webgl2`,this.zeroToOne=!1,this.gl=null,this.vertexCapacity=0,this.indexCapacity=0,this.instanceCapacity=0,this.poolGeneration=-1,this.materialUbos=new Map,this.overlayUbos=new Map,this.gpuBytes=0,this.lost=!1,this.resourceEpoch=0,this.info=``}async init(){let e=this.canvas.getContext(`webgl2`,{antialias:!0,alpha:!1,depth:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!1,powerPreference:`high-performance`});if(!e)throw Error(`WebGL2 is not available in this browser.`);if(this.gl=e,e.isContextLost()){let t=e.getExtension(`WEBGL_lose_context`);if(!t||(await new Promise((e,n)=>{let r=t=>{this.canvas.removeEventListener(`webglcontextrestored`,i),this.canvas.removeEventListener(`webglcontextlost`,a),t?n(t):e()},i=()=>r(),a=()=>r(Error(`WebGL2 context is lost.`));this.canvas.addEventListener(`webglcontextrestored`,i),this.canvas.addEventListener(`webglcontextlost`,a);try{t.restoreContext()}catch(e){r(e)}}),e.isContextLost()))throw Error(`WebGL2 context is lost.`)}this._onLost=e=>{e.preventDefault(),this.lost=!0},this._onRestored=()=>{try{this.rebuildResources(),this.lost=!1,this.resourceEpoch++}catch{this.lost=!0}},this.canvas.addEventListener(`webglcontextlost`,this._onLost),this.canvas.addEventListener(`webglcontextrestored`,this._onRestored),this.rebuildResources()}rebuildResources(){let e=this.gl;`drawingBufferColorSpace`in e&&(e.drawingBufferColorSpace=`srgb`);let t=e.getParameter(e.SAMPLES)||0;this.direct=t>=4,this.samples=this.direct?t:Math.min(4,e.getParameter(e.MAX_SAMPLES)||0),this.direct?this.fbo=this.colorRb=this.depthRb=this.resolveFbo=this.resolveRb=null:(this.fbo=e.createFramebuffer(),this.colorRb=e.createRenderbuffer(),this.depthRb=e.createRenderbuffer(),this.resolveFbo=e.createFramebuffer(),this.resolveRb=e.createRenderbuffer()),this.targetSize=[0,0];let n=e.getExtension(`WEBGL_debug_renderer_info`);this.info=n?e.getParameter(n.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER),this.aniso=e.getExtension(`EXT_texture_filter_anisotropic`),this.poolGeneration=-1,this.vertexCapacity=0,this.indexCapacity=0,this.instanceCapacity=0,this.materialUbos=new Map,this.overlayUbos=new Map,this.meshPrograms=new Map,this.gpuBytes=0,this.lineProgram=zs(e,Ps,Is,`line`),this.normalProgram=zs(e,Fs,Is,`normals`),this.vertexBuffer=e.createBuffer(),this.indexBuffer=e.createBuffer(),this.instanceBuffer=e.createBuffer(),this.frameUbo=e.createBuffer(),e.bindBuffer(e.UNIFORM_BUFFER,this.frameUbo),e.bufferData(e.UNIFORM_BUFFER,_s,e.DYNAMIC_DRAW),this.vao=e.createVertexArray(),e.bindVertexArray(this.vao),e.bindBuffer(e.ARRAY_BUFFER,this.vertexBuffer),e.enableVertexAttribArray(0),e.vertexAttribPointer(0,3,e.FLOAT,!1,32,0),e.enableVertexAttribArray(1),e.vertexAttribPointer(1,3,e.FLOAT,!1,32,12),e.enableVertexAttribArray(2),e.vertexAttribPointer(2,2,e.FLOAT,!1,32,24),e.bindBuffer(e.ARRAY_BUFFER,this.instanceBuffer);for(let t=0;t<4;t++)e.enableVertexAttribArray(3+t),e.vertexAttribPointer(3+t,4,e.FLOAT,!1,64,t*16),e.vertexAttribDivisor(3+t,1);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,this.indexBuffer),e.bindVertexArray(null),this.whiteTex=this.createTexture({width:1,height:1,data:new Uint8Array([255,255,255,255])},!0),this.flatNormalTex=this.createTexture({width:1,height:1,data:new Uint8Array([128,128,255,255])},!1),this.matData=new Float32Array(20)}createTexture(e,t){let n=this.gl,r=n.createTexture();return n.bindTexture(n.TEXTURE_2D,r),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!1),n.texImage2D(n.TEXTURE_2D,0,t?n.SRGB8_ALPHA8:n.RGBA8,e.width,e.height,0,n.RGBA,n.UNSIGNED_BYTE,e.data instanceof Uint8Array?e.data:new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength)),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.REPEAT),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.REPEAT),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),e.width>1?(n.generateMipmap(n.TEXTURE_2D),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR_MIPMAP_LINEAR),this.aniso&&n.texParameterf(n.TEXTURE_2D,this.aniso.TEXTURE_MAX_ANISOTROPY_EXT,Ls)):n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),this.gpuBytes+=e.width*e.height*4*(e.width>1?1.33:1),r}destroyTexture(e){this.gl.deleteTexture(e)}syncPool(e){let t=this.gl,n=e.vertices.byteLength,r=e.indices.byteLength,i=e.generation!==this.poolGeneration||n!==this.vertexCapacity||r!==this.indexCapacity,a=0;i&&(t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,n,t.STATIC_DRAW),t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,r,t.STATIC_DRAW),t.bindVertexArray(null),this.vertexCapacity=n,this.indexCapacity=r,this.poolGeneration=e.generation,e.uploadedVertices=0,e.uploadedIndices=0);let o=e.pending();return o.vertexEnd>o.vertexStart&&(t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferSubData(t.ARRAY_BUFFER,o.vertexStart*32,e.vertices.subarray(o.vertexStart*8,o.vertexEnd*8)),a+=(o.vertexEnd-o.vertexStart)*32),o.indexEnd>o.indexStart&&(t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferSubData(t.ELEMENT_ARRAY_BUFFER,o.indexStart*4,e.indices.subarray(o.indexStart,o.indexEnd)),t.bindVertexArray(null),a+=(o.indexEnd-o.indexStart)*4),e.markUploaded(),a}uploadInstances(e,t){let n=this.gl,r=t*64;if(n.bindBuffer(n.ARRAY_BUFFER,this.instanceBuffer),r>this.instanceCapacity){let e=Math.max(this.instanceCapacity,16384);for(;e<r;)e*=2;n.bufferData(n.ARRAY_BUFFER,e,n.DYNAMIC_DRAW),this.instanceCapacity=e}return r&&n.bufferSubData(n.ARRAY_BUFFER,0,e.subarray(0,t*16)),r}readyTexture(e,t){return e&&e.status===`ready`&&!e.gpu&&(e.gpu=this.createTexture(e.pixels,t)),e&&e.gpu?e.gpu:null}materialBinding(e,t){let n=this.gl,r=this.materialUbos.get(e);r||(r={ubo:n.createBuffer(),map:null,normalMap:null,mrMap:null,occlusionMap:null,emissiveMap:null,key:``},this.materialUbos.set(e,r));let i=this.readyTexture(e.map?t.get(e.map,`color`):null,!0),a=this.readyTexture(e.normalMap?t.get(e.normalMap,`normal`):null,!1),o=this.readyTexture(e.metallicRoughnessMap?t.get(e.metallicRoughnessMap,`linear`):null,!1),s=this.readyTexture(e.occlusionMap?t.get(e.occlusionMap,`linear`):null,!1),c=this.readyTexture(e.emissiveMap?t.get(e.emissiveMap,`color`):null,!0),l=!!i,u=!!a,d=!!o,f=!!s,p=!!c,m=`${l}|${u}|${d}|${f}|${p}`;return r.key!==m&&(Cs(this.matData,e,{hasMap:l,hasNormalMap:u,hasMrMap:d,hasOcclusionMap:f,hasEmissiveMap:p,doubleSided:e.doubleSided}),n.bindBuffer(n.UNIFORM_BUFFER,r.ubo),n.bufferData(n.UNIFORM_BUFFER,this.matData,n.STATIC_DRAW),r.key=m,r.flags=this.matData[10]),r.map=i||this.whiteTex,r.normalMap=a||this.flatNormalTex,r.mrMap=o||this.whiteTex,r.occlusionMap=s||this.whiteTex,r.emissiveMap=c||this.whiteTex,r}doubleSidedBinding(e,t){let n=this.materialBinding(e,t),r=n.doubleSidedUbo,i=n.key;if(!r||n.dsKey!==i){r||=n.doubleSidedUbo=this.gl.createBuffer();let t=n.map!==this.whiteTex,a=n.normalMap!==this.flatNormalTex,o=n.mrMap!==this.whiteTex,s=n.occlusionMap!==this.whiteTex,c=n.emissiveMap!==this.whiteTex;Cs(this.matData,e,{hasMap:t,hasNormalMap:a,hasMrMap:o,hasOcclusionMap:s,hasEmissiveMap:c,doubleSided:!0}),this.gl.bindBuffer(this.gl.UNIFORM_BUFFER,r),this.gl.bufferData(this.gl.UNIFORM_BUFFER,this.matData,this.gl.STATIC_DRAW),n.dsKey=i,n.dsFlags=this.matData[10]}let a=n.dsBinding||={};return a.ubo=r,a.flags=n.dsFlags,a.map=n.map,a.normalMap=n.normalMap,a.mrMap=n.mrMap,a.occlusionMap=n.occlusionMap,a.emissiveMap=n.emissiveMap,a}overlayUbo(e,t){let n=this.overlayUbos.get(e);return n||(n=this.gl.createBuffer(),this.overlayUbos.set(e,n),ws(this.matData,t),this.gl.bindBuffer(this.gl.UNIFORM_BUFFER,n),this.gl.bufferData(this.gl.UNIFORM_BUFFER,this.matData,this.gl.STATIC_DRAW)),n}releaseMaterials(e){for(let[t,n]of this.materialUbos)e.has(t)||(this.gl.deleteBuffer(n.ubo),n.doubleSidedUbo&&this.gl.deleteBuffer(n.doubleSidedUbo),this.materialUbos.delete(t))}setInstanceOffset(e){let t=this.gl;t.bindBuffer(t.ARRAY_BUFFER,this.instanceBuffer);let n=e*64;for(let e=0;e<4;e++)t.vertexAttribPointer(3+e,4,t.FLOAT,!1,64,n+e*16)}resize(e,t){(this.canvas.width!==e||this.canvas.height!==t)&&(this.canvas.width=e,this.canvas.height=t)}get caps(){let e=this.gl;return{msaaSamples:this.samples,anisotropy:this.aniso?Math.min(Ls,e.getParameter(this.aniso.MAX_TEXTURE_MAX_ANISOTROPY_EXT)):1,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),colorSpace:e.drawingBufferColorSpace||`srgb`}}meshProgram(e,t){let n=`${e}|${t}`,r=this.meshPrograms.get(n);return r||(r=zs(this.gl,ks((e&As)!==0),js(e,t),`mesh`),this.meshPrograms.set(n,r)),r}ensureTarget(){if(this.direct)return;let e=this.gl,t=this.canvas.width,n=this.canvas.height;(this.targetSize[0]!==t||this.targetSize[1]!==n)&&(this.targetSize=[t,n],e.bindRenderbuffer(e.RENDERBUFFER,this.colorRb),e.renderbufferStorageMultisample(e.RENDERBUFFER,this.samples,e.RGBA8,t,n),e.bindRenderbuffer(e.RENDERBUFFER,this.depthRb),e.renderbufferStorageMultisample(e.RENDERBUFFER,this.samples,e.DEPTH_COMPONENT24,t,n),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,this.fbo),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.RENDERBUFFER,this.colorRb),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,this.depthRb),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindRenderbuffer(e.RENDERBUFFER,this.resolveRb),e.renderbufferStorage(e.RENDERBUFFER,e.RGBA8,t,n),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,this.resolveFbo),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.RENDERBUFFER,this.resolveRb),e.bindFramebuffer(e.FRAMEBUFFER,null))}present(e,t){if(this.direct)return;let n=this.gl,r=(r,i)=>{n.bindFramebuffer(n.READ_FRAMEBUFFER,r),n.bindFramebuffer(n.DRAW_FRAMEBUFFER,i),n.blitFramebuffer(0,0,e,t,0,0,e,t,n.COLOR_BUFFER_BIT,n.NEAREST)};r(this.fbo,this.resolveFbo),r(this.resolveFbo,null),n.bindFramebuffer(n.FRAMEBUFFER,null)}render(e,t,n){let r=this.gl;if(this.lost)return;let i=this.canvas.width,a=this.canvas.height;this.ensureTarget(),r.bindFramebuffer(r.FRAMEBUFFER,this.direct?null:this.fbo),r.viewport(0,0,i,a),r.clearColor(n.background[0],n.background[1],n.background[2],1),r.clearDepth(1),r.depthMask(!0),r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT),r.enable(r.DEPTH_TEST),r.depthFunc(r.LEQUAL),r.disable(r.BLEND),r.bindBuffer(r.UNIFORM_BUFFER,this.frameUbo),r.bufferSubData(r.UNIFORM_BUFFER,0,t),r.bindBufferBase(r.UNIFORM_BUFFER,0,this.frameUbo),this.uploadInstances(e.instanceData,e.instanceCount),r.bindVertexArray(this.vao);let o=Ss(t),s=null,c=e=>{s!==e&&(r.useProgram(e),s=e)},l=!1,u=-1,d=null;r.cullFace(r.BACK);for(let t of e.batches){let e=t.kind===`lines`,i=t.doubleSided&&!t.material.doubleSided?this.doubleSidedBinding(t.material,n.textures):this.materialBinding(t.material,n.textures);c(e?this.lineProgram:this.meshProgram(i.flags,o));let a=t.doubleSided||e?0:t.mirrored?2:1;a!==u&&(a===0?r.disable(r.CULL_FACE):(u<=0&&r.enable(r.CULL_FACE),r.frontFace(a===2?r.CW:r.CCW)),u=a),t.transparent!==l&&(l=t.transparent,l?(r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.depthMask(!1)):(r.disable(r.BLEND),r.depthMask(!0))),i!==d&&(d=i,r.bindBufferBase(r.UNIFORM_BUFFER,1,i.ubo),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,i.map),r.activeTexture(r.TEXTURE1),r.bindTexture(r.TEXTURE_2D,i.normalMap),r.activeTexture(r.TEXTURE2),r.bindTexture(r.TEXTURE_2D,i.mrMap),r.activeTexture(r.TEXTURE3),r.bindTexture(r.TEXTURE_2D,i.occlusionMap),r.activeTexture(r.TEXTURE4),r.bindTexture(r.TEXTURE_2D,i.emissiveMap)),this.setInstanceOffset(t.firstInstance),r.drawElementsInstanced(e?r.LINES:r.TRIANGLES,t.range.indexCount,r.UNSIGNED_INT,t.range.firstIndex*4,t.count)}let f=e.overlays;r.disable(r.CULL_FACE),r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.depthMask(!1);let p=(e,t,n,i)=>{if(i.length){c(e),r.bindBufferBase(r.UNIFORM_BUFFER,1,this.overlayUbo(t,n));for(let e of i)this.setInstanceOffset(e.firstInstance),r.drawElementsInstanced(r.LINES,e.range.indexCount,r.UNSIGNED_INT,e.range.firstIndex*4,e.count)}};p(this.lineProgram,`wireframe`,n.overlayColors.wireframe,f.wireframe),p(this.normalProgram,`normals`,n.overlayColors.normals,f.normals),f.bbox&&f.bbox.count&&p(this.lineProgram,`bbox`,n.overlayColors.bbox,[{...f.bbox,range:n.cubeRange}]),f.selection&&f.selection.count&&(r.disable(r.DEPTH_TEST),p(this.lineProgram,`selection`,n.overlayColors.selection,[{...f.selection,range:n.cubeRange}]),r.enable(r.DEPTH_TEST)),r.depthMask(!0),r.disable(r.BLEND),r.bindVertexArray(null),this.present(i,a)}async finish(){this.gl.finish();let e=new Uint8Array(4);this.gl.readPixels(0,0,1,1,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e)}dispose(){let e=this.gl;if(e&&(this._onLost&&this.canvas.removeEventListener(`webglcontextlost`,this._onLost),this._onRestored&&this.canvas.removeEventListener(`webglcontextrestored`,this._onRestored),this._onLost=this._onRestored=null,!e.isContextLost())){e.deleteBuffer(this.vertexBuffer),e.deleteBuffer(this.indexBuffer),e.deleteBuffer(this.instanceBuffer),e.deleteBuffer(this.frameUbo);for(let t of this.materialUbos.values())e.deleteBuffer(t.ubo),t.doubleSidedUbo&&e.deleteBuffer(t.doubleSidedUbo);for(let t of this.overlayUbos.values())e.deleteBuffer(t);for(let t of this.meshPrograms.values())e.deleteProgram(t);this.lineProgram&&e.deleteProgram(this.lineProgram),this.normalProgram&&e.deleteProgram(this.normalProgram),this.whiteTex&&e.deleteTexture(this.whiteTex),this.flatNormalTex&&e.deleteTexture(this.flatNormalTex),e.deleteVertexArray(this.vao),this.direct||(e.deleteFramebuffer(this.fbo),e.deleteRenderbuffer(this.colorRb),e.deleteRenderbuffer(this.depthRb),e.deleteFramebuffer(this.resolveFbo),e.deleteRenderbuffer(this.resolveRb))}}},Vs=`
|
|
196
|
+
`,Rs=8;function zs(e,t,n,r){let i=e.createShader(t);if(e.shaderSource(i,n),e.compileShader(i),!e.getShaderParameter(i,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(i);throw e.deleteShader(i),Error(`WebGL2 ${r} shader compile error: ${t}`)}return i}function Bs(e,t,n,r){let i=e.createProgram();if(e.attachShader(i,zs(e,e.VERTEX_SHADER,t,r+` vertex`)),e.attachShader(i,zs(e,e.FRAGMENT_SHADER,n,r+` fragment`)),e.linkProgram(i),!e.getProgramParameter(i,e.LINK_STATUS))throw Error(`WebGL2 ${r} link error: ${e.getProgramInfoLog(i)}`);let a=e.getUniformBlockIndex(i,`Frame`);a!==e.INVALID_INDEX&&e.uniformBlockBinding(i,a,0);let o=e.getUniformBlockIndex(i,`Material`);o!==e.INVALID_INDEX&&e.uniformBlockBinding(i,o,1),e.useProgram(i);let s=(t,n)=>{let r=e.getUniformLocation(i,t);r&&e.uniform1i(r,n)};return s(`uMap`,0),s(`uNormalMap`,1),s(`uMrMap`,2),s(`uOcclusionMap`,3),s(`uEmissiveMap`,4),i}var Vs=class{constructor(e){this.canvas=e,this.kind=`webgl2`,this.zeroToOne=!1,this.gl=null,this.vertexCapacity=0,this.indexCapacity=0,this.instanceCapacity=0,this.poolGeneration=-1,this.materialUbos=new Map,this.overlayUbos=new Map,this.gpuBytes=0,this.lost=!1,this.resourceEpoch=0,this.info=``}async init(){let e=this.canvas.getContext(`webgl2`,{antialias:!0,alpha:!1,depth:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!1,powerPreference:`high-performance`});if(!e)throw Error(`WebGL2 is not available in this browser.`);if(this.gl=e,e.isContextLost()){let t=e.getExtension(`WEBGL_lose_context`);if(!t||(await new Promise((e,n)=>{let r=t=>{this.canvas.removeEventListener(`webglcontextrestored`,i),this.canvas.removeEventListener(`webglcontextlost`,a),t?n(t):e()},i=()=>r(),a=()=>r(Error(`WebGL2 context is lost.`));this.canvas.addEventListener(`webglcontextrestored`,i),this.canvas.addEventListener(`webglcontextlost`,a);try{t.restoreContext()}catch(e){r(e)}}),e.isContextLost()))throw Error(`WebGL2 context is lost.`)}this._onLost=e=>{e.preventDefault(),this.lost=!0},this._onRestored=()=>{try{this.rebuildResources(),this.lost=!1,this.resourceEpoch++}catch{this.lost=!0}},this.canvas.addEventListener(`webglcontextlost`,this._onLost),this.canvas.addEventListener(`webglcontextrestored`,this._onRestored),this.rebuildResources()}rebuildResources(){let e=this.gl;`drawingBufferColorSpace`in e&&(e.drawingBufferColorSpace=`srgb`);let t=e.getParameter(e.SAMPLES)||0;this.direct=t>=4,this.samples=this.direct?t:Math.min(4,e.getParameter(e.MAX_SAMPLES)||0),this.direct?this.fbo=this.colorRb=this.depthRb=this.resolveFbo=this.resolveRb=null:(this.fbo=e.createFramebuffer(),this.colorRb=e.createRenderbuffer(),this.depthRb=e.createRenderbuffer(),this.resolveFbo=e.createFramebuffer(),this.resolveRb=e.createRenderbuffer()),this.targetSize=[0,0];let n=e.getExtension(`WEBGL_debug_renderer_info`);this.info=n?e.getParameter(n.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER),this.aniso=e.getExtension(`EXT_texture_filter_anisotropic`),this.poolGeneration=-1,this.vertexCapacity=0,this.indexCapacity=0,this.instanceCapacity=0,this.materialUbos=new Map,this.overlayUbos=new Map,this.meshPrograms=new Map,this.gpuBytes=0,this.lineProgram=Bs(e,Fs,Ls,`line`),this.normalProgram=Bs(e,Is,Ls,`normals`),this.vertexBuffer=e.createBuffer(),this.indexBuffer=e.createBuffer(),this.instanceBuffer=e.createBuffer(),this.frameUbo=e.createBuffer(),e.bindBuffer(e.UNIFORM_BUFFER,this.frameUbo),e.bufferData(e.UNIFORM_BUFFER,vs,e.DYNAMIC_DRAW),this.vao=e.createVertexArray(),e.bindVertexArray(this.vao),e.bindBuffer(e.ARRAY_BUFFER,this.vertexBuffer);for(let t=0;t<3;t++)e.enableVertexAttribArray(t);this.bindVertexAttributes(),e.bindBuffer(e.ARRAY_BUFFER,this.instanceBuffer);for(let t=0;t<4;t++)e.enableVertexAttribArray(3+t),e.vertexAttribPointer(3+t,4,e.FLOAT,!1,64,t*16),e.vertexAttribDivisor(3+t,1);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,this.indexBuffer),e.bindVertexArray(null),this.whiteTex=this.createTexture({width:1,height:1,data:new Uint8Array([255,255,255,255])},!0),this.flatNormalTex=this.createTexture({width:1,height:1,data:new Uint8Array([128,128,255,255])},!1),this.matData=new Float32Array(20)}createTexture(e,t){let n=this.gl,r=n.createTexture();return n.bindTexture(n.TEXTURE_2D,r),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!1),n.texImage2D(n.TEXTURE_2D,0,t?n.SRGB8_ALPHA8:n.RGBA8,e.width,e.height,0,n.RGBA,n.UNSIGNED_BYTE,e.data instanceof Uint8Array?e.data:new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength)),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.REPEAT),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.REPEAT),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),e.width>1?(n.generateMipmap(n.TEXTURE_2D),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR_MIPMAP_LINEAR),this.aniso&&n.texParameterf(n.TEXTURE_2D,this.aniso.TEXTURE_MAX_ANISOTROPY_EXT,Rs)):n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),this.gpuBytes+=e.width*e.height*4*(e.width>1?1.33:1),r}destroyTexture(e){this.gl.deleteTexture(e)}bindVertexAttributes(){let e=this.gl;e.vertexAttribPointer(0,3,e.FLOAT,!1,32,0),e.vertexAttribPointer(1,3,e.FLOAT,!1,32,12),e.vertexAttribPointer(2,2,e.FLOAT,!1,32,24)}syncPool(e){let t=this.gl,n=e.vertexCapacityBytes,r=e.indexCapacityBytes,i=0;if(e.generation!==this.poolGeneration)t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,n,t.STATIC_DRAW),t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,r,t.STATIC_DRAW),t.bindVertexArray(null),this.vertexCapacity=n,this.indexCapacity=r,this.poolGeneration=e.generation,e.uploadedVertices=0,e.uploadedIndices=0;else{if(n>this.vertexCapacity){let r=this.vertexBuffer,i=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,i),t.bufferData(t.ARRAY_BUFFER,n,t.STATIC_DRAW),t.bindVertexArray(this.vao),this.bindVertexAttributes(),t.bindVertexArray(null),this.copyBuffer(r,i,e.uploadedVertices*32),t.deleteBuffer(r),this.vertexBuffer=i,this.vertexCapacity=n}if(r>this.indexCapacity){let n=this.indexBuffer,i=t.createBuffer();t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,i),t.bufferData(t.ELEMENT_ARRAY_BUFFER,r,t.STATIC_DRAW),t.bindVertexArray(null),this.copyBuffer(n,i,e.uploadedIndices*4),t.deleteBuffer(n),this.indexBuffer=i,this.indexCapacity=r}}let a=e.pending();return a.vertexEnd>a.vertexStart&&(t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),e.forEachVertices(a.vertexStart,a.vertexEnd,(e,n)=>{t.bufferSubData(t.ARRAY_BUFFER,e*32,n),i+=n.byteLength})),a.indexEnd>a.indexStart&&(t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),e.forEachIndices(a.indexStart,a.indexEnd,(e,n)=>{t.bufferSubData(t.ELEMENT_ARRAY_BUFFER,e*4,n),i+=n.byteLength}),t.bindVertexArray(null)),e.markUploaded(),i}copyBuffer(e,t,n){if(n<=0)return;let r=this.gl;r.bindBuffer(r.COPY_READ_BUFFER,e),r.bindBuffer(r.COPY_WRITE_BUFFER,t),r.copyBufferSubData(r.COPY_READ_BUFFER,r.COPY_WRITE_BUFFER,0,0,n),r.bindBuffer(r.COPY_READ_BUFFER,null),r.bindBuffer(r.COPY_WRITE_BUFFER,null)}uploadInstances(e,t){let n=this.gl,r=t*64;if(n.bindBuffer(n.ARRAY_BUFFER,this.instanceBuffer),r>this.instanceCapacity){let e=Math.max(this.instanceCapacity,16384);for(;e<r;)e*=2;n.bufferData(n.ARRAY_BUFFER,e,n.DYNAMIC_DRAW),this.instanceCapacity=e}return r&&n.bufferSubData(n.ARRAY_BUFFER,0,e.subarray(0,t*16)),r}readyTexture(e,t){return e&&e.status===`ready`&&!e.gpu&&(e.gpu=this.createTexture(e.pixels,t)),e&&e.gpu?e.gpu:null}materialBinding(e,t){let n=this.gl,r=this.materialUbos.get(e);r||(r={ubo:n.createBuffer(),map:null,normalMap:null,mrMap:null,occlusionMap:null,emissiveMap:null,key:``},this.materialUbos.set(e,r));let i=this.readyTexture(e.map?t.get(e.map,`color`):null,!0),a=this.readyTexture(e.normalMap?t.get(e.normalMap,`normal`):null,!1),o=this.readyTexture(e.metallicRoughnessMap?t.get(e.metallicRoughnessMap,`linear`):null,!1),s=this.readyTexture(e.occlusionMap?t.get(e.occlusionMap,`linear`):null,!1),c=this.readyTexture(e.emissiveMap?t.get(e.emissiveMap,`color`):null,!0),l=!!i,u=!!a,d=!!o,f=!!s,p=!!c,m=`${l}|${u}|${d}|${f}|${p}`;return r.key!==m&&(ws(this.matData,e,{hasMap:l,hasNormalMap:u,hasMrMap:d,hasOcclusionMap:f,hasEmissiveMap:p,doubleSided:e.doubleSided}),n.bindBuffer(n.UNIFORM_BUFFER,r.ubo),n.bufferData(n.UNIFORM_BUFFER,this.matData,n.STATIC_DRAW),r.key=m,r.flags=this.matData[10]),r.map=i||this.whiteTex,r.normalMap=a||this.flatNormalTex,r.mrMap=o||this.whiteTex,r.occlusionMap=s||this.whiteTex,r.emissiveMap=c||this.whiteTex,r}doubleSidedBinding(e,t){let n=this.materialBinding(e,t),r=n.doubleSidedUbo,i=n.key;if(!r||n.dsKey!==i){r||=n.doubleSidedUbo=this.gl.createBuffer();let t=n.map!==this.whiteTex,a=n.normalMap!==this.flatNormalTex,o=n.mrMap!==this.whiteTex,s=n.occlusionMap!==this.whiteTex,c=n.emissiveMap!==this.whiteTex;ws(this.matData,e,{hasMap:t,hasNormalMap:a,hasMrMap:o,hasOcclusionMap:s,hasEmissiveMap:c,doubleSided:!0}),this.gl.bindBuffer(this.gl.UNIFORM_BUFFER,r),this.gl.bufferData(this.gl.UNIFORM_BUFFER,this.matData,this.gl.STATIC_DRAW),n.dsKey=i,n.dsFlags=this.matData[10]}let a=n.dsBinding||={};return a.ubo=r,a.flags=n.dsFlags,a.map=n.map,a.normalMap=n.normalMap,a.mrMap=n.mrMap,a.occlusionMap=n.occlusionMap,a.emissiveMap=n.emissiveMap,a}overlayUbo(e,t){let n=this.overlayUbos.get(e);return n||(n=this.gl.createBuffer(),this.overlayUbos.set(e,n),Ts(this.matData,t),this.gl.bindBuffer(this.gl.UNIFORM_BUFFER,n),this.gl.bufferData(this.gl.UNIFORM_BUFFER,this.matData,this.gl.STATIC_DRAW)),n}releaseMaterials(e){for(let[t,n]of this.materialUbos)e.has(t)||(this.gl.deleteBuffer(n.ubo),n.doubleSidedUbo&&this.gl.deleteBuffer(n.doubleSidedUbo),this.materialUbos.delete(t))}setInstanceOffset(e){let t=this.gl;t.bindBuffer(t.ARRAY_BUFFER,this.instanceBuffer);let n=e*64;for(let e=0;e<4;e++)t.vertexAttribPointer(3+e,4,t.FLOAT,!1,64,n+e*16)}resize(e,t){(this.canvas.width!==e||this.canvas.height!==t)&&(this.canvas.width=e,this.canvas.height=t)}get caps(){let e=this.gl;return{msaaSamples:this.samples,anisotropy:this.aniso?Math.min(Rs,e.getParameter(this.aniso.MAX_TEXTURE_MAX_ANISOTROPY_EXT)):1,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),colorSpace:e.drawingBufferColorSpace||`srgb`}}meshProgram(e,t){let n=`${e}|${t}`,r=this.meshPrograms.get(n);return r||(r=Bs(this.gl,As((e&js)!==0),Ms(e,t),`mesh`),this.meshPrograms.set(n,r)),r}ensureTarget(){if(this.direct)return;let e=this.gl,t=this.canvas.width,n=this.canvas.height;(this.targetSize[0]!==t||this.targetSize[1]!==n)&&(this.targetSize=[t,n],e.bindRenderbuffer(e.RENDERBUFFER,this.colorRb),e.renderbufferStorageMultisample(e.RENDERBUFFER,this.samples,e.RGBA8,t,n),e.bindRenderbuffer(e.RENDERBUFFER,this.depthRb),e.renderbufferStorageMultisample(e.RENDERBUFFER,this.samples,e.DEPTH_COMPONENT24,t,n),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,this.fbo),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.RENDERBUFFER,this.colorRb),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,this.depthRb),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindRenderbuffer(e.RENDERBUFFER,this.resolveRb),e.renderbufferStorage(e.RENDERBUFFER,e.RGBA8,t,n),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,this.resolveFbo),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.RENDERBUFFER,this.resolveRb),e.bindFramebuffer(e.FRAMEBUFFER,null))}present(e,t){if(this.direct)return;let n=this.gl,r=(r,i)=>{n.bindFramebuffer(n.READ_FRAMEBUFFER,r),n.bindFramebuffer(n.DRAW_FRAMEBUFFER,i),n.blitFramebuffer(0,0,e,t,0,0,e,t,n.COLOR_BUFFER_BIT,n.NEAREST)};r(this.fbo,this.resolveFbo),r(this.resolveFbo,null),n.bindFramebuffer(n.FRAMEBUFFER,null)}render(e,t,n){let r=this.gl;if(this.lost)return;let i=this.canvas.width,a=this.canvas.height;this.ensureTarget(),r.bindFramebuffer(r.FRAMEBUFFER,this.direct?null:this.fbo),r.viewport(0,0,i,a),r.clearColor(n.background[0],n.background[1],n.background[2],1),r.clearDepth(1),r.depthMask(!0),r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT),r.enable(r.DEPTH_TEST),r.depthFunc(r.LEQUAL),r.disable(r.BLEND),r.bindBuffer(r.UNIFORM_BUFFER,this.frameUbo),r.bufferSubData(r.UNIFORM_BUFFER,0,t),r.bindBufferBase(r.UNIFORM_BUFFER,0,this.frameUbo),this.uploadInstances(e.instanceData,e.instanceCount),r.bindVertexArray(this.vao);let o=Cs(t),s=null,c=e=>{s!==e&&(r.useProgram(e),s=e)},l=!1,u=-1,d=null;r.cullFace(r.BACK);for(let t of e.batches){let e=t.kind===`lines`,i=t.doubleSided&&!t.material.doubleSided?this.doubleSidedBinding(t.material,n.textures):this.materialBinding(t.material,n.textures);c(e?this.lineProgram:this.meshProgram(i.flags,o));let a=t.doubleSided||e?0:t.mirrored?2:1;a!==u&&(a===0?r.disable(r.CULL_FACE):(u<=0&&r.enable(r.CULL_FACE),r.frontFace(a===2?r.CW:r.CCW)),u=a),t.transparent!==l&&(l=t.transparent,l?(r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.depthMask(!1)):(r.disable(r.BLEND),r.depthMask(!0))),i!==d&&(d=i,r.bindBufferBase(r.UNIFORM_BUFFER,1,i.ubo),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,i.map),r.activeTexture(r.TEXTURE1),r.bindTexture(r.TEXTURE_2D,i.normalMap),r.activeTexture(r.TEXTURE2),r.bindTexture(r.TEXTURE_2D,i.mrMap),r.activeTexture(r.TEXTURE3),r.bindTexture(r.TEXTURE_2D,i.occlusionMap),r.activeTexture(r.TEXTURE4),r.bindTexture(r.TEXTURE_2D,i.emissiveMap)),this.setInstanceOffset(t.firstInstance),r.drawElementsInstanced(e?r.LINES:r.TRIANGLES,t.range.indexCount,r.UNSIGNED_INT,t.range.firstIndex*4,t.count)}let f=e.overlays;r.disable(r.CULL_FACE),r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.depthMask(!1);let p=(e,t,n,i)=>{if(i.length){c(e),r.bindBufferBase(r.UNIFORM_BUFFER,1,this.overlayUbo(t,n));for(let e of i)this.setInstanceOffset(e.firstInstance),r.drawElementsInstanced(r.LINES,e.range.indexCount,r.UNSIGNED_INT,e.range.firstIndex*4,e.count)}};p(this.lineProgram,`wireframe`,n.overlayColors.wireframe,f.wireframe),p(this.normalProgram,`normals`,n.overlayColors.normals,f.normals),f.bbox&&f.bbox.count&&p(this.lineProgram,`bbox`,n.overlayColors.bbox,[{...f.bbox,range:n.cubeRange}]),f.selection&&f.selection.count&&(r.disable(r.DEPTH_TEST),p(this.lineProgram,`selection`,n.overlayColors.selection,[{...f.selection,range:n.cubeRange}]),r.enable(r.DEPTH_TEST)),r.depthMask(!0),r.disable(r.BLEND),r.bindVertexArray(null),this.present(i,a)}async finish(){this.gl.finish();let e=new Uint8Array(4);this.gl.readPixels(0,0,1,1,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e)}dispose(){let e=this.gl;if(e&&(this._onLost&&this.canvas.removeEventListener(`webglcontextlost`,this._onLost),this._onRestored&&this.canvas.removeEventListener(`webglcontextrestored`,this._onRestored),this._onLost=this._onRestored=null,!e.isContextLost())){e.deleteBuffer(this.vertexBuffer),e.deleteBuffer(this.indexBuffer),e.deleteBuffer(this.instanceBuffer),e.deleteBuffer(this.frameUbo);for(let t of this.materialUbos.values())e.deleteBuffer(t.ubo),t.doubleSidedUbo&&e.deleteBuffer(t.doubleSidedUbo);for(let t of this.overlayUbos.values())e.deleteBuffer(t);for(let t of this.meshPrograms.values())e.deleteProgram(t);this.lineProgram&&e.deleteProgram(this.lineProgram),this.normalProgram&&e.deleteProgram(this.normalProgram),this.whiteTex&&e.deleteTexture(this.whiteTex),this.flatNormalTex&&e.deleteTexture(this.flatNormalTex),e.deleteVertexArray(this.vao),this.direct||(e.deleteFramebuffer(this.fbo),e.deleteRenderbuffer(this.colorRb),e.deleteRenderbuffer(this.depthRb),e.deleteFramebuffer(this.resolveFbo),e.deleteRenderbuffer(this.resolveRb))}}},Hs=`
|
|
197
197
|
struct Frame {
|
|
198
198
|
viewProj: mat4x4f,
|
|
199
199
|
view: mat4x4f,
|
|
@@ -249,7 +249,7 @@ fn worldNormal(inp: VSIn) -> vec3f {
|
|
|
249
249
|
let det = dot(c0, cross(c1, c2));
|
|
250
250
|
return cof * inp.normal * select(1.0, -1.0, det < 0.0);
|
|
251
251
|
}
|
|
252
|
-
`,
|
|
252
|
+
`,Us=e=>`
|
|
253
253
|
struct VSOut {
|
|
254
254
|
@builtin(position) pos: vec4f,
|
|
255
255
|
@location(0) world: vec3f,
|
|
@@ -268,7 +268,7 @@ fn vs_main(inp: VSIn) -> VSOut {
|
|
|
268
268
|
${e?`out.uv = inp.uv;`:``}
|
|
269
269
|
return out;
|
|
270
270
|
}
|
|
271
|
-
`,
|
|
271
|
+
`,Ws=`
|
|
272
272
|
fn D_GGX(NdotH: f32, a: f32) -> f32 {
|
|
273
273
|
let a2 = a * a;
|
|
274
274
|
let d = NdotH * NdotH * (a2 - 1.0) + 1.0;
|
|
@@ -305,7 +305,7 @@ fn shade(N: vec3f, V: vec3f, L: vec3f, radiance: vec3f, NdotV: f32, f0: vec3f, d
|
|
|
305
305
|
let kd = (vec3f(1.0) - F) * diffuse / PI;
|
|
306
306
|
return (kd + spec) * radiance * NdotL;
|
|
307
307
|
}
|
|
308
|
-
`;function
|
|
308
|
+
`;function Gs(e,t){let n=t=>(e&t)!==0,r=n(1),i=n(2),a=n(32),o=n(64),s=n(128),c=r||i||a||o||s,l=n(256),u=e=>l?`textureSampleGrad(${e}, samp, uv, ddx, ddy)`:`textureSample(${e}, samp, uv)`,d=[Hs,Us(c)];return n(8)||d.push(Ws),d.push(`@fragment`,`fn fs_main(inp: VSOut, @builtin(front_facing) frontFacing: bool) -> @location(0) vec4f {`),c&&d.push(` let uv = inp.uv * material.uvScale.xy;`),(c&&l||i)&&d.push(` let ddx = dpdx(uv);`,` let ddy = dpdy(uv);`),i&&d.push(` let dp1 = dpdx(inp.world);`,` let dp2 = -dpdy(inp.world);`,` let duv1 = ddx;`,` let duv2 = -ddy;`),d.push(` var base = material.baseColor;`),r&&d.push(` base = base * ${u(`baseTex`)};`),l&&d.push(` if (base.a < material.params.w) {`,` discard;`,` }`),d.push(` var emitted = material.emissive.rgb;`),s&&d.push(` emitted = emitted * ${u(`emissiveTex`)}.rgb;`),n(8)?(d.push(` return vec4f(linearToSrgb(base.rgb + emitted), base.a);`,`}`),d.join(`
|
|
309
309
|
`)):(d.push(` var N = normalize(inp.normal);`),n(4)&&d.push(` N = select(-N, N, frontFacing);`),i&&d.push(` let dp2perp = cross(dp2, N);
|
|
310
310
|
let dp1perp = cross(N, dp1);
|
|
311
311
|
let T = dp2perp * duv1.x + dp1perp * duv2.x;
|
|
@@ -322,7 +322,7 @@ fn shade(N: vec3f, V: vec3f, L: vec3f, radiance: vec3f, NdotV: f32, f0: vec3f, d
|
|
|
322
322
|
let f0 = mix(vec3f(0.04), base.rgb, metal);
|
|
323
323
|
let diffuse = base.rgb * (1.0 - metal);
|
|
324
324
|
var color = vec3f(0.0);
|
|
325
|
-
var ambient = vec3f(0.0);`),t&&t.split(`,`).forEach((e,t)=>d.push(
|
|
325
|
+
var ambient = vec3f(0.0);`),t&&t.split(`,`).forEach((e,t)=>d.push(Ks(Number(e),t))),d.push(` let envI = frame.sky.w;
|
|
326
326
|
var hemi = mix(frame.ground.rgb, frame.sky.rgb, N.y * 0.5 + 0.5) * envI + ambient;
|
|
327
327
|
let R = reflect(-V, N);
|
|
328
328
|
var envSpec = mix(frame.ground.rgb, frame.sky.rgb, smoothstep(-0.25 - rough, 0.25 + rough, R.y)) * envI;
|
|
@@ -333,7 +333,7 @@ fn shade(N: vec3f, V: vec3f, L: vec3f, radiance: vec3f, NdotV: f32, f0: vec3f, d
|
|
|
333
333
|
color = color * frame.ground.w;
|
|
334
334
|
return vec4f(linearToSrgb(aces(color)), base.a);
|
|
335
335
|
}`),d.join(`
|
|
336
|
-
`))}function
|
|
336
|
+
`))}function Ks(e,t){return e===3?` ambient = ambient + frame.lightColor[${t}].rgb;`:e===4?` ambient = ambient + mix(frame.lightExtra[${t}].yzw, frame.lightColor[${t}].rgb, N.y * 0.5 + 0.5);`:e===0?` color = color + shade(N, V, -frame.lightDir[${t}].xyz, frame.lightColor[${t}].rgb * PI, NdotV, f0, diffuse, a);`:` {
|
|
337
337
|
let Lv = frame.lightPos[${t}].xyz - inp.world;
|
|
338
338
|
let d = length(Lv);
|
|
339
339
|
let L = Lv / max(d, 1e-5);
|
|
@@ -345,8 +345,8 @@ fn shade(N: vec3f, V: vec3f, L: vec3f, radiance: vec3f, NdotV: f32, f0: vec3f, d
|
|
|
345
345
|
att = att * w * w;
|
|
346
346
|
}${e===2?`\n att = att * smoothstep(frame.lightColor[${t}].w, frame.lightExtra[${t}].x, dot(-L, frame.lightDir[${t}].xyz));`:``}
|
|
347
347
|
color = color + shade(N, V, L, frame.lightColor[${t}].rgb * PI * att, NdotV, f0, diffuse, a);
|
|
348
|
-
}`}var
|
|
349
|
-
${
|
|
348
|
+
}`}var qs=`
|
|
349
|
+
${Hs}
|
|
350
350
|
@vertex
|
|
351
351
|
fn vs_line(inp: VSIn) -> @builtin(position) vec4f {
|
|
352
352
|
let M = mat4x4f(inp.m0, inp.m1, inp.m2, inp.m3);
|
|
@@ -371,4 +371,4 @@ fn fs_line() -> @location(0) vec4f {
|
|
|
371
371
|
}
|
|
372
372
|
return vec4f(linearToSrgb(material.baseColor.rgb + material.emissive.rgb), material.baseColor.a);
|
|
373
373
|
}
|
|
374
|
-
`,qs=4,Js=[{arrayStride:32,stepMode:`vertex`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`float32x2`}]},{arrayStride:64,stepMode:`instance`,attributes:[{shaderLocation:3,offset:0,format:`float32x4`},{shaderLocation:4,offset:16,format:`float32x4`},{shaderLocation:5,offset:32,format:`float32x4`},{shaderLocation:6,offset:48,format:`float32x4`}]}],Ys=(e,t)=>{let n=t;for(;n<e;)n*=2;return n},Xs=class{constructor(e,t={}){this.canvas=e,this.present=t.present||`canvas`,this.kind=`webgpu`,this.zeroToOne=!0,this.pipelines=new Map,this.meshModules=new Map,this.materialBindings=new Map,this.overlayBindings=new Map,this.poolGeneration=-1,this.vertexBuffer=null,this.indexBuffer=null,this.instanceBuffer=null,this.gpuBytes=0,this.lost=!1,this.info=``,this.errors=[]}async init(){if(!navigator.gpu)throw Error(`WebGPU is not available in this browser.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter is available.`);this.adapter=e;let t=e.info||{};this.info=[t.vendor,t.architecture,t.description].filter(Boolean).join(` `)||`WebGPU adapter`;let n=await e.requestDevice();if(this.device=n,n.lost.then(e=>{this.lost=!0,this.errors.push(`WebGPU device lost: ${e.message}`)}),n.onuncapturederror=e=>{this.errors.push(e.error&&e.error.message?e.error.message:String(e))},this.present===`readback`){if(this.format=`rgba8unorm`,this.ctx2d=this.canvas.getContext(`2d`),!this.ctx2d)throw Error(`Cannot create a 2D context for WebGPU readback presentation.`);this.canvasUsed=!0}else{let e=this.canvas.getContext(`webgpu`);if(!e)throw Error(`Cannot create a WebGPU canvas context.`);this.canvasUsed=!0,this.context=e,this.format=navigator.gpu.getPreferredCanvasFormat(),e.configure({device:n,format:this.format,alphaMode:`opaque`,colorSpace:`srgb`,toneMapping:{mode:`standard`}})}this.frameLayout=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]}),this.materialLayout=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:`filtering`}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:4,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:5,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:6,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}}]}),this.pipelineLayout=n.createPipelineLayout({bindGroupLayouts:[this.frameLayout,this.materialLayout]}),n.pushErrorScope(`validation`),this.lineModule=n.createShaderModule({code:Ks,label:`es3d lines`});for(let[e,t]of[[`mesh`,this.meshModule(0,`0`)],[`lines`,this.lineModule]]){let n=(await t.getCompilationInfo()).messages.filter(e=>e.type===`error`);if(n.length)throw Error(`WGSL ${e} shader error: ${n.map(e=>`${e.lineNum}:${e.linePos} ${e.message}`).join(`; `)}`)}let r=await n.popErrorScope();if(r)throw Error(`WebGPU initialisation error: ${r.message}`);this.frameBuffer=n.createBuffer({size:_s,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.frameBindGroup=n.createBindGroup({layout:this.frameLayout,entries:[{binding:0,resource:{buffer:this.frameBuffer}}]}),this.sampler=n.createSampler({addressModeU:`repeat`,addressModeV:`repeat`,magFilter:`linear`,minFilter:`linear`,mipmapFilter:`linear`,maxAnisotropy:8}),this.whiteTex=this.createTexture({width:1,height:1,data:new Uint8Array([255,255,255,255])},!0),this.flatNormalTex=this.createTexture({width:1,height:1,data:new Uint8Array([128,128,255,255])},!1),this.matData=new Float32Array(20)}createTexture(e,t){let n=e.width>1||e.height>1?ps(e):[e],r=this.device.createTexture({size:[e.width,e.height],format:t?`rgba8unorm-srgb`:`rgba8unorm`,mipLevelCount:n.length,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});return n.forEach((e,t)=>{let n=e.data instanceof Uint8Array?e.data:new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);this.device.queue.writeTexture({texture:r,mipLevel:t},n,{bytesPerRow:e.width*4,rowsPerImage:e.height},[e.width,e.height]),this.gpuBytes+=e.width*e.height*4}),{texture:r,view:r.createView()}}destroyTexture(e){e.texture.destroy()}meshModule(e,t){let n=`${e}|${t}`,r=this.meshModules.get(n);return r||(r=this.device.createShaderModule({code:Ws(e,t),label:`es3d mesh ${n}`}),this.meshModules.set(n,r)),r}pipeline(e,{cull:t=`back`,frontFace:n=`ccw`,blend:r=!1,depthWrite:i=!0,depthCompare:a=`less-equal`,flags:o=0,lights:s=``}={}){let c=e===`mesh`,l=`${e}|${t}|${n}|${r}|${i}|${a}${c?`|${o}|${s}`:``}`,u=this.pipelines.get(l);if(u)return u;let d=c?this.meshModule(o,s):this.lineModule,f=c?`vs_main`:e===`normals`?`vs_normals`:`vs_line`;return u=this.device.createRenderPipeline({label:l,layout:this.pipelineLayout,vertex:{module:d,entryPoint:f,buffers:Js},fragment:{module:d,entryPoint:c?`fs_main`:`fs_line`,targets:[{format:this.format,blend:r?{color:{srcFactor:`src-alpha`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}}:void 0}]},primitive:{topology:c?`triangle-list`:`line-list`,cullMode:c?t:`none`,frontFace:n},depthStencil:{format:`depth24plus`,depthWriteEnabled:i,depthCompare:a},multisample:{count:qs}}),this.pipelines.set(l,u),u}ensureTargets(){let e=this.canvas.width,t=this.canvas.height;this.targetW===e&&this.targetH===t&&this.msaa||(this.msaa&&this.msaa.destroy(),this.depth&&this.depth.destroy(),this.msaa=this.device.createTexture({size:[e,t],sampleCount:qs,format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.depth=this.device.createTexture({size:[e,t],sampleCount:qs,format:`depth24plus`,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.msaaView=this.msaa.createView(),this.depthView=this.depth.createView(),this.present===`readback`&&(this.offscreen&&this.offscreen.destroy(),this.readBuffer&&!this.readPending&&this.readBuffer.destroy(),this.offscreen=this.device.createTexture({size:[e,t],format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC}),this.offscreenView=this.offscreen.createView(),this.readStride=Math.ceil(e*4/256)*256,this.readBuffer=this.device.createBuffer({size:this.readStride*t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})),this.targetW=e,this.targetH=t)}readback(e){if(this.readPending)return!1;let t=this.targetW,n=this.targetH;return e.copyTextureToBuffer({texture:this.offscreen},{buffer:this.readBuffer,bytesPerRow:this.readStride},[t,n]),!0}startReadback(){let e=this.readBuffer,t=this.targetW,n=this.targetH,r=this.readStride;this.readPending=e.mapAsync(GPUMapMode.READ).then(()=>{let i=new Uint8Array(e.getMappedRange()),a=new Uint8ClampedArray(t*n*4);for(let e=0;e<n;e++)a.set(i.subarray(e*r,e*r+t*4),e*t*4);if(e.unmap(),this.ctx2d.putImageData(new ImageData(a,t,n),0,0),this.readPending=null,!this.lastFrameCopied&&this.offscreen&&!this.lost){let e=this.device.createCommandEncoder();this.readback(e),this.device.queue.submit([e.finish()]),this.lastFrameCopied=!0,this.startReadback()}})}syncPool(e){let t=this.device,n=e.vertices.byteLength,r=e.indices.byteLength,i=0;(e.generation!==this.poolGeneration||!this.vertexBuffer||this.vertexBuffer.size<n||this.indexBuffer.size<r)&&(this.vertexBuffer&&this.vertexBuffer.destroy(),this.indexBuffer&&this.indexBuffer.destroy(),this.vertexBuffer=t.createBuffer({size:Ys(n,65536),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),this.indexBuffer=t.createBuffer({size:Ys(r,65536),usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST}),this.poolGeneration=e.generation,e.uploadedVertices=0,e.uploadedIndices=0);let a=e.pending();if(a.vertexEnd>a.vertexStart){let n=e.vertices.subarray(a.vertexStart*8,a.vertexEnd*8);t.queue.writeBuffer(this.vertexBuffer,a.vertexStart*32,n.buffer,n.byteOffset,n.byteLength),i+=n.byteLength}if(a.indexEnd>a.indexStart){let n=e.indices.subarray(a.indexStart,a.indexEnd);t.queue.writeBuffer(this.indexBuffer,a.indexStart*4,n.buffer,n.byteOffset,n.byteLength),i+=n.byteLength}return e.markUploaded(),i}uploadInstances(e,t){let n=Math.max(64,t*64);return(!this.instanceBuffer||this.instanceBuffer.size<n)&&(this.instanceBuffer&&this.instanceBuffer.destroy(),this.instanceBuffer=this.device.createBuffer({size:Ys(n,16384),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})),t&&this.device.queue.writeBuffer(this.instanceBuffer,0,e.buffer,e.byteOffset,t*64),t*64}readyTexture(e,t){return e&&e.status===`ready`&&!e.gpu&&(e.gpu=this.createTexture(e.pixels,t)),e&&e.gpu?e.gpu:null}materialEntries(e,t,n,r,i,a){return[{binding:0,resource:{buffer:e}},{binding:1,resource:this.sampler},{binding:2,resource:t.view},{binding:3,resource:n.view},{binding:4,resource:r.view},{binding:5,resource:i.view},{binding:6,resource:a.view}]}materialBinding(e,t,n){let r=n?`ds`:`ss`,i=this.materialBindings.get(e);i||(i={},this.materialBindings.set(e,i));let a=this.readyTexture(e.map?t.get(e.map,`color`):null,!0),o=this.readyTexture(e.normalMap?t.get(e.normalMap,`normal`):null,!1),s=this.readyTexture(e.metallicRoughnessMap?t.get(e.metallicRoughnessMap,`linear`):null,!1),c=this.readyTexture(e.occlusionMap?t.get(e.occlusionMap,`linear`):null,!1),l=this.readyTexture(e.emissiveMap?t.get(e.emissiveMap,`color`):null,!0),u=!!a,d=!!o,f=!!s,p=!!c,m=!!l,h=`${u}|${d}|${f}|${p}|${m}`,g=i[r];if(!g||g.key!==h){g&&g.buffer.destroy(),Cs(this.matData,e,{hasMap:u,hasNormalMap:d,hasMrMap:f,hasOcclusionMap:p,hasEmissiveMap:m,doubleSided:n||e.doubleSided});let t=this.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(t,0,this.matData);let _=this.device.createBindGroup({layout:this.materialLayout,entries:this.materialEntries(t,a||this.whiteTex,o||this.flatNormalTex,s||this.whiteTex,c||this.whiteTex,l||this.whiteTex)});g=i[r]={key:h,buffer:t,bindGroup:_,flags:this.matData[10]}}return g}overlayBinding(e,t){let n=this.overlayBindings.get(e);if(n)return n;ws(this.matData,t);let r=this.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return this.device.queue.writeBuffer(r,0,this.matData),n=this.device.createBindGroup({layout:this.materialLayout,entries:this.materialEntries(r,this.whiteTex,this.flatNormalTex,this.whiteTex,this.whiteTex,this.whiteTex)}),this.overlayBindings.set(e,n),n}releaseMaterials(e){for(let[t,n]of this.materialBindings)if(!e.has(t)){for(let e of Object.values(n))e.buffer.destroy();this.materialBindings.delete(t)}}get caps(){return{msaaSamples:qs,anisotropy:8,maxTextureSize:this.device?this.device.limits.maxTextureDimension2D:0,colorSpace:`srgb`}}resize(e,t){(this.canvas.width!==e||this.canvas.height!==t)&&(this.canvas.width=e,this.canvas.height=t)}render(e,t,n){if(this.lost)return;let r=this.device;this.ensureTargets(),r.queue.writeBuffer(this.frameBuffer,0,t.buffer,t.byteOffset,t.byteLength),this.uploadInstances(e.instanceData,e.instanceCount);let i=r.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:this.msaaView,resolveTarget:this.present===`readback`?this.offscreenView:this.context.getCurrentTexture().createView(),clearValue:{r:n.background[0],g:n.background[1],b:n.background[2],a:1},loadOp:`clear`,storeOp:`discard`}],depthStencilAttachment:{view:this.depthView,depthClearValue:1,depthLoadOp:`clear`,depthStoreOp:`discard`}});a.setBindGroup(0,this.frameBindGroup),this.vertexBuffer&&(a.setVertexBuffer(0,this.vertexBuffer),a.setIndexBuffer(this.indexBuffer,`uint32`)),a.setVertexBuffer(1,this.instanceBuffer);let o=null,s=e=>{e!==o&&(a.setPipeline(e),o=e)};if(this.vertexBuffer){let r=null,i=Ss(t);for(let t of e.batches){let e=t.kind===`lines`,o=this.materialBinding(t.material,n.textures,t.doubleSided&&!t.material.doubleSided);s(e?this.pipeline(`lines`,{blend:t.transparent,depthWrite:!t.transparent}):this.pipeline(`mesh`,{cull:t.doubleSided?`none`:`back`,frontFace:t.mirrored?`cw`:`ccw`,blend:t.transparent,depthWrite:!t.transparent,flags:o.flags,lights:i}));let c=o.bindGroup;c!==r&&(a.setBindGroup(1,c),r=c),a.drawIndexed(t.range.indexCount,t.count,t.range.firstIndex,0,t.firstInstance)}let o=e.overlays,c=(e,t,n,r,i=`less-equal`)=>{if(r.length){s(this.pipeline(e,{blend:!0,depthWrite:!1,depthCompare:i})),a.setBindGroup(1,this.overlayBinding(t,n));for(let e of r)a.drawIndexed(e.range.indexCount,e.count,e.range.firstIndex,0,e.firstInstance)}};c(`lines`,`wireframe`,n.overlayColors.wireframe,o.wireframe),c(`normals`,`normals`,n.overlayColors.normals,o.normals),o.bbox&&o.bbox.count&&c(`lines`,`bbox`,n.overlayColors.bbox,[{...o.bbox,range:n.cubeRange}]),o.selection&&o.selection.count&&c(`lines`,`selection`,n.overlayColors.selection,[{...o.selection,range:n.cubeRange}],`always`)}a.end();let c=this.present===`readback`&&this.readback(i);r.queue.submit([i.finish()]),c&&this.startReadback(),this.lastFrameCopied=c}async finish(){if(await this.device.queue.onSubmittedWorkDone(),this.readPending&&await this.readPending,this.present===`readback`&&!this.lastFrameCopied&&this.offscreen){let e=this.device.createCommandEncoder();this.readback(e),this.device.queue.submit([e.finish()]),this.startReadback(),await this.readPending,this.lastFrameCopied=!0}}dispose(){if(this.device){for(let e of[this.vertexBuffer,this.indexBuffer,this.instanceBuffer,this.frameBuffer])e&&e.destroy();for(let e of this.materialBindings.values())for(let t of Object.values(e))t.buffer.destroy();this.msaa&&this.msaa.destroy(),this.depth&&this.depth.destroy(),this.device.destroy()}}},Zs=()=>performance.now();function Qs(){let e=[];for(let t=0;t<8;t++)e.push(t&1?.5:-.5,t&2?.5:-.5,t&4?.5:-.5);return new Y({positions:Float32Array.from(e),indices:Uint32Array.from([0,1,2,3,4,5,6,7,0,2,1,3,4,6,5,7,0,4,1,5,2,6,3,7]),kind:`lines`})}var $s={wireframe:[.02,.03,.05,.55],normals:[1,.82,.15,.95],bbox:[.35,.78,1,.75],selection:[1,.55,.12,1]},ec=32<<20,tc=class{constructor(e){this.backend=e,this.kind=e.kind,this.pool=new Jo,this.frames=new ns,this.textures=new gs,this.frameData=new Float32Array(304),this.options={wireframe:!1,normals:!1,bbox:!1,autoLod:!0,fixedLod:0,culling:!0,lodBias:1,maxPixelRatio:2,lodPixels:`css`,tessellationBudget:1/0},this.selection=new Set,this.scene=null,this.meshOf=null,this.cube=Qs(),this.cubeRange=this.pool.meshRange(this.cube),this.lastDraw=null,this.lightInfo={truncated:0,usedDefaults:!1},this.stats={cpuMs:0,uploadBytes:0,totalUploadBytes:0,drawCalls:0,triangles:0,visible:0,instances:0},this.gpuEpoch=0}get info(){return this.backend.info}get caps(){return{backend:this.kind,...this.backend.caps,maxPixelRatio:this.options.maxPixelRatio,lodPixels:this.options.lodPixels,lightsDropped:this.lightInfo.truncated||0}}pixelRatio(e){return Math.min(e||1,this.options.maxPixelRatio||1/0)}setScene(e,t,{keepGeometry:n=!0}={}){this.scene=e,this.meshOf=t,(!e||!n||!e.parts&&this.pool.byteSize>ec)&&(this.pool.reset(),this.pool.unusedBytes=0,this.cubeRange=this.pool.meshRange(this.cube)),this.backend.releaseMaterials(new Set(e?e.materials:[])),this.stats.totalUploadBytes=0}updateScene(e){for(let t of e.takeReleased())if(!e.geomIndex.has(t))for(let e of t.meshes){if(!e)continue;let t=this.pool.ranges.get(e);t&&(this.pool.unusedBytes=(this.pool.unusedBytes||0)+e.vertexCount*32+t.indexCount*4)}this.pool.byteSize>ec&&(this.pool.unusedBytes||0)*2>this.pool.byteSize&&(this.pool.reset(),this.pool.unusedBytes=0,this.cubeRange=this.pool.meshRange(this.cube)),(this.materialsSeen!==e.materials.length||e.freeMaterials.length)&&this.backend.releaseMaterials(new Set(e.materials)),this.materialsSeen=e.materials.length}render(e,t){let n=Zs(),r=this.pixelRatio(t.dpr),i=Math.max(1,Math.round(t.width*r)),a=Math.max(1,Math.round(t.height*r));this.backend.resize(i,a);let o=this.scene,s=o?o.bounds:{min:[-1,-1,-1],max:[1,1,1]};e.update(i/a,this.backend.zeroToOne,s);let c=o&&o.environment?o.environment:{background:[.09,.1,.12,1],sky:[.8,.86,.95,1],ground:[.25,.22,.2,1],intensity:.5,exposure:1},l;l=o?this.buildFrame(e,t,a):{batches:[],overlays:{wireframe:[],normals:[],bbox:null,selection:null},instanceData:new Float32Array(16),instanceCount:0,stats:{instances:0,visible:0,culled:0,batches:0,drawCalls:0,triangles:0,lodHistogram:[0,0,0,0],refining:0}};let u=Math.hypot(s.max[0]-s.min[0],s.max[1]-s.min[1],s.max[2]-s.min[2])/2||1;this.lightInfo=xs(this.frameData,{viewProj:e.viewProj,view:e.view,cameraPos:e.position,time:t.time||0,environment:c,lights:o?o.lights:[],normalLength:u*.025,lineBias:.0015,viewportHeight:a});let d=this.backend.syncPool(this.pool),f=this.backend.resourceEpoch||0;if(f!==this.gpuEpoch){this.gpuEpoch=f;for(let e of this.textures.entries.values())e.gpu=null}this.backend.render(l,this.frameData,{background:c.background,textures:this.textures,overlayColors:$s,cubeRange:this.cubeRange}),this.lastDraw=l;let p=this.stats;return p.cpuMs=Zs()-n,p.uploadBytes=d+l.instanceCount*64,p.totalUploadBytes+=d,p.drawCalls=l.stats.drawCalls,p.triangles=l.stats.triangles,p.visible=l.stats.visible,p.instances=l.stats.instances,p.culled=l.stats.culled,p.batches=l.stats.batches,p.lodHistogram=l.stats.lodHistogram,p.refining=l.stats.refining||0,p.geometryBytes=this.pool.byteSize,p.instanceBytes=l.instanceCount*64,p.textureBytes=this.backend.gpuBytes,l}buildFrame(e,t,n,r=this.options.tessellationBudget){let i=this.options.lodPixels===`device`?n:Math.max(1,Math.round(t.height));return this.frames.build({scene:this.scene,camera:e,pool:this.pool,meshOf:this.meshOf,viewportHeight:i,options:{...this.options,selection:this.selection,tessellationBudget:r}})}prepare(e,t){if(!this.scene)return;let n=this.pixelRatio(t.dpr),r=Math.max(1,Math.round(t.width*n)),i=Math.max(1,Math.round(t.height*n)),a=e.clone();a.update(r/i,this.backend.zeroToOne,this.scene.bounds);let o=this.frames.last;this.buildFrame(a,t,i,1/0),this.frames.last=o}finish(){return this.backend.finish()}dispose(){this.textures.clear(e=>this.backend.destroyTexture(e)),this.backend.dispose()}};async function nc(e,t={}){let n=t.backend||`auto`,r=[],i=!1;if((n===`auto`||n===`webgpu`)&&typeof navigator<`u`&&navigator.gpu){let a=new Xs(e,{present:t.present});try{return await a.init(),new tc(a)}catch(e){r.push(e.message),i=!!a.canvasUsed;try{a.dispose()}catch{}if(n===`webgpu`)throw e}}else if(n===`webgpu`)throw Error(`WebGPU is not available in this browser.`);let a=e;i&&e.getContext&&e.parentNode&&(a=e.cloneNode(!1),e.parentNode.replaceChild(a,e));let o=new Bs(a);await o.init();let s=new tc(o);return s.fallbackReason=r.join(`; `),s.canvas=a,s}var rc=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ic=new Uint32Array(64),ac=new TextEncoder;function oc(e){let t=typeof e==`string`?ac.encode(e):e instanceof Uint8Array?e:new Uint8Array(e.buffer||e,e.byteOffset||0,e.byteLength),n=t.length,r=n+9+63&-64,i=new Uint8Array(r);i.set(t),i[n]=128;let a=new DataView(i.buffer);a.setUint32(r-8,Math.floor(n/536870912),!1),a.setUint32(r-4,n<<3>>>0,!1);let o=1779033703,s=3144134277,c=1013904242,l=2773480762,u=1359893119,d=2600822924,f=528734635,p=1541459225;for(let e=0;e<r;e+=64){for(let t=0;t<16;t++)ic[t]=a.getUint32(e+t*4,!1);for(let e=16;e<64;e++){let t=ic[e-15],n=ic[e-2],r=(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3,i=(n>>>17|n<<15)^(n>>>19|n<<13)^n>>>10;ic[e]=ic[e-16]+r+ic[e-7]+i|0}let t=o,n=s,r=c,i=l,m=u,h=d,g=f,_=p;for(let e=0;e<64;e++){let a=(m>>>6|m<<26)^(m>>>11|m<<21)^(m>>>25|m<<7),o=_+a+(m&h^~m&g)+rc[e]+ic[e]|0,s=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+(t&n^t&r^n&r)|0;_=g,g=h,h=m,m=i+o|0,i=r,r=n,n=t,t=o+s|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+i|0,u=u+m|0,d=d+h|0,f=f+g|0,p=p+_|0}let m=``;for(let e of[o,s,c,l,u,d,f,p])m+=(e>>>0).toString(16).padStart(8,`0`);return m}var sc=1194545989,cc=new Uint8Array(new Uint16Array([1]).buffer)[0]===1,lc=new TextEncoder,uc=new TextDecoder,dc=e=>e+3&-4;function fc(e,t){let n=[],r=0,i={key:e,entries:[]};for(let e of t){let t=[];for(let{lod:i,mesh:a,reports:o}of e){let e=a.positions.length/3,s=a.indices.length,c=e<=65536?2:4;t.push({lod:i,kind:a.kind,v:e,i:s,w:c,at:r,reports:o?o.map(e=>[e.severity,e.code,e.message]):[]}),n.push({mesh:a,at:r,w:c}),r+=e*32+dc(s*c)}i.entries.push(t)}let a=lc.encode(JSON.stringify(i)),o=12+dc(a.length),s=new ArrayBuffer(o+r),c=new Uint8Array(s),l=new DataView(s);l.setUint32(0,sc,!0),l.setUint32(4,1,!0),l.setUint32(8,o-12,!0),c.set(a,12),c.fill(32,12+a.length,o);for(let{mesh:e,at:t,w:r}of n){let n=e.positions.length/3,i=o+t;new Float32Array(s,i,n*3).set(e.positions),new Float32Array(s,i+n*12,n*3).set(e.normals),new Float32Array(s,i+n*24,n*2).set(e.uvs),new(r===2?Uint16Array:Uint32Array)(s,i+n*32,e.indices.length).set(e.indices)}return s}var pc=e=>Number.isInteger(e)&&e>=0;function mc(e){if(!cc||!(e instanceof ArrayBuffer)||e.byteLength<12)return null;let t=new DataView(e);if(t.getUint32(0,!0)!==sc||t.getUint32(4,!0)!==1)return null;let n=t.getUint32(8,!0);if(n%4||12+n>e.byteLength)return null;let r;try{r=JSON.parse(uc.decode(new Uint8Array(e,12,n)))}catch{return null}if(!r||typeof r.key!=`string`||!Array.isArray(r.entries))return null;let i=12+n,a=[];for(let t of r.entries){if(!Array.isArray(t))return null;let n=[];for(let r of t){if(!r||!pc(r.lod)||!pc(r.v)||!pc(r.i)||!pc(r.at)||r.at%4||r.kind!==`triangles`&&r.kind!==`lines`||r.w!==2&&r.w!==4||r.w===2&&r.v>65536||r.i%(r.kind===`lines`?2:3))return null;let t=i+r.at;if(t+r.v*32+r.i*r.w>e.byteLength)return null;let a=r.w===2?new Uint32Array(new Uint16Array(e,t+r.v*32,r.i)):new Uint32Array(e,t+r.v*32,r.i),o=new Y({positions:new Float32Array(e,t,r.v*3),normals:new Float32Array(e,t+r.v*12,r.v*3),uvs:new Float32Array(e,t+r.v*24,r.v*2),indices:a,kind:r.kind}),s=Array.isArray(r.reports)?r.reports.filter(e=>Array.isArray(e)&&e.length===3).map(([e,t,n])=>({severity:String(e),code:String(t),message:String(n)})):[];n.push({lod:r.lod,mesh:o,reports:s})}a.push(n)}return{key:r.key,entries:a}}var hc=()=>typeof performance<`u`?performance.now():Date.now(),gc=null;function _c(){if(gc)return gc;let e=new Float64Array(216),t=0;for(let n=0;n<24;n++){let r=(n-11.5)*.8284271247461902;e[t++]=Math.sin(r),e[t++]=Math.cos(r),e[t++]=Math.tan(r),e[t++]=Math.atan2(r,1.7-n*.11),e[t++]=Math.acos(Math.max(-1,Math.min(1,r/10))),e[t++]=Math.hypot(r,n*.3),e[t++]=Math.hypot(r,n*.3,1/(n+1)),e[t++]=Math.cbrt(r),e[t++]=Math.sqrt(n+.1)}return gc=new Uint8Array(e.buffer),gc}var vc=typeof crypto<`u`&&crypto.subtle&&typeof crypto.subtle.digest==`function`?crypto.subtle:null,yc=new TextEncoder;async function bc(e,t){if(t&&vc)try{let t=new Uint8Array(await vc.digest(`SHA-256`,e)),n=``;for(let e of t)n+=(e<16?`0`:``)+e.toString(16);return n}catch{}return oc(e)}async function xc(e,t={}){let n=[];for(let r of t.entries||e.entries.values())r.identity&&n.push(r);if(!n.length)return{key:null,entries:n};n.sort((e,t)=>e.identity<t.identity?-1:+(e.identity>t.identity));let r=yc.encode(`es3d-geometry:1:${e.quality}:${n.length}:${n.map(e=>e.identity).join(``)}`),i=_c(),a=new Uint8Array(r.length+i.length);return a.set(r),a.set(i,r.length),{key:await bc(a,t.native!==!1),entries:n}}function Sc(e){let t=[];for(let n=0;n<e.lods;n++){let r=e.meshes[n];r&&!(e.failedLods&1<<n)&&t.push({lod:n,mesh:r,reports:e.reports[n]})}return t}var Cc=(e,t)=>t>0&&t<1/0?Promise.race([e,new Promise(e=>setTimeout(()=>e(void 0),t))]):e;async function wc(e,t,n={}){let r=hc(),i=e=>({hit:!1,key:null,levels:0,bytes:0,...e,ms:hc()-r}),a=await Cc(Promise.resolve(t),n.timeout??250);if(!a)return i({reason:a===void 0?`store timed out`:`no store`});let{key:o,entries:s}=await xc(e,{entries:n.entries});if(!o)return i({reason:`nothing cacheable`});let c;try{c=await Cc(a.get(o),n.timeout??250)}catch{c=null}if(c===void 0)return i({key:o,reason:`store timed out`});if(!c)return e.persisted=null,i({key:o,reason:`miss`});let l=mc(c);if(!l||l.key!==o||l.entries.length!==s.length)return Promise.resolve(a.delete(o)).catch(()=>{}),i({key:o,reason:`invalid record`});let u=0,d=0;for(let t=0;t<s.length;t++){let n=l.entries[t];d+=n.length;for(let{lod:r,mesh:i,reports:a}of n)e.adopt(s[t],r,i,a)&&u++}return Ec(e,`${o}:${d}`),{hit:!0,key:o,levels:u,bytes:c.byteLength,ms:hc()-r}}function Tc(e){let t=0;for(let n of e)t+=Sc(n).length;return t}function Ec(e,t){e.persisted=t,e.persistedSet||=new Set,e.persistedSet.size>4096&&e.persistedSet.clear(),e.persistedSet.add(t)}async function Dc(e,t,n={}){let r=await t;if(!r)return{saved:!1,key:null,bytes:0,reason:`no store`};let{key:i,entries:a}=await xc(e,{entries:n.entries});if(!i)return{saved:!1,key:null,bytes:0,reason:`nothing cacheable`};let o=`${i}:${Tc(a)}`;if(e.persisted===o||e.persistedSet&&e.persistedSet.has(o))return{saved:!1,key:i,bytes:0,reason:`up to date`};let s=a.map(Sc);if(!s.some(e=>e.length))return{saved:!1,key:i,bytes:0,reason:`nothing generated`};let c=fc(i,s);if(r.maxBytes&&c.byteLength>r.maxBytes/4)return{saved:!1,key:i,bytes:c.byteLength,reason:`too large`};try{await r.put(i,c)}catch(e){return{saved:!1,key:i,bytes:c.byteLength,reason:`store failed: ${e&&e.message?e.message:e}`}}return Ec(e,o),{saved:!0,key:i,bytes:c.byteLength}}function Oc(e,t={}){let n=t.delay??1500,r=typeof requestIdleCallback==`function`?e=>requestIdleCallback(e,{timeout:5e3}):e=>setTimeout(e,0),i=0,a=null,o=-1,s=new Map,c=()=>{let t=a;a=null;let n=[...s.values()];s.clear(),t&&Dc(t,e).catch(()=>{}),n.reduce((t,n)=>t.then(()=>Dc(n.cache,e,{entries:n.entries()}).catch(()=>{})),Promise.resolve())};return{store:e,restore(t,n){return e?wc(t,e,n):Promise.resolve(null)},changed(t,l){if(e){if(l)s.set(l.owner,{cache:t,entries:l.entries});else{if(t===a&&t.stats.generated===o)return;a=t,o=t.stats.generated}clearTimeout(i),i=setTimeout(()=>r(c),n)}},forget(e){s.delete(e)}}}var kc={maxBytes:67108864,maxRecords:256},Ac=e=>new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)}),jc=e=>new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error||Error(`transaction aborted`))});async function Mc(e={}){let{name:t,maxBytes:n,maxRecords:r,timeout:i}={name:`es3d-geometry`,timeout:2e3,...kc,...e},a=typeof indexedDB<`u`?indexedDB:null;if(!a)return null;let o;try{o=await Cc(new Promise((e,n)=>{let r=a.open(t,1);r.onupgradeneeded=()=>{let e=r.result;e.objectStoreNames.contains(`data`)||e.createObjectStore(`data`),e.objectStoreNames.contains(`meta`)||e.createObjectStore(`meta`,{keyPath:`key`}).createIndex(`used`,`used`)},r.onsuccess=()=>e(r.result),r.onerror=()=>n(r.error),r.onblocked=()=>e(null)}),i)}catch{return null}if(!o)return null;o.onversionchange=()=>o.close();let s=e=>{try{let t=o.transaction(`meta`,`readwrite`).objectStore(`meta`),n=t.get(e);n.onsuccess=()=>{n.result&&t.put({...n.result,used:Date.now()})}}catch{}};return{kind:`indexeddb`,maxBytes:n,async get(e){let t=await Ac(o.transaction(`data`,`readonly`).objectStore(`data`).get(e));return t instanceof ArrayBuffer?((typeof requestIdleCallback==`function`?requestIdleCallback:setTimeout)(()=>s(e)),t):null},async put(e,t){let i=o.transaction([`data`,`meta`],`readwrite`),a=i.objectStore(`data`),s=i.objectStore(`meta`);a.put(t,e),s.put({key:e,bytes:t.byteLength,used:Date.now(),revision:1});let c=await Ac(s.getAll());c.sort((e,t)=>(e.revision===1)-(t.revision===1)||e.used-t.used);let l=c.reduce((e,t)=>e+t.bytes,0),u=c.length;for(let t of c)if(t.key!==e){if(t.revision===1&&l<=n&&u<=r)break;a.delete(t.key),s.delete(t.key),l-=t.bytes,u--}await jc(i)},async delete(e){let t=o.transaction([`data`,`meta`],`readwrite`);t.objectStore(`data`).delete(e),t.objectStore(`meta`).delete(e),await jc(t)},async clear(){let e=o.transaction([`data`,`meta`],`readwrite`);e.objectStore(`data`).clear(),e.objectStore(`meta`).clear(),await jc(e)},close(){o.close()}}}async function Nc(e={}){let t=await Mc(e).catch(()=>null);return t&&e.persist&&typeof navigator<`u`&&navigator.storage&&navigator.storage.persist&&navigator.storage.persist().catch(()=>{}),t}var Pc=class e{constructor(){this.type=`perspective`,this.position=[6,4,8],this.target=[0,0,0],this.up=[0,1,0],this.fov=45,this.orthoHeight=10,this.near=null,this.far=null,this.refAspect=1,this.fit=`contain`,this.view=nt(),this.proj=nt(),this.viewProj=nt(),this.invViewProj=nt(),this.currentNear=.1,this.currentFar=1e3}fromSpec(e){return this.type=e.type||`perspective`,this.position=e.position.slice(),this.target=e.target.slice(),this.up=e.up.slice(),this.fov=e.fov||45,this.orthoHeight=e.height||10,this.near=e.near||null,this.far=e.far||null,this.refAspect=e.aspect||1,this.fit=e.fit||`contain`,this}clone(){let t=new e;return t.type=this.type,t.position=this.position.slice(),t.target=this.target.slice(),t.up=this.up.slice(),t.fov=this.fov,t.orthoHeight=this.orthoHeight,t.near=this.near,t.far=this.far,t.refAspect=this.refAspect,t.fit=this.fit,t}extentScale(e){let t=(this.refAspect>0?this.refAspect:1)/e;switch(this.fit){case`cover`:return Math.min(1,t);case`width`:return t;case`height`:return 1;default:return Math.max(1,t)}}get distance(){return Math.hypot(this.position[0]-this.target[0],this.position[1]-this.target[1],this.position[2]-this.target[2])}frame(e,t=[.62,.5,.75]){let n=[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],r=Math.max(.001,Math.hypot(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2])/2),i=Math.hypot(...t),a=this.type===`orthographic`?r*3:r/Math.sin(this.fov/2*Math.PI/180)*1.05;return this.target=n,this.position=[n[0]+t[0]/i*a,n[1]+t[1]/i*a,n[2]+t[2]/i*a],this.up=[0,1,0],this.orthoHeight=r*2.2,this.refAspect=1,this.fit=`contain`,this}update(e,t,n){xt(this.view,this.position,this.target,this.up);let r=this.near,i=this.far;if(r===null||i===null){let e=.05,t=2e3;if(n){let r=[(n.min[0]+n.max[0])/2,(n.min[1]+n.max[1])/2,(n.min[2]+n.max[2])/2],i=Math.max(.001,Math.hypot(n.max[0]-n.min[0],n.max[1]-n.min[1],n.max[2]-n.min[2])/2),a=Math.hypot(this.position[0]-r[0],this.position[1]-r[1],this.position[2]-r[2]);t=(a+i)*1.5+.001,e=Math.max((a-i)*.5,i*.002,t/5e4,1e-4)}r===null&&(r=e),i===null&&(i=Math.max(t,r*10))}if(this.currentNear=r,this.currentFar=i,this.type===`orthographic`){let n=this.orthoHeight*this.extentScale(e)/2,a=n*e;bt(this.proj,-a,a,-n,n,this.near===null?-i:r,i,t)}else yt(this.proj,this.verticalFov(e),e,r,i,t);this.aspect=e,at(this.viewProj,this.proj,this.view),ht(this.invViewProj,this.viewProj)}verticalFov(e){let t=this.fov*Math.PI/180,n=this.extentScale(e);return n===1?t:2*Math.atan(Math.tan(t/2)*n)}ray(e,t,n,r,i=!1){let a=e/n*2-1,o=1-t/r*2,s=i?0:-1,c=[0,0,0],l=[0,0,0];_t(c,this.invViewProj,a,o,s),_t(l,this.invViewProj,a,o,1);let u=[l[0]-c[0],l[1]-c[1],l[2]-c[2]],d=Math.hypot(u[0],u[1],u[2])||1;return{origin:c,dir:[u[0]/d,u[1]/d,u[2]/d]}}pixelsPerUnit(e,t){let n=this.aspect||1;return this.type===`orthographic`?t/(this.orthoHeight*this.extentScale(n)):t/(2*Math.max(e,1e-6)*Math.tan(this.verticalFov(n)/2))}},Fc=Math.PI/180,Ic=.001;function Lc(e,t){if(!t)return;let n=e.position,r=e.target;if(t.targetMin&&t.targetMax)for(let e=0;e<3;e++){let i=Math.min(t.targetMax[e],Math.max(t.targetMin[e],r[e]));n[e]+=i-r[e],r[e]=i}let i=[n[0]-r[0],n[1]-r[1],n[2]-r[2]],a=Math.hypot(i[0],i[1],i[2]);if(a<1e-12)return;let o=Math.acos(Math.max(-1,Math.min(1,i[1]/a))),s=Math.atan2(i[0],i[2]),c=t.minPolar??0,l=t.maxPolar??180,u=c>0||l<180;u&&(o=Math.min(Math.min(l*Fc,Math.PI-Ic),Math.max(Math.max(c*Fc,Ic),o)));let d=a;if(t.minDistance!=null&&(d=Math.max(d,t.minDistance)),t.maxDistance!=null&&(d=Math.min(d,t.maxDistance)),!u&&d===a)return;let f=Math.sin(o);n[0]=r[0]+d*f*Math.sin(s),n[1]=r[1]+d*Math.cos(o),n[2]=r[2]+d*f*Math.cos(s)}function Rc(e,t){let n=t.bounds,r=Math.hypot(n.max[0]-n.min[0],n.max[1]-n.min[1],n.max[2]-n.min[2])/2||1;return Math.max((e.currentNear||0)*2,r*.01)}function zc(e,t,n){let{scene:r,meshOf:i}=n;if(!r||!r.count)return!1;let a=n.margin??Rc(t,r),o=[t.target[0]-e.target[0],t.target[1]-e.target[1],t.target[2]-e.target[2]],s=e.position.slice(),c=[t.position[0]-s[0],t.position[1]-s[1],t.position[2]-s[2]],l=Math.hypot(c[0],c[1],c[2]);if(l<1e-12)return!1;let u=!1,d=0;for(let e=0;e<2;e++){let t=Math.hypot(c[0],c[1],c[2]);if(t<1e-12)break;let o=[c[0]/t,c[1]/t,c[2]/t],l=xo(r,i,s,o,{isVisible:n.isVisible,maxDistance:t+a*4,skipFlags:2,facing:!0}),f=l?Math.abs(o[0]*l.normal[0]+o[1]*l.normal[1]+o[2]*l.normal[2]):0,p=l?Math.max(0,l.distance-a/Math.max(f,.25)):t,m=Math.min(1,p/t);for(let e=0;e<3;e++)s[e]+=c[e]*m;if(e===0&&(d=m),m>=1)break;u=!0;let h=c.map(e=>e*(1-m)),g=h[0]*l.normal[0]+h[1]*l.normal[1]+h[2]*l.normal[2];c=h.map((e,t)=>e-l.normal[t]*g)}if(!u)return!1;let f=Math.hypot(o[0]-(t.position[0]-e.position[0]),o[1]-(t.position[1]-e.position[1]),o[2]-(t.position[2]-e.position[2]))<l*1e-6;for(let n=0;n<3;n++)t.target[n]=e.target[n]+(f?s[n]-e.position[n]:o[n]*d),t.position[n]=s[n];return!0}function Bc(e,t,n,r){return Lc(t,n),n&&n.collide&&r?zc(e,t,r):!1}var Vc=class{constructor(e,t){this.el=e,this.camera=t,this.enabled=!0,this.enableZoom=!0,this.enablePan=!0,this.limits=null,this.world=null,this.rotateSpeed=.006,this.zoomSpeed=.0015,this.onChange=null,this.onClick=null,this.onDoubleClick=null,this.pointers=new Map,this.mode=null,this.moved=0,this.last=null,this.pinch=null,this._down=e=>this.pointerDown(e),this._move=e=>this.pointerMove(e),this._up=e=>this.pointerUp(e),this._wheel=e=>this.wheel(e),this._ctx=e=>e.preventDefault(),this._dbl=e=>{if(this.onDoubleClick){let t=this.el.getBoundingClientRect();this.onDoubleClick(e.clientX-t.left,e.clientY-t.top,e)}},e.addEventListener(`pointerdown`,this._down),e.addEventListener(`pointermove`,this._move),e.addEventListener(`pointerup`,this._up),e.addEventListener(`pointercancel`,this._up),e.addEventListener(`wheel`,this._wheel,{passive:!1}),e.addEventListener(`contextmenu`,this._ctx),e.addEventListener(`dblclick`,this._dbl),e.style.touchAction=`none`}dispose(){let e=this.el;e.removeEventListener(`pointerdown`,this._down),e.removeEventListener(`pointermove`,this._move),e.removeEventListener(`pointerup`,this._up),e.removeEventListener(`pointercancel`,this._up),e.removeEventListener(`wheel`,this._wheel),e.removeEventListener(`contextmenu`,this._ctx),e.removeEventListener(`dblclick`,this._dbl)}configure(e,t={}){this.limits=e,t.world&&(this.world=t.world);let n=e?e.mode:`orbit`;this.enabled=t.ignoreMode||n===`orbit`,this.enableZoom=!e||e.zoom!==!1,this.enablePan=!e||e.pan!==!1,this.el.style.touchAction=this.enabled?`none`:`auto`}changed(){this.onChange&&this.onChange()}snapshot(){return{position:this.camera.position.slice(),target:this.camera.target.slice()}}constrain(e){if(!this.limits)return;let t=this.limits.collide&&this.world?this.world():null;Bc(e,this.camera,this.limits,t)}pointerDown(e){if(this.enabled){if(this.el.setPointerCapture(e.pointerId),this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),this.moved=0,this.pointers.size===2){let[e,t]=[...this.pointers.values()];this.pinch={d:Math.hypot(e.x-t.x,e.y-t.y),cx:(e.x+t.x)/2,cy:(e.y+t.y)/2},this.mode=`pinch`}else this.mode=e.button===2||e.button===1||e.shiftKey||e.ctrlKey||e.metaKey?`pan`:`orbit`,this.last={x:e.clientX,y:e.clientY}}}pointerMove(e){if(!this.enabled||!this.pointers.has(e.pointerId))return;this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=this.snapshot();if(this.mode===`pinch`&&this.pointers.size>=2){let[e,n]=[...this.pointers.values()],r=Math.hypot(e.x-n.x,e.y-n.y),i=(e.x+n.x)/2,a=(e.y+n.y)/2;this.pinch.d>0&&this.enableZoom&&this.zoom(this.pinch.d/Math.max(r,1)),this.enablePan&&this.pan(i-this.pinch.cx,a-this.pinch.cy),this.pinch={d:r,cx:i,cy:a},this.moved+=10,this.constrain(t),this.changed();return}if(!this.last)return;let n=e.clientX-this.last.x,r=e.clientY-this.last.y;this.last={x:e.clientX,y:e.clientY},this.moved+=Math.abs(n)+Math.abs(r),this.mode===`orbit`?this.orbit(n,r):this.mode===`pan`&&this.enablePan&&this.pan(n,r),this.constrain(t),this.changed()}pointerUp(e){if(this.pointers.has(e.pointerId)){this.pointers.delete(e.pointerId);try{this.el.releasePointerCapture(e.pointerId)}catch{}if(this.pointers.size===0){if(this.moved<4&&this.onClick&&e.button===0){let t=this.el.getBoundingClientRect();this.onClick(e.clientX-t.left,e.clientY-t.top,e)}this.mode=null,this.last=null,this.pinch=null}else if(this.pointers.size===1){let e=[...this.pointers.values()][0];this.mode=`orbit`,this.last={x:e.x,y:e.y},this.pinch=null}}}wheel(e){if(!this.enabled||!this.enableZoom)return;e.preventDefault();let t=e.deltaMode===1?e.deltaY*33:e.deltaMode===2?e.deltaY*400:e.deltaY,n=this.snapshot();this.zoom(Math.exp(t*this.zoomSpeed)),this.constrain(n),this.changed()}orbit(e,t){let n=this.camera,r=[n.position[0]-n.target[0],n.position[1]-n.target[1],n.position[2]-n.target[2]],i=Math.hypot(r[0],r[1],r[2])||1e-6,a=Math.atan2(r[0],r[2]),o=Math.acos(Math.max(-1,Math.min(1,r[1]/i)));a-=e*this.rotateSpeed,o-=t*this.rotateSpeed,o=Math.max(.001,Math.min(Math.PI-.001,o)),n.position=[n.target[0]+i*Math.sin(o)*Math.sin(a),n.target[1]+i*Math.cos(o),n.target[2]+i*Math.sin(o)*Math.cos(a)],n.up=[0,1,0]}pan(e,t){let n=this.camera,r=this.el.clientHeight||1,i=n.distance,a=n.type===`orthographic`?n.orthoHeight/r:2*i*Math.tan(n.fov/2*Math.PI/180)/r,o=[n.target[0]-n.position[0],n.target[1]-n.position[1],n.target[2]-n.position[2]],s=Math.hypot(...o)||1;o[0]/=s,o[1]/=s,o[2]/=s;let c=[o[1]*n.up[2]-o[2]*n.up[1],o[2]*n.up[0]-o[0]*n.up[2],o[0]*n.up[1]-o[1]*n.up[0]],l=Math.hypot(...c)||1;c=c.map(e=>e/l);let u=[c[1]*o[2]-c[2]*o[1],c[2]*o[0]-c[0]*o[2],c[0]*o[1]-c[1]*o[0]],d=-e*a,f=t*a;for(let e=0;e<3;e++){let t=c[e]*d+u[e]*f;n.position[e]+=t,n.target[e]+=t}}zoom(e){let t=this.camera;if(t.type===`orthographic`){t.orthoHeight=Math.max(1e-4,t.orthoHeight*e);return}let n=[t.position[0]-t.target[0],t.position[1]-t.target[1],t.position[2]-t.target[2]],r=Math.hypot(...n),i=Math.max(1e-4,r*e);for(let e=0;e<3;e++)t.position[e]=t.target[e]+n[e]/(r||1)*i}focus(e){let t=this.camera,n=this.snapshot(),r=[e[0]-t.target[0],e[1]-t.target[1],e[2]-t.target[2]];for(let e=0;e<3;e++)t.target[e]+=r[e],t.position[e]+=r[e];this.constrain(n),this.changed()}},Hc=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,Uc=class{constructor(e,t={}){this.section=e,this.smoothing=t.smoothing??.12,this.reducedMotion=t.reducedMotion??Hc(),this.value=NaN,this.target=0,this.stale=!0,this.markStale=()=>{this.stale=!0},addEventListener(`scroll`,this.markStale,{passive:!0,capture:!0}),addEventListener(`resize`,this.markStale,{passive:!0})}dispose(){removeEventListener(`scroll`,this.markStale,{capture:!0}),removeEventListener(`resize`,this.markStale)}stops(){let e=[...this.section.querySelectorAll(`[data-es3d-stop]`)];return e.map((t,n)=>{let r=t.getAttribute(`data-es3d-stop`),i=r===null||r.trim()===``?e.length>1?n/(e.length-1):0:Number(r);return{el:t,value:Number.isFinite(i)?Math.min(1,Math.max(0,i)):0}})}measure(){let e=innerHeight||1,t=this.stops();if(!t.length){let t=this.section.getBoundingClientRect(),n=t.height-e;return n<=0?+(t.top<=0):Math.min(1,Math.max(0,-t.top/n))}let n=t.map(t=>{let n=t.el.getBoundingClientRect();return n.top+n.height/2-e/2});if(n[0]>=0)return t[0].value;let r=t.length-1;if(n[r]<=0)return t[r].value;let i=0;for(;i<r-1&&n[i+1]<=0;)i++;let a=n[i]===n[i+1]?0:-n[i]/(n[i+1]-n[i]);return this.reducedMotion?a<.5?t[i].value:t[i+1].value:t[i].value+(t[i+1].value-t[i].value)*a}update(e){if(this.stale&&(this.stale=!1,this.target=this.measure()),Number.isNaN(this.value)||this.reducedMotion||!(this.smoothing>0))return this.value!==this.target&&(this.value=this.target,!0);let t=this.target-this.value;return t!==0&&(Math.abs(t)<1e-4?this.value=this.target:this.value+=t*(1-Math.exp(-Math.max(e,0)/this.smoothing)),!0)}};function Wc(){return e}var Gc=1e4,Kc=2e5;function qc(e){let n=new Set,r=t=>{let{id:r,input:i,time:a,progress:o,quality:s}=t.data||{};n.size>Kc&&n.clear();let c;try{c=Ho(i,{time:a,progress:o,quality:s,sent:n})}catch(t){e.postMessage({id:r,error:String(t&&t.message?t.message:t)});return}try{e.postMessage({id:r,...c.message},c.transfer)}catch{e.postMessage({id:r,ok:c.message.ok,diagnostics:c.message.diagnostics,hostOnly:c.message.hostOnly,timings:c.message.timings,lineText:c.message.lineText,lineIndex:c.message.lineIndex,main:!0})}};e.onmessage=r;for(let e of t.splice(0))r(e)}function Jc(e){if(typeof Worker!=`function`||!e)return null;let t=typeof location>`u`||new URL(e).origin===location.origin;try{if(t)return new Worker(e,{type:`module`})}catch{}try{let t=new Blob([`import ${JSON.stringify(e)};`],{type:`text/javascript`});return new Worker(URL.createObjectURL(t),{type:`module`})}catch{return null}}var Yc=class{constructor(e){if(this.worker=Jc(e),this.failed=!this.worker,this.pending=new Map,this.next=1,!this.worker)return;this.answered=!1,this.watchdog=0,this.worker.onmessage=e=>{let t=e.data;this.answered=!0,clearTimeout(this.watchdog);let n=this.pending.get(t.id);n&&(this.pending.delete(t.id),n(t.error?null:t))};let t=()=>{clearTimeout(this.watchdog),this.failed=!0;for(let e of this.pending.values())e(null);this.pending.clear();try{this.worker.terminate()}catch{}};this.worker.onerror=e=>{e&&e.preventDefault&&e.preventDefault(),t()},this.worker.onmessageerror=t,this.fail=t}compile(e,t){if(this.failed)return Promise.resolve(null);let n=this.next++;return new Promise(r=>{this.pending.set(n,r),!this.answered&&!this.watchdog&&(this.watchdog=setTimeout(()=>this.fail(),Gc));try{this.worker.postMessage({id:n,input:e,time:t.time,progress:t.progress,quality:t.quality})}catch{this.pending.delete(n),r(null)}})}dispose(){this.worker&&this.worker.terminate();for(let e of this.pending.values())e(null);this.pending.clear(),this.failed=!0}};Wc()&&qc(self);var Xc=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,Zc=e=>typeof requestIdleCallback==`function`?requestIdleCallback(e,{timeout:500}):setTimeout(e,16),Qc=()=>performance.now();function $c(e={},t=!1){let n=e.background===!0,r=e.clock===`always`||e.clock==null&&n,i=e.autoOrbit===void 0?!n:e.autoOrbit!==!1;return{clock:r?`always`:`document`,playing:e.playing!==!1&&!t,auto:i&&!t}}function el(e,t,n){return!!(e.playing&&!n&&(e.clock===`always`||t.animation&&t.animation.time))}function tl(e,t){return!(!e.auto||t)}var nl=24,rl=50,il=(e,t)=>Promise.race([e,new Promise(e=>setTimeout(e,t))]);async function al(e,t={}){let n=Oc(t.geometryStore===!1?null:t.geometryStore||Nc()),r=await nc(e,{backend:t.backend,present:t.present});r.options.tessellationBudget=4;let i=r.canvas||e,a=i.parentElement;i.style.display=`block`;let o=new Pc,s=new Vc(i,o),c=$c(t,Xc()),l={result:null,cache:new fo,setMode:!1,time:0,progress:0,last:0,disposed:!1,clock:c.clock,playing:c.playing,auto:c.auto,orbitSpeed:t.orbitSpeed??.22,onScreen:!0,dirty:!0,sceneTime:NaN,sceneProgress:NaN,width:0,height:0,dpr:r.pixelRatio(typeof devicePixelRatio==`number`?devicePixelRatio:1),gpuEpoch:r.backend.resourceEpoch||0,timeline:null,generation:0,holdUntil:0,changeBudget:t.changeBudget??4,workers:t.workers??1,compilerTried:!1,placedSinceDraw:!1,framesDrawn:0,waiters:[],since:{changeMs:0,compileMs:0},stats:{frameMs:0,changeMs:0,compileMs:0,tessellateMs:0,renderMs:0,instances:0,drawCalls:0,uploadBytes:0,refining:0,queued:0},storeOwners:new Set},u=()=>{l.dirty=!0};r.textures.onReady=u;let d=new qo({cache:l.cache,clock:()=>({time:l.time,progress:l.progress}),report:(e,n)=>{t.onError?t.onError(e,n):n.ok?console.warn(e):console.error(e)},forget:e=>{n.forget(e),l.storeOwners.delete(e)},restore:(e,t)=>n.store?il(n.restore(e,{entries:e.owned(t)}),rl):null}),f=new Float64Array(15).fill(NaN),p=!1,m=(e,t)=>{f[e]!==t&&(f[e]=t,p=!0)},h=()=>{let e=o;p=!1;for(let t=0;t<3;t++)m(t,e.position[t]),m(3+t,e.target[t]),m(6+t,e.up[t]);return m(9,e.fov),m(10,e.orthoHeight),m(11,+(e.type===`orthographic`)),m(12,e.near??-1),m(13,e.refAspect),m(14,e.fit===`cover`?1:e.fit===`width`?2:e.fit===`height`?3:0),p},g=(e,t)=>l.cache.mesh(e,t),_=()=>l.setMode?d.set:l.result&&l.result.scene,v=e=>{let t=r.frames.lodStates(e,o.position,e=>Math.hypot(e[0]-o.position[0],e[1]-o.position[1],e[2]-o.position[2]));return n=>{let r=e.lodNode[n];return r<0||t.visible[r]&&t.active[r]===e.lodChild[n]}},y=e=>{if(!e.parts)return v(e);let t=new Map;return(e,n)=>{let r=t.get(n);return r||t.set(n,r=v(n)),r(e)}},b=()=>{let e=_();return e?{scene:e,meshOf:g,isVisible:y(e)}:null};s.onChange=()=>{l.auto=!1,l.dirty=!0,t.onInteract&&t.onInteract()},s.onClick=(e,n)=>{let a=_();if(!a||!t.onPick)return;let s=i.clientWidth,c=i.clientHeight;if(!s||!c)return;o.update(s/c,r.backend.zeroToOne,a.bounds);let u=o.ray(e,n,s,c,r.backend.zeroToOne),f=Co(a,g,u.origin,u.dir,y(a));if(!f)return t.onPick(null);if(!a.parts)return t.onPick({...f,names:wo(l.result.doc,f.uid)});let{part:p,...m}=f,h={...m,names:d.names(p,f.uid)};p&&p!==d.host&&(h.fragment=p.id),t.onPick(h)};let x=new IntersectionObserver(([e])=>{l.onScreen=e.isIntersecting,l.onScreen&&(l.dirty=!0)},{threshold:.02});x.observe(a||i);let S=new ResizeObserver(([e])=>{let t=e.contentBoxSize&&e.contentBoxSize[0],n=Math.round(t?t.inlineSize:e.contentRect.width),r=Math.round(t?t.blockSize:e.contentRect.height);(n!==l.width||r!==l.height)&&(l.width=n,l.height=r,i.style.width=`${n}px`,i.style.height=`${r}px`,l.dirty=!0)});S.observe(a||i);let C=()=>l.result&&l.result.scene.controls?l.result.scene.controls.mode:`orbit`,w=()=>C()!==`orbit`&&l.result&&l.result.scene.cameras.length>0,T=()=>({width:l.width,height:l.height,dpr:typeof devicePixelRatio==`number`?devicePixelRatio:1}),E=()=>{let e=l.generation,t=0,n=()=>{let i=l.result;if(l.disposed||e!==l.generation||!i||t>nl)return;if(!l.width||!l.height)return void setTimeout(()=>Zc(n),200);let a=t/nl;t++,so(i.scene,i.graph,l.time,a);let s=w()?new Pc().fromSpec(i.scene.cameras[0]):o;r.prepare(s,T()),so(i.scene,i.graph,l.sceneTime,l.sceneProgress),O(),Zc(n)};Zc(n)},D=(e=!0)=>{let n=_();if(!n||!n.animation.scroll)l.timeline&&l.timeline.dispose(),l.timeline=null;else{if(!l.timeline){let n=t.scroll||document.scrollingElement||document.documentElement;l.timeline=new Uc(n),e=!0}e&&(l.timeline.update(0),l.progress=l.timeline.value)}},O=()=>{if(!l.setMode)l.result&&n.changed(l.result.cache);else{for(let e of l.storeOwners)n.changed(l.cache,{owner:e,entries:()=>l.cache.owned(e)});l.storeOwners.clear()}},k=()=>{l.setMode||(l.setMode=!0,l.result&&d.set.place(d.host,l.result.scene),r.setScene(d.set,g),l.cache.onGenerate=e=>{for(let t of e.owners)l.storeOwners.add(t)},l.dirty=!0)},A=()=>{let e=l.result;if(!e||e.graph||!e.prepared)return e;let t=d.newOwner(`document`),n=go(e.source,{cache:l.cache,owner:t,time:l.time,progress:l.progress});return l.result=n,l.setMode?d.setHost(n,t):(d.adoptHost(n,t),r.setScene(n.scene,g)),l.dirty=!0,n},j=()=>{if(l.compilerTried||(l.compilerTried=!0,l.workers===0))return;let e=new Yc(import.meta.url);e.failed||(d.compiler=e)},M=()=>{l.waiters.length&&(l.placedSinceDraw||!l.framesDrawn||r.stats.refining||(l.waiters=l.waiters.filter(e=>{for(let t of e.tasks)if(!t.finished)return!0;return e.resolve(l.stats),!1})))},N={camera:o,renderer:r,controls:s,kind:r.kind,get time(){return l.time},set time(e){l.time=e},get progress(){return l.progress},set progress(e){l.timeline&&=(l.timeline.dispose(),null),l.progress=Math.min(1,Math.max(0,e))},get playing(){return l.playing},set playing(e){l.playing=!!e},get reducedMotion(){return Xc()},get changeBudget(){return l.changeBudget},set changeBudget(e){l.changeBudget=Math.max(0,+e||0)},get stats(){return{...l.stats}},setTransforms(e){let t=Array.from(e||[]),n=A(),r=n&&n.graph,i=r&&r.byId,a=t.map(e=>i&&i.get(Array.isArray(e)?e[0]:e&&e.id)),o=t.map(e=>Array.isArray(e)?e[1]:e&&e.matrix),s=r&&n.scene?oo(n.scene,r,a,o,l.time,l.progress):t.map(()=>!1);return s.some(Boolean)&&(l.dirty=!0,l.setMode&&d.set.invalidateBounds()),s},setTransform(e,t){return this.setTransforms([[e,t]])[0]===!0},invalidate:u,get result(){return A()},show(e,i={}){i.time!==void 0&&(l.time=i.time);let a,c;if(e instanceof Uo?{result:a,owner:c}=d.fromPrepared(e,`document`):(c=l.setMode?d.newOwner(`document`):uo,a=go(e,{time:l.time,progress:l.progress,cache:l.cache,owner:c})),!a.ok){c&&c!==`document`&&d.release(c);let e=Gn(a);return t.onError?t.onError(e,a):console.error(e),a}l.setMode&&i.keepFragments===!1&&d.clear(),l.result=a,l.generation++,l.setMode?(d.setHost(a,c),r.updateScene(d.set),l.placedSinceDraw=!0):(d.adoptHost(a,c),r.setScene(a.scene,g)),D(),l.progress!==0&&a.graph&&so(a.scene,a.graph,l.time,l.progress),l.sceneTime=l.time,l.sceneProgress=l.progress,l.dirty=!0;let u=a.scene.controls;s.configure(u,{world:b}),t.interactive===!1&&(s.enabled=!1),u&&u.mode!==`orbit`&&(l.auto=!1),(!i.keepCamera||w())&&(a.scene.cameras.length?o.fromSpec(a.scene.cameras[0]):o.frame(a.scene.bounds));let f=l.generation;return l.holdUntil=performance.now()+rl,n.restore(l.cache,l.setMode?{entries:l.cache.owned(c)}:void 0).finally(()=>{f===l.generation&&(l.holdUntil=0,l.dirty=!0,a.scene.animation.scroll&&a.graph&&E())}),a},add(e,t={}){k();let n=d.add(e,t);return l.dirty=!0,n},fragment(e){return d.byId.get(String(e))},get fragments(){return d.list},prepare(e,t={}){return j(),d.prepare(e,t)},drawn(){return new Promise(e=>{l.waiters.push({resolve:e,tasks:new Set(d.queue)}),l.dirty=!0})},dispose(){l.disposed=!0,x.disconnect(),S.disconnect(),l.timeline&&l.timeline.dispose(),d.dispose(),s.dispose(),r.dispose()}},P=e=>{if(l.disposed)return;requestAnimationFrame(P);let n=Qc(),i=l.last?Math.min(.05,(e-l.last)/1e3):0;if(l.last=e,l.setMode){if(d.queue.length){let e=d.applyQueued(l.changeBudget);l.since.changeMs+=e.changeMs,l.since.compileMs+=e.compileMs}d.takeChanged()&&(r.updateScene(d.set),D(!1),l.placedSinceDraw=!0,l.dirty=!0)}let a=_();if(!a||!l.onScreen||!l.width||!l.height)return;let c=l.result,u=Xc();if(el(l,a,u)&&(l.time+=i),l.timeline&&l.timeline.update(i)&&(l.progress=l.timeline.value),t.onFrame&&t.onFrame(i,N),tl(l,u)){let e=s.snapshot(),t=o.position[0]-o.target[0],n=o.position[2]-o.target[2],r=l.orbitSpeed*i,a=Math.cos(r),c=Math.sin(r);o.position[0]=o.target[0]+t*a-n*c,o.position[2]=o.target[2]+t*c+n*a,s.constrain(e)}c&&c.graph&&c.scene.dynamic.length&&(l.time!==l.sceneTime||l.progress!==l.sceneProgress)&&(so(c.scene,c.graph,l.time,l.progress),l.sceneTime=l.time,l.sceneProgress=l.progress,w()&&o.fromSpec(c.scene.cameras[0]),l.setMode&&d.set.invalidateBounds(),l.dirty=!0),l.setMode&&d.updateDynamic(l.time,l.progress)&&(l.dirty=!0),h()&&(l.dirty=!0);let f=r.pixelRatio(typeof devicePixelRatio==`number`?devicePixelRatio:1);f!==l.dpr&&(l.dpr=f,l.dirty=!0);let p=r.backend.resourceEpoch||0;if(p!==l.gpuEpoch&&(l.gpuEpoch=p,l.dirty=!0),!l.dirty||l.holdUntil&&e<l.holdUntil){M();return}l.dirty=!1;let m=l.cache.stats.generateMs,g=Qc();r.render(o,{...T(),time:l.time});let v=Qc()-g;r.stats.refining&&(l.dirty=!0),O();let y=l.cache.stats.generateMs-m,b=r.stats,x=l.stats;x.changeMs=l.since.changeMs,x.compileMs=l.since.compileMs,x.tessellateMs=y,x.renderMs=v-y,x.instances=b.instances,x.drawCalls=b.drawCalls,x.uploadBytes=b.uploadBytes,x.refining=b.refining,x.queued=d.queue.length,l.since.changeMs=0,l.since.compileMs=0,l.placedSinceDraw=!1,l.framesDrawn++,x.frameMs=Qc()-n,M()};return requestAnimationFrame(P),N}export{wo as ancestorNames,al as createStage,et as es3dCos,$e as es3dSin,Ea as mulberry32};
|
|
374
|
+
`,Js=4,Ys=[{arrayStride:32,stepMode:`vertex`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`float32x2`}]},{arrayStride:64,stepMode:`instance`,attributes:[{shaderLocation:3,offset:0,format:`float32x4`},{shaderLocation:4,offset:16,format:`float32x4`},{shaderLocation:5,offset:32,format:`float32x4`},{shaderLocation:6,offset:48,format:`float32x4`}]}],Xs=(e,t)=>{let n=t;for(;n<e;)n*=2;return n},Zs=class{constructor(e,t={}){this.canvas=e,this.present=t.present||`canvas`,this.kind=`webgpu`,this.zeroToOne=!0,this.pipelines=new Map,this.meshModules=new Map,this.materialBindings=new Map,this.overlayBindings=new Map,this.poolGeneration=-1,this.vertexBuffer=null,this.indexBuffer=null,this.instanceBuffer=null,this.gpuBytes=0,this.lost=!1,this.info=``,this.errors=[]}async init(){if(!navigator.gpu)throw Error(`WebGPU is not available in this browser.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter is available.`);this.adapter=e;let t=e.info||{};this.info=[t.vendor,t.architecture,t.description].filter(Boolean).join(` `)||`WebGPU adapter`;let n=await e.requestDevice();if(this.device=n,n.lost.then(e=>{this.lost=!0,this.errors.push(`WebGPU device lost: ${e.message}`)}),n.onuncapturederror=e=>{this.errors.push(e.error&&e.error.message?e.error.message:String(e))},this.present===`readback`){if(this.format=`rgba8unorm`,this.ctx2d=this.canvas.getContext(`2d`),!this.ctx2d)throw Error(`Cannot create a 2D context for WebGPU readback presentation.`);this.canvasUsed=!0}else{let e=this.canvas.getContext(`webgpu`);if(!e)throw Error(`Cannot create a WebGPU canvas context.`);this.canvasUsed=!0,this.context=e,this.format=navigator.gpu.getPreferredCanvasFormat(),e.configure({device:n,format:this.format,alphaMode:`opaque`,colorSpace:`srgb`,toneMapping:{mode:`standard`}})}this.frameLayout=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]}),this.materialLayout=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:`filtering`}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:4,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:5,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:6,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}}]}),this.pipelineLayout=n.createPipelineLayout({bindGroupLayouts:[this.frameLayout,this.materialLayout]}),n.pushErrorScope(`validation`),this.lineModule=n.createShaderModule({code:qs,label:`es3d lines`});for(let[e,t]of[[`mesh`,this.meshModule(0,`0`)],[`lines`,this.lineModule]]){let n=(await t.getCompilationInfo()).messages.filter(e=>e.type===`error`);if(n.length)throw Error(`WGSL ${e} shader error: ${n.map(e=>`${e.lineNum}:${e.linePos} ${e.message}`).join(`; `)}`)}let r=await n.popErrorScope();if(r)throw Error(`WebGPU initialisation error: ${r.message}`);this.frameBuffer=n.createBuffer({size:vs,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.frameBindGroup=n.createBindGroup({layout:this.frameLayout,entries:[{binding:0,resource:{buffer:this.frameBuffer}}]}),this.sampler=n.createSampler({addressModeU:`repeat`,addressModeV:`repeat`,magFilter:`linear`,minFilter:`linear`,mipmapFilter:`linear`,maxAnisotropy:8}),this.whiteTex=this.createTexture({width:1,height:1,data:new Uint8Array([255,255,255,255])},!0),this.flatNormalTex=this.createTexture({width:1,height:1,data:new Uint8Array([128,128,255,255])},!1),this.matData=new Float32Array(20)}createTexture(e,t){let n=e.width>1||e.height>1?ms(e):[e],r=this.device.createTexture({size:[e.width,e.height],format:t?`rgba8unorm-srgb`:`rgba8unorm`,mipLevelCount:n.length,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});return n.forEach((e,t)=>{let n=e.data instanceof Uint8Array?e.data:new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);this.device.queue.writeTexture({texture:r,mipLevel:t},n,{bytesPerRow:e.width*4,rowsPerImage:e.height},[e.width,e.height]),this.gpuBytes+=e.width*e.height*4}),{texture:r,view:r.createView()}}destroyTexture(e){e.texture.destroy()}meshModule(e,t){let n=`${e}|${t}`,r=this.meshModules.get(n);return r||(r=this.device.createShaderModule({code:Gs(e,t),label:`es3d mesh ${n}`}),this.meshModules.set(n,r)),r}pipeline(e,{cull:t=`back`,frontFace:n=`ccw`,blend:r=!1,depthWrite:i=!0,depthCompare:a=`less-equal`,flags:o=0,lights:s=``}={}){let c=e===`mesh`,l=`${e}|${t}|${n}|${r}|${i}|${a}${c?`|${o}|${s}`:``}`,u=this.pipelines.get(l);if(u)return u;let d=c?this.meshModule(o,s):this.lineModule,f=c?`vs_main`:e===`normals`?`vs_normals`:`vs_line`;return u=this.device.createRenderPipeline({label:l,layout:this.pipelineLayout,vertex:{module:d,entryPoint:f,buffers:Ys},fragment:{module:d,entryPoint:c?`fs_main`:`fs_line`,targets:[{format:this.format,blend:r?{color:{srcFactor:`src-alpha`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}}:void 0}]},primitive:{topology:c?`triangle-list`:`line-list`,cullMode:c?t:`none`,frontFace:n},depthStencil:{format:`depth24plus`,depthWriteEnabled:i,depthCompare:a},multisample:{count:Js}}),this.pipelines.set(l,u),u}ensureTargets(){let e=this.canvas.width,t=this.canvas.height;this.targetW===e&&this.targetH===t&&this.msaa||(this.msaa&&this.msaa.destroy(),this.depth&&this.depth.destroy(),this.msaa=this.device.createTexture({size:[e,t],sampleCount:Js,format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.depth=this.device.createTexture({size:[e,t],sampleCount:Js,format:`depth24plus`,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.msaaView=this.msaa.createView(),this.depthView=this.depth.createView(),this.present===`readback`&&(this.offscreen&&this.offscreen.destroy(),this.readBuffer&&!this.readPending&&this.readBuffer.destroy(),this.offscreen=this.device.createTexture({size:[e,t],format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC}),this.offscreenView=this.offscreen.createView(),this.readStride=Math.ceil(e*4/256)*256,this.readBuffer=this.device.createBuffer({size:this.readStride*t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})),this.targetW=e,this.targetH=t)}readback(e){if(this.readPending)return!1;let t=this.targetW,n=this.targetH;return e.copyTextureToBuffer({texture:this.offscreen},{buffer:this.readBuffer,bytesPerRow:this.readStride},[t,n]),!0}startReadback(){let e=this.readBuffer,t=this.targetW,n=this.targetH,r=this.readStride;this.readPending=e.mapAsync(GPUMapMode.READ).then(()=>{let i=new Uint8Array(e.getMappedRange()),a=new Uint8ClampedArray(t*n*4);for(let e=0;e<n;e++)a.set(i.subarray(e*r,e*r+t*4),e*t*4);if(e.unmap(),this.ctx2d.putImageData(new ImageData(a,t,n),0,0),this.readPending=null,!this.lastFrameCopied&&this.offscreen&&!this.lost){let e=this.device.createCommandEncoder();this.readback(e),this.device.queue.submit([e.finish()]),this.lastFrameCopied=!0,this.startReadback()}})}syncPool(e){let t=this.device,n=e.vertexCapacityBytes,r=e.indexCapacityBytes,i=GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,a=GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,o=0;if(e.generation!==this.poolGeneration||!this.vertexBuffer)this.vertexBuffer&&this.vertexBuffer.destroy(),this.indexBuffer&&this.indexBuffer.destroy(),this.vertexBuffer=t.createBuffer({size:Xs(n,65536),usage:i}),this.indexBuffer=t.createBuffer({size:Xs(r,65536),usage:a}),this.poolGeneration=e.generation,e.uploadedVertices=0,e.uploadedIndices=0;else{let o=null,s=(e,n,r,i)=>{let a=t.createBuffer({size:Xs(n,65536),usage:r});return i>0&&(o||=t.createCommandEncoder(),o.copyBufferToBuffer(e,0,a,0,i)),a},c=this.vertexBuffer.size<n?this.vertexBuffer:null,l=this.indexBuffer.size<r?this.indexBuffer:null;c&&(this.vertexBuffer=s(c,n,i,e.uploadedVertices*32)),l&&(this.indexBuffer=s(l,r,a,e.uploadedIndices*4)),o&&t.queue.submit([o.finish()]),c&&c.destroy(),l&&l.destroy()}let s=e.pending();return s.vertexEnd>s.vertexStart&&e.forEachVertices(s.vertexStart,s.vertexEnd,(e,n)=>{t.queue.writeBuffer(this.vertexBuffer,e*32,n.buffer,n.byteOffset,n.byteLength),o+=n.byteLength}),s.indexEnd>s.indexStart&&e.forEachIndices(s.indexStart,s.indexEnd,(e,n)=>{t.queue.writeBuffer(this.indexBuffer,e*4,n.buffer,n.byteOffset,n.byteLength),o+=n.byteLength}),e.markUploaded(),o}uploadInstances(e,t){let n=Math.max(64,t*64);return(!this.instanceBuffer||this.instanceBuffer.size<n)&&(this.instanceBuffer&&this.instanceBuffer.destroy(),this.instanceBuffer=this.device.createBuffer({size:Xs(n,16384),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})),t&&this.device.queue.writeBuffer(this.instanceBuffer,0,e.buffer,e.byteOffset,t*64),t*64}readyTexture(e,t){return e&&e.status===`ready`&&!e.gpu&&(e.gpu=this.createTexture(e.pixels,t)),e&&e.gpu?e.gpu:null}materialEntries(e,t,n,r,i,a){return[{binding:0,resource:{buffer:e}},{binding:1,resource:this.sampler},{binding:2,resource:t.view},{binding:3,resource:n.view},{binding:4,resource:r.view},{binding:5,resource:i.view},{binding:6,resource:a.view}]}materialBinding(e,t,n){let r=n?`ds`:`ss`,i=this.materialBindings.get(e);i||(i={},this.materialBindings.set(e,i));let a=this.readyTexture(e.map?t.get(e.map,`color`):null,!0),o=this.readyTexture(e.normalMap?t.get(e.normalMap,`normal`):null,!1),s=this.readyTexture(e.metallicRoughnessMap?t.get(e.metallicRoughnessMap,`linear`):null,!1),c=this.readyTexture(e.occlusionMap?t.get(e.occlusionMap,`linear`):null,!1),l=this.readyTexture(e.emissiveMap?t.get(e.emissiveMap,`color`):null,!0),u=!!a,d=!!o,f=!!s,p=!!c,m=!!l,h=`${u}|${d}|${f}|${p}|${m}`,g=i[r];if(!g||g.key!==h){g&&g.buffer.destroy(),ws(this.matData,e,{hasMap:u,hasNormalMap:d,hasMrMap:f,hasOcclusionMap:p,hasEmissiveMap:m,doubleSided:n||e.doubleSided});let t=this.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(t,0,this.matData);let _=this.device.createBindGroup({layout:this.materialLayout,entries:this.materialEntries(t,a||this.whiteTex,o||this.flatNormalTex,s||this.whiteTex,c||this.whiteTex,l||this.whiteTex)});g=i[r]={key:h,buffer:t,bindGroup:_,flags:this.matData[10]}}return g}overlayBinding(e,t){let n=this.overlayBindings.get(e);if(n)return n;Ts(this.matData,t);let r=this.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return this.device.queue.writeBuffer(r,0,this.matData),n=this.device.createBindGroup({layout:this.materialLayout,entries:this.materialEntries(r,this.whiteTex,this.flatNormalTex,this.whiteTex,this.whiteTex,this.whiteTex)}),this.overlayBindings.set(e,n),n}releaseMaterials(e){for(let[t,n]of this.materialBindings)if(!e.has(t)){for(let e of Object.values(n))e.buffer.destroy();this.materialBindings.delete(t)}}get caps(){return{msaaSamples:Js,anisotropy:8,maxTextureSize:this.device?this.device.limits.maxTextureDimension2D:0,colorSpace:`srgb`}}resize(e,t){(this.canvas.width!==e||this.canvas.height!==t)&&(this.canvas.width=e,this.canvas.height=t)}render(e,t,n){if(this.lost)return;let r=this.device;this.ensureTargets(),r.queue.writeBuffer(this.frameBuffer,0,t.buffer,t.byteOffset,t.byteLength),this.uploadInstances(e.instanceData,e.instanceCount);let i=r.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:this.msaaView,resolveTarget:this.present===`readback`?this.offscreenView:this.context.getCurrentTexture().createView(),clearValue:{r:n.background[0],g:n.background[1],b:n.background[2],a:1},loadOp:`clear`,storeOp:`discard`}],depthStencilAttachment:{view:this.depthView,depthClearValue:1,depthLoadOp:`clear`,depthStoreOp:`discard`}});a.setBindGroup(0,this.frameBindGroup),this.vertexBuffer&&(a.setVertexBuffer(0,this.vertexBuffer),a.setIndexBuffer(this.indexBuffer,`uint32`)),a.setVertexBuffer(1,this.instanceBuffer);let o=null,s=e=>{e!==o&&(a.setPipeline(e),o=e)};if(this.vertexBuffer){let r=null,i=Cs(t);for(let t of e.batches){let e=t.kind===`lines`,o=this.materialBinding(t.material,n.textures,t.doubleSided&&!t.material.doubleSided);s(e?this.pipeline(`lines`,{blend:t.transparent,depthWrite:!t.transparent}):this.pipeline(`mesh`,{cull:t.doubleSided?`none`:`back`,frontFace:t.mirrored?`cw`:`ccw`,blend:t.transparent,depthWrite:!t.transparent,flags:o.flags,lights:i}));let c=o.bindGroup;c!==r&&(a.setBindGroup(1,c),r=c),a.drawIndexed(t.range.indexCount,t.count,t.range.firstIndex,0,t.firstInstance)}let o=e.overlays,c=(e,t,n,r,i=`less-equal`)=>{if(r.length){s(this.pipeline(e,{blend:!0,depthWrite:!1,depthCompare:i})),a.setBindGroup(1,this.overlayBinding(t,n));for(let e of r)a.drawIndexed(e.range.indexCount,e.count,e.range.firstIndex,0,e.firstInstance)}};c(`lines`,`wireframe`,n.overlayColors.wireframe,o.wireframe),c(`normals`,`normals`,n.overlayColors.normals,o.normals),o.bbox&&o.bbox.count&&c(`lines`,`bbox`,n.overlayColors.bbox,[{...o.bbox,range:n.cubeRange}]),o.selection&&o.selection.count&&c(`lines`,`selection`,n.overlayColors.selection,[{...o.selection,range:n.cubeRange}],`always`)}a.end();let c=this.present===`readback`&&this.readback(i);r.queue.submit([i.finish()]),c&&this.startReadback(),this.lastFrameCopied=c}async finish(){if(await this.device.queue.onSubmittedWorkDone(),this.readPending&&await this.readPending,this.present===`readback`&&!this.lastFrameCopied&&this.offscreen){let e=this.device.createCommandEncoder();this.readback(e),this.device.queue.submit([e.finish()]),this.startReadback(),await this.readPending,this.lastFrameCopied=!0}}dispose(){if(this.device){for(let e of[this.vertexBuffer,this.indexBuffer,this.instanceBuffer,this.frameBuffer])e&&e.destroy();for(let e of this.materialBindings.values())for(let t of Object.values(e))t.buffer.destroy();this.msaa&&this.msaa.destroy(),this.depth&&this.depth.destroy(),this.device.destroy()}}},Qs=()=>performance.now();function $s(){let e=[];for(let t=0;t<8;t++)e.push(t&1?.5:-.5,t&2?.5:-.5,t&4?.5:-.5);return new Y({positions:Float32Array.from(e),indices:Uint32Array.from([0,1,2,3,4,5,6,7,0,2,1,3,4,6,5,7,0,4,1,5,2,6,3,7]),kind:`lines`})}var ec={wireframe:[.02,.03,.05,.55],normals:[1,.82,.15,.95],bbox:[.35,.78,1,.75],selection:[1,.55,.12,1]},tc=32<<20,nc=class{constructor(e){this.backend=e,this.kind=e.kind,this.pool=new Yo,this.frames=new rs,this.textures=new _s,this.frameData=new Float32Array(304),this.options={wireframe:!1,normals:!1,bbox:!1,autoLod:!0,fixedLod:0,culling:!0,lodBias:1,maxPixelRatio:2,lodPixels:`css`,tessellationBudget:1/0},this.selection=new Set,this.scene=null,this.meshOf=null,this.cube=$s(),this.cubeRange=this.pool.meshRange(this.cube),this.lastDraw=null,this.lightInfo={truncated:0,usedDefaults:!1},this.stats={cpuMs:0,uploadBytes:0,totalUploadBytes:0,drawCalls:0,triangles:0,visible:0,instances:0},this.gpuEpoch=0}get info(){return this.backend.info}get caps(){return{backend:this.kind,...this.backend.caps,maxPixelRatio:this.options.maxPixelRatio,lodPixels:this.options.lodPixels,lightsDropped:this.lightInfo.truncated||0}}pixelRatio(e){return Math.min(e||1,this.options.maxPixelRatio||1/0)}setScene(e,t,{keepGeometry:n=!0}={}){this.scene=e,this.meshOf=t,(!e||!n||!e.parts&&this.pool.byteSize>tc)&&(this.pool.reset(),this.pool.unusedBytes=0,this.cubeRange=this.pool.meshRange(this.cube)),this.backend.releaseMaterials(new Set(e?e.materials:[])),this.stats.totalUploadBytes=0}updateScene(e){for(let t of e.takeReleased())if(!e.geomIndex.has(t))for(let e of t.meshes){if(!e)continue;let t=this.pool.ranges.get(e);t&&(this.pool.unusedBytes=(this.pool.unusedBytes||0)+e.vertexCount*32+t.indexCount*4)}this.pool.byteSize>tc&&(this.pool.unusedBytes||0)*2>this.pool.byteSize&&(this.pool.reset(),this.pool.unusedBytes=0,this.cubeRange=this.pool.meshRange(this.cube)),(this.materialsSeen!==e.materials.length||e.freeMaterials.length)&&this.backend.releaseMaterials(new Set(e.materials)),this.materialsSeen=e.materials.length}render(e,t){let n=Qs(),r=this.pixelRatio(t.dpr),i=Math.max(1,Math.round(t.width*r)),a=Math.max(1,Math.round(t.height*r));this.backend.resize(i,a);let o=this.scene,s=o?o.bounds:{min:[-1,-1,-1],max:[1,1,1]};e.update(i/a,this.backend.zeroToOne,s);let c=o&&o.environment?o.environment:{background:[.09,.1,.12,1],sky:[.8,.86,.95,1],ground:[.25,.22,.2,1],intensity:.5,exposure:1},l;l=o?this.buildFrame(e,t,a):{batches:[],overlays:{wireframe:[],normals:[],bbox:null,selection:null},instanceData:new Float32Array(16),instanceCount:0,stats:{instances:0,visible:0,culled:0,batches:0,drawCalls:0,triangles:0,lodHistogram:[0,0,0,0],refining:0}};let u=Math.hypot(s.max[0]-s.min[0],s.max[1]-s.min[1],s.max[2]-s.min[2])/2||1;this.lightInfo=Ss(this.frameData,{viewProj:e.viewProj,view:e.view,cameraPos:e.position,time:t.time||0,environment:c,lights:o?o.lights:[],normalLength:u*.025,lineBias:.0015,viewportHeight:a});let d=this.backend.syncPool(this.pool),f=this.backend.resourceEpoch||0;if(f!==this.gpuEpoch){this.gpuEpoch=f;for(let e of this.textures.entries.values())e.gpu=null}this.backend.render(l,this.frameData,{background:c.background,textures:this.textures,overlayColors:ec,cubeRange:this.cubeRange}),this.lastDraw=l;let p=this.stats;return p.cpuMs=Qs()-n,p.uploadBytes=d+l.instanceCount*64,p.totalUploadBytes+=d,p.drawCalls=l.stats.drawCalls,p.triangles=l.stats.triangles,p.visible=l.stats.visible,p.instances=l.stats.instances,p.culled=l.stats.culled,p.batches=l.stats.batches,p.lodHistogram=l.stats.lodHistogram,p.refining=l.stats.refining||0,p.geometryBytes=this.pool.byteSize,p.instanceBytes=l.instanceCount*64,p.textureBytes=this.backend.gpuBytes,l}buildFrame(e,t,n,r=this.options.tessellationBudget){let i=this.options.lodPixels===`device`?n:Math.max(1,Math.round(t.height));return this.frames.build({scene:this.scene,camera:e,pool:this.pool,meshOf:this.meshOf,viewportHeight:i,options:{...this.options,selection:this.selection,tessellationBudget:r}})}prepare(e,t){if(!this.scene)return;let n=this.pixelRatio(t.dpr),r=Math.max(1,Math.round(t.width*n)),i=Math.max(1,Math.round(t.height*n)),a=e.clone();a.update(r/i,this.backend.zeroToOne,this.scene.bounds);let o=this.frames.last;this.buildFrame(a,t,i,1/0),this.frames.last=o}finish(){return this.backend.finish()}dispose(){this.textures.clear(e=>this.backend.destroyTexture(e)),this.backend.dispose()}};async function rc(e,t={}){let n=t.backend||`auto`,r=[],i=!1;if((n===`auto`||n===`webgpu`)&&typeof navigator<`u`&&navigator.gpu){let a=new Zs(e,{present:t.present});try{return await a.init(),new nc(a)}catch(e){r.push(e.message),i=!!a.canvasUsed;try{a.dispose()}catch{}if(n===`webgpu`)throw e}}else if(n===`webgpu`)throw Error(`WebGPU is not available in this browser.`);let a=e;i&&e.getContext&&e.parentNode&&(a=e.cloneNode(!1),e.parentNode.replaceChild(a,e));let o=new Vs(a);await o.init();let s=new nc(o);return s.fallbackReason=r.join(`; `),s.canvas=a,s}var ic=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ac=new Uint32Array(64),oc=new TextEncoder;function sc(e){let t=typeof e==`string`?oc.encode(e):e instanceof Uint8Array?e:new Uint8Array(e.buffer||e,e.byteOffset||0,e.byteLength),n=t.length,r=n+9+63&-64,i=new Uint8Array(r);i.set(t),i[n]=128;let a=new DataView(i.buffer);a.setUint32(r-8,Math.floor(n/536870912),!1),a.setUint32(r-4,n<<3>>>0,!1);let o=1779033703,s=3144134277,c=1013904242,l=2773480762,u=1359893119,d=2600822924,f=528734635,p=1541459225;for(let e=0;e<r;e+=64){for(let t=0;t<16;t++)ac[t]=a.getUint32(e+t*4,!1);for(let e=16;e<64;e++){let t=ac[e-15],n=ac[e-2],r=(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3,i=(n>>>17|n<<15)^(n>>>19|n<<13)^n>>>10;ac[e]=ac[e-16]+r+ac[e-7]+i|0}let t=o,n=s,r=c,i=l,m=u,h=d,g=f,_=p;for(let e=0;e<64;e++){let a=(m>>>6|m<<26)^(m>>>11|m<<21)^(m>>>25|m<<7),o=_+a+(m&h^~m&g)+ic[e]+ac[e]|0,s=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+(t&n^t&r^n&r)|0;_=g,g=h,h=m,m=i+o|0,i=r,r=n,n=t,t=o+s|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+i|0,u=u+m|0,d=d+h|0,f=f+g|0,p=p+_|0}let m=``;for(let e of[o,s,c,l,u,d,f,p])m+=(e>>>0).toString(16).padStart(8,`0`);return m}var cc=1194545989,lc=new Uint8Array(new Uint16Array([1]).buffer)[0]===1,uc=new TextEncoder,dc=new TextDecoder,fc=e=>e+3&-4;function pc(e,t){let n=[],r=0,i={key:e,entries:[]};for(let e of t){let t=[];for(let{lod:i,mesh:a,reports:o}of e){let e=a.positions.length/3,s=a.indices.length,c=e<=65536?2:4;t.push({lod:i,kind:a.kind,v:e,i:s,w:c,at:r,reports:o?o.map(e=>[e.severity,e.code,e.message]):[]}),n.push({mesh:a,at:r,w:c}),r+=e*32+fc(s*c)}i.entries.push(t)}let a=uc.encode(JSON.stringify(i)),o=12+fc(a.length),s=new ArrayBuffer(o+r),c=new Uint8Array(s),l=new DataView(s);l.setUint32(0,cc,!0),l.setUint32(4,1,!0),l.setUint32(8,o-12,!0),c.set(a,12),c.fill(32,12+a.length,o);for(let{mesh:e,at:t,w:r}of n){let n=e.positions.length/3,i=o+t;new Float32Array(s,i,n*3).set(e.positions),new Float32Array(s,i+n*12,n*3).set(e.normals),new Float32Array(s,i+n*24,n*2).set(e.uvs),new(r===2?Uint16Array:Uint32Array)(s,i+n*32,e.indices.length).set(e.indices)}return s}var mc=e=>Number.isInteger(e)&&e>=0;function hc(e){if(!lc||!(e instanceof ArrayBuffer)||e.byteLength<12)return null;let t=new DataView(e);if(t.getUint32(0,!0)!==cc||t.getUint32(4,!0)!==1)return null;let n=t.getUint32(8,!0);if(n%4||12+n>e.byteLength)return null;let r;try{r=JSON.parse(dc.decode(new Uint8Array(e,12,n)))}catch{return null}if(!r||typeof r.key!=`string`||!Array.isArray(r.entries))return null;let i=12+n,a=[];for(let t of r.entries){if(!Array.isArray(t))return null;let n=[];for(let r of t){if(!r||!mc(r.lod)||!mc(r.v)||!mc(r.i)||!mc(r.at)||r.at%4||r.kind!==`triangles`&&r.kind!==`lines`||r.w!==2&&r.w!==4||r.w===2&&r.v>65536||r.i%(r.kind===`lines`?2:3))return null;let t=i+r.at;if(t+r.v*32+r.i*r.w>e.byteLength)return null;let a=r.w===2?new Uint32Array(new Uint16Array(e,t+r.v*32,r.i)):new Uint32Array(e,t+r.v*32,r.i),o=new Y({positions:new Float32Array(e,t,r.v*3),normals:new Float32Array(e,t+r.v*12,r.v*3),uvs:new Float32Array(e,t+r.v*24,r.v*2),indices:a,kind:r.kind}),s=Array.isArray(r.reports)?r.reports.filter(e=>Array.isArray(e)&&e.length===3).map(([e,t,n])=>({severity:String(e),code:String(t),message:String(n)})):[];n.push({lod:r.lod,mesh:o,reports:s})}a.push(n)}return{key:r.key,entries:a}}var gc=()=>typeof performance<`u`?performance.now():Date.now(),_c=null;function vc(){if(_c)return _c;let e=new Float64Array(216),t=0;for(let n=0;n<24;n++){let r=(n-11.5)*.8284271247461902;e[t++]=Math.sin(r),e[t++]=Math.cos(r),e[t++]=Math.tan(r),e[t++]=Math.atan2(r,1.7-n*.11),e[t++]=Math.acos(Math.max(-1,Math.min(1,r/10))),e[t++]=Math.hypot(r,n*.3),e[t++]=Math.hypot(r,n*.3,1/(n+1)),e[t++]=Math.cbrt(r),e[t++]=Math.sqrt(n+.1)}return _c=new Uint8Array(e.buffer),_c}var yc=typeof crypto<`u`&&crypto.subtle&&typeof crypto.subtle.digest==`function`?crypto.subtle:null,bc=new TextEncoder;async function xc(e,t){if(t&&yc)try{let t=new Uint8Array(await yc.digest(`SHA-256`,e)),n=``;for(let e of t)n+=(e<16?`0`:``)+e.toString(16);return n}catch{}return sc(e)}async function Sc(e,t={}){let n=[];for(let r of t.entries||e.entries.values())r.identity&&n.push(r);if(!n.length)return{key:null,entries:n};n.sort((e,t)=>e.identity<t.identity?-1:+(e.identity>t.identity));let r=bc.encode(`es3d-geometry:1:${e.quality}:${n.length}:${n.map(e=>e.identity).join(``)}`),i=vc(),a=new Uint8Array(r.length+i.length);return a.set(r),a.set(i,r.length),{key:await xc(a,t.native!==!1),entries:n}}function Cc(e){let t=[];for(let n=0;n<e.lods;n++){let r=e.meshes[n];r&&!(e.failedLods&1<<n)&&t.push({lod:n,mesh:r,reports:e.reports[n]})}return t}var wc=(e,t)=>t>0&&t<1/0?Promise.race([e,new Promise(e=>setTimeout(()=>e(void 0),t))]):e;async function Tc(e,t,n={}){let r=gc(),i=e=>({hit:!1,key:null,levels:0,bytes:0,...e,ms:gc()-r}),a=await wc(Promise.resolve(t),n.timeout??250);if(!a)return i({reason:a===void 0?`store timed out`:`no store`});let{key:o,entries:s}=await Sc(e,{entries:n.entries});if(!o)return i({reason:`nothing cacheable`});let c;try{c=await wc(a.get(o),n.timeout??250)}catch{c=null}if(c===void 0)return i({key:o,reason:`store timed out`});if(!c)return e.persisted=null,i({key:o,reason:`miss`});let l=hc(c);if(!l||l.key!==o||l.entries.length!==s.length)return Promise.resolve(a.delete(o)).catch(()=>{}),i({key:o,reason:`invalid record`});let u=0,d=0;for(let t=0;t<s.length;t++){let n=l.entries[t];d+=n.length;for(let{lod:r,mesh:i,reports:a}of n)e.adopt(s[t],r,i,a)&&u++}return Dc(e,`${o}:${d}`),{hit:!0,key:o,levels:u,bytes:c.byteLength,ms:gc()-r}}function Ec(e){let t=0;for(let n of e)t+=Cc(n).length;return t}function Dc(e,t){e.persisted=t,e.persistedSet||=new Set,e.persistedSet.size>4096&&e.persistedSet.clear(),e.persistedSet.add(t)}async function Oc(e,t,n={}){let r=await t;if(!r)return{saved:!1,key:null,bytes:0,reason:`no store`};let{key:i,entries:a}=await Sc(e,{entries:n.entries});if(!i)return{saved:!1,key:null,bytes:0,reason:`nothing cacheable`};let o=`${i}:${Ec(a)}`;if(e.persisted===o||e.persistedSet&&e.persistedSet.has(o))return{saved:!1,key:i,bytes:0,reason:`up to date`};let s=a.map(Cc);if(!s.some(e=>e.length))return{saved:!1,key:i,bytes:0,reason:`nothing generated`};let c=pc(i,s);if(r.maxBytes&&c.byteLength>r.maxBytes/4)return{saved:!1,key:i,bytes:c.byteLength,reason:`too large`};try{await r.put(i,c)}catch(e){return{saved:!1,key:i,bytes:c.byteLength,reason:`store failed: ${e&&e.message?e.message:e}`}}return Dc(e,o),{saved:!0,key:i,bytes:c.byteLength}}function kc(e,t={}){let n=t.delay??1500,r=typeof requestIdleCallback==`function`?e=>requestIdleCallback(e,{timeout:5e3}):e=>setTimeout(e,0),i=0,a=null,o=-1,s=new Map,c=()=>{let t=a;a=null;let n=[...s.values()];s.clear(),t&&Oc(t,e).catch(()=>{}),n.reduce((t,n)=>t.then(()=>Oc(n.cache,e,{entries:n.entries()}).catch(()=>{})),Promise.resolve())};return{store:e,restore(t,n){return e?Tc(t,e,n):Promise.resolve(null)},changed(t,l){if(e){if(l)s.set(l.owner,{cache:t,entries:l.entries});else{if(t===a&&t.stats.generated===o)return;a=t,o=t.stats.generated}clearTimeout(i),i=setTimeout(()=>r(c),n)}},forget(e){s.delete(e)}}}var Ac={maxBytes:67108864,maxRecords:256},jc=e=>new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)}),Mc=e=>new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error||Error(`transaction aborted`))});async function Nc(e={}){let{name:t,maxBytes:n,maxRecords:r,timeout:i}={name:`es3d-geometry`,timeout:2e3,...Ac,...e},a=typeof indexedDB<`u`?indexedDB:null;if(!a)return null;let o;try{o=await wc(new Promise((e,n)=>{let r=a.open(t,1);r.onupgradeneeded=()=>{let e=r.result;e.objectStoreNames.contains(`data`)||e.createObjectStore(`data`),e.objectStoreNames.contains(`meta`)||e.createObjectStore(`meta`,{keyPath:`key`}).createIndex(`used`,`used`)},r.onsuccess=()=>e(r.result),r.onerror=()=>n(r.error),r.onblocked=()=>e(null)}),i)}catch{return null}if(!o)return null;o.onversionchange=()=>o.close();let s=e=>{try{let t=o.transaction(`meta`,`readwrite`).objectStore(`meta`),n=t.get(e);n.onsuccess=()=>{n.result&&t.put({...n.result,used:Date.now()})}}catch{}};return{kind:`indexeddb`,maxBytes:n,async get(e){let t=await jc(o.transaction(`data`,`readonly`).objectStore(`data`).get(e));return t instanceof ArrayBuffer?((typeof requestIdleCallback==`function`?requestIdleCallback:setTimeout)(()=>s(e)),t):null},async put(e,t){let i=o.transaction([`data`,`meta`],`readwrite`),a=i.objectStore(`data`),s=i.objectStore(`meta`);a.put(t,e),s.put({key:e,bytes:t.byteLength,used:Date.now(),revision:1});let c=await jc(s.getAll());c.sort((e,t)=>(e.revision===1)-(t.revision===1)||e.used-t.used);let l=c.reduce((e,t)=>e+t.bytes,0),u=c.length;for(let t of c)if(t.key!==e){if(t.revision===1&&l<=n&&u<=r)break;a.delete(t.key),s.delete(t.key),l-=t.bytes,u--}await Mc(i)},async delete(e){let t=o.transaction([`data`,`meta`],`readwrite`);t.objectStore(`data`).delete(e),t.objectStore(`meta`).delete(e),await Mc(t)},async clear(){let e=o.transaction([`data`,`meta`],`readwrite`);e.objectStore(`data`).clear(),e.objectStore(`meta`).clear(),await Mc(e)},close(){o.close()}}}async function Pc(e={}){let t=await Nc(e).catch(()=>null);return t&&e.persist&&typeof navigator<`u`&&navigator.storage&&navigator.storage.persist&&navigator.storage.persist().catch(()=>{}),t}var Fc=class e{constructor(){this.type=`perspective`,this.position=[6,4,8],this.target=[0,0,0],this.up=[0,1,0],this.fov=45,this.orthoHeight=10,this.near=null,this.far=null,this.refAspect=1,this.fit=`contain`,this.view=nt(),this.proj=nt(),this.viewProj=nt(),this.invViewProj=nt(),this.currentNear=.1,this.currentFar=1e3}fromSpec(e){return this.type=e.type||`perspective`,this.position=e.position.slice(),this.target=e.target.slice(),this.up=e.up.slice(),this.fov=e.fov||45,this.orthoHeight=e.height||10,this.near=e.near||null,this.far=e.far||null,this.refAspect=e.aspect||1,this.fit=e.fit||`contain`,this}clone(){let t=new e;return t.type=this.type,t.position=this.position.slice(),t.target=this.target.slice(),t.up=this.up.slice(),t.fov=this.fov,t.orthoHeight=this.orthoHeight,t.near=this.near,t.far=this.far,t.refAspect=this.refAspect,t.fit=this.fit,t}extentScale(e){let t=(this.refAspect>0?this.refAspect:1)/e;switch(this.fit){case`cover`:return Math.min(1,t);case`width`:return t;case`height`:return 1;default:return Math.max(1,t)}}get distance(){return Math.hypot(this.position[0]-this.target[0],this.position[1]-this.target[1],this.position[2]-this.target[2])}frame(e,t=[.62,.5,.75]){let n=[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],r=Math.max(.001,Math.hypot(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2])/2),i=Math.hypot(...t),a=this.type===`orthographic`?r*3:r/Math.sin(this.fov/2*Math.PI/180)*1.05;return this.target=n,this.position=[n[0]+t[0]/i*a,n[1]+t[1]/i*a,n[2]+t[2]/i*a],this.up=[0,1,0],this.orthoHeight=r*2.2,this.refAspect=1,this.fit=`contain`,this}update(e,t,n){xt(this.view,this.position,this.target,this.up);let r=this.near,i=this.far;if(r===null||i===null){let e=.05,t=2e3;if(n){let r=[(n.min[0]+n.max[0])/2,(n.min[1]+n.max[1])/2,(n.min[2]+n.max[2])/2],i=Math.max(.001,Math.hypot(n.max[0]-n.min[0],n.max[1]-n.min[1],n.max[2]-n.min[2])/2),a=Math.hypot(this.position[0]-r[0],this.position[1]-r[1],this.position[2]-r[2]);t=(a+i)*1.5+.001,e=Math.max((a-i)*.5,i*.002,t/5e4,1e-4)}r===null&&(r=e),i===null&&(i=Math.max(t,r*10))}if(this.currentNear=r,this.currentFar=i,this.type===`orthographic`){let n=this.orthoHeight*this.extentScale(e)/2,a=n*e;bt(this.proj,-a,a,-n,n,this.near===null?-i:r,i,t)}else yt(this.proj,this.verticalFov(e),e,r,i,t);this.aspect=e,at(this.viewProj,this.proj,this.view),ht(this.invViewProj,this.viewProj)}verticalFov(e){let t=this.fov*Math.PI/180,n=this.extentScale(e);return n===1?t:2*Math.atan(Math.tan(t/2)*n)}ray(e,t,n,r,i=!1){let a=e/n*2-1,o=1-t/r*2,s=i?0:-1,c=[0,0,0],l=[0,0,0];_t(c,this.invViewProj,a,o,s),_t(l,this.invViewProj,a,o,1);let u=[l[0]-c[0],l[1]-c[1],l[2]-c[2]],d=Math.hypot(u[0],u[1],u[2])||1;return{origin:c,dir:[u[0]/d,u[1]/d,u[2]/d]}}pixelsPerUnit(e,t){let n=this.aspect||1;return this.type===`orthographic`?t/(this.orthoHeight*this.extentScale(n)):t/(2*Math.max(e,1e-6)*Math.tan(this.verticalFov(n)/2))}},Ic=Math.PI/180,Lc=.001;function Rc(e,t){if(!t)return;let n=e.position,r=e.target;if(t.targetMin&&t.targetMax)for(let e=0;e<3;e++){let i=Math.min(t.targetMax[e],Math.max(t.targetMin[e],r[e]));n[e]+=i-r[e],r[e]=i}let i=[n[0]-r[0],n[1]-r[1],n[2]-r[2]],a=Math.hypot(i[0],i[1],i[2]);if(a<1e-12)return;let o=Math.acos(Math.max(-1,Math.min(1,i[1]/a))),s=Math.atan2(i[0],i[2]),c=t.minPolar??0,l=t.maxPolar??180,u=c>0||l<180;u&&(o=Math.min(Math.min(l*Ic,Math.PI-Lc),Math.max(Math.max(c*Ic,Lc),o)));let d=a;if(t.minDistance!=null&&(d=Math.max(d,t.minDistance)),t.maxDistance!=null&&(d=Math.min(d,t.maxDistance)),!u&&d===a)return;let f=Math.sin(o);n[0]=r[0]+d*f*Math.sin(s),n[1]=r[1]+d*Math.cos(o),n[2]=r[2]+d*f*Math.cos(s)}function zc(e,t){let n=t.bounds,r=Math.hypot(n.max[0]-n.min[0],n.max[1]-n.min[1],n.max[2]-n.min[2])/2||1;return Math.max((e.currentNear||0)*2,r*.01)}function Bc(e,t,n){let{scene:r,meshOf:i}=n;if(!r||!r.count)return!1;let a=n.margin??zc(t,r),o=[t.target[0]-e.target[0],t.target[1]-e.target[1],t.target[2]-e.target[2]],s=e.position.slice(),c=[t.position[0]-s[0],t.position[1]-s[1],t.position[2]-s[2]],l=Math.hypot(c[0],c[1],c[2]);if(l<1e-12)return!1;let u=!1,d=0;for(let e=0;e<2;e++){let t=Math.hypot(c[0],c[1],c[2]);if(t<1e-12)break;let o=[c[0]/t,c[1]/t,c[2]/t],l=xo(r,i,s,o,{isVisible:n.isVisible,maxDistance:t+a*4,skipFlags:2,facing:!0}),f=l?Math.abs(o[0]*l.normal[0]+o[1]*l.normal[1]+o[2]*l.normal[2]):0,p=l?Math.max(0,l.distance-a/Math.max(f,.25)):t,m=Math.min(1,p/t);for(let e=0;e<3;e++)s[e]+=c[e]*m;if(e===0&&(d=m),m>=1)break;u=!0;let h=c.map(e=>e*(1-m)),g=h[0]*l.normal[0]+h[1]*l.normal[1]+h[2]*l.normal[2];c=h.map((e,t)=>e-l.normal[t]*g)}if(!u)return!1;let f=Math.hypot(o[0]-(t.position[0]-e.position[0]),o[1]-(t.position[1]-e.position[1]),o[2]-(t.position[2]-e.position[2]))<l*1e-6;for(let n=0;n<3;n++)t.target[n]=e.target[n]+(f?s[n]-e.position[n]:o[n]*d),t.position[n]=s[n];return!0}function Vc(e,t,n,r){return Rc(t,n),n&&n.collide&&r?Bc(e,t,r):!1}var Hc=class{constructor(e,t){this.el=e,this.camera=t,this.enabled=!0,this.enableZoom=!0,this.enablePan=!0,this.limits=null,this.world=null,this.rotateSpeed=.006,this.zoomSpeed=.0015,this.onChange=null,this.onClick=null,this.onDoubleClick=null,this.pointers=new Map,this.mode=null,this.moved=0,this.last=null,this.pinch=null,this._down=e=>this.pointerDown(e),this._move=e=>this.pointerMove(e),this._up=e=>this.pointerUp(e),this._wheel=e=>this.wheel(e),this._ctx=e=>e.preventDefault(),this._dbl=e=>{if(this.onDoubleClick){let t=this.el.getBoundingClientRect();this.onDoubleClick(e.clientX-t.left,e.clientY-t.top,e)}},e.addEventListener(`pointerdown`,this._down),e.addEventListener(`pointermove`,this._move),e.addEventListener(`pointerup`,this._up),e.addEventListener(`pointercancel`,this._up),e.addEventListener(`wheel`,this._wheel,{passive:!1}),e.addEventListener(`contextmenu`,this._ctx),e.addEventListener(`dblclick`,this._dbl),e.style.touchAction=`none`}dispose(){let e=this.el;e.removeEventListener(`pointerdown`,this._down),e.removeEventListener(`pointermove`,this._move),e.removeEventListener(`pointerup`,this._up),e.removeEventListener(`pointercancel`,this._up),e.removeEventListener(`wheel`,this._wheel),e.removeEventListener(`contextmenu`,this._ctx),e.removeEventListener(`dblclick`,this._dbl)}configure(e,t={}){this.limits=e,t.world&&(this.world=t.world);let n=e?e.mode:`orbit`;this.enabled=t.ignoreMode||n===`orbit`,this.enableZoom=!e||e.zoom!==!1,this.enablePan=!e||e.pan!==!1,this.el.style.touchAction=this.enabled?`none`:`auto`}changed(){this.onChange&&this.onChange()}snapshot(){return{position:this.camera.position.slice(),target:this.camera.target.slice()}}constrain(e){if(!this.limits)return;let t=this.limits.collide&&this.world?this.world():null;Vc(e,this.camera,this.limits,t)}pointerDown(e){if(this.enabled){if(this.el.setPointerCapture(e.pointerId),this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),this.moved=0,this.pointers.size===2){let[e,t]=[...this.pointers.values()];this.pinch={d:Math.hypot(e.x-t.x,e.y-t.y),cx:(e.x+t.x)/2,cy:(e.y+t.y)/2},this.mode=`pinch`}else this.mode=e.button===2||e.button===1||e.shiftKey||e.ctrlKey||e.metaKey?`pan`:`orbit`,this.last={x:e.clientX,y:e.clientY}}}pointerMove(e){if(!this.enabled||!this.pointers.has(e.pointerId))return;this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=this.snapshot();if(this.mode===`pinch`&&this.pointers.size>=2){let[e,n]=[...this.pointers.values()],r=Math.hypot(e.x-n.x,e.y-n.y),i=(e.x+n.x)/2,a=(e.y+n.y)/2;this.pinch.d>0&&this.enableZoom&&this.zoom(this.pinch.d/Math.max(r,1)),this.enablePan&&this.pan(i-this.pinch.cx,a-this.pinch.cy),this.pinch={d:r,cx:i,cy:a},this.moved+=10,this.constrain(t),this.changed();return}if(!this.last)return;let n=e.clientX-this.last.x,r=e.clientY-this.last.y;this.last={x:e.clientX,y:e.clientY},this.moved+=Math.abs(n)+Math.abs(r),this.mode===`orbit`?this.orbit(n,r):this.mode===`pan`&&this.enablePan&&this.pan(n,r),this.constrain(t),this.changed()}pointerUp(e){if(this.pointers.has(e.pointerId)){this.pointers.delete(e.pointerId);try{this.el.releasePointerCapture(e.pointerId)}catch{}if(this.pointers.size===0){if(this.moved<4&&this.onClick&&e.button===0){let t=this.el.getBoundingClientRect();this.onClick(e.clientX-t.left,e.clientY-t.top,e)}this.mode=null,this.last=null,this.pinch=null}else if(this.pointers.size===1){let e=[...this.pointers.values()][0];this.mode=`orbit`,this.last={x:e.x,y:e.y},this.pinch=null}}}wheel(e){if(!this.enabled||!this.enableZoom)return;e.preventDefault();let t=e.deltaMode===1?e.deltaY*33:e.deltaMode===2?e.deltaY*400:e.deltaY,n=this.snapshot();this.zoom(Math.exp(t*this.zoomSpeed)),this.constrain(n),this.changed()}orbit(e,t){let n=this.camera,r=[n.position[0]-n.target[0],n.position[1]-n.target[1],n.position[2]-n.target[2]],i=Math.hypot(r[0],r[1],r[2])||1e-6,a=Math.atan2(r[0],r[2]),o=Math.acos(Math.max(-1,Math.min(1,r[1]/i)));a-=e*this.rotateSpeed,o-=t*this.rotateSpeed,o=Math.max(.001,Math.min(Math.PI-.001,o)),n.position=[n.target[0]+i*Math.sin(o)*Math.sin(a),n.target[1]+i*Math.cos(o),n.target[2]+i*Math.sin(o)*Math.cos(a)],n.up=[0,1,0]}pan(e,t){let n=this.camera,r=this.el.clientHeight||1,i=n.distance,a=n.type===`orthographic`?n.orthoHeight/r:2*i*Math.tan(n.fov/2*Math.PI/180)/r,o=[n.target[0]-n.position[0],n.target[1]-n.position[1],n.target[2]-n.position[2]],s=Math.hypot(...o)||1;o[0]/=s,o[1]/=s,o[2]/=s;let c=[o[1]*n.up[2]-o[2]*n.up[1],o[2]*n.up[0]-o[0]*n.up[2],o[0]*n.up[1]-o[1]*n.up[0]],l=Math.hypot(...c)||1;c=c.map(e=>e/l);let u=[c[1]*o[2]-c[2]*o[1],c[2]*o[0]-c[0]*o[2],c[0]*o[1]-c[1]*o[0]],d=-e*a,f=t*a;for(let e=0;e<3;e++){let t=c[e]*d+u[e]*f;n.position[e]+=t,n.target[e]+=t}}zoom(e){let t=this.camera;if(t.type===`orthographic`){t.orthoHeight=Math.max(1e-4,t.orthoHeight*e);return}let n=[t.position[0]-t.target[0],t.position[1]-t.target[1],t.position[2]-t.target[2]],r=Math.hypot(...n),i=Math.max(1e-4,r*e);for(let e=0;e<3;e++)t.position[e]=t.target[e]+n[e]/(r||1)*i}focus(e){let t=this.camera,n=this.snapshot(),r=[e[0]-t.target[0],e[1]-t.target[1],e[2]-t.target[2]];for(let e=0;e<3;e++)t.target[e]+=r[e],t.position[e]+=r[e];this.constrain(n),this.changed()}},Uc=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,Wc=class{constructor(e,t={}){this.section=e,this.smoothing=t.smoothing??.12,this.reducedMotion=t.reducedMotion??Uc(),this.value=NaN,this.target=0,this.stale=!0,this.markStale=()=>{this.stale=!0},addEventListener(`scroll`,this.markStale,{passive:!0,capture:!0}),addEventListener(`resize`,this.markStale,{passive:!0})}dispose(){removeEventListener(`scroll`,this.markStale,{capture:!0}),removeEventListener(`resize`,this.markStale)}stops(){let e=[...this.section.querySelectorAll(`[data-es3d-stop]`)];return e.map((t,n)=>{let r=t.getAttribute(`data-es3d-stop`),i=r===null||r.trim()===``?e.length>1?n/(e.length-1):0:Number(r);return{el:t,value:Number.isFinite(i)?Math.min(1,Math.max(0,i)):0}})}measure(){let e=innerHeight||1,t=this.stops();if(!t.length){let t=this.section.getBoundingClientRect(),n=t.height-e;return n<=0?+(t.top<=0):Math.min(1,Math.max(0,-t.top/n))}let n=t.map(t=>{let n=t.el.getBoundingClientRect();return n.top+n.height/2-e/2});if(n[0]>=0)return t[0].value;let r=t.length-1;if(n[r]<=0)return t[r].value;let i=0;for(;i<r-1&&n[i+1]<=0;)i++;let a=n[i]===n[i+1]?0:-n[i]/(n[i+1]-n[i]);return this.reducedMotion?a<.5?t[i].value:t[i+1].value:t[i].value+(t[i+1].value-t[i].value)*a}update(e){if(this.stale&&(this.stale=!1,this.target=this.measure()),Number.isNaN(this.value)||this.reducedMotion||!(this.smoothing>0))return this.value!==this.target&&(this.value=this.target,!0);let t=this.target-this.value;return t!==0&&(Math.abs(t)<1e-4?this.value=this.target:this.value+=t*(1-Math.exp(-Math.max(e,0)/this.smoothing)),!0)}};function Gc(){return e}var Kc=1e4,qc=2e5;function Jc(e){let n=new Set,r=t=>{let{id:r,input:i,time:a,progress:o,quality:s}=t.data||{};n.size>qc&&n.clear();let c;try{c=Ho(i,{time:a,progress:o,quality:s,sent:n})}catch(t){e.postMessage({id:r,error:String(t&&t.message?t.message:t)});return}try{e.postMessage({id:r,...c.message},c.transfer)}catch{e.postMessage({id:r,ok:c.message.ok,diagnostics:c.message.diagnostics,hostOnly:c.message.hostOnly,timings:c.message.timings,lineText:c.message.lineText,lineIndex:c.message.lineIndex,main:!0})}};e.onmessage=r;for(let e of t.splice(0))r(e)}function Yc(e){if(typeof Worker!=`function`||!e)return null;let t=typeof location>`u`||new URL(e).origin===location.origin;try{if(t)return new Worker(e,{type:`module`})}catch{}try{let t=new Blob([`import ${JSON.stringify(e)};`],{type:`text/javascript`});return new Worker(URL.createObjectURL(t),{type:`module`})}catch{return null}}var Xc=class{constructor(e){if(this.worker=Yc(e),this.failed=!this.worker,this.pending=new Map,this.next=1,!this.worker)return;this.answered=!1,this.watchdog=0,this.worker.onmessage=e=>{let t=e.data;this.answered=!0,clearTimeout(this.watchdog);let n=this.pending.get(t.id);n&&(this.pending.delete(t.id),n(t.error?null:t))};let t=()=>{clearTimeout(this.watchdog),this.failed=!0;for(let e of this.pending.values())e(null);this.pending.clear();try{this.worker.terminate()}catch{}};this.worker.onerror=e=>{e&&e.preventDefault&&e.preventDefault(),t()},this.worker.onmessageerror=t,this.fail=t}compile(e,t){if(this.failed)return Promise.resolve(null);let n=this.next++;return new Promise(r=>{this.pending.set(n,r),!this.answered&&!this.watchdog&&(this.watchdog=setTimeout(()=>this.fail(),Kc));try{this.worker.postMessage({id:n,input:e,time:t.time,progress:t.progress,quality:t.quality})}catch{this.pending.delete(n),r(null)}})}dispose(){this.worker&&this.worker.terminate();for(let e of this.pending.values())e(null);this.pending.clear(),this.failed=!0}};Gc()&&Jc(self);var Zc=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,Qc=e=>typeof requestIdleCallback==`function`?requestIdleCallback(e,{timeout:500}):setTimeout(e,16),$c=()=>performance.now();function el(e={},t=!1){let n=e.background===!0,r=e.clock===`always`||e.clock==null&&n,i=e.autoOrbit===void 0?!n:e.autoOrbit!==!1;return{clock:r?`always`:`document`,playing:e.playing!==!1&&!t,auto:i&&!t}}function tl(e,t,n){return!!(e.playing&&!n&&(e.clock===`always`||t.animation&&t.animation.time))}function nl(e,t){return!(!e.auto||t)}var rl=24,il=50,al=(e,t)=>Promise.race([e,new Promise(e=>setTimeout(e,t))]);async function ol(e,t={}){let n=kc(t.geometryStore===!1?null:t.geometryStore||Pc()),r=await rc(e,{backend:t.backend,present:t.present});r.options.tessellationBudget=4;let i=r.canvas||e,a=i.parentElement;i.style.display=`block`;let o=new Fc,s=new Hc(i,o),c=el(t,Zc()),l={result:null,cache:new fo,setMode:!1,time:0,progress:0,last:0,disposed:!1,clock:c.clock,playing:c.playing,auto:c.auto,orbitSpeed:t.orbitSpeed??.22,onScreen:!0,dirty:!0,sceneTime:NaN,sceneProgress:NaN,width:0,height:0,dpr:r.pixelRatio(typeof devicePixelRatio==`number`?devicePixelRatio:1),gpuEpoch:r.backend.resourceEpoch||0,timeline:null,generation:0,holdUntil:0,changeBudget:t.changeBudget??4,workers:t.workers??1,compilerTried:!1,placedSinceDraw:!1,framesDrawn:0,waiters:[],since:{changeMs:0,compileMs:0},stats:{frameMs:0,changeMs:0,compileMs:0,tessellateMs:0,renderMs:0,instances:0,drawCalls:0,uploadBytes:0,refining:0,queued:0},storeOwners:new Set},u=()=>{l.dirty=!0};r.textures.onReady=u;let d=new qo({cache:l.cache,clock:()=>({time:l.time,progress:l.progress}),report:(e,n)=>{t.onError?t.onError(e,n):n.ok?console.warn(e):console.error(e)},forget:e=>{n.forget(e),l.storeOwners.delete(e)},restore:(e,t)=>n.store?al(n.restore(e,{entries:e.owned(t)}),il):null}),f=new Float64Array(15).fill(NaN),p=!1,m=(e,t)=>{f[e]!==t&&(f[e]=t,p=!0)},h=()=>{let e=o;p=!1;for(let t=0;t<3;t++)m(t,e.position[t]),m(3+t,e.target[t]),m(6+t,e.up[t]);return m(9,e.fov),m(10,e.orthoHeight),m(11,+(e.type===`orthographic`)),m(12,e.near??-1),m(13,e.refAspect),m(14,e.fit===`cover`?1:e.fit===`width`?2:e.fit===`height`?3:0),p},g=(e,t)=>l.cache.mesh(e,t),_=()=>l.setMode?d.set:l.result&&l.result.scene,v=e=>{let t=r.frames.lodStates(e,o.position,e=>Math.hypot(e[0]-o.position[0],e[1]-o.position[1],e[2]-o.position[2]));return n=>{let r=e.lodNode[n];return r<0||t.visible[r]&&t.active[r]===e.lodChild[n]}},y=e=>{if(!e.parts)return v(e);let t=new Map;return(e,n)=>{let r=t.get(n);return r||t.set(n,r=v(n)),r(e)}},b=()=>{let e=_();return e?{scene:e,meshOf:g,isVisible:y(e)}:null};s.onChange=()=>{l.auto=!1,l.dirty=!0,t.onInteract&&t.onInteract()},s.onClick=(e,n)=>{let a=_();if(!a||!t.onPick)return;let s=i.clientWidth,c=i.clientHeight;if(!s||!c)return;o.update(s/c,r.backend.zeroToOne,a.bounds);let u=o.ray(e,n,s,c,r.backend.zeroToOne),f=Co(a,g,u.origin,u.dir,y(a));if(!f)return t.onPick(null);if(!a.parts)return t.onPick({...f,names:wo(l.result.doc,f.uid)});let{part:p,...m}=f,h={...m,names:d.names(p,f.uid)};p&&p!==d.host&&(h.fragment=p.id),t.onPick(h)};let x=new IntersectionObserver(([e])=>{l.onScreen=e.isIntersecting,l.onScreen&&(l.dirty=!0)},{threshold:.02});x.observe(a||i);let S=new ResizeObserver(([e])=>{let t=e.contentBoxSize&&e.contentBoxSize[0],n=Math.round(t?t.inlineSize:e.contentRect.width),r=Math.round(t?t.blockSize:e.contentRect.height);(n!==l.width||r!==l.height)&&(l.width=n,l.height=r,i.style.width=`${n}px`,i.style.height=`${r}px`,l.dirty=!0)});S.observe(a||i);let C=()=>l.result&&l.result.scene.controls?l.result.scene.controls.mode:`orbit`,w=()=>C()!==`orbit`&&l.result&&l.result.scene.cameras.length>0,T=()=>({width:l.width,height:l.height,dpr:typeof devicePixelRatio==`number`?devicePixelRatio:1}),E=()=>{let e=l.generation,t=0,n=()=>{let i=l.result;if(l.disposed||e!==l.generation||!i||t>rl)return;if(!l.width||!l.height)return void setTimeout(()=>Qc(n),200);let a=t/rl;t++,so(i.scene,i.graph,l.time,a);let s=w()?new Fc().fromSpec(i.scene.cameras[0]):o;r.prepare(s,T()),so(i.scene,i.graph,l.sceneTime,l.sceneProgress),O(),Qc(n)};Qc(n)},D=(e=!0)=>{let n=_();if(!n||!n.animation.scroll)l.timeline&&l.timeline.dispose(),l.timeline=null;else{if(!l.timeline){let n=t.scroll||document.scrollingElement||document.documentElement;l.timeline=new Wc(n),e=!0}e&&(l.timeline.update(0),l.progress=l.timeline.value)}},O=()=>{if(!l.setMode)l.result&&n.changed(l.result.cache);else{for(let e of l.storeOwners)n.changed(l.cache,{owner:e,entries:()=>l.cache.owned(e)});l.storeOwners.clear()}},k=()=>{l.setMode||(l.setMode=!0,l.result&&d.set.place(d.host,l.result.scene),r.setScene(d.set,g),l.cache.onGenerate=e=>{for(let t of e.owners)l.storeOwners.add(t)},l.dirty=!0)},A=()=>{let e=l.result;if(!e||e.graph||!e.prepared)return e;let t=d.newOwner(`document`),n=go(e.source,{cache:l.cache,owner:t,time:l.time,progress:l.progress});return l.result=n,l.setMode?d.setHost(n,t):(d.adoptHost(n,t),r.setScene(n.scene,g)),l.dirty=!0,n},j=()=>{if(l.compilerTried||(l.compilerTried=!0,l.workers===0))return;let e=new Xc(import.meta.url);e.failed||(d.compiler=e)},M=()=>{l.waiters.length&&(l.placedSinceDraw||!l.framesDrawn||r.stats.refining||(l.waiters=l.waiters.filter(e=>{for(let t of e.tasks)if(!t.finished)return!0;return e.resolve(l.stats),!1})))},N={camera:o,renderer:r,controls:s,kind:r.kind,get time(){return l.time},set time(e){l.time=e},get progress(){return l.progress},set progress(e){l.timeline&&=(l.timeline.dispose(),null),l.progress=Math.min(1,Math.max(0,e))},get playing(){return l.playing},set playing(e){l.playing=!!e},get reducedMotion(){return Zc()},get changeBudget(){return l.changeBudget},set changeBudget(e){l.changeBudget=Math.max(0,+e||0)},get stats(){return{...l.stats}},setTransforms(e){let t=Array.from(e||[]),n=A(),r=n&&n.graph,i=r&&r.byId,a=t.map(e=>i&&i.get(Array.isArray(e)?e[0]:e&&e.id)),o=t.map(e=>Array.isArray(e)?e[1]:e&&e.matrix),s=r&&n.scene?oo(n.scene,r,a,o,l.time,l.progress):t.map(()=>!1);return s.some(Boolean)&&(l.dirty=!0,l.setMode&&d.set.invalidateBounds()),s},setTransform(e,t){return this.setTransforms([[e,t]])[0]===!0},invalidate:u,get result(){return A()},show(e,i={}){i.time!==void 0&&(l.time=i.time);let a,c;if(e instanceof Uo?{result:a,owner:c}=d.fromPrepared(e,`document`):(c=l.setMode?d.newOwner(`document`):uo,a=go(e,{time:l.time,progress:l.progress,cache:l.cache,owner:c})),!a.ok){c&&c!==`document`&&d.release(c);let e=Gn(a);return t.onError?t.onError(e,a):console.error(e),a}l.setMode&&i.keepFragments===!1&&d.clear(),l.result=a,l.generation++,l.setMode?(d.setHost(a,c),r.updateScene(d.set),l.placedSinceDraw=!0):(d.adoptHost(a,c),r.setScene(a.scene,g)),D(),l.progress!==0&&a.graph&&so(a.scene,a.graph,l.time,l.progress),l.sceneTime=l.time,l.sceneProgress=l.progress,l.dirty=!0;let u=a.scene.controls;s.configure(u,{world:b}),t.interactive===!1&&(s.enabled=!1),u&&u.mode!==`orbit`&&(l.auto=!1),(!i.keepCamera||w())&&(a.scene.cameras.length?o.fromSpec(a.scene.cameras[0]):o.frame(a.scene.bounds));let f=l.generation;return l.holdUntil=performance.now()+il,n.restore(l.cache,l.setMode?{entries:l.cache.owned(c)}:void 0).finally(()=>{f===l.generation&&(l.holdUntil=0,l.dirty=!0,a.scene.animation.scroll&&a.graph&&E())}),a},add(e,t={}){k();let n=d.add(e,t);return l.dirty=!0,n},fragment(e){return d.byId.get(String(e))},get fragments(){return d.list},prepare(e,t={}){return j(),d.prepare(e,t)},drawn(){return new Promise(e=>{l.waiters.push({resolve:e,tasks:new Set(d.queue)}),l.dirty=!0})},dispose(){l.disposed=!0,x.disconnect(),S.disconnect(),l.timeline&&l.timeline.dispose(),d.dispose(),s.dispose(),r.dispose()}},P=e=>{if(l.disposed)return;requestAnimationFrame(P);let n=$c(),i=l.last?Math.min(.05,(e-l.last)/1e3):0;if(l.last=e,l.setMode){if(d.queue.length){let e=d.applyQueued(l.changeBudget);l.since.changeMs+=e.changeMs,l.since.compileMs+=e.compileMs}d.takeChanged()&&(r.updateScene(d.set),D(!1),l.placedSinceDraw=!0,l.dirty=!0)}let a=_();if(!a||!l.onScreen||!l.width||!l.height)return;let c=l.result,u=Zc();if(tl(l,a,u)&&(l.time+=i),l.timeline&&l.timeline.update(i)&&(l.progress=l.timeline.value),t.onFrame&&t.onFrame(i,N),nl(l,u)){let e=s.snapshot(),t=o.position[0]-o.target[0],n=o.position[2]-o.target[2],r=l.orbitSpeed*i,a=Math.cos(r),c=Math.sin(r);o.position[0]=o.target[0]+t*a-n*c,o.position[2]=o.target[2]+t*c+n*a,s.constrain(e)}c&&c.graph&&c.scene.dynamic.length&&(l.time!==l.sceneTime||l.progress!==l.sceneProgress)&&(so(c.scene,c.graph,l.time,l.progress),l.sceneTime=l.time,l.sceneProgress=l.progress,w()&&o.fromSpec(c.scene.cameras[0]),l.setMode&&d.set.invalidateBounds(),l.dirty=!0),l.setMode&&d.updateDynamic(l.time,l.progress)&&(l.dirty=!0),h()&&(l.dirty=!0);let f=r.pixelRatio(typeof devicePixelRatio==`number`?devicePixelRatio:1);f!==l.dpr&&(l.dpr=f,l.dirty=!0);let p=r.backend.resourceEpoch||0;if(p!==l.gpuEpoch&&(l.gpuEpoch=p,l.dirty=!0),!l.dirty||l.holdUntil&&e<l.holdUntil){M();return}l.dirty=!1;let m=l.cache.stats.generateMs,g=$c();r.render(o,{...T(),time:l.time});let v=$c()-g;r.stats.refining&&(l.dirty=!0),O();let y=l.cache.stats.generateMs-m,b=r.stats,x=l.stats;x.changeMs=l.since.changeMs,x.compileMs=l.since.compileMs,x.tessellateMs=y,x.renderMs=v-y,x.instances=b.instances,x.drawCalls=b.drawCalls,x.uploadBytes=b.uploadBytes,x.refining=b.refining,x.queued=d.queue.length,l.since.changeMs=0,l.since.compileMs=0,l.placedSinceDraw=!1,l.framesDrawn++,x.frameMs=$c()-n,M()};return requestAnimationFrame(P),N}export{wo as ancestorNames,ol as createStage,et as es3dCos,$e as es3dSin,Ea as mulberry32};
|