@pacem/pacem-3d 1.0.0-babbage → 1.0.0-bernoulli

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,7 +1,7 @@
1
1
  /*!
2
- * @pacem/pacem-3d v1.0.0-babbage (https://js.pacem.it)
2
+ * @pacem/pacem-3d v1.0.0-bernoulli (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
6
- !function(e,t,r){"use strict";const i={convert:e=>r.Geometry.LinearAlgebra.Vector3D.parse(e),convertBack:e=>`${e.x||0} ${e.y||0} ${e.z||0}`},n={convert:i=>{const n=e.parseAsNumericalArray(i),s=()=>{throw new Error(`Cannot parse "${i}" as a valid Vector3D.`)};if(t.Utils.isNullOrEmpty(n)&&s(),3===n.length)return r.Geometry.LinearAlgebra.Vector3D.from(...n);if(1===n.length){const e=n[0];return r.Geometry.LinearAlgebra.Vector3D.from(e,e,e)}s()},convertBack:e=>`${e.x||0} ${e.y||0} ${e.z||0}`},s={convert:e=>r.Geometry.LinearAlgebra.Quaternion.parse(e),convertBack:e=>`${e.x||0} ${e.y||0} ${e.z||0} ${e.w||0}`},o={convert:t=>"true"===t||"false"!==t&&e.parseAsNumericalArray(t)[0],convertBack:e=>e.toString()},a="3d",l=Math.PI/180;var c=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let u=class extends t.Components.PacemItemsContainerElement{constructor(){super(...arguments),this._itemPropertyChangeHandler=e=>{const t=e.target;this.adapter&&this.adapter.updateItem(this,t),t.flags.splice(0)},this._clickHandler=e=>{let r=this;if(!r.interactive||t.Utils.isNull(r._lastHitResult))return;const i=e.type.replace(/^mouse/,""),n=r._lastHitResult,s=n.object,o=n.point;this._itemDispatch(s,o,i,e)},this._hitTestCallback=(e,r)=>{const i=this;if(e!=i._lastHitResult){if(e?.object!=i._lastHitResult?.object){const n=e?.object,s=i._lastHitResult?.object,o=e?.point;t.Utils.isNull(s)||this._itemDispatch(s,o,"out",r),t.Utils.isNull(n)||this._itemDispatch(n,o,"over",r)}i._lastHitResult=e}},this._moveHandler=e=>{let t=this;if(!t.adapter||!t.interactive)return;const r=t._resizer.currentSize,i="mousemove"===e.type?{x:e.pageX-r.left,y:e.pageY-r.top}:{x:-1,y:-1};t.adapter.raycast(this,i,r,r=>t._hitTestCallback(r,e))},this._resizeHandler=e=>{const r=this.#e,i=e.detail;if(!t.Utils.isNull(r)&&r.height===i.height&&r.width===i.width)return;this.#e=i;const n=this.adapter;t.Utils.isNull(n)||(this.adapter.invalidateSize(this,i),this.dispatchEvent(new t.Components.ResizeEvent(i)))}}validate(e){return e instanceof L}get stage(){return this._container}get scene(){return this.adapter&&this.adapter.getScene(this)}register(e){const r=super.register(e);return r&&(this._add(e),e.addEventListener(t.PropertyChangeEventName,this._itemPropertyChangeHandler,!1)),r}unregister(e){const r=super.unregister(e);return r&&(e.removeEventListener(t.PropertyChangeEventName,this._itemPropertyChangeHandler,!1),this._erase(e)),r}_refreshDatasource(e=this.datasource){this.adapter?.updateItem(this,void 0)}_buildUpDatasourceFromDOM(e=this.items){t.Utils.isNullOrEmpty(e)||(this.datasource=e.slice())}_add(e){this.adapter&&this.adapter.addItem(this,e)}_erase(e){this.adapter&&this.adapter.removeItem(this,e)}_initializeAdapter(e,r){return new Promise((i,n)=>{const s=this.datasource||[];t.Utils.isNull(e)||s.forEach(t=>e.removeItem(this,t)),t.Utils.isNull(this._container)||t.Utils.isNull(r)?i():r.initialize(this).then(e=>{(s||[]).forEach(e=>this._add(e)),i()},e=>{this.log(t.Logging.LogLevel.Error,e?.toString()),n(e)})})}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"adapter":this._initializeAdapter(t,r);break;case"items":this._buildUpDatasourceFromDOM(r);break;case"transparent":this.adapter?.invalidateSize(this,this.size);break;case"datasource":this._refreshDatasource(r);case"disabled":case"background":this.render()}}viewActivatedCallback(){super.viewActivatedCallback();const e=this._container,t=this._resizer;t.addEventListener("resize",this._resizeHandler,!1),t.target=e,this._initializeAdapter(null,this.adapter).then(t=>{e.addEventListener("mousemove",this._moveHandler,!1),e.addEventListener("click",this._clickHandler,!1),e.addEventListener("mouseup",this._clickHandler,!1),e.addEventListener("mousedown",this._clickHandler,!1),e.addEventListener("mouseout",this._moveHandler,!1),this._buildUpDatasourceFromDOM(),this.render()})}_itemDispatch(e,r,i,n){if(!t.Utils.isNull(e)){var s,o,a;n instanceof Event?o=n:s={item:e,offset:n},"string"==typeof i?a=i:(a=i.type,o=i.originalEvent);const c=r,u=()=>n instanceof Event?new N(a,e,o,c):new R(a,{detail:s,cancelable:a===t.UI.DragDropEventType.Init||a===t.UI.DragDropEventType.Drag},o,c),h=n instanceof Event?new N("item"+a,e,o,c):new R("item"+a,{detail:s,cancelable:a===t.UI.DragDropEventType.Init||a===t.UI.DragDropEventType.Drag},o,c);var l=!1;if(e instanceof EventTarget){const t=u();e.dispatchEvent(t),l=t.defaultPrevented}return e.stage.dispatchEvent(h),l||h.defaultPrevented}return!1}disconnectedCallback(){this.#t?.stop();const e=this._resizer,r=this._container;t.Utils.isNull(r)||(r.removeEventListener("click",this._clickHandler,!1),r.removeEventListener("mouseup",this._clickHandler,!1),r.removeEventListener("mousedown",this._clickHandler,!1),r.removeEventListener("mousemove",this._moveHandler,!1),r.removeEventListener("mouseout",this._moveHandler,!1)),t.Utils.isNull(e)||e.removeEventListener("resize",this._resizeHandler,!1),super.disconnectedCallback()}#e;get size(){return this.#e}render(e,r,i=performance.now()){if(t.Utils.isNull(e))this.#t?.stop(),this.#t=t.Animations.Timer.run(e=>this._doRender());else{const r=this.adapter;t.Utils.isNull(r)||r.updateItem(this,e)}}#t;_doRender(){if(!this.disabled&&!t.Utils.isNull(this.adapter)){const e=this.adapter.getScene(this);let t=new CustomEvent("prerender",{detail:{scene:e},cancelable:!0});this.dispatchEvent(t),t.defaultPrevented||(this.adapter.render(this),this.dispatchEvent(new CustomEvent("render",{detail:{scene:e}})))}}};c([t.ViewChild(`.${t.PCSS}-3d`)],u.prototype,"_container",void 0),c([t.ViewChild(t.P+"-resize")],u.prototype,"_resizer",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],u.prototype,"interactive",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],u.prototype,"transparent",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.String})],u.prototype,"background",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Element})],u.prototype,"adapter",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],u.prototype,"datasource",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],u.prototype,"orbit",void 0),u=c([t.CustomElement({tagName:t.P+"-"+a,shadow:t.Defaults.USE_SHADOW_ROOT,template:`<${t.P}-resize watch-position="true"></${t.P}-resize><div class="${t.PCSS}-3d"></div><${t.P}-content></${t.P}-content>`})],u);var h,p=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};function d(e){return!t.Utils.isNull(e)&&"render"in e&&"function"==typeof e.render}function m(e){return d(e?.stage)}function f(e){return"transformMatrix"in e&&m(e)}function g(e){return"type"in e&&"up"in e&&"lookAt"in e&&m(e)}function y(e){return g(e)&&"type"in e&&"perspective"===e.type}function v(e){return g(e)&&"type"in e&&"orthographic"===e.type}function b(e){return"type"in e&&("ambient"===e.type||"omni"===e.type||"direction"===e.type||"spot"==e.type)&&m(e)}function x(e){return"geometry"in e&&f(e)}function _(e){return"positions"in e&&t.Utils.isArray(e.positions)}function w(e){return("triangleIndices"in e&&t.Utils.isArray(e.triangleIndices)||"normals"in e&&t.Utils.isArray(e.normals)||"textureCoordinates"in e&&t.Utils.isArray(e.textureCoordinates))&&_(e)}function C(e){return"childRenderables"in e&&t.Utils.isArray(e.childRenderables)&&f(e)}function E(e){const r=[];if(!t.Utils.isNullOrEmpty(e)){const t=e.triangleIndices;if(t.length%3!=0)throw new RangeError(`Invalid mesh geometry: ${t.length} is not multiple of 3.`);for(let i=2;i<t.length;i+=3){const n=t[i-2],s=t[i-1],o=t[i],a=P(e.positions[n],e.positions[s],e.positions[o]);r.push(a,a,a)}}e.normals=r}function P(e,t,i){const n=r.Geometry.LinearAlgebra.Vector3D.subtract(e,t),s=r.Geometry.LinearAlgebra.Vector3D.subtract(e,i),o=r.Geometry.LinearAlgebra.Vector3D.cross(n,s);return r.Geometry.LinearAlgebra.Vector3D.unit(o)}class M extends t.CustomUIEvent{constructor(e,t,r,i){super(e,t,r),this.#r=i}#r;get point(){return this.#r}}class R extends M{}class N extends M{constructor(e,t,r,i){super(e,{detail:t,bubbles:!0,cancelable:!0},r,i)}}function U(e){return"object"==typeof e&&"time"in e&&"number"==typeof e.time}!function(e){e.Position="position",e.Transform="transform",e.Geometry="geometry",e.Children="children",e.Material="material",e.Light="light",e.Camera="camera",e.Visibility="visibility"}(h||(h={}));const T={OBJECT_SELECTOR:t.P+"-"+"3d-object",LIGHT_SELECTOR:t.P+"-"+"3d-light",PERSPECTIVE_CAMERA_SELECTOR:t.P+"-"+"3d-perspective-camera",ORTHO_CAMERA_SELECTOR:t.P+"-"+"3d-orthographic-camera",MESH_SELECTOR:t.P+"-"+"3d-mesh",GROUP_SELECTOR:t.P+"-"+"3d-group",DEFAULT_COORDS:{x:0,y:0,z:0}};class L extends t.Components.PacemCrossItemsContainerElement{constructor(){super(...arguments),this.position=T.DEFAULT_COORDS,this.#i=[]}validate(e){return!1}findContainer(){return this.parent||this.stage}get stage(){return this._scene=this._scene||t.CustomElementUtils.findAncestorOfType(this,u)}get parent(){return this._drawableParent=this._drawableParent||t.CustomElementUtils.findAncestor(this,e=>e instanceof L)}disconnectedCallback(){delete this._scene,delete this._drawableParent,super.disconnectedCallback()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"hide":this.setAsDirty(h.Visibility);break;case"items":this.setAsDirty(h.Children);break;case"position":this.setAsDirty(h.Position)}}#i;get flags(){return this.#i}setAsDirty(...e){for(let t of e)this.flags.includes(t)||this.flags.push(t);this.stage?.render(this)}}p([t.Watch({emit:!1,converter:i})],L.prototype,"position",void 0),p([t.Watch({emit:!1,reflectBack:!0,converter:t.PropertyConverters.String})],L.prototype,"tag",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],L.prototype,"inert",void 0);class B extends L{propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"transformMatrix":this.setAsDirty(h.Transform);break;case"translateZ":case"translateX":case"translateY":this.offset={x:this.translateX,y:this.translateY,z:this.translateZ};break;case"scaleX":case"scaleY":case"scaleZ":this.scale={x:this.scaleX,y:this.scaleY,z:this.scaleZ};break;case"scale":case"offset":case"rotate":this._computeTransformMatrix()}}_computeTransformMatrix(){const e=r.Geometry.LinearAlgebra.Matrix3D,i=r.Geometry.LinearAlgebra.Vector3D,n=r.Geometry.LinearAlgebra.Quaternion,s=this.scale??i.from(1,1,1);let o=e.scale(e.identity(),s);if(!t.Utils.isNull(this.rotate)){const t=n.toRotationMatrix(this.rotate);o=e.multiply(o,t)}const a=this.offset??i.from(0,0,0);o=e.translate(o,a),this.transformMatrix=o}}p([t.Watch({emit:!1,converter:s})],B.prototype,"rotate",void 0),p([t.Watch({emit:!1,converter:n})],B.prototype,"scale",void 0),p([t.Watch({emit:!1,converter:n})],B.prototype,"offset",void 0),p([t.Watch({emit:!1})],B.prototype,"transformMatrix",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],B.prototype,"scaleX",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],B.prototype,"scaleY",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],B.prototype,"scaleZ",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],B.prototype,"translateX",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],B.prototype,"translateY",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],B.prototype,"translateZ",void 0);let A=class extends B{validate(e){return e instanceof L}#n=[];get childRenderables(){return this.#n}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"items":case"datasource":this.#n=r||[],this.setAsDirty(h.Children)}}};p([t.Watch({emit:!1})],A.prototype,"datasource",void 0),A=p([t.CustomElement({tagName:T.GROUP_SELECTOR})],A);let S=class extends B{propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"geometry":this.setAsDirty(h.Geometry);break;case"material":case"backMaterial":this.setAsDirty(h.Material)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],S.prototype,"geometry",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],S.prototype,"material",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],S.prototype,"backMaterial",void 0),S=p([t.CustomElement({tagName:T.MESH_SELECTOR})],S);let k=class extends B{propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"content"!==e&&"type"!==e||this.setAsDirty(h.Geometry,h.Material)}};p([t.Watch({emit:!1})],k.prototype,"content",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.String})],k.prototype,"type",void 0),k=p([t.CustomElement({tagName:T.OBJECT_SELECTOR})],k);let O=class extends L{constructor(){super(...arguments),this.intensity=.85,this.target=T.DEFAULT_COORDS,this.color="#fff",this.type="omni"}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"type":case"color":case"intensity":case"target":this.setAsDirty(h.Light)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],O.prototype,"intensity",void 0),p([t.Watch({emit:!1,converter:i})],O.prototype,"target",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.String})],O.prototype,"color",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.String})],O.prototype,"type",void 0),O=p([t.CustomElement({tagName:T.LIGHT_SELECTOR})],O);class G extends L{constructor(){super(...arguments),this.near=.1,this.far=1e3,this.up=r.Geometry.LinearAlgebra.Vector3D.j(),this.lookAt=T.DEFAULT_COORDS}#s;_resetBoundingSphere(){const e=this.#s,i=this.position,n=this.lookAt,s=t.Utils.isNullOrEmpty(i)||t.Utils.isNullOrEmpty(n)?0:r.Geometry.LinearAlgebra.Vector3D.mag(r.Geometry.LinearAlgebra.Vector3D.subtract(i,n)),o=this.#s={center:n,radius:s};this.dispatchEvent(new t.PropertyChangeEvent({currentValue:o,propertyName:"boundingSphere",oldValue:e}))}get boundingSphere(){return this.#s}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"lookAt":case"position":this._resetBoundingSphere();case"near":case"far":case"up":this.setAsDirty(h.Camera)}}}p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],G.prototype,"near",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],G.prototype,"far",void 0),p([t.Watch({emit:!1,converter:i})],G.prototype,"up",void 0),p([t.Watch({emit:!1,converter:i})],G.prototype,"lookAt",void 0);let D=class extends G{constructor(){super(...arguments),this.fov=45,this.aspect=1}get type(){return"perspective"}get aspectRatio(){return this.aspect}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"fov":case"aspect":this.setAsDirty(h.Camera)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],D.prototype,"fov",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],D.prototype,"aspect",void 0),D=p([t.CustomElement({tagName:T.PERSPECTIVE_CAMERA_SELECTOR})],D);let $=class extends G{constructor(){super(...arguments),this.top=1,this.left=-1,this.bottom=-1,this.right=1}get type(){return"orthographic"}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"top":case"left":case"bottom":case"right":this.setAsDirty(h.Camera)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$.prototype,"top",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$.prototype,"left",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$.prototype,"bottom",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$.prototype,"right",void 0),$=p([t.CustomElement({tagName:T.ORTHO_CAMERA_SELECTOR})],$);class I extends t.PacemEventTarget{}var z,W=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};function j(e){return"shader"in e}function V(e){return j(e)&&e.shader===z.Basic}function H(e){return j(e)&&e.shader===z.Line}function F(e){return j(e)&&e.shader===z.Lambert}function X(e){return j(e)&&e.shader===z.Phong}function Y(e){return j(e)&&e.shader===z.Standard}function Z(e){return j(e)&&e.shader===z.Custom}!function(e){e.Basic="basic",e.Lambert="lambert",e.Phong="phong",e.Standard="standard",e.Line="line",e.Custom="custom"}(z||(z={}));class q extends t.PacemEventTarget{constructor(e){super(),this.#o=e}#o;get shader(){return this.#o}async _loadMap(r,i=this.material?.texture){if(t.Utils.isNull(i)||i.close(),t.Utils.isNullOrEmpty(r))return null;const n=await e.Imaging.loadImage(r);return t.Utils.isNull(n)?null:await createImageBitmap(n)}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"map":case"opacity":case"wireframe":case"color":case"hide":this.updateMaterial()}}viewActivatedCallback(){super.viewActivatedCallback(),this.updateMaterial()}updateMaterial(){this.createMaterial().then(e=>{this.material=t.Utils.extend(e,{flags:[h.Material]})})}async createMaterial(){return{opacity:this.opacity??1,wireframe:this.wireframe??!1,color:this.color||t.Utils.Css.getVariableValue(`--${t.PCSS}-color-primary`),visible:!this.hide,map:this.map,texture:await this._loadMap(this.map),shader:this.shader,flags:[]}}}W([t.Watch()],q.prototype,"material",void 0),W([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],q.prototype,"opacity",void 0),W([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],q.prototype,"wireframe",void 0),W([t.Watch({emit:!1,converter:t.PropertyConverters.String})],q.prototype,"color",void 0),W([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],q.prototype,"hide",void 0),W([t.Watch({emit:!1,converter:t.PropertyConverters.String})],q.prototype,"map",void 0);var J=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Q=class extends q{constructor(){super(z.Basic)}};Q=J([t.CustomElement({tagName:`${t.P}-${a}-material-basic`})],Q);var K=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let ee=class extends q{constructor(){super(z.Lambert)}async createMaterial(){return t.Utils.extend({emissiveColor:this.emissiveColor||"#000",reflectivity:this.reflectivity??0,refractionRatio:this.refractionRatio??0},await super.createMaterial())}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"emissiveColor":case"reflectivity":case"refractionRatio":this.updateMaterial()}}};K([t.Watch({emit:!1,converter:t.PropertyConverters.String})],ee.prototype,"emissiveColor",void 0),K([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ee.prototype,"reflectivity",void 0),K([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ee.prototype,"refractionRatio",void 0),ee=K([t.CustomElement({tagName:`${t.P}-${a}-material-lambert`})],ee);var te=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let re=class extends q{constructor(){super(z.Line)}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"lineWidth":case"lineJoin":case"lineCap":case"dashArray":this.updateMaterial()}}async createMaterial(){return t.Utils.extend({lineWidth:this.lineWidth??1,lineJoin:this.lineJoin??"round",lineCap:this.lineCap??"round",dashArray:this.dashArray},await super.createMaterial())}};te([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],re.prototype,"lineWidth",void 0),te([t.Watch({emit:!1,converter:t.PropertyConverters.String})],re.prototype,"lineJoin",void 0),te([t.Watch({emit:!1,converter:t.PropertyConverters.String})],re.prototype,"lineCap",void 0),te([t.Watch({emit:!1,converter:{convert:e=>e?.split(",").map(e=>parseInt(e)).filter(e=>!Number.isNaN(e)),convertBack:e=>e?.join(",")}})],re.prototype,"dashArray",void 0),re=te([t.CustomElement({tagName:`${t.P}-${a}-material-line`})],re);var ie=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let ne=class extends q{constructor(){super(z.Phong)}async createMaterial(){return t.Utils.extend({emissiveColor:this.emissiveColor||"#000",reflectivity:this.reflectivity??0,refractionRatio:this.refractionRatio??0,specularColor:this.specularColor||"#000",shininess:this.shininess??0,flatShading:this.flatShading??!0},await super.createMaterial())}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"emissiveColor":case"reflectivity":case"refractionRatio":case"specularColor":case"shininess":case"flatShading":this.updateMaterial()}}};ie([t.Watch({emit:!1,converter:t.PropertyConverters.String})],ne.prototype,"emissiveColor",void 0),ie([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ne.prototype,"reflectivity",void 0),ie([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ne.prototype,"refractionRatio",void 0),ie([t.Watch({emit:!1,converter:t.PropertyConverters.String})],ne.prototype,"specularColor",void 0),ie([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ne.prototype,"shininess",void 0),ie([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],ne.prototype,"flatShading",void 0),ne=ie([t.CustomElement({tagName:`${t.P}-${a}-material-phong`})],ne);var se=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let oe=class extends q{constructor(){super(z.Standard)}async createMaterial(){return t.Utils.extend({emissiveColor:this.emissiveColor||"#000",refractionRatio:this.refractionRatio??0,metalness:this.metalness??0,roughness:this.roughness??0,flatShading:this.flatShading??!1},await super.createMaterial())}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"emissiveColor":case"roughness":case"metalness":case"refractionRatio":case"flatShading":this.updateMaterial()}}};se([t.Watch({emit:!1,converter:t.PropertyConverters.String})],oe.prototype,"emissiveColor",void 0),se([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],oe.prototype,"refractionRatio",void 0),se([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],oe.prototype,"roughness",void 0),se([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],oe.prototype,"metalness",void 0),se([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],oe.prototype,"flatShading",void 0),oe=se([t.CustomElement({tagName:`${t.P}-${a}-material-standard`})],oe);var ae=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};class le extends t.PacemEventTarget{viewActivatedCallback(){super.viewActivatedCallback(),t.Utils.isNull(this.geometry)&&(this.geometry=this.createDefaultGeometry())}}function ce(e){return(r,i,n)=>{const s=`_${i}_${t.Utils.uniqueCode()}_backingField`;function o(){return this[s]}function a(t){if(t!==this[s]){const r=this[s];this[s]=t,e.call(this,i,r,t)}}Object.defineProperty(r,i,{get:function(){return o.call(this)},set:function(e){a.call(this,e)},enumerable:!0,configurable:!1})}}ae([t.Watch({converter:t.PropertyConverters.Json})],le.prototype,"geometry",void 0);var ue=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};class he{constructor(e=[]){this.positions=e}static barycenter(e){var r={x:0,y:0,z:0};if(!t.Utils.isNullOrEmpty(e)){for(var i=e.length,n=0;n<e.length;n++){var s=e[n];r.x+=s.x,r.y+=s.y,r.z+=s.z}var o=1*i;r.x/=o,r.y/=o,r.z/=o}return r}static boundingBox(e){const r={minX:1/0,minY:1/0,minZ:1/0,maxX:-1/0,maxY:-1/0,maxZ:-1/0};if(!t.Utils.isNullOrEmpty(e))for(var i=0;i<e.length;i++){var n=e[i];r.minX=Math.min(r.minX,n.x),r.minY=Math.min(r.minY,n.y),r.minZ=Math.min(r.minZ,n.z),r.maxX=Math.max(r.maxX,n.x),r.maxY=Math.max(r.maxY,n.y),r.maxZ=Math.max(r.maxZ,n.z)}return r}setAsDirty(){pe.call(this)}}function pe(){this.flags=[h.Geometry]}class de extends he{}ue([ce(pe)],de.prototype,"positions",void 0);class me extends he{#a;#l;#c;get barycenter(){return this.#c??=he.barycenter(this.positions)}set barycenter(e){this.#c=e}get boundingBox(){return this.#a??=he.boundingBox(this.positions)}set boundingBox(e){this.#a=e}get boundingSphere(){return this.#l}set boundingSphere(e){this.#l=e}constructor(e,t,r=[],i=[]){super(e),this.triangleIndices=t,this.textureCoordinates=r,this.normals=i}}ue([ce(pe)],me.prototype,"positions",void 0),ue([ce(pe)],me.prototype,"triangleIndices",void 0),ue([ce(pe)],me.prototype,"textureCoordinates",void 0),ue([ce(pe)],me.prototype,"normals",void 0);var fe,ge=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let ye=fe=class extends le{static createMeshGeometry(e,t,r,i,n,s){const o=e||1,a=t||1,l=r||1,c=i||1,u=n||1,h=s||1,p=[],d=[],m=[];for(var f=0;f<=u;f++)for(var g=a/2-a*(1*f)/(1*u),y=0;y<=h;y++)for(var v=-l/2+l*(1*y)/(1*h),b=0;b<=c;b++){var x=-o/2+o*(1*b)/(1*c);0!=b&&b!=c&&0!=y&&y!=h&&0!=f&&f!=u||p.push({x:x,y:g,z:v})}var _=function(e,t,r){for(var i=1e-5,n=0;n<p.length;n++){var s=p[n];if(Math.abs(s.x-e)<i&&Math.abs(s.y-t)<i&&Math.abs(s.z-r)<i)return n}return-1},w=function(e,t,r,i,n,s,o,a){m.push(e),m.push(t),m.push(r),m.push(e),m.push(r),m.push(i),d.push({x:n,y:a}),d.push({x:o,y:a}),d.push({x:o,y:s}),d.push({x:n,y:a}),d.push({x:o,y:s}),d.push({x:n,y:s})};for(y=0;y<h;y++){g=a/2,v=-l/2+l*(1*y)/(1*h);var C=-l/2+l*(1*(y+1))/(1*h);for(b=0;b<c;b++){var P=-o/2+1*(b+1)*o/(1*c);w(_(x=-o/2+1*b*o/(1*c),g,C),_(P,g,C),_(P,g,v),_(x,g,v),1*b/(1*c),1-1*y/(1*h),1*(b+1)/(1*c),1-1*(y+1)/(1*h))}}for(f=0;f<u;f++){g=a/2-1*f*a/(1*u);var M=a/2-(f+1)*a/(1*u);for(v=-l/2,b=0;b<c;b++){P=o/2-(b+1)*o/(1*c);w(_(x=o/2-1*b*o/(1*c),M,v),_(P,M,v),_(P,g,v),_(x,g,v),1*b/(1*c),1-1*f/(1*u),(b+1)/(1*c),1-(f+1)/(1*u))}}for(f=0;f<u;f++)for(g=a/2-1*f*a/(1*u),M=a/2-(f+1)*a/(1*u),x=-o/2,y=0;y<h;y++){C=-l/2+(y+1)*l/(1*h);w(_(x,M,v=-l/2+y*l/(1*h)),_(x,M,C),_(x,g,C),_(x,g,v),1*y/(1*h),1-f/(1*u),(y+1)/(1*h),1-(f+1)/(1*u))}for(f=0;f<u;f++)for(g=a/2-f*a/(1*u),M=a/2-(f+1)*a/(1*u),v=l/2,b=0;b<c;b++){P=-o/2+(b+1)*o/(1*c);w(_(x=-o/2+b*o/(1*c),M,v),_(P,M,v),_(P,g,v),_(x,g,v),1*b/(1*c),1-1*f/(1*u),(b+1)/(1*c),1-(f+1)/(1*u))}for(f=0;f<u;f++)for(g=a/2-f*a/(1*u),M=a/2-(f+1)*a/(1*u),x=o/2,y=0;y<h;y++){C=l/2-(y+1)*l/(1*h);w(_(x,M,v=l/2-y*l/(1*h)),_(x,M,C),_(x,g,C),_(x,g,v),1*y/(1*h),1-1*f/(1*u),(y+1)/(1*h),1-(f+1)/(1*u))}for(y=0;y<h;y++)for(g=-a/2,v=l/2-l*y/(1*h),C=l/2-l*(y+1)/(1*h),b=0;b<c;b++){P=-o/2+(b+1)*o/(1*c);w(_(x=-o/2+b*o/(1*c),g,C),_(P,g,C),_(P,g,v),_(x,g,v),1*b/(1*c),1-1*y/(1*h),(b+1)/(1*c),1-(y+1)/(1*h))}const R=new me(p,m,d);R.key=`box_${e}x${t}x${r}_w${i}_h${n}_d${s}`,E(R);const N={x:0,y:0,z:0},U=e/2,T=t/2,L=r/2;return R.barycenter=N,R.boundingBox={maxX:U,maxY:T,maxZ:L,minX:-U,minY:-T,minZ:-L},R.boundingSphere={center:N,radius:Math.sqrt(Math.pow(U,2)+Math.pow(T,2)+Math.pow(L,2))},R}createDefaultGeometry(){return fe.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"width":case"height":case"depth":case"widthSegments":case"heightSegments":case"depthSegments":this.geometry=fe.createMeshGeometry(this.width,this.height,this.depth,this.widthSegments,this.heightSegments,this.depthSegments)}}};ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ye.prototype,"width",void 0),ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ye.prototype,"height",void 0),ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ye.prototype,"depth",void 0),ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ye.prototype,"widthSegments",void 0),ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ye.prototype,"heightSegments",void 0),ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ye.prototype,"depthSegments",void 0),ye=fe=ge([t.CustomElement({tagName:t.P+"-"+"3d-primitive-box"})],ye);var ve,be=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let xe=ve=class extends le{static createMeshGeometry(e=1,t=1,r=18,i=5,n=1){const s=[],o=[],a=[],c=l*(360/r),u=e/t,h=t/i,p=1/r;s.push({x:0,y:t,z:0});for(let e=1;e<=i;e++){const i=t-h*e,n=i/t,l=(t-i)*u,d=(i+h)/t;for(let t=0;t<r;t++){const u=c*t,h=Math.cos(u)*l,m=-Math.sin(u)*l;s.push({x:h,y:i,z:m});const f=1+r*(e-1)+t,g=0==t?f+r-1:f-1,y=t*p,v=0==t?1-p:p*(t-1);if(1==e){a.push(0,g,f),o.push({x:y,y:1},{x:v,y:n},{x:y,y:n});continue}const b=1+r*(e-2)+t,x=0==t?b+r-1:b-1,_=g,w=f,C=b;a.push(w,x,_),a.push(w,C,x);const E={x:v,y:d},P={x:v,y:n},M={x:y,y:n},R={x:y,y:d};o.push(M,E,P),o.push(M,R,E)}}const d=1+(i-1)*r;s.push({x:0,y:0,z:0});const m=d+r;for(let t=1;t<=n;t++){const i=t/n,l=e*i,u=(t-1)/n;for(let e=0;e<r;e++){const h=c*e,p=Math.cos(h),f=Math.sin(h),g=h-c,y=Math.cos(g),v=Math.sin(g),b=.5*(1+p*i),x=.5*(1+f*i),_=.5*(1+y*i),w=.5*(1+v*i);let C,E;if(t!=n){const i=Math.cos(h)*l,n=-Math.sin(h)*l;s.push({x:i,y:0,z:n}),C=m+1+(t-1)*r+e,E=0==e?C+r-1:C-1}else C=d+e,E=0==e?d+r-1:C-1;if(1==t){a.push(m,C,E),o.push({x:.5,y:.5},{x:b,y:x},{x:_,y:w});continue}const P=.5*(1+p*u),M=.5*(1+f*u),R=.5*(1+y*u),N=.5*(1+v*u),U=m+1+(t-2)*r+e,T=0==e?U+r-1:U-1,L=E,B=C,A=U;a.push(T,A,L),a.push(L,A,B);const S={x:R,y:N},k={x:_,y:w},O={x:b,y:x},G={x:P,y:M};o.push(S,G,k),o.push(k,G,O)}}const f=new me(s,a,o);return f.key=`cone_${e}x${t}_s${r}_h${i}_c${n}`,E(f),f}createDefaultGeometry(){return ve.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"height":case"sides":case"heightSegments":case"capSegments":this.geometry=ve.createMeshGeometry(this.radius,this.height,this.sides,this.heightSegments,this.capSegments)}}};be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"radius",void 0),be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"height",void 0),be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"sides",void 0),be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"heightSegments",void 0),be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"capSegments",void 0),xe=ve=be([t.CustomElement({tagName:t.P+"-"+"3d-primitive-cone"})],xe);var _e,we=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Ce=_e=class extends le{static createMeshGeometry(e=1,t=1,r=18,i=5,n=1){const s=e,o=[],a=[],c=[],u=l*(360/r);o.push({x:0,y:t,z:0}),o.push({x:0,y:0,z:0});const h=s/n;for(let e=1;e<=n;e++)for(var p=h*e,d=0;d<r;d++){const i=2+2*r*(e-1),l=0==d?i+2*(r-1):i+2*(d-1),h=i+2*d,m=Math.cos(u*d),f=-Math.sin(u*d),g=Math.cos(u*(d-1)),y=-Math.sin(u*(d-1)),v=p*m,b=p*f,x={x:v,y:t,z:b},_={x:v,y:0,z:b};o.push(x),o.push(_);const w=.5*p/s,C=m*w,E=f*w,P=g*w,M=y*w;if(1==e){const e=[0,l,h],t=[1,h+1,l+1],r=[{x:.5,y:.5},{x:.5+P,y:.5-M},{x:.5+C,y:.5-E}],i=[{x:.5,y:.5},{x:.5+C,y:.5+E},{x:.5+P,y:.5+M}];c.push(...e),c.push(...t);for(let e=0;e<r.length;e++)a.push(r[e]);for(let e=0;e<i.length;e++)a.push(i[e])}else{const t=2+2*r*(e-2),i=0==d?t+2*(r-1):t+2*(d-1),s=t+2*d,o=(e-1)/n*.5,u=m*o,p=f*o,v=g*o,b=y*o,x={x:.5+P,y:.5-M},_={x:.5+C,y:.5-E},w={x:.5+u,y:.5-p},R={x:.5+v,y:.5-b},N={x:.5+P,y:.5+M},U={x:.5+C,y:.5+E},T={x:.5+u,y:.5+p},L={x:.5+v,y:.5+b};c.push(l),c.push(h),c.push(i),c.push(i),c.push(h),c.push(s),c.push(s+1),c.push(h+1),c.push(l+1),c.push(s+1),c.push(l+1),c.push(i+1),a.push(x),a.push(_),a.push(R),a.push(R),a.push(_),a.push(w),a.push(T),a.push(U),a.push(N),a.push(T),a.push(N),a.push(L)}}const m=2+2*r*n,f=2+2*r*(n-1),g=1/r,y=1/i;for(let e=1;e<=i;e++)for(let n=0;n<r;n++){if(e!=i){var v=s*Math.cos(u*n),b=-s*Math.sin(u*n),x=t*e/i;o.push({x:v,y:x,z:b})}const l=0==n?r-1:n-1,h=1==e?f+2*l+1:m+r*(e-2)+l,p=1==e?f+2*n+1:m+r*(e-2)+n,d=e==i?f+2*n:m+r*(e-1)+n,_=e==i?f+2*l:m+r*(e-1)+l,w=l*g,C=(e-1)*y,E=0==n?1:n*g,P=e*y,M={x:w,y:C},R={x:E,y:C},N={x:E,y:P},U={x:w,y:P};c.push(h),c.push(p),c.push(d),c.push(h),c.push(d),c.push(_),a.push(M),a.push(R),a.push(N),a.push(M),a.push(N),a.push(U)}const _=new me(o,c,a);return _.key=`cylinder_${e}x${t}_s${r}_h${i}_c${n}`,E(_),_}createDefaultGeometry(){return _e.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"height":case"sides":case"heightSegments":case"capSegments":this.geometry=_e.createMeshGeometry(this.radius,this.height,this.sides,this.heightSegments,this.capSegments)}}};we([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ce.prototype,"radius",void 0),we([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ce.prototype,"height",void 0),we([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ce.prototype,"sides",void 0),we([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ce.prototype,"heightSegments",void 0),we([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ce.prototype,"capSegments",void 0),Ce=_e=we([t.CustomElement({tagName:t.P+"-"+"3d-primitive-cylinder"})],Ce);var Ee,Pe=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const Me=[{x:0,y:0,z:0},{x:0,y:1,z:0}];let Re=Ee=class extends le{static createLineGeometry(e){return new de(e||Me)}createDefaultGeometry(){return Ee.createLineGeometry()}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),"positions"===e)this.geometry=Ee.createLineGeometry(r)}};Pe([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],Re.prototype,"positions",void 0),Re=Ee=Pe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-line"})],Re);var Ne,Ue=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Te=Ne=class extends le{static createMeshGeometry(e,t,i,n){e||=1,t||=1,i||=4,n||=4;const s=.5*e,o=.5*t,a=[],l=[],c=[],u=[],h=r.Geometry.LinearAlgebra.Vector3D.from(0,0,1);for(let r=0;r<=n;r++)for(let p=0;p<=i;p++){const d=p*e/(1*i)-s,m=0,f=r*t/(1*n)-o;if(a.push({x:d,y:m,z:f}),r<n&&p<i){const e=i+1,t=(p+1)/(1*i),s=1*p/(1*i),o=1-(r+1)/(1*n),a=1-1*r/(1*n);c.push((r+1)*e+p),c.push((r+1)*e+p+1),c.push(r*e+p+1),c.push((r+1)*e+p),c.push(r*e+p+1),c.push(r*e+p),l.push({x:s,y:o}),l.push({x:t,y:o}),l.push({x:t,y:a}),l.push({x:s,y:o}),l.push({x:t,y:a}),l.push({x:s,y:a}),u.push(h,h,h,h,h,h)}}const p=new me(a,c,l,u);return p.key=`plane_${e}x${t}_w${i}_l${n}`,p}createDefaultGeometry(){return Ne.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"width":case"length":case"widthSegments":case"lengthSegments":this.geometry=Ne.createMeshGeometry(this.width,this.length,this.widthSegments,this.lengthSegments)}}};Ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Te.prototype,"width",void 0),Ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Te.prototype,"length",void 0),Ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Te.prototype,"widthSegments",void 0),Ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Te.prototype,"lengthSegments",void 0),Te=Ne=Ue([t.CustomElement({tagName:t.P+"-"+"3d-primitive-plane"})],Te);var Le,Be,Ae,Se,ke,Oe=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const Ge=function(e){const t=/([\d.-]+)/i;var r=t.exec(e);const i=[];for(;null!=r;){const n=r[0],s=parseFloat(n);i.push(s),e=e.replace(n,""),r=t.exec(e)}return i},De=r.Geometry.LinearAlgebra.Vector3D;class $e extends le{propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"radius"===e&&this._assignMeshGeometry(r)}_assignMeshGeometry(e){this.geometry=this.createMeshGeometry(e>0?e:1)}createDefaultGeometry(){return this.createMeshGeometry(1)}}Oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$e.prototype,"radius",void 0);let Ie=Le=class extends $e{static createMeshGeometry(e){e||=1;const t="0 0.5774 -0.8165, 0 0.5774 0.8165, 0.8165 -0.5774 0, -0.8165 -0.5774 0".split(","),r=[];for(let i=0;i<t.length;i++){const n=t[i],s=Ge(n);r.push({x:s[0]*e,y:s[1]*e,z:s[2]*e})}const i="0.5 0.9995, 0.5 0.0004995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995".split(","),n=[4,5,6,7,8,9,10,11,0,3,2,1],s=[];for(let e=0;e<n.length;e++){const t=Ge(i[n[e]]);s.push({x:t[0],y:t[1]})}const o=new me(r,[1,2,0,2,3,0,3,1,0,3,2,1],s);return o.key=`tetrahedron_${e}`,E(o),o.boundingSphere={center:De.zero(),radius:e},o}createMeshGeometry(e=this.radius){return Le.createMeshGeometry(e)}};Ie=Le=Oe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-tetrahedron"})],Ie);let ze=Be=class extends $e{static createMeshGeometry(e){e||=1;const t=[6,7,8,9,10,11,12,13,14,15,16,0,17,18,19,20,21,1,2,22,23,4,3,5],r="0 0.7071 -0.7071, 0 0.7071 0.7071, 1 0 0, 0 -0.7071 -0.7071, -1 0 0, 0 -0.7071 0.7071".split(","),i=[];for(let t=0;t<r.length;t++){const n=r[t],s=Ge(n);i.push({x:s[0]*e,y:s[1]*e,z:s[2]*e})}const n="0.5 0.9995, 0.5 0.9995, 0.0004995 0.5, 0.5 0.9995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.9995".split(","),s=[];for(let e=0;e<t.length;e++){const r=Ge(n[t[e]]);s.push({x:r[0],y:r[1]})}const o=new me(i,[1,2,0,2,3,0,3,4,0,4,1,0,4,5,1,5,2,1,2,5,3,4,3,5],s);return o.key=`octahedron_${e}`,E(o),o.boundingSphere={center:De.zero(),radius:e},o}createMeshGeometry(e=this.radius){return Be.createMeshGeometry(e)}};ze=Be=Oe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-octahedron"})],ze);let We=Ae=class extends $e{static createMeshGeometry(e){e||=1;const t=2*e*(1/Math.sqrt(3)),r=ye.createMeshGeometry(t,t,t);return r.key=`hexahedron_${e}`,r}createMeshGeometry(e=this.radius){return Ae.createMeshGeometry(e)}};We=Ae=Oe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-hexahedron"})],We);let je=Se=class extends $e{static createMeshGeometry(e){e||=1;const t=[12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,26,27,28,29,30,31,32,33,1,34,35,36,2,37,38,39,40,41,42,43,7,44,45,46,8,47,48,49,50,51,52,53,9,54,55,3,10,56,57,6,58,59,5,4,11],r="0 0.850651 -0.525731, 0 0.850651 0.525731, 0.850651 0.525731 0, 0.525731 0 -0.850651, -0.525731 0 -0.850651, -0.850651 0.525731 0, -0.525731 0 0.850651, 0.525731 0 0.850651, 0.850651 -0.525731 0, 0 -0.850651 0.525731, 0 -0.850651 -0.525731, -0.850651 -0.525731 0".split(","),i=[];for(let t=0;t<r.length;t++){const n=r[t],s=Ge(n);i.push({x:s[0]*e,y:s[1]*e,z:s[2]*e})}const n="0.5 0.808708, 0.5 0.999501, 0.5 0.808708, 0.191292 0.5, 0.000499547 0.5, 0.5 0.808708, 0.9995 0.5, 0.808708 0.5,0.000499487 0.5, 0.5 0.191292, 0.5 0.000499487, 0.5 0.191292,0.5 0.191292, 0.999501 0.5, 0.5 0.808708, 0.5 0.808708,0.9995 0.5, 0.808708 0.999501, 0.191292 0.5, 0.808708 0.5,0.5 0.999501, 0.808708 0.5, 0.999501 0.808708, 0.5 0.999501,0.000499487 0.5, 0.5 0.191292, 0.5 0.808708, 0.9995 0.5,0.808708 0.999501, 0.191292 0.5, 0.808708 0.5, 0.5 0.999501,0.808708 0.5, 0.999501 0.808708, 0.5 0.808708, 0.5 0.191292,0.9995 0.5, 0.000499547 0.5, 0.5 0.191292, 0.191292 0.5,0.5 0.000499487, 0.808708 0.5, 0.5 0.000499487, 0.999501 0.191292,0.5 0.191292, 0.808708 0.000499487, 0.9995 0.5, 0.5 0.191292,0.5 0.808708, 0.9995 0.5, 0.5 0.191292, 0.808708 0.000499487,0.999501 0.5, 0.5 0.808708, 0.5 0.000499487, 0.808708 0.5,0.999501 0.191292, 0.808708 0.5, 0.5 0.808708, 0.5 0.191292".split(","),s=[];for(let e=0;e<t.length;e++){const r=Ge(n[t[e]]);s.push({x:r[0],y:r[1]})}const o=new me(i,[1,2,0,2,3,0,3,4,0,4,5,0,5,1,0,5,6,1,6,7,1,7,2,1,2,8,3,2,7,8,6,9,7,9,8,7,8,10,3,8,9,10,6,11,9,11,10,9,10,4,3,10,11,4,6,5,11,5,4,11],s);return o.key=`icosahedron_${e}`,E(o),o.boundingSphere={center:De.zero(),radius:e},o}createMeshGeometry(e=this.radius){return Se.createMeshGeometry(e)}};je=Se=Oe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-icosahedron"})],je);let Ve=ke=class extends $e{static createMeshGeometry(e){e||=1;const t=[De.from(.356822*e,.934172*e,0*e),De.from(-.356822*e,.934172*e,0*e),De.from(.57735*e,.57735*e,-.57735*e),De.from(0*e,.356822*e,-.934172*e),De.from(-.57735*e,.57735*e,-.57735*e),De.from(-.57735*e,.57735*e,.57735*e),De.from(0*e,.356822*e,.934172*e),De.from(.57735*e,.57735*e,.57735*e),De.from(.934172*e,0*e,-.356822*e),De.from(.934172*e,0*e,.356822*e),De.from(0*e,-.356822*e,.934172*e),De.from(.57735*e,-.57735*e,.57735*e),De.from(.57735*e,-.57735*e,-.57735*e),De.from(.356822*e,-.934172*e,0*e),De.from(-.57735*e,-.57735*e,.57735*e),De.from(-.356822*e,-.934172*e,0*e),De.from(0*e,-.356822*e,-.934172*e),De.from(-.57735*e,-.57735*e,-.57735*e),De.from(-.934172*e,0*e,.356822*e),De.from(-.934172*e,0*e,-.356822*e)],r=[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,0,46,47,48,49,50,51,7,52,53,54,55,56,57,58,59,60,61,9,62,63,64,65,66,67,11,68,69,70,71,72,73,74,75,76,77,13,78,79,80,81,82,83,15,84,85,86,87,88,89,90,91,92,93,17,94,95,96,97,98,99,19,1,4,100,14,101,102,10,103,18,6,5,104,2,105,106,8,107,3,12,16],i="0.5 0.999501, 0.5 0.999501, 0.191292 0.808708, 0.5 0.690792,\n 0.191292 0.808708, 0.191292 0.808708, 0.5 0.690792,\n 0.808708 0.808708, 0.000499517 0.5, 0.309208 0.5, 0.5 0.309208,\n 0.191292 0.191292, 0.191292 0.191292, 0.309208 0.5,\n 0.191292 0.191292, 0.5 0.000499517, 0.5 0.309208, 0.808708 0.191292,\n 0.000499517 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.309208 0.5,\n 0.191292 0.191292, 0.5 0.000499517, 0.309208 0.5, 0.5 0.000499517,\n 0.808708 0.191292, 0.309208 0.5, 0.808708 0.191292,\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.690792 0.5,\n 0.191292 0.808708, 0.690792 0.5, 0.808708 0.808708,\n 0.191292 0.808708, 0.808708 0.808708, 0.808708 0.808708,\n 0.5 0.690792, 0.5 0.309208, 0.808708 0.808708, 0.5 0.309208,\n 0.808708 0.191292, 0.808708 0.191292, 0.9995 0.5, 0.191292 0.191292,\n 0.5 0.000499517, 0.808708 0.191292, 0.191292 0.191292,\n 0.808708 0.191292, 0.690792 0.5, 0.191292 0.191292,\n 0.690792 0.5, 0.191292 0.191292, 0.5 0.000499517, 0.808708 0.191292,\n 0.191292 0.191292, 0.808708 0.191292, 0.690792 0.5,\n 0.690792 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\n 0.690792 0.5, 0.191292 0.808708, 0.5 0.000499517, 0.808708 0.191292,\n 0.690792 0.5, 0.5 0.000499517, 0.690792 0.5, 0.309208 0.5,\n 0.309208 0.5, 0.191292 0.191292, 0.9995 0.5, 0.808708 0.808708,\n 0.5 0.690792, 0.9995 0.5, 0.5 0.690792, 0.5 0.309208,\n 0.9995 0.5, 0.5 0.309208, 0.309208 0.5, 0.690792 0.5,\n 0.808708 0.808708, 0.309208 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.000499517 0.5, 0.5 0.309208, 0.000499517 0.5,\n 0.5 0.690792, 0.5 0.690792, 0.000499517 0.5, 0.5 0.690792,\n 0.191292 0.191292".split(","),n=[];for(let e=0;e<r.length;e++){const t=Ge(i[r[e]]);n.push({x:t[0],y:t[1]})}const s=new me(t,[0,2,3,0,3,4,0,4,1,1,5,6,1,6,7,1,7,0,7,9,8,7,8,2,7,2,0,7,6,10,7,10,11,7,11,9,11,13,12,11,12,8,11,8,9,11,10,14,11,14,15,11,15,13,15,17,16,15,16,12,15,12,13,15,14,18,15,18,19,15,19,17,19,4,3,19,3,16,19,16,17,19,18,5,19,5,1,19,1,4,18,14,10,18,10,6,18,6,5,3,2,8,3,8,12,3,12,16],n);return s.key=`dodecahedron_${e}`,E(s),s.boundingSphere={center:De.zero(),radius:e},s}createMeshGeometry(e=this.radius){return ke.createMeshGeometry(e)}};Ve=ke=Oe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-dodecahedron"})],Ve);var He,Fe=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Xe=He=class extends le{static createMeshGeometry(e=1,t=8){const r=[],i=[],n=[],s=e,o=t,a=l*(360/o),c=o%2==0?o/2:(o-1)/2;r.push({x:0,y:s,z:0});for(let e=1;e<c;e++){const t=a*e,l=Math.cos(t),u=Math.sin(t),h=1-1*e/c;for(let t=0;t<o;t++){const p=a*t-Math.PI/2,d=s*u*Math.cos(p),m=s*l,f=s*u*Math.sin(p);r.push({x:d,y:m,z:f});const g=0==t?o-1:t-1,y=0==t?0:1-1*t/o,v=1-1*g/o;if(1==e)n.push(1+t),n.push(1+g),n.push(0),i.push({x:y,y:h}),i.push({x:v,y:h}),i.push({x:.5,y:1});else{n.push((e-1)*o+t+1),n.push((e-1)*o+g+1),n.push((e-2)*o+g+1),n.push((e-1)*o+t+1),n.push((e-2)*o+g+1),n.push((e-2)*o+t+1);const r=1-(e-1)/c;i.push({x:y,y:h}),i.push({x:v,y:h}),i.push({x:v,y:r}),i.push({x:y,y:h}),i.push({x:v,y:r}),i.push({x:y,y:r})}}}r.push({x:0,y:-s,z:0});const u=r.length-1;for(let e=0;e<o;e++){const t=c-2,r=0==e?o-1:e-1,s=0==e?0:1-1*e/o,a=1-1*r/o,l=1-(t+1)/c;n.push(u),n.push(t*o+1+r),n.push(t*o+1+e),i.push({x:.5,y:0}),i.push({x:a,y:l}),i.push({x:s,y:l})}const h=new me(r,n,i);return h.key=`sphere_${e}_s${t}`,E(h),h}createDefaultGeometry(){return He.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"segments":this.geometry=He.createMeshGeometry(this.radius,this.segments)}}};Fe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Xe.prototype,"radius",void 0),Fe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Xe.prototype,"segments",void 0),Xe=He=Fe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-sphere"})],Xe);var Ye,Ze=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let qe=Ye=class extends le{static createMeshGeometry(e=1,t=.25,r=24,i=12){const n=[],s=[],o=[],a=l*(360/r),c=l*(360/i),u=e,h=t;for(let e=0;e<r;e++){const t=a*e-Math.PI/2,l=Math.sin(t),p=Math.cos(t);for(let t=0;t<i;t++){const a=c*t+Math.PI,d=Math.cos(a),m=u*p+h*d*p,f=h*Math.sin(a),g=u*l+h*d*l;n.push({x:m,y:f,z:g});const y=e>0?e-1:r-1,v=t>0?t-1:i-1,b=0==e?0:1-1*e/r,x=t>0?1*t/i:1,_=e>0?1-(e-1)/r:1/r,w=t>0?(t-1)/i:1-1/i;o.push(e*i+v),o.push(y*i+v),o.push(y*i+t),o.push(e*i+v),o.push(y*i+t),o.push(e*i+t),s.push({x:b,y:w}),s.push({x:_,y:w}),s.push({x:_,y:x}),s.push({x:b,y:w}),s.push({x:_,y:x}),s.push({x:b,y:x})}}const p=new me(n,o,s);return p.key=`torus_${e}x${t}_t${r}_s${i}`,E(p),p}createDefaultGeometry(){return Ye.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"innerRadius":case"segments":case"sides":this.geometry=Ye.createMeshGeometry(this.radius,this.innerRadius,this.segments,this.sides)}}};Ze([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],qe.prototype,"radius",void 0),Ze([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],qe.prototype,"innerRadius",void 0),Ze([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],qe.prototype,"segments",void 0),Ze([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],qe.prototype,"sides",void 0),qe=Ye=Ze([t.CustomElement({tagName:t.P+"-"+"3d-primitive-torus"})],qe);class Je{static isMeshGeometry(e){return"positions"in e&&t.Utils.isArray(e.positions)&&"triangleIndices"in e&&t.Utils.isArray(e.triangleIndices)}static isVector3D(e){return"x"in e&&"number"==typeof e.x&&"y"in e&&"number"==typeof e.y&&"z"in e&&"number"==typeof e.z}static isRgba(e){return"r"in e&&"number"==typeof e.r&&"g"in e&&"number"==typeof e.g&&"b"in e&&"number"==typeof e.b}static flattenVectorArray(e){const t=[];for(let r of e)Je.isVector3D(r)?t.push(r.x,r.y,r.z):Je.isRgba(r)?t.push(r.r,r.g,r.b,r.a??1):t.push(r.x,r.y);return t}static findCamera(e){return(e||[]).find(e=>g(e)&&!e.hide)}clipPixel(r,i){return i instanceof HTMLElement&&(i=t.Utils.offsetRect(i)),function(r,i){let n,s;if(e.Point.isPoint(r))n=r.x,s=r.y;else{const{page:e}=t.CustomEventUtils.getEventCoordinates(r),o={x:e.x-i.x,y:e.y-i.y};n=o.x,s=o.y}return{x:n/i.width*2-1,y:s/i.height*-2+1}}(r,i)}}var Qe=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};function Ke(e){return Je.flattenVectorArray(e)}const et="0.152.2",tt={VERSION:et,API_URI:`https://unpkg.com/three@${et}/build/three.min.js`,ORBIT_URI:"https://unpkg.com/three@0.147.0/examples/js/controls/OrbitControls.js",LOADERS:[],DEFAULT_MATERIAL:function(){return new THREE.MeshStandardMaterial({color:"#069",flatShading:!0})}};function rt(r){if(t.Utils.isNull(r))return null;const i={color:"string"==typeof r.color?r.color:e.Colors.stringify(r.color),opacity:r.opacity??1,transparent:!0,wireframe:r.wireframe??!1,visible:r.visible??!0},n=t.Utils.extend({},i,{wireframe:r.wireframe??!1}),s=e=>(r.map&&(e.map=(new THREE.TextureLoader).load(r.map,t=>{e.needsUpdate=!0})),e);if(Y(r)){return s(new THREE.MeshStandardMaterial(t.Utils.extend(n,{roughness:r.roughness,metalness:r.metalness,emissive:r.emissiveColor,flatShading:r.flatShading,refractionRatio:r.refractionRatio})))}if(X(r)){return s(new THREE.MeshPhongMaterial(t.Utils.extend(n,{shininess:r.shininess,emissive:r.emissiveColor,flatShading:r.flatShading,specular:r.specularColor,reflectivity:r.reflectivity,refractionRatio:r.refractionRatio})))}if(F(r)){return s(new THREE.MeshLambertMaterial(t.Utils.extend(n,{emissive:r.emissiveColor,reflectivity:r.reflectivity,refractionRatio:r.refractionRatio})))}if(H(r)){const e=r.dashArray&&r.dashArray[0]||null,n=r.dashArray&&r.dashArray.length>1&&r.dashArray[1]||e,s=t.Utils.extend(i,{linecap:r.lineCap??"round",linejoin:r.lineJoin??"round",linewidth:r.lineWidth??1});return t.Utils.isNullOrEmpty(r.dashArray)?new THREE.LineBasicMaterial(s):new THREE.LineDashedMaterial(t.Utils.extend({dashSize:e,gapSize:n},s))}if(j(r)){return s(new THREE.MeshBasicMaterial(n))}return null}function it(e){if(t.Utils.isNullOrEmpty(e.content))throw new Error("Missing content.");{const t=e.type?.toLowerCase();if("obj"===t){return(new THREE.OBJLoader).parse(e.content)}return(new THREE.ObjectLoader).parse(e.content)}}function nt(e){if(t.Utils.isNullOrEmpty(e.geometry))return null;return new(e.geometry instanceof de?THREE.Line:THREE.Mesh)}function st(){return"THREE"in window}let ot=class extends I{constructor(){super(...arguments),this._renderer=null,this._camera=null,this._scene=null,this._orbitCtrls=null,this._objects=new WeakMap,this._dict={},this._orbitControlsDelegate=e=>{},this._ensureAndRefresh=(e,i,n)=>{if(i.matrixAutoUpdate=!1,i.visible=!e.hide){if(x(e)){let r=i;if(e.flags.indexOf(h.Geometry)>=0){r.geometry.dispose();const s=nt(e);s.constructor.name!==r.constructor.name&&(n.remove(i),delete this._dict[i.id],i=r=s),r.geometry=function(e){const r=new THREE.BufferGeometry,i=Ke(e.positions);if(r.setAttribute("position",new THREE.Float32BufferAttribute(i,3)),e instanceof me){t.Utils.isNullOrEmpty(e.triangleIndices)||r.setIndex(e.triangleIndices);const i=Ke(e.positions);r.setAttribute("position",new THREE.Float32BufferAttribute(i,3));const n=Ke(e.textureCoordinates);if(r.setAttribute("uv",new THREE.Float32BufferAttribute(n,2)),t.Utils.isNullOrEmpty(e.normals))r.computeVertexNormals();else{const t=Ke(e.normals);r.setAttribute("normal",new THREE.Float32BufferAttribute(t,3))}}return r}(e.geometry)}if(e.flags.indexOf(h.Material)>=0){if(t.Utils.isArray(r.material))for(let e of r.material)e.dispose();else r.material.dispose();r.material=function(e,r,i){const n=i,s=[],o=rt(e);if(t.Utils.isNull(o)||(o.side=THREE.FrontSide,s.push(o)),!t.Utils.isNull(r))if(r==e)o.side=THREE.DoubleSide;else{const e=rt(r);t.Utils.isNull(e)||(e.side=THREE.BackSide,s.push(e))}return n&&s.length>1?s:o}(e.material)||tt.DEFAULT_MATERIAL()}}else if(e instanceof k&&(e.flags.indexOf(h.Material)>=0||e.flags.indexOf(h.Geometry)>=0))i.parent&&i.parent.remove(i),i=it(e);else if(e instanceof A){if(e.flags.indexOf(h.Children)>=0){for(let e=i.children.length-1;e>=0;e--){const t=i.children[e];i.remove(t)}for(let t of e.items)this._addOrUpdateItem(t,i)}}else if(e instanceof O){const t=i;e.flags.indexOf(h.Light)>=0&&(t.color=new THREE.Color(e.color),t.intensity=e.intensity)}let o=e.position;if(f(e)&&!t.Utils.isNull(e.transformMatrix)&&(e.flags.indexOf(h.Position)>=0||e.flags.indexOf(h.Transform)>=0)){const t=r.Geometry.LinearAlgebra.Matrix3D.from(1,0,0,0,0,1,0,0,0,0,1,0,o.x,o.y,o.z,1),n=r.Geometry.LinearAlgebra.Matrix3D.multiply(e.transformMatrix,t);THREE.Matrix4.prototype.set.apply(i.matrix,[(s=n).m11,s.m21,s.m31,s.offsetX,s.m12,s.m22,s.m32,s.offsetY,s.m13,s.m23,s.m33,s.offsetZ,s.m14,s.m24,s.m34,s.m44])}else e.flags.indexOf(h.Position)>=0&&(i.position.set(o.x,o.y,o.z),i.updateMatrix())}var s;return i.userData=e.tag,t.Utils.isNull(n.getObjectById(i.id))&&(n.add(i),this._dict[i.id]=e),e.flags.splice(0),i}}_assertMonoStage(e){if(e!=this._3d&&!t.Utils.isNull(this._3d))throw new Error("Stage mismatch.")}dispose(e){}snapshot(e,r,i,n){if(e!=this._3d)return Promise.resolve(null);const s=!t.Utils.isNullOrEmpty(r),o=i??(s?"image/jpeg":null),a=n??(s?.9:null);return new Promise((e,i)=>{this.render(),t.Utils.snapshotElement(this._stage,r,o,a).then(e)})}project(e,r){if(this._assertMonoStage(e),t.Utils.isNull(this._camera)||t.Utils.isNull(this._stage))return null;const i=this._stage,n=new THREE.Vector3(r.x,r.y,r.z),s=i.width/2,o=i.height/2,a=n.project(this._camera);return{x:a.x*s+s,y:-a.y*o+o}}zoomFit(e,...r){return this._assertMonoStage(e),new Promise((e,i)=>{const n=this._camera,s=this._objects,o=r.filter(e=>s.has(e)).map(e=>s.get(e));(t.Utils.isNull(n)||t.Utils.isNullOrEmpty(o))&&e(),function(e,r,i,n=1.333){const s=new THREE.Box3;for(const e of i)s.expandByObject(e);const o=s.getSize(new THREE.Vector3),a=s.getCenter(new THREE.Vector3),l=Math.max(o.x,o.y,o.z)/(2*Math.atan(Math.PI*e.fov/360)),c=l/e.aspect,u=n*Math.max(l,c),h=!t.Utils.isNull(r);var p;h&&(p=r.target.clone().sub(e.position).normalize().multiplyScalar(u),r.maxDistance=10*u,r.target.copy(a)),e.near=u/100,e.far=100*u,e.updateProjectionMatrix(),h&&(e.position.copy(r.target).sub(p),r.update())}(n,this._orbitCtrls,o),e()})}getScene(e){return this._assertMonoStage(e),this._scene}raycast(e,r,i,n){if(this._assertMonoStage(e),st()&&!t.Utils.isNull(this._camera)){const e=this._camera,t=new THREE.Vector2(r.x/i.width*2-1,-r.y/i.height*2+1),s=new THREE.Raycaster;s.setFromCamera(t,e);const o=s.intersectObjects(this._scene.children,!0);let a,l,c=0;for(;o.length>c&&(l=o[c++])&&(a=l.object);){if(this._dict[a.id].inert)continue;const e=l.point,t={x:e.x,y:e.y,z:e.z};return void n({object:this._dict[a.id],point:t})}}n(null)}async initialize(r){if(!t.Utils.isNull(this._stage))return this._stage;this._3d=r;const i=r.stage,n=this._stage=document.createElement("canvas");i.innerHTML="",i.appendChild(n),st()||(await t.CustomElementUtils.importjs(tt.API_URI),await async function(...e){const t=Date.now();var r=!1;do{r=st();for(let t of e)r&&=t();r||await new Promise(e=>setTimeout(e,500))}while(!r&&Date.now()-t<3e4);if(!r)throw new Error("The wait for THREE adapter initialization timed out.")}(),await Promise.all([t.CustomElementUtils.importjs(tt.ORBIT_URI)].concat(tt.LOADERS.map(e=>t.CustomElementUtils.importjs(e))))),this._scene=new THREE.Scene,this.invalidateSize(r);let s=this._stage.width,o=this._stage.height,a={canvas:n,antialias:!0,stencil:!1,alpha:r.transparent??!0};if(this._renderer=new THREE.WebGLRenderer(a),this._renderer.setSize(s,o),r.background&&!r.transparent){let t=r.background;"string"==typeof t&&(t=e.Colors.parse(t));const i=new THREE.Color(t.r,t.g,t.b);this._renderer.setClearColor(i,t.a)}return this.orbit=r.orbit,n}_setCamera(e){this._camera=e,this.invalidateSize(this._3d),this._disposeOrbitControls(),this.orbit&&this._initOrbitControls()}propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"orbit"===e&&(!0===r?this._initOrbitControls():this._disposeOrbitControls())}_initOrbitControls(){const e=this._camera;if(t.Utils.isNull(this._3d)||t.Utils.isNull(e))return;(this._orbitCtrls=new THREE.OrbitControls(e,this._3d.stage)).addEventListener("change",this._orbitControlsDelegate)}_disposeOrbitControls(){const e=this._orbitCtrls;t.Utils.isNull(e)||(e.removeEventListener("change",this._orbitControlsDelegate),e.dispose())}_updateRenderer(t,r=this._renderer){if(t.transparent)r.setClearAlpha(0);else if(t.background){let i=t.background;"string"==typeof i&&(i=e.Colors.parse(i));const n=new THREE.Color(i.r,i.g,i.b);r.setClearColor(n,i.a)}else r.setClearColor(null)}invalidateSize(e,r=e.size){if(this._assertMonoStage(e),!st()||t.Utils.isNull(r))return;let i=r.width,n=r.height;this._stage.width=i,this._stage.height=n;let s=this._camera;s instanceof THREE.PerspectiveCamera&&(s.aspect=i/n,s.updateProjectionMatrix()),this._renderer&&(this._renderer.setSize(i,n),this._updateRenderer(e))}removeItem(e,r){this._assertMonoStage(e);const i=this._objects,n=i.get(r);t.Utils.isNull(n)||(this._scene.remove(n),delete this._dict[n.id],i.delete(r))}updateItem(e,r){this._assertMonoStage(e);const i=this._objects;if(!t.Utils.isNull(r.parent)&&i.has(r.parent)){const e=i.get(r.parent);this._addOrUpdateItem(r,e)}else this._addOrUpdateItem(r)}addItem(e,t){this._assertMonoStage(e),this._addOrUpdateItem(t)}_addOrUpdateItem(e,r=this._scene){if(st()&&!t.Utils.isNull(r))if(e instanceof G)if(e instanceof D){if(this._camera instanceof THREE.PerspectiveCamera)var i=this._camera;else i=new THREE.PerspectiveCamera;const r=new THREE.Vector3(e.lookAt.x,e.lookAt.y,e.lookAt.z);i.lookAt(r),i.position.set(e.position.x,e.position.y,e.position.z),i.fov=e.fov,i.aspect=e.aspect,i.near=e.near,i.far=e.far,this._setCamera(i);const n=this._orbitCtrls;t.Utils.isNull(n)||n.object!==i||(n.target=r,n.update())}else{if(!(e instanceof $))throw new Error(`Camera ${e} not supported.`);{if(this._camera instanceof THREE.OrthographicCamera)var n=this._camera;else n=new THREE.OrthographicCamera;const r=new THREE.Vector3(e.lookAt.x,e.lookAt.y,e.lookAt.z);n.lookAt(r),n.position.set(e.position.x,e.position.y,e.position.z),n.left=e.left,n.right=e.right,n.top=e.top,n.bottom=e.bottom,n.near=e.near,n.far=e.far,this._setCamera(n);const i=this._orbitCtrls;t.Utils.isNull(i)||i.object!==n||(i.target=r,i.update())}}else if(this._objects.has(e)){const t=this._objects.get(e),i=this._ensureAndRefresh(e,t,r);i!=t&&this._objects.set(e,i)}else{const t=t=>{t&&(t=this._ensureAndRefresh(e,t,r),this._objects.set(e,t))};if(e instanceof k){t(it(e))}else if(e instanceof S){t(nt(e))}else if(e instanceof O){const r=function(e){var t;if("spot"===e.type){const r=new THREE.SpotLight;r.target.position.set(e.target.x,e.target.y,e.target.z),t=r}else t=new THREE.PointLight;return t}(e);t(r)}else if(e instanceof A){t(new THREE.Group)}}}render(){this._camera&&this._renderer.render(this._scene,this._camera)}};Qe([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],ot.prototype,"orbit",void 0),ot=Qe([t.CustomElement({tagName:t.P+"-3d-three-adapter"})],ot);const at="pacem-3d-",lt="color",ct="ambient",ut="lighting",ht="VertexInput",pt="VertexOutput",dt="InteractionData";var mt,ft,gt,yt,vt;!function(e){e[e.COPY_SRC=4]="COPY_SRC",e[e.COPY_DST=8]="COPY_DST",e[e.INDEX=16]="INDEX",e[e.INDIRECT=256]="INDIRECT",e[e.MAP_READ=1]="MAP_READ",e[e.MAP_WRITE=2]="MAP_WRITE",e[e.QUERY_RESOLVE=512]="QUERY_RESOLVE",e[e.STORAGE=128]="STORAGE",e[e.UNIFORM=64]="UNIFORM",e[e.VERTEX=32]="VERTEX"}(mt||(mt={})),function(e){e[e.COPY_SRC=1]="COPY_SRC",e[e.COPY_DST=2]="COPY_DST",e[e.RENDER_ATTACHMENT=16]="RENDER_ATTACHMENT",e[e.STORAGE_BINDING=8]="STORAGE_BINDING",e[e.TEXTURE_BINDING=4]="TEXTURE_BINDING"}(ft||(ft={})),function(e){e[e.VERTEX=1]="VERTEX",e[e.FRAGMENT=2]="FRAGMENT",e[e.COMPUTE=4]="COMPUTE"}(gt||(gt={})),function(e){e[e.READ=1]="READ",e[e.WRITE=2]="WRITE"}(yt||(yt={})),function(e){e.Mesh="mesh",e.Camera="camera",e.Texture="texture",e.Light="light",e.Interaction="interaction"}(vt||(vt={}));class bt{static create(e,t,r=""){const i=e.createBuffer({size:t.byteLength,label:r,usage:mt.VERTEX|mt.COPY_DST,mappedAtCreation:!0});return new Float32Array(i.getMappedRange()).set(t),i.unmap(),i}static createUniform(e,t,r=""){return e.createBuffer({size:t.byteLength,label:r,usage:mt.UNIFORM|mt.COPY_DST})}static createStorage(e,t,r=""){return e.createBuffer({size:t.byteLength,label:r,usage:mt.STORAGE|mt.COPY_DST})}static createIndexed(e,t,r=""){const i=e.createBuffer({size:t.byteLength,label:r,usage:mt.INDEX|mt.COPY_DST,mappedAtCreation:!0});return new Uint16Array(i.getMappedRange()).set(t),i.unmap(),i}}class xt{static createVertex(e=0,t=3,...r){const i=[];let n=0,s=0;for(let o of[t].concat(r))i.push({shaderLocation:e+s,offset:n*Float32Array.BYTES_PER_ELEMENT,format:`float32x${o}`}),n+=o,s++;return{arrayStride:n*Float32Array.BYTES_PER_ELEMENT,attributes:i,stepMode:"vertex"}}}const _t={outputNormalLocation:0,outputVertexLocation:1,outputUvLocation:2,outputVertexIndexLocation:3,outputRayIndexLocation:4,outputInstanceIndexLocation:5,storageMaterialGroupIndex:2,storageMaterialBindingIndex:0};function wt(e=[]){return e.join("\r\n")}function Ct(e={},r=_t){const i=t.Utils.extend({},_t,r),n=wt(e.definitions),s=wt(e.bindings),o=function(e=[]){let t="";for(let r of e){const e=r.trim();e.endsWith(";")?t+=e+"\r\n\t":t+=`${lt} = ${e};\r\n\t`}return t}(e.modifiers),a=lt,l=ut,c=ct;return`// definitions\n\n${n}\n\n// bindings\n@group(${i.storageMaterialGroupIndex}) @binding(${i.storageMaterialBindingIndex}) var<storage, read> diffuseColor: vec4f;\n${s}\n\nconst empty = vec4f(0,0,0,0);\nconst white = vec4f(1,1,1,1);\n\n@fragment fn main (\n @builtin(position) position: vec4f, // clip-space position\n @location(${i.outputNormalLocation}) normal: vec3f, // world-space normal\n @location(${i.outputVertexLocation}) vertex: vec3f, // world-space position\n @location(${i.outputUvLocation}) uv: vec2f,\n @location(${i.outputVertexIndexLocation}) @interpolate(flat) index: u32, // vertex index,\n @location(${i.outputRayIndexLocation}) ray: vec3f, // ray (eye-to-vertex) vector\n @location(${i.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n) -> @location(0) vec4f {\n var ${a} = diffuseColor;\n var ${c}: vec4f = empty;\n var ${l}: vec4f = empty;\n\n // modifiers\n ${o}\n\n ${l} = select(white, ${l}, ${l}.a > 0);\n return ${a} * ${l} + ${c};\n}`}const Et={outputInstanceIndexLocation:0,outputVertexIndexLocation:1,storageMaterialGroupIndex:3,storageMaterialBindingIndex:0};function Pt(e=[]){return e.join("\r\n")}function Mt(e={},r=Et){const i=t.Utils.extend({},Et,r),n=Pt(e.definitions),s=Pt(e.bindings),o=function(e=[]){let t="";for(let r of e){const e=r.trim();e.endsWith(";")?t+=e+"\r\n":t+=`output = ${e};\r\n`}return t}(e.modifiers);return`// definitions\n${n}\n\n// bindings\n@group(${r.storageMaterialGroupIndex}) @binding(${r.storageMaterialBindingIndex}) var<storage, read> vertexColors: array<vec4f>;\n${s}\n\nfn getVertexColor(index: u32) -> vec4f {\n let numColors = arrayLength(&vertexColors);\n let vertexColorIndex = index % numColors;\n return vertexColors[vertexColorIndex];\n}\n\n@fragment fn main (\n @builtin(position) position: vec4f, // clip-space position\n @location(${i.outputInstanceIndexLocation}) @interpolate(flat) instance: u32, // instance index\n @location(${i.outputVertexIndexLocation}) @interpolate(flat) index: u32 // vertex index\n) -> @location(0) vec4f {\n var output = getVertexColor(index);\n\n // modifiers\n ${o}\n\n return output;\n}`}class Rt{static create(e){if(V(e))return new Tt(e);if(H(e))return new Lt(e);throw new TypeError(`Material type '${e.shader}' not supported.`)}}const Nt={};class Ut{constructor(e){if(t.Utils.isNull(this.#u=e))throw new ReferenceError("Null material provided.")}#u;get material(){return this.#u}get wgsl(){return Nt}buffer({device:e},t=at+"material-"+this.shader+"-buffer"){const{r:r,g:i,b:n,a:s}=this._diffuseColor(),o=new Float32Array([r,i,n,s]);return{buffer:bt.createStorage(e,o,t),value:o,version:performance.now()}}_diffuseColor(){const{visible:r,opacity:i,color:n}=this.material;if(!(r??1))return{r:0,g:0,b:0,a:0};const s="string"==typeof n?e.Colors.parse(n):n??{r:1,g:1,b:1,a:1};return i>=0&&i<=1?t.Utils.extend(s,{a:s.a*i}):s}}class Tt extends Ut{get shader(){return z.Basic}constructor(e){if(super(e),e.shader!=this.shader)throw new TypeError("Basic material expected.")}texture({device:e},r="texture"){const i=this.material;if("texture"===r&&!t.Utils.isNull(i.texture)){const t=i.texture;return{texture:e.createTexture({format:"rgba8unorm",usage:ft.TEXTURE_BINDING|ft.RENDER_ATTACHMENT|ft.COPY_DST,size:[t.width,t.height]}),source:t}}return null}static{this.fragment=Ct}}class Lt extends Ut{get shader(){return z.Line}constructor(e){if(super(e),e.shader!=this.shader)throw new TypeError("Line material expected.")}buffer(e,t){if("line"===t){const{device:t,canvas:r}=e,i=this.material,n=new Float32Array([r.clientWidth,r.clientHeight,i.lineWidth/2]);return{buffer:bt.createUniform(t,n,at+"line-"+this.shader+"-buffer"),value:n,version:performance.now()}}return super.buffer(e)}texture(e){return null}static{this.fragment=Mt}}const Bt=["input","data"];function At(e){"string"!=typeof e&&(e=e(...Bt));const t=new RegExp(`fn\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*->\\s*(${ht}|${pt})\\s*{((.|\\n)+)}\\s*$`),r=e.match(t);if(r){const e=r[1],t=r[2].split(",").map(e=>{const t=e.split(":");return{name:t[0].trim(),type:t[1].trim()}});if(2!==t.length||t[0].type!==r[3]||t[1].type!==dt)throw new Error(`Invalid modifier function. Invalid signature types (arg1: ${t[0]?.type}, arg2: ${t[1]?.type})`);const i=r[4].trim();return{name:e,args:t.map(e=>e.name),body:i}}throw new Error(`Invalid modifier function. Must be a valid WGSL function with the signature: fn name(arg1: ${ht}|${pt}, arg2: ${dt}) -> ${ht}|${pt}`)}const St={outputNormalLocation:0,outputVertexLocation:1,outputUvLocation:2,outputVertexIndexLocation:3,outputInstanceIndexLocation:5,outputRayLocation:4,inputPositionLocation:0,inputNormalLocation:1,inputUvLocation:2,uniformViewBindingIndex:0,uniformViewGroupIndex:0,uniformWorldBindingIndex:0,uniformWorldGroupIndex:1,uniformInteractionBindingIndex:1,uniformInteractionGroupIndex:0};const kt={inputPositionLocation:0,outputInstanceIndexLocation:0,outputVertexIndexLocation:1,storagePositionsGroupIndex:2,storagePositionsBindingIndex:0,uniformDimensionsGroupIndex:2,uniformDimensionsBindingIndex:1,uniformViewGroupIndex:0,uniformViewBindingIndex:0,uniformWorldGroupIndex:1,uniformWorldBindingIndex:0};function Ot(e){return`struct ${pt} {\n @builtin(position) position : vec4f, // clip space position\n @location(${e.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n @location(${e.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\n}`}function Gt(e=2){return`struct ColorPicker {\n id: u32,\n };\n\n @group(${e}) @binding(0) var<uniform> colorPicker: ColorPicker;\n\n @fragment\n fn main(@builtin(position) position: vec4f) -> @location(0) u32 {\n return colorPicker.id;\n }\n `}const Dt={uv:"uv"};const $t={normal:"normal",inputColor:"white"};function It(e,r,i){const n=`directional_${t.Utils.uniqueCode()}`,s=t.Utils.extend({},$t,e),o=s.inputColor,a=s.outputColor,l=s.normal??"normal";if(t.Utils.isNullOrEmpty(o))throw new Error("Must provide input vertex color parameter name.");return{definitions:["struct DirectionalLight {\n color: vec4f,\n direction: vec3f,\n intensity: f32\n}","fn computeDirectional(normal: vec3f, color: vec4f, light: DirectionalLight) -> vec4f {\n let n = normalize(normal);\n let d = normalize(light.direction);\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\n let output = color.rgb * light.color.rgb * factor;\n return vec4f(output, color.a);\n}"],bindings:[`@group(${r}) @binding(${i}) var<uniform> ${n}: DirectionalLight;`],modifiers:a?[`${a} += computeDirectional(${l}, ${o}, ${n});`]:[`computeDirectional(${l}, ${o}, ${n})`]}}const zt={normal:"normal",position:"vertex",ray:"ray",inputColor:"white",specularColor:"empty",shininess:"0"};function Wt(e,r,i){const n=`omni_${t.Utils.uniqueCode()}`,s=t.Utils.extend({},zt,e),o=s.inputColor,a=s.outputColor,l=s.normal,c=s.ray,u=s.position,h=s.shininess,p=s.specularColor;if(t.Utils.isNullOrEmpty(o))throw new Error("Must provide input vertex color parameter name.");return{definitions:["struct OmniLight {\n color: vec4f,\n position: vec3f,\n intensity: f32\n}","fn computeOmni(position: vec3f, normal: vec3f, ray: vec3f, color: vec4f, specularColor: vec4f, shininess: f32, light: OmniLight) -> vec4f {\n\n // color\n let n = normalize(normal);\n let d = normalize(position - light.position);\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\n\n // specular\n let r = normalize(ray);\n let halfVector = normalize(d + r);\n let specular = specularColor.rgb * shininess * dot(n, -halfVector);\n\n let output = color.rgb * light.color.rgb * factor + specular;\n return vec4f(output, color.a);\n}"],bindings:[`@group(${r}) @binding(${i}) var<uniform> ${n}: OmniLight;`],modifiers:a?[`${a} += computeOmni(${u}, ${l}, ${c}, ${o}, ${p}, ${h}, ${n});`]:[`computeOmni(${u}, ${l}, ${c}, ${o}, ${p}, ${h}, ${n})`]}}function jt(e,r,i){const n=`ambient_${t.Utils.uniqueCode()}`,s=e.inputColor,o=e.outputColor;if(t.Utils.isNullOrEmpty(s)||t.Utils.isNullOrEmpty(o))throw new Error("Must provide either input and output vertex color parameter names.");return{definitions:["struct AmbientLight {\n color: vec4f,\n intensity: f32\n}","fn computeAmbient(color: vec4f, light: AmbientLight) -> vec4f {\n return vec4f(light.intensity * color.rgb * light.color.rgb, color.a);\n}"],bindings:[`@group(${r}) @binding(${i}) var<uniform> ${n}: AmbientLight;`],modifiers:[`${o} = computeAmbient(${s}, ${n});`]}}const Vt=r.Geometry.LinearAlgebra.Vector3D,Ht=r.Geometry.LinearAlgebra.Matrix3D,Ft={width:1,height:1};class Xt{static create(e){if(y(e))return new Jt(e);if(v(e))return new qt(e);throw new TypeError(`Camera type '${e.type}' not supported.`)}}function Yt(e,t,r){const i=Vt.subtract(t,e),n=Vt.cross(r,i),s=Vt.cross(i,n);Vt.normalize(n),Vt.normalize(i),Vt.normalize(s);const o=-Vt.dot(n,e),a=-Vt.dot(s,e),l=-Vt.dot(i,e);return Ht.from(n.x,s.x,i.x,0,n.y,s.y,i.y,0,n.z,s.z,i.z,0,o,a,l,1)}function Zt(e,t){if(e<=0)throw new RangeError("Near plane distance must be positive.");if(t<=e)throw new RangeError("Far plane distance must be greater than near plane distance.")}class qt{constructor(e){this._camera=e}static view(e){return Yt(e.position,e.lookAt,e.up)}static projection(e,t=Ft){const r=e.position,i=e.lookAt,n=Vt.subtract(i,r);Vt.normalize(n);const s=Vt.dot(n,r),{height:o,width:a}=t,l=.5*s,c=l*(a/o),u=l,h=e.top*u,p=e.bottom*u,d=e.right*c;return function(e,t,r,i,n=.1,s=1e3){return Zt(n,s),Ht.from(2/(t-e),0,0,0,0,2/(r-i),0,0,0,0,1/(n-s),0,(e+t)/(e-t),(r+i)/(i-r),n/(n-s),1)}(e.left*c,d,h,p,e.near,e.far)}view(){return qt.view(this._camera)}projection(e){return qt.projection(this._camera,e)}}class Jt{constructor(e){this._camera=e}static view(e){return Yt(e.position,e.lookAt,e.up)}static projection(e,t=Ft){const r=t.width/t.height/e.aspectRatio;return function(e=120,t=1,r=.1,i=1e3){Zt(r,i);const n=Math.tan(.5*Math.PI*(1-e/180)),s=n/t,o=Number.isFinite(i),a=o?i/(r-i):-1,l=o?i*r/(r-i):-r;return Ht.from(s,0,0,0,0,n,0,0,0,0,a,-1,0,0,l,0)}(e.fov,r,e.near,e.far)}view(){return Jt.view(this._camera)}projection(e){return Jt.projection(this._camera,e)}}const Qt=r.Geometry.LinearAlgebra.Vector3D,Kt=r.Geometry.LinearAlgebra.Matrix3D;function er(e,t){throw"function"==typeof t&&(t=t.name),new RangeError(`Buffer '${e}' not available for ${t}.`)}function tr(e,r,...i){if(e.stage??=r?.item.stage,C(e))return e.key??="group_"+t.Utils.uniqueCode(),new lr(e,r,...i);if(x(e))return e.key??="mesh_"+t.Utils.uniqueCode(),new dr(e,r,...i);if(g(e))return e.key??="camera_"+t.Utils.uniqueCode(),new cr(e);if(b(e))return e.key??="light_"+e.type+"_"+t.Utils.uniqueCode(),new mr(e);throw new Error("Renderable is not supported.")}class rr{constructor(e){this._set=e}get items(){return this._set}loop(e){const{meshes:t,cameras:r,groups:i,lights:n}=this._set,s=r[0];let o=!1,a=!1;for(let r of t){if(r.disposed)continue;e(r,s,n)&&(nr.clearFlags(r),o||(nr.clearFlags(s),o=!0),a||(n.forEach(e=>nr.clearFlags(e)),a=!0))}for(let e of i)nr.clearFlags(e)}}class ir{static create(e){if(_(e))return e.key??="geometry_"+t.Utils.uniqueCode(),new ur(e);if(j(e))return new hr(e);if(U(e))return new pr(e);throw new Error("Object is not supported.")}}class nr{static create(e,...t){return tr(e,null,...t)}static clearFlags(e,r=!1){if(e.item.flags.splice(0),r){const r=e;t.Utils.isNull(r.parent)||nr.clearFlags(r.parent,!0)}}static allFlags(e){const r=e,i=r.parent,n=t.Utils.isNull(i)?[]:nr.allFlags(i);return r.item.flags.union(n)}}class sr{#h;constructor(e){this.#h=e}get item(){return this.#h}#p=!1;lock(){this.#p=!0}unlock(){this.#p=!1;const e=this.#d;for(;e.length>0;){const t=e.shift();this._destroyUnsafe(t)}}#d=[];_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.#d.splice(0)))t&&(this.#p?this.#d.push(t):this._destroyUnsafe(t))}#m=!1;destroy(){this.dispose(),this.#m=!0}get disposed(){return this.#m}}class or extends sr{constructor(e,r){super(e),this.#f=r,this.#g=t.Utils.uniqueId()%4294967295}#g;#f;#y=new Map;get parent(){return this.#f}get id(){return this.#g}allFlags(){const e=this.parent;return this.item.flags.union(e?.allFlags()??[])}buildParentWorldTransform(){let e=Kt.identity(),r=this;for(;!t.Utils.isNull(r.parent);){const t=r.parent.item,i=Kt.translate(t.transformMatrix??Kt.identity(),t.position??Qt.zero());e=Kt.multiply(e,i),r=r.parent}return e}buildWorldTransform(){const e=Kt.translate(this.item.transformMatrix??Kt.identity(),this.item.position??Qt.zero()),t=this.buildParentWorldTransform();return Kt.multiply(e,t)}#v=new Map;version(e){return this.#v.get(e)??0}buffer(e,r){if("u32id"===r){const r=this.#y,{pipeline:i,device:n}=e;if(r.has(i))return t.Utils.extend({fresh:!1},r.get(i));const s=new Uint32Array([this.id]),o=bt.createUniform(n,s,at+"u32id-buffer"),a=t.Utils.extend({buffer:o,value:s,version:performance.now()},{fresh:!0});return this.#y.set(i,a),a}const i=this.specificBuffer(e,r);return this.#v.set(r,i.version),i}}const ar={shader:z.Basic,color:"#c0c0c0",flags:[]};class lr extends or{#n;constructor(e,t,...r){super(e,t),this.#n=e.childRenderables.map(e=>tr(e,this,...r))}get children(){return this.#n}specificBuffer(e,t){return null}texture(e){throw new Error("Method not implemented.")}dispose(){this.#n.forEach(e=>e.destroy())}}class cr extends or{#b=new Map;#x;constructor(e){super(e)}texture(e){throw new Error("Method not implemented.")}specificBuffer(e,r){let i=!1;(this.allFlags().length>0||t.Utils.isNull(this.#x))&&(i=!0,this.#b.clear(),this._rebuildMatrices(e));const{pipeline:n}=e;if(this.#b.has(n)||(i=!0,this.#b.set(n,this.#x)),nr.clearFlags(this),"cameraViewTransform"===r)return t.Utils.extend(this.#x,{fresh:i});er(r,cr)}_rebuildMatrices({device:e,canvas:r}){const i=this.item,n=Xt.create(i),{x:s,y:o,z:a}=i.position,l=n.view(),c=n.projection(r),u=Kt.multiply(l,c),h=new Float32Array(36);if(h.set(Kt.toArray(l),0),h.set(Kt.toArray(u),16),h.set([s,o,a],32),t.Utils.isNull(this.#x)){const t=bt.createUniform(e,h,at+"view-buffer");this.#x={buffer:t,value:h,version:performance.now().roundoff()}}else this.#x.value=h,this.#x.version=performance.now().roundoff()}_destroyView(){this.#b.clear();const e=this.#x;this.#x=null,this.destroySafely(e)}dispose(){this._destroyView()}}class ur extends sr{#_={};#w={positions:!0,normals:!0,uv:!0,packed:!0};#C;constructor(e){super(e),e.flags??=[]}buffer(e,r){const i=this.item.flags??[];(t.Utils.isNull(this.#C)||i.includes(h.Geometry))&&(i.splice(0),this.#_={},this._rebuildGeometryBuffers(e));const n=this.#w,s=this.#C,{pipeline:o}=e,a=this.#_[r]??=new Map,l=!a.has(o),c=e=>(l&&a.set(o,e),e);switch(r){case"geometryPositions":const{positions:e}=s,i=n.positions;return n.positions=!1,t.Utils.extend(c(e),{fresh:i||l});case"geometryNormals":const{normals:o}=s,a=n.normals;return n.normals=!1,t.Utils.extend(c(o),{fresh:a||l});case"geometryTexCoords":const{uv:u}=s,h=n.uv;return n.uv=!1,t.Utils.extend({fresh:h||l},c(u));case"geometry":const{packed:p}=s,d=n.packed;return n.packed=!1,t.Utils.extend(c(p),{fresh:d||l});default:er(r,ur)}}texture(e){throw new Error("Method not implemented.")}_rebuildGeometryBuffers({device:e}){this._destroyBuffers();const r=performance.now(),i=this.item,n=i.key;if(w(i)){const s=i,o=!t.Utils.isNullOrEmpty(s.triangleIndices)?s.triangleIndices.map(e=>s.positions[e]):s.positions,a=2*o.length,l=a+o.length,c=new Float32Array(l),u=new Float32Array(l),h=new Float32Array(a),p=new Float32Array(2*l+a);for(let e=0;e<o.length;e++){const t=2*e,r=3*e,{x:i,y:n,z:a}=o[e],{x:l,y:d,z:m}=s.normals[e],{x:f,y:g}=s.textureCoordinates[e];c.set([i,n,a],r),u.set([l,d,m],r),h.set([f,g],t),p.set([i,n,a,l,d,m,f,g],2*r+t)}const d=bt.create(e,c,at+"meshgeometry-"+n+"-positions-buffer"),m=bt.create(e,u,at+"meshgeometry-"+n+"-normals-buffer"),f=bt.create(e,h,at+"meshgeometry-"+n+"-uvmap-buffer"),g=bt.create(e,p,at+"meshgeometry-"+n+"-buffer");this.#C={packed:{buffer:g,value:p,version:r},positions:{buffer:d,value:c,version:r},normals:{buffer:m,value:u,version:r},uv:{buffer:f,value:h,version:r}},this.#w={positions:!0,normals:!0,uv:!0,packed:!0}}else{const t=new Float32Array(Je.flattenVectorArray(i.positions)),s=bt.createStorage(e,t,at+"nodegeometry-"+n+"-positions-buffer");this.#C={positions:{buffer:s,value:t,version:r},packed:{buffer:s,value:t,version:r}},this.#w={positions:!0,packed:!0}}}_destroyBuffers(){this.#_={};const e=this.#C;t.Utils.isNull(e)||this.destroySafely(e.positions,e.normals,e.uv)}dispose(){this._destroyBuffers()}}class hr extends sr{#_={};#E={};#P;#M=new Map;#R=new Map;constructor(e){super(e),e.flags??=[],-1===e.flags.indexOf(h.Material)&&e.flags.push(h.Material)}buffer(e,r){const i=this.item.flags??[];let n=t.Utils.isNull(this.#P);i.includes(h.Material)&&(this.#_={},i.splice(0),n=!0,this.#R.clear(),this._resetMaterialBuffers());const{pipeline:s}=e,o=this.#_[r]??=new Map;switch(r){case"material":case"line":const i=this._ensureMaterialBuffer(e,r);return i?(o.has(s)||(n=!0,o.set(s,i)),t.Utils.extend(i,{fresh:n})):null;default:er(r,hr)}}_ensureMaterialBuffer(e,t="material"){const r=this.#M;let i=r.get(t);return i||(r.has(t)?null:(i=this.#P?.buffer(e,t),i&&r.set(t,i),i))}_resetMaterialBuffers(){this.#P=Rt.create(this.item),this._destroyBuffers()}texture(e,r="texture"){const i=this.#R;let n=i.get(r),s=!1;if(!n){if(n=this.#P?.texture(e,r),!n)return null;i.set(r,n),s=!0,this.#E={}}const{pipeline:o}=e,a=this.#E[r]??=new Map;return a.has(o)||(s=!0,a.set(o,n)),t.Utils.extend(n,{fresh:s})}dispose(){this._destroyBuffers()}_destroyBuffers(){this.#_={},this.#E={};const e=this.#M.values();this.#M.clear(),this.destroySafely(...e);const t=this.#R.values();this.#R.clear(),t.forEach(e=>e.texture.destroy())}}class pr extends sr{#N={time:0,cursor:{x:0,y:0},resolution:{width:0,height:0}};#U;#_=new Map;constructor(e){super(e),t.Utils.extend(this.#N,e)}buffer(e,t){if("interaction"===t)return this._ensureInteractionBuffer(e);er(t,pr)}texture(e){throw new Error("Method not implemented.")}_ensureInteractionBuffer(e,r="interaction"){const i=this.#N,n=this.item;let s=!this.#U||n.time!==i.time||n.resolution?.width!==i.resolution.width||n.resolution?.height!==i.resolution.height;if(s||t.Utils.isNull(n.cursor)||(s=n.cursor.x!==i.cursor.x||n.cursor.y!==i.cursor.y),s){const t=new Float32Array([n.cursor?.x??0,n.cursor?.y??0,n.resolution.width,n.resolution.height,n.time,0]),r=bt.createUniform(e.device,t,at+"interaction-buffer");this.#U={buffer:r,value:t,version:performance.now()},this.#_.clear()}const{pipeline:o}=e,a=this.#_;return a.has(o)||(s=!0,a.set(o,this.#U)),t.Utils.extend(this.#U,{fresh:s})}_destroyBuffers(){this.#_.clear();const e=this.#U;t.Utils.isNull(e)||this.destroySafely(e)}dispose(){this._destroyBuffers()}}class dr extends or{#C;#T;#L;#B;#A;#w={geometry:!0,material:!0,transform:!0};#S=new Map;constructor(e,t,r,i){super(e,t),e.flags??=[],-1===e.flags.indexOf(h.Geometry)&&e.flags.push(h.Geometry),-1===e.flags.indexOf(h.Material)&&e.flags.push(h.Material),-1===e.flags.indexOf(h.Position)&&-1===e.flags.indexOf(h.Transform)&&e.flags.push(h.Transform),this.#C=r,this.#L=i}texture(e,t){const r=this.#B;return r?.texture(e,t)}specificBuffer(e,r){const i=this.#w,n=this.allFlags();(t.Utils.isNull(this.#A)||n.includes(h.Position)||n.includes(h.Transform))&&(this.#S.clear(),i.transform=!0,this._rebuildWorldMatrices(e)),(t.Utils.isNull(this.#T)||n.includes(h.Geometry))&&(i.geometry=!0,this._ensureGeometryBuffer()),(t.Utils.isNull(this.#B)||n.includes(h.Material))&&(i.material=!0,this._ensureMaterialBuffer()),nr.clearFlags(this);const s=this.#T,o=this.#B;switch(r){case"geometryPositions":case"geometryNormals":case"geometryTexCoords":case"geometry":return s.buffer(e,r);case"material":case"line":return o.buffer(e,r);case"objectWorldTransform":const n=this.#A,a=i.transform;i.transform=!1;const l=this.#S,{pipeline:c}=e,u=!l.has(c);return u&&l.set(c,n),t.Utils.extend(n,{fresh:a||u});default:er(r,dr)}}_ensureGeometryBuffer(){const e=this.#T,r=this.#C,i=this.item.geometry;if(t.Utils.isNull(r))e?.destroy(),this.#T=new ur(i);else{let e=r?.get(i);!1!==e?.disposed&&(e=new ur(i),r.set(i,e)),this.#T=e}}_ensureMaterialBuffer(){const e=this.#B,r=this.#L,i=this.item.material??ar;if(t.Utils.isNull(r))e?.destroy(),this.#B=new hr(i);else{let e=r?.get(i);!1!==e?.disposed&&(e=new hr(i),r.set(i,e)),this.#B=e}}_rebuildWorldMatrices({device:e}){const r=this.item,i=this.buildWorldTransform(),n=Kt.transpose(Kt.invert(i)),s=new Float32Array(28);if(s.set(Kt.toArray(i),0),s.set([n.m11,n.m12,n.m13,0,n.m21,n.m22,n.m23,0,n.m31,n.m32,n.m33,0],16),t.Utils.isNull(this.#A)){const t=bt.createUniform(e,s,at+"mesh-"+r.key+"-worldmatrix-buffer");this.#A={buffer:t,value:s,version:performance.now().roundoff()}}else this.#A.value=s,this.#A.version=performance.now().roundoff()}dispose(){this.#S.clear();const e=this.#A;this.#A=null,this.destroySafely(e);const t=this.#B;this.#B=null,t?.destroy();const r=this.#T;this.#T=null,r?.destroy()}}class mr extends or{#U;#_=new Map;constructor(e){super(e),e.flags.push(h.Light)}_rebuildAmbientLightBuffer({device:t}){const r=this.item,i=new Float32Array(24),{r:n,g:s,b:o,a:a}=e.Colors.parse(r.color??"#fff");i.set([n,s,o,a],0),i.set([r.intensity],4),this.#U={value:i,buffer:bt.createUniform(t,i,at+"ambient-light-buffer"),version:performance.now()}}_rebuildDirectionalLightBuffer({device:t}){const r=this.item,i=new Float32Array(8),{r:n,g:s,b:o,a:a}=e.Colors.parse(r.color??"#fff");i.set([n,s,o,a],0),i.set([r.intensity],7);const l=Qt.subtract(r.position,r.target);i.set([l.x,l.y,l.z],4),this.#U={value:i,buffer:bt.createUniform(t,i,at+"directional-light-buffer"),version:performance.now()}}_rebuildOmniLightBuffer({device:t}){const r=this.item,i=new Float32Array(8),{r:n,g:s,b:o,a:a}=e.Colors.parse(r.color??"#fff");i.set([n,s,o,a],0),i.set([r.intensity],7),i.set([r.position.x,r.position.y,r.position.z],4),this.#U={value:i,buffer:bt.createUniform(t,i,at+"omni-light-buffer"),version:performance.now()}}_rebuildLight(e){this.destroySafely(this.#U);const 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,r){const i=this.#_;let n=t.Utils.isNull(this.#U)||this.allFlags().length>0;n&&(i.clear(),this._rebuildLight(e)),nr.clearFlags(this);const{pipeline:s}=e;if(i.has(s)||(n=!0,i.set(s,this.#U)),"light"===r)return t.Utils.extend(this.#U,{fresh:n});er(r,mr)}dispose(){this.#_.clear();const e=this.#U;this.#U=null,this.destroySafely(e)}}const fr=at,gr={multisample:!0,packedVertices:!0,primitive:{topology:"triangle-list",frontFace:"ccw",cullMode:"back"}},yr=e=>{};class vr{static{this._memoizer=new WeakMap}static dispose(e){const r=this._memoizer,i=r.get(e);t.Utils.isNull(i)||(i.clear(),r.delete(e))}static createColorPicking(e,t){const r=vr.create(e,t);return r instanceof wr||r instanceof Er?{frame:r.raycast}:null}static create(e,[r,i,...n],s){const o=vr._memoizer;let a=o.get(e);if(t.Utils.isNull(a)&&o.set(e,a=new Map),t.Utils.isNull(r))throw new Error("Pipeline not implemented, given the provided arguments.");if(x(r.item)){const o=w(r.item.geometry),l=!o&&H(r.item.material);if(!o&&!l)throw new Error("Pipeline not implemented, given the provided mesh argument.");const c=o?new xr(r,i,...n):new Cr(r,i),u=c.key+(s?.modifiers?.version??""),h=a.get(u);if(h)return h;const p=o?new wr(e,c):new Er(e,c);p.build(s);const d=p;return t.Utils.extend(d,{id:u+"-"+e.canvas.width+"x"+e.canvas.height+"-"+t.Utils.Dates.now().toISOString()}),a.set(u,d),d}throw new ReferenceError("Pipeline not implemented, given thst the first argument is not a mesh.")}}class br{constructor(){this.#k=new Map}#k;ensureBindGroup({device:e},r,i,n,s,o,a=()=>{}){const l=this.#k,c="string"==typeof r?r:r.key;let u=l.get(c);if(t.Utils.isNull(u)&&l.set(c,u=new Map),n||!u.has(o)){const t=i.map((e,t)=>({binding:t,resource:{buffer:e}})),r={label:o,layout:s,entries:t};a(r);const n=e.createBindGroup(r);return u.set(o,n),n}return u.get(o)}}class xr{#O=[];#G;#D;#$=new Map;#I={shader:"basic",lights:""};constructor(...e){this.add(...e)}reset(){this.#O.splice(0),this.#G=null,this.#$.clear(),this.#I={shader:"basic",lights:""}}add(...e){for(let r of e??[])if(x(r.item)){if(!t.Utils.isNull(this.#G))throw new Error("Mesh already added.");{this.#G=r;const e=r.item.material??{shader:z.Basic};this.#I.shader=e.shader+"-"+(e.map?"map":"nomap")}}else if(b(r.item)){this.#O.push(r),this.#I.lights+="-"+r.item.type}else{if(!g(r.item))throw new Error("Unknown object type.");this.#D??=r}}build(e){const t=this._computeBasicData(),r=this.key;return{vertex:this.vertex({inputModifier:e?.vertexInput,outputModifier:e?.vertexOutput}),fragment:this.fragment(t,{modifier:e?.fragment}),key:r,bindings:(...e)=>xr.prototype.bindgroup.apply(this,e),metadata:{lightCount:this.#O.length,mapCount:this.#G.item.material?.map?1:0}}}get key(){const{shader:e,lights:t}=this.#I;return"mesh-"+e+t}bindgroup(e,r,i){const n=this.#$.get(e);if(t.Utils.isNull(n))return null;if(t.Utils.isNullOrEmpty(r))return n;const s=n.filter(e=>e.key===r);return isNaN(i)?s:i>=0&&i<n.length?s[i]:s}vertex(e){return function(e=St){e!=St&&(e=t.Utils.extend({},St,e));const r=e.inputModifier;let i="vertexInput",n="";if(!t.Utils.isNullOrEmpty(r)){const{name:e,args:[t,s],body:o}=At(r);i=`${e}(vertexInput, interaction)`,n=`fn ${e} (${t}: ${ht}, ${s}: ${dt}) -> ${ht} {\n ${o}\n}`}const s=e.outputModifier;let o="output",a="";if(!t.Utils.isNullOrEmpty(s)){const{name:e,args:[t,r],body:i}=At(s);o=`${e}(output, interaction)`,a=`fn ${e} (${t}: ${ht}, ${r}: ${dt}) -> ${pt} {\n ${i}\n}`}const l=t.Utils.extend({},St,e);return`struct ${pt} {\n @builtin(position) position : vec4f, // clip space position\n @location(${l.outputNormalLocation}) normal: vec3f, // world space normal\n @location(${l.outputVertexLocation}) vertex : vec3f, // world space position\n @location(${l.outputUvLocation}) uv : vec2f, // texture coordinates\n @location(${l.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\n @location(${l.outputRayLocation}) ray : vec3f, // eye-to-point vector in world space\n @location(${l.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n}\n\nstruct ${ht} {\n @location(${l.inputPositionLocation}) position: vec3f,\n @location(${l.inputNormalLocation}) normal: vec3f,\n @location(${l.inputUvLocation}) uv: vec2f,\n @builtin(vertex_index) index: u32,\n @builtin(instance_index) instance: u32,\n}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f,\n}\n\nstruct ${dt} {\n // mouse coordinatges in NDC space ([-1,1], [-1,1])\n cursor: vec2f,\n // canvas size in pixels\n resolution: vec2f,\n // some phase timer (e.g. time since mouse down, or time since last click, etc.)\n time: f32,\n}\n\n${n}\n\n${a}\n\n@group(${l.uniformWorldGroupIndex}) @binding(${l.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${l.uniformViewGroupIndex}) @binding(${l.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${l.uniformInteractionGroupIndex}) @binding(${l.uniformInteractionBindingIndex}) var<uniform> interaction: ${dt};\n\n@vertex fn main(vertexInput: ${ht}) -> ${pt} {\n let input = ${i};\n let position4 = vec4f(input.position, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n let worldPosition = (worldTransform * position4).xyz;\n let output = ${pt}(\n worldViewProjectionTransform * position4,\n transforms.normal * input.normal,\n worldPosition,\n input.uv,\n input.index,\n normalize(worldPosition - camera.position),\n input.instance\n );\n return ${o};\n}`}(e)}_computeBasicData(){const e=this.#G.item,r=this.#O,i=e.material;return{hasTexture:!t.Utils.isNull(i?.texture),hasLighting:!t.Utils.isNullOrEmpty(r),shader:t.Utils.isNull(e)?z.Basic:e.material?.shader??z.Basic,materialBindGroupIndex:2,lightingBindGroupIndex:3}}_computeBindGroupsAndReferences(e=this._computeBasicData()){const{hasTexture:t,materialBindGroupIndex:r,lightingBindGroupIndex:i}=e,n=this.#$,s=this.#O,o={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},a={key:"material",group:r,binding:0,type:"buffer"};t?n.set(vt.Mesh,[o,a,{key:"texture",group:r,type:"texture"}]):n.set(vt.Mesh,[o,a]),n.set(vt.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}]);const l=s.map((e,t)=>({key:"light",group:i,binding:t,type:"buffer"}));l.push(...l),n.set(vt.Interaction,[{key:"interaction",group:0,type:"buffer",binding:1}])}fragment(e=this._computeBasicData(),r){this._computeBindGroupsAndReferences(e);const i={definitions:[],bindings:[],modifiers:[]},n=e=>{for(let t of e.definitions??[])-1===i.definitions.indexOf(t)&&i.definitions.push(t);t.Utils.isNullOrEmpty(e.bindings)||i.bindings.push(...e.bindings),t.Utils.isNullOrEmpty(e.modifiers)||i.modifiers.push(...e.modifiers)};if(e.shader===z.Basic){if(e.hasTexture){const r=e.materialBindGroupIndex;n(function(e=Dt,r,i=1){const n=t.Utils.uniqueCode(),s=`sampler_${n}`,o=`tex_${n}`,a=t.Utils.extend({},Dt,e),l=a.inputColor,c=a.outputColors;if(t.Utils.isNullOrEmpty(l))throw new Error("Must provide either input and output vertex color parameter names.");const u=c?c.map((e,t)=>0===t?`${e} = textureSample(${o}, ${s}, ${a.uv}) * ${l};`:`${e} = ${c[0]};`):[`textureSample(${o}, ${s}, ${a.uv}) * ${l}`];return{bindings:[`@group(${r}) @binding(${i}) var ${s}: sampler;`,`@group(${r}) @binding(${i+1}) var ${o}: texture_2d<f32>;`],modifiers:u}}({inputColor:lt,outputColors:[lt],uv:"uv"},r))}let s=0;const o=this.#O;for(let t of o){switch(t.item.type){case"direction":n(It({outputColor:ut,normal:"normal"},e.lightingBindGroupIndex,s));break;case"omni":n(Wt({outputColor:ut,normal:"normal",position:"vertex"},e.lightingBindGroupIndex,s));break;case"ambient":n(jt({inputColor:lt,outputColor:ct},e.lightingBindGroupIndex,s))}s++}return Tt.fragment(i,r)}}}const _r=(e,t)=>{t.fresh&&e.queue.writeBuffer(t.buffer,0,t.value)};class wr{constructor(e,t,r=new br){this._context=e,this._builder=t,this._cache=r,this._ensureU32idBindGroup=(e,t,r)=>this._cache.ensureBindGroup(this._context,e,[t],r,this._pickBindGroupLayout,fr+"mesh-colorpick-bind-group"),this._ensureMaterialBindGroup=(e,t,r,i,n=2)=>{const s=this._bindGroupLayouts[n],o=fr+"material-bind-group";if(s.label!==fr+"material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");return this._cache.ensureBindGroup(this._context,e,[t],i,s,o,e=>{const{device:t}=this.context,i=e.entries;r&&i.push({binding:1,resource:t.createSampler({addressModeU:"repeat",addressModeV:"repeat",magFilter:"linear",minFilter:"linear"})},{binding:2,resource:r.createView()})})},this._ensureWorldTransformBindGroup=(e,t,r,i=1,n=!1)=>{const s=this._bindGroupLayouts[i];if(s.label!==fr+"mesh-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const o=e.key+"-"+(n?1:0),a=`${fr}${n?"colorpick":"mesh"}-transforms-bind-group`;return this._cache.ensureBindGroup(this._context,o,[t],r,s,a)},this._ensureCameraProjectionAndInteractionDataBindGroup=(e,t,r,i,n=0,s=!1)=>{const o=this._bindGroupLayouts[n],a=e.key+"-"+(s?1:0),l=`${fr}${s?"colorpick":"mesh"}-view-bind-group`;return this._cache.ensureBindGroup(this._context,a,[t,r],i,o,l)},this._ensureLightingBindGroup=(e,t,r=3)=>{const i=this._bindGroupLayouts[r],n=e.map(e=>e.id).join(":"),s=e.map(e=>e.buffer.buffer);return this._cache.ensureBindGroup(this._context,n,s,t,i,fr+"mesh-lighting-bind-group")},this._bindGroupLayouts=[],this._bindVertex=yr,this._bindPicker=yr,this._bindWorldTransform=yr,this._bindRaycastWorldTransform=yr,this._bindCameraProjectionAndInteractionData=yr,this._bindRaycastCameraProjectionAndInteractionData=yr,this._bindLighting=yr,this._bindMaterial=yr,this.set=e=>{throw new Error("Deprecated.")},this.bind=(e,...t)=>{throw new Error("Deprecated.")},this.draw=(e,...t)=>{throw new Error("Deprecated.")},this.frame=(e,t,r,i,...n)=>{e.setPipeline(this._pipeline);try{this._bindVertex(e,r),this._bindWorldTransform(e,r),this._bindMaterial(e,r),this._bindCameraProjectionAndInteractionData(e,i,t),this._bindLighting(e,...n);const s=r.item.geometry;e.draw(s.triangleIndices?.length||s.positions.length)}catch(e){console.error("Pacem.Drawing3D.FrameException",e)}},this.raycast=(e,t,r,i)=>{e.setPipeline(this._pickPipeline);try{this._bindVertex(e,r),this._bindRaycastWorldTransform(e,r),this._bindRaycastCameraProjectionAndInteractionData(e,i,t),this._bindPicker(e,r);const n=r.item.geometry;e.draw(n.triangleIndices.length)}catch(e){}},this._key=t.key}get context(){return this._context}get key(){return this._key}build(e){const r=t.Utils.extend({},gr,e??{}),i=this._builder.build(r.modifiers),n=t.Utils.extend({pipeline:this},this._context),s=n.device,o={module:s.createShaderModule({code:i.vertex}),buffers:r.packedVertices?[xt.createVertex(0,3,3,2)]:[xt.createVertex(0,3),xt.createVertex(1,3),xt.createVertex(2,2)]},a=s.createBindGroupLayout({entries:[{binding:0,visibility:gt.VERTEX|gt.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:gt.VERTEX|gt.FRAGMENT,buffer:{type:"uniform"}}],label:fr+"mesh-view-bind-group-layout"}),l=s.createBindGroupLayout({entries:[{binding:0,visibility:gt.VERTEX,buffer:{type:"uniform"}}],label:fr+"mesh-transforms-bind-group-layout"}),c=[a,l],u={module:s.createShaderModule({code:i.fragment}),targets:[{format:n.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},h=c.length,p=[{binding:0,visibility:gt.FRAGMENT,buffer:{type:"read-only-storage"}}],{mapCount:d}=i.metadata,m=d>0;m&&p.push({visibility:gt.FRAGMENT,binding:1,sampler:{}},...Array(d).keys().map(e=>({visibility:gt.FRAGMENT,binding:2+e,texture:{}})));const f={label:fr+"material-bind-group-layout",entries:p},g=s.createBindGroupLayout(f);c.push(g);const y=c.length,{lightCount:v}=i.metadata,b=v>0;if(b){const e=s.createBindGroupLayout({entries:[...Array(v).keys()].map((e,t)=>({visibility:gt.FRAGMENT,binding:t,buffer:{type:"uniform"}})),label:fr+"lighting-bind-group-layout"});c.push(e)}const x={label:fr+"mesh-render-pipeline",vertex:o,fragment:u,layout:s.createPipelineLayout({label:fr+"mesh-render-pipeline-layout",bindGroupLayouts:this._bindGroupLayouts=c}),primitive:r.primitive};r.multisample&&(x.multisample={count:4},x.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._pipeline=s.createRenderPipeline(x);const _=this._pickBindGroupLayout=s.createBindGroupLayout({label:fr+"mesh-colorpick-bind-group-layout",entries:[{visibility:gt.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),w={label:fr+"mesh-colorpick-pipeline",vertex:o,fragment:{module:s.createShaderModule({code:Gt(2)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:fr+"mesh-colorpick-pipeline-layout",bindGroupLayouts:[a,l,_]}),primitive:r.primitive,depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickPipeline=s.createRenderPipeline(w);this._bindVertex=r.packedVertices?(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${nr.name} bringing vertex buffers was provided.`);const{buffer:s}=i.buffer(n,"geometry");e.setVertexBuffer(0,s)}:(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${nr.name} bringing vertex buffers was provided.`);const{buffer:s}=i.buffer(n,"geometryPositions"),{buffer:o}=i.buffer(n,"geometryNormals"),{buffer:a}=i.buffer(n,"geometryTexCoords");e.setVertexBuffer(0,s),e.setVertexBuffer(1,o),e.setVertexBuffer(2,a)};const C=(e,r,o)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${nr.name} bringing world transform buffer was provided.`);const a=r.buffer(n,"objectWorldTransform"),l=a.buffer;_r(s,a);const{group:c}=i.bindings(vt.Mesh,"objectWorldTransform",0),u=this._ensureWorldTransformBindGroup(r.item,l,a.fresh,c,o);e.setBindGroup(c,u)};this._bindWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!1)},this._bindRaycastWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!0)};const E=(e,r,o,a)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${nr.name} bringing view projection buffers was provided.`);const l=r.buffer(n,"cameraViewTransform"),c=l.buffer;if(_r(s,l),t.Utils.isNull(o))throw new ReferenceError(`Null ${nr.name} bringing interaction buffers was provided.`);const u=o.buffer(n,"interaction"),h=u.buffer;_r(s,u);const{group:p}=i.bindings(vt.Camera,"cameraViewTransform",0),{group:d}=i.bindings(vt.Interaction,"interaction",0);if(p!==d)throw new ReferenceError(`Layout bind group mismatch: ${p} vs ${d}.`);const m=this._ensureCameraProjectionAndInteractionDataBindGroup(r.item,c,h,l.fresh||u.fresh,p,a);e.setBindGroup(p,m)};this._bindCameraProjectionAndInteractionData=(e,...t)=>{const r=t.at(0),i=t.at(1);E(e,r,i,!1)},this._bindRaycastCameraProjectionAndInteractionData=(e,...t)=>{const r=t.at(0),i=t.at(1);E(e,r,i,!0)},this._bindMaterial=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${nr.name} bringing vertex colors was provided.`);const o=i.buffer(n,"material"),a=o.buffer;_r(s,o);let l=i.texture(n);const c=l?.texture,u=this._ensureMaterialBindGroup(i.item,a,c,o.fresh,h);e.setBindGroup(h,u),m&&s.queue.copyExternalImageToTexture({source:l.source,flipY:!0},{texture:c},{width:c.width,height:c.height})},this._bindLighting=(e,...t)=>{if(b){const r=Array.from(t).map(e=>({buffer:e.buffer(n,"light"),id:e.item.key})),i=r.some(e=>e.buffer.fresh),o=this._ensureLightingBindGroup(r,i,y);for(let e of r)_r(s,e.buffer);e.setBindGroup(y,o)}},this._bindPicker=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${nr.name} bringing world transform buffer was provided.`);const o=i.buffer(n,"u32id"),a=o.buffer;_r(s,o);const l=o.fresh,c=this._ensureU32idBindGroup(i.item,a,l);e.setBindGroup(2,c)}}}class Cr{#z;#D;#$=new Map;constructor(...e){this.add(...e)}reset(){this.#z=null,this.#$.clear()}add(...e){for(let r of e??[])if(x(r.item)){if(!t.Utils.isNull(this.#z))throw new Error("Line already added.");this.#z=r}else if(g(r.item))this.#D??=r;else if(!b(r.item))throw new Error("Unknown object type.")}build(){const e=this._computeBasicData(),t=this.key;return{vertex:this.vertex(e),fragment:this.fragment(e),key:t,bindings:(...e)=>Cr.prototype.bindgroup.apply(this,e),metadata:{thickness:e.thickness,dashPattern:e.dashPattern}}}get key(){const e=(this.#z?.item).material?.lineWidth>1;return z.Line+(e?"-fat":"")}bindgroup(e,r,i){const n=this.#$.get(e);if(t.Utils.isNull(n))return null;if(t.Utils.isNullOrEmpty(r))return n;const s=n.filter(e=>e.key===r);return isNaN(i)?s:i>=0&&i<n.length?s[i]:s}vertex(e=this._computeBasicData()){return e.thickness>1?function(e=kt){const r=t.Utils.extend({},kt,e);return`${Ot(r)}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f\n}\n\nstruct Pixels {\n viewportWidth: f32,\n viewportHeight: f32,\n halfLineWidth: f32\n}\n\n@group(${r.uniformWorldGroupIndex}) @binding(${r.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${r.uniformViewGroupIndex}) @binding(${r.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${r.storagePositionsGroupIndex}) @binding(${r.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\n@group(${r.uniformDimensionsGroupIndex}) @binding(${r.uniformDimensionsBindingIndex}) var<uniform> dimensions: Pixels;\n\nfn computeClipPosition(index: u32) -> vec4f {\n let x = positions[3u * index + 0u];\n let y = positions[3u * index + 1u];\n let z = positions[3u * index + 2u];\n let position4 = vec4f(x, y, z, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n return worldViewProjectionTransform * position4;\n}\n\nfn computeOffsetPosition(p0: vec4f, p1: vec4f, index: u32) -> vec4f {\n\n let viewportSize = vec2f(dimensions.viewportWidth, dimensions.viewportHeight);\n let normalizedSize = normalize(viewportSize);\n let halfThickness = dimensions.halfLineWidth / dimensions.viewportWidth;\n let p0ndc = p0.xyz / p0.w;\n let p1ndc = p1.xyz / p1.w;\n let dir = normalize((p1ndc - p0ndc).xy);\n let offsetX = halfThickness * 2.0 / normalizedSize.x;\n let offsetY = halfThickness * 2.0 / normalizedSize.y;\n\n // perp\n let perp0 = vec2f(-dir.y * offsetX, dir.x * offsetY);\n let perp1 = perp0;\n\n /*\n\n position0-0 -----*----- position0-1\n |\\ |\n | \\ |\n | \\ |\n | \\ |\n | \\ |\n | \\ |\n | \\ |\n | \\|\n position1-0 -----*----- position1-1\n\n indexes:\n ------------\n p0-0 -> 0, 3\n p0-1 -> 5\n p1-0 -> 1\n p1-1 -> 2, 4\n */\n\n var outPos: vec2f;\n var w = p0.w;\n var z = p0.z;\n if (index == 0 || index == 3){\n outPos = p0ndc.xy - perp0;\n }\n else if (index == 1){\n outPos = p1ndc.xy - perp1;\n w = p1.w;\n z = p1.z;\n }\n else if (index == 5){\n outPos = p0ndc.xy + perp0;\n }\n else { //if (index == 2 || index == 4)\n outPos = p1ndc.xy + perp1;\n w = p1.w;\n z = p1.z;\n }\n\n // return vec4f(outPos , 0, 1.0);\n return vec4f(outPos * w, z, w);\n}\n\n@vertex fn main(@builtin(instance_index) instance: u32,\n @builtin(vertex_index) index: u32) -> ${pt} {\n\n // vertex index starting at 1\n let position0 = computeClipPosition(instance);\n let position1 = computeClipPosition(instance + 1);\n\n // apply offset\n let position = computeOffsetPosition(position0, position1, index);\n\n return ${pt}(\n position,\n instance,\n index\n );\n}`}():function(e=kt){const r=t.Utils.extend({},kt,e);return`${Ot(r)}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f\n}\n\n@group(${r.uniformWorldGroupIndex}) @binding(${r.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${r.uniformViewGroupIndex}) @binding(${r.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${r.storagePositionsGroupIndex}) @binding(${r.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\n\n@vertex fn main(@builtin(instance_index) instance: u32,\n @builtin(vertex_index) index: u32) -> ${pt} {\n\n let x = positions[3u * index + 0u];\n let y = positions[3u * index + 1u];\n let z = positions[3u * index + 2u];\n let position4 = vec4f(x, y, z, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n let worldPosition = (worldTransform * position4).xyz;\n return ${pt}(\n worldViewProjectionTransform * position4,\n instance,\n index);\n}`}()}_computeBasicData(){const e=this.#z.item,r=t.Utils.isNull(e)?z.Line:e.material?.shader??z.Line,i=e.material,n=i?.lineWidth??1,s=i?.dashArray;return{shader:r,thickness:n,dashPattern:s}}_computeBindGroupsAndReferences(e=this._computeBasicData()){const t=this.#$,r={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},i={key:"material",group:3,binding:0,type:"buffer"},n={key:"geometryPositions",group:2,binding:0,type:"buffer"},s={key:"line",group:2,binding:1,type:"buffer"};t.set(vt.Mesh,[r,i,n,s]),t.set(vt.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}])}fragment(e=this._computeBasicData()){this._computeBindGroupsAndReferences(e);const t={definitions:[],bindings:[],modifiers:[]};if(e.shader===z.Line)return Lt.fragment(t)}}class Er{#W;constructor(e,t,r=new br){this._lineBuilder=t,this._cache=r,this._ensureLineU32idBindGroup=(e,t,r)=>{const i=this.context;return this._cache.ensureBindGroup(i,e,[t],r,this._pickLineBindGroupLayout,fr+"line-colorpick-bind-group")},this._ensureLineMaterialBindGroup=(e,t,r,i=2)=>{const n=this._bindLineGroupLayouts[i];if(n.label!==fr+"line-material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const s=this.context;return this._cache.ensureBindGroup(s,e,[t],r,n,fr+"line-material-bind-group")},this._ensureLinePositionsBindGroup=(e,t,r,i)=>{const n=this._bindLineGroupLayouts[i];if(n.label!==fr+"line-positions-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const s=this.context;return this._cache.ensureBindGroup(s,e,t,r,n,fr+"line-positions-bind-group")},this._ensureLineWorldTransformBindGroup=(e,t,r,i=1,n=!1)=>{const s=this._bindLineGroupLayouts[i];if(s.label!==fr+"line-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const o=e.key+"-line-"+(n?1:0),a=`${fr}${n?"colorpick":""}-line-transforms-bind-group`,l=this.context;return this._cache.ensureBindGroup(l,o,[t],r,s,a)},this._ensureLineCameraProjectionBindGroup=(e,t,r,i=0,n=!1)=>{const s=this._bindLineGroupLayouts[i],o=e.key+"-line-"+(n?1:0),a=`${fr}${n?"colorpick":""}-line-view-bind-group`,l=this.context;return this._cache.ensureBindGroup(l,o,[t],r,s,a)},this._bindLineGroupLayouts=[],this._bindLinePositions=yr,this._bindLinePicker=yr,this._bindLineWorldTransform=yr,this._bindLineRaycastWorldTransform=yr,this._bindLineCameraProjection=yr,this._bindLineRaycastCameraProjection=yr,this._bindLineMaterial=yr,this._drawLine=yr,this.set=e=>{throw new Error("Deprecated.")},this.bind=(e,...t)=>{throw new Error("Deprecated.")},this.draw=(e,...t)=>{throw new Error("Deprecated.")},this.frame=(e,t,r)=>{e.setPipeline(this._linePipeline);try{this._bindLineWorldTransform(e,t),this._bindLineCameraProjection(e,r),this._bindLinePositions(e,t),this._bindLineMaterial(e,t),this._drawLine(e,t)}catch(e){console.error("Pacem.Drawing3D.FrameException",e)}},this.raycast=(e,t,r)=>{e.setPipeline(this._pickLinePipeline);try{this._bindLineRaycastWorldTransform(e,t),this._bindLineRaycastCameraProjection(e,r),this._bindLinePositions(e,t),this._bindLinePicker(e,t),this._drawLine(e,t)}catch(e){}},this.#W=e,this._lineKey=t.key}get context(){return this.#W}get key(){return this._lineKey}build(e){const r=t.Utils.extend({},gr,e??{}),i=this._lineBuilder.build(),n=t.Utils.extend({pipeline:this},this.#W),s=n.device,o=i.metadata.thickness>1,a={module:s.createShaderModule({code:i.vertex}),buffers:[]},l=s.createBindGroupLayout({entries:[{binding:0,visibility:gt.VERTEX,buffer:{type:"uniform"}}],label:fr+"line-transforms-bind-group-layout"}),c=s.createBindGroupLayout({entries:[{binding:0,visibility:gt.VERTEX,buffer:{type:"uniform"}}],label:fr+"line-view-bind-group-layout"}),u=[{binding:0,visibility:gt.VERTEX,buffer:{type:"read-only-storage"}}];o&&u.push({binding:1,visibility:gt.VERTEX,buffer:{type:"uniform"}});const h=[l,c,s.createBindGroupLayout({entries:u,label:fr+"line-positions-bind-group-layout"})],p=h.length,d=h.slice(),m={module:s.createShaderModule({code:i.fragment}),targets:[{format:n.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},f=d.length,g=[{binding:0,visibility:gt.FRAGMENT,buffer:{type:"read-only-storage"}}],y={label:fr+"line-material-bind-group-layout",entries:g},v=s.createBindGroupLayout(y);d.push(v);const b=o?r.primitive.topology:"line-list",x={label:fr+"line-render-pipeline",vertex:a,fragment:m,layout:s.createPipelineLayout({label:fr+"line-render-pipeline-layout",bindGroupLayouts:this._bindLineGroupLayouts=d}),primitive:t.Utils.extend({},r.primitive,{topology:b})};r.multisample&&(x.multisample={count:4},x.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._linePipeline=s.createRenderPipeline(x);const _=this._pickLineBindGroupLayout=s.createBindGroupLayout({label:fr+"line-colorpick-bind-group-layout",entries:[{visibility:gt.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),w={label:fr+"line-colorpick-pipeline",vertex:a,fragment:{module:s.createShaderModule({code:Gt(p)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:fr+"line-colorpick-pipeline-layout",bindGroupLayouts:h.concat(_)}),primitive:t.Utils.extend({},r.primitive,{topology:b}),depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickLinePipeline=s.createRenderPipeline(w);const C=(e,r,o)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${nr.name} bringing world transform buffer was provided.`);const a=r.buffer(n,"objectWorldTransform"),l=a.buffer;_r(s,a);const{group:c}=i.bindings(vt.Mesh,"objectWorldTransform",0),u=this._ensureLineWorldTransformBindGroup(r.item,l,!1,c,o);e.setBindGroup(c,u)};this._bindLineWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!1)},this._bindLineRaycastWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!0)};const E=(e,r,o)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${nr.name} bringing view projection buffers was provided.`);const a=r.buffer(n,"cameraViewTransform"),l=a.buffer;_r(s,a);const{group:c}=i.bindings(vt.Camera,"cameraViewTransform",0),u=this._ensureLineCameraProjectionBindGroup(r.item,l,!1,c,o);e.setBindGroup(c,u)};this._bindLineCameraProjection=(e,...t)=>{const r=t.at(0);E(e,r,!1)},this._bindLineRaycastCameraProjection=(e,...t)=>{const r=t.at(0);E(e,r,!0)},this._bindLinePositions=(e,...r)=>{const a=r.at(0);if(t.Utils.isNull(a))throw new ReferenceError(`Null ${nr.name} bringing vertex buffers was provided as index 0.`);const l=a.buffer(n,"geometryPositions"),c=l.buffer;let u=l.fresh;const h=[c];if(_r(s,l),o){const e=a.buffer(n,"line"),t=e.buffer;u||=e.fresh,h.push(t),_r(s,e)}const{group:p}=i.bindings(vt.Mesh,"line",0),d=this._ensureLinePositionsBindGroup(a.item,h,u,p);e.setBindGroup(p,d)},this._bindLineMaterial=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${nr.name} bringing vertex colors was provided.`);const o=i.buffer(n,"material"),a=o.buffer;_r(s,o);const l=this._ensureLineMaterialBindGroup(i.item,a,o.fresh,f);e.setBindGroup(f,l)},this._bindLinePicker=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${nr.name} bringing world transform buffer was provided.`);const o=i.buffer(n,"u32id"),a=o.buffer;o.value,_r(s,o);const l=this._ensureLineU32idBindGroup(i.item,a,!1);e.setBindGroup(p,l)},this._drawLine=(e,...t)=>{const r=t.at(0).item.geometry;o?e.draw(6,r.positions.length-1,0,0):e.draw(r.positions.length)}}}class Pr{static{this._memoizer=new WeakMap}static dispose(e){const t=this._memoizer;if(t.has(e)){const r=t.get(e);for(let e of r.values())e.destroy();r.clear(),t.delete(e)}}static createColorPicking(e){const t=this._memoizer;t.has(e)||t.set(e,new Map);const r=t.get(e),i="colorpick";if(r.has(i))return r.get(i);const n=new Mr(e);return r.set(i,n),n}}class Mr{constructor(e){this._context=e,this._objects=new Map,this.frame=(e,...r)=>{if(t.Utils.isNull(this._encoder))throw new Error("Null encoder. Maybe you missed to call the 'begin' method first.");const i=Array.from(r),n=vr.createColorPicking(this._context,i);n?.frame(this._pass,e,...r);for(let e of i){e.item.inert||this._objects.set(e.id,e)}},this.end=e=>{if(!t.Utils.isNull(this._handle))return this._handle;const r=this._pass,i=this._encoder,{device:n}=this._context,{render:s}=this._textures,o=s.texture,a=this._ensureBuffer();r.end(),i.copyTextureToBuffer({texture:o,origin:{x:e.x,y:e.y}},{buffer:a,bytesPerRow:66304,rowsPerImage:1},{width:1}),n.queue.submit([i.finish()]),this._encoder=null;const l=this,c=l._objects;return this._handle=new Promise((e,t)=>{a.mapAsync(yt.READ,0,4).then(t=>{const r=new Uint32Array(a.getMappedRange(0,4))[0];a.unmap(),l._handle=null;const i=c.get(r);e(i?[i.item]:[])})})}}_createTexture(e){const{device:t,canvas:r}=this._context,i=Math.min(t.limits.maxTextureDimension2D,r.clientWidth),n=Math.min(t.limits.maxTextureDimension2D,r.clientHeight);return t.createTexture({size:[i,n,1],format:e,usage:ft.COPY_SRC|ft.RENDER_ATTACHMENT})}_ensureBuffer(){const e=this._buffer;if(!t.Utils.isNull(e))return e;const{device:r}=this._context;return this._buffer=r.createBuffer({label:at+"colorpick-output-buffer",size:4,usage:mt.MAP_READ|mt.COPY_DST})}_ensureTextures(){const e=this._textures;if(!t.Utils.isNull(e))return e;const r=this._createTexture("r32uint"),i=this._createTexture("depth24plus"),n={texture:r,view:r.createView()},s={texture:i,view:i.createView()};return this._textures={render:n,depth:s}}_destroyTexture(e){t.Utils.isNull(e)||e.texture?.destroy()}destroy(){const e=this._textures,r=this._buffer;if(!t.Utils.isNullOrEmpty(e)){const{render:t,depth:r}=e;this._destroyTexture(t),this._destroyTexture(r),this._textures=null}t.Utils.isNull(r)||(r.destroy(),this._buffer=null)}begin(){const{device:e}=this._context;this._encoder=e.createCommandEncoder({label:at+"colorpick-raycaster"});const{render:t,depth:r}=this._ensureTextures(),i={label:at+"colorpick-raycaster-pass",colorAttachments:[{view:t.view,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:r.view,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}};this._pass=this._encoder.beginRenderPass(i),this._objects.clear()}}const Rr=r.Geometry.LinearAlgebra.Vector3D;var Nr;!function(e){e[e.NotSupported=0]="NotSupported",e[e.Disabled=1]="Disabled"}(Nr||(Nr={}));class Ur{static create(e,t){return new Promise((r,i)=>{if(navigator.gpu){const n=new Tr(e);n.init(t).then(e=>r(n),e=>{const t={message:"string"==typeof e?e:e.message,cause:Nr.Disabled};i(t)})}else{const e={message:"WebGPU not supported.",cause:Nr.NotSupported};i(e)}})}}class Tr{#j;#V;#W;#H;#F;#X;#Y;#R;#Z;#q;#J;#Q;constructor(e){this.#H=new WeakMap,this.#F=new WeakMap,this.#X=new WeakMap,this.#Z={enableValidation:!1},this.#q=!1,this._logError=e=>{const r=this.#j.logger;if(!t.Utils.isNull(r)){const i="error"in e?e.error:e;r.log(t.Logging.LogLevel.Error,i.message,"WebGPU")}},this.#K=!0,this.#ee=!1;const r=(this.#j=e).stage,i=document.createElement("canvas");i.id=t.P+"_3d_stage_"+t.Utils.uniqueCode(),r.innerHTML="",r.appendChild(this.#V=i),this.#J=ir.create(this.#Q={time:performance.now(),cursor:{x:0,y:0},resolution:{width:0,height:0}})}_buildPassDescriptor({multisample:r,format:i}){const{context:n,device:s}=this.#W,o=n.getCurrentTexture();let a=this.#R;if(t.Utils.isNull(a)){if(a={},r){const e=s.createTexture({label:at+"render-texture",format:i??o.format,usage:ft.RENDER_ATTACHMENT,size:[o.width,o.height],sampleCount:4});a.render={texture:e,view:e.createView({label:at+"render-texture-view"})};const t=s.createTexture({label:at+"depth-texture",format:"depth24plus",usage:ft.RENDER_ATTACHMENT,size:[o.width,o.height],sampleCount:4});a.depth={texture:t,view:t.createView({label:at+"depth-texture-view"})}}this.#R=a}const{transparent:l,background:c}=this.#j,u=l?{r:0,g:0,b:0,a:0}:c?"string"==typeof c?e.Colors.parse(c):c:{r:0,g:0,b:0,a:1},h=Je.flattenVectorArray([u]),p=o.createView({label:at+"canvas-texture-view"}),d={view:p,clearValue:h,loadOp:"clear",storeOp:"store"},m={colorAttachments:[d]};if(r){const e=a.render.view,t=a.depth.view;m.depthStencilAttachment={view:t,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store",stencilClearValue:0,stencilReadOnly:!0},d.view=e,d.resolveTarget=p}return m}_buildContext(e=this.#V,t=this.#j.size){t??=e;let r=t.width,i=t.height;e.width=1*r,e.height=1*i;return{context:e.getContext("webgpu"),textureFormat:navigator.gpu.getPreferredCanvasFormat()}}_buildUpContext(e,t,r,i){const{transparent:n}=this.#j;r.configure({alphaMode:n?"premultiplied":"opaque",device:e,format:i}),this.#W={device:e,adapter:t,canvas:this.#V,context:r,format:i},this.#K=!1}async init(e){this.#Z=e;const r=await navigator.gpu.requestAdapter();if(t.Utils.isNull(r))throw new Error("WebGPU adapter unavalable or disabled.");const i=await r.requestDevice();if(t.Utils.isNull(r))throw new Error("WebGPU device unavalable or disabled.");i.addEventListener("uncapturederror",this._logError),this.#ee=!(t.Utils.isNull(e.modifiers?.version)||t.Utils.isNull(e.modifiers)||t.Utils.isNull(e.modifiers.vertexInput)&&t.Utils.isNull(e.modifiers.vertexOutput)&&t.Utils.isNull(e.modifiers.fragment));const{context:n,textureFormat:s}=this._buildContext();this._buildUpContext(i,r,n,s)}#K;#ee;render(e){if(this.#K||t.Utils.isNull(this.#Y)||!(this.#V.width>0)||!(this.#V.height>0))return;const r=this.#W,i=r.device,n=this.#Y,s=this.#Z?.enableValidation??!1;this.#ee&&t.Utils.extend(this.#Q,e);const o=this._buildPassDescriptor({multisample:!0}),a=i.createCommandEncoder({label:at+"renderer"}),l=a.beginRenderPass(o);n.loop((e,t,n)=>{if(e.item.hide)return!1;s&&i.pushErrorScope("validation");const o=[e,t,...n];return vr.create(r,o,{multisample:!0,modifiers:this.#Z.modifiers}).frame(l,this.#J,...o),s&&i.popErrorScope().then(e=>{e&&this._logError(e)}),!0}),l.end(),i.queue.submit([a.finish()])}set disabled(e){this.#q=e}get disabled(){return this.#q}raycast(e){if(this.#K||t.Utils.isNull(this.#Y))return Promise.resolve([]);const r=this.#W,i=r.device,n=this.#Y,s=this.#Z?.enableValidation??!1,o=Pr.createColorPicking(r);return o.begin(),n.loop((e,t)=>!e.item.hide&&(s&&i.pushErrorScope("validation"),o.frame(this.#J,e,t),s&&i.popErrorScope().then(e=>{e&&this._logError(e)}),!0)),o.end(e)}_disposeRenderableJustInCase(e){const t=this.#H;t.has(e)&&(t.get(e)?.destroy(),t.delete(e))}_createOrYieldRenderable(e,r=this.#F,i=this.#X){e.stage??=this.#j;const n=this.#H;let s=n.get(e);return t.Utils.isNull(s)&&n.set(e,s=nr.create(e,r)),s}_createOrYieldGeometry(e){const r=this.#F;let i=r.get(e);return t.Utils.isNull(i)&&r.set(e,i=ir.create(e)),i}_createOrYieldMaterial(e){const r=this.#X;let i=r.get(e);return t.Utils.isNull(i)&&r.set(e,i=ir.create(e)),i}_unwrapBuffers(e,t){t??={meshes:[],lights:[],cameras:[],groups:[]};for(let r of e.children)r.item.stage??=this.#j,x(r.item)&&t.meshes.push(r),g(r.item)&&t.cameras.push(r),b(r.item)&&t.lights.push(r),C(r.item)&&(t.groups.push(r),this._unwrapBuffers(r,t));return t}_update(e){const r=[],i=[],n=[],s=e=>this._createOrYieldRenderable(e);let o;for(let a of e)if(a.hide)this._disposeRenderableJustInCase(a);else{if(a.stage??=this.#j,C(a)){const e=a;e.flags.includes(h.Children)&&this.#H.delete(e),r.push(s(e))}x(a)&&a.geometry&&(this._createOrYieldGeometry(a.geometry),t.Utils.isNull(a.material)||this._createOrYieldMaterial(a.material),i.push(s(a))),b(a)&&n.push(s(a)),g(a)&&(o??=a)}var a;o??=(a=this.#j,{bottom:-1,top:1,left:-1,right:1,near:.1,far:200,lookAt:Rr.from(0,0,0),up:Rr.j(),position:Rr.from(0,0,1),type:"orthographic",flags:[],stage:a});const l=s(o);let c={meshes:i,lights:n,cameras:[l],groups:r};for(let e of r)c=this._unwrapBuffers(e,c);this.#Y?.items.meshes.forEach(e=>{i.includes(e)||e.destroy()}),this.#Y=new rr(c)}update(...e){this._update(Array.from(e))}dispose(){if(this.#Y=null,this._disposeContext()){const{device:e}=this.#W;e.removeEventListener("uncapturederror",this._logError),e.destroy}}_disposeContext(){const e=this.#W;if(t.Utils.isNull(e))return!1;Pr.dispose(e),vr.dispose(e);const r=this.#R;if(this.#R=null,!t.Utils.isNull(r)){const{render:e,depth:t}=r;!function(...e){for(let t of e||[])t?.destroy()}(e?.texture,t?.texture)}return e.context.unconfigure(),!0}resize(e){if(this.#K=!0,this._disposeContext()){const{device:r,adapter:i}=this.#W,{context:n,textureFormat:s}=this._buildContext(this.canvas,e);this._buildUpContext(r,i,n,s),this.#ee&&t.Utils.extend(this.#Q,{resolution:e})}}get canvas(){return this.#V}}var Lr=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const Br="WebGPURaycastCallback",Ar="WebGPURaycastPixel",Sr=t.CustomElementUtils.getAttachedPropertyValue,kr=t.CustomElementUtils.setAttachedPropertyValue,Or=t.CustomElementUtils.deleteAttachedPropertyValue;let Gr=class extends t.Components.PacemItemElement{findContainer(){return t.CustomElementUtils.findAncestor(this,e=>e instanceof Dr)}#te="";get version(){return this.#te}#re=new MutationObserver(()=>{this.wgsl=this.textContent});viewActivatedCallback(){super.viewActivatedCallback(),this.wgsl=this.textContent,this.#re.observe(this,{characterData:!0})}propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"wgsl"===e&&this._computeVersion(r)}_computeVersion(r=this.wgsl){e.Strings.hash(r).then(e=>{if(e!==this.#te){const r=this.#te,i=e;this.#te=i;const n=new t.PropertyChangeEvent({propertyName:"version",oldValue:r,currentValue:i,firstChange:t.Utils.isNullOrEmpty(r)});this.dispatchEvent(n)}})}disconnectedCallback(){this.#re.disconnect(),super.disconnectedCallback()}};Lr([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Gr.prototype,"type",void 0),Lr([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Gr.prototype,"wgsl",void 0),Gr=Lr([t.CustomElement({tagName:t.P+"-3d-wgsl-script"})],Gr);let Dr=class extends I{constructor(){super(...arguments),this.#ie=[],this._scriptVersionChangeHandler=e=>{const{propertyName:t}=e.detail;"version"===t&&this._parseWgslModifiers(e.detail.currentValue)},this.#ne=new Set,this.#se=new Map,this.#oe=!0,this.#ae=!0,this.#le=new WeakMap}invalidateSize(e,t=e.size){const r=this._ensureRenderer(e);r?.resize(t)}#ie;get items(){return this.#ie}register(e){const r=this.#ie;return e instanceof Gr&&!r.includes(e)&&(e.addEventListener(t.PropertyChangeEventName,this._scriptVersionChangeHandler,!1),r.push(e),this._parseWgslModifiers(this.modifiers?.version),!0)}unregister(e){const r=this.#ie,i=r.indexOf(e);return i>=0&&(e.removeEventListener(t.PropertyChangeEventName,this._scriptVersionChangeHandler,!1),r.splice(i,1),this._parseWgslModifiers(this.modifiers?.version),!0)}#ne;#se;#oe;#ae;get supported(){return this.#oe}get active(){return this.#ae}_webGPUNotSupported(e){this.#oe&&e.cause===Nr.NotSupported&&(this.#oe=!1,this.dispatchEvent(new t.PropertyChangeEvent({propertyName:"supported",oldValue:null,currentValue:!1}))),this.#ae&&(this.#ae=!1,this.dispatchEvent(new t.PropertyChangeEvent({propertyName:"active",oldValue:null,currentValue:!1})))}initialize(e){const r=this.#se,i=this.#ne;return i.has(e)||i.add(e),Ur.create(e,{enableValidation:this.enableValidation??!1,modifiers:this.modifiers}).then(t=>(r.get(e)?.update(),r.set(e,t),this._updatePipeline(e),t.canvas),e=>(this.log(t.Logging.LogLevel.Error,e.message),this._webGPUNotSupported(e),null))}_parseWgslModifiers(e){const t=this.#ie,r=t.find(e=>"vertex-input"==e.type),i=t.find(e=>"vertex-output"==e.type),n=t.find(e=>"fragment"==e.type),s=r?.wgsl,o=i?.wgsl,a=n?.wgsl;this.modifiers={vertexInput:s,vertexOutput:o,fragment:a,version:e}}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"modifiers":case"enableValidation":this._reinitialize()}}disconnectedCallback(){const e=this.#se;for(let[t,r]of e)r?.dispose();e.clear(),this.#ne.clear(),super.disconnectedCallback()}dispose(e){const t=this.#se,r=this.#ne;t.has(e)&&(t.get(e)?.dispose(),t.delete(e)),r.has(e)&&r.delete(e)}_reinitialize(){for(let e of this.#ne.values())this.initialize(e)}_ensureRenderer(e){return this.#se.get(e)}_updatePipeline(e){const t=this._ensureRenderer(e);t?.update(...e.datasource)}#le;render(e){const r=e.size?.width,i=e.size?.height;if(!(r>0&&i>0))return;const n=this._ensureRenderer(e);if(t.Utils.isNull(n))return;this.#le.has(e)&&(this.#le.delete(e),this._itemsChangedExec(e));const s=Sr(e,Ar);if(n.render({cursor:s,time:performance.now(),resolution:{width:r,height:i}}),!e.interactive)return;const o=Sr(e,Br);t.Utils.isNullOrEmpty(o)||(t.Utils.isNullOrEmpty(s)?o(null):n.raycast(s).then(e=>{if(t.Utils.isNullOrEmpty(e))o(null);else{const t={object:e[0],point:null};o(t)}}))}snapshot(e,r,i,n){const s=this.#se;if(!s.has(e))return Promise.resolve(null);const{canvas:o}=s.get(e),a=!t.Utils.isNullOrEmpty(r),l=i??(a?"image/jpeg":null),c=n??(a?.9:null);return new Promise((i,n)=>{this.render(e),t.Utils.snapshotElement(o,r,l,c).then(i)})}raycast(e,t,r,i){kr(e,Br,i),t.x<0||t.y<0||t.x>=r.width||t.y>=r.height?Or(e,Ar):kr(e,Ar,t)}_itemsChangedExec(e){this._updatePipeline(e)}_itemsChanged(e,t){this.#le.set(e,!0)}addItem(e,t){this._itemsChanged(e,t)}removeItem(e,t){this._itemsChanged(e,t)}updateItem(e,r){(t.Utils.isNull(r)||r.flags.indexOf(h.Visibility)>=0||r.flags.indexOf(h.Children)>=0)&&this._itemsChanged(e,r)}zoomFit(e,...t){return Promise.resolve()}project(e,t){return{x:0,y:0}}getScene(e){return e}};Lr([t.Debounce(100)],Dr.prototype,"_parseWgslModifiers",null),Lr([t.Watch({emit:!1})],Dr.prototype,"modifiers",void 0),Lr([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],Dr.prototype,"enableValidation",void 0),Dr=Lr([t.CustomElement({tagName:t.P+"-3d-webgpu-adapter"})],Dr);var $r=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const Ir=r.Geometry.LinearAlgebra.Vector3D,zr=r.Geometry.LinearAlgebra.Matrix3D,Wr=r.Geometry.LinearAlgebra.Quaternion;r.Geometry.LinearAlgebra.Spherical;const jr=.001,Vr={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}};class Hr{constructor(e,r){this._config=r,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=e=>{const{rotation:r,pan:i}=this._config,n="mouse"===e.pointerType,s=r.enabled&&n&&e.button===r.button&&t.CustomEventUtils.matchModifiers(e,r.modifiers),o=i.enabled&&n&&e.button===i.button&&t.CustomEventUtils.matchModifiers(e,i.modifiers);(s||o)&&(this.#ce=s,(this.#ue=o)&&(this._currentState=Hr._buildState(this._camera),t.Utils.extend(this._input,Ir.zero()),this._progress.x=this._progress.y=0),t.avoidHandler(e),window.addEventListener("pointerup",this._endHandler,!1),window.addEventListener("pointermove",this._moveHandler,!1),window.addEventListener("contextmenu",this._avoidHandler,!1))},this._avoidHandler=e=>t.avoidHandler(e),this._endHandler=e=>{t.avoidHandler(e),window.setTimeout(()=>{window.removeEventListener("pointerup",this._endHandler),window.removeEventListener("pointermove",this._moveHandler),window.removeEventListener("contextmenu",this._avoidHandler)},20)},this._zoomHandler=e=>{const{zoom:r}=this._config;if(!(r.enabled&&t.CustomEventUtils.matchModifiers(e,r.modifiers)))return;t.avoidHandler(e);this._input.rho-=Math.sign(e.deltaY)},this._moveHandler=e=>{t.avoidHandler(e);const{height:r,width:i}=this._scene.size,n=this._input,s=Math.min(r,i);if(this.#ce){const t=-360/s,{phi:r,theta:i}=n,{maxPolar:o,minPolar:a,maxAzimuth:l,minAzimuth:c}=this._config;n.phi=(r+e.movementX*t).clamp(a,o),n.theta=(i+e.movementY*t).clamp(c,l)}else if(this.#ue){const t=this._currentState.radius/s;n.x+=-e.movementX*t,n.y+=e.movementY*t}},this._renderHandler=e=>{this._update()};const i=this._scene=(this._camera=e).stage;this._initialState=this._currentState=Hr._buildState(e);const n=this._canvas=i.stage;n.addEventListener("pointerdown",this._startHandler,!1),n.addEventListener("wheel",this._zoomHandler,{passive:!1}),i.addEventListener("render",this._renderHandler,!1)}static _buildState(e){const t=Ir.subtract(e.position,e.lookAt),r=Ir.mag(t);return{target:e.lookAt,versor:Ir.unit(t),up:e.up,radius:r,position:e.position}}static tryAttach(e,r){r??=Vr;const i=function(e){return g(e)?e.stage:null}(e)?.stage;if(t.Utils.isNull(i))return null;{const{position:i,lookAt:n}=e;return t.Utils.isNull(i)||t.Utils.isNull(n)||Ir.areClose(i,n)?null:new Hr(e,r)}}get configuration(){return this._config}set configuration(e){this._config=e}#ue;#ce;_getSafeAzimuth({theta:e}){return Hr._modAngle(e)}_getSafePolar({phi:e}){return Hr._modAngle(e)}static _modAngle(e){for(;e<0;)e+=360;return e%360}static _getViewXYZ(e){const{versor:t,up:r}=e,i=Ir.cross(t,r),n=Ir.cross(i,t);return Ir.normalize(i),Ir.normalize(n),{right:i,up:n,versor:t}}#he;_update(){if(this.#he)return;this.#he=!0;const e=this._camera,{radius:t,versor:r,target:i,up:n}=this._initialState,{target:s}=this._currentState,{theta:o,phi:a,rho:l,x:c,y:u}=this._input,p=this._progress,{theta:d,phi:m,rho:f,x:g,y:y}=p,v=Math.abs(m-a)>jr||Math.abs(d-o)>jr,b=Math.abs(f-l)>jr,x=Math.abs(c-g)>jr||Math.abs(u-y)>jr;if(b||v||x){const v="boolean"==typeof this._config.inertia?this._config.inertia?.05:0:this._config.inertia,b=v>0&&v<1,{right:x,up:_}=Hr._getViewXYZ(this._initialState);let w=i,C=n,E=s,P=f;b?P+=(l-f)*v:P=l,p.rho=P;const M=Math.pow(.95,1*P),R=Ir.scale(r,-M*t);w=Ir.add(w,R);let N=m,U=d;b?(N+=(a-m)*v,U+=(o-d)*v):(N=a,U=o);const T=this._getSafePolar({phi:p.phi=N}),L=this._getSafeAzimuth({theta:p.theta=U}),B=Ir.negate(i);let A=zr.translate(zr.identity(),B);const S=Wr.fromAxisAngle(_,T),k=Wr.fromAxisAngle(x,L),O=zr.multiply(Wr.toRotationMatrix(k),Wr.toRotationMatrix(S));A=zr.multiply(A,O),A=zr.translate(A,Ir.negate(B)),w=zr.transform(w,A),C=zr.transform(C,zr.clone(A,e=>{e.offsetX=e.offsetY=e.offsetZ=0}));let G=g,D=y;b?(G+=(c-g)*v,D+=(u-y)*v):(G=c,D=u),p.x=G,p.y=D;const{right:$,up:I}=Hr._getViewXYZ(this._currentState),z=Ir.scale($,G),W=Ir.scale(I,D),j=Ir.add(z,W);E=Ir.add(s,j),e.lookAt=E,e.position=w,e.up=C,e.flags.push(h.Camera)}this.#he=!1}dispose(){const e=this._canvas,r=this._scene;t.Utils.isNull(e)||(e.removeEventListener("pointerdown",this._startHandler),e.removeEventListener("wheel",this._zoomHandler)),r.removeEventListener("render",this._renderHandler,!1)}}let Fr=class extends t.Behaviors.PacemBehavior{constructor(){super(...arguments),this.#pe=new Map,this._readyHandler=e=>{if("isReady"===e.detail.propertyName&&!0===e.detail.currentValue){const r=e.currentTarget;r.removeEventListener(t.PropertyChangeEventName,this._readyHandler),this._decorateCore(r)}}}#pe;propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"maxAzimuth":case"minAzimuth":case"inertia":case"zoomControl":case"panControl":case"rotationControl":const e=this._buildConfig(),t=this.#pe;for(let r of t.values())r.configuration=e}}disconnectedCallback(){const e=this.#pe;for(let t of e.values())t.dispose();e.clear(),super.disconnectedCallback()}_buildConfig(){return t.Utils.extend({},Vr,{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??Vr.zoom,pan:this.panControl??Vr.pan,rotation:this.rotationControl??Vr.rotation})}_decorateCore(e){const r=Hr.tryAttach(e,this._buildConfig());t.Utils.isNull(r)||this.#pe.set(e,r)}decorate(e){e.isConnected?this._decorateCore(e):e.addEventListener(t.PropertyChangeEventName,this._readyHandler,!1)}undecorate(e){const t=this.#pe;t.has(e)&&(t.get(e).dispose(),t.delete(e))}};$r([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Fr.prototype,"maxAzimuth",void 0),$r([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Fr.prototype,"maxPolar",void 0),$r([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Fr.prototype,"minAzimuth",void 0),$r([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Fr.prototype,"minPolar",void 0),$r([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Fr.prototype,"zoomControl",void 0),$r([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Fr.prototype,"rotationControl",void 0),$r([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Fr.prototype,"panControl",void 0),$r([t.Watch({emit:!1,converter:o})],Fr.prototype,"inertia",void 0),Fr=$r([t.CustomElement({tagName:t.P+"-"+"3d-orbit-camera"})],Fr);var Xr=Object.freeze({__proto__:null,AdapterUtils:Je,get BasicMaterialElement(){return Q},DragEvent:R,get KnownShader(){return z},get LambertMaterialElement(){return ee},get LineMaterialElement(){return re},MaterialElement:q,OrbitCameraBehavior:Hr,Pacem3DAdapterElement:I,Pacem3DCameraElement:G,Pacem3DDetector:class{constructor(){this._detected={supported:!1,info:{}};let e,t=document.createElement("canvas"),r=["webgl","experimental-webgl","moz-webgl","webkit-3d"],i=function(t){if(t)return e.getParameter(t)},n=(e,t,r)=>{let i=this._detected;(i.info[e]=i.info[e]||{})[t=(t=t.replace(/[^\w]+/g,"")).substring(0,1).toLowerCase()+t.substring(1)]=r};if(navigator.userAgent.indexOf("MSIE")>=0)try{e=window.WebGLHelper.CreateGLContext(t,"canvas")}catch(e){}else for(var s=0;s<r.length;s++)try{if(e=t.getContext(r[s]),e){n("main","Context Name",r[s]);break}}catch(e){}this._detected.supported=!!e,n("main","Platform",navigator.platform),n("main","Agent",navigator.userAgent),e&&(n("main","Vendor",i(e.VENDOR)),n("main","Version",i(e.VERSION)),n("main","Renderer",i(e.RENDERER)),n("main","Shading Language Version",i(e.SHADING_LANGUAGE_VERSION)),n("bits","Rgba Bits",i(e.RED_BITS)+", "+i(e.GREEN_BITS)+", "+i(e.BLUE_BITS)+", "+i(e.ALPHA_BITS)),n("bits","Depth Bits",i(e.DEPTH_BITS)),n("shader","Max Vertex Attribs",i(e.MAX_VERTEX_ATTRIBS)),n("shader","Max Vertex Texture Image Units",i(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)),n("shader","Max Varying Vectors",i(e.MAX_VARYING_VECTORS)),n("shader","Max Uniform Vectors",i(e.MAX_VERTEX_UNIFORM_VECTORS)),n("tex","Max Combined Texture Image Units",i(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS)),n("tex","Max Texture Size",i(e.MAX_TEXTURE_SIZE)),n("tex","Max Cube Map Texture Size",i(e.MAX_CUBE_MAP_TEXTURE_SIZE)),n("tex","Num. Compressed Texture Formats",i(e.COMPRESSED_TEXTURE_FORMATS)),n("misc","Max Render Buffer Size",i(e.MAX_RENDERBUFFER_SIZE)),n("misc","Max Viewport Dimensions",i(e.MAX_VIEWPORT_DIMS)),n("misc","Aliased Line Width Range",i(e.ALIASED_LINE_WIDTH_RANGE)),n("misc","Aliased Point Size Range",i(e.ALIASED_POINT_SIZE_RANGE)),n("misc","Supported Extensions",e.getSupportedExtensions()||[]))}get info(){return this._detected.info}get supported(){return this._detected.supported}},get Pacem3DElement(){return u},get Pacem3DGroupElement(){return A},get Pacem3DLightElement(){return O},get Pacem3DMeshElement(){return S},get Pacem3DObjectElement(){return k},get Pacem3DOrthographicCameraElement(){return $},get Pacem3DPerspectiveCameraElement(){return D},Pacem3DPrimitiveElement:le,get Pacem3DThreeAdapterElement(){return ot},get Pacem3DWebgpuAdapterElement(){return Dr},get Pacem3DWgslScriptElement(){return Gr},get PacemBoxElement(){return ye},get PacemConeElement(){return xe},get PacemCylinderElement(){return Ce},get PacemDodecahedronElement(){return Ve},get PacemHexahedronElement(){return We},get PacemIcosahedronElement(){return je},get PacemLineElement(){return Re},get PacemOctahedronElement(){return ze},get PacemOrbitCameraBehaviorElement(){return Fr},get PacemPlaneElement(){return Te},get PacemSphereElement(){return Xe},get PacemTetrahedronElement(){return Ie},get PacemTorusElement(){return qe},get PhongMaterialElement(){return ne},PolyhedronElement:$e,RenderableElement:L,RenderableEvent:N,get StalePropertyFlag(){return h},get StandardMaterialElement(){return oe},UI3DEvent:M,Ui3DElement:B,computePlaneNormal:P,computeSharpVertexNormals:E,isBasicMaterial:V,isCamera:g,isGeometry:_,isGroup:C,isInteraction:U,isLambertMaterial:F,isLight:b,isLineMaterial:H,isMaterial:j,isMesh:x,isMeshGeometry:w,isOrthographicCamera:v,isPerspectiveCamera:y,isPhongMaterial:X,isRenderable:m,isShaderMaterial:Z,isStage:d,isStandardMaterial:Y,isUi3DObject:f}),Yr=Object.freeze({__proto__:null,Drawing3D:Xr}),Zr=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};class qr{static parse(t){const r=[],n=/^v((\s+-?[\d\.]+){3})/gm;let s=n.exec(t);for(;s&&s.length;)r.push(i.convert(s[1])),s=n.exec(t);const o=[],a=/^vt((\s+-?[\d\.]+){2})/gm;for(s=a.exec(t);s&&s.length;)o.push(e.Point.parse(s[1])),s=a.exec(t);const l=[],c=/^vn((\s+-?[\d\.]+){3})/gm;for(s=c.exec(t);s&&s.length;)l.push(i.convert(s[1])),s=c.exec(t);const u=[],h=[],p=[],d=/^f((\s+([\d]+\/[\d]+\/[\d]+)){3,})/gm;for(s=d.exec(t);s&&s.length;){const e=/([\d]+)\/([\d]+)\/([\d]+)/g,r=s[1];let i=e.exec(r),n=0;for(var m,f,g,y,v,b;i&&i.length;)n>2&&(p.push(m),h.push(o[f]),u.push(l[g]),p.push(y),h.push(o[v]),u.push(l[b])),y=parseInt(i[1])-1,v=parseInt(i[2])-1,b=parseInt(i[3])-1,p.push(y),h.push(o[v]),u.push(l[b]),0===n&&(m=y,f=v,g=b),n++,i=e.exec(r);s=d.exec(t)}return new me(r,p,h,u)}}Zr([t.Transformer("parse3D")],class{static parseGeometry(e,t){if("obj"===t.toLowerCase())return qr.parse(e);throw new Error(`Type '${t}' is not supported.`)}},"parseGeometry",null);var Jr=Object.freeze({__proto__:null,BooleanOrNumberConverter:o,DragEvent:R,get KnownShader(){return z},LineGeometry:de,MaterialElement:q,MeshGeometry:me,NodeGeometry:he,NotifyChange:ce,Pacem3DAdapterElement:I,Pacem3DCameraElement:G,get Pacem3DGroupElement(){return A},get Pacem3DLightElement(){return O},get Pacem3DMeshElement(){return S},get Pacem3DObjectElement(){return k},get Pacem3DOrthographicCameraElement(){return $},get Pacem3DPerspectiveCameraElement(){return D},Point3DConverter:i,Point3DOrNumberConverter:n,QuaternionConverter:s,RenderableElement:L,RenderableEvent:N,get StalePropertyFlag(){return h},UI3DEvent:M,Ui3DElement:B,computePlaneNormal:P,computeSharpVertexNormals:E,isBasicMaterial:V,isCamera:g,isGeometry:_,isGroup:C,isInteraction:U,isLambertMaterial:F,isLight:b,isLineMaterial:H,isMaterial:j,isMesh:x,isMeshGeometry:w,isOrthographicCamera:v,isPerspectiveCamera:y,isPhongMaterial:X,isRenderable:m,isShaderMaterial:Z,isStage:d,isStandardMaterial:Y,isUi3DObject:f}),Qr=Object.freeze({__proto__:null,Components:Yr,Drawing3D:Jr});e.DeepMerger.merge(Qr)}(Pacem,Pacem,Pacem);
6
+ !function(e,t,r){"use strict";const i={convert:e=>r.Geometry.LinearAlgebra.Vector3D.parse(e),convertBack:e=>`${e.x||0} ${e.y||0} ${e.z||0}`},n={convert:i=>{const n=e.parseAsNumericalArray(i),s=()=>{throw new Error(`Cannot parse "${i}" as a valid Vector3D.`)};if(t.Utils.isNullOrEmpty(n)&&s(),3===n.length)return r.Geometry.LinearAlgebra.Vector3D.from(...n);if(1===n.length){const e=n[0];return r.Geometry.LinearAlgebra.Vector3D.from(e,e,e)}s()},convertBack:e=>`${e.x||0} ${e.y||0} ${e.z||0}`},s={convert:e=>r.Geometry.LinearAlgebra.Quaternion.parse(e),convertBack:e=>`${e.x||0} ${e.y||0} ${e.z||0} ${e.w||0}`},o={convert:t=>"true"===t||"false"!==t&&e.parseAsNumericalArray(t)[0],convertBack:e=>e.toString()},a="3d",l=Math.PI/180;var c=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let u=class Pacem3DElement extends t.Components.PacemItemsContainerElement{constructor(){super(...arguments),this._itemPropertyChangeHandler=e=>{const t=e.target;this.adapter&&this.adapter.updateItem(this,t),t.flags.splice(0)},this._clickHandler=e=>{let r=this;if(!r.interactive||t.Utils.isNull(r._lastHitResult))return;const i=e.type.replace(/^mouse/,""),n=r._lastHitResult,s=n.object,o=n.point;this._itemDispatch(s,o,i,e)},this._hitTestCallback=(e,r)=>{const i=this;if(e!=i._lastHitResult){if(e?.object!=i._lastHitResult?.object){const n=e?.object,s=i._lastHitResult?.object,o=e?.point;t.Utils.isNull(s)||this._itemDispatch(s,o,"out",r),t.Utils.isNull(n)||this._itemDispatch(n,o,"over",r)}i._lastHitResult=e}},this._moveHandler=e=>{let t=this;if(!t.adapter||!t.interactive)return;const r=t._resizer.currentSize,i="mousemove"===e.type?{x:e.pageX-r.left,y:e.pageY-r.top}:{x:-1,y:-1};t.adapter.raycast(this,i,r,r=>t._hitTestCallback(r,e))},this._resizeHandler=e=>{const r=this.#e,i=e.detail;if(!t.Utils.isNull(r)&&r.height===i.height&&r.width===i.width)return;this.#e=i;const n=this.adapter;t.Utils.isNull(n)||(this.adapter.invalidateSize(this,i),this.dispatchEvent(new t.Components.ResizeEvent(i)))}}validate(e){return e instanceof RenderableElement}get stage(){return this._container}get scene(){return this.adapter&&this.adapter.getScene(this)}register(e){const r=super.register(e);return r&&(this._add(e),e.addEventListener(t.PropertyChangeEventName,this._itemPropertyChangeHandler,!1)),r}unregister(e){const r=super.unregister(e);return r&&(e.removeEventListener(t.PropertyChangeEventName,this._itemPropertyChangeHandler,!1),this._erase(e)),r}_refreshDatasource(e=this.datasource){this.adapter?.updateItem(this,void 0)}_buildUpDatasourceFromDOM(e=this.items){t.Utils.isNullOrEmpty(e)||(this.datasource=e.slice())}_add(e){this.adapter&&this.adapter.addItem(this,e)}_erase(e){this.adapter&&this.adapter.removeItem(this,e)}_initializeAdapter(e,r){return new Promise((i,n)=>{const s=this.datasource||[];t.Utils.isNull(e)||s.forEach(t=>e.removeItem(this,t)),t.Utils.isNull(this._container)||t.Utils.isNull(r)?i():r.initialize(this).then(e=>{(s||[]).forEach(e=>this._add(e)),i()},e=>{this.log(t.Logging.LogLevel.Error,e?.toString()),n(e)})})}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"adapter":this._initializeAdapter(t,r);break;case"items":this._buildUpDatasourceFromDOM(r);break;case"transparent":this.adapter?.invalidateSize(this,this.size);break;case"datasource":this._refreshDatasource(r);case"disabled":case"background":this.render()}}viewActivatedCallback(){super.viewActivatedCallback();const e=this._container,t=this._resizer;t.addEventListener("resize",this._resizeHandler,!1),t.target=e,this._initializeAdapter(null,this.adapter).then(t=>{e.addEventListener("mousemove",this._moveHandler,!1),e.addEventListener("click",this._clickHandler,!1),e.addEventListener("mouseup",this._clickHandler,!1),e.addEventListener("mousedown",this._clickHandler,!1),e.addEventListener("mouseout",this._moveHandler,!1),this._buildUpDatasourceFromDOM(),this.render()})}_itemDispatch(e,r,i,n){if(!t.Utils.isNull(e)){var s,o,a;n instanceof Event?o=n:s={item:e,offset:n},"string"==typeof i?a=i:(a=i.type,o=i.originalEvent);const c=r,u=()=>n instanceof Event?new RenderableEvent(a,e,o,c):new DragEvent(a,{detail:s,cancelable:a===t.UI.DragDropEventType.Init||a===t.UI.DragDropEventType.Drag},o,c),h=n instanceof Event?new RenderableEvent("item"+a,e,o,c):new DragEvent("item"+a,{detail:s,cancelable:a===t.UI.DragDropEventType.Init||a===t.UI.DragDropEventType.Drag},o,c);var l=!1;if(e instanceof EventTarget){const t=u();e.dispatchEvent(t),l=t.defaultPrevented}return e.stage.dispatchEvent(h),l||h.defaultPrevented}return!1}disconnectedCallback(){this.#t?.stop();const e=this._resizer,r=this._container;t.Utils.isNull(r)||(r.removeEventListener("click",this._clickHandler,!1),r.removeEventListener("mouseup",this._clickHandler,!1),r.removeEventListener("mousedown",this._clickHandler,!1),r.removeEventListener("mousemove",this._moveHandler,!1),r.removeEventListener("mouseout",this._moveHandler,!1)),t.Utils.isNull(e)||e.removeEventListener("resize",this._resizeHandler,!1),super.disconnectedCallback()}#e;get size(){return this.#e}render(e,r,i=performance.now()){if(t.Utils.isNull(e))this.#t?.stop(),this.#t=t.Animations.Timer.run(e=>this._doRender());else{const r=this.adapter;t.Utils.isNull(r)||r.updateItem(this,e)}}#t;_doRender(){if(!this.disabled&&!t.Utils.isNull(this.adapter)){const e=this.adapter.getScene(this);let t=new CustomEvent("prerender",{detail:{scene:e},cancelable:!0});this.dispatchEvent(t),t.defaultPrevented||(this.adapter.render(this),this.dispatchEvent(new CustomEvent("render",{detail:{scene:e}})))}}};c([t.ViewChild(`.${t.PCSS}-3d`)],u.prototype,"_container",void 0),c([t.ViewChild(t.P+"-resize")],u.prototype,"_resizer",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],u.prototype,"interactive",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],u.prototype,"transparent",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.String})],u.prototype,"background",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Element})],u.prototype,"adapter",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],u.prototype,"datasource",void 0),c([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],u.prototype,"orbit",void 0),u=c([t.CustomElement({tagName:t.P+"-"+a,shadow:t.Defaults.USE_SHADOW_ROOT,template:`<${t.P}-resize watch-position="true"></${t.P}-resize><div class="${t.PCSS}-3d"></div><${t.P}-content></${t.P}-content>`})],u);var h,p=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};function d(e){return!t.Utils.isNull(e)&&"render"in e&&"function"==typeof e.render}function m(e){return d(e?.stage)}function f(e){return"transformMatrix"in e&&m(e)}function g(e){return"type"in e&&"up"in e&&"lookAt"in e&&m(e)}function y(e){return g(e)&&"type"in e&&"perspective"===e.type}function v(e){return g(e)&&"type"in e&&"orthographic"===e.type}function b(e){return"type"in e&&("ambient"===e.type||"omni"===e.type||"direction"===e.type||"spot"==e.type)&&m(e)}function x(e){return"geometry"in e&&f(e)}function E(e){return"positions"in e&&t.Utils.isArray(e.positions)}function _(e){return("triangleIndices"in e&&t.Utils.isArray(e.triangleIndices)||"normals"in e&&t.Utils.isArray(e.normals)||"textureCoordinates"in e&&t.Utils.isArray(e.textureCoordinates))&&E(e)}function C(e){return"childRenderables"in e&&t.Utils.isArray(e.childRenderables)&&f(e)}function w(e){const r=[];if(!t.Utils.isNullOrEmpty(e)){const t=e.triangleIndices;if(t.length%3!=0)throw new RangeError(`Invalid mesh geometry: ${t.length} is not multiple of 3.`);for(let i=2;i<t.length;i+=3){const n=t[i-2],s=t[i-1],o=t[i],a=P(e.positions[n],e.positions[s],e.positions[o]);r.push(a,a,a)}}e.normals=r}function P(e,t,i){const n=r.Geometry.LinearAlgebra.Vector3D.subtract(e,t),s=r.Geometry.LinearAlgebra.Vector3D.subtract(e,i),o=r.Geometry.LinearAlgebra.Vector3D.cross(n,s);return r.Geometry.LinearAlgebra.Vector3D.unit(o)}class UI3DEvent extends t.CustomUIEvent{constructor(e,t,r,i){super(e,t,r),this.#r=i}#r;get point(){return this.#r}}class DragEvent extends UI3DEvent{}class RenderableEvent extends UI3DEvent{constructor(e,t,r,i){super(e,{detail:t,bubbles:!0,cancelable:!0},r,i)}}function M(e){return"object"==typeof e&&"time"in e&&"number"==typeof e.time}!function(e){e.Position="position",e.Transform="transform",e.Geometry="geometry",e.Children="children",e.Material="material",e.Light="light",e.Camera="camera",e.Visibility="visibility"}(h||(h={}));const R={OBJECT_SELECTOR:t.P+"-"+"3d-object",LIGHT_SELECTOR:t.P+"-"+"3d-light",PERSPECTIVE_CAMERA_SELECTOR:t.P+"-"+"3d-perspective-camera",ORTHO_CAMERA_SELECTOR:t.P+"-"+"3d-orthographic-camera",MESH_SELECTOR:t.P+"-"+"3d-mesh",GROUP_SELECTOR:t.P+"-"+"3d-group",DEFAULT_COORDS:{x:0,y:0,z:0}};class RenderableElement extends t.Components.PacemCrossItemsContainerElement{constructor(){super(...arguments),this.position=R.DEFAULT_COORDS,this.#i=[]}validate(e){return!1}findContainer(){return this.parent||this.stage}get stage(){return this._scene=this._scene||t.CustomElementUtils.findAncestorOfType(this,u)}get parent(){return this._drawableParent=this._drawableParent||t.CustomElementUtils.findAncestor(this,e=>e instanceof RenderableElement)}disconnectedCallback(){delete this._scene,delete this._drawableParent,super.disconnectedCallback()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"hide":this.setAsDirty(h.Visibility);break;case"items":this.setAsDirty(h.Children);break;case"position":this.setAsDirty(h.Position)}}#i;get flags(){return this.#i}setAsDirty(...e){for(let t of e)this.flags.includes(t)||this.flags.push(t);this.stage?.render(this)}}p([t.Watch({emit:!1,converter:i})],RenderableElement.prototype,"position",void 0),p([t.Watch({emit:!1,reflectBack:!0,converter:t.PropertyConverters.String})],RenderableElement.prototype,"tag",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],RenderableElement.prototype,"inert",void 0);class Ui3DElement extends RenderableElement{propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"transformMatrix":this.setAsDirty(h.Transform);break;case"translateZ":case"translateX":case"translateY":this.offset={x:this.translateX,y:this.translateY,z:this.translateZ};break;case"scaleX":case"scaleY":case"scaleZ":this.scale={x:this.scaleX,y:this.scaleY,z:this.scaleZ};break;case"scale":case"offset":case"rotate":this._computeTransformMatrix()}}_computeTransformMatrix(){const e=r.Geometry.LinearAlgebra.Matrix3D,i=r.Geometry.LinearAlgebra.Vector3D,n=r.Geometry.LinearAlgebra.Quaternion,s=this.scale??i.from(1,1,1);let o=e.scale(e.identity(),s);if(!t.Utils.isNull(this.rotate)){const t=n.toRotationMatrix(this.rotate);o=e.multiply(o,t)}const a=this.offset??i.from(0,0,0);o=e.translate(o,a),this.transformMatrix=o}}p([t.Watch({emit:!1,converter:s})],Ui3DElement.prototype,"rotate",void 0),p([t.Watch({emit:!1,converter:n})],Ui3DElement.prototype,"scale",void 0),p([t.Watch({emit:!1,converter:n})],Ui3DElement.prototype,"offset",void 0),p([t.Watch({emit:!1})],Ui3DElement.prototype,"transformMatrix",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ui3DElement.prototype,"scaleX",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ui3DElement.prototype,"scaleY",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ui3DElement.prototype,"scaleZ",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ui3DElement.prototype,"translateX",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ui3DElement.prototype,"translateY",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ui3DElement.prototype,"translateZ",void 0);let B=class Pacem3DGroupElement extends Ui3DElement{validate(e){return e instanceof RenderableElement}#n=[];get childRenderables(){return this.#n}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"items":case"datasource":this.#n=r||[],this.setAsDirty(h.Children)}}};p([t.Watch({emit:!1})],B.prototype,"datasource",void 0),B=p([t.CustomElement({tagName:R.GROUP_SELECTOR})],B);let N=class Pacem3DMeshElement extends Ui3DElement{propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"geometry":this.setAsDirty(h.Geometry);break;case"material":case"backMaterial":this.setAsDirty(h.Material)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],N.prototype,"geometry",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],N.prototype,"material",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],N.prototype,"backMaterial",void 0),N=p([t.CustomElement({tagName:R.MESH_SELECTOR})],N);let U=class Pacem3DObjectElement extends Ui3DElement{propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"content"!==e&&"type"!==e||this.setAsDirty(h.Geometry,h.Material)}};p([t.Watch({emit:!1})],U.prototype,"content",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.String})],U.prototype,"type",void 0),U=p([t.CustomElement({tagName:R.OBJECT_SELECTOR})],U);let L=class Pacem3DLightElement extends RenderableElement{constructor(){super(...arguments),this.intensity=.85,this.target=R.DEFAULT_COORDS,this.color="#fff",this.type="omni"}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"type":case"color":case"intensity":case"target":this.setAsDirty(h.Light)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],L.prototype,"intensity",void 0),p([t.Watch({emit:!1,converter:i})],L.prototype,"target",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.String})],L.prototype,"color",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.String})],L.prototype,"type",void 0),L=p([t.CustomElement({tagName:R.LIGHT_SELECTOR})],L);class Pacem3DCameraElement extends RenderableElement{constructor(){super(...arguments),this.near=.1,this.far=1e3,this.up=r.Geometry.LinearAlgebra.Vector3D.j(),this.lookAt=R.DEFAULT_COORDS}#s;_resetBoundingSphere(){const e=this.#s,i=this.position,n=this.lookAt,s=t.Utils.isNullOrEmpty(i)||t.Utils.isNullOrEmpty(n)?0:r.Geometry.LinearAlgebra.Vector3D.mag(r.Geometry.LinearAlgebra.Vector3D.subtract(i,n)),o=this.#s={center:n,radius:s};this.dispatchEvent(new t.PropertyChangeEvent({currentValue:o,propertyName:"boundingSphere",oldValue:e}))}get boundingSphere(){return this.#s}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"lookAt":case"position":this._resetBoundingSphere();case"near":case"far":case"up":this.setAsDirty(h.Camera)}}}p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Pacem3DCameraElement.prototype,"near",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Pacem3DCameraElement.prototype,"far",void 0),p([t.Watch({emit:!1,converter:i})],Pacem3DCameraElement.prototype,"up",void 0),p([t.Watch({emit:!1,converter:i})],Pacem3DCameraElement.prototype,"lookAt",void 0);let T=class Pacem3DPerspectiveCameraElement extends Pacem3DCameraElement{constructor(){super(...arguments),this.fov=45,this.aspect=1}get type(){return"perspective"}get aspectRatio(){return this.aspect}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"fov":case"aspect":this.setAsDirty(h.Camera)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],T.prototype,"fov",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],T.prototype,"aspect",void 0),T=p([t.CustomElement({tagName:R.PERSPECTIVE_CAMERA_SELECTOR})],T);let D=class Pacem3DOrthographicCameraElement extends Pacem3DCameraElement{constructor(){super(...arguments),this.top=1,this.left=-1,this.bottom=-1,this.right=1}get type(){return"orthographic"}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"top":case"left":case"bottom":case"right":this.setAsDirty(h.Camera)}}};p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],D.prototype,"top",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],D.prototype,"left",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],D.prototype,"bottom",void 0),p([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],D.prototype,"right",void 0),D=p([t.CustomElement({tagName:R.ORTHO_CAMERA_SELECTOR})],D);class Pacem3DAdapterElement extends t.PacemEventTarget{}var A,G=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};function O(e){return"shader"in e}function S(e){return O(e)&&e.shader===A.Basic}function k(e){return O(e)&&e.shader===A.Line}function $(e){return O(e)&&e.shader===A.Lambert}function I(e){return O(e)&&e.shader===A.Phong}function W(e){return O(e)&&e.shader===A.Standard}function z(e){return O(e)&&e.shader===A.Custom}!function(e){e.Basic="basic",e.Lambert="lambert",e.Phong="phong",e.Standard="standard",e.Line="line",e.Custom="custom"}(A||(A={}));class MaterialElement extends t.PacemEventTarget{constructor(e){super(),this.#o=e}#o;get shader(){return this.#o}async _loadMap(r,i=this.material?.texture){if(t.Utils.isNull(i)||i.close(),t.Utils.isNullOrEmpty(r))return null;const n=await e.Imaging.loadImage(r);return t.Utils.isNull(n)?null:await createImageBitmap(n)}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"map":case"opacity":case"wireframe":case"color":case"hide":this.updateMaterial()}}viewActivatedCallback(){super.viewActivatedCallback(),this.updateMaterial()}updateMaterial(){this.createMaterial().then(e=>{this.material=t.Utils.extend(e,{flags:[h.Material]})})}async createMaterial(){return{opacity:this.opacity??1,wireframe:this.wireframe??!1,color:this.color||t.Utils.Css.getVariableValue(`--${t.PCSS}-color-primary`),visible:!this.hide,map:this.map,texture:await this._loadMap(this.map),shader:this.shader,flags:[]}}}G([t.Watch()],MaterialElement.prototype,"material",void 0),G([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],MaterialElement.prototype,"opacity",void 0),G([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],MaterialElement.prototype,"wireframe",void 0),G([t.Watch({emit:!1,converter:t.PropertyConverters.String})],MaterialElement.prototype,"color",void 0),G([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],MaterialElement.prototype,"hide",void 0),G([t.Watch({emit:!1,converter:t.PropertyConverters.String})],MaterialElement.prototype,"map",void 0);var j=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let V=class BasicMaterialElement extends MaterialElement{constructor(){super(A.Basic)}};V=j([t.CustomElement({tagName:`${t.P}-${a}-material-basic`})],V);var H=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let F=class LambertMaterialElement extends MaterialElement{constructor(){super(A.Lambert)}async createMaterial(){return t.Utils.extend({emissiveColor:this.emissiveColor||"#000",reflectivity:this.reflectivity??0,refractionRatio:this.refractionRatio??0},await super.createMaterial())}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"emissiveColor":case"reflectivity":case"refractionRatio":this.updateMaterial()}}};H([t.Watch({emit:!1,converter:t.PropertyConverters.String})],F.prototype,"emissiveColor",void 0),H([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],F.prototype,"reflectivity",void 0),H([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],F.prototype,"refractionRatio",void 0),F=H([t.CustomElement({tagName:`${t.P}-${a}-material-lambert`})],F);var X=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Y=class LineMaterialElement extends MaterialElement{constructor(){super(A.Line)}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"lineWidth":case"lineJoin":case"lineCap":case"dashArray":this.updateMaterial()}}async createMaterial(){return t.Utils.extend({lineWidth:this.lineWidth??1,lineJoin:this.lineJoin??"round",lineCap:this.lineCap??"round",dashArray:this.dashArray},await super.createMaterial())}};X([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Y.prototype,"lineWidth",void 0),X([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Y.prototype,"lineJoin",void 0),X([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Y.prototype,"lineCap",void 0),X([t.Watch({emit:!1,converter:{convert:e=>e?.split(",").map(e=>parseInt(e)).filter(e=>!Number.isNaN(e)),convertBack:e=>e?.join(",")}})],Y.prototype,"dashArray",void 0),Y=X([t.CustomElement({tagName:`${t.P}-${a}-material-line`})],Y);var Z=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let q=class PhongMaterialElement extends MaterialElement{constructor(){super(A.Phong)}async createMaterial(){return t.Utils.extend({emissiveColor:this.emissiveColor||"#000",reflectivity:this.reflectivity??0,refractionRatio:this.refractionRatio??0,specularColor:this.specularColor||"#000",shininess:this.shininess??0,flatShading:this.flatShading??!0},await super.createMaterial())}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"emissiveColor":case"reflectivity":case"refractionRatio":case"specularColor":case"shininess":case"flatShading":this.updateMaterial()}}};Z([t.Watch({emit:!1,converter:t.PropertyConverters.String})],q.prototype,"emissiveColor",void 0),Z([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],q.prototype,"reflectivity",void 0),Z([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],q.prototype,"refractionRatio",void 0),Z([t.Watch({emit:!1,converter:t.PropertyConverters.String})],q.prototype,"specularColor",void 0),Z([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],q.prototype,"shininess",void 0),Z([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],q.prototype,"flatShading",void 0),q=Z([t.CustomElement({tagName:`${t.P}-${a}-material-phong`})],q);var J=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Q=class StandardMaterialElement extends MaterialElement{constructor(){super(A.Standard)}async createMaterial(){return t.Utils.extend({emissiveColor:this.emissiveColor||"#000",refractionRatio:this.refractionRatio??0,metalness:this.metalness??0,roughness:this.roughness??0,flatShading:this.flatShading??!1},await super.createMaterial())}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"emissiveColor":case"roughness":case"metalness":case"refractionRatio":case"flatShading":this.updateMaterial()}}};J([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Q.prototype,"emissiveColor",void 0),J([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Q.prototype,"refractionRatio",void 0),J([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Q.prototype,"roughness",void 0),J([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Q.prototype,"metalness",void 0),J([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],Q.prototype,"flatShading",void 0),Q=J([t.CustomElement({tagName:`${t.P}-${a}-material-standard`})],Q);var K=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};class Pacem3DPrimitiveElement extends t.PacemEventTarget{viewActivatedCallback(){super.viewActivatedCallback(),t.Utils.isNull(this.geometry)&&(this.geometry=this.createDefaultGeometry())}}function ee(e){return(r,i,n)=>{const s=`_${i}_${t.Utils.uniqueCode()}_backingField`;function o(){return this[s]}function a(t){if(t!==this[s]){const r=this[s];this[s]=t,e.call(this,i,r,t)}}Object.defineProperty(r,i,{get:function(){return o.call(this)},set:function(e){a.call(this,e)},enumerable:!0,configurable:!1})}}K([t.Watch({converter:t.PropertyConverters.Json})],Pacem3DPrimitiveElement.prototype,"geometry",void 0);var te=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};class NodeGeometry{constructor(e=[]){this.positions=e}static barycenter(e){var r={x:0,y:0,z:0};if(!t.Utils.isNullOrEmpty(e)){for(var i=e.length,n=0;n<e.length;n++){var s=e[n];r.x+=s.x,r.y+=s.y,r.z+=s.z}var o=1*i;r.x/=o,r.y/=o,r.z/=o}return r}static boundingBox(e){const r={minX:1/0,minY:1/0,minZ:1/0,maxX:-1/0,maxY:-1/0,maxZ:-1/0};if(!t.Utils.isNullOrEmpty(e))for(var i=0;i<e.length;i++){var n=e[i];r.minX=Math.min(r.minX,n.x),r.minY=Math.min(r.minY,n.y),r.minZ=Math.min(r.minZ,n.z),r.maxX=Math.max(r.maxX,n.x),r.maxY=Math.max(r.maxY,n.y),r.maxZ=Math.max(r.maxZ,n.z)}return r}setAsDirty(){re.call(this)}}function re(){this.flags=[h.Geometry]}class LineGeometry extends NodeGeometry{}te([ee(re)],LineGeometry.prototype,"positions",void 0);class MeshGeometry extends NodeGeometry{#a;#l;#c;get barycenter(){return this.#c??=NodeGeometry.barycenter(this.positions)}set barycenter(e){this.#c=e}get boundingBox(){return this.#a??=NodeGeometry.boundingBox(this.positions)}set boundingBox(e){this.#a=e}get boundingSphere(){return this.#l}set boundingSphere(e){this.#l=e}constructor(e,t,r=[],i=[]){super(e),this.triangleIndices=t,this.textureCoordinates=r,this.normals=i}}te([ee(re)],MeshGeometry.prototype,"positions",void 0),te([ee(re)],MeshGeometry.prototype,"triangleIndices",void 0),te([ee(re)],MeshGeometry.prototype,"textureCoordinates",void 0),te([ee(re)],MeshGeometry.prototype,"normals",void 0);var ie,ne=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let se=ie=class PacemBoxElement extends Pacem3DPrimitiveElement{static createMeshGeometry(e,t,r,i,n,s){const o=e||1,a=t||1,l=r||1,c=i||1,u=n||1,h=s||1,p=[],d=[],m=[];for(var f=0;f<=u;f++)for(var g=a/2-a*(1*f)/(1*u),y=0;y<=h;y++)for(var v=-l/2+l*(1*y)/(1*h),b=0;b<=c;b++){var x=-o/2+o*(1*b)/(1*c);0!=b&&b!=c&&0!=y&&y!=h&&0!=f&&f!=u||p.push({x:x,y:g,z:v})}var E=function(e,t,r){for(var i=1e-5,n=0;n<p.length;n++){var s=p[n];if(Math.abs(s.x-e)<i&&Math.abs(s.y-t)<i&&Math.abs(s.z-r)<i)return n}return-1},_=function(e,t,r,i,n,s,o,a){m.push(e),m.push(t),m.push(r),m.push(e),m.push(r),m.push(i),d.push({x:n,y:a}),d.push({x:o,y:a}),d.push({x:o,y:s}),d.push({x:n,y:a}),d.push({x:o,y:s}),d.push({x:n,y:s})};for(y=0;y<h;y++){g=a/2,v=-l/2+l*(1*y)/(1*h);var C=-l/2+l*(1*(y+1))/(1*h);for(b=0;b<c;b++){var P=-o/2+1*(b+1)*o/(1*c);_(E(x=-o/2+1*b*o/(1*c),g,C),E(P,g,C),E(P,g,v),E(x,g,v),1*b/(1*c),1-1*y/(1*h),1*(b+1)/(1*c),1-1*(y+1)/(1*h))}}for(f=0;f<u;f++){g=a/2-1*f*a/(1*u);var M=a/2-(f+1)*a/(1*u);for(v=-l/2,b=0;b<c;b++){P=o/2-(b+1)*o/(1*c);_(E(x=o/2-1*b*o/(1*c),M,v),E(P,M,v),E(P,g,v),E(x,g,v),1*b/(1*c),1-1*f/(1*u),(b+1)/(1*c),1-(f+1)/(1*u))}}for(f=0;f<u;f++)for(g=a/2-1*f*a/(1*u),M=a/2-(f+1)*a/(1*u),x=-o/2,y=0;y<h;y++){C=-l/2+(y+1)*l/(1*h);_(E(x,M,v=-l/2+y*l/(1*h)),E(x,M,C),E(x,g,C),E(x,g,v),1*y/(1*h),1-f/(1*u),(y+1)/(1*h),1-(f+1)/(1*u))}for(f=0;f<u;f++)for(g=a/2-f*a/(1*u),M=a/2-(f+1)*a/(1*u),v=l/2,b=0;b<c;b++){P=-o/2+(b+1)*o/(1*c);_(E(x=-o/2+b*o/(1*c),M,v),E(P,M,v),E(P,g,v),E(x,g,v),1*b/(1*c),1-1*f/(1*u),(b+1)/(1*c),1-(f+1)/(1*u))}for(f=0;f<u;f++)for(g=a/2-f*a/(1*u),M=a/2-(f+1)*a/(1*u),x=o/2,y=0;y<h;y++){C=l/2-(y+1)*l/(1*h);_(E(x,M,v=l/2-y*l/(1*h)),E(x,M,C),E(x,g,C),E(x,g,v),1*y/(1*h),1-1*f/(1*u),(y+1)/(1*h),1-(f+1)/(1*u))}for(y=0;y<h;y++)for(g=-a/2,v=l/2-l*y/(1*h),C=l/2-l*(y+1)/(1*h),b=0;b<c;b++){P=-o/2+(b+1)*o/(1*c);_(E(x=-o/2+b*o/(1*c),g,C),E(P,g,C),E(P,g,v),E(x,g,v),1*b/(1*c),1-1*y/(1*h),(b+1)/(1*c),1-(y+1)/(1*h))}const R=new MeshGeometry(p,m,d);R.key=`box_${e}x${t}x${r}_w${i}_h${n}_d${s}`,w(R);const B={x:0,y:0,z:0},N=e/2,U=t/2,L=r/2;return R.barycenter=B,R.boundingBox={maxX:N,maxY:U,maxZ:L,minX:-N,minY:-U,minZ:-L},R.boundingSphere={center:B,radius:Math.sqrt(Math.pow(N,2)+Math.pow(U,2)+Math.pow(L,2))},R}createDefaultGeometry(){return ie.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"width":case"height":case"depth":case"widthSegments":case"heightSegments":case"depthSegments":this.geometry=ie.createMeshGeometry(this.width,this.height,this.depth,this.widthSegments,this.heightSegments,this.depthSegments)}}};ne([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],se.prototype,"width",void 0),ne([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],se.prototype,"height",void 0),ne([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],se.prototype,"depth",void 0),ne([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],se.prototype,"widthSegments",void 0),ne([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],se.prototype,"heightSegments",void 0),ne([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],se.prototype,"depthSegments",void 0),se=ie=ne([t.CustomElement({tagName:t.P+"-"+"3d-primitive-box"})],se);var oe,ae=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let le=oe=class PacemConeElement extends Pacem3DPrimitiveElement{static createMeshGeometry(e=1,t=1,r=18,i=5,n=1){const s=[],o=[],a=[],c=l*(360/r),u=e/t,h=t/i,p=1/r;s.push({x:0,y:t,z:0});for(let e=1;e<=i;e++){const i=t-h*e,n=i/t,l=(t-i)*u,d=(i+h)/t;for(let t=0;t<r;t++){const u=c*t,h=Math.cos(u)*l,m=-Math.sin(u)*l;s.push({x:h,y:i,z:m});const f=1+r*(e-1)+t,g=0==t?f+r-1:f-1,y=t*p,v=0==t?1-p:p*(t-1);if(1==e){a.push(0,g,f),o.push({x:y,y:1},{x:v,y:n},{x:y,y:n});continue}const b=1+r*(e-2)+t,x=0==t?b+r-1:b-1,E=g,_=f,C=b;a.push(_,x,E),a.push(_,C,x);const w={x:v,y:d},P={x:v,y:n},M={x:y,y:n},R={x:y,y:d};o.push(M,w,P),o.push(M,R,w)}}const d=1+(i-1)*r;s.push({x:0,y:0,z:0});const m=d+r;for(let t=1;t<=n;t++){const i=t/n,l=e*i,u=(t-1)/n;for(let e=0;e<r;e++){const h=c*e,p=Math.cos(h),f=Math.sin(h),g=h-c,y=Math.cos(g),v=Math.sin(g),b=.5*(1+p*i),x=.5*(1+f*i),E=.5*(1+y*i),_=.5*(1+v*i);let C,w;if(t!=n){const i=Math.cos(h)*l,n=-Math.sin(h)*l;s.push({x:i,y:0,z:n}),C=m+1+(t-1)*r+e,w=0==e?C+r-1:C-1}else C=d+e,w=0==e?d+r-1:C-1;if(1==t){a.push(m,C,w),o.push({x:.5,y:.5},{x:b,y:x},{x:E,y:_});continue}const P=.5*(1+p*u),M=.5*(1+f*u),R=.5*(1+y*u),B=.5*(1+v*u),N=m+1+(t-2)*r+e,U=0==e?N+r-1:N-1,L=w,T=C,D=N;a.push(U,D,L),a.push(L,D,T);const A={x:R,y:B},G={x:E,y:_},O={x:b,y:x},S={x:P,y:M};o.push(A,S,G),o.push(G,S,O)}}const f=new MeshGeometry(s,a,o);return f.key=`cone_${e}x${t}_s${r}_h${i}_c${n}`,w(f),f}createDefaultGeometry(){return oe.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"height":case"sides":case"heightSegments":case"capSegments":this.geometry=oe.createMeshGeometry(this.radius,this.height,this.sides,this.heightSegments,this.capSegments)}}};ae([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],le.prototype,"radius",void 0),ae([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],le.prototype,"height",void 0),ae([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],le.prototype,"sides",void 0),ae([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],le.prototype,"heightSegments",void 0),ae([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],le.prototype,"capSegments",void 0),le=oe=ae([t.CustomElement({tagName:t.P+"-"+"3d-primitive-cone"})],le);var ce,ue=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let he=ce=class PacemCylinderElement extends Pacem3DPrimitiveElement{static createMeshGeometry(e=1,t=1,r=18,i=5,n=1){const s=e,o=[],a=[],c=[],u=l*(360/r);o.push({x:0,y:t,z:0}),o.push({x:0,y:0,z:0});const h=s/n;for(let e=1;e<=n;e++)for(var p=h*e,d=0;d<r;d++){const i=2+2*r*(e-1),l=0==d?i+2*(r-1):i+2*(d-1),h=i+2*d,m=Math.cos(u*d),f=-Math.sin(u*d),g=Math.cos(u*(d-1)),y=-Math.sin(u*(d-1)),v=p*m,b=p*f,x={x:v,y:t,z:b},E={x:v,y:0,z:b};o.push(x),o.push(E);const _=.5*p/s,C=m*_,w=f*_,P=g*_,M=y*_;if(1==e){const e=[0,l,h],t=[1,h+1,l+1],r=[{x:.5,y:.5},{x:.5+P,y:.5-M},{x:.5+C,y:.5-w}],i=[{x:.5,y:.5},{x:.5+C,y:.5+w},{x:.5+P,y:.5+M}];c.push(...e),c.push(...t);for(let e=0;e<r.length;e++)a.push(r[e]);for(let e=0;e<i.length;e++)a.push(i[e])}else{const t=2+2*r*(e-2),i=0==d?t+2*(r-1):t+2*(d-1),s=t+2*d,o=(e-1)/n*.5,u=m*o,p=f*o,v=g*o,b=y*o,x={x:.5+P,y:.5-M},E={x:.5+C,y:.5-w},_={x:.5+u,y:.5-p},R={x:.5+v,y:.5-b},B={x:.5+P,y:.5+M},N={x:.5+C,y:.5+w},U={x:.5+u,y:.5+p},L={x:.5+v,y:.5+b};c.push(l),c.push(h),c.push(i),c.push(i),c.push(h),c.push(s),c.push(s+1),c.push(h+1),c.push(l+1),c.push(s+1),c.push(l+1),c.push(i+1),a.push(x),a.push(E),a.push(R),a.push(R),a.push(E),a.push(_),a.push(U),a.push(N),a.push(B),a.push(U),a.push(B),a.push(L)}}const m=2+2*r*n,f=2+2*r*(n-1),g=1/r,y=1/i;for(let e=1;e<=i;e++)for(let n=0;n<r;n++){if(e!=i){var v=s*Math.cos(u*n),b=-s*Math.sin(u*n),x=t*e/i;o.push({x:v,y:x,z:b})}const l=0==n?r-1:n-1,h=1==e?f+2*l+1:m+r*(e-2)+l,p=1==e?f+2*n+1:m+r*(e-2)+n,d=e==i?f+2*n:m+r*(e-1)+n,E=e==i?f+2*l:m+r*(e-1)+l,_=l*g,C=(e-1)*y,w=0==n?1:n*g,P=e*y,M={x:_,y:C},R={x:w,y:C},B={x:w,y:P},N={x:_,y:P};c.push(h),c.push(p),c.push(d),c.push(h),c.push(d),c.push(E),a.push(M),a.push(R),a.push(B),a.push(M),a.push(B),a.push(N)}const E=new MeshGeometry(o,c,a);return E.key=`cylinder_${e}x${t}_s${r}_h${i}_c${n}`,w(E),E}createDefaultGeometry(){return ce.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"height":case"sides":case"heightSegments":case"capSegments":this.geometry=ce.createMeshGeometry(this.radius,this.height,this.sides,this.heightSegments,this.capSegments)}}};ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],he.prototype,"radius",void 0),ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],he.prototype,"height",void 0),ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],he.prototype,"sides",void 0),ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],he.prototype,"heightSegments",void 0),ue([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],he.prototype,"capSegments",void 0),he=ce=ue([t.CustomElement({tagName:t.P+"-"+"3d-primitive-cylinder"})],he);var pe,de=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const me=[{x:0,y:0,z:0},{x:0,y:1,z:0}];let fe=pe=class PacemLineElement extends Pacem3DPrimitiveElement{static createLineGeometry(e){return new LineGeometry(e||me)}createDefaultGeometry(){return pe.createLineGeometry()}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),"positions"===e)this.geometry=pe.createLineGeometry(r)}};de([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],fe.prototype,"positions",void 0),fe=pe=de([t.CustomElement({tagName:t.P+"-"+"3d-primitive-line"})],fe);var ge,ye=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let ve=ge=class PacemPlaneElement extends Pacem3DPrimitiveElement{static createMeshGeometry(e,t,i,n){e||=1,t||=1,i||=4,n||=4;const s=.5*e,o=.5*t,a=[],l=[],c=[],u=[],h=r.Geometry.LinearAlgebra.Vector3D.from(0,0,1);for(let r=0;r<=n;r++)for(let p=0;p<=i;p++){const d=p*e/(1*i)-s,m=0,f=r*t/(1*n)-o;if(a.push({x:d,y:m,z:f}),r<n&&p<i){const e=i+1,t=(p+1)/(1*i),s=1*p/(1*i),o=1-(r+1)/(1*n),a=1-1*r/(1*n);c.push((r+1)*e+p),c.push((r+1)*e+p+1),c.push(r*e+p+1),c.push((r+1)*e+p),c.push(r*e+p+1),c.push(r*e+p),l.push({x:s,y:o}),l.push({x:t,y:o}),l.push({x:t,y:a}),l.push({x:s,y:o}),l.push({x:t,y:a}),l.push({x:s,y:a}),u.push(h,h,h,h,h,h)}}const p=new MeshGeometry(a,c,l,u);return p.key=`plane_${e}x${t}_w${i}_l${n}`,p}createDefaultGeometry(){return ge.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"width":case"length":case"widthSegments":case"lengthSegments":this.geometry=ge.createMeshGeometry(this.width,this.length,this.widthSegments,this.lengthSegments)}}};ye([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ve.prototype,"width",void 0),ye([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ve.prototype,"length",void 0),ye([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ve.prototype,"widthSegments",void 0),ye([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ve.prototype,"lengthSegments",void 0),ve=ge=ye([t.CustomElement({tagName:t.P+"-"+"3d-primitive-plane"})],ve);var be,xe,Ee,_e,Ce,we=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const Pe=function(e){const t=/([\d.-]+)/i;var r=t.exec(e);const i=[];for(;null!=r;){const n=r[0],s=parseFloat(n);i.push(s),e=e.replace(n,""),r=t.exec(e)}return i},Me=r.Geometry.LinearAlgebra.Vector3D;class PolyhedronElement extends Pacem3DPrimitiveElement{propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"radius"===e&&this._assignMeshGeometry(r)}_assignMeshGeometry(e){this.geometry=this.createMeshGeometry(e>0?e:1)}createDefaultGeometry(){return this.createMeshGeometry(1)}}we([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],PolyhedronElement.prototype,"radius",void 0);let Re=be=class PacemTetrahedronElement extends PolyhedronElement{static createMeshGeometry(e){e||=1;const t="0 0.5774 -0.8165, 0 0.5774 0.8165, 0.8165 -0.5774 0, -0.8165 -0.5774 0".split(","),r=[];for(let i=0;i<t.length;i++){const n=t[i],s=Pe(n);r.push({x:s[0]*e,y:s[1]*e,z:s[2]*e})}const i="0.5 0.9995, 0.5 0.0004995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995".split(","),n=[4,5,6,7,8,9,10,11,0,3,2,1],s=[];for(let e=0;e<n.length;e++){const t=Pe(i[n[e]]);s.push({x:t[0],y:t[1]})}const o=new MeshGeometry(r,[1,2,0,2,3,0,3,1,0,3,2,1],s);return o.key=`tetrahedron_${e}`,w(o),o.boundingSphere={center:Me.zero(),radius:e},o}createMeshGeometry(e=this.radius){return be.createMeshGeometry(e)}};Re=be=we([t.CustomElement({tagName:t.P+"-"+"3d-primitive-tetrahedron"})],Re);let Be=xe=class PacemOctahedronElement extends PolyhedronElement{static createMeshGeometry(e){e||=1;const t=[6,7,8,9,10,11,12,13,14,15,16,0,17,18,19,20,21,1,2,22,23,4,3,5],r="0 0.7071 -0.7071, 0 0.7071 0.7071, 1 0 0, 0 -0.7071 -0.7071, -1 0 0, 0 -0.7071 0.7071".split(","),i=[];for(let t=0;t<r.length;t++){const n=r[t],s=Pe(n);i.push({x:s[0]*e,y:s[1]*e,z:s[2]*e})}const n="0.5 0.9995, 0.5 0.9995, 0.0004995 0.5, 0.5 0.9995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.9995".split(","),s=[];for(let e=0;e<t.length;e++){const r=Pe(n[t[e]]);s.push({x:r[0],y:r[1]})}const o=new MeshGeometry(i,[1,2,0,2,3,0,3,4,0,4,1,0,4,5,1,5,2,1,2,5,3,4,3,5],s);return o.key=`octahedron_${e}`,w(o),o.boundingSphere={center:Me.zero(),radius:e},o}createMeshGeometry(e=this.radius){return xe.createMeshGeometry(e)}};Be=xe=we([t.CustomElement({tagName:t.P+"-"+"3d-primitive-octahedron"})],Be);let Ne=Ee=class PacemHexahedronElement extends PolyhedronElement{static createMeshGeometry(e){e||=1;const t=2*e*(1/Math.sqrt(3)),r=se.createMeshGeometry(t,t,t);return r.key=`hexahedron_${e}`,r}createMeshGeometry(e=this.radius){return Ee.createMeshGeometry(e)}};Ne=Ee=we([t.CustomElement({tagName:t.P+"-"+"3d-primitive-hexahedron"})],Ne);let Ue=_e=class PacemIcosahedronElement extends PolyhedronElement{static createMeshGeometry(e){e||=1;const t=[12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,26,27,28,29,30,31,32,33,1,34,35,36,2,37,38,39,40,41,42,43,7,44,45,46,8,47,48,49,50,51,52,53,9,54,55,3,10,56,57,6,58,59,5,4,11],r="0 0.850651 -0.525731, 0 0.850651 0.525731, 0.850651 0.525731 0, 0.525731 0 -0.850651, -0.525731 0 -0.850651, -0.850651 0.525731 0, -0.525731 0 0.850651, 0.525731 0 0.850651, 0.850651 -0.525731 0, 0 -0.850651 0.525731, 0 -0.850651 -0.525731, -0.850651 -0.525731 0".split(","),i=[];for(let t=0;t<r.length;t++){const n=r[t],s=Pe(n);i.push({x:s[0]*e,y:s[1]*e,z:s[2]*e})}const n="0.5 0.808708, 0.5 0.999501, 0.5 0.808708, 0.191292 0.5, 0.000499547 0.5, 0.5 0.808708, 0.9995 0.5, 0.808708 0.5,0.000499487 0.5, 0.5 0.191292, 0.5 0.000499487, 0.5 0.191292,0.5 0.191292, 0.999501 0.5, 0.5 0.808708, 0.5 0.808708,0.9995 0.5, 0.808708 0.999501, 0.191292 0.5, 0.808708 0.5,0.5 0.999501, 0.808708 0.5, 0.999501 0.808708, 0.5 0.999501,0.000499487 0.5, 0.5 0.191292, 0.5 0.808708, 0.9995 0.5,0.808708 0.999501, 0.191292 0.5, 0.808708 0.5, 0.5 0.999501,0.808708 0.5, 0.999501 0.808708, 0.5 0.808708, 0.5 0.191292,0.9995 0.5, 0.000499547 0.5, 0.5 0.191292, 0.191292 0.5,0.5 0.000499487, 0.808708 0.5, 0.5 0.000499487, 0.999501 0.191292,0.5 0.191292, 0.808708 0.000499487, 0.9995 0.5, 0.5 0.191292,0.5 0.808708, 0.9995 0.5, 0.5 0.191292, 0.808708 0.000499487,0.999501 0.5, 0.5 0.808708, 0.5 0.000499487, 0.808708 0.5,0.999501 0.191292, 0.808708 0.5, 0.5 0.808708, 0.5 0.191292".split(","),s=[];for(let e=0;e<t.length;e++){const r=Pe(n[t[e]]);s.push({x:r[0],y:r[1]})}const o=new MeshGeometry(i,[1,2,0,2,3,0,3,4,0,4,5,0,5,1,0,5,6,1,6,7,1,7,2,1,2,8,3,2,7,8,6,9,7,9,8,7,8,10,3,8,9,10,6,11,9,11,10,9,10,4,3,10,11,4,6,5,11,5,4,11],s);return o.key=`icosahedron_${e}`,w(o),o.boundingSphere={center:Me.zero(),radius:e},o}createMeshGeometry(e=this.radius){return _e.createMeshGeometry(e)}};Ue=_e=we([t.CustomElement({tagName:t.P+"-"+"3d-primitive-icosahedron"})],Ue);let Le=Ce=class PacemDodecahedronElement extends PolyhedronElement{static createMeshGeometry(e){e||=1;const t=[Me.from(.356822*e,.934172*e,0*e),Me.from(-.356822*e,.934172*e,0*e),Me.from(.57735*e,.57735*e,-.57735*e),Me.from(0*e,.356822*e,-.934172*e),Me.from(-.57735*e,.57735*e,-.57735*e),Me.from(-.57735*e,.57735*e,.57735*e),Me.from(0*e,.356822*e,.934172*e),Me.from(.57735*e,.57735*e,.57735*e),Me.from(.934172*e,0*e,-.356822*e),Me.from(.934172*e,0*e,.356822*e),Me.from(0*e,-.356822*e,.934172*e),Me.from(.57735*e,-.57735*e,.57735*e),Me.from(.57735*e,-.57735*e,-.57735*e),Me.from(.356822*e,-.934172*e,0*e),Me.from(-.57735*e,-.57735*e,.57735*e),Me.from(-.356822*e,-.934172*e,0*e),Me.from(0*e,-.356822*e,-.934172*e),Me.from(-.57735*e,-.57735*e,-.57735*e),Me.from(-.934172*e,0*e,.356822*e),Me.from(-.934172*e,0*e,-.356822*e)],r=[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,0,46,47,48,49,50,51,7,52,53,54,55,56,57,58,59,60,61,9,62,63,64,65,66,67,11,68,69,70,71,72,73,74,75,76,77,13,78,79,80,81,82,83,15,84,85,86,87,88,89,90,91,92,93,17,94,95,96,97,98,99,19,1,4,100,14,101,102,10,103,18,6,5,104,2,105,106,8,107,3,12,16],i="0.5 0.999501, 0.5 0.999501, 0.191292 0.808708, 0.5 0.690792,\n 0.191292 0.808708, 0.191292 0.808708, 0.5 0.690792,\n 0.808708 0.808708, 0.000499517 0.5, 0.309208 0.5, 0.5 0.309208,\n 0.191292 0.191292, 0.191292 0.191292, 0.309208 0.5,\n 0.191292 0.191292, 0.5 0.000499517, 0.5 0.309208, 0.808708 0.191292,\n 0.000499517 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.309208 0.5,\n 0.191292 0.191292, 0.5 0.000499517, 0.309208 0.5, 0.5 0.000499517,\n 0.808708 0.191292, 0.309208 0.5, 0.808708 0.191292,\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.690792 0.5,\n 0.191292 0.808708, 0.690792 0.5, 0.808708 0.808708,\n 0.191292 0.808708, 0.808708 0.808708, 0.808708 0.808708,\n 0.5 0.690792, 0.5 0.309208, 0.808708 0.808708, 0.5 0.309208,\n 0.808708 0.191292, 0.808708 0.191292, 0.9995 0.5, 0.191292 0.191292,\n 0.5 0.000499517, 0.808708 0.191292, 0.191292 0.191292,\n 0.808708 0.191292, 0.690792 0.5, 0.191292 0.191292,\n 0.690792 0.5, 0.191292 0.191292, 0.5 0.000499517, 0.808708 0.191292,\n 0.191292 0.191292, 0.808708 0.191292, 0.690792 0.5,\n 0.690792 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\n 0.690792 0.5, 0.191292 0.808708, 0.5 0.000499517, 0.808708 0.191292,\n 0.690792 0.5, 0.5 0.000499517, 0.690792 0.5, 0.309208 0.5,\n 0.309208 0.5, 0.191292 0.191292, 0.9995 0.5, 0.808708 0.808708,\n 0.5 0.690792, 0.9995 0.5, 0.5 0.690792, 0.5 0.309208,\n 0.9995 0.5, 0.5 0.309208, 0.309208 0.5, 0.690792 0.5,\n 0.808708 0.808708, 0.309208 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.000499517 0.5, 0.5 0.309208, 0.000499517 0.5,\n 0.5 0.690792, 0.5 0.690792, 0.000499517 0.5, 0.5 0.690792,\n 0.191292 0.191292".split(","),n=[];for(let e=0;e<r.length;e++){const t=Pe(i[r[e]]);n.push({x:t[0],y:t[1]})}const s=new MeshGeometry(t,[0,2,3,0,3,4,0,4,1,1,5,6,1,6,7,1,7,0,7,9,8,7,8,2,7,2,0,7,6,10,7,10,11,7,11,9,11,13,12,11,12,8,11,8,9,11,10,14,11,14,15,11,15,13,15,17,16,15,16,12,15,12,13,15,14,18,15,18,19,15,19,17,19,4,3,19,3,16,19,16,17,19,18,5,19,5,1,19,1,4,18,14,10,18,10,6,18,6,5,3,2,8,3,8,12,3,12,16],n);return s.key=`dodecahedron_${e}`,w(s),s.boundingSphere={center:Me.zero(),radius:e},s}createMeshGeometry(e=this.radius){return Ce.createMeshGeometry(e)}};Le=Ce=we([t.CustomElement({tagName:t.P+"-"+"3d-primitive-dodecahedron"})],Le);var Te,De=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Ae=Te=class PacemSphereElement extends Pacem3DPrimitiveElement{static createMeshGeometry(e=1,t=8){const r=[],i=[],n=[],s=e,o=t,a=l*(360/o),c=o%2==0?o/2:(o-1)/2;r.push({x:0,y:s,z:0});for(let e=1;e<c;e++){const t=a*e,l=Math.cos(t),u=Math.sin(t),h=1-1*e/c;for(let t=0;t<o;t++){const p=a*t-Math.PI/2,d=s*u*Math.cos(p),m=s*l,f=s*u*Math.sin(p);r.push({x:d,y:m,z:f});const g=0==t?o-1:t-1,y=0==t?0:1-1*t/o,v=1-1*g/o;if(1==e)n.push(1+t),n.push(1+g),n.push(0),i.push({x:y,y:h}),i.push({x:v,y:h}),i.push({x:.5,y:1});else{n.push((e-1)*o+t+1),n.push((e-1)*o+g+1),n.push((e-2)*o+g+1),n.push((e-1)*o+t+1),n.push((e-2)*o+g+1),n.push((e-2)*o+t+1);const r=1-(e-1)/c;i.push({x:y,y:h}),i.push({x:v,y:h}),i.push({x:v,y:r}),i.push({x:y,y:h}),i.push({x:v,y:r}),i.push({x:y,y:r})}}}r.push({x:0,y:-s,z:0});const u=r.length-1;for(let e=0;e<o;e++){const t=c-2,r=0==e?o-1:e-1,s=0==e?0:1-1*e/o,a=1-1*r/o,l=1-(t+1)/c;n.push(u),n.push(t*o+1+r),n.push(t*o+1+e),i.push({x:.5,y:0}),i.push({x:a,y:l}),i.push({x:s,y:l})}const h=new MeshGeometry(r,n,i);return h.key=`sphere_${e}_s${t}`,w(h),h}createDefaultGeometry(){return Te.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"segments":this.geometry=Te.createMeshGeometry(this.radius,this.segments)}}};De([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ae.prototype,"radius",void 0),De([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Ae.prototype,"segments",void 0),Ae=Te=De([t.CustomElement({tagName:t.P+"-"+"3d-primitive-sphere"})],Ae);var Ge,Oe=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};let Se=Ge=class PacemTorusElement extends Pacem3DPrimitiveElement{static createMeshGeometry(e=1,t=.25,r=24,i=12){const n=[],s=[],o=[],a=l*(360/r),c=l*(360/i),u=e,h=t;for(let e=0;e<r;e++){const t=a*e-Math.PI/2,l=Math.sin(t),p=Math.cos(t);for(let t=0;t<i;t++){const a=c*t+Math.PI,d=Math.cos(a),m=u*p+h*d*p,f=h*Math.sin(a),g=u*l+h*d*l;n.push({x:m,y:f,z:g});const y=e>0?e-1:r-1,v=t>0?t-1:i-1,b=0==e?0:1-1*e/r,x=t>0?1*t/i:1,E=e>0?1-(e-1)/r:1/r,_=t>0?(t-1)/i:1-1/i;o.push(e*i+v),o.push(y*i+v),o.push(y*i+t),o.push(e*i+v),o.push(y*i+t),o.push(e*i+t),s.push({x:b,y:_}),s.push({x:E,y:_}),s.push({x:E,y:x}),s.push({x:b,y:_}),s.push({x:E,y:x}),s.push({x:b,y:x})}}const p=new MeshGeometry(n,o,s);return p.key=`torus_${e}x${t}_t${r}_s${i}`,w(p),p}createDefaultGeometry(){return Ge.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"innerRadius":case"segments":case"sides":this.geometry=Ge.createMeshGeometry(this.radius,this.innerRadius,this.segments,this.sides)}}};Oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Se.prototype,"radius",void 0),Oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Se.prototype,"innerRadius",void 0),Oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Se.prototype,"segments",void 0),Oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Se.prototype,"sides",void 0),Se=Ge=Oe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-torus"})],Se);class AdapterUtils{static isMeshGeometry(e){return"positions"in e&&t.Utils.isArray(e.positions)&&"triangleIndices"in e&&t.Utils.isArray(e.triangleIndices)}static isVector3D(e){return"x"in e&&"number"==typeof e.x&&"y"in e&&"number"==typeof e.y&&"z"in e&&"number"==typeof e.z}static isRgba(e){return"r"in e&&"number"==typeof e.r&&"g"in e&&"number"==typeof e.g&&"b"in e&&"number"==typeof e.b}static flattenVectorArray(e){const t=[];for(let r of e)AdapterUtils.isVector3D(r)?t.push(r.x,r.y,r.z):AdapterUtils.isRgba(r)?t.push(r.r,r.g,r.b,r.a??1):t.push(r.x,r.y);return t}static findCamera(e){return(e||[]).find(e=>g(e)&&!e.hide)}clipPixel(r,i){return i instanceof HTMLElement&&(i=t.Utils.offsetRect(i)),function(r,i){let n,s;if(e.Point.isPoint(r))n=r.x,s=r.y;else{const{page:e}=t.CustomEventUtils.getEventCoordinates(r),o={x:e.x-i.x,y:e.y-i.y};n=o.x,s=o.y}return{x:n/i.width*2-1,y:s/i.height*-2+1}}(r,i)}}var ke=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};function $e(e){return AdapterUtils.flattenVectorArray(e)}const Ie="0.152.2",We={VERSION:Ie,API_URI:`https://unpkg.com/three@${Ie}/build/three.min.js`,ORBIT_URI:"https://unpkg.com/three@0.147.0/examples/js/controls/OrbitControls.js",LOADERS:[],DEFAULT_MATERIAL:function(){return new THREE.MeshStandardMaterial({color:"#069",flatShading:!0})}};function ze(r){if(t.Utils.isNull(r))return null;const i={color:"string"==typeof r.color?r.color:e.Colors.stringify(r.color),opacity:r.opacity??1,transparent:!0,wireframe:r.wireframe??!1,visible:r.visible??!0},n=t.Utils.extend({},i,{wireframe:r.wireframe??!1}),s=e=>(r.map&&(e.map=(new THREE.TextureLoader).load(r.map,t=>{e.needsUpdate=!0})),e);if(W(r)){return s(new THREE.MeshStandardMaterial(t.Utils.extend(n,{roughness:r.roughness,metalness:r.metalness,emissive:r.emissiveColor,flatShading:r.flatShading,refractionRatio:r.refractionRatio})))}if(I(r)){return s(new THREE.MeshPhongMaterial(t.Utils.extend(n,{shininess:r.shininess,emissive:r.emissiveColor,flatShading:r.flatShading,specular:r.specularColor,reflectivity:r.reflectivity,refractionRatio:r.refractionRatio})))}if($(r)){return s(new THREE.MeshLambertMaterial(t.Utils.extend(n,{emissive:r.emissiveColor,reflectivity:r.reflectivity,refractionRatio:r.refractionRatio})))}if(k(r)){const e=r.dashArray&&r.dashArray[0]||null,n=r.dashArray&&r.dashArray.length>1&&r.dashArray[1]||e,s=t.Utils.extend(i,{linecap:r.lineCap??"round",linejoin:r.lineJoin??"round",linewidth:r.lineWidth??1});return t.Utils.isNullOrEmpty(r.dashArray)?new THREE.LineBasicMaterial(s):new THREE.LineDashedMaterial(t.Utils.extend({dashSize:e,gapSize:n},s))}if(O(r)){return s(new THREE.MeshBasicMaterial(n))}return null}function je(e){if(t.Utils.isNullOrEmpty(e.content))throw new Error("Missing content.");{const t=e.type?.toLowerCase();if("obj"===t){return(new THREE.OBJLoader).parse(e.content)}return(new THREE.ObjectLoader).parse(e.content)}}function Ve(e){if(t.Utils.isNullOrEmpty(e.geometry))return null;return new(e.geometry instanceof LineGeometry?THREE.Line:THREE.Mesh)}function He(){return"THREE"in window}let Fe=class Pacem3DThreeAdapterElement extends Pacem3DAdapterElement{constructor(){super(...arguments),this._renderer=null,this._camera=null,this._scene=null,this._orbitCtrls=null,this._objects=new WeakMap,this._dict={},this._orbitControlsDelegate=e=>{},this._ensureAndRefresh=(e,i,n)=>{if(i.matrixAutoUpdate=!1,i.visible=!e.hide){if(x(e)){let r=i;if(e.flags.indexOf(h.Geometry)>=0){r.geometry.dispose();const s=Ve(e);s.constructor.name!==r.constructor.name&&(n.remove(i),delete this._dict[i.id],i=r=s),r.geometry=function(e){const r=new THREE.BufferGeometry,i=$e(e.positions);if(r.setAttribute("position",new THREE.Float32BufferAttribute(i,3)),e instanceof MeshGeometry){t.Utils.isNullOrEmpty(e.triangleIndices)||r.setIndex(e.triangleIndices);const i=$e(e.positions);r.setAttribute("position",new THREE.Float32BufferAttribute(i,3));const n=$e(e.textureCoordinates);if(r.setAttribute("uv",new THREE.Float32BufferAttribute(n,2)),t.Utils.isNullOrEmpty(e.normals))r.computeVertexNormals();else{const t=$e(e.normals);r.setAttribute("normal",new THREE.Float32BufferAttribute(t,3))}}return r}(e.geometry)}if(e.flags.indexOf(h.Material)>=0){if(t.Utils.isArray(r.material))for(let e of r.material)e.dispose();else r.material.dispose();r.material=function(e,r,i){const n=i,s=[],o=ze(e);if(t.Utils.isNull(o)||(o.side=THREE.FrontSide,s.push(o)),!t.Utils.isNull(r))if(r==e)o.side=THREE.DoubleSide;else{const e=ze(r);t.Utils.isNull(e)||(e.side=THREE.BackSide,s.push(e))}return n&&s.length>1?s:o}(e.material)||We.DEFAULT_MATERIAL()}}else if(e instanceof U&&(e.flags.indexOf(h.Material)>=0||e.flags.indexOf(h.Geometry)>=0))i.parent&&i.parent.remove(i),i=je(e);else if(e instanceof B){if(e.flags.indexOf(h.Children)>=0){for(let e=i.children.length-1;e>=0;e--){const t=i.children[e];i.remove(t)}for(let t of e.items)this._addOrUpdateItem(t,i)}}else if(e instanceof L){const t=i;e.flags.indexOf(h.Light)>=0&&(t.color=new THREE.Color(e.color),t.intensity=e.intensity)}let o=e.position;if(f(e)&&!t.Utils.isNull(e.transformMatrix)&&(e.flags.indexOf(h.Position)>=0||e.flags.indexOf(h.Transform)>=0)){const t=r.Geometry.LinearAlgebra.Matrix3D.from(1,0,0,0,0,1,0,0,0,0,1,0,o.x,o.y,o.z,1),n=r.Geometry.LinearAlgebra.Matrix3D.multiply(e.transformMatrix,t);THREE.Matrix4.prototype.set.apply(i.matrix,[(s=n).m11,s.m21,s.m31,s.offsetX,s.m12,s.m22,s.m32,s.offsetY,s.m13,s.m23,s.m33,s.offsetZ,s.m14,s.m24,s.m34,s.m44])}else e.flags.indexOf(h.Position)>=0&&(i.position.set(o.x,o.y,o.z),i.updateMatrix())}var s;return i.userData=e.tag,t.Utils.isNull(n.getObjectById(i.id))&&(n.add(i),this._dict[i.id]=e),e.flags.splice(0),i}}_assertMonoStage(e){if(e!=this._3d&&!t.Utils.isNull(this._3d))throw new Error("Stage mismatch.")}dispose(e){}snapshot(e,r,i,n){if(e!=this._3d)return Promise.resolve(null);const s=!t.Utils.isNullOrEmpty(r),o=i??(s?"image/jpeg":null),a=n??(s?.9:null);return new Promise((e,i)=>{this.render(),t.Utils.snapshotElement(this._stage,r,o,a).then(e)})}project(e,r){if(this._assertMonoStage(e),t.Utils.isNull(this._camera)||t.Utils.isNull(this._stage))return null;const i=this._stage,n=new THREE.Vector3(r.x,r.y,r.z),s=i.width/2,o=i.height/2,a=n.project(this._camera);return{x:a.x*s+s,y:-a.y*o+o}}zoomFit(e,...r){return this._assertMonoStage(e),new Promise((e,i)=>{const n=this._camera,s=this._objects,o=r.filter(e=>s.has(e)).map(e=>s.get(e));(t.Utils.isNull(n)||t.Utils.isNullOrEmpty(o))&&e(),function(e,r,i,n=1.333){const s=new THREE.Box3;for(const e of i)s.expandByObject(e);const o=s.getSize(new THREE.Vector3),a=s.getCenter(new THREE.Vector3),l=Math.max(o.x,o.y,o.z)/(2*Math.atan(Math.PI*e.fov/360)),c=l/e.aspect,u=n*Math.max(l,c),h=!t.Utils.isNull(r);var p;h&&(p=r.target.clone().sub(e.position).normalize().multiplyScalar(u),r.maxDistance=10*u,r.target.copy(a)),e.near=u/100,e.far=100*u,e.updateProjectionMatrix(),h&&(e.position.copy(r.target).sub(p),r.update())}(n,this._orbitCtrls,o),e()})}getScene(e){return this._assertMonoStage(e),this._scene}raycast(e,r,i,n){if(this._assertMonoStage(e),He()&&!t.Utils.isNull(this._camera)){const e=this._camera,t=new THREE.Vector2(r.x/i.width*2-1,-r.y/i.height*2+1),s=new THREE.Raycaster;s.setFromCamera(t,e);const o=s.intersectObjects(this._scene.children,!0);let a,l,c=0;for(;o.length>c&&(l=o[c++])&&(a=l.object);){if(this._dict[a.id].inert)continue;const e=l.point,t={x:e.x,y:e.y,z:e.z};return void n({object:this._dict[a.id],point:t})}}n(null)}async initialize(r){if(!t.Utils.isNull(this._stage))return this._stage;this._3d=r;const i=r.stage,n=this._stage=document.createElement("canvas");i.innerHTML="",i.appendChild(n),He()||(await t.CustomElementUtils.importjs(We.API_URI),await async function(...e){const t=Date.now();var r=!1;do{r=He();for(let t of e)r&&=t();r||await new Promise(e=>setTimeout(e,500))}while(!r&&Date.now()-t<3e4);if(!r)throw new Error("The wait for THREE adapter initialization timed out.")}(),await Promise.all([t.CustomElementUtils.importjs(We.ORBIT_URI)].concat(We.LOADERS.map(e=>t.CustomElementUtils.importjs(e))))),this._scene=new THREE.Scene,this.invalidateSize(r);let s=this._stage.width,o=this._stage.height,a={canvas:n,antialias:!0,stencil:!1,alpha:r.transparent??!0};if(this._renderer=new THREE.WebGLRenderer(a),this._renderer.setSize(s,o),r.background&&!r.transparent){let t=r.background;"string"==typeof t&&(t=e.Colors.parse(t));const i=new THREE.Color(t.r,t.g,t.b);this._renderer.setClearColor(i,t.a)}return this.orbit=r.orbit,n}_setCamera(e){this._camera=e,this.invalidateSize(this._3d),this._disposeOrbitControls(),this.orbit&&this._initOrbitControls()}propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"orbit"===e&&(!0===r?this._initOrbitControls():this._disposeOrbitControls())}_initOrbitControls(){const e=this._camera;if(t.Utils.isNull(this._3d)||t.Utils.isNull(e))return;(this._orbitCtrls=new THREE.OrbitControls(e,this._3d.stage)).addEventListener("change",this._orbitControlsDelegate)}_disposeOrbitControls(){const e=this._orbitCtrls;t.Utils.isNull(e)||(e.removeEventListener("change",this._orbitControlsDelegate),e.dispose())}_updateRenderer(t,r=this._renderer){if(t.transparent)r.setClearAlpha(0);else if(t.background){let i=t.background;"string"==typeof i&&(i=e.Colors.parse(i));const n=new THREE.Color(i.r,i.g,i.b);r.setClearColor(n,i.a)}else r.setClearColor(null)}invalidateSize(e,r=e.size){if(this._assertMonoStage(e),!He()||t.Utils.isNull(r))return;let i=r.width,n=r.height;this._stage.width=i,this._stage.height=n;let s=this._camera;s instanceof THREE.PerspectiveCamera&&(s.aspect=i/n,s.updateProjectionMatrix()),this._renderer&&(this._renderer.setSize(i,n),this._updateRenderer(e))}removeItem(e,r){this._assertMonoStage(e);const i=this._objects,n=i.get(r);t.Utils.isNull(n)||(this._scene.remove(n),delete this._dict[n.id],i.delete(r))}updateItem(e,r){this._assertMonoStage(e);const i=this._objects;if(!t.Utils.isNull(r.parent)&&i.has(r.parent)){const e=i.get(r.parent);this._addOrUpdateItem(r,e)}else this._addOrUpdateItem(r)}addItem(e,t){this._assertMonoStage(e),this._addOrUpdateItem(t)}_addOrUpdateItem(e,r=this._scene){if(He()&&!t.Utils.isNull(r))if(e instanceof Pacem3DCameraElement)if(e instanceof T){if(this._camera instanceof THREE.PerspectiveCamera)var i=this._camera;else i=new THREE.PerspectiveCamera;const r=new THREE.Vector3(e.lookAt.x,e.lookAt.y,e.lookAt.z);i.lookAt(r),i.position.set(e.position.x,e.position.y,e.position.z),i.fov=e.fov,i.aspect=e.aspect,i.near=e.near,i.far=e.far,this._setCamera(i);const n=this._orbitCtrls;t.Utils.isNull(n)||n.object!==i||(n.target=r,n.update())}else{if(!(e instanceof D))throw new Error(`Camera ${e} not supported.`);{if(this._camera instanceof THREE.OrthographicCamera)var n=this._camera;else n=new THREE.OrthographicCamera;const r=new THREE.Vector3(e.lookAt.x,e.lookAt.y,e.lookAt.z);n.lookAt(r),n.position.set(e.position.x,e.position.y,e.position.z),n.left=e.left,n.right=e.right,n.top=e.top,n.bottom=e.bottom,n.near=e.near,n.far=e.far,this._setCamera(n);const i=this._orbitCtrls;t.Utils.isNull(i)||i.object!==n||(i.target=r,i.update())}}else if(this._objects.has(e)){const t=this._objects.get(e),i=this._ensureAndRefresh(e,t,r);i!=t&&this._objects.set(e,i)}else{const t=t=>{t&&(t=this._ensureAndRefresh(e,t,r),this._objects.set(e,t))};if(e instanceof U){t(je(e))}else if(e instanceof N){t(Ve(e))}else if(e instanceof L){const r=function(e){var t;if("spot"===e.type){const r=new THREE.SpotLight;r.target.position.set(e.target.x,e.target.y,e.target.z),t=r}else t=new THREE.PointLight;return t}(e);t(r)}else if(e instanceof B){t(new THREE.Group)}}}render(){this._camera&&this._renderer.render(this._scene,this._camera)}};ke([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],Fe.prototype,"orbit",void 0),Fe=ke([t.CustomElement({tagName:t.P+"-3d-three-adapter"})],Fe);const Xe="pacem-3d-",Ye="color",Ze="ambient",qe="lighting",Je="VertexInput",Qe="VertexOutput",Ke="InteractionData";var et,tt,rt,it,nt;!function(e){e[e.COPY_SRC=4]="COPY_SRC",e[e.COPY_DST=8]="COPY_DST",e[e.INDEX=16]="INDEX",e[e.INDIRECT=256]="INDIRECT",e[e.MAP_READ=1]="MAP_READ",e[e.MAP_WRITE=2]="MAP_WRITE",e[e.QUERY_RESOLVE=512]="QUERY_RESOLVE",e[e.STORAGE=128]="STORAGE",e[e.UNIFORM=64]="UNIFORM",e[e.VERTEX=32]="VERTEX"}(et||(et={})),function(e){e[e.COPY_SRC=1]="COPY_SRC",e[e.COPY_DST=2]="COPY_DST",e[e.RENDER_ATTACHMENT=16]="RENDER_ATTACHMENT",e[e.STORAGE_BINDING=8]="STORAGE_BINDING",e[e.TEXTURE_BINDING=4]="TEXTURE_BINDING"}(tt||(tt={})),function(e){e[e.VERTEX=1]="VERTEX",e[e.FRAGMENT=2]="FRAGMENT",e[e.COMPUTE=4]="COMPUTE"}(rt||(rt={})),function(e){e[e.READ=1]="READ",e[e.WRITE=2]="WRITE"}(it||(it={})),function(e){e.Mesh="mesh",e.Camera="camera",e.Texture="texture",e.Light="light",e.Interaction="interaction"}(nt||(nt={}));class Buffers{static create(e,t,r=""){const i=e.createBuffer({size:t.byteLength,label:r,usage:et.VERTEX|et.COPY_DST,mappedAtCreation:!0});return new Float32Array(i.getMappedRange()).set(t),i.unmap(),i}static createUniform(e,t,r=""){return e.createBuffer({size:t.byteLength,label:r,usage:et.UNIFORM|et.COPY_DST})}static createStorage(e,t,r=""){return e.createBuffer({size:t.byteLength,label:r,usage:et.STORAGE|et.COPY_DST})}static createIndexed(e,t,r=""){const i=e.createBuffer({size:t.byteLength,label:r,usage:et.INDEX|et.COPY_DST,mappedAtCreation:!0});return new Uint16Array(i.getMappedRange()).set(t),i.unmap(),i}}class BufferLayouts{static createVertex(e=0,t=3,...r){const i=[];let n=0,s=0;for(let o of[t].concat(r))i.push({shaderLocation:e+s,offset:n*Float32Array.BYTES_PER_ELEMENT,format:`float32x${o}`}),n+=o,s++;return{arrayStride:n*Float32Array.BYTES_PER_ELEMENT,attributes:i,stepMode:"vertex"}}}const st={outputNormalLocation:0,outputVertexLocation:1,outputUvLocation:2,outputVertexIndexLocation:3,outputRayIndexLocation:4,outputInstanceIndexLocation:5,storageMaterialGroupIndex:2,storageMaterialBindingIndex:0};function ot(e=[]){return e.join("\r\n")}function at(e={},r=st){const i=t.Utils.extend({},st,r),n=ot(e.definitions),s=ot(e.bindings),o=function(e=[]){let t="";for(let r of e){const e=r.trim();e.endsWith(";")?t+=e+"\r\n\t":t+=`${Ye} = ${e};\r\n\t`}return t}(e.modifiers),a=Ye,l=qe,c=Ze;return`// definitions\n\n${n}\n\n// bindings\n@group(${i.storageMaterialGroupIndex}) @binding(${i.storageMaterialBindingIndex}) var<storage, read> diffuseColor: vec4f;\n${s}\n\nconst empty = vec4f(0,0,0,0);\nconst white = vec4f(1,1,1,1);\n\n@fragment fn main (\n @builtin(position) position: vec4f, // clip-space position\n @location(${i.outputNormalLocation}) normal: vec3f, // world-space normal\n @location(${i.outputVertexLocation}) vertex: vec3f, // world-space position\n @location(${i.outputUvLocation}) uv: vec2f,\n @location(${i.outputVertexIndexLocation}) @interpolate(flat) index: u32, // vertex index,\n @location(${i.outputRayIndexLocation}) ray: vec3f, // ray (eye-to-vertex) vector\n @location(${i.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n) -> @location(0) vec4f {\n var ${a} = diffuseColor;\n var ${c}: vec4f = empty;\n var ${l}: vec4f = empty;\n\n // modifiers\n ${o}\n\n ${l} = select(white, ${l}, ${l}.a > 0);\n return ${a} * ${l} + ${c};\n}`}const lt={outputInstanceIndexLocation:0,outputVertexIndexLocation:1,storageMaterialGroupIndex:3,storageMaterialBindingIndex:0};function ct(e=[]){return e.join("\r\n")}function ut(e={},r=lt){const i=t.Utils.extend({},lt,r),n=ct(e.definitions),s=ct(e.bindings),o=function(e=[]){let t="";for(let r of e){const e=r.trim();e.endsWith(";")?t+=e+"\r\n":t+=`output = ${e};\r\n`}return t}(e.modifiers);return`// definitions\n${n}\n\n// bindings\n@group(${r.storageMaterialGroupIndex}) @binding(${r.storageMaterialBindingIndex}) var<storage, read> vertexColors: array<vec4f>;\n${s}\n\nfn getVertexColor(index: u32) -> vec4f {\n let numColors = arrayLength(&vertexColors);\n let vertexColorIndex = index % numColors;\n return vertexColors[vertexColorIndex];\n}\n\n@fragment fn main (\n @builtin(position) position: vec4f, // clip-space position\n @location(${i.outputInstanceIndexLocation}) @interpolate(flat) instance: u32, // instance index\n @location(${i.outputVertexIndexLocation}) @interpolate(flat) index: u32 // vertex index\n) -> @location(0) vec4f {\n var output = getVertexColor(index);\n\n // modifiers\n ${o}\n\n return output;\n}`}class Materials{static create(e){if(S(e))return new BasicMaterial(e);if(k(e))return new LineMaterial(e);throw new TypeError(`Material type '${e.shader}' not supported.`)}}const ht={};class MaterialBase{constructor(e){if(t.Utils.isNull(this.#u=e))throw new ReferenceError("Null material provided.")}#u;get material(){return this.#u}get wgsl(){return ht}buffer({device:e},t=Xe+"material-"+this.shader+"-buffer"){const{r:r,g:i,b:n,a:s}=this._diffuseColor(),o=new Float32Array([r,i,n,s]);return{buffer:Buffers.createStorage(e,o,t),value:o,version:performance.now()}}_diffuseColor(){const{visible:r,opacity:i,color:n}=this.material;if(!(r??1))return{r:0,g:0,b:0,a:0};const s="string"==typeof n?e.Colors.parse(n):n??{r:1,g:1,b:1,a:1};return i>=0&&i<=1?t.Utils.extend(s,{a:s.a*i}):s}}class BasicMaterial extends MaterialBase{get shader(){return A.Basic}constructor(e){if(super(e),e.shader!=this.shader)throw new TypeError("Basic material expected.")}texture({device:e},r="texture"){const i=this.material;if("texture"===r&&!t.Utils.isNull(i.texture)){const t=i.texture;return{texture:e.createTexture({format:"rgba8unorm",usage:tt.TEXTURE_BINDING|tt.RENDER_ATTACHMENT|tt.COPY_DST,size:[t.width,t.height]}),source:t}}return null}static{this.fragment=at}}class LineMaterial extends MaterialBase{get shader(){return A.Line}constructor(e){if(super(e),e.shader!=this.shader)throw new TypeError("Line material expected.")}buffer(e,t){if("line"===t){const{device:t,canvas:r}=e,i=this.material,n=new Float32Array([r.clientWidth,r.clientHeight,i.lineWidth/2]);return{buffer:Buffers.createUniform(t,n,Xe+"line-"+this.shader+"-buffer"),value:n,version:performance.now()}}return super.buffer(e)}texture(e){return null}static{this.fragment=ut}}const pt=["input","data"];function dt(e){"string"!=typeof e&&(e=e(...pt));const t=new RegExp(`fn\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*->\\s*(${Je}|${Qe})\\s*{((.|\\n)+)}\\s*$`),r=e.match(t);if(r){const e=r[1],t=r[2].split(",").map(e=>{const t=e.split(":");return{name:t[0].trim(),type:t[1].trim()}});if(2!==t.length||t[0].type!==r[3]||t[1].type!==Ke)throw new Error(`Invalid modifier function. Invalid signature types (arg1: ${t[0]?.type}, arg2: ${t[1]?.type})`);const i=r[4].trim();return{name:e,args:t.map(e=>e.name),body:i}}throw new Error(`Invalid modifier function. Must be a valid WGSL function with the signature: fn name(arg1: ${Je}|${Qe}, arg2: ${Ke}) -> ${Je}|${Qe}`)}const mt={outputNormalLocation:0,outputVertexLocation:1,outputUvLocation:2,outputVertexIndexLocation:3,outputInstanceIndexLocation:5,outputRayLocation:4,inputPositionLocation:0,inputNormalLocation:1,inputUvLocation:2,uniformViewBindingIndex:0,uniformViewGroupIndex:0,uniformWorldBindingIndex:0,uniformWorldGroupIndex:1,uniformInteractionBindingIndex:1,uniformInteractionGroupIndex:0};const ft={inputPositionLocation:0,outputInstanceIndexLocation:0,outputVertexIndexLocation:1,storagePositionsGroupIndex:2,storagePositionsBindingIndex:0,uniformDimensionsGroupIndex:2,uniformDimensionsBindingIndex:1,uniformViewGroupIndex:0,uniformViewBindingIndex:0,uniformWorldGroupIndex:1,uniformWorldBindingIndex:0};function gt(e){return`struct ${Qe} {\n @builtin(position) position : vec4f, // clip space position\n @location(${e.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n @location(${e.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\n}`}function yt(e=2){return`struct ColorPicker {\n id: u32,\n };\n\n @group(${e}) @binding(0) var<uniform> colorPicker: ColorPicker;\n\n @fragment\n fn main(@builtin(position) position: vec4f) -> @location(0) u32 {\n return colorPicker.id;\n }\n `}const vt={uv:"uv"};const bt={normal:"normal",inputColor:"white"};function xt(e,r,i){const n=`directional_${t.Utils.uniqueCode()}`,s=t.Utils.extend({},bt,e),o=s.inputColor,a=s.outputColor,l=s.normal??"normal";if(t.Utils.isNullOrEmpty(o))throw new Error("Must provide input vertex color parameter name.");return{definitions:["struct DirectionalLight {\n color: vec4f,\n direction: vec3f,\n intensity: f32\n}","fn computeDirectional(normal: vec3f, color: vec4f, light: DirectionalLight) -> vec4f {\n let n = normalize(normal);\n let d = normalize(light.direction);\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\n let output = color.rgb * light.color.rgb * factor;\n return vec4f(output, color.a);\n}"],bindings:[`@group(${r}) @binding(${i}) var<uniform> ${n}: DirectionalLight;`],modifiers:a?[`${a} += computeDirectional(${l}, ${o}, ${n});`]:[`computeDirectional(${l}, ${o}, ${n})`]}}const Et={normal:"normal",position:"vertex",ray:"ray",inputColor:"white",specularColor:"empty",shininess:"0"};function _t(e,r,i){const n=`omni_${t.Utils.uniqueCode()}`,s=t.Utils.extend({},Et,e),o=s.inputColor,a=s.outputColor,l=s.normal,c=s.ray,u=s.position,h=s.shininess,p=s.specularColor;if(t.Utils.isNullOrEmpty(o))throw new Error("Must provide input vertex color parameter name.");return{definitions:["struct OmniLight {\n color: vec4f,\n position: vec3f,\n intensity: f32\n}","fn computeOmni(position: vec3f, normal: vec3f, ray: vec3f, color: vec4f, specularColor: vec4f, shininess: f32, light: OmniLight) -> vec4f {\n\n // color\n let n = normalize(normal);\n let d = normalize(position - light.position);\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\n\n // specular\n let r = normalize(ray);\n let halfVector = normalize(d + r);\n let specular = specularColor.rgb * shininess * dot(n, -halfVector);\n\n let output = color.rgb * light.color.rgb * factor + specular;\n return vec4f(output, color.a);\n}"],bindings:[`@group(${r}) @binding(${i}) var<uniform> ${n}: OmniLight;`],modifiers:a?[`${a} += computeOmni(${u}, ${l}, ${c}, ${o}, ${p}, ${h}, ${n});`]:[`computeOmni(${u}, ${l}, ${c}, ${o}, ${p}, ${h}, ${n})`]}}function Ct(e,r,i){const n=`ambient_${t.Utils.uniqueCode()}`,s=e.inputColor,o=e.outputColor;if(t.Utils.isNullOrEmpty(s)||t.Utils.isNullOrEmpty(o))throw new Error("Must provide either input and output vertex color parameter names.");return{definitions:["struct AmbientLight {\n color: vec4f,\n intensity: f32\n}","fn computeAmbient(color: vec4f, light: AmbientLight) -> vec4f {\n return vec4f(light.intensity * color.rgb * light.color.rgb, color.a);\n}"],bindings:[`@group(${r}) @binding(${i}) var<uniform> ${n}: AmbientLight;`],modifiers:[`${o} = computeAmbient(${s}, ${n});`]}}const wt=r.Geometry.LinearAlgebra.Vector3D,Pt=r.Geometry.LinearAlgebra.Matrix3D,Mt={width:1,height:1};class Cameras{static create(e){if(y(e))return new PerspectiveCamera(e);if(v(e))return new OrthographicCamera(e);throw new TypeError(`Camera type '${e.type}' not supported.`)}}function Rt(e,t,r){const i=wt.subtract(t,e),n=wt.cross(r,i),s=wt.cross(i,n);wt.normalize(n),wt.normalize(i),wt.normalize(s);const o=-wt.dot(n,e),a=-wt.dot(s,e),l=-wt.dot(i,e);return Pt.from(n.x,s.x,i.x,0,n.y,s.y,i.y,0,n.z,s.z,i.z,0,o,a,l,1)}function Bt(e,t){if(e<=0)throw new RangeError("Near plane distance must be positive.");if(t<=e)throw new RangeError("Far plane distance must be greater than near plane distance.")}class OrthographicCamera{constructor(e){this._camera=e}static view(e){return Rt(e.position,e.lookAt,e.up)}static projection(e,t=Mt){const r=e.position,i=e.lookAt,n=wt.subtract(i,r);wt.normalize(n);const s=wt.dot(n,r),{height:o,width:a}=t,l=.5*s,c=l*(a/o),u=l,h=e.top*u,p=e.bottom*u,d=e.right*c;return function(e,t,r,i,n=.1,s=1e3){return Bt(n,s),Pt.from(2/(t-e),0,0,0,0,2/(r-i),0,0,0,0,1/(n-s),0,(e+t)/(e-t),(r+i)/(i-r),n/(n-s),1)}(e.left*c,d,h,p,e.near,e.far)}view(){return OrthographicCamera.view(this._camera)}projection(e){return OrthographicCamera.projection(this._camera,e)}}class PerspectiveCamera{constructor(e){this._camera=e}static view(e){return Rt(e.position,e.lookAt,e.up)}static projection(e,t=Mt){const r=t.width/t.height/e.aspectRatio;return function(e=120,t=1,r=.1,i=1e3){Bt(r,i);const n=Math.tan(.5*Math.PI*(1-e/180)),s=n/t,o=Number.isFinite(i),a=o?i/(r-i):-1,l=o?i*r/(r-i):-r;return Pt.from(s,0,0,0,0,n,0,0,0,0,a,-1,0,0,l,0)}(e.fov,r,e.near,e.far)}view(){return PerspectiveCamera.view(this._camera)}projection(e){return PerspectiveCamera.projection(this._camera,e)}}const Nt=r.Geometry.LinearAlgebra.Vector3D,Ut=r.Geometry.LinearAlgebra.Matrix3D;function Lt(e,t){throw"function"==typeof t&&(t=t.name),new RangeError(`Buffer '${e}' not available for ${t}.`)}function Tt(e,r,...i){if(e.stage??=r?.item.stage,C(e))return e.key??="group_"+t.Utils.uniqueCode(),new RenderableGroupBuffer(e,r,...i);if(x(e))return e.key??="mesh_"+t.Utils.uniqueCode(),new RenderableMeshBuffer(e,r,...i);if(g(e))return e.key??="camera_"+t.Utils.uniqueCode(),new RenderableCameraBuffer(e);if(b(e))return e.key??="light_"+e.type+"_"+t.Utils.uniqueCode(),new RenderableLightBuffer(e);throw new Error("Renderable is not supported.")}class RenderLooper{constructor(e){this._set=e}get items(){return this._set}loop(e){const{meshes:t,cameras:r,groups:i,lights:n}=this._set,s=r[0];let o=!1,a=!1;for(let r of t){if(r.disposed)continue;e(r,s,n)&&(RenderableBuffers.clearFlags(r),o||(RenderableBuffers.clearFlags(s),o=!0),a||(n.forEach(e=>RenderableBuffers.clearFlags(e)),a=!0))}for(let e of i)RenderableBuffers.clearFlags(e)}}class ManagedBuffers{static create(e){if(E(e))return e.key??="geometry_"+t.Utils.uniqueCode(),new GeometryBuffer(e);if(O(e))return new MaterialBuffer(e);if(M(e))return new InteractionBuffer(e);throw new Error("Object is not supported.")}}class RenderableBuffers{static create(e,...t){return Tt(e,null,...t)}static clearFlags(e,r=!1){if(e.item.flags.splice(0),r){const r=e;t.Utils.isNull(r.parent)||RenderableBuffers.clearFlags(r.parent,!0)}}static allFlags(e){const r=e,i=r.parent,n=t.Utils.isNull(i)?[]:RenderableBuffers.allFlags(i);return r.item.flags.union(n)}}class ManagedBufferBase{#h;constructor(e){this.#h=e}get item(){return this.#h}#p=!1;lock(){this.#p=!0}unlock(){this.#p=!1;const e=this.#d;for(;e.length>0;){const t=e.shift();this._destroyUnsafe(t)}}#d=[];_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.#d.splice(0)))t&&(this.#p?this.#d.push(t):this._destroyUnsafe(t))}#m=!1;destroy(){this.dispose(),this.#m=!0}get disposed(){return this.#m}}class RenderableBufferBase extends ManagedBufferBase{constructor(e,r){super(e),this.#f=r,this.#g=t.Utils.uniqueId()%4294967295}#g;#f;#y=new Map;get parent(){return this.#f}get id(){return this.#g}allFlags(){const e=this.parent;return this.item.flags.union(e?.allFlags()??[])}buildParentWorldTransform(){let e=Ut.identity(),r=this;for(;!t.Utils.isNull(r.parent);){const t=r.parent.item,i=Ut.translate(t.transformMatrix??Ut.identity(),t.position??Nt.zero());e=Ut.multiply(e,i),r=r.parent}return e}buildWorldTransform(){const e=Ut.translate(this.item.transformMatrix??Ut.identity(),this.item.position??Nt.zero()),t=this.buildParentWorldTransform();return Ut.multiply(e,t)}#v=new Map;version(e){return this.#v.get(e)??0}buffer(e,r){if("u32id"===r){const r=this.#y,{pipeline:i,device:n}=e;if(r.has(i))return t.Utils.extend({fresh:!1},r.get(i));const s=new Uint32Array([this.id]),o=Buffers.createUniform(n,s,Xe+"u32id-buffer"),a=t.Utils.extend({buffer:o,value:s,version:performance.now()},{fresh:!0});return this.#y.set(i,a),a}const i=this.specificBuffer(e,r);return this.#v.set(r,i.version),i}}const Dt={shader:A.Basic,color:"#c0c0c0",flags:[]};class RenderableGroupBuffer extends RenderableBufferBase{#n;constructor(e,t,...r){super(e,t),this.#n=e.childRenderables.map(e=>Tt(e,this,...r))}get children(){return this.#n}specificBuffer(e,t){return null}texture(e){throw new Error("Method not implemented.")}dispose(){this.#n.forEach(e=>e.destroy())}}class RenderableCameraBuffer extends RenderableBufferBase{#b=new Map;#x;constructor(e){super(e)}texture(e){throw new Error("Method not implemented.")}specificBuffer(e,r){let i=!1;(this.allFlags().length>0||t.Utils.isNull(this.#x))&&(i=!0,this.#b.clear(),this._rebuildMatrices(e));const{pipeline:n}=e;if(this.#b.has(n)||(i=!0,this.#b.set(n,this.#x)),RenderableBuffers.clearFlags(this),"cameraViewTransform"===r)return t.Utils.extend(this.#x,{fresh:i});Lt(r,RenderableCameraBuffer)}_rebuildMatrices({device:e,canvas:r}){const i=this.item,n=Cameras.create(i),{x:s,y:o,z:a}=i.position,l=n.view(),c=n.projection(r),u=Ut.multiply(l,c),h=new Float32Array(36);if(h.set(Ut.toArray(l),0),h.set(Ut.toArray(u),16),h.set([s,o,a],32),t.Utils.isNull(this.#x)){const t=Buffers.createUniform(e,h,Xe+"view-buffer");this.#x={buffer:t,value:h,version:performance.now().roundoff()}}else this.#x.value=h,this.#x.version=performance.now().roundoff()}_destroyView(){this.#b.clear();const e=this.#x;this.#x=null,this.destroySafely(e)}dispose(){this._destroyView()}}class GeometryBuffer extends ManagedBufferBase{#E={};#_={positions:!0,normals:!0,uv:!0,packed:!0};#C;constructor(e){super(e),e.flags??=[]}buffer(e,r){const i=this.item.flags??[];(t.Utils.isNull(this.#C)||i.includes(h.Geometry))&&(i.splice(0),this.#E={},this._rebuildGeometryBuffers(e));const n=this.#_,s=this.#C,{pipeline:o}=e,a=this.#E[r]??=new Map,l=!a.has(o),c=e=>(l&&a.set(o,e),e);switch(r){case"geometryPositions":const{positions:e}=s,i=n.positions;return n.positions=!1,t.Utils.extend(c(e),{fresh:i||l});case"geometryNormals":const{normals:o}=s,a=n.normals;return n.normals=!1,t.Utils.extend(c(o),{fresh:a||l});case"geometryTexCoords":const{uv:u}=s,h=n.uv;return n.uv=!1,t.Utils.extend({fresh:h||l},c(u));case"geometry":const{packed:p}=s,d=n.packed;return n.packed=!1,t.Utils.extend(c(p),{fresh:d||l});default:Lt(r,GeometryBuffer)}}texture(e){throw new Error("Method not implemented.")}_rebuildGeometryBuffers({device:e}){this._destroyBuffers();const r=performance.now(),i=this.item,n=i.key;if(_(i)){const s=i,o=!t.Utils.isNullOrEmpty(s.triangleIndices)?s.triangleIndices.map(e=>s.positions[e]):s.positions,a=2*o.length,l=a+o.length,c=new Float32Array(l),u=new Float32Array(l),h=new Float32Array(a),p=new Float32Array(2*l+a);for(let e=0;e<o.length;e++){const t=2*e,r=3*e,{x:i,y:n,z:a}=o[e],{x:l,y:d,z:m}=s.normals[e],{x:f,y:g}=s.textureCoordinates[e];c.set([i,n,a],r),u.set([l,d,m],r),h.set([f,g],t),p.set([i,n,a,l,d,m,f,g],2*r+t)}const d=Buffers.create(e,c,Xe+"meshgeometry-"+n+"-positions-buffer"),m=Buffers.create(e,u,Xe+"meshgeometry-"+n+"-normals-buffer"),f=Buffers.create(e,h,Xe+"meshgeometry-"+n+"-uvmap-buffer"),g=Buffers.create(e,p,Xe+"meshgeometry-"+n+"-buffer");this.#C={packed:{buffer:g,value:p,version:r},positions:{buffer:d,value:c,version:r},normals:{buffer:m,value:u,version:r},uv:{buffer:f,value:h,version:r}},this.#_={positions:!0,normals:!0,uv:!0,packed:!0}}else{const t=new Float32Array(AdapterUtils.flattenVectorArray(i.positions)),s=Buffers.createStorage(e,t,Xe+"nodegeometry-"+n+"-positions-buffer");this.#C={positions:{buffer:s,value:t,version:r},packed:{buffer:s,value:t,version:r}},this.#_={positions:!0,packed:!0}}}_destroyBuffers(){this.#E={};const e=this.#C;t.Utils.isNull(e)||this.destroySafely(e.positions,e.normals,e.uv)}dispose(){this._destroyBuffers()}}class MaterialBuffer extends ManagedBufferBase{#E={};#w={};#P;#M=new Map;#R=new Map;constructor(e){super(e),e.flags??=[],-1===e.flags.indexOf(h.Material)&&e.flags.push(h.Material)}buffer(e,r){const i=this.item.flags??[];let n=t.Utils.isNull(this.#P);i.includes(h.Material)&&(this.#E={},i.splice(0),n=!0,this.#R.clear(),this._resetMaterialBuffers());const{pipeline:s}=e,o=this.#E[r]??=new Map;switch(r){case"material":case"line":const i=this._ensureMaterialBuffer(e,r);return i?(o.has(s)||(n=!0,o.set(s,i)),t.Utils.extend(i,{fresh:n})):null;default:Lt(r,MaterialBuffer)}}_ensureMaterialBuffer(e,t="material"){const r=this.#M;let i=r.get(t);return i||(r.has(t)?null:(i=this.#P?.buffer(e,t),i&&r.set(t,i),i))}_resetMaterialBuffers(){this.#P=Materials.create(this.item),this._destroyBuffers()}texture(e,r="texture"){const i=this.#R;let n=i.get(r),s=!1;if(!n){if(n=this.#P?.texture(e,r),!n)return null;i.set(r,n),s=!0,this.#w={}}const{pipeline:o}=e,a=this.#w[r]??=new Map;return a.has(o)||(s=!0,a.set(o,n)),t.Utils.extend(n,{fresh:s})}dispose(){this._destroyBuffers()}_destroyBuffers(){this.#E={},this.#w={};const e=this.#M.values();this.#M.clear(),this.destroySafely(...e);const t=this.#R.values();this.#R.clear(),t.forEach(e=>e.texture.destroy())}}class InteractionBuffer extends ManagedBufferBase{#B={time:0,cursor:{x:0,y:0},resolution:{width:0,height:0}};#N;#E=new Map;constructor(e){super(e),t.Utils.extend(this.#B,e)}buffer(e,t){if("interaction"===t)return this._ensureInteractionBuffer(e);Lt(t,InteractionBuffer)}texture(e){throw new Error("Method not implemented.")}_ensureInteractionBuffer(e,r="interaction"){const i=this.#B,n=this.item;let s=!this.#N||n.time!==i.time||n.resolution?.width!==i.resolution.width||n.resolution?.height!==i.resolution.height;if(s||t.Utils.isNull(n.cursor)||(s=n.cursor.x!==i.cursor.x||n.cursor.y!==i.cursor.y),s){const t=new Float32Array([n.cursor?.x??0,n.cursor?.y??0,n.resolution.width,n.resolution.height,n.time,0]),r=Buffers.createUniform(e.device,t,Xe+"interaction-buffer");this.#N={buffer:r,value:t,version:performance.now()},this.#E.clear()}const{pipeline:o}=e,a=this.#E;return a.has(o)||(s=!0,a.set(o,this.#N)),t.Utils.extend(this.#N,{fresh:s})}_destroyBuffers(){this.#E.clear();const e=this.#N;t.Utils.isNull(e)||this.destroySafely(e)}dispose(){this._destroyBuffers()}}class RenderableMeshBuffer extends RenderableBufferBase{#C;#U;#L;#T;#D;#_={geometry:!0,material:!0,transform:!0};#A=new Map;constructor(e,t,r,i){super(e,t),e.flags??=[],-1===e.flags.indexOf(h.Geometry)&&e.flags.push(h.Geometry),-1===e.flags.indexOf(h.Material)&&e.flags.push(h.Material),-1===e.flags.indexOf(h.Position)&&-1===e.flags.indexOf(h.Transform)&&e.flags.push(h.Transform),this.#C=r,this.#L=i}texture(e,t){const r=this.#T;return r?.texture(e,t)}specificBuffer(e,r){const i=this.#_,n=this.allFlags();(t.Utils.isNull(this.#D)||n.includes(h.Position)||n.includes(h.Transform))&&(this.#A.clear(),i.transform=!0,this._rebuildWorldMatrices(e)),(t.Utils.isNull(this.#U)||n.includes(h.Geometry))&&(i.geometry=!0,this._ensureGeometryBuffer()),(t.Utils.isNull(this.#T)||n.includes(h.Material))&&(i.material=!0,this._ensureMaterialBuffer()),RenderableBuffers.clearFlags(this);const s=this.#U,o=this.#T;switch(r){case"geometryPositions":case"geometryNormals":case"geometryTexCoords":case"geometry":return s.buffer(e,r);case"material":case"line":return o.buffer(e,r);case"objectWorldTransform":const n=this.#D,a=i.transform;i.transform=!1;const l=this.#A,{pipeline:c}=e,u=!l.has(c);return u&&l.set(c,n),t.Utils.extend(n,{fresh:a||u});default:Lt(r,RenderableMeshBuffer)}}_ensureGeometryBuffer(){const e=this.#U,r=this.#C,i=this.item.geometry;if(t.Utils.isNull(r))e?.destroy(),this.#U=new GeometryBuffer(i);else{let e=r?.get(i);!1!==e?.disposed&&(e=new GeometryBuffer(i),r.set(i,e)),this.#U=e}}_ensureMaterialBuffer(){const e=this.#T,r=this.#L,i=this.item.material??Dt;if(t.Utils.isNull(r))e?.destroy(),this.#T=new MaterialBuffer(i);else{let e=r?.get(i);!1!==e?.disposed&&(e=new MaterialBuffer(i),r.set(i,e)),this.#T=e}}_rebuildWorldMatrices({device:e}){const r=this.item,i=this.buildWorldTransform(),n=Ut.transpose(Ut.invert(i)),s=new Float32Array(28);if(s.set(Ut.toArray(i),0),s.set([n.m11,n.m12,n.m13,0,n.m21,n.m22,n.m23,0,n.m31,n.m32,n.m33,0],16),t.Utils.isNull(this.#D)){const t=Buffers.createUniform(e,s,Xe+"mesh-"+r.key+"-worldmatrix-buffer");this.#D={buffer:t,value:s,version:performance.now().roundoff()}}else this.#D.value=s,this.#D.version=performance.now().roundoff()}dispose(){this.#A.clear();const e=this.#D;this.#D=null,this.destroySafely(e);const t=this.#T;this.#T=null,t?.destroy();const r=this.#U;this.#U=null,r?.destroy()}}class RenderableLightBuffer extends RenderableBufferBase{#N;#E=new Map;constructor(e){super(e),e.flags.push(h.Light)}_rebuildAmbientLightBuffer({device:t}){const r=this.item,i=new Float32Array(24),{r:n,g:s,b:o,a:a}=e.Colors.parse(r.color??"#fff");i.set([n,s,o,a],0),i.set([r.intensity],4),this.#N={value:i,buffer:Buffers.createUniform(t,i,Xe+"ambient-light-buffer"),version:performance.now()}}_rebuildDirectionalLightBuffer({device:t}){const r=this.item,i=new Float32Array(8),{r:n,g:s,b:o,a:a}=e.Colors.parse(r.color??"#fff");i.set([n,s,o,a],0),i.set([r.intensity],7);const l=Nt.subtract(r.position,r.target);i.set([l.x,l.y,l.z],4),this.#N={value:i,buffer:Buffers.createUniform(t,i,Xe+"directional-light-buffer"),version:performance.now()}}_rebuildOmniLightBuffer({device:t}){const r=this.item,i=new Float32Array(8),{r:n,g:s,b:o,a:a}=e.Colors.parse(r.color??"#fff");i.set([n,s,o,a],0),i.set([r.intensity],7),i.set([r.position.x,r.position.y,r.position.z],4),this.#N={value:i,buffer:Buffers.createUniform(t,i,Xe+"omni-light-buffer"),version:performance.now()}}_rebuildLight(e){this.destroySafely(this.#N);const 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,r){const i=this.#E;let n=t.Utils.isNull(this.#N)||this.allFlags().length>0;n&&(i.clear(),this._rebuildLight(e)),RenderableBuffers.clearFlags(this);const{pipeline:s}=e;if(i.has(s)||(n=!0,i.set(s,this.#N)),"light"===r)return t.Utils.extend(this.#N,{fresh:n});Lt(r,RenderableLightBuffer)}dispose(){this.#E.clear();const e=this.#N;this.#N=null,this.destroySafely(e)}}const At=Xe,Gt={multisample:!0,packedVertices:!0,primitive:{topology:"triangle-list",frontFace:"ccw",cullMode:"back"}},Ot=e=>{};class RenderPipelines{static{this._memoizer=new WeakMap}static dispose(e){const r=this._memoizer,i=r.get(e);t.Utils.isNull(i)||(i.clear(),r.delete(e))}static createColorPicking(e,t){const r=RenderPipelines.create(e,t);return r instanceof MeshRenderPipelineClass||r instanceof LineRenderPipelineClass?{frame:r.raycast}:null}static create(e,[r,i,...n],s){const o=RenderPipelines._memoizer;let a=o.get(e);if(t.Utils.isNull(a)&&o.set(e,a=new Map),t.Utils.isNull(r))throw new Error("Pipeline not implemented, given the provided arguments.");if(x(r.item)){const o=_(r.item.geometry),l=!o&&k(r.item.material);if(!o&&!l)throw new Error("Pipeline not implemented, given the provided mesh argument.");const c=o?new MeshWGSLBuilder(r,i,...n):new LineWGSLBuilder(r,i),u=c.key+(s?.modifiers?.version??""),h=a.get(u);if(h)return h;const p=o?new MeshRenderPipelineClass(e,c):new LineRenderPipelineClass(e,c);p.build(s);const d=p;return t.Utils.extend(d,{id:u+"-"+e.canvas.width+"x"+e.canvas.height+"-"+t.Utils.Dates.now().toISOString()}),a.set(u,d),d}throw new ReferenceError("Pipeline not implemented, given thst the first argument is not a mesh.")}}class RenderPipelineCache{constructor(){this.#G=new Map}#G;ensureBindGroup({device:e},r,i,n,s,o,a=()=>{}){const l=this.#G,c="string"==typeof r?r:r.key;let u=l.get(c);if(t.Utils.isNull(u)&&l.set(c,u=new Map),n||!u.has(o)){const t=i.map((e,t)=>({binding:t,resource:{buffer:e}})),r={label:o,layout:s,entries:t};a(r);const n=e.createBindGroup(r);return u.set(o,n),n}return u.get(o)}}class MeshWGSLBuilder{#O=[];#S;#k;#$=new Map;#I={shader:"basic",lights:""};constructor(...e){this.add(...e)}reset(){this.#O.splice(0),this.#S=null,this.#$.clear(),this.#I={shader:"basic",lights:""}}add(...e){for(let r of e??[])if(x(r.item)){if(!t.Utils.isNull(this.#S))throw new Error("Mesh already added.");{this.#S=r;const e=r.item.material??{shader:A.Basic};this.#I.shader=e.shader+"-"+(e.map?"map":"nomap")}}else if(b(r.item)){this.#O.push(r),this.#I.lights+="-"+r.item.type}else{if(!g(r.item))throw new Error("Unknown object type.");this.#k??=r}}build(e){const t=this._computeBasicData(),r=this.key;return{vertex:this.vertex({inputModifier:e?.vertexInput,outputModifier:e?.vertexOutput}),fragment:this.fragment(t,{modifier:e?.fragment}),key:r,bindings:(...e)=>MeshWGSLBuilder.prototype.bindgroup.apply(this,e),metadata:{lightCount:this.#O.length,mapCount:this.#S.item.material?.map?1:0}}}get key(){const{shader:e,lights:t}=this.#I;return"mesh-"+e+t}bindgroup(e,r,i){const n=this.#$.get(e);if(t.Utils.isNull(n))return null;if(t.Utils.isNullOrEmpty(r))return n;const s=n.filter(e=>e.key===r);return isNaN(i)?s:i>=0&&i<n.length?s[i]:s}vertex(e){return function(e=mt){e!=mt&&(e=t.Utils.extend({},mt,e));const r=e.inputModifier;let i="vertexInput",n="";if(!t.Utils.isNullOrEmpty(r)){const{name:e,args:[t,s],body:o}=dt(r);i=`${e}(vertexInput, interaction)`,n=`fn ${e} (${t}: ${Je}, ${s}: ${Ke}) -> ${Je} {\n ${o}\n}`}const s=e.outputModifier;let o="output",a="";if(!t.Utils.isNullOrEmpty(s)){const{name:e,args:[t,r],body:i}=dt(s);o=`${e}(output, interaction)`,a=`fn ${e} (${t}: ${Je}, ${r}: ${Ke}) -> ${Qe} {\n ${i}\n}`}const l=t.Utils.extend({},mt,e);return`struct ${Qe} {\n @builtin(position) position : vec4f, // clip space position\n @location(${l.outputNormalLocation}) normal: vec3f, // world space normal\n @location(${l.outputVertexLocation}) vertex : vec3f, // world space position\n @location(${l.outputUvLocation}) uv : vec2f, // texture coordinates\n @location(${l.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\n @location(${l.outputRayLocation}) ray : vec3f, // eye-to-point vector in world space\n @location(${l.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n}\n\nstruct ${Je} {\n @location(${l.inputPositionLocation}) position: vec3f,\n @location(${l.inputNormalLocation}) normal: vec3f,\n @location(${l.inputUvLocation}) uv: vec2f,\n @builtin(vertex_index) index: u32,\n @builtin(instance_index) instance: u32,\n}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f,\n}\n\nstruct ${Ke} {\n // mouse coordinatges in NDC space ([-1,1], [-1,1])\n cursor: vec2f,\n // canvas size in pixels\n resolution: vec2f,\n // some phase timer (e.g. time since mouse down, or time since last click, etc.)\n time: f32,\n}\n\n${n}\n\n${a}\n\n@group(${l.uniformWorldGroupIndex}) @binding(${l.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${l.uniformViewGroupIndex}) @binding(${l.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${l.uniformInteractionGroupIndex}) @binding(${l.uniformInteractionBindingIndex}) var<uniform> interaction: ${Ke};\n\n@vertex fn main(vertexInput: ${Je}) -> ${Qe} {\n let input = ${i};\n let position4 = vec4f(input.position, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n let worldPosition = (worldTransform * position4).xyz;\n let output = ${Qe}(\n worldViewProjectionTransform * position4,\n transforms.normal * input.normal,\n worldPosition,\n input.uv,\n input.index,\n normalize(worldPosition - camera.position),\n input.instance\n );\n return ${o};\n}`}(e)}_computeBasicData(){const e=this.#S.item,r=this.#O,i=e.material;return{hasTexture:!t.Utils.isNull(i?.texture),hasLighting:!t.Utils.isNullOrEmpty(r),shader:t.Utils.isNull(e)?A.Basic:e.material?.shader??A.Basic,materialBindGroupIndex:2,lightingBindGroupIndex:3}}_computeBindGroupsAndReferences(e=this._computeBasicData()){const{hasTexture:t,materialBindGroupIndex:r,lightingBindGroupIndex:i}=e,n=this.#$,s=this.#O,o={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},a={key:"material",group:r,binding:0,type:"buffer"};t?n.set(nt.Mesh,[o,a,{key:"texture",group:r,type:"texture"}]):n.set(nt.Mesh,[o,a]),n.set(nt.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}]);const l=s.map((e,t)=>({key:"light",group:i,binding:t,type:"buffer"}));l.push(...l),n.set(nt.Interaction,[{key:"interaction",group:0,type:"buffer",binding:1}])}fragment(e=this._computeBasicData(),r){this._computeBindGroupsAndReferences(e);const i={definitions:[],bindings:[],modifiers:[]},n=e=>{for(let t of e.definitions??[])-1===i.definitions.indexOf(t)&&i.definitions.push(t);t.Utils.isNullOrEmpty(e.bindings)||i.bindings.push(...e.bindings),t.Utils.isNullOrEmpty(e.modifiers)||i.modifiers.push(...e.modifiers)};if(e.shader===A.Basic){if(e.hasTexture){const r=e.materialBindGroupIndex;n(function(e=vt,r,i=1){const n=t.Utils.uniqueCode(),s=`sampler_${n}`,o=`tex_${n}`,a=t.Utils.extend({},vt,e),l=a.inputColor,c=a.outputColors;if(t.Utils.isNullOrEmpty(l))throw new Error("Must provide either input and output vertex color parameter names.");const u=c?c.map((e,t)=>0===t?`${e} = textureSample(${o}, ${s}, ${a.uv}) * ${l};`:`${e} = ${c[0]};`):[`textureSample(${o}, ${s}, ${a.uv}) * ${l}`];return{bindings:[`@group(${r}) @binding(${i}) var ${s}: sampler;`,`@group(${r}) @binding(${i+1}) var ${o}: texture_2d<f32>;`],modifiers:u}}({inputColor:Ye,outputColors:[Ye],uv:"uv"},r))}let s=0;const o=this.#O;for(let t of o){switch(t.item.type){case"direction":n(xt({outputColor:qe,normal:"normal"},e.lightingBindGroupIndex,s));break;case"omni":n(_t({outputColor:qe,normal:"normal",position:"vertex"},e.lightingBindGroupIndex,s));break;case"ambient":n(Ct({inputColor:Ye,outputColor:Ze},e.lightingBindGroupIndex,s))}s++}return BasicMaterial.fragment(i,r)}}}const St=(e,t)=>{t.fresh&&e.queue.writeBuffer(t.buffer,0,t.value)};class MeshRenderPipelineClass{constructor(e,t,r=new RenderPipelineCache){this._context=e,this._builder=t,this._cache=r,this._ensureU32idBindGroup=(e,t,r)=>this._cache.ensureBindGroup(this._context,e,[t],r,this._pickBindGroupLayout,At+"mesh-colorpick-bind-group"),this._ensureMaterialBindGroup=(e,t,r,i,n=2)=>{const s=this._bindGroupLayouts[n],o=At+"material-bind-group";if(s.label!==At+"material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");return this._cache.ensureBindGroup(this._context,e,[t],i,s,o,e=>{const{device:t}=this.context,i=e.entries;r&&i.push({binding:1,resource:t.createSampler({addressModeU:"repeat",addressModeV:"repeat",magFilter:"linear",minFilter:"linear"})},{binding:2,resource:r.createView()})})},this._ensureWorldTransformBindGroup=(e,t,r,i=1,n=!1)=>{const s=this._bindGroupLayouts[i];if(s.label!==At+"mesh-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const o=e.key+"-"+(n?1:0),a=`${At}${n?"colorpick":"mesh"}-transforms-bind-group`;return this._cache.ensureBindGroup(this._context,o,[t],r,s,a)},this._ensureCameraProjectionAndInteractionDataBindGroup=(e,t,r,i,n=0,s=!1)=>{const o=this._bindGroupLayouts[n],a=e.key+"-"+(s?1:0),l=`${At}${s?"colorpick":"mesh"}-view-bind-group`;return this._cache.ensureBindGroup(this._context,a,[t,r],i,o,l)},this._ensureLightingBindGroup=(e,t,r=3)=>{const i=this._bindGroupLayouts[r],n=e.map(e=>e.id).join(":"),s=e.map(e=>e.buffer.buffer);return this._cache.ensureBindGroup(this._context,n,s,t,i,At+"mesh-lighting-bind-group")},this._bindGroupLayouts=[],this._bindVertex=Ot,this._bindPicker=Ot,this._bindWorldTransform=Ot,this._bindRaycastWorldTransform=Ot,this._bindCameraProjectionAndInteractionData=Ot,this._bindRaycastCameraProjectionAndInteractionData=Ot,this._bindLighting=Ot,this._bindMaterial=Ot,this.set=e=>{throw new Error("Deprecated.")},this.bind=(e,...t)=>{throw new Error("Deprecated.")},this.draw=(e,...t)=>{throw new Error("Deprecated.")},this.frame=(e,t,r,i,...n)=>{e.setPipeline(this._pipeline);try{this._bindVertex(e,r),this._bindWorldTransform(e,r),this._bindMaterial(e,r),this._bindCameraProjectionAndInteractionData(e,i,t),this._bindLighting(e,...n);const s=r.item.geometry;e.draw(s.triangleIndices?.length||s.positions.length)}catch(e){console.error("Pacem.Drawing3D.FrameException",e)}},this.raycast=(e,t,r,i)=>{e.setPipeline(this._pickPipeline);try{this._bindVertex(e,r),this._bindRaycastWorldTransform(e,r),this._bindRaycastCameraProjectionAndInteractionData(e,i,t),this._bindPicker(e,r);const n=r.item.geometry;e.draw(n.triangleIndices.length)}catch(e){}},this._key=t.key}get context(){return this._context}get key(){return this._key}build(e){const r=t.Utils.extend({},Gt,e??{}),i=this._builder.build(r.modifiers),n=t.Utils.extend({pipeline:this},this._context),s=n.device,o={module:s.createShaderModule({code:i.vertex}),buffers:r.packedVertices?[BufferLayouts.createVertex(0,3,3,2)]:[BufferLayouts.createVertex(0,3),BufferLayouts.createVertex(1,3),BufferLayouts.createVertex(2,2)]},a=s.createBindGroupLayout({entries:[{binding:0,visibility:rt.VERTEX|rt.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:rt.VERTEX|rt.FRAGMENT,buffer:{type:"uniform"}}],label:At+"mesh-view-bind-group-layout"}),l=s.createBindGroupLayout({entries:[{binding:0,visibility:rt.VERTEX,buffer:{type:"uniform"}}],label:At+"mesh-transforms-bind-group-layout"}),c=[a,l],u={module:s.createShaderModule({code:i.fragment}),targets:[{format:n.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},h=c.length,p=[{binding:0,visibility:rt.FRAGMENT,buffer:{type:"read-only-storage"}}],{mapCount:d}=i.metadata,m=d>0;m&&p.push({visibility:rt.FRAGMENT,binding:1,sampler:{}},...Array(d).keys().map(e=>({visibility:rt.FRAGMENT,binding:2+e,texture:{}})));const f={label:At+"material-bind-group-layout",entries:p},g=s.createBindGroupLayout(f);c.push(g);const y=c.length,{lightCount:v}=i.metadata,b=v>0;if(b){const e=s.createBindGroupLayout({entries:[...Array(v).keys()].map((e,t)=>({visibility:rt.FRAGMENT,binding:t,buffer:{type:"uniform"}})),label:At+"lighting-bind-group-layout"});c.push(e)}const x={label:At+"mesh-render-pipeline",vertex:o,fragment:u,layout:s.createPipelineLayout({label:At+"mesh-render-pipeline-layout",bindGroupLayouts:this._bindGroupLayouts=c}),primitive:r.primitive};r.multisample&&(x.multisample={count:4},x.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._pipeline=s.createRenderPipeline(x);const E=this._pickBindGroupLayout=s.createBindGroupLayout({label:At+"mesh-colorpick-bind-group-layout",entries:[{visibility:rt.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),_={label:At+"mesh-colorpick-pipeline",vertex:o,fragment:{module:s.createShaderModule({code:yt(2)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:At+"mesh-colorpick-pipeline-layout",bindGroupLayouts:[a,l,E]}),primitive:r.primitive,depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickPipeline=s.createRenderPipeline(_);this._bindVertex=r.packedVertices?(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);const{buffer:s}=i.buffer(n,"geometry");e.setVertexBuffer(0,s)}:(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);const{buffer:s}=i.buffer(n,"geometryPositions"),{buffer:o}=i.buffer(n,"geometryNormals"),{buffer:a}=i.buffer(n,"geometryTexCoords");e.setVertexBuffer(0,s),e.setVertexBuffer(1,o),e.setVertexBuffer(2,a)};const C=(e,r,o)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);const a=r.buffer(n,"objectWorldTransform"),l=a.buffer;St(s,a);const{group:c}=i.bindings(nt.Mesh,"objectWorldTransform",0),u=this._ensureWorldTransformBindGroup(r.item,l,a.fresh,c,o);e.setBindGroup(c,u)};this._bindWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!1)},this._bindRaycastWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!0)};const w=(e,r,o,a)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);const l=r.buffer(n,"cameraViewTransform"),c=l.buffer;if(St(s,l),t.Utils.isNull(o))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing interaction buffers was provided.`);const u=o.buffer(n,"interaction"),h=u.buffer;St(s,u);const{group:p}=i.bindings(nt.Camera,"cameraViewTransform",0),{group:d}=i.bindings(nt.Interaction,"interaction",0);if(p!==d)throw new ReferenceError(`Layout bind group mismatch: ${p} vs ${d}.`);const m=this._ensureCameraProjectionAndInteractionDataBindGroup(r.item,c,h,l.fresh||u.fresh,p,a);e.setBindGroup(p,m)};this._bindCameraProjectionAndInteractionData=(e,...t)=>{const r=t.at(0),i=t.at(1);w(e,r,i,!1)},this._bindRaycastCameraProjectionAndInteractionData=(e,...t)=>{const r=t.at(0),i=t.at(1);w(e,r,i,!0)},this._bindMaterial=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);const o=i.buffer(n,"material"),a=o.buffer;St(s,o);let l=i.texture(n);const c=l?.texture,u=this._ensureMaterialBindGroup(i.item,a,c,o.fresh,h);e.setBindGroup(h,u),m&&s.queue.copyExternalImageToTexture({source:l.source,flipY:!0},{texture:c},{width:c.width,height:c.height})},this._bindLighting=(e,...t)=>{if(b){const r=Array.from(t).map(e=>({buffer:e.buffer(n,"light"),id:e.item.key})),i=r.some(e=>e.buffer.fresh),o=this._ensureLightingBindGroup(r,i,y);for(let e of r)St(s,e.buffer);e.setBindGroup(y,o)}},this._bindPicker=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);const o=i.buffer(n,"u32id"),a=o.buffer;St(s,o);const l=o.fresh,c=this._ensureU32idBindGroup(i.item,a,l);e.setBindGroup(2,c)}}}class LineWGSLBuilder{#W;#k;#$=new Map;constructor(...e){this.add(...e)}reset(){this.#W=null,this.#$.clear()}add(...e){for(let r of e??[])if(x(r.item)){if(!t.Utils.isNull(this.#W))throw new Error("Line already added.");this.#W=r}else if(g(r.item))this.#k??=r;else if(!b(r.item))throw new Error("Unknown object type.")}build(){const e=this._computeBasicData(),t=this.key;return{vertex:this.vertex(e),fragment:this.fragment(e),key:t,bindings:(...e)=>LineWGSLBuilder.prototype.bindgroup.apply(this,e),metadata:{thickness:e.thickness,dashPattern:e.dashPattern}}}get key(){const e=(this.#W?.item).material?.lineWidth>1;return A.Line+(e?"-fat":"")}bindgroup(e,r,i){const n=this.#$.get(e);if(t.Utils.isNull(n))return null;if(t.Utils.isNullOrEmpty(r))return n;const s=n.filter(e=>e.key===r);return isNaN(i)?s:i>=0&&i<n.length?s[i]:s}vertex(e=this._computeBasicData()){return e.thickness>1?function(e=ft){const r=t.Utils.extend({},ft,e);return`${gt(r)}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f\n}\n\nstruct Pixels {\n viewportWidth: f32,\n viewportHeight: f32,\n halfLineWidth: f32\n}\n\n@group(${r.uniformWorldGroupIndex}) @binding(${r.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${r.uniformViewGroupIndex}) @binding(${r.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${r.storagePositionsGroupIndex}) @binding(${r.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\n@group(${r.uniformDimensionsGroupIndex}) @binding(${r.uniformDimensionsBindingIndex}) var<uniform> dimensions: Pixels;\n\nfn computeClipPosition(index: u32) -> vec4f {\n let x = positions[3u * index + 0u];\n let y = positions[3u * index + 1u];\n let z = positions[3u * index + 2u];\n let position4 = vec4f(x, y, z, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n return worldViewProjectionTransform * position4;\n}\n\nfn computeOffsetPosition(p0: vec4f, p1: vec4f, index: u32) -> vec4f {\n\n let viewportSize = vec2f(dimensions.viewportWidth, dimensions.viewportHeight);\n let normalizedSize = normalize(viewportSize);\n let halfThickness = dimensions.halfLineWidth / dimensions.viewportWidth;\n let p0ndc = p0.xyz / p0.w;\n let p1ndc = p1.xyz / p1.w;\n let dir = normalize((p1ndc - p0ndc).xy);\n let offsetX = halfThickness * 2.0 / normalizedSize.x;\n let offsetY = halfThickness * 2.0 / normalizedSize.y;\n\n // perp\n let perp0 = vec2f(-dir.y * offsetX, dir.x * offsetY);\n let perp1 = perp0;\n\n /*\n\n position0-0 -----*----- position0-1\n |\\ |\n | \\ |\n | \\ |\n | \\ |\n | \\ |\n | \\ |\n | \\ |\n | \\|\n position1-0 -----*----- position1-1\n\n indexes:\n ------------\n p0-0 -> 0, 3\n p0-1 -> 5\n p1-0 -> 1\n p1-1 -> 2, 4\n */\n\n var outPos: vec2f;\n var w = p0.w;\n var z = p0.z;\n if (index == 0 || index == 3){\n outPos = p0ndc.xy - perp0;\n }\n else if (index == 1){\n outPos = p1ndc.xy - perp1;\n w = p1.w;\n z = p1.z;\n }\n else if (index == 5){\n outPos = p0ndc.xy + perp0;\n }\n else { //if (index == 2 || index == 4)\n outPos = p1ndc.xy + perp1;\n w = p1.w;\n z = p1.z;\n }\n\n // return vec4f(outPos , 0, 1.0);\n return vec4f(outPos * w, z, w);\n}\n\n@vertex fn main(@builtin(instance_index) instance: u32,\n @builtin(vertex_index) index: u32) -> ${Qe} {\n\n // vertex index starting at 1\n let position0 = computeClipPosition(instance);\n let position1 = computeClipPosition(instance + 1);\n\n // apply offset\n let position = computeOffsetPosition(position0, position1, index);\n\n return ${Qe}(\n position,\n instance,\n index\n );\n}`}():function(e=ft){const r=t.Utils.extend({},ft,e);return`${gt(r)}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f\n}\n\n@group(${r.uniformWorldGroupIndex}) @binding(${r.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${r.uniformViewGroupIndex}) @binding(${r.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${r.storagePositionsGroupIndex}) @binding(${r.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\n\n@vertex fn main(@builtin(instance_index) instance: u32,\n @builtin(vertex_index) index: u32) -> ${Qe} {\n\n let x = positions[3u * index + 0u];\n let y = positions[3u * index + 1u];\n let z = positions[3u * index + 2u];\n let position4 = vec4f(x, y, z, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n let worldPosition = (worldTransform * position4).xyz;\n return ${Qe}(\n worldViewProjectionTransform * position4,\n instance,\n index);\n}`}()}_computeBasicData(){const e=this.#W.item,r=t.Utils.isNull(e)?A.Line:e.material?.shader??A.Line,i=e.material,n=i?.lineWidth??1,s=i?.dashArray;return{shader:r,thickness:n,dashPattern:s}}_computeBindGroupsAndReferences(e=this._computeBasicData()){const t=this.#$,r={key:"objectWorldTransform",group:1,binding:0,type:"buffer"},i={key:"material",group:3,binding:0,type:"buffer"},n={key:"geometryPositions",group:2,binding:0,type:"buffer"},s={key:"line",group:2,binding:1,type:"buffer"};t.set(nt.Mesh,[r,i,n,s]),t.set(nt.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}])}fragment(e=this._computeBasicData()){this._computeBindGroupsAndReferences(e);const t={definitions:[],bindings:[],modifiers:[]};if(e.shader===A.Line)return LineMaterial.fragment(t)}}class LineRenderPipelineClass{#z;constructor(e,t,r=new RenderPipelineCache){this._lineBuilder=t,this._cache=r,this._ensureLineU32idBindGroup=(e,t,r)=>{const i=this.context;return this._cache.ensureBindGroup(i,e,[t],r,this._pickLineBindGroupLayout,At+"line-colorpick-bind-group")},this._ensureLineMaterialBindGroup=(e,t,r,i=2)=>{const n=this._bindLineGroupLayouts[i];if(n.label!==At+"line-material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const s=this.context;return this._cache.ensureBindGroup(s,e,[t],r,n,At+"line-material-bind-group")},this._ensureLinePositionsBindGroup=(e,t,r,i)=>{const n=this._bindLineGroupLayouts[i];if(n.label!==At+"line-positions-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const s=this.context;return this._cache.ensureBindGroup(s,e,t,r,n,At+"line-positions-bind-group")},this._ensureLineWorldTransformBindGroup=(e,t,r,i=1,n=!1)=>{const s=this._bindLineGroupLayouts[i];if(s.label!==At+"line-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const o=e.key+"-line-"+(n?1:0),a=`${At}${n?"colorpick":""}-line-transforms-bind-group`,l=this.context;return this._cache.ensureBindGroup(l,o,[t],r,s,a)},this._ensureLineCameraProjectionBindGroup=(e,t,r,i=0,n=!1)=>{const s=this._bindLineGroupLayouts[i],o=e.key+"-line-"+(n?1:0),a=`${At}${n?"colorpick":""}-line-view-bind-group`,l=this.context;return this._cache.ensureBindGroup(l,o,[t],r,s,a)},this._bindLineGroupLayouts=[],this._bindLinePositions=Ot,this._bindLinePicker=Ot,this._bindLineWorldTransform=Ot,this._bindLineRaycastWorldTransform=Ot,this._bindLineCameraProjection=Ot,this._bindLineRaycastCameraProjection=Ot,this._bindLineMaterial=Ot,this._drawLine=Ot,this.set=e=>{throw new Error("Deprecated.")},this.bind=(e,...t)=>{throw new Error("Deprecated.")},this.draw=(e,...t)=>{throw new Error("Deprecated.")},this.frame=(e,t,r)=>{e.setPipeline(this._linePipeline);try{this._bindLineWorldTransform(e,t),this._bindLineCameraProjection(e,r),this._bindLinePositions(e,t),this._bindLineMaterial(e,t),this._drawLine(e,t)}catch(e){console.error("Pacem.Drawing3D.FrameException",e)}},this.raycast=(e,t,r)=>{e.setPipeline(this._pickLinePipeline);try{this._bindLineRaycastWorldTransform(e,t),this._bindLineRaycastCameraProjection(e,r),this._bindLinePositions(e,t),this._bindLinePicker(e,t),this._drawLine(e,t)}catch(e){}},this.#z=e,this._lineKey=t.key}get context(){return this.#z}get key(){return this._lineKey}build(e){const r=t.Utils.extend({},Gt,e??{}),i=this._lineBuilder.build(),n=t.Utils.extend({pipeline:this},this.#z),s=n.device,o=i.metadata.thickness>1,a={module:s.createShaderModule({code:i.vertex}),buffers:[]},l=s.createBindGroupLayout({entries:[{binding:0,visibility:rt.VERTEX,buffer:{type:"uniform"}}],label:At+"line-transforms-bind-group-layout"}),c=s.createBindGroupLayout({entries:[{binding:0,visibility:rt.VERTEX,buffer:{type:"uniform"}}],label:At+"line-view-bind-group-layout"}),u=[{binding:0,visibility:rt.VERTEX,buffer:{type:"read-only-storage"}}];o&&u.push({binding:1,visibility:rt.VERTEX,buffer:{type:"uniform"}});const h=[l,c,s.createBindGroupLayout({entries:u,label:At+"line-positions-bind-group-layout"})],p=h.length,d=h.slice(),m={module:s.createShaderModule({code:i.fragment}),targets:[{format:n.format,blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{}}}]},f=d.length,g=[{binding:0,visibility:rt.FRAGMENT,buffer:{type:"read-only-storage"}}],y={label:At+"line-material-bind-group-layout",entries:g},v=s.createBindGroupLayout(y);d.push(v);const b=o?r.primitive.topology:"line-list",x={label:At+"line-render-pipeline",vertex:a,fragment:m,layout:s.createPipelineLayout({label:At+"line-render-pipeline-layout",bindGroupLayouts:this._bindLineGroupLayouts=d}),primitive:t.Utils.extend({},r.primitive,{topology:b})};r.multisample&&(x.multisample={count:4},x.depthStencil={depthCompare:"less",format:"depth24plus",depthWriteEnabled:!0}),this._linePipeline=s.createRenderPipeline(x);const E=this._pickLineBindGroupLayout=s.createBindGroupLayout({label:At+"line-colorpick-bind-group-layout",entries:[{visibility:rt.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),_={label:At+"line-colorpick-pipeline",vertex:a,fragment:{module:s.createShaderModule({code:yt(p)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:At+"line-colorpick-pipeline-layout",bindGroupLayouts:h.concat(E)}),primitive:t.Utils.extend({},r.primitive,{topology:b}),depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}};this._pickLinePipeline=s.createRenderPipeline(_);const C=(e,r,o)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);const a=r.buffer(n,"objectWorldTransform"),l=a.buffer;St(s,a);const{group:c}=i.bindings(nt.Mesh,"objectWorldTransform",0),u=this._ensureLineWorldTransformBindGroup(r.item,l,!1,c,o);e.setBindGroup(c,u)};this._bindLineWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!1)},this._bindLineRaycastWorldTransform=(e,...t)=>{const r=t.at(0);C(e,r,!0)};const w=(e,r,o)=>{if(t.Utils.isNull(r))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);const a=r.buffer(n,"cameraViewTransform"),l=a.buffer;St(s,a);const{group:c}=i.bindings(nt.Camera,"cameraViewTransform",0),u=this._ensureLineCameraProjectionBindGroup(r.item,l,!1,c,o);e.setBindGroup(c,u)};this._bindLineCameraProjection=(e,...t)=>{const r=t.at(0);w(e,r,!1)},this._bindLineRaycastCameraProjection=(e,...t)=>{const r=t.at(0);w(e,r,!0)},this._bindLinePositions=(e,...r)=>{const a=r.at(0);if(t.Utils.isNull(a))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided as index 0.`);const l=a.buffer(n,"geometryPositions"),c=l.buffer;let u=l.fresh;const h=[c];if(St(s,l),o){const e=a.buffer(n,"line"),t=e.buffer;u||=e.fresh,h.push(t),St(s,e)}const{group:p}=i.bindings(nt.Mesh,"line",0),d=this._ensureLinePositionsBindGroup(a.item,h,u,p);e.setBindGroup(p,d)},this._bindLineMaterial=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);const o=i.buffer(n,"material"),a=o.buffer;St(s,o);const l=this._ensureLineMaterialBindGroup(i.item,a,o.fresh,f);e.setBindGroup(f,l)},this._bindLinePicker=(e,...r)=>{const i=r.at(0);if(t.Utils.isNull(i))throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);const o=i.buffer(n,"u32id"),a=o.buffer;o.value,St(s,o);const l=this._ensureLineU32idBindGroup(i.item,a,!1);e.setBindGroup(p,l)},this._drawLine=(e,...t)=>{const r=t.at(0).item.geometry;o?e.draw(6,r.positions.length-1,0,0):e.draw(r.positions.length)}}}class Raycasters{static{this._memoizer=new WeakMap}static dispose(e){const t=this._memoizer;if(t.has(e)){const r=t.get(e);for(let e of r.values())e.destroy();r.clear(),t.delete(e)}}static createColorPicking(e){const t=this._memoizer;t.has(e)||t.set(e,new Map);const r=t.get(e),i="colorpick";if(r.has(i))return r.get(i);const n=new ColorPickingRaycaster(e);return r.set(i,n),n}}class ColorPickingRaycaster{constructor(e){this._context=e,this._objects=new Map,this.frame=(e,...r)=>{if(t.Utils.isNull(this._encoder))throw new Error("Null encoder. Maybe you missed to call the 'begin' method first.");const i=Array.from(r),n=RenderPipelines.createColorPicking(this._context,i);n?.frame(this._pass,e,...r);for(let e of i){e.item.inert||this._objects.set(e.id,e)}},this.end=e=>{if(!t.Utils.isNull(this._handle))return this._handle;const r=this._pass,i=this._encoder,{device:n}=this._context,{render:s}=this._textures,o=s.texture,a=this._ensureBuffer();r.end(),i.copyTextureToBuffer({texture:o,origin:{x:e.x,y:e.y}},{buffer:a,bytesPerRow:66304,rowsPerImage:1},{width:1}),n.queue.submit([i.finish()]),this._encoder=null;const l=this,c=l._objects;return this._handle=new Promise((e,t)=>{a.mapAsync(it.READ,0,4).then(t=>{const r=new Uint32Array(a.getMappedRange(0,4))[0];a.unmap(),l._handle=null;const i=c.get(r);e(i?[i.item]:[])})})}}_createTexture(e){const{device:t,canvas:r}=this._context,i=Math.min(t.limits.maxTextureDimension2D,r.clientWidth),n=Math.min(t.limits.maxTextureDimension2D,r.clientHeight);return t.createTexture({size:[i,n,1],format:e,usage:tt.COPY_SRC|tt.RENDER_ATTACHMENT})}_ensureBuffer(){const e=this._buffer;if(!t.Utils.isNull(e))return e;const{device:r}=this._context;return this._buffer=r.createBuffer({label:Xe+"colorpick-output-buffer",size:4,usage:et.MAP_READ|et.COPY_DST})}_ensureTextures(){const e=this._textures;if(!t.Utils.isNull(e))return e;const r=this._createTexture("r32uint"),i=this._createTexture("depth24plus"),n={texture:r,view:r.createView()},s={texture:i,view:i.createView()};return this._textures={render:n,depth:s}}_destroyTexture(e){t.Utils.isNull(e)||e.texture?.destroy()}destroy(){const e=this._textures,r=this._buffer;if(!t.Utils.isNullOrEmpty(e)){const{render:t,depth:r}=e;this._destroyTexture(t),this._destroyTexture(r),this._textures=null}t.Utils.isNull(r)||(r.destroy(),this._buffer=null)}begin(){const{device:e}=this._context;this._encoder=e.createCommandEncoder({label:Xe+"colorpick-raycaster"});const{render:t,depth:r}=this._ensureTextures(),i={label:Xe+"colorpick-raycaster-pass",colorAttachments:[{view:t.view,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:r.view,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}};this._pass=this._encoder.beginRenderPass(i),this._objects.clear()}}const kt=r.Geometry.LinearAlgebra.Vector3D;var $t;!function(e){e[e.NotSupported=0]="NotSupported",e[e.Disabled=1]="Disabled"}($t||($t={}));class Renderers{static create(e,t){return new Promise((r,i)=>{if(navigator.gpu){const n=new RendererClass(e);n.init(t).then(e=>r(n),e=>{const t={message:"string"==typeof e?e:e.message,cause:$t.Disabled};i(t)})}else{const e={message:"WebGPU not supported.",cause:$t.NotSupported};i(e)}})}}class RendererClass{#j;#V;#z;#H;#F;#X;#Y;#R;#Z;#q;#J;#Q;constructor(e){this.#H=new WeakMap,this.#F=new WeakMap,this.#X=new WeakMap,this.#Z={enableValidation:!1},this.#q=!1,this._logError=e=>{const r=this.#j.logger;if(!t.Utils.isNull(r)){const i="error"in e?e.error:e;r.log(t.Logging.LogLevel.Error,i.message,"WebGPU")}},this.#K=!0,this.#ee=!1;const r=(this.#j=e).stage,i=document.createElement("canvas");i.id=t.P+"_3d_stage_"+t.Utils.uniqueCode(),r.innerHTML="",r.appendChild(this.#V=i),this.#J=ManagedBuffers.create(this.#Q={time:performance.now(),cursor:{x:0,y:0},resolution:{width:0,height:0}})}_buildPassDescriptor({multisample:r,format:i}){const{context:n,device:s}=this.#z,o=n.getCurrentTexture();let a=this.#R;if(t.Utils.isNull(a)){if(a={},r){const e=s.createTexture({label:Xe+"render-texture",format:i??o.format,usage:tt.RENDER_ATTACHMENT,size:[o.width,o.height],sampleCount:4});a.render={texture:e,view:e.createView({label:Xe+"render-texture-view"})};const t=s.createTexture({label:Xe+"depth-texture",format:"depth24plus",usage:tt.RENDER_ATTACHMENT,size:[o.width,o.height],sampleCount:4});a.depth={texture:t,view:t.createView({label:Xe+"depth-texture-view"})}}this.#R=a}const{transparent:l,background:c}=this.#j,u=l?{r:0,g:0,b:0,a:0}:c?"string"==typeof c?e.Colors.parse(c):c:{r:0,g:0,b:0,a:1},h=AdapterUtils.flattenVectorArray([u]),p=o.createView({label:Xe+"canvas-texture-view"}),d={view:p,clearValue:h,loadOp:"clear",storeOp:"store"},m={colorAttachments:[d]};if(r){const e=a.render.view,t=a.depth.view;m.depthStencilAttachment={view:t,depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store",stencilClearValue:0,stencilReadOnly:!0},d.view=e,d.resolveTarget=p}return m}_buildContext(e=this.#V,t=this.#j.size){t??=e;let r=t.width,i=t.height;e.width=1*r,e.height=1*i;return{context:e.getContext("webgpu"),textureFormat:navigator.gpu.getPreferredCanvasFormat()}}_buildUpContext(e,t,r,i){const{transparent:n}=this.#j;r.configure({alphaMode:n?"premultiplied":"opaque",device:e,format:i}),this.#z={device:e,adapter:t,canvas:this.#V,context:r,format:i},this.#K=!1}async init(e){this.#Z=e;const r=await navigator.gpu.requestAdapter();if(t.Utils.isNull(r))throw new Error("WebGPU adapter unavalable or disabled.");const i=await r.requestDevice();if(t.Utils.isNull(r))throw new Error("WebGPU device unavalable or disabled.");i.addEventListener("uncapturederror",this._logError),this.#ee=!(t.Utils.isNull(e.modifiers?.version)||t.Utils.isNull(e.modifiers)||t.Utils.isNull(e.modifiers.vertexInput)&&t.Utils.isNull(e.modifiers.vertexOutput)&&t.Utils.isNull(e.modifiers.fragment));const{context:n,textureFormat:s}=this._buildContext();this._buildUpContext(i,r,n,s)}#K;#ee;render(e){if(this.#K||t.Utils.isNull(this.#Y)||!(this.#V.width>0)||!(this.#V.height>0))return;const r=this.#z,i=r.device,n=this.#Y,s=this.#Z?.enableValidation??!1;this.#ee&&t.Utils.extend(this.#Q,e);const o=this._buildPassDescriptor({multisample:!0}),a=i.createCommandEncoder({label:Xe+"renderer"}),l=a.beginRenderPass(o);n.loop((e,t,n)=>{if(e.item.hide)return!1;s&&i.pushErrorScope("validation");const o=[e,t,...n];return RenderPipelines.create(r,o,{multisample:!0,modifiers:this.#Z.modifiers}).frame(l,this.#J,...o),s&&i.popErrorScope().then(e=>{e&&this._logError(e)}),!0}),l.end(),i.queue.submit([a.finish()])}set disabled(e){this.#q=e}get disabled(){return this.#q}raycast(e){if(this.#K||t.Utils.isNull(this.#Y))return Promise.resolve([]);const r=this.#z,i=r.device,n=this.#Y,s=this.#Z?.enableValidation??!1,o=Raycasters.createColorPicking(r);return o.begin(),n.loop((e,t)=>!e.item.hide&&(s&&i.pushErrorScope("validation"),o.frame(this.#J,e,t),s&&i.popErrorScope().then(e=>{e&&this._logError(e)}),!0)),o.end(e)}_disposeRenderableJustInCase(e){const t=this.#H;t.has(e)&&(t.get(e)?.destroy(),t.delete(e))}_createOrYieldRenderable(e,r=this.#F,i=this.#X){e.stage??=this.#j;const n=this.#H;let s=n.get(e);return t.Utils.isNull(s)&&n.set(e,s=RenderableBuffers.create(e,r)),s}_createOrYieldGeometry(e){const r=this.#F;let i=r.get(e);return t.Utils.isNull(i)&&r.set(e,i=ManagedBuffers.create(e)),i}_createOrYieldMaterial(e){const r=this.#X;let i=r.get(e);return t.Utils.isNull(i)&&r.set(e,i=ManagedBuffers.create(e)),i}_unwrapBuffers(e,t){t??={meshes:[],lights:[],cameras:[],groups:[]};for(let r of e.children)r.item.stage??=this.#j,x(r.item)&&t.meshes.push(r),g(r.item)&&t.cameras.push(r),b(r.item)&&t.lights.push(r),C(r.item)&&(t.groups.push(r),this._unwrapBuffers(r,t));return t}_update(e){const r=[],i=[],n=[],s=e=>this._createOrYieldRenderable(e);let o;for(let a of e)if(a.hide)this._disposeRenderableJustInCase(a);else{if(a.stage??=this.#j,C(a)){const e=a;e.flags.includes(h.Children)&&this.#H.delete(e),r.push(s(e))}x(a)&&a.geometry&&(this._createOrYieldGeometry(a.geometry),t.Utils.isNull(a.material)||this._createOrYieldMaterial(a.material),i.push(s(a))),b(a)&&n.push(s(a)),g(a)&&(o??=a)}var a;o??=(a=this.#j,{bottom:-1,top:1,left:-1,right:1,near:.1,far:200,lookAt:kt.from(0,0,0),up:kt.j(),position:kt.from(0,0,1),type:"orthographic",flags:[],stage:a});const l=s(o);let c={meshes:i,lights:n,cameras:[l],groups:r};for(let e of r)c=this._unwrapBuffers(e,c);this.#Y?.items.meshes.forEach(e=>{i.includes(e)||e.destroy()}),this.#Y=new RenderLooper(c)}update(...e){this._update(Array.from(e))}dispose(){if(this.#Y=null,this._disposeContext()){const{device:e}=this.#z;e.removeEventListener("uncapturederror",this._logError),e.destroy}}_disposeContext(){const e=this.#z;if(t.Utils.isNull(e))return!1;Raycasters.dispose(e),RenderPipelines.dispose(e);const r=this.#R;if(this.#R=null,!t.Utils.isNull(r)){const{render:e,depth:t}=r;!function(...e){for(let t of e||[])t?.destroy()}(e?.texture,t?.texture)}return e.context.unconfigure(),!0}resize(e){if(this.#K=!0,this._disposeContext()){const{device:r,adapter:i}=this.#z,{context:n,textureFormat:s}=this._buildContext(this.canvas,e);this._buildUpContext(r,i,n,s),this.#ee&&t.Utils.extend(this.#Q,{resolution:e})}}get canvas(){return this.#V}}var It=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const Wt="WebGPURaycastCallback",zt="WebGPURaycastPixel",jt=t.CustomElementUtils.getAttachedPropertyValue,Vt=t.CustomElementUtils.setAttachedPropertyValue,Ht=t.CustomElementUtils.deleteAttachedPropertyValue;let Ft=class Pacem3DWgslScriptElement extends t.Components.PacemItemElement{findContainer(){return t.CustomElementUtils.findAncestor(this,e=>e instanceof Xt)}#te="";get version(){return this.#te}#re=new MutationObserver(()=>{this.wgsl=this.textContent});viewActivatedCallback(){super.viewActivatedCallback(),this.wgsl=this.textContent,this.#re.observe(this,{characterData:!0})}propertyChangedCallback(e,t,r,i){super.propertyChangedCallback(e,t,r,i),"wgsl"===e&&this._computeVersion(r)}_computeVersion(r=this.wgsl){e.Strings.hash(r).then(e=>{if(e!==this.#te){const r=this.#te,i=e;this.#te=i;const n=new t.PropertyChangeEvent({propertyName:"version",oldValue:r,currentValue:i,firstChange:t.Utils.isNullOrEmpty(r)});this.dispatchEvent(n)}})}disconnectedCallback(){this.#re.disconnect(),super.disconnectedCallback()}};It([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Ft.prototype,"type",void 0),It([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Ft.prototype,"wgsl",void 0),Ft=It([t.CustomElement({tagName:t.P+"-3d-wgsl-script"})],Ft);let Xt=class Pacem3DWebgpuAdapterElement extends Pacem3DAdapterElement{constructor(){super(...arguments),this.#ie=[],this._scriptVersionChangeHandler=e=>{const{propertyName:t}=e.detail;"version"===t&&this._parseWgslModifiers(e.detail.currentValue)},this.#ne=new Set,this.#se=new Map,this.#oe=!0,this.#ae=!0,this.#le=new WeakMap}invalidateSize(e,t=e.size){const r=this._ensureRenderer(e);r?.resize(t)}#ie;get items(){return this.#ie}register(e){const r=this.#ie;return e instanceof Ft&&!r.includes(e)&&(e.addEventListener(t.PropertyChangeEventName,this._scriptVersionChangeHandler,!1),r.push(e),this._parseWgslModifiers(this.modifiers?.version),!0)}unregister(e){const r=this.#ie,i=r.indexOf(e);return i>=0&&(e.removeEventListener(t.PropertyChangeEventName,this._scriptVersionChangeHandler,!1),r.splice(i,1),this._parseWgslModifiers(this.modifiers?.version),!0)}#ne;#se;#oe;#ae;get supported(){return this.#oe}get active(){return this.#ae}_webGPUNotSupported(e){this.#oe&&e.cause===$t.NotSupported&&(this.#oe=!1,this.dispatchEvent(new t.PropertyChangeEvent({propertyName:"supported",oldValue:null,currentValue:!1}))),this.#ae&&(this.#ae=!1,this.dispatchEvent(new t.PropertyChangeEvent({propertyName:"active",oldValue:null,currentValue:!1})))}initialize(e){const r=this.#se,i=this.#ne;return i.has(e)||i.add(e),Renderers.create(e,{enableValidation:this.enableValidation??!1,modifiers:this.modifiers}).then(t=>(r.get(e)?.update(),r.set(e,t),this._updatePipeline(e),t.canvas),e=>(this.log(t.Logging.LogLevel.Error,e.message),this._webGPUNotSupported(e),null))}_parseWgslModifiers(e){const t=this.#ie,r=t.find(e=>"vertex-input"==e.type),i=t.find(e=>"vertex-output"==e.type),n=t.find(e=>"fragment"==e.type),s=r?.wgsl,o=i?.wgsl,a=n?.wgsl;this.modifiers={vertexInput:s,vertexOutput:o,fragment:a,version:e}}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),!i)switch(e){case"modifiers":case"enableValidation":this._reinitialize()}}disconnectedCallback(){const e=this.#se;for(let[t,r]of e)r?.dispose();e.clear(),this.#ne.clear(),super.disconnectedCallback()}dispose(e){const t=this.#se,r=this.#ne;t.has(e)&&(t.get(e)?.dispose(),t.delete(e)),r.has(e)&&r.delete(e)}_reinitialize(){for(let e of this.#ne.values())this.initialize(e)}_ensureRenderer(e){return this.#se.get(e)}_updatePipeline(e){const t=this._ensureRenderer(e);t?.update(...e.datasource)}#le;render(e){const r=e.size?.width,i=e.size?.height;if(!(r>0&&i>0))return;const n=this._ensureRenderer(e);if(t.Utils.isNull(n))return;this.#le.has(e)&&(this.#le.delete(e),this._itemsChangedExec(e));const s=jt(e,zt);if(n.render({cursor:s,time:performance.now(),resolution:{width:r,height:i}}),!e.interactive)return;const o=jt(e,Wt);t.Utils.isNullOrEmpty(o)||(t.Utils.isNullOrEmpty(s)?o(null):n.raycast(s).then(e=>{if(t.Utils.isNullOrEmpty(e))o(null);else{const t={object:e[0],point:null};o(t)}}))}snapshot(e,r,i,n){const s=this.#se;if(!s.has(e))return Promise.resolve(null);const{canvas:o}=s.get(e),a=!t.Utils.isNullOrEmpty(r),l=i??(a?"image/jpeg":null),c=n??(a?.9:null);return new Promise((i,n)=>{this.render(e),t.Utils.snapshotElement(o,r,l,c).then(i)})}raycast(e,t,r,i){Vt(e,Wt,i),t.x<0||t.y<0||t.x>=r.width||t.y>=r.height?Ht(e,zt):Vt(e,zt,t)}_itemsChangedExec(e){this._updatePipeline(e)}_itemsChanged(e,t){this.#le.set(e,!0)}addItem(e,t){this._itemsChanged(e,t)}removeItem(e,t){this._itemsChanged(e,t)}updateItem(e,r){(t.Utils.isNull(r)||r.flags.indexOf(h.Visibility)>=0||r.flags.indexOf(h.Children)>=0)&&this._itemsChanged(e,r)}zoomFit(e,...t){return Promise.resolve()}project(e,t){return{x:0,y:0}}getScene(e){return e}};It([t.Debounce(100)],Xt.prototype,"_parseWgslModifiers",null),It([t.Watch({emit:!1})],Xt.prototype,"modifiers",void 0),It([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],Xt.prototype,"enableValidation",void 0),Xt=It([t.CustomElement({tagName:t.P+"-3d-webgpu-adapter"})],Xt);var Yt=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};const Zt=r.Geometry.LinearAlgebra.Vector3D,qt=r.Geometry.LinearAlgebra.Matrix3D,Jt=r.Geometry.LinearAlgebra.Quaternion;r.Geometry.LinearAlgebra.Spherical;const Qt=.001,Kt={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}};class OrbitCameraBehavior{constructor(e,r){this._config=r,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=e=>{const{rotation:r,pan:i}=this._config,n="mouse"===e.pointerType,s=r.enabled&&n&&e.button===r.button&&t.CustomEventUtils.matchModifiers(e,r.modifiers),o=i.enabled&&n&&e.button===i.button&&t.CustomEventUtils.matchModifiers(e,i.modifiers);(s||o)&&(this.#ce=s,(this.#ue=o)&&(this._currentState=OrbitCameraBehavior._buildState(this._camera),t.Utils.extend(this._input,Zt.zero()),this._progress.x=this._progress.y=0),t.avoidHandler(e),window.addEventListener("pointerup",this._endHandler,!1),window.addEventListener("pointermove",this._moveHandler,!1),window.addEventListener("contextmenu",this._avoidHandler,!1))},this._avoidHandler=e=>t.avoidHandler(e),this._endHandler=e=>{t.avoidHandler(e),window.setTimeout(()=>{window.removeEventListener("pointerup",this._endHandler),window.removeEventListener("pointermove",this._moveHandler),window.removeEventListener("contextmenu",this._avoidHandler)},20)},this._zoomHandler=e=>{const{zoom:r}=this._config;if(!(r.enabled&&t.CustomEventUtils.matchModifiers(e,r.modifiers)))return;t.avoidHandler(e);this._input.rho-=Math.sign(e.deltaY)},this._moveHandler=e=>{t.avoidHandler(e);const{height:r,width:i}=this._scene.size,n=this._input,s=Math.min(r,i);if(this.#ce){const t=-360/s,{phi:r,theta:i}=n,{maxPolar:o,minPolar:a,maxAzimuth:l,minAzimuth:c}=this._config;n.phi=(r+e.movementX*t).clamp(a,o),n.theta=(i+e.movementY*t).clamp(c,l)}else if(this.#ue){const t=this._currentState.radius/s;n.x+=-e.movementX*t,n.y+=e.movementY*t}},this._renderHandler=e=>{this._update()};const i=this._scene=(this._camera=e).stage;this._initialState=this._currentState=OrbitCameraBehavior._buildState(e);const n=this._canvas=i.stage;n.addEventListener("pointerdown",this._startHandler,!1),n.addEventListener("wheel",this._zoomHandler,{passive:!1}),i.addEventListener("render",this._renderHandler,!1)}static _buildState(e){const t=Zt.subtract(e.position,e.lookAt),r=Zt.mag(t);return{target:e.lookAt,versor:Zt.unit(t),up:e.up,radius:r,position:e.position}}static tryAttach(e,r){r??=Kt;const i=function(e){return g(e)?e.stage:null}(e)?.stage;if(t.Utils.isNull(i))return null;{const{position:i,lookAt:n}=e;return t.Utils.isNull(i)||t.Utils.isNull(n)||Zt.areClose(i,n)?null:new OrbitCameraBehavior(e,r)}}get configuration(){return this._config}set configuration(e){this._config=e}#ue;#ce;_getSafeAzimuth({theta:e}){return OrbitCameraBehavior._modAngle(e)}_getSafePolar({phi:e}){return OrbitCameraBehavior._modAngle(e)}static _modAngle(e){for(;e<0;)e+=360;return e%360}static _getViewXYZ(e){const{versor:t,up:r}=e,i=Zt.cross(t,r),n=Zt.cross(i,t);return Zt.normalize(i),Zt.normalize(n),{right:i,up:n,versor:t}}#he;_update(){if(this.#he)return;this.#he=!0;const e=this._camera,{radius:t,versor:r,target:i,up:n}=this._initialState,{target:s}=this._currentState,{theta:o,phi:a,rho:l,x:c,y:u}=this._input,p=this._progress,{theta:d,phi:m,rho:f,x:g,y:y}=p,v=Math.abs(m-a)>Qt||Math.abs(d-o)>Qt,b=Math.abs(f-l)>Qt,x=Math.abs(c-g)>Qt||Math.abs(u-y)>Qt;if(b||v||x){const v="boolean"==typeof this._config.inertia?this._config.inertia?.05:0:this._config.inertia,b=v>0&&v<1,{right:x,up:E}=OrbitCameraBehavior._getViewXYZ(this._initialState);let _=i,C=n,w=s,P=f;b?P+=(l-f)*v:P=l,p.rho=P;const M=Math.pow(.95,1*P),R=Zt.scale(r,-M*t);_=Zt.add(_,R);let B=m,N=d;b?(B+=(a-m)*v,N+=(o-d)*v):(B=a,N=o);const U=this._getSafePolar({phi:p.phi=B}),L=this._getSafeAzimuth({theta:p.theta=N}),T=Zt.negate(i);let D=qt.translate(qt.identity(),T);const A=Jt.fromAxisAngle(E,U),G=Jt.fromAxisAngle(x,L),O=qt.multiply(Jt.toRotationMatrix(G),Jt.toRotationMatrix(A));D=qt.multiply(D,O),D=qt.translate(D,Zt.negate(T)),_=qt.transform(_,D),C=qt.transform(C,qt.clone(D,e=>{e.offsetX=e.offsetY=e.offsetZ=0}));let S=g,k=y;b?(S+=(c-g)*v,k+=(u-y)*v):(S=c,k=u),p.x=S,p.y=k;const{right:$,up:I}=OrbitCameraBehavior._getViewXYZ(this._currentState),W=Zt.scale($,S),z=Zt.scale(I,k),j=Zt.add(W,z);w=Zt.add(s,j),e.lookAt=w,e.position=_,e.up=C,e.flags.push(h.Camera)}this.#he=!1}dispose(){const e=this._canvas,r=this._scene;t.Utils.isNull(e)||(e.removeEventListener("pointerdown",this._startHandler),e.removeEventListener("wheel",this._zoomHandler)),r.removeEventListener("render",this._renderHandler,!1)}}let er=class PacemOrbitCameraBehaviorElement extends t.Behaviors.PacemBehavior{constructor(){super(...arguments),this.#pe=new Map,this._readyHandler=e=>{if("isReady"===e.detail.propertyName&&!0===e.detail.currentValue){const r=e.currentTarget;r.removeEventListener(t.PropertyChangeEventName,this._readyHandler),this._decorateCore(r)}}}#pe;propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"maxAzimuth":case"minAzimuth":case"inertia":case"zoomControl":case"panControl":case"rotationControl":const e=this._buildConfig(),t=this.#pe;for(let r of t.values())r.configuration=e}}disconnectedCallback(){const e=this.#pe;for(let t of e.values())t.dispose();e.clear(),super.disconnectedCallback()}_buildConfig(){return t.Utils.extend({},Kt,{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??Kt.zoom,pan:this.panControl??Kt.pan,rotation:this.rotationControl??Kt.rotation})}_decorateCore(e){const r=OrbitCameraBehavior.tryAttach(e,this._buildConfig());t.Utils.isNull(r)||this.#pe.set(e,r)}decorate(e){e.isConnected?this._decorateCore(e):e.addEventListener(t.PropertyChangeEventName,this._readyHandler,!1)}undecorate(e){const t=this.#pe;t.has(e)&&(t.get(e).dispose(),t.delete(e))}};Yt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],er.prototype,"maxAzimuth",void 0),Yt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],er.prototype,"maxPolar",void 0),Yt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],er.prototype,"minAzimuth",void 0),Yt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],er.prototype,"minPolar",void 0),Yt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],er.prototype,"zoomControl",void 0),Yt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],er.prototype,"rotationControl",void 0),Yt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],er.prototype,"panControl",void 0),Yt([t.Watch({emit:!1,converter:o})],er.prototype,"inertia",void 0),er=Yt([t.CustomElement({tagName:t.P+"-"+"3d-orbit-camera"})],er);var tr=Object.freeze({__proto__:null,AdapterUtils:AdapterUtils,get BasicMaterialElement(){return V},DragEvent:DragEvent,get KnownShader(){return A},get LambertMaterialElement(){return F},get LineMaterialElement(){return Y},MaterialElement:MaterialElement,OrbitCameraBehavior:OrbitCameraBehavior,Pacem3DAdapterElement:Pacem3DAdapterElement,Pacem3DCameraElement:Pacem3DCameraElement,Pacem3DDetector:class Pacem3DDetector{constructor(){this._detected={supported:!1,info:{}};let e,t=document.createElement("canvas"),r=["webgl","experimental-webgl","moz-webgl","webkit-3d"],i=function(t){if(t)return e.getParameter(t)},n=(e,t,r)=>{let i=this._detected;(i.info[e]=i.info[e]||{})[t=(t=t.replace(/[^\w]+/g,"")).substring(0,1).toLowerCase()+t.substring(1)]=r};if(navigator.userAgent.indexOf("MSIE")>=0)try{e=window.WebGLHelper.CreateGLContext(t,"canvas")}catch(e){}else for(var s=0;s<r.length;s++)try{if(e=t.getContext(r[s]),e){n("main","Context Name",r[s]);break}}catch(e){}this._detected.supported=!!e,n("main","Platform",navigator.platform),n("main","Agent",navigator.userAgent),e&&(n("main","Vendor",i(e.VENDOR)),n("main","Version",i(e.VERSION)),n("main","Renderer",i(e.RENDERER)),n("main","Shading Language Version",i(e.SHADING_LANGUAGE_VERSION)),n("bits","Rgba Bits",i(e.RED_BITS)+", "+i(e.GREEN_BITS)+", "+i(e.BLUE_BITS)+", "+i(e.ALPHA_BITS)),n("bits","Depth Bits",i(e.DEPTH_BITS)),n("shader","Max Vertex Attribs",i(e.MAX_VERTEX_ATTRIBS)),n("shader","Max Vertex Texture Image Units",i(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)),n("shader","Max Varying Vectors",i(e.MAX_VARYING_VECTORS)),n("shader","Max Uniform Vectors",i(e.MAX_VERTEX_UNIFORM_VECTORS)),n("tex","Max Combined Texture Image Units",i(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS)),n("tex","Max Texture Size",i(e.MAX_TEXTURE_SIZE)),n("tex","Max Cube Map Texture Size",i(e.MAX_CUBE_MAP_TEXTURE_SIZE)),n("tex","Num. Compressed Texture Formats",i(e.COMPRESSED_TEXTURE_FORMATS)),n("misc","Max Render Buffer Size",i(e.MAX_RENDERBUFFER_SIZE)),n("misc","Max Viewport Dimensions",i(e.MAX_VIEWPORT_DIMS)),n("misc","Aliased Line Width Range",i(e.ALIASED_LINE_WIDTH_RANGE)),n("misc","Aliased Point Size Range",i(e.ALIASED_POINT_SIZE_RANGE)),n("misc","Supported Extensions",e.getSupportedExtensions()||[]))}get info(){return this._detected.info}get supported(){return this._detected.supported}},get Pacem3DElement(){return u},get Pacem3DGroupElement(){return B},get Pacem3DLightElement(){return L},get Pacem3DMeshElement(){return N},get Pacem3DObjectElement(){return U},get Pacem3DOrthographicCameraElement(){return D},get Pacem3DPerspectiveCameraElement(){return T},Pacem3DPrimitiveElement:Pacem3DPrimitiveElement,get Pacem3DThreeAdapterElement(){return Fe},get Pacem3DWebgpuAdapterElement(){return Xt},get Pacem3DWgslScriptElement(){return Ft},get PacemBoxElement(){return se},get PacemConeElement(){return le},get PacemCylinderElement(){return he},get PacemDodecahedronElement(){return Le},get PacemHexahedronElement(){return Ne},get PacemIcosahedronElement(){return Ue},get PacemLineElement(){return fe},get PacemOctahedronElement(){return Be},get PacemOrbitCameraBehaviorElement(){return er},get PacemPlaneElement(){return ve},get PacemSphereElement(){return Ae},get PacemTetrahedronElement(){return Re},get PacemTorusElement(){return Se},get PhongMaterialElement(){return q},PolyhedronElement:PolyhedronElement,RenderableElement:RenderableElement,RenderableEvent:RenderableEvent,get StalePropertyFlag(){return h},get StandardMaterialElement(){return Q},UI3DEvent:UI3DEvent,Ui3DElement:Ui3DElement,computePlaneNormal:P,computeSharpVertexNormals:w,isBasicMaterial:S,isCamera:g,isGeometry:E,isGroup:C,isInteraction:M,isLambertMaterial:$,isLight:b,isLineMaterial:k,isMaterial:O,isMesh:x,isMeshGeometry:_,isOrthographicCamera:v,isPerspectiveCamera:y,isPhongMaterial:I,isRenderable:m,isShaderMaterial:z,isStage:d,isStandardMaterial:W,isUi3DObject:f}),rr=Object.freeze({__proto__:null,Drawing3D:tr}),ir=function(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o};class OBJParser{static parse(t){const r=[],n=/^v((\s+-?[\d\.]+){3})/gm;let s=n.exec(t);for(;s&&s.length;)r.push(i.convert(s[1])),s=n.exec(t);const o=[],a=/^vt((\s+-?[\d\.]+){2})/gm;for(s=a.exec(t);s&&s.length;)o.push(e.Point.parse(s[1])),s=a.exec(t);const l=[],c=/^vn((\s+-?[\d\.]+){3})/gm;for(s=c.exec(t);s&&s.length;)l.push(i.convert(s[1])),s=c.exec(t);const u=[],h=[],p=[],d=/^f((\s+([\d]+\/[\d]+\/[\d]+)){3,})/gm;for(s=d.exec(t);s&&s.length;){const e=/([\d]+)\/([\d]+)\/([\d]+)/g,r=s[1];let i=e.exec(r),n=0;for(var m,f,g,y,v,b;i&&i.length;)n>2&&(p.push(m),h.push(o[f]),u.push(l[g]),p.push(y),h.push(o[v]),u.push(l[b])),y=parseInt(i[1])-1,v=parseInt(i[2])-1,b=parseInt(i[3])-1,p.push(y),h.push(o[v]),u.push(l[b]),0===n&&(m=y,f=v,g=b),n++,i=e.exec(r);s=d.exec(t)}return new MeshGeometry(r,p,h,u)}}ir([t.Transformer("parse3D")],class Parser3D{static parseGeometry(e,t){if("obj"===t.toLowerCase())return OBJParser.parse(e);throw new Error(`Type '${t}' is not supported.`)}},"parseGeometry",null);var nr=Object.freeze({__proto__:null,BooleanOrNumberConverter:o,DragEvent:DragEvent,get KnownShader(){return A},LineGeometry:LineGeometry,MaterialElement:MaterialElement,MeshGeometry:MeshGeometry,NodeGeometry:NodeGeometry,NotifyChange:ee,Pacem3DAdapterElement:Pacem3DAdapterElement,Pacem3DCameraElement:Pacem3DCameraElement,get Pacem3DGroupElement(){return B},get Pacem3DLightElement(){return L},get Pacem3DMeshElement(){return N},get Pacem3DObjectElement(){return U},get Pacem3DOrthographicCameraElement(){return D},get Pacem3DPerspectiveCameraElement(){return T},Point3DConverter:i,Point3DOrNumberConverter:n,QuaternionConverter:s,RenderableElement:RenderableElement,RenderableEvent:RenderableEvent,get StalePropertyFlag(){return h},UI3DEvent:UI3DEvent,Ui3DElement:Ui3DElement,computePlaneNormal:P,computeSharpVertexNormals:w,isBasicMaterial:S,isCamera:g,isGeometry:E,isGroup:C,isInteraction:M,isLambertMaterial:$,isLight:b,isLineMaterial:k,isMaterial:O,isMesh:x,isMeshGeometry:_,isOrthographicCamera:v,isPerspectiveCamera:y,isPhongMaterial:I,isRenderable:m,isShaderMaterial:z,isStage:d,isStandardMaterial:W,isUi3DObject:f}),sr=Object.freeze({__proto__:null,Components:rr,Drawing3D:nr});e.DeepMerger.merge(sr)}(Pacem,Pacem,Pacem);
7
7
  //# sourceMappingURL=pacem-3d.min.js.map