@pacem/pacem 1.0.4 → 1.0.5-bartels
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -22
- package/dist/browser/pacem-2d.js +4 -4
- package/dist/browser/pacem-2d.js.map +1 -1
- package/dist/browser/pacem-2d.min.js +2 -2
- package/dist/browser/pacem-3d.js +508 -508
- package/dist/browser/pacem-3d.js.map +1 -1
- package/dist/browser/pacem-3d.min.js +2 -2
- package/dist/browser/pacem-charts.js +1 -1
- package/dist/browser/pacem-charts.min.js +1 -1
- package/dist/browser/pacem-cms.js +1 -1
- package/dist/browser/pacem-cms.min.js +1 -1
- package/dist/browser/pacem-core.js +4097 -4097
- package/dist/browser/pacem-core.js.map +1 -1
- package/dist/browser/pacem-core.min.js +2 -2
- package/dist/browser/pacem-foundation.js +1 -4
- package/dist/browser/pacem-foundation.js.map +1 -1
- package/dist/browser/pacem-foundation.min.js +1 -1
- package/dist/browser/pacem-fx.js +1 -1
- package/dist/browser/pacem-fx.min.js +1 -1
- package/dist/browser/pacem-logging.js +1 -1
- package/dist/browser/pacem-logging.min.js +1 -1
- package/dist/browser/pacem-maps.js +1 -1
- package/dist/browser/pacem-maps.min.js +1 -1
- package/dist/browser/pacem-media.js +1 -1
- package/dist/browser/pacem-media.min.js +1 -1
- package/dist/browser/pacem-networking.js +1 -1
- package/dist/browser/pacem-networking.min.js +1 -1
- package/dist/browser/pacem-numerical.js +1 -1
- package/dist/browser/pacem-numerical.min.js +1 -1
- package/dist/browser/pacem-plus.js +7 -2
- package/dist/browser/pacem-plus.js.map +1 -1
- package/dist/browser/pacem-plus.min.js +2 -2
- package/dist/browser/pacem-scaffolding.js +1 -1
- package/dist/browser/pacem-scaffolding.min.js +1 -1
- package/dist/browser/pacem-ui.js +7 -1
- package/dist/browser/pacem-ui.js.map +1 -1
- package/dist/browser/pacem-ui.min.js +1 -1
- package/dist/bundle/pacem.min.mjs +680 -680
- package/dist/bundle/pacem.mjs +40226 -40348
- package/dist/bundle/pacem.mjs.map +4 -4
- package/dist/docs/pacem-core.json +5 -5
- package/dist/docs/pacem-foundation.json +1 -1
- package/dist/docs/pacem-numerical.json +2 -2
- package/dist/docs/pacem-plus.json +6363 -6351
- package/dist/typings/index.d.ts +915 -590
- package/package.json +5 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pacem/pacem v1.0.
|
|
2
|
+
* @pacem/pacem v1.0.5-bartels (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 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??!0))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,i)=>{e.setPipeline(this._linePipeline);try{this._bindLineWorldTransform(e,r),this._bindLineCameraProjection(e,i),this._bindLinePositions(e,r),this._bindLineMaterial(e,r),this._drawLine(e,r)}catch(e){console.error("Pacem.Drawing3D.FrameException",e)}},this.raycast=(e,t,r,i)=>{e.setPipeline(this._pickLinePipeline);try{this._bindLineRaycastWorldTransform(e,r),this._bindLineRaycastCameraProjection(e,i),this._bindLinePositions(e,r),this._bindLinePicker(e,r),this._drawLine(e,r)}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=[c,l,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.clearTimeout(this.#t),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),this.#t=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;#t;_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);
|
|
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{}function A(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})}}var 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};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(){O.call(this)}}function O(){this.flags=[h.Geometry]}class LineGeometry extends NodeGeometry{}G([A(O)],LineGeometry.prototype,"positions",void 0);class MeshGeometry extends NodeGeometry{#o;#a;#l;get barycenter(){return this.#l??=NodeGeometry.barycenter(this.positions)}set barycenter(e){this.#l=e}get boundingBox(){return this.#o??=NodeGeometry.boundingBox(this.positions)}set boundingBox(e){this.#o=e}get boundingSphere(){return this.#a}set boundingSphere(e){this.#a=e}constructor(e,t,r=[],i=[]){super(e),this.triangleIndices=t,this.textureCoordinates=r,this.normals=i}}G([A(O)],MeshGeometry.prototype,"positions",void 0),G([A(O)],MeshGeometry.prototype,"triangleIndices",void 0),G([A(O)],MeshGeometry.prototype,"textureCoordinates",void 0),G([A(O)],MeshGeometry.prototype,"normals",void 0);var S,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};function $(e){return"shader"in e}function I(e){return $(e)&&e.shader===S.Basic}function W(e){return $(e)&&e.shader===S.Line}function z(e){return $(e)&&e.shader===S.Lambert}function j(e){return $(e)&&e.shader===S.Phong}function V(e){return $(e)&&e.shader===S.Standard}function H(e){return $(e)&&e.shader===S.Custom}!function(e){e.Basic="basic",e.Lambert="lambert",e.Phong="phong",e.Standard="standard",e.Line="line",e.Custom="custom"}(S||(S={}));class MaterialElement extends t.PacemEventTarget{constructor(e){super(),this.#c=e}#c;get shader(){return this.#c}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:[]}}}k([t.Watch()],MaterialElement.prototype,"material",void 0),k([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],MaterialElement.prototype,"opacity",void 0),k([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],MaterialElement.prototype,"wireframe",void 0),k([t.Watch({emit:!1,converter:t.PropertyConverters.String})],MaterialElement.prototype,"color",void 0),k([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],MaterialElement.prototype,"hide",void 0),k([t.Watch({emit:!1,converter:t.PropertyConverters.String})],MaterialElement.prototype,"map",void 0);var F=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)}}F([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 X=Object.freeze({__proto__:null,BooleanOrNumberConverter:o,DragEvent:DragEvent,get KnownShader(){return S},LineGeometry:LineGeometry,MaterialElement:MaterialElement,MeshGeometry:MeshGeometry,NodeGeometry:NodeGeometry,NotifyChange:A,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:I,isCamera:g,isGeometry:E,isGroup:C,isInteraction:M,isLambertMaterial:z,isLight:b,isLineMaterial:W,isMaterial:$,isMesh:x,isMeshGeometry:_,isOrthographicCamera:v,isPerspectiveCamera:y,isPhongMaterial:j,isRenderable:m,isShaderMaterial:H,isStage:d,isStandardMaterial:V,isUi3DObject:f});var Y=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 Z=class BasicMaterialElement extends MaterialElement{constructor(){super(S.Basic)}};Z=Y([t.CustomElement({tagName:`${t.P}-${a}-material-basic`})],Z);var q=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 J=class LambertMaterialElement extends MaterialElement{constructor(){super(S.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()}}};q([t.Watch({emit:!1,converter:t.PropertyConverters.String})],J.prototype,"emissiveColor",void 0),q([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],J.prototype,"reflectivity",void 0),q([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],J.prototype,"refractionRatio",void 0),J=q([t.CustomElement({tagName:`${t.P}-${a}-material-lambert`})],J);var Q=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 K=class LineMaterialElement extends MaterialElement{constructor(){super(S.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())}};Q([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],K.prototype,"lineWidth",void 0),Q([t.Watch({emit:!1,converter:t.PropertyConverters.String})],K.prototype,"lineJoin",void 0),Q([t.Watch({emit:!1,converter:t.PropertyConverters.String})],K.prototype,"lineCap",void 0),Q([t.Watch({emit:!1,converter:{convert:e=>e?.split(",").map(e=>parseInt(e)).filter(e=>!Number.isNaN(e)),convertBack:e=>e?.join(",")}})],K.prototype,"dashArray",void 0),K=Q([t.CustomElement({tagName:`${t.P}-${a}-material-line`})],K);var ee=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=class PhongMaterialElement extends MaterialElement{constructor(){super(S.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()}}};ee([t.Watch({emit:!1,converter:t.PropertyConverters.String})],te.prototype,"emissiveColor",void 0),ee([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],te.prototype,"reflectivity",void 0),ee([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],te.prototype,"refractionRatio",void 0),ee([t.Watch({emit:!1,converter:t.PropertyConverters.String})],te.prototype,"specularColor",void 0),ee([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],te.prototype,"shininess",void 0),ee([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],te.prototype,"flatShading",void 0),te=ee([t.CustomElement({tagName:`${t.P}-${a}-material-phong`})],te);var re=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 ie=class StandardMaterialElement extends MaterialElement{constructor(){super(S.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()}}};re([t.Watch({emit:!1,converter:t.PropertyConverters.String})],ie.prototype,"emissiveColor",void 0),re([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ie.prototype,"refractionRatio",void 0),re([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ie.prototype,"roughness",void 0),re([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ie.prototype,"metalness",void 0),re([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],ie.prototype,"flatShading",void 0),ie=re([t.CustomElement({tagName:`${t.P}-${a}-material-standard`})],ie);var 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};class Pacem3DPrimitiveElement extends t.PacemEventTarget{viewActivatedCallback(){super.viewActivatedCallback(),t.Utils.isNull(this.geometry)&&(this.geometry=this.createDefaultGeometry())}}ne([t.Watch({converter:t.PropertyConverters.Json})],Pacem3DPrimitiveElement.prototype,"geometry",void 0);var se,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 ae=se=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 se.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=se.createMeshGeometry(this.width,this.height,this.depth,this.widthSegments,this.heightSegments,this.depthSegments)}}};oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ae.prototype,"width",void 0),oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ae.prototype,"height",void 0),oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ae.prototype,"depth",void 0),oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ae.prototype,"widthSegments",void 0),oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ae.prototype,"heightSegments",void 0),oe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ae.prototype,"depthSegments",void 0),ae=se=oe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-box"})],ae);var le,ce=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 ue=le=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 le.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=le.createMeshGeometry(this.radius,this.height,this.sides,this.heightSegments,this.capSegments)}}};ce([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ue.prototype,"radius",void 0),ce([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ue.prototype,"height",void 0),ce([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ue.prototype,"sides",void 0),ce([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ue.prototype,"heightSegments",void 0),ce([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],ue.prototype,"capSegments",void 0),ue=le=ce([t.CustomElement({tagName:t.P+"-"+"3d-primitive-cone"})],ue);var he,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};let de=he=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 he.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=he.createMeshGeometry(this.radius,this.height,this.sides,this.heightSegments,this.capSegments)}}};pe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],de.prototype,"radius",void 0),pe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],de.prototype,"height",void 0),pe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],de.prototype,"sides",void 0),pe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],de.prototype,"heightSegments",void 0),pe([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],de.prototype,"capSegments",void 0),de=he=pe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-cylinder"})],de);var me,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};const ge=[{x:0,y:0,z:0},{x:0,y:1,z:0}];let ye=me=class PacemLineElement extends Pacem3DPrimitiveElement{static createLineGeometry(e){return new LineGeometry(e||ge)}createDefaultGeometry(){return me.createLineGeometry()}propertyChangedCallback(e,t,r,i){if(super.propertyChangedCallback(e,t,r,i),"positions"===e)this.geometry=me.createLineGeometry(r)}};fe([t.Watch({emit:!1,converter:t.PropertyConverters.Json})],ye.prototype,"positions",void 0),ye=me=fe([t.CustomElement({tagName:t.P+"-"+"3d-primitive-line"})],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 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 ve.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"width":case"length":case"widthSegments":case"lengthSegments":this.geometry=ve.createMeshGeometry(this.width,this.length,this.widthSegments,this.lengthSegments)}}};be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"width",void 0),be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"length",void 0),be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"widthSegments",void 0),be([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],xe.prototype,"lengthSegments",void 0),xe=ve=be([t.CustomElement({tagName:t.P+"-"+"3d-primitive-plane"})],xe);var Ee,_e,Ce,we,Pe,Me=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 Re=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},Be=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)}}Me([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],PolyhedronElement.prototype,"radius",void 0);let Ne=Ee=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=Re(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=Re(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:Be.zero(),radius:e},o}createMeshGeometry(e=this.radius){return Ee.createMeshGeometry(e)}};Ne=Ee=Me([t.CustomElement({tagName:t.P+"-"+"3d-primitive-tetrahedron"})],Ne);let Ue=_e=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=Re(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=Re(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:Be.zero(),radius:e},o}createMeshGeometry(e=this.radius){return _e.createMeshGeometry(e)}};Ue=_e=Me([t.CustomElement({tagName:t.P+"-"+"3d-primitive-octahedron"})],Ue);let Le=Ce=class PacemHexahedronElement extends PolyhedronElement{static createMeshGeometry(e){e||=1;const t=2*e*(1/Math.sqrt(3)),r=ae.createMeshGeometry(t,t,t);return r.key=`hexahedron_${e}`,r}createMeshGeometry(e=this.radius){return Ce.createMeshGeometry(e)}};Le=Ce=Me([t.CustomElement({tagName:t.P+"-"+"3d-primitive-hexahedron"})],Le);let Te=we=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=Re(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=Re(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:Be.zero(),radius:e},o}createMeshGeometry(e=this.radius){return we.createMeshGeometry(e)}};Te=we=Me([t.CustomElement({tagName:t.P+"-"+"3d-primitive-icosahedron"})],Te);let De=Pe=class PacemDodecahedronElement extends PolyhedronElement{static createMeshGeometry(e){e||=1;const t=[Be.from(.356822*e,.934172*e,0*e),Be.from(-.356822*e,.934172*e,0*e),Be.from(.57735*e,.57735*e,-.57735*e),Be.from(0*e,.356822*e,-.934172*e),Be.from(-.57735*e,.57735*e,-.57735*e),Be.from(-.57735*e,.57735*e,.57735*e),Be.from(0*e,.356822*e,.934172*e),Be.from(.57735*e,.57735*e,.57735*e),Be.from(.934172*e,0*e,-.356822*e),Be.from(.934172*e,0*e,.356822*e),Be.from(0*e,-.356822*e,.934172*e),Be.from(.57735*e,-.57735*e,.57735*e),Be.from(.57735*e,-.57735*e,-.57735*e),Be.from(.356822*e,-.934172*e,0*e),Be.from(-.57735*e,-.57735*e,.57735*e),Be.from(-.356822*e,-.934172*e,0*e),Be.from(0*e,-.356822*e,-.934172*e),Be.from(-.57735*e,-.57735*e,-.57735*e),Be.from(-.934172*e,0*e,.356822*e),Be.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=Re(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:Be.zero(),radius:e},s}createMeshGeometry(e=this.radius){return Pe.createMeshGeometry(e)}};De=Pe=Me([t.CustomElement({tagName:t.P+"-"+"3d-primitive-dodecahedron"})],De);var Ae,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 Oe=Ae=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 Ae.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"segments":this.geometry=Ae.createMeshGeometry(this.radius,this.segments)}}};Ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Oe.prototype,"radius",void 0),Ge([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],Oe.prototype,"segments",void 0),Oe=Ae=Ge([t.CustomElement({tagName:t.P+"-"+"3d-primitive-sphere"})],Oe);var Se,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};let $e=Se=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 Se.createMeshGeometry()}propertyChangedCallback(e,t,r,i){switch(super.propertyChangedCallback(e,t,r,i),e){case"radius":case"innerRadius":case"segments":case"sides":this.geometry=Se.createMeshGeometry(this.radius,this.innerRadius,this.segments,this.sides)}}};ke([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$e.prototype,"radius",void 0),ke([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$e.prototype,"innerRadius",void 0),ke([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$e.prototype,"segments",void 0),ke([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],$e.prototype,"sides",void 0),$e=Se=ke([t.CustomElement({tagName:t.P+"-"+"3d-primitive-torus"})],$e);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 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};function We(e){return AdapterUtils.flattenVectorArray(e)}const ze="0.152.2",je={VERSION:ze,API_URI:`https://unpkg.com/three@${ze}/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 Ve(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(V(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(j(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(z(r)){return s(new THREE.MeshLambertMaterial(t.Utils.extend(n,{emissive:r.emissiveColor,reflectivity:r.reflectivity,refractionRatio:r.refractionRatio})))}if(W(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($(r)){return s(new THREE.MeshBasicMaterial(n))}return null}function He(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 Fe(e){if(t.Utils.isNullOrEmpty(e.geometry))return null;return new(e.geometry instanceof LineGeometry?THREE.Line:THREE.Mesh)}function Xe(){return"THREE"in window}let Ye=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=Fe(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=We(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=We(e.positions);r.setAttribute("position",new THREE.Float32BufferAttribute(i,3));const n=We(e.textureCoordinates);if(r.setAttribute("uv",new THREE.Float32BufferAttribute(n,2)),t.Utils.isNullOrEmpty(e.normals))r.computeVertexNormals();else{const t=We(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=Ve(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=Ve(r);t.Utils.isNull(e)||(e.side=THREE.BackSide,s.push(e))}return n&&s.length>1?s:o}(e.material)||je.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=He(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),Xe()&&!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),Xe()||(await t.CustomElementUtils.importjs(je.API_URI),await async function(...e){const t=Date.now();var r=!1;do{r=Xe();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(je.ORBIT_URI)].concat(je.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),!Xe()||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(Xe()&&!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(He(e))}else if(e instanceof N){t(Fe(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)}};Ie([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],Ye.prototype,"orbit",void 0),Ye=Ie([t.CustomElement({tagName:t.P+"-3d-three-adapter"})],Ye);const Ze="pacem-3d-",qe="color",Je="ambient",Qe="lighting",Ke="VertexInput",et="VertexOutput",tt="InteractionData";var rt,it,nt,st,ot;!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"}(rt||(rt={})),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"}(it||(it={})),function(e){e[e.VERTEX=1]="VERTEX",e[e.FRAGMENT=2]="FRAGMENT",e[e.COMPUTE=4]="COMPUTE"}(nt||(nt={})),function(e){e[e.READ=1]="READ",e[e.WRITE=2]="WRITE"}(st||(st={})),function(e){e.Mesh="mesh",e.Camera="camera",e.Texture="texture",e.Light="light",e.Interaction="interaction"}(ot||(ot={}));class Buffers{static create(e,t,r=""){const i=e.createBuffer({size:t.byteLength,label:r,usage:rt.VERTEX|rt.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:rt.UNIFORM|rt.COPY_DST})}static createStorage(e,t,r=""){return e.createBuffer({size:t.byteLength,label:r,usage:rt.STORAGE|rt.COPY_DST})}static createIndexed(e,t,r=""){const i=e.createBuffer({size:t.byteLength,label:r,usage:rt.INDEX|rt.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 at={outputNormalLocation:0,outputVertexLocation:1,outputUvLocation:2,outputVertexIndexLocation:3,outputRayIndexLocation:4,outputInstanceIndexLocation:5,storageMaterialGroupIndex:2,storageMaterialBindingIndex:0};function lt(e=[]){return e.join("\r\n")}function ct(e={},r=at){const i=t.Utils.extend({},at,r),n=lt(e.definitions),s=lt(e.bindings),o=function(e=[]){let t="";for(let r of e){const e=r.trim();e.endsWith(";")?t+=e+"\r\n\t":t+=`${qe} = ${e};\r\n\t`}return t}(e.modifiers),a=qe,l=Qe,c=Je;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 ut={outputInstanceIndexLocation:0,outputVertexIndexLocation:1,storageMaterialGroupIndex:3,storageMaterialBindingIndex:0};function ht(e=[]){return e.join("\r\n")}function pt(e={},r=ut){const i=t.Utils.extend({},ut,r),n=ht(e.definitions),s=ht(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(I(e))return new BasicMaterial(e);if(W(e))return new LineMaterial(e);throw new TypeError(`Material type '${e.shader}' not supported.`)}}const dt={};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 dt}buffer({device:e},t=Ze+"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??!0))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 S.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:it.TEXTURE_BINDING|it.RENDER_ATTACHMENT|it.COPY_DST,size:[t.width,t.height]}),source:t}}return null}static{this.fragment=ct}}class LineMaterial extends MaterialBase{get shader(){return S.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,Ze+"line-"+this.shader+"-buffer"),value:n,version:performance.now()}}return super.buffer(e)}texture(e){return null}static{this.fragment=pt}}const mt=["input","data"];function ft(e){"string"!=typeof e&&(e=e(...mt));const t=new RegExp(`fn\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*->\\s*(${Ke}|${et})\\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!==tt)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: ${Ke}|${et}, arg2: ${tt}) -> ${Ke}|${et}`)}const gt={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 yt={inputPositionLocation:0,outputInstanceIndexLocation:0,outputVertexIndexLocation:1,storagePositionsGroupIndex:2,storagePositionsBindingIndex:0,uniformDimensionsGroupIndex:2,uniformDimensionsBindingIndex:1,uniformViewGroupIndex:0,uniformViewBindingIndex:0,uniformWorldGroupIndex:1,uniformWorldBindingIndex:0};function vt(e){return`struct ${et} {\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 bt(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 xt={uv:"uv"};const Et={normal:"normal",inputColor:"white"};function _t(e,r,i){const n=`directional_${t.Utils.uniqueCode()}`,s=t.Utils.extend({},Et,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 Ct={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({},Ct,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 Pt(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 Mt=r.Geometry.LinearAlgebra.Vector3D,Rt=r.Geometry.LinearAlgebra.Matrix3D,Bt={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 Nt(e,t,r){const i=Mt.subtract(t,e),n=Mt.cross(r,i),s=Mt.cross(i,n);Mt.normalize(n),Mt.normalize(i),Mt.normalize(s);const o=-Mt.dot(n,e),a=-Mt.dot(s,e),l=-Mt.dot(i,e);return Rt.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 Ut(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 Nt(e.position,e.lookAt,e.up)}static projection(e,t=Bt){const r=e.position,i=e.lookAt,n=Mt.subtract(i,r);Mt.normalize(n);const s=Mt.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 Ut(n,s),Rt.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 Nt(e.position,e.lookAt,e.up)}static projection(e,t=Bt){const r=t.width/t.height/e.aspectRatio;return function(e=120,t=1,r=.1,i=1e3){Ut(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 Rt.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 Lt=r.Geometry.LinearAlgebra.Vector3D,Tt=r.Geometry.LinearAlgebra.Matrix3D;function Dt(e,t){throw"function"==typeof t&&(t=t.name),new RangeError(`Buffer '${e}' not available for ${t}.`)}function At(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($(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 At(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=Tt.identity(),r=this;for(;!t.Utils.isNull(r.parent);){const t=r.parent.item,i=Tt.translate(t.transformMatrix??Tt.identity(),t.position??Lt.zero());e=Tt.multiply(e,i),r=r.parent}return e}buildWorldTransform(){const e=Tt.translate(this.item.transformMatrix??Tt.identity(),this.item.position??Lt.zero()),t=this.buildParentWorldTransform();return Tt.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,Ze+"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 Gt={shader:S.Basic,color:"#c0c0c0",flags:[]};class RenderableGroupBuffer extends RenderableBufferBase{#n;constructor(e,t,...r){super(e,t),this.#n=e.childRenderables.map(e=>At(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});Dt(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=Tt.multiply(l,c),h=new Float32Array(36);if(h.set(Tt.toArray(l),0),h.set(Tt.toArray(u),16),h.set([s,o,a],32),t.Utils.isNull(this.#x)){const t=Buffers.createUniform(e,h,Ze+"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:Dt(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,Ze+"meshgeometry-"+n+"-positions-buffer"),m=Buffers.create(e,u,Ze+"meshgeometry-"+n+"-normals-buffer"),f=Buffers.create(e,h,Ze+"meshgeometry-"+n+"-uvmap-buffer"),g=Buffers.create(e,p,Ze+"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,Ze+"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:Dt(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);Dt(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,Ze+"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:Dt(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??Gt;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=Tt.transpose(Tt.invert(i)),s=new Float32Array(28);if(s.set(Tt.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,Ze+"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,Ze+"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=Lt.subtract(r.position,r.target);i.set([l.x,l.y,l.z],4),this.#N={value:i,buffer:Buffers.createUniform(t,i,Ze+"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,Ze+"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});Dt(r,RenderableLightBuffer)}dispose(){this.#E.clear();const e=this.#N;this.#N=null,this.destroySafely(e)}}const Ot=Ze,St={multisample:!0,packedVertices:!0,primitive:{topology:"triangle-list",frontFace:"ccw",cullMode:"back"}},kt=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&&W(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:S.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=gt){e!=gt&&(e=t.Utils.extend({},gt,e));const r=e.inputModifier;let i="vertexInput",n="";if(!t.Utils.isNullOrEmpty(r)){const{name:e,args:[t,s],body:o}=ft(r);i=`${e}(vertexInput, interaction)`,n=`fn ${e} (${t}: ${Ke}, ${s}: ${tt}) -> ${Ke} {\n ${o}\n}`}const s=e.outputModifier;let o="output",a="";if(!t.Utils.isNullOrEmpty(s)){const{name:e,args:[t,r],body:i}=ft(s);o=`${e}(output, interaction)`,a=`fn ${e} (${t}: ${Ke}, ${r}: ${tt}) -> ${et} {\n ${i}\n}`}const l=t.Utils.extend({},gt,e);return`struct ${et} {\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 ${Ke} {\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 ${tt} {\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: ${tt};\n\n@vertex fn main(vertexInput: ${Ke}) -> ${et} {\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 = ${et}(\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)?S.Basic:e.material?.shader??S.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(ot.Mesh,[o,a,{key:"texture",group:r,type:"texture"}]):n.set(ot.Mesh,[o,a]),n.set(ot.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(ot.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===S.Basic){if(e.hasTexture){const r=e.materialBindGroupIndex;n(function(e=xt,r,i=1){const n=t.Utils.uniqueCode(),s=`sampler_${n}`,o=`tex_${n}`,a=t.Utils.extend({},xt,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:qe,outputColors:[qe],uv:"uv"},r))}let s=0;const o=this.#O;for(let t of o){switch(t.item.type){case"direction":n(_t({outputColor:Qe,normal:"normal"},e.lightingBindGroupIndex,s));break;case"omni":n(wt({outputColor:Qe,normal:"normal",position:"vertex"},e.lightingBindGroupIndex,s));break;case"ambient":n(Pt({inputColor:qe,outputColor:Je},e.lightingBindGroupIndex,s))}s++}return BasicMaterial.fragment(i,r)}}}const $t=(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,Ot+"mesh-colorpick-bind-group"),this._ensureMaterialBindGroup=(e,t,r,i,n=2)=>{const s=this._bindGroupLayouts[n],o=Ot+"material-bind-group";if(s.label!==Ot+"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!==Ot+"mesh-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const o=e.key+"-"+(n?1:0),a=`${Ot}${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=`${Ot}${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,Ot+"mesh-lighting-bind-group")},this._bindGroupLayouts=[],this._bindVertex=kt,this._bindPicker=kt,this._bindWorldTransform=kt,this._bindRaycastWorldTransform=kt,this._bindCameraProjectionAndInteractionData=kt,this._bindRaycastCameraProjectionAndInteractionData=kt,this._bindLighting=kt,this._bindMaterial=kt,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({},St,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:nt.VERTEX|nt.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:nt.VERTEX|nt.FRAGMENT,buffer:{type:"uniform"}}],label:Ot+"mesh-view-bind-group-layout"}),l=s.createBindGroupLayout({entries:[{binding:0,visibility:nt.VERTEX,buffer:{type:"uniform"}}],label:Ot+"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:nt.FRAGMENT,buffer:{type:"read-only-storage"}}],{mapCount:d}=i.metadata,m=d>0;m&&p.push({visibility:nt.FRAGMENT,binding:1,sampler:{}},...Array(d).keys().map(e=>({visibility:nt.FRAGMENT,binding:2+e,texture:{}})));const f={label:Ot+"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:nt.FRAGMENT,binding:t,buffer:{type:"uniform"}})),label:Ot+"lighting-bind-group-layout"});c.push(e)}const x={label:Ot+"mesh-render-pipeline",vertex:o,fragment:u,layout:s.createPipelineLayout({label:Ot+"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:Ot+"mesh-colorpick-bind-group-layout",entries:[{visibility:nt.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),_={label:Ot+"mesh-colorpick-pipeline",vertex:o,fragment:{module:s.createShaderModule({code:bt(2)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:Ot+"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;$t(s,a);const{group:c}=i.bindings(ot.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($t(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;$t(s,u);const{group:p}=i.bindings(ot.Camera,"cameraViewTransform",0),{group:d}=i.bindings(ot.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;$t(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)$t(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;$t(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 S.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=yt){const r=t.Utils.extend({},yt,e);return`${vt(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) -> ${et} {\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 ${et}(\n position,\n instance,\n index\n );\n}`}():function(e=yt){const r=t.Utils.extend({},yt,e);return`${vt(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) -> ${et} {\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 ${et}(\n worldViewProjectionTransform * position4,\n instance,\n index);\n}`}()}_computeBasicData(){const e=this.#W.item,r=t.Utils.isNull(e)?S.Line:e.material?.shader??S.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(ot.Mesh,[r,i,n,s]),t.set(ot.Camera,[{key:"cameraViewTransform",group:0,binding:0,type:"buffer"}])}fragment(e=this._computeBasicData()){this._computeBindGroupsAndReferences(e);const t={definitions:[],bindings:[],modifiers:[]};if(e.shader===S.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,Ot+"line-colorpick-bind-group")},this._ensureLineMaterialBindGroup=(e,t,r,i=2)=>{const n=this._bindLineGroupLayouts[i];if(n.label!==Ot+"line-material-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const s=this.context;return this._cache.ensureBindGroup(s,e,[t],r,n,Ot+"line-material-bind-group")},this._ensureLinePositionsBindGroup=(e,t,r,i)=>{const n=this._bindLineGroupLayouts[i];if(n.label!==Ot+"line-positions-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const s=this.context;return this._cache.ensureBindGroup(s,e,t,r,n,Ot+"line-positions-bind-group")},this._ensureLineWorldTransformBindGroup=(e,t,r,i=1,n=!1)=>{const s=this._bindLineGroupLayouts[i];if(s.label!==Ot+"line-transforms-bind-group-layout")throw new Error("BindGroupLayout mismatch!");const o=e.key+"-line-"+(n?1:0),a=`${Ot}${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=`${Ot}${n?"colorpick":""}-line-view-bind-group`,l=this.context;return this._cache.ensureBindGroup(l,o,[t],r,s,a)},this._bindLineGroupLayouts=[],this._bindLinePositions=kt,this._bindLinePicker=kt,this._bindLineWorldTransform=kt,this._bindLineRaycastWorldTransform=kt,this._bindLineCameraProjection=kt,this._bindLineRaycastCameraProjection=kt,this._bindLineMaterial=kt,this._drawLine=kt,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)=>{e.setPipeline(this._linePipeline);try{this._bindLineWorldTransform(e,r),this._bindLineCameraProjection(e,i),this._bindLinePositions(e,r),this._bindLineMaterial(e,r),this._drawLine(e,r)}catch(e){console.error("Pacem.Drawing3D.FrameException",e)}},this.raycast=(e,t,r,i)=>{e.setPipeline(this._pickLinePipeline);try{this._bindLineRaycastWorldTransform(e,r),this._bindLineRaycastCameraProjection(e,i),this._bindLinePositions(e,r),this._bindLinePicker(e,r),this._drawLine(e,r)}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({},St,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:nt.VERTEX,buffer:{type:"uniform"}}],label:Ot+"line-transforms-bind-group-layout"}),c=s.createBindGroupLayout({entries:[{binding:0,visibility:nt.VERTEX,buffer:{type:"uniform"}}],label:Ot+"line-view-bind-group-layout"}),u=[{binding:0,visibility:nt.VERTEX,buffer:{type:"read-only-storage"}}];o&&u.push({binding:1,visibility:nt.VERTEX,buffer:{type:"uniform"}});const h=[c,l,s.createBindGroupLayout({entries:u,label:Ot+"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:nt.FRAGMENT,buffer:{type:"read-only-storage"}}],y={label:Ot+"line-material-bind-group-layout",entries:g},v=s.createBindGroupLayout(y);d.push(v);const b=o?r.primitive.topology:"line-list",x={label:Ot+"line-render-pipeline",vertex:a,fragment:m,layout:s.createPipelineLayout({label:Ot+"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:Ot+"line-colorpick-bind-group-layout",entries:[{visibility:nt.FRAGMENT,binding:0,buffer:{type:"uniform"}}]}),_={label:Ot+"line-colorpick-pipeline",vertex:a,fragment:{module:s.createShaderModule({code:bt(p)}),targets:[{format:"r32uint"}]},layout:s.createPipelineLayout({label:Ot+"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;$t(s,a);const{group:c}=i.bindings(ot.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;$t(s,a);const{group:c}=i.bindings(ot.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($t(s,l),o){const e=a.buffer(n,"line"),t=e.buffer;u||=e.fresh,h.push(t),$t(s,e)}const{group:p}=i.bindings(ot.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;$t(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,$t(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(st.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:it.COPY_SRC|it.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:Ze+"colorpick-output-buffer",size:4,usage:rt.MAP_READ|rt.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:Ze+"colorpick-raycaster"});const{render:t,depth:r}=this._ensureTextures(),i={label:Ze+"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 It=r.Geometry.LinearAlgebra.Vector3D;var Wt;!function(e){e[e.NotSupported=0]="NotSupported",e[e.Disabled=1]="Disabled"}(Wt||(Wt={}));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:Wt.Disabled};i(t)})}else{const e={message:"WebGPU not supported.",cause:Wt.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:Ze+"render-texture",format:i??o.format,usage:it.RENDER_ATTACHMENT,size:[o.width,o.height],sampleCount:4});a.render={texture:e,view:e.createView({label:Ze+"render-texture-view"})};const t=s.createTexture({label:Ze+"depth-texture",format:"depth24plus",usage:it.RENDER_ATTACHMENT,size:[o.width,o.height],sampleCount:4});a.depth={texture:t,view:t.createView({label:Ze+"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:Ze+"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:Ze+"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:It.from(0,0,0),up:It.j(),position:It.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 zt=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 jt="WebGPURaycastCallback",Vt="WebGPURaycastPixel",Ht=t.CustomElementUtils.getAttachedPropertyValue,Ft=t.CustomElementUtils.setAttachedPropertyValue,Xt=t.CustomElementUtils.deleteAttachedPropertyValue;let Yt=class Pacem3DWgslScriptElement extends t.Components.PacemItemElement{findContainer(){return t.CustomElementUtils.findAncestor(this,e=>e instanceof Zt)}#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()}};zt([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Yt.prototype,"type",void 0),zt([t.Watch({emit:!1,converter:t.PropertyConverters.String})],Yt.prototype,"wgsl",void 0),Yt=zt([t.CustomElement({tagName:t.P+"-3d-wgsl-script"})],Yt);let Zt=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 Yt&&!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===Wt.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=Ht(e,Vt);if(n.render({cursor:s,time:performance.now(),resolution:{width:r,height:i}}),!e.interactive)return;const o=Ht(e,jt);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){Ft(e,jt,i),t.x<0||t.y<0||t.x>=r.width||t.y>=r.height?Xt(e,Vt):Ft(e,Vt,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}};zt([t.Debounce(100)],Zt.prototype,"_parseWgslModifiers",null),zt([t.Watch({emit:!1})],Zt.prototype,"modifiers",void 0),zt([t.Watch({emit:!1,converter:t.PropertyConverters.Boolean})],Zt.prototype,"enableValidation",void 0),Zt=zt([t.CustomElement({tagName:t.P+"-3d-webgpu-adapter"})],Zt);var qt=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 Jt=r.Geometry.LinearAlgebra.Vector3D,Qt=r.Geometry.LinearAlgebra.Matrix3D,Kt=r.Geometry.LinearAlgebra.Quaternion;r.Geometry.LinearAlgebra.Spherical;const er=.001,tr={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,Jt.zero()),this._progress.x=this._progress.y=0),t.avoidHandler(e),window.clearTimeout(this.#t),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),this.#t=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=Jt.subtract(e.position,e.lookAt),r=Jt.mag(t);return{target:e.lookAt,versor:Jt.unit(t),up:e.up,radius:r,position:e.position}}static tryAttach(e,r){r??=tr;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)||Jt.areClose(i,n)?null:new OrbitCameraBehavior(e,r)}}get configuration(){return this._config}set configuration(e){this._config=e}#ue;#ce;#t;_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=Jt.cross(t,r),n=Jt.cross(i,t);return Jt.normalize(i),Jt.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)>er||Math.abs(d-o)>er,b=Math.abs(f-l)>er,x=Math.abs(c-g)>er||Math.abs(u-y)>er;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=Jt.scale(r,-M*t);_=Jt.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=Jt.negate(i);let D=Qt.translate(Qt.identity(),T);const A=Kt.fromAxisAngle(E,U),G=Kt.fromAxisAngle(x,L),O=Qt.multiply(Kt.toRotationMatrix(G),Kt.toRotationMatrix(A));D=Qt.multiply(D,O),D=Qt.translate(D,Jt.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=Jt.scale($,S),z=Jt.scale(I,k),j=Jt.add(W,z);w=Jt.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 rr=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({},tr,{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??tr.zoom,pan:this.panControl??tr.pan,rotation:this.rotationControl??tr.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))}};qt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],rr.prototype,"maxAzimuth",void 0),qt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],rr.prototype,"maxPolar",void 0),qt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],rr.prototype,"minAzimuth",void 0),qt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],rr.prototype,"minPolar",void 0),qt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],rr.prototype,"zoomControl",void 0),qt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],rr.prototype,"rotationControl",void 0),qt([t.Watch({emit:!1,converter:t.PropertyConverters.Number})],rr.prototype,"panControl",void 0),qt([t.Watch({emit:!1,converter:o})],rr.prototype,"inertia",void 0),rr=qt([t.CustomElement({tagName:t.P+"-"+"3d-orbit-camera"})],rr);var ir=Object.freeze({__proto__:null,AdapterUtils:AdapterUtils,get BasicMaterialElement(){return Z},DragEvent:DragEvent,get KnownShader(){return S},get LambertMaterialElement(){return J},get LineMaterialElement(){return K},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 Ye},get Pacem3DWebgpuAdapterElement(){return Zt},get Pacem3DWgslScriptElement(){return Yt},get PacemBoxElement(){return ae},get PacemConeElement(){return ue},get PacemCylinderElement(){return de},get PacemDodecahedronElement(){return De},get PacemHexahedronElement(){return Le},get PacemIcosahedronElement(){return Te},get PacemLineElement(){return ye},get PacemOctahedronElement(){return Ue},get PacemOrbitCameraBehaviorElement(){return rr},get PacemPlaneElement(){return xe},get PacemSphereElement(){return Oe},get PacemTetrahedronElement(){return Ne},get PacemTorusElement(){return $e},get PhongMaterialElement(){return te},PolyhedronElement:PolyhedronElement,RenderableElement:RenderableElement,RenderableEvent:RenderableEvent,get StalePropertyFlag(){return h},get StandardMaterialElement(){return ie},UI3DEvent:UI3DEvent,Ui3DElement:Ui3DElement,computePlaneNormal:P,computeSharpVertexNormals:w,isBasicMaterial:I,isCamera:g,isGeometry:E,isGroup:C,isInteraction:M,isLambertMaterial:z,isLight:b,isLineMaterial:W,isMaterial:$,isMesh:x,isMeshGeometry:_,isOrthographicCamera:v,isPerspectiveCamera:y,isPhongMaterial:j,isRenderable:m,isShaderMaterial:H,isStage:d,isStandardMaterial:V,isUi3DObject:f}),nr=Object.freeze({__proto__:null,Drawing3D:ir}),sr=Object.freeze({__proto__:null,Components:nr,Drawing3D:X});e.DeepMerger.merge(sr)}(Pacem,Pacem,Pacem);
|