@pacem/pacem-3d 1.0.0-dirac → 1.0.0-fermat

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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-3d v1.0.0-dirac (https://js.pacem.it)
2
+ * @pacem/pacem-3d v1.0.0-fermat (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -347,4 +347,4 @@ fn computeOffsetPosition(p0: vec4f, p1: vec4f, index: u32) -> vec4f {
347
347
  intensity: f32
348
348
  }`,`fn computeAmbient(color: vec4f, light: AmbientLight) -> vec4f {
349
349
  return vec4f(light.intensity * color.rgb * light.color.rgb, color.a);
350
- }`],bindings:[`@group(${e}) @binding(${t}) var<uniform> ${r}: AmbientLight;`],modifiers:[`${s} = computeAmbient(${i}, ${r});`]}}import{Utils as $}from"@pacem/pacem-core";import{Colors as xi}from"@pacem/pacem-foundation";import{Geometry as Rn}from"@pacem/pacem-numerical";import{Geometry as En}from"@pacem/pacem-numerical";var Te=En.LinearAlgebra.Vector3D,yi=En.LinearAlgebra.Matrix3D,wn={width:1,height:1},Eo=class{static create(e){if(zr(e))return new vi(e);if(Ur(e))return new _i(e);throw new TypeError(`Camera type '${e.type}' not supported.`)}};function Cn(n,e,t){let o=Te.subtract(e,n),r=Te.cross(t,o),i=Te.cross(o,r);Te.normalize(r),Te.normalize(o),Te.normalize(i);let s=-Te.dot(r,n),a=-Te.dot(i,n),c=-Te.dot(o,n);return yi.from(r.x,i.x,o.x,0,r.y,i.y,o.y,0,r.z,i.z,o.z,0,s,a,c,1)}function Nn(n,e){if(n<=0)throw new RangeError("Near plane distance must be positive.");if(e<=n)throw new RangeError("Far plane distance must be greater than near plane distance.")}function fa(n=120,e=1,t=.1,o=1e3){Nn(t,o);let r=Math.tan(.5*Math.PI*(1-n/180)),i=r/e,s=Number.isFinite(o),a=s?o/(t-o):-1,c=s?o*t/(t-o):-t;return yi.from(i,0,0,0,0,r,0,0,0,0,a,-1,0,0,c,0)}function ha(n,e,t,o,r=.1,i=1e3){return Nn(r,i),yi.from(2/(e-n),0,0,0,0,2/(t-o),0,0,0,0,1/(r-i),0,(n+e)/(n-e),(t+o)/(o-t),r/(r-i),1)}var _i=class n{constructor(e){this._camera=e}static view(e){return Cn(e.position,e.lookAt,e.up)}static projection(e,t=wn){let o=e.position,r=e.lookAt,i=Te.subtract(r,o);Te.normalize(i);let s=Te.dot(i,o),{height:a,width:c}=t,l=c/a,u=.5*s,p=u*l,f=u,h=e.top*f,b=e.bottom*f,C=e.right*p,x=e.left*p;return ha(x,C,h,b,e.near,e.far)}view(){return n.view(this._camera)}projection(e){return n.projection(this._camera,e)}},vi=class n{constructor(e){this._camera=e}static view(e){return Cn(e.position,e.lookAt,e.up)}static projection(e,t=wn){let o=t.width/t.height/e.aspectRatio;return fa(e.fov,o,e.near,e.far)}view(){return n.view(this._camera)}projection(e){return n.projection(this._camera,e)}};var bi=Rn.LinearAlgebra.Vector3D,we=Rn.LinearAlgebra.Matrix3D;function ir(n,e){throw typeof e=="function"&&(e=e.name),new RangeError(`Buffer '${n}' not available for ${e}.`)}function Tn(n,e,...t){if(n.stage??=e?.item.stage,vt(n))return n.key??="group_"+$.uniqueCode(),new Ei(n,e,...t);if(Ee(n))return n.key??="mesh_"+$.uniqueCode(),new Ni(n,e,...t);if(pe(n))return n.key??="camera_"+$.uniqueCode(),new wi(n);if(Se(n))return n.key??="light_"+n.type+"_"+$.uniqueCode(),new Ri(n);throw new Error("Renderable is not supported.")}var wo=class{constructor(e){this._set=e}get items(){return this._set}loop(e){let{meshes:t,cameras:o,groups:r,lights:i}=this._set,s=o[0],a=!1,c=!1;for(let l of t)l.disposed||!e(l,s,i)||(q.clearFlags(l),a||(q.clearFlags(s),a=!0),c||(i.forEach(p=>q.clearFlags(p)),c=!0));for(let l of r)q.clearFlags(l)}},tr=class{static create(e){if(cr(e))return e.key??="geometry_"+$.uniqueCode(),new Ar(e);if(Ne(e))return new Pr(e);if(kr(e))return new Ci(e);throw new Error("Object is not supported.")}},q=class n{static create(e,...t){return Tn(e,null,...t)}static clearFlags(e,t=!1){if(e.item.flags.splice(0),t){let o=e;$.isNull(o.parent)||n.clearFlags(o.parent,!0)}}static allFlags(e){let t=e,o=t.parent,r=$.isNull(o)?[]:n.allFlags(o);return t.item.flags.union(r)}},rr=class{#e;constructor(e){this.#e=e}get item(){return this.#e}#t=!1;lock(){this.#t=!0}unlock(){this.#t=!1;let e=this.#r;for(;e.length>0;){let t=e.shift();this._destroyUnsafe(t)}}#r=[];_destroyUnsafe(e){"texture"in e?e.texture.destroy():"buffer"in e&&e.buffer.destroy()}destroySafely(...e){for(let t of Array.from(e).concat(...this.#r.splice(0)))t&&(this.#t?this.#r.push(t):this._destroyUnsafe(t))}#o=!1;destroy(){this.dispose(),this.#o=!0}get disposed(){return this.#o}},or=class extends rr{constructor(e,t){super(e),this.#t=t,this.#e=$.uniqueId()%4294967295}#e;#t;#r=new Map;get parent(){return this.#t}get id(){return this.#e}allFlags(){let e=this.parent;return this.item.flags.union(e?.allFlags()??[])}buildParentWorldTransform(){let e=we.identity(),t=this;for(;!$.isNull(t.parent);){let o=t.parent.item,r=we.translate(o.transformMatrix??we.identity(),o.position??bi.zero());e=we.multiply(e,r),t=t.parent}return e}buildWorldTransform(){let e=we.translate(this.item.transformMatrix??we.identity(),this.item.position??bi.zero()),t=this.buildParentWorldTransform();return we.multiply(e,t)}#o=new Map;version(e){return this.#o.get(e)??0}buffer(e,t){if(t==="u32id"){let r=this.#r,{pipeline:i,device:s}=e;if(r.has(i))return $.extend({fresh:!1},r.get(i));let a=new Uint32Array([this.id]),c=ne.createUniform(s,a,j+"u32id-buffer"),l=$.extend({buffer:c,value:a,version:performance.now()},{fresh:!0});return this.#r.set(i,l),l}let o=this.specificBuffer(e,t);return this.#o.set(t,o.version),o}},ma={shader:U.Basic,color:"#c0c0c0",flags:[]},Ei=class extends or{#e;constructor(e,t,...o){super(e,t),this.#e=e.childRenderables.map(r=>Tn(r,this,...o))}get children(){return this.#e}specificBuffer(e,t){return null}texture(e){throw new Error("Method not implemented.")}dispose(){this.#e.forEach(e=>e.destroy())}},wi=class n extends or{#e=new Map;#t;constructor(e){super(e)}texture(e){throw new Error("Method not implemented.")}specificBuffer(e,t){let o=!1;(this.allFlags().length>0||$.isNull(this.#t))&&(o=!0,this.#e.clear(),this._rebuildMatrices(e));let{pipeline:r}=e;if(this.#e.has(r)||(o=!0,this.#e.set(r,this.#t)),q.clearFlags(this),t==="cameraViewTransform")return $.extend(this.#t,{fresh:o});ir(t,n)}_rebuildMatrices({device:e,canvas:t}){let o=this.item,r=Eo.create(o),{x:i,y:s,z:a}=o.position,c=r.view(),l=r.projection(t),u=we.multiply(c,l),p=new Float32Array(36);if(p.set(we.toArray(c),0),p.set(we.toArray(u),16),p.set([i,s,a],32),$.isNull(this.#t)){let f=ne.createUniform(e,p,j+"view-buffer");this.#t={buffer:f,value:p,version:performance.now().roundoff()}}else this.#t.value=p,this.#t.version=performance.now().roundoff()}_destroyView(){this.#e.clear();let e=this.#t;this.#t=null,this.destroySafely(e)}dispose(){this._destroyView()}},Ar=class n extends rr{#e={};#t={positions:!0,normals:!0,uv:!0,packed:!0};#r;constructor(e){super(e),e.flags??=[]}buffer(e,t){let o=this.item.flags??[];($.isNull(this.#r)||o.includes(I.Geometry))&&(o.splice(0),this.#e={},this._rebuildGeometryBuffers(e));let r=this.#t,i=this.#r,{pipeline:s}=e,a=this.#e[t]??=new Map,c=!a.has(s),l=u=>(c&&a.set(s,u),u);switch(t){case"geometryPositions":let{positions:u}=i,p=r.positions;return r.positions=!1,$.extend(l(u),{fresh:p||c});case"geometryNormals":let{normals:f}=i,h=r.normals;return r.normals=!1,$.extend(l(f),{fresh:h||c});case"geometryTexCoords":let{uv:b}=i,C=r.uv;return r.uv=!1,$.extend({fresh:C||c},l(b));case"geometry":let{packed:x}=i,d=r.packed;return r.packed=!1,$.extend(l(x),{fresh:d||c});default:ir(t,n)}}texture(e){throw new Error("Method not implemented.")}_rebuildGeometryBuffers({device:e}){this._destroyBuffers();let t=performance.now(),o=this.item,r=o.key;if(kt(o)){let i=o,a=!$.isNullOrEmpty(i.triangleIndices)?i.triangleIndices.map(_=>i.positions[_]):i.positions,c=a.length*2,l=c+a.length,u=new Float32Array(l),p=new Float32Array(l),f=new Float32Array(c),h=new Float32Array(2*l+c);for(let _=0;_<a.length;_++){let T=2*_,N=3*_,{x:E,y:v,z:A}=a[_],{x:L,y:P,z:G}=i.normals[_],{x:R,y:m}=i.textureCoordinates[_];u.set([E,v,A],N),p.set([L,P,G],N),f.set([R,m],T),h.set([E,v,A,L,P,G,R,m],N*2+T)}let b=ne.create(e,u,j+"meshgeometry-"+r+"-positions-buffer"),C=ne.create(e,p,j+"meshgeometry-"+r+"-normals-buffer"),x=ne.create(e,f,j+"meshgeometry-"+r+"-uvmap-buffer"),d=ne.create(e,h,j+"meshgeometry-"+r+"-buffer");this.#r={packed:{buffer:d,value:h,version:t},positions:{buffer:b,value:u,version:t},normals:{buffer:C,value:p,version:t},uv:{buffer:x,value:f,version:t}},this.#t={positions:!0,normals:!0,uv:!0,packed:!0}}else{let i=new Float32Array(We.flattenVectorArray(o.positions)),s=ne.createStorage(e,i,j+"nodegeometry-"+r+"-positions-buffer");this.#r={positions:{buffer:s,value:i,version:t},packed:{buffer:s,value:i,version:t}},this.#t={positions:!0,packed:!0}}}_destroyBuffers(){this.#e={};let e=this.#r;$.isNull(e)||this.destroySafely(e.positions,e.normals,e.uv)}dispose(){this._destroyBuffers()}},Pr=class n extends rr{#e={};#t={};#r;#o=new Map;#i=new Map;constructor(e){super(e),e.flags??=[],e.flags.indexOf(I.Material)===-1&&e.flags.push(I.Material)}buffer(e,t){let o=this.item.flags??[],r=$.isNull(this.#r);o.includes(I.Material)&&(this.#e={},o.splice(0),r=!0,this.#i.clear(),this._resetMaterialBuffers());let{pipeline:i}=e,s=this.#e[t]??=new Map;switch(t){case"material":case"line":let a=this._ensureMaterialBuffer(e,t);return a?(s.has(i)||(r=!0,s.set(i,a)),$.extend(a,{fresh:r})):null;default:ir(t,n)}}_ensureMaterialBuffer(e,t="material"){let o=this.#o,r=o.get(t);return r||(o.has(t)?null:(r=this.#r?.buffer(e,t),r&&o.set(t,r),r))}_resetMaterialBuffers(){this.#r=fo.create(this.item),this._destroyBuffers()}texture(e,t="texture"){let o=this.#i,r=o.get(t),i=!1;if(!r){if(r=this.#r?.texture(e,t),!r)return null;o.set(t,r),i=!0,this.#t={}}let{pipeline:s}=e,a=this.#t[t]??=new Map;return a.has(s)||(i=!0,a.set(s,r)),$.extend(r,{fresh:i})}dispose(){this._destroyBuffers()}_destroyBuffers(){this.#e={},this.#t={};let e=this.#o.values();this.#o.clear(),this.destroySafely(...e);let t=this.#i.values();this.#i.clear(),t.forEach(o=>o.texture.destroy())}},Ci=class n extends rr{#e={time:0,cursor:{x:0,y:0},resolution:{width:0,height:0}};#t;#r=new Map;constructor(e){super(e),$.extend(this.#e,e)}buffer(e,t){if(t==="interaction")return this._ensureInteractionBuffer(e);ir(t,n)}texture(e){throw new Error("Method not implemented.")}_ensureInteractionBuffer(e,t="interaction"){let o=this.#e,r=this.item,i=!this.#t||r.time!==o.time||r.resolution?.width!==o.resolution.width||r.resolution?.height!==o.resolution.height;if(!i&&!$.isNull(r.cursor)&&(i=r.cursor.x!==o.cursor.x||r.cursor.y!==o.cursor.y),i){let c=new Float32Array([r.cursor?.x??0,r.cursor?.y??0,r.resolution.width,r.resolution.height,r.time,0]),l=ne.createUniform(e.device,c,j+"interaction-buffer");this.#t={buffer:l,value:c,version:performance.now()},this.#r.clear()}let{pipeline:s}=e,a=this.#r;return a.has(s)||(i=!0,a.set(s,this.#t)),$.extend(this.#t,{fresh:i})}_destroyBuffers(){this.#r.clear();let e=this.#t;$.isNull(e)||this.destroySafely(e)}dispose(){this._destroyBuffers()}},Ni=class n extends or{#e;#t;#r;#o;#i;#s={geometry:!0,material:!0,transform:!0};#n=new Map;constructor(e,t,o,r){super(e,t),e.flags??=[],e.flags.indexOf(I.Geometry)===-1&&e.flags.push(I.Geometry),e.flags.indexOf(I.Material)===-1&&e.flags.push(I.Material),e.flags.indexOf(I.Position)===-1&&e.flags.indexOf(I.Transform)===-1&&e.flags.push(I.Transform),this.#e=o,this.#r=r}texture(e,t){return this.#o?.texture(e,t)}specificBuffer(e,t){let o=this.#s,r=this.allFlags();($.isNull(this.#i)||r.includes(I.Position)||r.includes(I.Transform))&&(this.#n.clear(),o.transform=!0,this._rebuildWorldMatrices(e)),($.isNull(this.#t)||r.includes(I.Geometry))&&(o.geometry=!0,this._ensureGeometryBuffer()),($.isNull(this.#o)||r.includes(I.Material))&&(o.material=!0,this._ensureMaterialBuffer()),q.clearFlags(this);let i=this.#t,s=this.#o;switch(t){case"geometryPositions":case"geometryNormals":case"geometryTexCoords":case"geometry":return i.buffer(e,t);case"material":case"line":return s.buffer(e,t);case"objectWorldTransform":let a=this.#i,c=o.transform;o.transform=!1;let l=this.#n,{pipeline:u}=e,p=!l.has(u);return p&&l.set(u,a),$.extend(a,{fresh:c||p});default:ir(t,n)}}_ensureGeometryBuffer(){let e=this.#t,t=this.#e,r=this.item.geometry;if($.isNull(t))e?.destroy(),this.#t=new Ar(r);else{let i=t?.get(r);i?.disposed!==!1&&(i=new Ar(r),t.set(r,i)),this.#t=i}}_ensureMaterialBuffer(){let e=this.#o,t=this.#r,r=this.item.material??ma;if($.isNull(t))e?.destroy(),this.#o=new Pr(r);else{let i=t?.get(r);i?.disposed!==!1&&(i=new Pr(r),t.set(r,i)),this.#o=i}}_rebuildWorldMatrices({device:e}){let t=this.item,o=this.buildWorldTransform(),r=we.transpose(we.invert(o)),i=new Float32Array(28);if(i.set(we.toArray(o),0),i.set([r.m11,r.m12,r.m13,0,r.m21,r.m22,r.m23,0,r.m31,r.m32,r.m33,0],16),$.isNull(this.#i)){let s=ne.createUniform(e,i,j+"mesh-"+t.key+"-worldmatrix-buffer");this.#i={buffer:s,value:i,version:performance.now().roundoff()}}else this.#i.value=i,this.#i.version=performance.now().roundoff()}dispose(){this.#n.clear();let e=this.#i;this.#i=null,this.destroySafely(e);let t=this.#o;this.#o=null,t?.destroy();let o=this.#t;this.#t=null,o?.destroy()}},Ri=class n extends or{#e;#t=new Map;constructor(e){super(e),e.flags.push(I.Light)}_rebuildAmbientLightBuffer({device:e}){let t=this.item,o=4,r=1,i=0,s=4,a=24,c=new Float32Array(a),{r:l,g:u,b:p,a:f}=xi.parse(t.color??"#fff");c.set([l,u,p,f],i),c.set([t.intensity],s),this.#e={value:c,buffer:ne.createUniform(e,c,j+"ambient-light-buffer"),version:performance.now()}}_rebuildDirectionalLightBuffer({device:e}){let t=this.item,o=1,r=4,i=3,s=0,a=4,c=7,l=c+o,u=new Float32Array(l),{r:p,g:f,b:h,a:b}=xi.parse(t.color??"#fff");u.set([p,f,h,b],s),u.set([t.intensity],c);let C=bi.subtract(t.position,t.target);u.set([C.x,C.y,C.z],a),this.#e={value:u,buffer:ne.createUniform(e,u,j+"directional-light-buffer"),version:performance.now()}}_rebuildOmniLightBuffer({device:e}){let t=this.item,o=1,r=4,i=3,s=0,a=4,c=7,l=c+o,u=new Float32Array(l),{r:p,g:f,b:h,a:b}=xi.parse(t.color??"#fff");u.set([p,f,h,b],s),u.set([t.intensity],c),u.set([t.position.x,t.position.y,t.position.z],a),this.#e={value:u,buffer:ne.createUniform(e,u,j+"omni-light-buffer"),version:performance.now()}}_rebuildLight(e){this.destroySafely(this.#e);let t=this.item;switch(t.type){case"direction":this._rebuildDirectionalLightBuffer(e);break;case"omni":this._rebuildOmniLightBuffer(e);break;case"ambient":this._rebuildAmbientLightBuffer(e);break;default:throw new Error(`Light '${t.type}' is not supported.`)}}texture(e){throw new Error("Method not implemented.")}specificBuffer(e,t){let o=this.#t,r=$.isNull(this.#e)||this.allFlags().length>0;r&&(o.clear(),this._rebuildLight(e)),q.clearFlags(this);let{pipeline:i}=e;if(o.has(i)||(r=!0,o.set(i,this.#e)),t==="light")return $.extend(this.#e,{fresh:r});ir(t,n)}dispose(){this.#t.clear();let e=this.#e;this.#e=null,this.destroySafely(e)}};var F=j,In={multisample:!0,packedVertices:!0,primitive:{topology:"triangle-list",frontFace:"ccw",cullMode:"back"}},fe=n=>{},It=class n{static{this._memoizer=new WeakMap}static dispose(e){let t=this._memoizer,o=t.get(e);z.isNull(o)||(o.clear(),t.delete(e))}static createColorPicking(e,t){let o=n.create(e,t);return o instanceof No||o instanceof Ro?{frame:o.raycast}:null}static create(e,[t,o,...r],i){let s=n._memoizer,a=s.get(e);if(z.isNull(a)&&s.set(e,a=new Map),z.isNull(t))throw new Error("Pipeline not implemented, given the provided arguments.");if(Ee(t.item)){let c=kt(t.item.geometry),l=!c&&Ke(t.item.material);if(!c&&!l)throw new Error("Pipeline not implemented, given the provided mesh argument.");let u=c?new Ti(t,o,...r):new Mi(t,o),p=u.key+(i?.modifiers?.version??""),f=a.get(p);if(f)return f;let h=c?new No(e,u):new Ro(e,u);h.build(i);let b=h;return z.extend(b,{id:p+"-"+e.canvas.width+"x"+e.canvas.height+"-"+z.Dates.now().toISOString()}),a.set(p,b),b}else throw new ReferenceError("Pipeline not implemented, given thst the first argument is not a mesh.")}},Co=class{constructor(){this.#e=new Map}#e;ensureBindGroup({device:e},t,o,r,i,s,a=()=>{}){let c=this.#e,l=typeof t=="string"?t:t.key,u=c.get(l);if(z.isNull(u)&&c.set(l,u=new Map),r||!u.has(s)){let p=o.map((b,C)=>({binding:C,resource:{buffer:b}})),f={label:s,layout:i,entries:p};a(f);let h=e.createBindGroup(f);return u.set(s,h),h}else return u.get(s)}},Ti=class n{#e=[];#t;#r;#o=new Map;#i={shader:"basic",lights:""};constructor(...e){this.add(...e)}reset(){this.#e.splice(0),this.#t=null,this.#o.clear(),this.#i={shader:"basic",lights:""}}add(...e){for(let t of e??[])if(Ee(t.item))if(z.isNull(this.#t)){this.#t=t;let o=t.item.material??{shader:U.Basic};this.#i.shader=o.shader+"-"+(o.map?"map":"nomap")}else throw new Error("Mesh already added.");else if(Se(t.item))this.#e.push(t),this.#i.lights+="-"+t.item.type;else if(pe(t.item))this.#r??=t;else throw new Error("Unknown object type.")}build(e){let t=this._computeBasicData(),o=this.key,r=this.vertex({inputModifier:e?.vertexInput,outputModifier:e?.vertexOutput}),i=this.fragment(t,{modifier:e?.fragment}),s=(...c)=>n.prototype.bindgroup.apply(this,c),a={lightCount:this.#e.length,mapCount:this.#t.item.material?.map?1:0};return{vertex:r,fragment:i,key:o,bindings:s,metadata:a}}get key(){let{shader:e,lights:t}=this.#i;return"mesh-"+e+t}bindgroup(e,t,o){let i=this.#o.get(e);if(z.isNull(i))return null;if(z.isNullOrEmpty(t))return i;let s=i.filter(a=>a.key===t);return isNaN(o)?s:o>=0&&o<i.length?s[o]:s}vertex(e){return fn(e)}_computeBasicData(){let e=this.#t.item,t=this.#e,o=e.material,r=!z.isNull(o?.texture),i=!z.isNullOrEmpty(t),s=z.isNull(e)?U.Basic:e.material?.shader??U.Basic;return{hasTexture:r,hasLighting:i,shader:s,materialBindGroupIndex:2,lightingBindGroupIndex:3}}_computeBindGroupsAndReferences(e=this._computeBasicData()){let{hasTexture:t,materialBindGroupIndex:o,lightingBindGroupIndex:r}=e,i=this.#o,s=this.#e,a={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},c={key:"material",group:o,binding:0,type:"buffer"};t?i.set(ve.Mesh,[a,c,{key:"texture",group:o,type:"texture"}]):i.set(ve.Mesh,[a,c]),i.set(ve.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}]);let l=s.map((u,p)=>({key:"light",group:r,binding:p,type:"buffer"}));l.push(...l),i.set(ve.Interaction,[{key:"interaction",group:0,type:"buffer",binding:1}])}fragment(e=this._computeBasicData(),t){this._computeBindGroupsAndReferences(e);let o={definitions:[],bindings:[],modifiers:[]},r=i=>{for(let s of i.definitions??[])o.definitions.indexOf(s)===-1&&o.definitions.push(s);z.isNullOrEmpty(i.bindings)||o.bindings.push(...i.bindings),z.isNullOrEmpty(i.modifiers)||o.modifiers.push(...i.modifiers)};switch(e.shader){case U.Basic:if(e.hasTexture){let a=e.materialBindGroupIndex,c=vn({inputColor:Tt,outputColors:[Tt],uv:"uv"},a);r(c)}let i=0,s=this.#e;for(let a of s){switch(a.item.type){case"direction":let l=yn({outputColor:Nr,normal:"normal"},e.lightingBindGroupIndex,i);r(l);break;case"omni":let u=xn({outputColor:Nr,normal:"normal",position:"vertex"},e.lightingBindGroupIndex,i);r(u);break;case"ambient":let p=bn({inputColor:Tt,outputColor:po},e.lightingBindGroupIndex,i);r(p);break}i++}return Tr.fragment(o,t)}}},Me={writeBufferConditionally:(n,e)=>{e.fresh&&n.queue.writeBuffer(e.buffer,0,e.value)}},No=class{constructor(e,t,o=new Co){this._context=e,this._builder=t,this._cache=o,this._ensureU32idBindGroup=(r,i,s)=>this._cache.ensureBindGroup(this._context,r,[i],s,this._pickBindGroupLayout,F+"mesh-colorpick-bind-group"),this._ensureMaterialBindGroup=(r,i,s,a,c=2)=>{let l=this._bindGroupLayouts[c],u=F+"material-bind-group";if(l.label!==F+"material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");return this._cache.ensureBindGroup(this._context,r,[i],a,l,u,p=>{let{device:f}=this.context,h=p.entries;s&&h.push({binding:1,resource:f.createSampler({addressModeU:"repeat",addressModeV:"repeat",magFilter:"linear",minFilter:"linear"})},{binding:2,resource:s.createView()})})},this._ensureWorldTransformBindGroup=(r,i,s,a=1,c=!1)=>{let l=this._bindGroupLayouts[a];if(l.label!==F+"mesh-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let u=r.key+"-"+(c?1:0),p=`${F}${c?"colorpick":"mesh"}-transforms-bind-group`;return this._cache.ensureBindGroup(this._context,u,[i],s,l,p)},this._ensureCameraProjectionAndInteractionDataBindGroup=(r,i,s,a,c=0,l=!1)=>{let u=this._bindGroupLayouts[c],p=r.key+"-"+(l?1:0),f=`${F}${l?"colorpick":"mesh"}-view-bind-group`;return this._cache.ensureBindGroup(this._context,p,[i,s],a,u,f)},this._ensureLightingBindGroup=(r,i,s=3)=>{let a=this._bindGroupLayouts[s],c=r.map(u=>u.id).join(":"),l=r.map(u=>u.buffer.buffer);return this._cache.ensureBindGroup(this._context,c,l,i,a,F+"mesh-lighting-bind-group")},this._bindGroupLayouts=[],this._bindVertex=fe,this._bindPicker=fe,this._bindWorldTransform=fe,this._bindRaycastWorldTransform=fe,this._bindCameraProjectionAndInteractionData=fe,this._bindRaycastCameraProjectionAndInteractionData=fe,this._bindLighting=fe,this._bindMaterial=fe,this.set=r=>{throw new Error("Deprecated.")},this.bind=(r,...i)=>{throw new Error("Deprecated.")},this.draw=(r,...i)=>{throw new Error("Deprecated.")},this.frame=(r,i,s,a,...c)=>{r.setPipeline(this._pipeline);try{this._bindVertex(r,s),this._bindWorldTransform(r,s),this._bindMaterial(r,s),this._bindCameraProjectionAndInteractionData(r,a,i),this._bindLighting(r,...c);let l=s.item,u=l.geometry;r.draw(u.triangleIndices?.length||u.positions.length)}catch(l){console.error("Pacem.Drawing3D.FrameException",l)}},this.raycast=(r,i,s,a)=>{r.setPipeline(this._pickPipeline);try{this._bindVertex(r,s),this._bindRaycastWorldTransform(r,s),this._bindRaycastCameraProjectionAndInteractionData(r,a,i),this._bindPicker(r,s);let c=s.item,l=c.geometry;r.draw(l.triangleIndices.length)}catch{}},this._key=t.key}get context(){return this._context}get key(){return this._key}build(e){let t=z.extend({},In,e??{}),o=this._builder,r=o.build(t.modifiers),i=z.extend({pipeline:this},this._context),s=i.device,a={module:s.createShaderModule({code:r.vertex}),buffers:t.packedVertices?[Mt.createVertex(0,3,3,2)]:[Mt.createVertex(0,3),Mt.createVertex(1,3),Mt.createVertex(2,2)]},c=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX|oe.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:oe.VERTEX|oe.FRAGMENT,buffer:{type:"uniform"}}],label:F+"mesh-view-bind-group-layout"}),l=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX,buffer:{type:"uniform"}}],label:F+"mesh-transforms-bind-group-layout"}),u=[c,l],p={module:s.createShaderModule({code:r.fragment}),targets:[{format:i.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},f=u.length,h=[{binding:0,visibility:oe.FRAGMENT,buffer:{type:"read-only-storage"}}],{mapCount:b}=r.metadata,C=b>0;C&&h.push({visibility:oe.FRAGMENT,binding:1,sampler:{}},...Array(b).keys().map(m=>({visibility:oe.FRAGMENT,binding:2+m,texture:{}})));let x={label:F+"material-bind-group-layout",entries:h},d=s.createBindGroupLayout(x);u.push(d);let _=u.length,{lightCount:T}=r.metadata,N=T>0;if(N){let m=s.createBindGroupLayout({entries:[...Array(T).keys()].map((g,y)=>({visibility:oe.FRAGMENT,binding:y,buffer:{type:"uniform"}})),label:F+"lighting-bind-group-layout"});u.push(m)}let E={label:F+"mesh-render-pipeline",vertex:a,fragment:p,layout:s.createPipelineLayout({label:F+"mesh-render-pipeline-layout",bindGroupLayouts:this._bindGroupLayouts=u}),primitive:t.primitive};t.multisample&&(E.multisample={count:4},E.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._pipeline=s.createRenderPipeline(E);let v=this._pickBindGroupLayout=s.createBindGroupLayout({label:F+"mesh-colorpick-bind-group-layout",entries:[{visibility:oe.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),A={label:F+"mesh-colorpick-pipeline",vertex:a,fragment:{module:s.createShaderModule({code:fi(2)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:F+"mesh-colorpick-pipeline-layout",bindGroupLayouts:[c,l,v]}),primitive:t.primitive,depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickPipeline=s.createRenderPipeline(A);let L=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing vertex buffers was provided.`);let{buffer:w}=y.buffer(i,"geometryPositions"),{buffer:M}=y.buffer(i,"geometryNormals"),{buffer:O}=y.buffer(i,"geometryTexCoords");m.setVertexBuffer(0,w),m.setVertexBuffer(1,M),m.setVertexBuffer(2,O)},P=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing vertex buffers was provided.`);let{buffer:w}=y.buffer(i,"geometry");m.setVertexBuffer(0,w)};this._bindVertex=t.packedVertices?P:L;let G=(m,g,y)=>{if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let w=g.buffer(i,"objectWorldTransform"),M=w.buffer;Me.writeBufferConditionally(s,w);let{group:O}=r.bindings(ve.Mesh,"objectWorldTransform",0),D=this._ensureWorldTransformBindGroup(g.item,M,w.fresh,O,y);m.setBindGroup(O,D)};this._bindWorldTransform=(m,...g)=>{let y=g.at(0);G(m,y,!1)},this._bindRaycastWorldTransform=(m,...g)=>{let y=g.at(0);G(m,y,!0)};let R=(m,g,y,w)=>{if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing view projection buffers was provided.`);let M=g.buffer(i,"cameraViewTransform"),O=M.buffer;if(Me.writeBufferConditionally(s,M),z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing interaction buffers was provided.`);let D=y.buffer(i,"interaction"),X=D.buffer;Me.writeBufferConditionally(s,D);let{group:H}=r.bindings(ve.Camera,"cameraViewTransform",0),{group:K}=r.bindings(ve.Interaction,"interaction",0);if(H!==K)throw new ReferenceError(`Layout bind group mismatch: ${H} vs ${K}.`);let ie=this._ensureCameraProjectionAndInteractionDataBindGroup(g.item,O,X,M.fresh||D.fresh,H,w);m.setBindGroup(H,ie)};this._bindCameraProjectionAndInteractionData=(m,...g)=>{let y=g.at(0),w=g.at(1);R(m,y,w,!1)},this._bindRaycastCameraProjectionAndInteractionData=(m,...g)=>{let y=g.at(0),w=g.at(1);R(m,y,w,!0)},this._bindMaterial=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing vertex colors was provided.`);let w=y.buffer(i,"material"),M=w.buffer;Me.writeBufferConditionally(s,w);let O=y.texture(i),D=O?.texture,X=this._ensureMaterialBindGroup(y.item,M,D,w.fresh,f);m.setBindGroup(f,X),C&&s.queue.copyExternalImageToTexture({source:O.source,flipY:!0},{texture:D},{width:D.width,height:D.height})},this._bindLighting=(m,...g)=>{if(N){let w=Array.from(g).map(D=>({buffer:D.buffer(i,"light"),id:D.item.key})),M=w.some(D=>D.buffer.fresh),O=this._ensureLightingBindGroup(w,M,_);for(let D of w)Me.writeBufferConditionally(s,D.buffer);m.setBindGroup(_,O)}},this._bindPicker=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let w=y.buffer(i,"u32id"),M=w.buffer;Me.writeBufferConditionally(s,w);let O=2,D=w.fresh,X=this._ensureU32idBindGroup(y.item,M,D);m.setBindGroup(O,X)}}},Mi=class n{#e;#t;#r=new Map;constructor(...e){this.add(...e)}reset(){this.#e=null,this.#r.clear()}add(...e){for(let t of e??[])if(Ee(t.item))if(z.isNull(this.#e))this.#e=t;else throw new Error("Line already added.");else if(pe(t.item))this.#t??=t;else if(!Se(t.item))throw new Error("Unknown object type.")}build(){let e=this._computeBasicData(),t=this.key,o=this.vertex(e),r=this.fragment(e);return{vertex:o,fragment:r,key:t,bindings:(...s)=>n.prototype.bindgroup.apply(this,s),metadata:{thickness:e.thickness,dashPattern:e.dashPattern}}}get key(){let e=(this.#e?.item).material?.lineWidth>1;return U.Line+(e?"-fat":"")}bindgroup(e,t,o){let i=this.#r.get(e);if(z.isNull(i))return null;if(z.isNullOrEmpty(t))return i;let s=i.filter(a=>a.key===t);return isNaN(o)?s:o>=0&&o<i.length?s[o]:s}vertex(e=this._computeBasicData()){return e.thickness>1?gn():mn()}_computeBasicData(){let e=this.#e.item,t=z.isNull(e)?U.Line:e.material?.shader??U.Line,o=e.material,r=o?.lineWidth??1,i=o?.dashArray;return{shader:t,thickness:r,dashPattern:i}}_computeBindGroupsAndReferences(e=this._computeBasicData()){let t=this.#r,o={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},r={key:"material",group:3,binding:0,type:"buffer"},i={key:"geometryPositions",group:2,binding:0,type:"buffer"},s={key:"line",group:2,binding:1,type:"buffer"};t.set(ve.Mesh,[o,r,i,s]),t.set(ve.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}])}fragment(e=this._computeBasicData()){this._computeBindGroupsAndReferences(e);let t={definitions:[],bindings:[],modifiers:[]};if(e.shader===U.Line)return Mr.fragment(t)}},Ro=class{#e;constructor(e,t,o=new Co){this._lineBuilder=t,this._cache=o,this._ensureLineU32idBindGroup=(r,i,s)=>{let a=this.context;return this._cache.ensureBindGroup(a,r,[i],s,this._pickLineBindGroupLayout,F+"line-colorpick-bind-group")},this._ensureLineMaterialBindGroup=(r,i,s,a=2)=>{let c=this._bindLineGroupLayouts[a];if(c.label!==F+"line-material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let l=this.context;return this._cache.ensureBindGroup(l,r,[i],s,c,F+"line-material-bind-group")},this._ensureLinePositionsBindGroup=(r,i,s,a)=>{let c=this._bindLineGroupLayouts[a];if(c.label!==F+"line-positions-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let l=this.context;return this._cache.ensureBindGroup(l,r,i,s,c,F+"line-positions-bind-group")},this._ensureLineWorldTransformBindGroup=(r,i,s,a=1,c=!1)=>{let l=this._bindLineGroupLayouts[a];if(l.label!==F+"line-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let u=r.key+"-line-"+(c?1:0),p=`${F}${c?"colorpick":""}-line-transforms-bind-group`,f=this.context;return this._cache.ensureBindGroup(f,u,[i],s,l,p)},this._ensureLineCameraProjectionBindGroup=(r,i,s,a=0,c=!1)=>{let l=this._bindLineGroupLayouts[a],u=r.key+"-line-"+(c?1:0),p=`${F}${c?"colorpick":""}-line-view-bind-group`,f=this.context;return this._cache.ensureBindGroup(f,u,[i],s,l,p)},this._bindLineGroupLayouts=[],this._bindLinePositions=fe,this._bindLinePicker=fe,this._bindLineWorldTransform=fe,this._bindLineRaycastWorldTransform=fe,this._bindLineCameraProjection=fe,this._bindLineRaycastCameraProjection=fe,this._bindLineMaterial=fe,this._drawLine=fe,this.set=r=>{throw new Error("Deprecated.")},this.bind=(r,...i)=>{throw new Error("Deprecated.")},this.draw=(r,...i)=>{throw new Error("Deprecated.")},this.frame=(r,i,s)=>{r.setPipeline(this._linePipeline);try{this._bindLineWorldTransform(r,i),this._bindLineCameraProjection(r,s),this._bindLinePositions(r,i),this._bindLineMaterial(r,i),this._drawLine(r,i)}catch(a){console.error("Pacem.Drawing3D.FrameException",a)}},this.raycast=(r,i,s)=>{r.setPipeline(this._pickLinePipeline);try{this._bindLineRaycastWorldTransform(r,i),this._bindLineRaycastCameraProjection(r,s),this._bindLinePositions(r,i),this._bindLinePicker(r,i),this._drawLine(r,i)}catch{}},this.#e=e,this._lineKey=t.key}get context(){return this.#e}get key(){return this._lineKey}build(e){let t=z.extend({},In,e??{}),o=this._lineBuilder,r=o.build(),i=z.extend({pipeline:this},this.#e),s=i.device,a=r.metadata.thickness>1,c={module:s.createShaderModule({code:r.vertex}),buffers:[]},l=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX,buffer:{type:"uniform"}}],label:F+"line-transforms-bind-group-layout"}),u=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX,buffer:{type:"uniform"}}],label:F+"line-view-bind-group-layout"}),p=[{binding:0,visibility:oe.VERTEX,buffer:{type:"read-only-storage"}}];a&&p.push({binding:1,visibility:oe.VERTEX,buffer:{type:"uniform"}});let f=s.createBindGroupLayout({entries:p,label:F+"line-positions-bind-group-layout"}),h=[l,u,f],b=h.length,C=h.slice(),x={module:s.createShaderModule({code:r.fragment}),targets:[{format:i.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},d=C.length,_=[{binding:0,visibility:oe.FRAGMENT,buffer:{type:"read-only-storage"}}],T={label:F+"line-material-bind-group-layout",entries:_},N=s.createBindGroupLayout(T);C.push(N);let E=a?t.primitive.topology:"line-list",v={label:F+"line-render-pipeline",vertex:c,fragment:x,layout:s.createPipelineLayout({label:F+"line-render-pipeline-layout",bindGroupLayouts:this._bindLineGroupLayouts=C}),primitive:z.extend({},t.primitive,{topology:E})};t.multisample&&(v.multisample={count:4},v.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._linePipeline=s.createRenderPipeline(v);let A=this._pickLineBindGroupLayout=s.createBindGroupLayout({label:F+"line-colorpick-bind-group-layout",entries:[{visibility:oe.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),L={label:F+"line-colorpick-pipeline",vertex:c,fragment:{module:s.createShaderModule({code:fi(b)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:F+"line-colorpick-pipeline-layout",bindGroupLayouts:h.concat(A)}),primitive:z.extend({},t.primitive,{topology:E}),depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickLinePipeline=s.createRenderPipeline(L);let P=(R,m,g)=>{if(z.isNull(m))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let y=m.buffer(i,"objectWorldTransform"),w=y.buffer;Me.writeBufferConditionally(s,y);let{group:M}=r.bindings(ve.Mesh,"objectWorldTransform",0),O=this._ensureLineWorldTransformBindGroup(m.item,w,!1,M,g);R.setBindGroup(M,O)};this._bindLineWorldTransform=(R,...m)=>{let g=m.at(0);P(R,g,!1)},this._bindLineRaycastWorldTransform=(R,...m)=>{let g=m.at(0);P(R,g,!0)};let G=(R,m,g)=>{if(z.isNull(m))throw new ReferenceError(`Null ${q.name} bringing view projection buffers was provided.`);let y=m.buffer(i,"cameraViewTransform"),w=y.buffer;Me.writeBufferConditionally(s,y);let{group:M}=r.bindings(ve.Camera,"cameraViewTransform",0),O=this._ensureLineCameraProjectionBindGroup(m.item,w,!1,M,g);R.setBindGroup(M,O)};this._bindLineCameraProjection=(R,...m)=>{let g=m.at(0);G(R,g,!1)},this._bindLineRaycastCameraProjection=(R,...m)=>{let g=m.at(0);G(R,g,!0)},this._bindLinePositions=(R,...m)=>{let g=m.at(0);if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing vertex buffers was provided as index 0.`);let y=g.buffer(i,"geometryPositions"),w=y.buffer,M=y.fresh,O=[w];if(Me.writeBufferConditionally(s,y),a){let H=g.buffer(i,"line"),K=H.buffer;M||=H.fresh,O.push(K),Me.writeBufferConditionally(s,H)}let{group:D}=r.bindings(ve.Mesh,"line",0),X=this._ensureLinePositionsBindGroup(g.item,O,M,D);R.setBindGroup(D,X)},this._bindLineMaterial=(R,...m)=>{let g=m.at(0);if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing vertex colors was provided.`);let y=g.buffer(i,"material"),w=y.buffer;Me.writeBufferConditionally(s,y);let M=this._ensureLineMaterialBindGroup(g.item,w,y.fresh,d);R.setBindGroup(d,M)},this._bindLinePicker=(R,...m)=>{let g=m.at(0);if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let y=g.buffer(i,"u32id"),w=y.buffer,M=y.value;Me.writeBufferConditionally(s,y);let O=this._ensureLineU32idBindGroup(g.item,w,!1);R.setBindGroup(b,O)},this._drawLine=(R,...m)=>{let y=m.at(0).item,w=y.geometry;a?R.draw(6,w.positions.length-1,0,0):R.draw(w.positions.length)}}};import{Utils as At}from"@pacem/pacem-core";var Or=class{static{this._memoizer=new WeakMap}static dispose(e){let t=this._memoizer;if(t.has(e)){let o=t.get(e);for(let r of o.values())r.destroy();o.clear(),t.delete(e)}}static createColorPicking(e){let t=this._memoizer;t.has(e)||t.set(e,new Map);let o=t.get(e),r="colorpick";if(o.has(r))return o.get(r);let i=new Ii(e);return o.set(r,i),i}},Lr=1,Ii=class{constructor(e){this._context=e,this._objects=new Map,this.frame=(t,...o)=>{if(At.isNull(this._encoder))throw new Error("Null encoder. Maybe you missed to call the 'begin' method first.");let r=Array.from(o);It.createColorPicking(this._context,r)?.frame(this._pass,t,...o);for(let s of r)s.item.inert||this._objects.set(s.id,s)},this.end=t=>{if(!At.isNull(this._handle))return this._handle;let o=this._pass,r=this._encoder,{device:i}=this._context,{render:s}=this._textures,a=s.texture,c=this._ensureBuffer();o.end(),r.copyTextureToBuffer({texture:a,origin:{x:t.x,y:t.y}},{buffer:c,bytesPerRow:(Lr*4+255|0)*256,rowsPerImage:1},{width:Lr}),i.queue.submit([r.finish()]),this._encoder=null;let l=this,u=l._objects,p=()=>{l._handle=null};return this._handle=new Promise((f,h)=>{c.mapAsync(uo.READ,0,4*Lr).then(b=>{let x=new Uint32Array(c.getMappedRange(0,4*Lr))[0];c.unmap(),p();let d=u.get(x);f(d?[d.item]:[])})})}}_createTexture(e){let{device:t,canvas:o}=this._context,r=Math.min(t.limits.maxTextureDimension2D,o.clientWidth),i=Math.min(t.limits.maxTextureDimension2D,o.clientHeight);return t.createTexture({size:[r,i,1],format:e,usage:Re.COPY_SRC|Re.RENDER_ATTACHMENT})}_ensureBuffer(){let e=this._buffer;if(!At.isNull(e))return e;let{device:t}=this._context;return this._buffer=t.createBuffer({label:j+"colorpick-output-buffer",size:Lr*4,usage:ye.MAP_READ|ye.COPY_DST})}_ensureTextures(){let e=this._textures;if(!At.isNull(e))return e;let t=this._createTexture("r32uint"),o=this._createTexture("depth24plus"),r={texture:t,view:t.createView()},i={texture:o,view:o.createView()};return this._textures={render:r,depth:i}}_destroyTexture(e){At.isNull(e)||e.texture?.destroy()}destroy(){let e=this._textures,t=this._buffer;if(!At.isNullOrEmpty(e)){let{render:o,depth:r}=e;this._destroyTexture(o),this._destroyTexture(r),this._textures=null}At.isNull(t)||(t.destroy(),this._buffer=null)}begin(){let{device:e}=this._context;this._encoder=e.createCommandEncoder({label:j+"colorpick-raycaster"});let{render:t,depth:o}=this._ensureTextures(),r={label:j+"colorpick-raycaster-pass",colorAttachments:[{view:t.view,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:o.view,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}};this._pass=this._encoder.beginRenderPass(r),this._objects.clear()}};var Ai=xa.LinearAlgebra.Vector3D,nr;(function(n){n[n.NotSupported=0]="NotSupported",n[n.Disabled=1]="Disabled"})(nr||(nr={}));var To=class{static create(e,t){return new Promise((o,r)=>{if(navigator.gpu){let i=new Pi(e);i.init(t).then(s=>o(i),s=>{let c={message:typeof s=="string"?s:s.message,cause:nr.Disabled};r(c)})}else{let s={message:"WebGPU not supported.",cause:nr.NotSupported};r(s)}})}};function ba(n){return{bottom:-1,top:1,left:-1,right:1,near:.1,far:200,lookAt:Ai.from(0,0,0),up:Ai.j(),position:Ai.from(0,0,1),type:"orthographic",flags:[],stage:n}}function Ea(...n){for(let e of n||[])e?.destroy()}var Pi=class{#e;#t;#r;#o;#i;#s;#n;#l;#a;#p;#f;#h;constructor(e){this.#o=new WeakMap,this.#i=new WeakMap,this.#s=new WeakMap,this.#a={enableValidation:!1},this.#p=!1,this._logError=r=>{let i=this.#e,s=i.logger;if(!te.isNull(s)){let a="error"in r?r.error:r;s.log(va.LogLevel.Error,a.message,"WebGPU")}},this.#c=!0,this.#u=!1;let t=(this.#e=e).stage,o=document.createElement("canvas");o.id=_a+"_3d_stage_"+te.uniqueCode(),t.innerHTML="",t.appendChild(this.#t=o),this.#f=tr.create(this.#h={time:performance.now(),cursor:{x:0,y:0},resolution:{width:0,height:0}})}_buildPassDescriptor({multisample:e,format:t}){let{context:o,device:r}=this.#r,i=o.getCurrentTexture(),s=this.#l;if(te.isNull(s)){if(s={},e){let b=r.createTexture({label:j+"render-texture",format:t??i.format,usage:Re.RENDER_ATTACHMENT,size:[i.width,i.height],sampleCount:4});s.render={texture:b,view:b.createView({label:j+"render-texture-view"})};let C=r.createTexture({label:j+"depth-texture",format:"depth24plus",usage:Re.RENDER_ATTACHMENT,size:[i.width,i.height],sampleCount:4});s.depth={texture:C,view:C.createView({label:j+"depth-texture-view"})}}this.#l=s}let{transparent:a,background:c}=this.#e,l=a?{r:0,g:0,b:0,a:0}:c?typeof c=="string"?ya.parse(c):c:{r:0,g:0,b:0,a:1},u=We.flattenVectorArray([l]),p=i.createView({label:j+"canvas-texture-view"}),f={view:p,clearValue:u,loadOp:"clear",storeOp:"store"},h={colorAttachments:[f]};if(e){let b=s.render.view,C=s.depth.view;h.depthStencilAttachment={view:C,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store",stencilClearValue:0,stencilReadOnly:!0},f.view=b,f.resolveTarget=p}return h}_buildContext(e=this.#t,t=this.#e.size){t??=e;let o=t.width,r=t.height,i=1;e.width=o*i,e.height=r*i;let s=e.getContext("webgpu"),a=navigator.gpu.getPreferredCanvasFormat();return{context:s,textureFormat:a}}_buildUpContext(e,t,o,r){let{transparent:i}=this.#e;o.configure({alphaMode:i?"premultiplied":"opaque",device:e,format:r}),this.#r={device:e,adapter:t,canvas:this.#t,context:o,format:r},this.#c=!1}async init(e){this.#a=e;let t=await navigator.gpu.requestAdapter();if(te.isNull(t))throw new Error("WebGPU adapter unavalable or disabled.");let o=await t.requestDevice();if(te.isNull(t))throw new Error("WebGPU device unavalable or disabled.");o.addEventListener("uncapturederror",this._logError),this.#u=!te.isNull(e.modifiers?.version)&&!te.isNull(e.modifiers)&&(!te.isNull(e.modifiers.vertexInput)||!te.isNull(e.modifiers.vertexOutput)||!te.isNull(e.modifiers.fragment));let{context:r,textureFormat:i}=this._buildContext();this._buildUpContext(o,t,r,i)}#c;#u;render(e){if(this.#c||te.isNull(this.#n)||!(this.#t.width>0)||!(this.#t.height>0))return;let t=this.#r,o=t.device,r=this.#n,i=this.#a?.enableValidation??!1;this.#u&&te.extend(this.#h,e);let a=this._buildPassDescriptor({multisample:!0}),c=o.createCommandEncoder({label:j+"renderer"}),l=c.beginRenderPass(a);r.loop((u,p,f)=>{if(u.item.hide)return!1;i&&o.pushErrorScope("validation");let h=[u,p,...f];return It.create(t,h,{multisample:!0,modifiers:this.#a.modifiers}).frame(l,this.#f,...h),i&&o.popErrorScope().then(C=>{C&&this._logError(C)}),!0}),l.end(),o.queue.submit([c.finish()])}set disabled(e){this.#p=e}get disabled(){return this.#p}raycast(e){if(this.#c||te.isNull(this.#n))return Promise.resolve([]);let t=this.#r,o=t.device,r=this.#n,i=this.#a?.enableValidation??!1,s=Or.createColorPicking(t);return s.begin(),r.loop((a,c)=>a.item.hide?!1:(i&&o.pushErrorScope("validation"),s.frame(this.#f,a,c),i&&o.popErrorScope().then(l=>{l&&this._logError(l)}),!0)),s.end(e)}_disposeRenderableJustInCase(e){let t=this.#o;t.has(e)&&(t.get(e)?.destroy(),t.delete(e))}_createOrYieldRenderable(e,t=this.#i,o=this.#s){e.stage??=this.#e;let r=this.#o,i=r.get(e);return te.isNull(i)&&r.set(e,i=q.create(e,t)),i}_createOrYieldGeometry(e){let t=this.#i,o=t.get(e);return te.isNull(o)&&t.set(e,o=tr.create(e)),o}_createOrYieldMaterial(e){let t=this.#s,o=t.get(e);return te.isNull(o)&&t.set(e,o=tr.create(e)),o}_unwrapBuffers(e,t){t??={meshes:[],lights:[],cameras:[],groups:[]};for(let o of e.children)o.item.stage??=this.#e,Ee(o.item)&&t.meshes.push(o),pe(o.item)&&t.cameras.push(o),Se(o.item)&&t.lights.push(o),vt(o.item)&&(t.groups.push(o),this._unwrapBuffers(o,t));return t}_update(e){let t=[],o=[],r=[],i=l=>this._createOrYieldRenderable(l),s;for(let l of e){if(l.hide){this._disposeRenderableJustInCase(l);continue}if(l.stage??=this.#e,vt(l)){let u=l;u.flags.includes(I.Children)&&this.#o.delete(u),t.push(i(u))}Ee(l)&&l.geometry&&(this._createOrYieldGeometry(l.geometry),te.isNull(l.material)||this._createOrYieldMaterial(l.material),o.push(i(l))),Se(l)&&r.push(i(l)),pe(l)&&(s??=l)}s??=ba(this.#e);let a=i(s),c={meshes:o,lights:r,cameras:[a],groups:t};for(let l of t)c=this._unwrapBuffers(l,c);this.#n?.items.meshes.forEach(l=>{o.includes(l)||l.destroy()}),this.#n=new wo(c)}update(...e){this._update(Array.from(e))}dispose(){if(this.#n=null,this._disposeContext()){let{device:e}=this.#r;e.removeEventListener("uncapturederror",this._logError),e.destroy}}_disposeContext(){let e=this.#r;if(te.isNull(e))return!1;Or.dispose(e),It.dispose(e);let t=this.#l;if(this.#l=null,!te.isNull(t)){let{render:o,depth:r}=t;Ea(o?.texture,r?.texture)}return e.context.unconfigure(),!0}resize(e){if(this.#c=!0,this._disposeContext()){let{device:t,adapter:o}=this.#r,{context:r,textureFormat:i}=this._buildContext(this.canvas,e);this._buildUpContext(t,o,r,i),this.#u&&te.extend(this.#h,{resolution:e})}}get canvas(){return this.#t}};var Lt=function(n,e,t,o){var r=arguments.length,i=r<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,o);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(r<3?s(i):r>3?s(e,t,i):s(e,t))||i);return r>3&&i&&Object.defineProperty(e,t,i),i},Pn="WebGPURaycastCallback",Li="WebGPURaycastPixel",Ln=Mo.getAttachedPropertyValue,On=Mo.setAttachedPropertyValue,Ta=Mo.deleteAttachedPropertyValue,sr=class extends Na.PacemItemElement{findContainer(){return Mo.findAncestor(this,e=>e instanceof Pt)}#e="";get version(){return this.#e}#t=new MutationObserver(()=>{this.wgsl=this.textContent});viewActivatedCallback(){super.viewActivatedCallback(),this.wgsl=this.textContent,this.#t.observe(this,{characterData:!0})}propertyChangedCallback(e,t,o,r){super.propertyChangedCallback(e,t,o,r),e==="wgsl"&&this._computeVersion(o)}_computeVersion(e=this.wgsl){Ra.hash(e).then(t=>{if(t!==this.#e){let o=this.#e,r=t;this.#e=r;let i=new Oi({propertyName:"version",oldValue:o,currentValue:r,firstChange:pt.isNullOrEmpty(o)});this.dispatchEvent(i)}})}disconnectedCallback(){this.#t.disconnect(),super.disconnectedCallback()}};Lt([Io({emit:!1,converter:Di.String})],sr.prototype,"type",void 0);Lt([Io({emit:!1,converter:Di.String})],sr.prototype,"wgsl",void 0);sr=Lt([Dn({tagName:Gn+"-3d-wgsl-script"})],sr);var Pt=class extends Je{constructor(){super(...arguments),this.#e=[],this._scriptVersionChangeHandler=e=>{let{propertyName:t}=e.detail;t==="version"&&this._parseWgslModifiers(e.detail.currentValue)},this.#t=new Set,this.#r=new Map,this.#o=!0,this.#i=!0,this.#s=new WeakMap}invalidateSize(e,t=e.size){this._ensureRenderer(e)?.resize(t)}#e;get items(){return this.#e}register(e){let t=this.#e;return e instanceof sr&&!t.includes(e)?(e.addEventListener(An,this._scriptVersionChangeHandler,!1),t.push(e),this._parseWgslModifiers(this.modifiers?.version),!0):!1}unregister(e){let t=this.#e,o=t.indexOf(e);return o>=0?(e.removeEventListener(An,this._scriptVersionChangeHandler,!1),t.splice(o,1),this._parseWgslModifiers(this.modifiers?.version),!0):!1}#t;#r;#o;#i;get supported(){return this.#o}get active(){return this.#i}_webGPUNotSupported(e){this.#o&&e.cause===nr.NotSupported&&(this.#o=!1,this.dispatchEvent(new Oi({propertyName:"supported",oldValue:null,currentValue:!1}))),this.#i&&(this.#i=!1,this.dispatchEvent(new Oi({propertyName:"active",oldValue:null,currentValue:!1})))}initialize(e){let t=this.#r,o=this.#t;return o.has(e)||o.add(e),To.create(e,{enableValidation:this.enableValidation??!1,modifiers:this.modifiers}).then(r=>(t.get(e)?.update(),t.set(e,r),this._updatePipeline(e),r.canvas),r=>(this.log(Ca.LogLevel.Error,r.message),this._webGPUNotSupported(r),null))}_parseWgslModifiers(e){let t=this.#e,o=t.find(l=>l.type=="vertex-input"),r=t.find(l=>l.type=="vertex-output"),i=t.find(l=>l.type=="fragment"),s=o?.wgsl,a=r?.wgsl,c=i?.wgsl;this.modifiers={vertexInput:s,vertexOutput:a,fragment:c,version:e}}propertyChangedCallback(e,t,o,r){if(super.propertyChangedCallback(e,t,o,r),!r)switch(e){case"modifiers":case"enableValidation":this._reinitialize();break}}disconnectedCallback(){let e=this.#r;for(let[t,o]of e)o?.dispose();e.clear(),this.#t.clear(),super.disconnectedCallback()}dispose(e){let t=this.#r,o=this.#t;t.has(e)&&(t.get(e)?.dispose(),t.delete(e)),o.has(e)&&o.delete(e)}_reinitialize(){for(let e of this.#t.values())this.initialize(e)}_ensureRenderer(e){return this.#r.get(e)}_updatePipeline(e){this._ensureRenderer(e)?.update(...e.datasource)}#s;render(e){let t=e.size?.width,o=e.size?.height;if(!(t>0)||!(o>0))return;let r=this._ensureRenderer(e);if(pt.isNull(r))return;this.#s.has(e)&&(this.#s.delete(e),this._itemsChangedExec(e));let i=Ln(e,Li);if(r.render({cursor:i,time:performance.now(),resolution:{width:t,height:o}}),!e.interactive)return;let s=Ln(e,Pn);if(!pt.isNullOrEmpty(s)){if(pt.isNullOrEmpty(i)){s(null);return}r.raycast(i).then(a=>{if(pt.isNullOrEmpty(a))s(null);else{let c={object:a[0],point:null};s(c)}})}}snapshot(e,t,o,r){let i=this.#r;if(!i.has(e))return Promise.resolve(null);let{canvas:s}=i.get(e),a=!pt.isNullOrEmpty(t),c=o??(a?"image/jpeg":null),l=r??(a?.9:null);return new Promise((u,p)=>{this.render(e),pt.snapshotElement(s,t,c,l).then(u)})}raycast(e,t,o,r){On(e,Pn,r),t.x<0||t.y<0||t.x>=o.width||t.y>=o.height?Ta(e,Li):On(e,Li,t)}_itemsChangedExec(e){this._updatePipeline(e)}_itemsChanged(e,t){this.#s.set(e,!0)}addItem(e,t){this._itemsChanged(e,t)}removeItem(e,t){this._itemsChanged(e,t)}updateItem(e,t){(pt.isNull(t)||t.flags.indexOf(I.Visibility)>=0||t.flags.indexOf(I.Children)>=0)&&this._itemsChanged(e,t)}zoomFit(e,...t){return Promise.resolve()}project(e,t){return{x:0,y:0}}getScene(e){return e}};Lt([wa(100)],Pt.prototype,"_parseWgslModifiers",null);Lt([Io({emit:!1})],Pt.prototype,"modifiers",void 0);Lt([Io({emit:!1,converter:Di.Boolean})],Pt.prototype,"enableValidation",void 0);Pt=Lt([Dn({tagName:Gn+"-3d-webgpu-adapter"})],Pt);import{CustomElement as Ma,P as Ia,Watch as ht,PropertyConverters as Dt,Utils as Ot,CustomEventUtils as Gi,avoidHandler as Dr,Behaviors as Aa,PropertyChangeEventName as Bn}from"@pacem/pacem-core";import{Geometry as Lo}from"@pacem/pacem-numerical";var Ye=function(n,e,t,o){var r=arguments.length,i=r<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,o);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(r<3?s(i):r>3?s(e,t,i):s(e,t))||i);return r>3&&i&&Object.defineProperty(e,t,i),i},le=Lo.LinearAlgebra.Vector3D,ft=Lo.LinearAlgebra.Matrix3D,Ao=Lo.LinearAlgebra.Quaternion,Kp=Lo.LinearAlgebra.Spherical;function Pa(n){return pe(n)?n.stage:null}var La=1,Oa=1,Da=.05,Gr=.001,Br={maxAzimuth:180,minAzimuth:-180,inertia:!1,maxPolar:1/0,minPolar:-1/0,zoom:{enabled:!0},pan:{enabled:!0,button:2},rotation:{enabled:!0,button:0}},Po=class n{constructor(e,t){this._config=t,this._input={rho:0,theta:0,phi:0,x:0,y:0},this._progress={rho:0,theta:0,phi:0,x:0,y:0},this._startHandler=i=>{let{rotation:s,pan:a}=this._config,c=i.pointerType==="mouse",l=s.enabled&&c&&i.button===s.button&&Gi.matchModifiers(i,s.modifiers),u=a.enabled&&c&&i.button===a.button&&Gi.matchModifiers(i,a.modifiers);!l&&!u||(this.#t=l,(this.#e=u)&&(this._currentState=n._buildState(this._camera),Ot.extend(this._input,le.zero()),this._progress.x=this._progress.y=0),Dr(i),window.addEventListener("pointerup",this._endHandler,!1),window.addEventListener("pointermove",this._moveHandler,!1),window.addEventListener("contextmenu",this._avoidHandler,!1))},this._avoidHandler=i=>Dr(i),this._endHandler=i=>{Dr(i),window.setTimeout(()=>{window.removeEventListener("pointerup",this._endHandler),window.removeEventListener("pointermove",this._moveHandler),window.removeEventListener("contextmenu",this._avoidHandler)},20)},this._zoomHandler=i=>{let{zoom:s}=this._config;if(!(s.enabled&&Gi.matchModifiers(i,s.modifiers)))return;Dr(i);let c=this._input;c.rho-=Math.sign(i.deltaY)},this._moveHandler=i=>{Dr(i);let{height:s,width:a}=this._scene.size,c=this._input,l=Math.min(s,a);if(this.#t){let u=-La*360/l,{phi:p,theta:f}=c,{maxPolar:h,minPolar:b,maxAzimuth:C,minAzimuth:x}=this._config;c.phi=(p+i.movementX*u).clamp(b,h),c.theta=(f+i.movementY*u).clamp(x,C)}else if(this.#e){let u=this._currentState.radius/l;c.x+=-i.movementX*u,c.y+=i.movementY*u}},this._renderHandler=i=>{this._update()};let o=this._scene=(this._camera=e).stage;this._initialState=this._currentState=n._buildState(e);let r=this._canvas=o.stage;r.addEventListener("pointerdown",this._startHandler,!1),r.addEventListener("wheel",this._zoomHandler,{passive:!1}),o.addEventListener("render",this._renderHandler,!1)}static _buildState(e){let t=le.subtract(e.position,e.lookAt),o=le.mag(t);return{target:e.lookAt,versor:le.unit(t),up:e.up,radius:o,position:e.position}}static tryAttach(e,t){t??=Br;let o=Pa(e)?.stage;if(Ot.isNull(o))return null;{let{position:r,lookAt:i}=e;return Ot.isNull(r)||Ot.isNull(i)||le.areClose(r,i)?null:new n(e,t)}}get configuration(){return this._config}set configuration(e){this._config=e}#e;#t;_getSafeAzimuth({theta:e}){return n._modAngle(e)}_getSafePolar({phi:e}){return n._modAngle(e)}static _modAngle(e){for(;e<0;)e+=360;return e%360}static _getViewXYZ(e){let{versor:t,up:o}=e,r=le.cross(t,o),i=le.cross(r,t);return le.normalize(r),le.normalize(i),{right:r,up:i,versor:t}}#r;_update(){if(this.#r)return;this.#r=!0;let e=this._camera,{radius:t,versor:o,target:r,up:i}=this._initialState,{target:s}=this._currentState,{theta:a,phi:c,rho:l,x:u,y:p}=this._input,f=this._progress,{theta:h,phi:b,rho:C,x,y:d}=f,_=Math.abs(b-c)>Gr||Math.abs(h-a)>Gr,T=Math.abs(C-l)>Gr,N=Math.abs(u-x)>Gr||Math.abs(p-d)>Gr;if(T||_||N){let E=typeof this._config.inertia=="boolean"?this._config.inertia?Da:0:this._config.inertia,v=E>0&&E<1,{right:A,up:L}=n._getViewXYZ(this._initialState),P=r,G=i,R=s,m=C;v?m+=(l-C)*E:m=l,f.rho=m;let g=Math.pow(.95,m*Oa),y=le.scale(o,-g*t);P=le.add(P,y);let w=b,M=h;v?(w+=(c-b)*E,M+=(a-h)*E):(w=c,M=a);let O=this._getSafePolar({phi:f.phi=w}),D=this._getSafeAzimuth({theta:f.theta=M}),X=le.negate(r),H=ft.translate(ft.identity(),X),K=Ao.fromAxisAngle(L,O),ie=Ao.fromAxisAngle(A,D),he=ft.multiply(Ao.toRotationMatrix(ie),Ao.toRotationMatrix(K));H=ft.multiply(H,he),H=ft.translate(H,le.negate(X)),P=ft.transform(P,H),G=ft.transform(G,ft.clone(H,dt=>{dt.offsetX=dt.offsetY=dt.offsetZ=0}));let se=x,ue=d,re=se,Y=ue;v?(re+=(u-se)*E,Y+=(p-ue)*E):(re=u,Y=p),f.x=re,f.y=Y;let{right:de,up:me}=n._getViewXYZ(this._currentState),Le=le.scale(de,re),Oe=le.scale(me,Y),Gt=le.add(Le,Oe);R=le.add(s,Gt),e.lookAt=R,e.position=P,e.up=G,e.flags.push(I.Camera)}this.#r=!1}dispose(){let e=this._canvas,t=this._scene;Ot.isNull(e)||(e.removeEventListener("pointerdown",this._startHandler),e.removeEventListener("wheel",this._zoomHandler)),t.removeEventListener("render",this._renderHandler,!1)}},Pe=class extends Aa.PacemBehavior{constructor(){super(...arguments),this.#e=new Map,this._readyHandler=e=>{if(e.detail.propertyName==="isReady"&&e.detail.currentValue===!0){let t=e.currentTarget;t.removeEventListener(Bn,this._readyHandler),this._decorateCore(t)}}}#e;propertyChangedCallback(e,t,o,r){switch(super.propertyChangedCallback(e,t,o,r),e){case"maxAzimuth":case"minAzimuth":case"inertia":case"zoomControl":case"panControl":case"rotationControl":let i=this._buildConfig(),s=this.#e;for(let a of s.values())a.configuration=i;break}}disconnectedCallback(){let e=this.#e;for(let t of e.values())t.dispose();e.clear(),super.disconnectedCallback()}_buildConfig(){return Ot.extend({},Br,{maxAzimuth:this.maxAzimuth??1/0,minAzimuth:this.minAzimuth??-1/0,minPolar:this.minPolar??-1/0,maxPolar:this.maxPolar??1/0,inertia:this.inertia??!1,zoom:this.zoomControl??Br.zoom,pan:this.panControl??Br.pan,rotation:this.rotationControl??Br.rotation})}_decorateCore(e){let t=Po.tryAttach(e,this._buildConfig());Ot.isNull(t)||this.#e.set(e,t)}decorate(e){e.isConnected?this._decorateCore(e):e.addEventListener(Bn,this._readyHandler,!1)}undecorate(e){let t=this.#e;t.has(e)&&(t.get(e).dispose(),t.delete(e))}};Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"maxAzimuth",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"maxPolar",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"minAzimuth",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"minPolar",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"zoomControl",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"rotationControl",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"panControl",void 0);Ye([ht({emit:!1,converter:Go})],Pe.prototype,"inertia",void 0);Pe=Ye([Ma({tagName:Ia+"-"+"3d"+"-orbit-camera"})],Pe);var Vn={};Oo(Vn,{BooleanOrNumberConverter:()=>Go,DragEvent:()=>mt,KnownShader:()=>U,LineGeometry:()=>et,MaterialElement:()=>Q,MeshGeometry:()=>W,NodeGeometry:()=>Et,NotifyChange:()=>bt,Pacem3DAdapterElement:()=>Je,Pacem3DCameraElement:()=>Ce,Pacem3DGroupElement:()=>Ze,Pacem3DLightElement:()=>Ie,Pacem3DMeshElement:()=>ke,Pacem3DObjectElement:()=>Fe,Pacem3DOrthographicCameraElement:()=>Be,Pacem3DPerspectiveCameraElement:()=>qe,Point3DConverter:()=>$e,Point3DOrNumberConverter:()=>Vr,QuaternionConverter:()=>Do,RenderableElement:()=>be,RenderableEvent:()=>gt,StalePropertyFlag:()=>I,UI3DEvent:()=>$t,Ui3DElement:()=>ae,computePlaneNormal:()=>So,computeSharpVertexNormals:()=>ce,isBasicMaterial:()=>Fr,isCamera:()=>pe,isGeometry:()=>cr,isGroup:()=>vt,isInteraction:()=>kr,isLambertMaterial:()=>Xr,isLight:()=>Se,isLineMaterial:()=>Ke,isMaterial:()=>Ne,isMesh:()=>Ee,isMeshGeometry:()=>kt,isOrthographicCamera:()=>Ur,isPerspectiveCamera:()=>zr,isPhongMaterial:()=>Hr,isRenderable:()=>ar,isShaderMaterial:()=>Yi,isStage:()=>Bo,isStandardMaterial:()=>jr,isUi3DObject:()=>Ut});import{Transformer as Ba}from"@pacem/pacem-core";import{Point as Sa}from"@pacem/pacem-foundation";var Ga=function(n,e,t,o){var r=arguments.length,i=r<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,o);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(r<3?s(i):r>3?s(e,t,i):s(e,t))||i);return r>3&&i&&Object.defineProperty(e,t,i),i},Si=class{static parse(e){let t=[],o=/^v((\s+-?[\d\.]+){3})/gm,r=o.exec(e);for(;r&&r.length;)t.push($e.convert(r[1])),r=o.exec(e);let i=[],s=/^vt((\s+-?[\d\.]+){2})/gm;for(r=s.exec(e);r&&r.length;)i.push(Sa.parse(r[1])),r=s.exec(e);let a=[],c=/^vn((\s+-?[\d\.]+){3})/gm;for(r=c.exec(e);r&&r.length;)a.push($e.convert(r[1])),r=c.exec(e);let l=[],u=[],p=[],f=/^f((\s+([\d]+\/[\d]+\/[\d]+)){3,})/gm;for(r=f.exec(e);r&&r.length;){let T=/([\d]+)\/([\d]+)\/([\d]+)/g,N=r[1],E=T.exec(N),v=0;for(var h,b,C,x,d,_;E&&E.length;)v>2&&(p.push(h),u.push(i[b]),l.push(a[C]),p.push(x),u.push(i[d]),l.push(a[_])),x=parseInt(E[1])-1,d=parseInt(E[2])-1,_=parseInt(E[3])-1,p.push(x),u.push(i[d]),l.push(a[_]),v===0&&(h=x,b=d,C=_),v++,E=T.exec(N);r=f.exec(e)}return new W(t,p,u,l)}},Vi=class{static parseGeometry(e,t){if(t.toLowerCase()==="obj")return Si.parse(e);throw new Error(`Type '${t}' is not supported.`)}};Ga([Ba("parse3D")],Vi,"parseGeometry",null);export{Sn as Components,Vn as Drawing3D};
350
+ }`],bindings:[`@group(${e}) @binding(${t}) var<uniform> ${r}: AmbientLight;`],modifiers:[`${s} = computeAmbient(${i}, ${r});`]}}import{Utils as $}from"@pacem/pacem-core";import{Colors as xi}from"@pacem/pacem-foundation";import{Geometry as Rn}from"@pacem/pacem-numerical";import{Geometry as En}from"@pacem/pacem-numerical";var Te=En.LinearAlgebra.Vector3D,yi=En.LinearAlgebra.Matrix3D,wn={width:1,height:1},Eo=class{static create(e){if(zr(e))return new vi(e);if(Ur(e))return new _i(e);throw new TypeError(`Camera type '${e.type}' not supported.`)}};function Cn(n,e,t){let o=Te.subtract(e,n),r=Te.cross(t,o),i=Te.cross(o,r);Te.normalize(r),Te.normalize(o),Te.normalize(i);let s=-Te.dot(r,n),a=-Te.dot(i,n),c=-Te.dot(o,n);return yi.from(r.x,i.x,o.x,0,r.y,i.y,o.y,0,r.z,i.z,o.z,0,s,a,c,1)}function Nn(n,e){if(n<=0)throw new RangeError("Near plane distance must be positive.");if(e<=n)throw new RangeError("Far plane distance must be greater than near plane distance.")}function fa(n=120,e=1,t=.1,o=1e3){Nn(t,o);let r=Math.tan(.5*Math.PI*(1-n/180)),i=r/e,s=Number.isFinite(o),a=s?o/(t-o):-1,c=s?o*t/(t-o):-t;return yi.from(i,0,0,0,0,r,0,0,0,0,a,-1,0,0,c,0)}function ha(n,e,t,o,r=.1,i=1e3){return Nn(r,i),yi.from(2/(e-n),0,0,0,0,2/(t-o),0,0,0,0,1/(r-i),0,(n+e)/(n-e),(t+o)/(o-t),r/(r-i),1)}var _i=class n{constructor(e){this._camera=e}static view(e){return Cn(e.position,e.lookAt,e.up)}static projection(e,t=wn){let o=e.position,r=e.lookAt,i=Te.subtract(r,o);Te.normalize(i);let s=Te.dot(i,o),{height:a,width:c}=t,l=c/a,u=.5*s,p=u*l,f=u,h=e.top*f,b=e.bottom*f,C=e.right*p,x=e.left*p;return ha(x,C,h,b,e.near,e.far)}view(){return n.view(this._camera)}projection(e){return n.projection(this._camera,e)}},vi=class n{constructor(e){this._camera=e}static view(e){return Cn(e.position,e.lookAt,e.up)}static projection(e,t=wn){let o=t.width/t.height/e.aspectRatio;return fa(e.fov,o,e.near,e.far)}view(){return n.view(this._camera)}projection(e){return n.projection(this._camera,e)}};var bi=Rn.LinearAlgebra.Vector3D,we=Rn.LinearAlgebra.Matrix3D;function ir(n,e){throw typeof e=="function"&&(e=e.name),new RangeError(`Buffer '${n}' not available for ${e}.`)}function Tn(n,e,...t){if(n.stage??=e?.item.stage,vt(n))return n.key??="group_"+$.uniqueCode(),new Ei(n,e,...t);if(Ee(n))return n.key??="mesh_"+$.uniqueCode(),new Ni(n,e,...t);if(pe(n))return n.key??="camera_"+$.uniqueCode(),new wi(n);if(Se(n))return n.key??="light_"+n.type+"_"+$.uniqueCode(),new Ri(n);throw new Error("Renderable is not supported.")}var wo=class{constructor(e){this._set=e}get items(){return this._set}loop(e){let{meshes:t,cameras:o,groups:r,lights:i}=this._set,s=o[0],a=!1,c=!1;for(let l of t)l.disposed||!e(l,s,i)||(q.clearFlags(l),a||(q.clearFlags(s),a=!0),c||(i.forEach(p=>q.clearFlags(p)),c=!0));for(let l of r)q.clearFlags(l)}},tr=class{static create(e){if(cr(e))return e.key??="geometry_"+$.uniqueCode(),new Ar(e);if(Ne(e))return new Pr(e);if(kr(e))return new Ci(e);throw new Error("Object is not supported.")}},q=class n{static create(e,...t){return Tn(e,null,...t)}static clearFlags(e,t=!1){if(e.item.flags.splice(0),t){let o=e;$.isNull(o.parent)||n.clearFlags(o.parent,!0)}}static allFlags(e){let t=e,o=t.parent,r=$.isNull(o)?[]:n.allFlags(o);return t.item.flags.union(r)}},rr=class{#e;constructor(e){this.#e=e}get item(){return this.#e}#t=!1;lock(){this.#t=!0}unlock(){this.#t=!1;let e=this.#r;for(;e.length>0;){let t=e.shift();this._destroyUnsafe(t)}}#r=[];_destroyUnsafe(e){"texture"in e?e.texture.destroy():"buffer"in e&&e.buffer.destroy()}destroySafely(...e){for(let t of Array.from(e).concat(...this.#r.splice(0)))t&&(this.#t?this.#r.push(t):this._destroyUnsafe(t))}#o=!1;destroy(){this.dispose(),this.#o=!0}get disposed(){return this.#o}},or=class extends rr{constructor(e,t){super(e),this.#t=t,this.#e=$.uniqueId()%4294967295}#e;#t;#r=new Map;get parent(){return this.#t}get id(){return this.#e}allFlags(){let e=this.parent;return this.item.flags.union(e?.allFlags()??[])}buildParentWorldTransform(){let e=we.identity(),t=this;for(;!$.isNull(t.parent);){let o=t.parent.item,r=we.translate(o.transformMatrix??we.identity(),o.position??bi.zero());e=we.multiply(e,r),t=t.parent}return e}buildWorldTransform(){let e=we.translate(this.item.transformMatrix??we.identity(),this.item.position??bi.zero()),t=this.buildParentWorldTransform();return we.multiply(e,t)}#o=new Map;version(e){return this.#o.get(e)??0}buffer(e,t){if(t==="u32id"){let r=this.#r,{pipeline:i,device:s}=e;if(r.has(i))return $.extend({fresh:!1},r.get(i));let a=new Uint32Array([this.id]),c=ne.createUniform(s,a,j+"u32id-buffer"),l=$.extend({buffer:c,value:a,version:performance.now()},{fresh:!0});return this.#r.set(i,l),l}let o=this.specificBuffer(e,t);return this.#o.set(t,o.version),o}},ma={shader:U.Basic,color:"#c0c0c0",flags:[]},Ei=class extends or{#e;constructor(e,t,...o){super(e,t),this.#e=e.childRenderables.map(r=>Tn(r,this,...o))}get children(){return this.#e}specificBuffer(e,t){return null}texture(e){throw new Error("Method not implemented.")}dispose(){this.#e.forEach(e=>e.destroy())}},wi=class n extends or{#e=new Map;#t;constructor(e){super(e)}texture(e){throw new Error("Method not implemented.")}specificBuffer(e,t){let o=!1;(this.allFlags().length>0||$.isNull(this.#t))&&(o=!0,this.#e.clear(),this._rebuildMatrices(e));let{pipeline:r}=e;if(this.#e.has(r)||(o=!0,this.#e.set(r,this.#t)),q.clearFlags(this),t==="cameraViewTransform")return $.extend(this.#t,{fresh:o});ir(t,n)}_rebuildMatrices({device:e,canvas:t}){let o=this.item,r=Eo.create(o),{x:i,y:s,z:a}=o.position,c=r.view(),l=r.projection(t),u=we.multiply(c,l),p=new Float32Array(36);if(p.set(we.toArray(c),0),p.set(we.toArray(u),16),p.set([i,s,a],32),$.isNull(this.#t)){let f=ne.createUniform(e,p,j+"view-buffer");this.#t={buffer:f,value:p,version:performance.now().roundoff()}}else this.#t.value=p,this.#t.version=performance.now().roundoff()}_destroyView(){this.#e.clear();let e=this.#t;this.#t=null,this.destroySafely(e)}dispose(){this._destroyView()}},Ar=class n extends rr{#e={};#t={positions:!0,normals:!0,uv:!0,packed:!0};#r;constructor(e){super(e),e.flags??=[]}buffer(e,t){let o=this.item.flags??[];($.isNull(this.#r)||o.includes(I.Geometry))&&(o.splice(0),this.#e={},this._rebuildGeometryBuffers(e));let r=this.#t,i=this.#r,{pipeline:s}=e,a=this.#e[t]??=new Map,c=!a.has(s),l=u=>(c&&a.set(s,u),u);switch(t){case"geometryPositions":let{positions:u}=i,p=r.positions;return r.positions=!1,$.extend(l(u),{fresh:p||c});case"geometryNormals":let{normals:f}=i,h=r.normals;return r.normals=!1,$.extend(l(f),{fresh:h||c});case"geometryTexCoords":let{uv:b}=i,C=r.uv;return r.uv=!1,$.extend({fresh:C||c},l(b));case"geometry":let{packed:x}=i,d=r.packed;return r.packed=!1,$.extend(l(x),{fresh:d||c});default:ir(t,n)}}texture(e){throw new Error("Method not implemented.")}_rebuildGeometryBuffers({device:e}){this._destroyBuffers();let t=performance.now(),o=this.item,r=o.key;if(kt(o)){let i=o,a=!$.isNullOrEmpty(i.triangleIndices)?i.triangleIndices.map(_=>i.positions[_]):i.positions,c=a.length*2,l=c+a.length,u=new Float32Array(l),p=new Float32Array(l),f=new Float32Array(c),h=new Float32Array(2*l+c);for(let _=0;_<a.length;_++){let T=2*_,N=3*_,{x:E,y:v,z:A}=a[_],{x:L,y:P,z:G}=i.normals[_],{x:R,y:m}=i.textureCoordinates[_];u.set([E,v,A],N),p.set([L,P,G],N),f.set([R,m],T),h.set([E,v,A,L,P,G,R,m],N*2+T)}let b=ne.create(e,u,j+"meshgeometry-"+r+"-positions-buffer"),C=ne.create(e,p,j+"meshgeometry-"+r+"-normals-buffer"),x=ne.create(e,f,j+"meshgeometry-"+r+"-uvmap-buffer"),d=ne.create(e,h,j+"meshgeometry-"+r+"-buffer");this.#r={packed:{buffer:d,value:h,version:t},positions:{buffer:b,value:u,version:t},normals:{buffer:C,value:p,version:t},uv:{buffer:x,value:f,version:t}},this.#t={positions:!0,normals:!0,uv:!0,packed:!0}}else{let i=new Float32Array(We.flattenVectorArray(o.positions)),s=ne.createStorage(e,i,j+"nodegeometry-"+r+"-positions-buffer");this.#r={positions:{buffer:s,value:i,version:t},packed:{buffer:s,value:i,version:t}},this.#t={positions:!0,packed:!0}}}_destroyBuffers(){this.#e={};let e=this.#r;$.isNull(e)||this.destroySafely(e.positions,e.normals,e.uv)}dispose(){this._destroyBuffers()}},Pr=class n extends rr{#e={};#t={};#r;#o=new Map;#i=new Map;constructor(e){super(e),e.flags??=[],e.flags.indexOf(I.Material)===-1&&e.flags.push(I.Material)}buffer(e,t){let o=this.item.flags??[],r=$.isNull(this.#r);o.includes(I.Material)&&(this.#e={},o.splice(0),r=!0,this.#i.clear(),this._resetMaterialBuffers());let{pipeline:i}=e,s=this.#e[t]??=new Map;switch(t){case"material":case"line":let a=this._ensureMaterialBuffer(e,t);return a?(s.has(i)||(r=!0,s.set(i,a)),$.extend(a,{fresh:r})):null;default:ir(t,n)}}_ensureMaterialBuffer(e,t="material"){let o=this.#o,r=o.get(t);return r||(o.has(t)?null:(r=this.#r?.buffer(e,t),r&&o.set(t,r),r))}_resetMaterialBuffers(){this.#r=fo.create(this.item),this._destroyBuffers()}texture(e,t="texture"){let o=this.#i,r=o.get(t),i=!1;if(!r){if(r=this.#r?.texture(e,t),!r)return null;o.set(t,r),i=!0,this.#t={}}let{pipeline:s}=e,a=this.#t[t]??=new Map;return a.has(s)||(i=!0,a.set(s,r)),$.extend(r,{fresh:i})}dispose(){this._destroyBuffers()}_destroyBuffers(){this.#e={},this.#t={};let e=this.#o.values();this.#o.clear(),this.destroySafely(...e);let t=this.#i.values();this.#i.clear(),t.forEach(o=>o.texture.destroy())}},Ci=class n extends rr{#e={time:0,cursor:{x:0,y:0},resolution:{width:0,height:0}};#t;#r=new Map;constructor(e){super(e),$.extend(this.#e,e)}buffer(e,t){if(t==="interaction")return this._ensureInteractionBuffer(e);ir(t,n)}texture(e){throw new Error("Method not implemented.")}_ensureInteractionBuffer(e,t="interaction"){let o=this.#e,r=this.item,i=!this.#t||r.time!==o.time||r.resolution?.width!==o.resolution.width||r.resolution?.height!==o.resolution.height;if(!i&&!$.isNull(r.cursor)&&(i=r.cursor.x!==o.cursor.x||r.cursor.y!==o.cursor.y),i){let c=new Float32Array([r.cursor?.x??0,r.cursor?.y??0,r.resolution.width,r.resolution.height,r.time,0]),l=ne.createUniform(e.device,c,j+"interaction-buffer");this.#t={buffer:l,value:c,version:performance.now()},this.#r.clear()}let{pipeline:s}=e,a=this.#r;return a.has(s)||(i=!0,a.set(s,this.#t)),$.extend(this.#t,{fresh:i})}_destroyBuffers(){this.#r.clear();let e=this.#t;$.isNull(e)||this.destroySafely(e)}dispose(){this._destroyBuffers()}},Ni=class n extends or{#e;#t;#r;#o;#i;#s={geometry:!0,material:!0,transform:!0};#n=new Map;constructor(e,t,o,r){super(e,t),e.flags??=[],e.flags.indexOf(I.Geometry)===-1&&e.flags.push(I.Geometry),e.flags.indexOf(I.Material)===-1&&e.flags.push(I.Material),e.flags.indexOf(I.Position)===-1&&e.flags.indexOf(I.Transform)===-1&&e.flags.push(I.Transform),this.#e=o,this.#r=r}texture(e,t){return this.#o?.texture(e,t)}specificBuffer(e,t){let o=this.#s,r=this.allFlags();($.isNull(this.#i)||r.includes(I.Position)||r.includes(I.Transform))&&(this.#n.clear(),o.transform=!0,this._rebuildWorldMatrices(e)),($.isNull(this.#t)||r.includes(I.Geometry))&&(o.geometry=!0,this._ensureGeometryBuffer()),($.isNull(this.#o)||r.includes(I.Material))&&(o.material=!0,this._ensureMaterialBuffer()),q.clearFlags(this);let i=this.#t,s=this.#o;switch(t){case"geometryPositions":case"geometryNormals":case"geometryTexCoords":case"geometry":return i.buffer(e,t);case"material":case"line":return s.buffer(e,t);case"objectWorldTransform":let a=this.#i,c=o.transform;o.transform=!1;let l=this.#n,{pipeline:u}=e,p=!l.has(u);return p&&l.set(u,a),$.extend(a,{fresh:c||p});default:ir(t,n)}}_ensureGeometryBuffer(){let e=this.#t,t=this.#e,r=this.item.geometry;if($.isNull(t))e?.destroy(),this.#t=new Ar(r);else{let i=t?.get(r);i?.disposed!==!1&&(i=new Ar(r),t.set(r,i)),this.#t=i}}_ensureMaterialBuffer(){let e=this.#o,t=this.#r,r=this.item.material??ma;if($.isNull(t))e?.destroy(),this.#o=new Pr(r);else{let i=t?.get(r);i?.disposed!==!1&&(i=new Pr(r),t.set(r,i)),this.#o=i}}_rebuildWorldMatrices({device:e}){let t=this.item,o=this.buildWorldTransform(),r=we.transpose(we.invert(o)),i=new Float32Array(28);if(i.set(we.toArray(o),0),i.set([r.m11,r.m12,r.m13,0,r.m21,r.m22,r.m23,0,r.m31,r.m32,r.m33,0],16),$.isNull(this.#i)){let s=ne.createUniform(e,i,j+"mesh-"+t.key+"-worldmatrix-buffer");this.#i={buffer:s,value:i,version:performance.now().roundoff()}}else this.#i.value=i,this.#i.version=performance.now().roundoff()}dispose(){this.#n.clear();let e=this.#i;this.#i=null,this.destroySafely(e);let t=this.#o;this.#o=null,t?.destroy();let o=this.#t;this.#t=null,o?.destroy()}},Ri=class n extends or{#e;#t=new Map;constructor(e){super(e),e.flags.push(I.Light)}_rebuildAmbientLightBuffer({device:e}){let t=this.item,o=4,r=1,i=0,s=4,a=24,c=new Float32Array(a),{r:l,g:u,b:p,a:f}=xi.parse(t.color??"#fff");c.set([l,u,p,f],i),c.set([t.intensity],s),this.#e={value:c,buffer:ne.createUniform(e,c,j+"ambient-light-buffer"),version:performance.now()}}_rebuildDirectionalLightBuffer({device:e}){let t=this.item,o=1,r=4,i=3,s=0,a=4,c=7,l=c+o,u=new Float32Array(l),{r:p,g:f,b:h,a:b}=xi.parse(t.color??"#fff");u.set([p,f,h,b],s),u.set([t.intensity],c);let C=bi.subtract(t.position,t.target);u.set([C.x,C.y,C.z],a),this.#e={value:u,buffer:ne.createUniform(e,u,j+"directional-light-buffer"),version:performance.now()}}_rebuildOmniLightBuffer({device:e}){let t=this.item,o=1,r=4,i=3,s=0,a=4,c=7,l=c+o,u=new Float32Array(l),{r:p,g:f,b:h,a:b}=xi.parse(t.color??"#fff");u.set([p,f,h,b],s),u.set([t.intensity],c),u.set([t.position.x,t.position.y,t.position.z],a),this.#e={value:u,buffer:ne.createUniform(e,u,j+"omni-light-buffer"),version:performance.now()}}_rebuildLight(e){this.destroySafely(this.#e);let t=this.item;switch(t.type){case"direction":this._rebuildDirectionalLightBuffer(e);break;case"omni":this._rebuildOmniLightBuffer(e);break;case"ambient":this._rebuildAmbientLightBuffer(e);break;default:throw new Error(`Light '${t.type}' is not supported.`)}}texture(e){throw new Error("Method not implemented.")}specificBuffer(e,t){let o=this.#t,r=$.isNull(this.#e)||this.allFlags().length>0;r&&(o.clear(),this._rebuildLight(e)),q.clearFlags(this);let{pipeline:i}=e;if(o.has(i)||(r=!0,o.set(i,this.#e)),t==="light")return $.extend(this.#e,{fresh:r});ir(t,n)}dispose(){this.#t.clear();let e=this.#e;this.#e=null,this.destroySafely(e)}};var F=j,In={multisample:!0,packedVertices:!0,primitive:{topology:"triangle-list",frontFace:"ccw",cullMode:"back"}},fe=n=>{},It=class n{static{this._memoizer=new WeakMap}static dispose(e){let t=this._memoizer,o=t.get(e);z.isNull(o)||(o.clear(),t.delete(e))}static createColorPicking(e,t){let o=n.create(e,t);return o instanceof No||o instanceof Ro?{frame:o.raycast}:null}static create(e,[t,o,...r],i){let s=n._memoizer,a=s.get(e);if(z.isNull(a)&&s.set(e,a=new Map),z.isNull(t))throw new Error("Pipeline not implemented, given the provided arguments.");if(Ee(t.item)){let c=kt(t.item.geometry),l=!c&&Ke(t.item.material);if(!c&&!l)throw new Error("Pipeline not implemented, given the provided mesh argument.");let u=c?new Ti(t,o,...r):new Mi(t,o),p=u.key+(i?.modifiers?.version??""),f=a.get(p);if(f)return f;let h=c?new No(e,u):new Ro(e,u);h.build(i);let b=h;return z.extend(b,{id:p+"-"+e.canvas.width+"x"+e.canvas.height+"-"+z.Dates.now().toISOString()}),a.set(p,b),b}else throw new ReferenceError("Pipeline not implemented, given thst the first argument is not a mesh.")}},Co=class{constructor(){this.#e=new Map}#e;ensureBindGroup({device:e},t,o,r,i,s,a=()=>{}){let c=this.#e,l=typeof t=="string"?t:t.key,u=c.get(l);if(z.isNull(u)&&c.set(l,u=new Map),r||!u.has(s)){let p=o.map((b,C)=>({binding:C,resource:{buffer:b}})),f={label:s,layout:i,entries:p};a(f);let h=e.createBindGroup(f);return u.set(s,h),h}else return u.get(s)}},Ti=class n{#e=[];#t;#r;#o=new Map;#i={shader:"basic",lights:""};constructor(...e){this.add(...e)}reset(){this.#e.splice(0),this.#t=null,this.#o.clear(),this.#i={shader:"basic",lights:""}}add(...e){for(let t of e??[])if(Ee(t.item))if(z.isNull(this.#t)){this.#t=t;let o=t.item.material??{shader:U.Basic};this.#i.shader=o.shader+"-"+(o.map?"map":"nomap")}else throw new Error("Mesh already added.");else if(Se(t.item))this.#e.push(t),this.#i.lights+="-"+t.item.type;else if(pe(t.item))this.#r??=t;else throw new Error("Unknown object type.")}build(e){let t=this._computeBasicData(),o=this.key,r=this.vertex({inputModifier:e?.vertexInput,outputModifier:e?.vertexOutput}),i=this.fragment(t,{modifier:e?.fragment}),s=(...c)=>n.prototype.bindgroup.apply(this,c),a={lightCount:this.#e.length,mapCount:this.#t.item.material?.map?1:0};return{vertex:r,fragment:i,key:o,bindings:s,metadata:a}}get key(){let{shader:e,lights:t}=this.#i;return"mesh-"+e+t}bindgroup(e,t,o){let i=this.#o.get(e);if(z.isNull(i))return null;if(z.isNullOrEmpty(t))return i;let s=i.filter(a=>a.key===t);return isNaN(o)?s:o>=0&&o<i.length?s[o]:s}vertex(e){return fn(e)}_computeBasicData(){let e=this.#t.item,t=this.#e,o=e.material,r=!z.isNull(o?.texture),i=!z.isNullOrEmpty(t),s=z.isNull(e)?U.Basic:e.material?.shader??U.Basic;return{hasTexture:r,hasLighting:i,shader:s,materialBindGroupIndex:2,lightingBindGroupIndex:3}}_computeBindGroupsAndReferences(e=this._computeBasicData()){let{hasTexture:t,materialBindGroupIndex:o,lightingBindGroupIndex:r}=e,i=this.#o,s=this.#e,a={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},c={key:"material",group:o,binding:0,type:"buffer"};t?i.set(ve.Mesh,[a,c,{key:"texture",group:o,type:"texture"}]):i.set(ve.Mesh,[a,c]),i.set(ve.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}]);let l=s.map((u,p)=>({key:"light",group:r,binding:p,type:"buffer"}));l.push(...l),i.set(ve.Interaction,[{key:"interaction",group:0,type:"buffer",binding:1}])}fragment(e=this._computeBasicData(),t){this._computeBindGroupsAndReferences(e);let o={definitions:[],bindings:[],modifiers:[]},r=i=>{for(let s of i.definitions??[])o.definitions.indexOf(s)===-1&&o.definitions.push(s);z.isNullOrEmpty(i.bindings)||o.bindings.push(...i.bindings),z.isNullOrEmpty(i.modifiers)||o.modifiers.push(...i.modifiers)};switch(e.shader){case U.Basic:if(e.hasTexture){let a=e.materialBindGroupIndex,c=vn({inputColor:Tt,outputColors:[Tt],uv:"uv"},a);r(c)}let i=0,s=this.#e;for(let a of s){switch(a.item.type){case"direction":let l=yn({outputColor:Nr,normal:"normal"},e.lightingBindGroupIndex,i);r(l);break;case"omni":let u=xn({outputColor:Nr,normal:"normal",position:"vertex"},e.lightingBindGroupIndex,i);r(u);break;case"ambient":let p=bn({inputColor:Tt,outputColor:po},e.lightingBindGroupIndex,i);r(p);break}i++}return Tr.fragment(o,t)}}},Me={writeBufferConditionally:(n,e)=>{e.fresh&&n.queue.writeBuffer(e.buffer,0,e.value)}},No=class{constructor(e,t,o=new Co){this._context=e,this._builder=t,this._cache=o,this._ensureU32idBindGroup=(r,i,s)=>this._cache.ensureBindGroup(this._context,r,[i],s,this._pickBindGroupLayout,F+"mesh-colorpick-bind-group"),this._ensureMaterialBindGroup=(r,i,s,a,c=2)=>{let l=this._bindGroupLayouts[c],u=F+"material-bind-group";if(l.label!==F+"material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");return this._cache.ensureBindGroup(this._context,r,[i],a,l,u,p=>{let{device:f}=this.context,h=p.entries;s&&h.push({binding:1,resource:f.createSampler({addressModeU:"repeat",addressModeV:"repeat",magFilter:"linear",minFilter:"linear"})},{binding:2,resource:s.createView()})})},this._ensureWorldTransformBindGroup=(r,i,s,a=1,c=!1)=>{let l=this._bindGroupLayouts[a];if(l.label!==F+"mesh-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let u=r.key+"-"+(c?1:0),p=`${F}${c?"colorpick":"mesh"}-transforms-bind-group`;return this._cache.ensureBindGroup(this._context,u,[i],s,l,p)},this._ensureCameraProjectionAndInteractionDataBindGroup=(r,i,s,a,c=0,l=!1)=>{let u=this._bindGroupLayouts[c],p=r.key+"-"+(l?1:0),f=`${F}${l?"colorpick":"mesh"}-view-bind-group`;return this._cache.ensureBindGroup(this._context,p,[i,s],a,u,f)},this._ensureLightingBindGroup=(r,i,s=3)=>{let a=this._bindGroupLayouts[s],c=r.map(u=>u.id).join(":"),l=r.map(u=>u.buffer.buffer);return this._cache.ensureBindGroup(this._context,c,l,i,a,F+"mesh-lighting-bind-group")},this._bindGroupLayouts=[],this._bindVertex=fe,this._bindPicker=fe,this._bindWorldTransform=fe,this._bindRaycastWorldTransform=fe,this._bindCameraProjectionAndInteractionData=fe,this._bindRaycastCameraProjectionAndInteractionData=fe,this._bindLighting=fe,this._bindMaterial=fe,this.set=r=>{throw new Error("Deprecated.")},this.bind=(r,...i)=>{throw new Error("Deprecated.")},this.draw=(r,...i)=>{throw new Error("Deprecated.")},this.frame=(r,i,s,a,...c)=>{r.setPipeline(this._pipeline);try{this._bindVertex(r,s),this._bindWorldTransform(r,s),this._bindMaterial(r,s),this._bindCameraProjectionAndInteractionData(r,a,i),this._bindLighting(r,...c);let l=s.item,u=l.geometry;r.draw(u.triangleIndices?.length||u.positions.length)}catch(l){console.error("Pacem.Drawing3D.FrameException",l)}},this.raycast=(r,i,s,a)=>{r.setPipeline(this._pickPipeline);try{this._bindVertex(r,s),this._bindRaycastWorldTransform(r,s),this._bindRaycastCameraProjectionAndInteractionData(r,a,i),this._bindPicker(r,s);let c=s.item,l=c.geometry;r.draw(l.triangleIndices.length)}catch{}},this._key=t.key}get context(){return this._context}get key(){return this._key}build(e){let t=z.extend({},In,e??{}),o=this._builder,r=o.build(t.modifiers),i=z.extend({pipeline:this},this._context),s=i.device,a={module:s.createShaderModule({code:r.vertex}),buffers:t.packedVertices?[Mt.createVertex(0,3,3,2)]:[Mt.createVertex(0,3),Mt.createVertex(1,3),Mt.createVertex(2,2)]},c=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX|oe.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:oe.VERTEX|oe.FRAGMENT,buffer:{type:"uniform"}}],label:F+"mesh-view-bind-group-layout"}),l=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX,buffer:{type:"uniform"}}],label:F+"mesh-transforms-bind-group-layout"}),u=[c,l],p={module:s.createShaderModule({code:r.fragment}),targets:[{format:i.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},f=u.length,h=[{binding:0,visibility:oe.FRAGMENT,buffer:{type:"read-only-storage"}}],{mapCount:b}=r.metadata,C=b>0;C&&h.push({visibility:oe.FRAGMENT,binding:1,sampler:{}},...Array(b).keys().map(m=>({visibility:oe.FRAGMENT,binding:2+m,texture:{}})));let x={label:F+"material-bind-group-layout",entries:h},d=s.createBindGroupLayout(x);u.push(d);let _=u.length,{lightCount:T}=r.metadata,N=T>0;if(N){let m=s.createBindGroupLayout({entries:[...Array(T).keys()].map((g,y)=>({visibility:oe.FRAGMENT,binding:y,buffer:{type:"uniform"}})),label:F+"lighting-bind-group-layout"});u.push(m)}let E={label:F+"mesh-render-pipeline",vertex:a,fragment:p,layout:s.createPipelineLayout({label:F+"mesh-render-pipeline-layout",bindGroupLayouts:this._bindGroupLayouts=u}),primitive:t.primitive};t.multisample&&(E.multisample={count:4},E.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._pipeline=s.createRenderPipeline(E);let v=this._pickBindGroupLayout=s.createBindGroupLayout({label:F+"mesh-colorpick-bind-group-layout",entries:[{visibility:oe.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),A={label:F+"mesh-colorpick-pipeline",vertex:a,fragment:{module:s.createShaderModule({code:fi(2)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:F+"mesh-colorpick-pipeline-layout",bindGroupLayouts:[c,l,v]}),primitive:t.primitive,depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickPipeline=s.createRenderPipeline(A);let L=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing vertex buffers was provided.`);let{buffer:w}=y.buffer(i,"geometryPositions"),{buffer:M}=y.buffer(i,"geometryNormals"),{buffer:O}=y.buffer(i,"geometryTexCoords");m.setVertexBuffer(0,w),m.setVertexBuffer(1,M),m.setVertexBuffer(2,O)},P=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing vertex buffers was provided.`);let{buffer:w}=y.buffer(i,"geometry");m.setVertexBuffer(0,w)};this._bindVertex=t.packedVertices?P:L;let G=(m,g,y)=>{if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let w=g.buffer(i,"objectWorldTransform"),M=w.buffer;Me.writeBufferConditionally(s,w);let{group:O}=r.bindings(ve.Mesh,"objectWorldTransform",0),D=this._ensureWorldTransformBindGroup(g.item,M,w.fresh,O,y);m.setBindGroup(O,D)};this._bindWorldTransform=(m,...g)=>{let y=g.at(0);G(m,y,!1)},this._bindRaycastWorldTransform=(m,...g)=>{let y=g.at(0);G(m,y,!0)};let R=(m,g,y,w)=>{if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing view projection buffers was provided.`);let M=g.buffer(i,"cameraViewTransform"),O=M.buffer;if(Me.writeBufferConditionally(s,M),z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing interaction buffers was provided.`);let D=y.buffer(i,"interaction"),X=D.buffer;Me.writeBufferConditionally(s,D);let{group:H}=r.bindings(ve.Camera,"cameraViewTransform",0),{group:K}=r.bindings(ve.Interaction,"interaction",0);if(H!==K)throw new ReferenceError(`Layout bind group mismatch: ${H} vs ${K}.`);let ie=this._ensureCameraProjectionAndInteractionDataBindGroup(g.item,O,X,M.fresh||D.fresh,H,w);m.setBindGroup(H,ie)};this._bindCameraProjectionAndInteractionData=(m,...g)=>{let y=g.at(0),w=g.at(1);R(m,y,w,!1)},this._bindRaycastCameraProjectionAndInteractionData=(m,...g)=>{let y=g.at(0),w=g.at(1);R(m,y,w,!0)},this._bindMaterial=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing vertex colors was provided.`);let w=y.buffer(i,"material"),M=w.buffer;Me.writeBufferConditionally(s,w);let O=y.texture(i),D=O?.texture,X=this._ensureMaterialBindGroup(y.item,M,D,w.fresh,f);m.setBindGroup(f,X),C&&s.queue.copyExternalImageToTexture({source:O.source,flipY:!0},{texture:D},{width:D.width,height:D.height})},this._bindLighting=(m,...g)=>{if(N){let w=Array.from(g).map(D=>({buffer:D.buffer(i,"light"),id:D.item.key})),M=w.some(D=>D.buffer.fresh),O=this._ensureLightingBindGroup(w,M,_);for(let D of w)Me.writeBufferConditionally(s,D.buffer);m.setBindGroup(_,O)}},this._bindPicker=(m,...g)=>{let y=g.at(0);if(z.isNull(y))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let w=y.buffer(i,"u32id"),M=w.buffer;Me.writeBufferConditionally(s,w);let O=2,D=w.fresh,X=this._ensureU32idBindGroup(y.item,M,D);m.setBindGroup(O,X)}}},Mi=class n{#e;#t;#r=new Map;constructor(...e){this.add(...e)}reset(){this.#e=null,this.#r.clear()}add(...e){for(let t of e??[])if(Ee(t.item))if(z.isNull(this.#e))this.#e=t;else throw new Error("Line already added.");else if(pe(t.item))this.#t??=t;else if(!Se(t.item))throw new Error("Unknown object type.")}build(){let e=this._computeBasicData(),t=this.key,o=this.vertex(e),r=this.fragment(e);return{vertex:o,fragment:r,key:t,bindings:(...s)=>n.prototype.bindgroup.apply(this,s),metadata:{thickness:e.thickness,dashPattern:e.dashPattern}}}get key(){let e=(this.#e?.item).material?.lineWidth>1;return U.Line+(e?"-fat":"")}bindgroup(e,t,o){let i=this.#r.get(e);if(z.isNull(i))return null;if(z.isNullOrEmpty(t))return i;let s=i.filter(a=>a.key===t);return isNaN(o)?s:o>=0&&o<i.length?s[o]:s}vertex(e=this._computeBasicData()){return e.thickness>1?gn():mn()}_computeBasicData(){let e=this.#e.item,t=z.isNull(e)?U.Line:e.material?.shader??U.Line,o=e.material,r=o?.lineWidth??1,i=o?.dashArray;return{shader:t,thickness:r,dashPattern:i}}_computeBindGroupsAndReferences(e=this._computeBasicData()){let t=this.#r,o={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},r={key:"material",group:3,binding:0,type:"buffer"},i={key:"geometryPositions",group:2,binding:0,type:"buffer"},s={key:"line",group:2,binding:1,type:"buffer"};t.set(ve.Mesh,[o,r,i,s]),t.set(ve.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}])}fragment(e=this._computeBasicData()){this._computeBindGroupsAndReferences(e);let t={definitions:[],bindings:[],modifiers:[]};if(e.shader===U.Line)return Mr.fragment(t)}},Ro=class{#e;constructor(e,t,o=new Co){this._lineBuilder=t,this._cache=o,this._ensureLineU32idBindGroup=(r,i,s)=>{let a=this.context;return this._cache.ensureBindGroup(a,r,[i],s,this._pickLineBindGroupLayout,F+"line-colorpick-bind-group")},this._ensureLineMaterialBindGroup=(r,i,s,a=2)=>{let c=this._bindLineGroupLayouts[a];if(c.label!==F+"line-material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let l=this.context;return this._cache.ensureBindGroup(l,r,[i],s,c,F+"line-material-bind-group")},this._ensureLinePositionsBindGroup=(r,i,s,a)=>{let c=this._bindLineGroupLayouts[a];if(c.label!==F+"line-positions-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let l=this.context;return this._cache.ensureBindGroup(l,r,i,s,c,F+"line-positions-bind-group")},this._ensureLineWorldTransformBindGroup=(r,i,s,a=1,c=!1)=>{let l=this._bindLineGroupLayouts[a];if(l.label!==F+"line-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");let u=r.key+"-line-"+(c?1:0),p=`${F}${c?"colorpick":""}-line-transforms-bind-group`,f=this.context;return this._cache.ensureBindGroup(f,u,[i],s,l,p)},this._ensureLineCameraProjectionBindGroup=(r,i,s,a=0,c=!1)=>{let l=this._bindLineGroupLayouts[a],u=r.key+"-line-"+(c?1:0),p=`${F}${c?"colorpick":""}-line-view-bind-group`,f=this.context;return this._cache.ensureBindGroup(f,u,[i],s,l,p)},this._bindLineGroupLayouts=[],this._bindLinePositions=fe,this._bindLinePicker=fe,this._bindLineWorldTransform=fe,this._bindLineRaycastWorldTransform=fe,this._bindLineCameraProjection=fe,this._bindLineRaycastCameraProjection=fe,this._bindLineMaterial=fe,this._drawLine=fe,this.set=r=>{throw new Error("Deprecated.")},this.bind=(r,...i)=>{throw new Error("Deprecated.")},this.draw=(r,...i)=>{throw new Error("Deprecated.")},this.frame=(r,i,s,a)=>{r.setPipeline(this._linePipeline);try{this._bindLineWorldTransform(r,s),this._bindLineCameraProjection(r,a),this._bindLinePositions(r,s),this._bindLineMaterial(r,s),this._drawLine(r,s)}catch(c){console.error("Pacem.Drawing3D.FrameException",c)}},this.raycast=(r,i,s,a)=>{r.setPipeline(this._pickLinePipeline);try{this._bindLineRaycastWorldTransform(r,s),this._bindLineRaycastCameraProjection(r,a),this._bindLinePositions(r,s),this._bindLinePicker(r,s),this._drawLine(r,s)}catch{}},this.#e=e,this._lineKey=t.key}get context(){return this.#e}get key(){return this._lineKey}build(e){let t=z.extend({},In,e??{}),o=this._lineBuilder,r=o.build(),i=z.extend({pipeline:this},this.#e),s=i.device,a=r.metadata.thickness>1,c={module:s.createShaderModule({code:r.vertex}),buffers:[]},l=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX,buffer:{type:"uniform"}}],label:F+"line-transforms-bind-group-layout"}),u=s.createBindGroupLayout({entries:[{binding:0,visibility:oe.VERTEX,buffer:{type:"uniform"}}],label:F+"line-view-bind-group-layout"}),p=[{binding:0,visibility:oe.VERTEX,buffer:{type:"read-only-storage"}}];a&&p.push({binding:1,visibility:oe.VERTEX,buffer:{type:"uniform"}});let f=s.createBindGroupLayout({entries:p,label:F+"line-positions-bind-group-layout"}),h=[u,l,f],b=h.length,C=h.slice(),x={module:s.createShaderModule({code:r.fragment}),targets:[{format:i.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},d=C.length,_=[{binding:0,visibility:oe.FRAGMENT,buffer:{type:"read-only-storage"}}],T={label:F+"line-material-bind-group-layout",entries:_},N=s.createBindGroupLayout(T);C.push(N);let E=a?t.primitive.topology:"line-list",v={label:F+"line-render-pipeline",vertex:c,fragment:x,layout:s.createPipelineLayout({label:F+"line-render-pipeline-layout",bindGroupLayouts:this._bindLineGroupLayouts=C}),primitive:z.extend({},t.primitive,{topology:E})};t.multisample&&(v.multisample={count:4},v.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._linePipeline=s.createRenderPipeline(v);let A=this._pickLineBindGroupLayout=s.createBindGroupLayout({label:F+"line-colorpick-bind-group-layout",entries:[{visibility:oe.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),L={label:F+"line-colorpick-pipeline",vertex:c,fragment:{module:s.createShaderModule({code:fi(b)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:F+"line-colorpick-pipeline-layout",bindGroupLayouts:h.concat(A)}),primitive:z.extend({},t.primitive,{topology:E}),depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickLinePipeline=s.createRenderPipeline(L);let P=(R,m,g)=>{if(z.isNull(m))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let y=m.buffer(i,"objectWorldTransform"),w=y.buffer;Me.writeBufferConditionally(s,y);let{group:M}=r.bindings(ve.Mesh,"objectWorldTransform",0),O=this._ensureLineWorldTransformBindGroup(m.item,w,!1,M,g);R.setBindGroup(M,O)};this._bindLineWorldTransform=(R,...m)=>{let g=m.at(0);P(R,g,!1)},this._bindLineRaycastWorldTransform=(R,...m)=>{let g=m.at(0);P(R,g,!0)};let G=(R,m,g)=>{if(z.isNull(m))throw new ReferenceError(`Null ${q.name} bringing view projection buffers was provided.`);let y=m.buffer(i,"cameraViewTransform"),w=y.buffer;Me.writeBufferConditionally(s,y);let{group:M}=r.bindings(ve.Camera,"cameraViewTransform",0),O=this._ensureLineCameraProjectionBindGroup(m.item,w,!1,M,g);R.setBindGroup(M,O)};this._bindLineCameraProjection=(R,...m)=>{let g=m.at(0);G(R,g,!1)},this._bindLineRaycastCameraProjection=(R,...m)=>{let g=m.at(0);G(R,g,!0)},this._bindLinePositions=(R,...m)=>{let g=m.at(0);if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing vertex buffers was provided as index 0.`);let y=g.buffer(i,"geometryPositions"),w=y.buffer,M=y.fresh,O=[w];if(Me.writeBufferConditionally(s,y),a){let H=g.buffer(i,"line"),K=H.buffer;M||=H.fresh,O.push(K),Me.writeBufferConditionally(s,H)}let{group:D}=r.bindings(ve.Mesh,"line",0),X=this._ensureLinePositionsBindGroup(g.item,O,M,D);R.setBindGroup(D,X)},this._bindLineMaterial=(R,...m)=>{let g=m.at(0);if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing vertex colors was provided.`);let y=g.buffer(i,"material"),w=y.buffer;Me.writeBufferConditionally(s,y);let M=this._ensureLineMaterialBindGroup(g.item,w,y.fresh,d);R.setBindGroup(d,M)},this._bindLinePicker=(R,...m)=>{let g=m.at(0);if(z.isNull(g))throw new ReferenceError(`Null ${q.name} bringing world transform buffer was provided.`);let y=g.buffer(i,"u32id"),w=y.buffer,M=y.value;Me.writeBufferConditionally(s,y);let O=this._ensureLineU32idBindGroup(g.item,w,!1);R.setBindGroup(b,O)},this._drawLine=(R,...m)=>{let y=m.at(0).item,w=y.geometry;a?R.draw(6,w.positions.length-1,0,0):R.draw(w.positions.length)}}};import{Utils as At}from"@pacem/pacem-core";var Or=class{static{this._memoizer=new WeakMap}static dispose(e){let t=this._memoizer;if(t.has(e)){let o=t.get(e);for(let r of o.values())r.destroy();o.clear(),t.delete(e)}}static createColorPicking(e){let t=this._memoizer;t.has(e)||t.set(e,new Map);let o=t.get(e),r="colorpick";if(o.has(r))return o.get(r);let i=new Ii(e);return o.set(r,i),i}},Lr=1,Ii=class{constructor(e){this._context=e,this._objects=new Map,this.frame=(t,...o)=>{if(At.isNull(this._encoder))throw new Error("Null encoder. Maybe you missed to call the 'begin' method first.");let r=Array.from(o);It.createColorPicking(this._context,r)?.frame(this._pass,t,...o);for(let s of r)s.item.inert||this._objects.set(s.id,s)},this.end=t=>{if(!At.isNull(this._handle))return this._handle;let o=this._pass,r=this._encoder,{device:i}=this._context,{render:s}=this._textures,a=s.texture,c=this._ensureBuffer();o.end(),r.copyTextureToBuffer({texture:a,origin:{x:t.x,y:t.y}},{buffer:c,bytesPerRow:(Lr*4+255|0)*256,rowsPerImage:1},{width:Lr}),i.queue.submit([r.finish()]),this._encoder=null;let l=this,u=l._objects,p=()=>{l._handle=null};return this._handle=new Promise((f,h)=>{c.mapAsync(uo.READ,0,4*Lr).then(b=>{let x=new Uint32Array(c.getMappedRange(0,4*Lr))[0];c.unmap(),p();let d=u.get(x);f(d?[d.item]:[])})})}}_createTexture(e){let{device:t,canvas:o}=this._context,r=Math.min(t.limits.maxTextureDimension2D,o.clientWidth),i=Math.min(t.limits.maxTextureDimension2D,o.clientHeight);return t.createTexture({size:[r,i,1],format:e,usage:Re.COPY_SRC|Re.RENDER_ATTACHMENT})}_ensureBuffer(){let e=this._buffer;if(!At.isNull(e))return e;let{device:t}=this._context;return this._buffer=t.createBuffer({label:j+"colorpick-output-buffer",size:Lr*4,usage:ye.MAP_READ|ye.COPY_DST})}_ensureTextures(){let e=this._textures;if(!At.isNull(e))return e;let t=this._createTexture("r32uint"),o=this._createTexture("depth24plus"),r={texture:t,view:t.createView()},i={texture:o,view:o.createView()};return this._textures={render:r,depth:i}}_destroyTexture(e){At.isNull(e)||e.texture?.destroy()}destroy(){let e=this._textures,t=this._buffer;if(!At.isNullOrEmpty(e)){let{render:o,depth:r}=e;this._destroyTexture(o),this._destroyTexture(r),this._textures=null}At.isNull(t)||(t.destroy(),this._buffer=null)}begin(){let{device:e}=this._context;this._encoder=e.createCommandEncoder({label:j+"colorpick-raycaster"});let{render:t,depth:o}=this._ensureTextures(),r={label:j+"colorpick-raycaster-pass",colorAttachments:[{view:t.view,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:o.view,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}};this._pass=this._encoder.beginRenderPass(r),this._objects.clear()}};var Ai=xa.LinearAlgebra.Vector3D,nr;(function(n){n[n.NotSupported=0]="NotSupported",n[n.Disabled=1]="Disabled"})(nr||(nr={}));var To=class{static create(e,t){return new Promise((o,r)=>{if(navigator.gpu){let i=new Pi(e);i.init(t).then(s=>o(i),s=>{let c={message:typeof s=="string"?s:s.message,cause:nr.Disabled};r(c)})}else{let s={message:"WebGPU not supported.",cause:nr.NotSupported};r(s)}})}};function ba(n){return{bottom:-1,top:1,left:-1,right:1,near:.1,far:200,lookAt:Ai.from(0,0,0),up:Ai.j(),position:Ai.from(0,0,1),type:"orthographic",flags:[],stage:n}}function Ea(...n){for(let e of n||[])e?.destroy()}var Pi=class{#e;#t;#r;#o;#i;#s;#n;#l;#a;#p;#f;#h;constructor(e){this.#o=new WeakMap,this.#i=new WeakMap,this.#s=new WeakMap,this.#a={enableValidation:!1},this.#p=!1,this._logError=r=>{let i=this.#e,s=i.logger;if(!te.isNull(s)){let a="error"in r?r.error:r;s.log(va.LogLevel.Error,a.message,"WebGPU")}},this.#c=!0,this.#u=!1;let t=(this.#e=e).stage,o=document.createElement("canvas");o.id=_a+"_3d_stage_"+te.uniqueCode(),t.innerHTML="",t.appendChild(this.#t=o),this.#f=tr.create(this.#h={time:performance.now(),cursor:{x:0,y:0},resolution:{width:0,height:0}})}_buildPassDescriptor({multisample:e,format:t}){let{context:o,device:r}=this.#r,i=o.getCurrentTexture(),s=this.#l;if(te.isNull(s)){if(s={},e){let b=r.createTexture({label:j+"render-texture",format:t??i.format,usage:Re.RENDER_ATTACHMENT,size:[i.width,i.height],sampleCount:4});s.render={texture:b,view:b.createView({label:j+"render-texture-view"})};let C=r.createTexture({label:j+"depth-texture",format:"depth24plus",usage:Re.RENDER_ATTACHMENT,size:[i.width,i.height],sampleCount:4});s.depth={texture:C,view:C.createView({label:j+"depth-texture-view"})}}this.#l=s}let{transparent:a,background:c}=this.#e,l=a?{r:0,g:0,b:0,a:0}:c?typeof c=="string"?ya.parse(c):c:{r:0,g:0,b:0,a:1},u=We.flattenVectorArray([l]),p=i.createView({label:j+"canvas-texture-view"}),f={view:p,clearValue:u,loadOp:"clear",storeOp:"store"},h={colorAttachments:[f]};if(e){let b=s.render.view,C=s.depth.view;h.depthStencilAttachment={view:C,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store",stencilClearValue:0,stencilReadOnly:!0},f.view=b,f.resolveTarget=p}return h}_buildContext(e=this.#t,t=this.#e.size){t??=e;let o=t.width,r=t.height,i=1;e.width=o*i,e.height=r*i;let s=e.getContext("webgpu"),a=navigator.gpu.getPreferredCanvasFormat();return{context:s,textureFormat:a}}_buildUpContext(e,t,o,r){let{transparent:i}=this.#e;o.configure({alphaMode:i?"premultiplied":"opaque",device:e,format:r}),this.#r={device:e,adapter:t,canvas:this.#t,context:o,format:r},this.#c=!1}async init(e){this.#a=e;let t=await navigator.gpu.requestAdapter();if(te.isNull(t))throw new Error("WebGPU adapter unavalable or disabled.");let o=await t.requestDevice();if(te.isNull(t))throw new Error("WebGPU device unavalable or disabled.");o.addEventListener("uncapturederror",this._logError),this.#u=!te.isNull(e.modifiers?.version)&&!te.isNull(e.modifiers)&&(!te.isNull(e.modifiers.vertexInput)||!te.isNull(e.modifiers.vertexOutput)||!te.isNull(e.modifiers.fragment));let{context:r,textureFormat:i}=this._buildContext();this._buildUpContext(o,t,r,i)}#c;#u;render(e){if(this.#c||te.isNull(this.#n)||!(this.#t.width>0)||!(this.#t.height>0))return;let t=this.#r,o=t.device,r=this.#n,i=this.#a?.enableValidation??!1;this.#u&&te.extend(this.#h,e);let a=this._buildPassDescriptor({multisample:!0}),c=o.createCommandEncoder({label:j+"renderer"}),l=c.beginRenderPass(a);r.loop((u,p,f)=>{if(u.item.hide)return!1;i&&o.pushErrorScope("validation");let h=[u,p,...f];return It.create(t,h,{multisample:!0,modifiers:this.#a.modifiers}).frame(l,this.#f,...h),i&&o.popErrorScope().then(C=>{C&&this._logError(C)}),!0}),l.end(),o.queue.submit([c.finish()])}set disabled(e){this.#p=e}get disabled(){return this.#p}raycast(e){if(this.#c||te.isNull(this.#n))return Promise.resolve([]);let t=this.#r,o=t.device,r=this.#n,i=this.#a?.enableValidation??!1,s=Or.createColorPicking(t);return s.begin(),r.loop((a,c)=>a.item.hide?!1:(i&&o.pushErrorScope("validation"),s.frame(this.#f,a,c),i&&o.popErrorScope().then(l=>{l&&this._logError(l)}),!0)),s.end(e)}_disposeRenderableJustInCase(e){let t=this.#o;t.has(e)&&(t.get(e)?.destroy(),t.delete(e))}_createOrYieldRenderable(e,t=this.#i,o=this.#s){e.stage??=this.#e;let r=this.#o,i=r.get(e);return te.isNull(i)&&r.set(e,i=q.create(e,t)),i}_createOrYieldGeometry(e){let t=this.#i,o=t.get(e);return te.isNull(o)&&t.set(e,o=tr.create(e)),o}_createOrYieldMaterial(e){let t=this.#s,o=t.get(e);return te.isNull(o)&&t.set(e,o=tr.create(e)),o}_unwrapBuffers(e,t){t??={meshes:[],lights:[],cameras:[],groups:[]};for(let o of e.children)o.item.stage??=this.#e,Ee(o.item)&&t.meshes.push(o),pe(o.item)&&t.cameras.push(o),Se(o.item)&&t.lights.push(o),vt(o.item)&&(t.groups.push(o),this._unwrapBuffers(o,t));return t}_update(e){let t=[],o=[],r=[],i=l=>this._createOrYieldRenderable(l),s;for(let l of e){if(l.hide){this._disposeRenderableJustInCase(l);continue}if(l.stage??=this.#e,vt(l)){let u=l;u.flags.includes(I.Children)&&this.#o.delete(u),t.push(i(u))}Ee(l)&&l.geometry&&(this._createOrYieldGeometry(l.geometry),te.isNull(l.material)||this._createOrYieldMaterial(l.material),o.push(i(l))),Se(l)&&r.push(i(l)),pe(l)&&(s??=l)}s??=ba(this.#e);let a=i(s),c={meshes:o,lights:r,cameras:[a],groups:t};for(let l of t)c=this._unwrapBuffers(l,c);this.#n?.items.meshes.forEach(l=>{o.includes(l)||l.destroy()}),this.#n=new wo(c)}update(...e){this._update(Array.from(e))}dispose(){if(this.#n=null,this._disposeContext()){let{device:e}=this.#r;e.removeEventListener("uncapturederror",this._logError),e.destroy}}_disposeContext(){let e=this.#r;if(te.isNull(e))return!1;Or.dispose(e),It.dispose(e);let t=this.#l;if(this.#l=null,!te.isNull(t)){let{render:o,depth:r}=t;Ea(o?.texture,r?.texture)}return e.context.unconfigure(),!0}resize(e){if(this.#c=!0,this._disposeContext()){let{device:t,adapter:o}=this.#r,{context:r,textureFormat:i}=this._buildContext(this.canvas,e);this._buildUpContext(t,o,r,i),this.#u&&te.extend(this.#h,{resolution:e})}}get canvas(){return this.#t}};var Lt=function(n,e,t,o){var r=arguments.length,i=r<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,o);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(r<3?s(i):r>3?s(e,t,i):s(e,t))||i);return r>3&&i&&Object.defineProperty(e,t,i),i},Pn="WebGPURaycastCallback",Li="WebGPURaycastPixel",Ln=Mo.getAttachedPropertyValue,On=Mo.setAttachedPropertyValue,Ta=Mo.deleteAttachedPropertyValue,sr=class extends Na.PacemItemElement{findContainer(){return Mo.findAncestor(this,e=>e instanceof Pt)}#e="";get version(){return this.#e}#t=new MutationObserver(()=>{this.wgsl=this.textContent});viewActivatedCallback(){super.viewActivatedCallback(),this.wgsl=this.textContent,this.#t.observe(this,{characterData:!0})}propertyChangedCallback(e,t,o,r){super.propertyChangedCallback(e,t,o,r),e==="wgsl"&&this._computeVersion(o)}_computeVersion(e=this.wgsl){Ra.hash(e).then(t=>{if(t!==this.#e){let o=this.#e,r=t;this.#e=r;let i=new Oi({propertyName:"version",oldValue:o,currentValue:r,firstChange:pt.isNullOrEmpty(o)});this.dispatchEvent(i)}})}disconnectedCallback(){this.#t.disconnect(),super.disconnectedCallback()}};Lt([Io({emit:!1,converter:Di.String})],sr.prototype,"type",void 0);Lt([Io({emit:!1,converter:Di.String})],sr.prototype,"wgsl",void 0);sr=Lt([Dn({tagName:Gn+"-3d-wgsl-script"})],sr);var Pt=class extends Je{constructor(){super(...arguments),this.#e=[],this._scriptVersionChangeHandler=e=>{let{propertyName:t}=e.detail;t==="version"&&this._parseWgslModifiers(e.detail.currentValue)},this.#t=new Set,this.#r=new Map,this.#o=!0,this.#i=!0,this.#s=new WeakMap}invalidateSize(e,t=e.size){this._ensureRenderer(e)?.resize(t)}#e;get items(){return this.#e}register(e){let t=this.#e;return e instanceof sr&&!t.includes(e)?(e.addEventListener(An,this._scriptVersionChangeHandler,!1),t.push(e),this._parseWgslModifiers(this.modifiers?.version),!0):!1}unregister(e){let t=this.#e,o=t.indexOf(e);return o>=0?(e.removeEventListener(An,this._scriptVersionChangeHandler,!1),t.splice(o,1),this._parseWgslModifiers(this.modifiers?.version),!0):!1}#t;#r;#o;#i;get supported(){return this.#o}get active(){return this.#i}_webGPUNotSupported(e){this.#o&&e.cause===nr.NotSupported&&(this.#o=!1,this.dispatchEvent(new Oi({propertyName:"supported",oldValue:null,currentValue:!1}))),this.#i&&(this.#i=!1,this.dispatchEvent(new Oi({propertyName:"active",oldValue:null,currentValue:!1})))}initialize(e){let t=this.#r,o=this.#t;return o.has(e)||o.add(e),To.create(e,{enableValidation:this.enableValidation??!1,modifiers:this.modifiers}).then(r=>(t.get(e)?.update(),t.set(e,r),this._updatePipeline(e),r.canvas),r=>(this.log(Ca.LogLevel.Error,r.message),this._webGPUNotSupported(r),null))}_parseWgslModifiers(e){let t=this.#e,o=t.find(l=>l.type=="vertex-input"),r=t.find(l=>l.type=="vertex-output"),i=t.find(l=>l.type=="fragment"),s=o?.wgsl,a=r?.wgsl,c=i?.wgsl;this.modifiers={vertexInput:s,vertexOutput:a,fragment:c,version:e}}propertyChangedCallback(e,t,o,r){if(super.propertyChangedCallback(e,t,o,r),!r)switch(e){case"modifiers":case"enableValidation":this._reinitialize();break}}disconnectedCallback(){let e=this.#r;for(let[t,o]of e)o?.dispose();e.clear(),this.#t.clear(),super.disconnectedCallback()}dispose(e){let t=this.#r,o=this.#t;t.has(e)&&(t.get(e)?.dispose(),t.delete(e)),o.has(e)&&o.delete(e)}_reinitialize(){for(let e of this.#t.values())this.initialize(e)}_ensureRenderer(e){return this.#r.get(e)}_updatePipeline(e){this._ensureRenderer(e)?.update(...e.datasource)}#s;render(e){let t=e.size?.width,o=e.size?.height;if(!(t>0)||!(o>0))return;let r=this._ensureRenderer(e);if(pt.isNull(r))return;this.#s.has(e)&&(this.#s.delete(e),this._itemsChangedExec(e));let i=Ln(e,Li);if(r.render({cursor:i,time:performance.now(),resolution:{width:t,height:o}}),!e.interactive)return;let s=Ln(e,Pn);if(!pt.isNullOrEmpty(s)){if(pt.isNullOrEmpty(i)){s(null);return}r.raycast(i).then(a=>{if(pt.isNullOrEmpty(a))s(null);else{let c={object:a[0],point:null};s(c)}})}}snapshot(e,t,o,r){let i=this.#r;if(!i.has(e))return Promise.resolve(null);let{canvas:s}=i.get(e),a=!pt.isNullOrEmpty(t),c=o??(a?"image/jpeg":null),l=r??(a?.9:null);return new Promise((u,p)=>{this.render(e),pt.snapshotElement(s,t,c,l).then(u)})}raycast(e,t,o,r){On(e,Pn,r),t.x<0||t.y<0||t.x>=o.width||t.y>=o.height?Ta(e,Li):On(e,Li,t)}_itemsChangedExec(e){this._updatePipeline(e)}_itemsChanged(e,t){this.#s.set(e,!0)}addItem(e,t){this._itemsChanged(e,t)}removeItem(e,t){this._itemsChanged(e,t)}updateItem(e,t){(pt.isNull(t)||t.flags.indexOf(I.Visibility)>=0||t.flags.indexOf(I.Children)>=0)&&this._itemsChanged(e,t)}zoomFit(e,...t){return Promise.resolve()}project(e,t){return{x:0,y:0}}getScene(e){return e}};Lt([wa(100)],Pt.prototype,"_parseWgslModifiers",null);Lt([Io({emit:!1})],Pt.prototype,"modifiers",void 0);Lt([Io({emit:!1,converter:Di.Boolean})],Pt.prototype,"enableValidation",void 0);Pt=Lt([Dn({tagName:Gn+"-3d-webgpu-adapter"})],Pt);import{CustomElement as Ma,P as Ia,Watch as ht,PropertyConverters as Dt,Utils as Ot,CustomEventUtils as Gi,avoidHandler as Dr,Behaviors as Aa,PropertyChangeEventName as Bn}from"@pacem/pacem-core";import{Geometry as Lo}from"@pacem/pacem-numerical";var Ye=function(n,e,t,o){var r=arguments.length,i=r<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,o);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(r<3?s(i):r>3?s(e,t,i):s(e,t))||i);return r>3&&i&&Object.defineProperty(e,t,i),i},le=Lo.LinearAlgebra.Vector3D,ft=Lo.LinearAlgebra.Matrix3D,Ao=Lo.LinearAlgebra.Quaternion,Kp=Lo.LinearAlgebra.Spherical;function Pa(n){return pe(n)?n.stage:null}var La=1,Oa=1,Da=.05,Gr=.001,Br={maxAzimuth:180,minAzimuth:-180,inertia:!1,maxPolar:1/0,minPolar:-1/0,zoom:{enabled:!0},pan:{enabled:!0,button:2},rotation:{enabled:!0,button:0}},Po=class n{constructor(e,t){this._config=t,this._input={rho:0,theta:0,phi:0,x:0,y:0},this._progress={rho:0,theta:0,phi:0,x:0,y:0},this._startHandler=i=>{let{rotation:s,pan:a}=this._config,c=i.pointerType==="mouse",l=s.enabled&&c&&i.button===s.button&&Gi.matchModifiers(i,s.modifiers),u=a.enabled&&c&&i.button===a.button&&Gi.matchModifiers(i,a.modifiers);!l&&!u||(this.#t=l,(this.#e=u)&&(this._currentState=n._buildState(this._camera),Ot.extend(this._input,le.zero()),this._progress.x=this._progress.y=0),Dr(i),window.clearTimeout(this.#r),window.addEventListener("pointerup",this._endHandler,!1),window.addEventListener("pointermove",this._moveHandler,!1),window.addEventListener("contextmenu",this._avoidHandler,!1))},this._avoidHandler=i=>Dr(i),this._endHandler=i=>{Dr(i),this.#r=window.setTimeout(()=>{window.removeEventListener("pointerup",this._endHandler),window.removeEventListener("pointermove",this._moveHandler),window.removeEventListener("contextmenu",this._avoidHandler)},20)},this._zoomHandler=i=>{let{zoom:s}=this._config;if(!(s.enabled&&Gi.matchModifiers(i,s.modifiers)))return;Dr(i);let c=this._input;c.rho-=Math.sign(i.deltaY)},this._moveHandler=i=>{Dr(i);let{height:s,width:a}=this._scene.size,c=this._input,l=Math.min(s,a);if(this.#t){let u=-La*360/l,{phi:p,theta:f}=c,{maxPolar:h,minPolar:b,maxAzimuth:C,minAzimuth:x}=this._config;c.phi=(p+i.movementX*u).clamp(b,h),c.theta=(f+i.movementY*u).clamp(x,C)}else if(this.#e){let u=this._currentState.radius/l;c.x+=-i.movementX*u,c.y+=i.movementY*u}},this._renderHandler=i=>{this._update()};let o=this._scene=(this._camera=e).stage;this._initialState=this._currentState=n._buildState(e);let r=this._canvas=o.stage;r.addEventListener("pointerdown",this._startHandler,!1),r.addEventListener("wheel",this._zoomHandler,{passive:!1}),o.addEventListener("render",this._renderHandler,!1)}static _buildState(e){let t=le.subtract(e.position,e.lookAt),o=le.mag(t);return{target:e.lookAt,versor:le.unit(t),up:e.up,radius:o,position:e.position}}static tryAttach(e,t){t??=Br;let o=Pa(e)?.stage;if(Ot.isNull(o))return null;{let{position:r,lookAt:i}=e;return Ot.isNull(r)||Ot.isNull(i)||le.areClose(r,i)?null:new n(e,t)}}get configuration(){return this._config}set configuration(e){this._config=e}#e;#t;#r;_getSafeAzimuth({theta:e}){return n._modAngle(e)}_getSafePolar({phi:e}){return n._modAngle(e)}static _modAngle(e){for(;e<0;)e+=360;return e%360}static _getViewXYZ(e){let{versor:t,up:o}=e,r=le.cross(t,o),i=le.cross(r,t);return le.normalize(r),le.normalize(i),{right:r,up:i,versor:t}}#o;_update(){if(this.#o)return;this.#o=!0;let e=this._camera,{radius:t,versor:o,target:r,up:i}=this._initialState,{target:s}=this._currentState,{theta:a,phi:c,rho:l,x:u,y:p}=this._input,f=this._progress,{theta:h,phi:b,rho:C,x,y:d}=f,_=Math.abs(b-c)>Gr||Math.abs(h-a)>Gr,T=Math.abs(C-l)>Gr,N=Math.abs(u-x)>Gr||Math.abs(p-d)>Gr;if(T||_||N){let E=typeof this._config.inertia=="boolean"?this._config.inertia?Da:0:this._config.inertia,v=E>0&&E<1,{right:A,up:L}=n._getViewXYZ(this._initialState),P=r,G=i,R=s,m=C;v?m+=(l-C)*E:m=l,f.rho=m;let g=Math.pow(.95,m*Oa),y=le.scale(o,-g*t);P=le.add(P,y);let w=b,M=h;v?(w+=(c-b)*E,M+=(a-h)*E):(w=c,M=a);let O=this._getSafePolar({phi:f.phi=w}),D=this._getSafeAzimuth({theta:f.theta=M}),X=le.negate(r),H=ft.translate(ft.identity(),X),K=Ao.fromAxisAngle(L,O),ie=Ao.fromAxisAngle(A,D),he=ft.multiply(Ao.toRotationMatrix(ie),Ao.toRotationMatrix(K));H=ft.multiply(H,he),H=ft.translate(H,le.negate(X)),P=ft.transform(P,H),G=ft.transform(G,ft.clone(H,dt=>{dt.offsetX=dt.offsetY=dt.offsetZ=0}));let se=x,ue=d,re=se,Y=ue;v?(re+=(u-se)*E,Y+=(p-ue)*E):(re=u,Y=p),f.x=re,f.y=Y;let{right:de,up:me}=n._getViewXYZ(this._currentState),Le=le.scale(de,re),Oe=le.scale(me,Y),Gt=le.add(Le,Oe);R=le.add(s,Gt),e.lookAt=R,e.position=P,e.up=G,e.flags.push(I.Camera)}this.#o=!1}dispose(){let e=this._canvas,t=this._scene;Ot.isNull(e)||(e.removeEventListener("pointerdown",this._startHandler),e.removeEventListener("wheel",this._zoomHandler)),t.removeEventListener("render",this._renderHandler,!1)}},Pe=class extends Aa.PacemBehavior{constructor(){super(...arguments),this.#e=new Map,this._readyHandler=e=>{if(e.detail.propertyName==="isReady"&&e.detail.currentValue===!0){let t=e.currentTarget;t.removeEventListener(Bn,this._readyHandler),this._decorateCore(t)}}}#e;propertyChangedCallback(e,t,o,r){switch(super.propertyChangedCallback(e,t,o,r),e){case"maxAzimuth":case"minAzimuth":case"inertia":case"zoomControl":case"panControl":case"rotationControl":let i=this._buildConfig(),s=this.#e;for(let a of s.values())a.configuration=i;break}}disconnectedCallback(){let e=this.#e;for(let t of e.values())t.dispose();e.clear(),super.disconnectedCallback()}_buildConfig(){return Ot.extend({},Br,{maxAzimuth:this.maxAzimuth??1/0,minAzimuth:this.minAzimuth??-1/0,minPolar:this.minPolar??-1/0,maxPolar:this.maxPolar??1/0,inertia:this.inertia??!1,zoom:this.zoomControl??Br.zoom,pan:this.panControl??Br.pan,rotation:this.rotationControl??Br.rotation})}_decorateCore(e){let t=Po.tryAttach(e,this._buildConfig());Ot.isNull(t)||this.#e.set(e,t)}decorate(e){e.isConnected?this._decorateCore(e):e.addEventListener(Bn,this._readyHandler,!1)}undecorate(e){let t=this.#e;t.has(e)&&(t.get(e).dispose(),t.delete(e))}};Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"maxAzimuth",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"maxPolar",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"minAzimuth",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"minPolar",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"zoomControl",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"rotationControl",void 0);Ye([ht({emit:!1,converter:Dt.Number})],Pe.prototype,"panControl",void 0);Ye([ht({emit:!1,converter:Go})],Pe.prototype,"inertia",void 0);Pe=Ye([Ma({tagName:Ia+"-"+"3d"+"-orbit-camera"})],Pe);var Vn={};Oo(Vn,{BooleanOrNumberConverter:()=>Go,DragEvent:()=>mt,KnownShader:()=>U,LineGeometry:()=>et,MaterialElement:()=>Q,MeshGeometry:()=>W,NodeGeometry:()=>Et,NotifyChange:()=>bt,Pacem3DAdapterElement:()=>Je,Pacem3DCameraElement:()=>Ce,Pacem3DGroupElement:()=>Ze,Pacem3DLightElement:()=>Ie,Pacem3DMeshElement:()=>ke,Pacem3DObjectElement:()=>Fe,Pacem3DOrthographicCameraElement:()=>Be,Pacem3DPerspectiveCameraElement:()=>qe,Point3DConverter:()=>$e,Point3DOrNumberConverter:()=>Vr,QuaternionConverter:()=>Do,RenderableElement:()=>be,RenderableEvent:()=>gt,StalePropertyFlag:()=>I,UI3DEvent:()=>$t,Ui3DElement:()=>ae,computePlaneNormal:()=>So,computeSharpVertexNormals:()=>ce,isBasicMaterial:()=>Fr,isCamera:()=>pe,isGeometry:()=>cr,isGroup:()=>vt,isInteraction:()=>kr,isLambertMaterial:()=>Xr,isLight:()=>Se,isLineMaterial:()=>Ke,isMaterial:()=>Ne,isMesh:()=>Ee,isMeshGeometry:()=>kt,isOrthographicCamera:()=>Ur,isPerspectiveCamera:()=>zr,isPhongMaterial:()=>Hr,isRenderable:()=>ar,isShaderMaterial:()=>Yi,isStage:()=>Bo,isStandardMaterial:()=>jr,isUi3DObject:()=>Ut});import{Transformer as Ba}from"@pacem/pacem-core";import{Point as Sa}from"@pacem/pacem-foundation";var Ga=function(n,e,t,o){var r=arguments.length,i=r<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,o);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(r<3?s(i):r>3?s(e,t,i):s(e,t))||i);return r>3&&i&&Object.defineProperty(e,t,i),i},Si=class{static parse(e){let t=[],o=/^v((\s+-?[\d\.]+){3})/gm,r=o.exec(e);for(;r&&r.length;)t.push($e.convert(r[1])),r=o.exec(e);let i=[],s=/^vt((\s+-?[\d\.]+){2})/gm;for(r=s.exec(e);r&&r.length;)i.push(Sa.parse(r[1])),r=s.exec(e);let a=[],c=/^vn((\s+-?[\d\.]+){3})/gm;for(r=c.exec(e);r&&r.length;)a.push($e.convert(r[1])),r=c.exec(e);let l=[],u=[],p=[],f=/^f((\s+([\d]+\/[\d]+\/[\d]+)){3,})/gm;for(r=f.exec(e);r&&r.length;){let T=/([\d]+)\/([\d]+)\/([\d]+)/g,N=r[1],E=T.exec(N),v=0;for(var h,b,C,x,d,_;E&&E.length;)v>2&&(p.push(h),u.push(i[b]),l.push(a[C]),p.push(x),u.push(i[d]),l.push(a[_])),x=parseInt(E[1])-1,d=parseInt(E[2])-1,_=parseInt(E[3])-1,p.push(x),u.push(i[d]),l.push(a[_]),v===0&&(h=x,b=d,C=_),v++,E=T.exec(N);r=f.exec(e)}return new W(t,p,u,l)}},Vi=class{static parseGeometry(e,t){if(t.toLowerCase()==="obj")return Si.parse(e);throw new Error(`Type '${t}' is not supported.`)}};Ga([Ba("parse3D")],Vi,"parseGeometry",null);export{Sn as Components,Vn as Drawing3D};
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-3d v1.0.0-dirac (https://js.pacem.it)
2
+ * @pacem/pacem-3d v1.0.0-fermat (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -6229,7 +6229,7 @@ var LineRenderPipelineClass = class {
6229
6229
  this.draw = (pass, ...buffers) => {
6230
6230
  throw new Error("Deprecated.");
6231
6231
  };
6232
- this.frame = (pass, meshBuffer, cameraBuffer) => {
6232
+ this.frame = (pass, interactionBuffer, meshBuffer, cameraBuffer) => {
6233
6233
  pass.setPipeline(this._linePipeline);
6234
6234
  try {
6235
6235
  this._bindLineWorldTransform(pass, meshBuffer);
@@ -6241,7 +6241,7 @@ var LineRenderPipelineClass = class {
6241
6241
  console.error("Pacem.Drawing3D.FrameException", e);
6242
6242
  }
6243
6243
  };
6244
- this.raycast = (pass, meshBuffer, cameraBuffer) => {
6244
+ this.raycast = (pass, interactionBuffer, meshBuffer, cameraBuffer) => {
6245
6245
  pass.setPipeline(this._pickLinePipeline);
6246
6246
  try {
6247
6247
  this._bindLineRaycastWorldTransform(pass, meshBuffer);
@@ -6294,6 +6294,14 @@ var LineRenderPipelineClass = class {
6294
6294
  type: "uniform"
6295
6295
  }
6296
6296
  }
6297
+ // interaction
6298
+ /*{
6299
+ binding: UNIFORM_BINDING_INDEX_INTERACTION,
6300
+ visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
6301
+ buffer: {
6302
+ type: 'uniform'
6303
+ }
6304
+ }*/
6297
6305
  ],
6298
6306
  label: labelPrefix + "line-view-bind-group-layout"
6299
6307
  });
@@ -6323,7 +6331,7 @@ var LineRenderPipelineClass = class {
6323
6331
  entries: lineEntries,
6324
6332
  label: labelPrefix + "line-positions-bind-group-layout"
6325
6333
  });
6326
- const vertexBindGroupLayouts = [worldBindGroupLayout, viewBindGroupLayout, lineBindGroupLayout];
6334
+ const vertexBindGroupLayouts = [viewBindGroupLayout, worldBindGroupLayout, lineBindGroupLayout];
6327
6335
  const raycastLayoutIndex = vertexBindGroupLayouts.length;
6328
6336
  const bindGroupLayouts = vertexBindGroupLayouts.slice();
6329
6337
  const fragment = {
@@ -7487,6 +7495,7 @@ var OrbitCameraBehavior = class _OrbitCameraBehavior {
7487
7495
  this._progress.x = this._progress.y = 0;
7488
7496
  }
7489
7497
  avoidHandler(evt);
7498
+ window.clearTimeout(this.#handle);
7490
7499
  window.addEventListener("pointerup", this._endHandler, false);
7491
7500
  window.addEventListener("pointermove", this._moveHandler, false);
7492
7501
  window.addEventListener("contextmenu", this._avoidHandler, false);
@@ -7494,7 +7503,7 @@ var OrbitCameraBehavior = class _OrbitCameraBehavior {
7494
7503
  this._avoidHandler = (evt) => avoidHandler(evt);
7495
7504
  this._endHandler = (evt) => {
7496
7505
  avoidHandler(evt);
7497
- window.setTimeout(() => {
7506
+ this.#handle = window.setTimeout(() => {
7498
7507
  window.removeEventListener("pointerup", this._endHandler);
7499
7508
  window.removeEventListener("pointermove", this._moveHandler);
7500
7509
  window.removeEventListener("contextmenu", this._avoidHandler);
@@ -7568,6 +7577,7 @@ var OrbitCameraBehavior = class _OrbitCameraBehavior {
7568
7577
  }
7569
7578
  #panning;
7570
7579
  #rotating;
7580
+ #handle;
7571
7581
  _getSafeAzimuth({ theta }) {
7572
7582
  return _OrbitCameraBehavior._modAngle(theta);
7573
7583
  }