@xeokit/xeokit-sdk
Version:
3D BIM IFC Viewer SDK for AEC engineering applications. Open Source JavaScript Toolkit based on pure WebGL for top performance, real-world coordinates and full double precision
7 lines (6 loc) • 1.59 MB
JavaScript
/**
* xeokit-sdk v2.6.107
* Commit: a1558d52a694d6b8435eb85661f0d13b0a1a6fea
* Built: 2026-03-12T09:09:01.366Z
*/
"undefined"!=typeof window&&(window.__XEOKIT__={version:"2.6.107",commit:"a1558d52a694d6b8435eb85661f0d13b0a1a6fea",built:"2026-03-12T09:09:01.366Z"});class e{constructor(e,t){this.items=e||[],this._lastUniqueId=(t||0)+1}addItem(){let e;if(2===arguments.length){const t=arguments[0];if(e=arguments[1],this.items[t])throw"ID clash: '"+t+"'";return this.items[t]=e,t}for(e=arguments[0]||{};;){const t=this._lastUniqueId++;if(!this.items[t])return this.items[t]=e,t}}removeItem(e){const t=this.items[e];return delete this.items[e],t}}const t=new e;class i{constructor(e){this.id=e,this.parentItem=null,this.groups=[],this.menuElement=null,this.shown=!1,this.mouseOver=0}}class s{constructor(){this.items=[]}}class r{constructor(e,t,i,s,r){this.id=e,this.getTitle=t,this.doAction=i,this.getEnabled=s,this.getShown=r,this.itemElement=null,this.subMenu=null,this.enabled=!0}}class n{constructor(e={}){this._id=t.addItem(),this._context=null,this._enabled=!1,this._itemsCfg=[],this._rootMenu=null,this._menuList=[],this._menuMap={},this._itemList=[],this._itemMap={},this._shown=!1,this._nextId=0,this._parentNode=e.parentNode||document.body,this._offsetParent=this._parentNode instanceof ShadowRoot?this._parentNode.host:this._parentNode,this._eventSubs={},!1!==e.hideOnMouseDown&&(this._parentNode.addEventListener("mousedown",(e=>{e.target.classList.contains("xeokit-context-menu-item")||this.hide()})),this._parentNode.addEventListener("touchstart",this._canvasTouchStartHandler=e=>{e.target.classList.contains("xeokit-context-menu-item")||this.hide()})),e.items&&(this.items=e.items),this._hideOnAction=!1!==e.hideOnAction,this.context=e.context,this.enabled=!1!==e.enabled,this.hide()}on(e,t){let i=this._eventSubs[e];i||(i=[],this._eventSubs[e]=i),i.push(t)}fire(e,t){const i=this._eventSubs[e];if(i)for(let e=0,s=i.length;e<s;e++)i[e](t)}set items(e){this._clear(),this._itemsCfg=e||[],this._parseItems(e),this._createUI()}get items(){return this._itemsCfg}set enabled(e){(e=!!e)!==this._enabled&&(this._enabled=e,this._enabled||this.hide())}get enabled(){return this._enabled}set context(e){this._context=e}get context(){return this._context}show(e,t){this._context?this._enabled&&(this._shown||(this._hideAllMenus(),this._updateItemsTitles(),this._updateItemsEnabledStatus(),this._showMenu(this._rootMenu.id,e,t),this._updateSubMenuInfo(),this._shown=!0,this.fire("shown",{}))):console.error("ContextMenu cannot be shown without a context - set context first")}get shown(){return this._shown}hide(){this._enabled&&this._shown&&(this._hideAllMenus(),this._shown=!1,this.fire("hidden",{}))}destroy(){this._context=null,this._clear(),null!==this._id&&(t.removeItem(this._id),this._id=null)}_clear(){for(let e=0,t=this._menuList.length;e<t;e++){this._menuList[e].menuElement.remove()}this._itemsCfg=[],this._rootMenu=null,this._menuList=[],this._menuMap={},this._itemList=[],this._itemMap={}}_parseItems(e){const t=e=>{const n=this._getNextId(),A=new i(n);for(let i=0,n=e.length;i<n;i++){const n=e[i],o=new s;A.groups.push(o);for(let e=0,i=n.length;e<i;e++){const i=n[e],s=i.items,a=s&&s.length>0,l=this._getNextId(),c=i.getTitle||(()=>i.title||""),h=i.doAction||i.callback||(()=>{}),u=i.getEnabled||(()=>!0),d=i.getShown||(()=>!0),f=new r(l,c,h,u,d);if(f.parentMenu=A,o.items.push(f),a){const e=t(s);f.subMenu=e,e.parentItem=f}this._itemList.push(f),this._itemMap[f.id]=f}}return this._menuList.push(A),this._menuMap[A.id]=A,A};this._rootMenu=t(e)}_getNextId(){return"ContextMenu_"+this._id+"_"+this._nextId++}_createUI(){const e=t=>{this._createMenuUI(t);const i=t.groups;for(let t=0,s=i.length;t<s;t++){const s=i[t].items;for(let t=0,i=s.length;t<i;t++){const i=s[t].subMenu;i&&e(i)}}};e(this._rootMenu)}_createMenuUI(e){const t=e.groups,i=[],s=document.createElement("div");if(s.classList.add("xeokit-context-menu",e.id),s.style.zIndex=3e5,s.style.position="absolute",i.push("<ul>"),t)for(let e=0,s=t.length;e<s;e++){const r=e,n=s,A=t[e].items;if(A)for(let e=0,t=A.length;e<t;e++){const s=A[e],o=s.subMenu,a=s.title||"";o?(i.push('<li id="'+s.id+'" class="xeokit-context-menu-item xeokit-context-menu-submenu">'+a+"</li>"),r===n-1||e<t-1||i.push('<li id="'+s.id+'" class="xeokit-context-menu-item-separator"></li>')):(i.push('<li id="'+s.id+'" class="xeokit-context-menu-item">'+a+"</li>"),r===n-1||e<t-1||i.push('<li id="'+s.id+'" class="xeokit-context-menu-item-separator"></li>'))}}i.push("</ul>");const r=i.join("");s.innerHTML=r,this._parentNode.appendChild(s),e.menuElement=s,s.style["border-radius"]="4px",s.style.display="none",s.style["z-index"]=3e5,s.style.background="white",s.style.border="1px solid black",s.style["box-shadow"]="0 4px 5px 0 gray",s.oncontextmenu=e=>{e.preventDefault()};const n=this;let A=null;if(t)for(let e=0,i=t.length;e<i;e++){const i=t[e].items;if(i)for(let e=0,t=i.length;e<t;e++){const t=i[e],s=t.subMenu;t.itemElement=this._parentNode.querySelector(`#${t.id}`),t.itemElement?(t.itemElement.addEventListener("mouseenter",(e=>{e.preventDefault();const i=t.subMenu;if(!i)return void(A&&(n._hideMenu(A.id),A=null));if(A&&A.id!==i.id&&(n._hideMenu(A.id),A=null),!1===t.enabled)return;const s=t.itemElement,r=i.menuElement,o=s.getBoundingClientRect();r.getBoundingClientRect();const a=n._offsetParent.getBoundingClientRect(),l=200,c=o.right+l<a.right,h=o.left-l>a.left;if(c)n._showMenu(i.id,o.right+window.scrollX-5,o.top+window.scrollY-1);else if(h)n._showMenu(i.id,o.left-l+window.scrollX,o.top+window.scrollY-1);else{const e=o.left-a.left,t=a.right-o.right;t>e?n._showMenu(i.id,o.right-5-(l-t),o.top+window.scrollY-1):n._showMenu(i.id,o.left-e,o.top+window.scrollY-1)}A=i})),s||(t.itemElement.addEventListener("click",(e=>{e.preventDefault(),n._context&&!1!==t.enabled&&(t.doAction&&t.doAction(n._context),this._hideOnAction?n.hide():(n._updateItemsTitles(),n._updateItemsEnabledStatus()))})),t.itemElement.addEventListener("mouseup",(e=>{3===e.which&&(e.preventDefault(),n._context&&!1!==t.enabled&&(t.doAction&&t.doAction(n._context),this._hideOnAction?n.hide():(n._updateItemsTitles(),n._updateItemsEnabledStatus())))})),t.itemElement.addEventListener("mouseenter",(e=>{e.preventDefault(),!1!==t.enabled&&t.doHover&&t.doHover(n._context)})))):console.error("ContextMenu item element not found: "+t.id)}}}_updateItemsTitles(){if(this._context)for(let e=0,t=this._itemList.length;e<t;e++){const t=this._itemList[e],i=t.itemElement;if(!i)continue;const s=t.getShown;if(!s||!s(this._context))continue;const r=t.getTitle(this._context);t.subMenu,i.innerText=r}}_updateItemsEnabledStatus(){if(this._context)for(let e=0,t=this._itemList.length;e<t;e++){const t=this._itemList[e],i=t.itemElement;if(!i)continue;const s=t.getEnabled;if(!s)continue;const r=t.getShown;if(!r)continue;const n=r(this._context);if(t.shown=n,!n){i.style.display="none";continue}i.style.display="";const A=s(this._context);t.enabled=A,A?i.classList.remove("disabled"):i.classList.add("disabled")}}_updateSubMenuInfo(){if(!this._context)return;let e,t,i,s,r,n;this._itemList.forEach((A=>{A.subMenu&&(e=A.itemElement,t=e.getBoundingClientRect(),i=A.subMenu.menuElement,s={visibility:i.style.visibility,display:i.style.display},i.style.display="block",i.style.visibility="hidden",n=A.subMenu.menuElement.getBoundingClientRect().width,i.style.visibility=s.visibility,i.style.display=s.display,r=t.right+n>window.innerWidth,e.setAttribute("data-submenuposition",r?"left":"right"))}))}_showMenu(e,t,i){const s=this._menuMap[e];if(!s)return void console.error("Menu not found: "+e);if(s.shown)return;const r=s.menuElement;r&&(this._showMenuElement(r,t,i),s.shown=!0)}_hideMenu(e){const t=this._menuMap[e];if(!t)return void console.error("Menu not found: "+e);if(!t.shown)return;const i=t.menuElement;i&&(this._hideMenuElement(i),t.shown=!1)}_hideAllMenus(){for(let e=0,t=this._menuList.length;e<t;e++){const t=this._menuList[e];this._hideMenu(t.id)}}_showMenuElement(e,t,i){e.style.display="block";const s=e.offsetHeight,r=e.offsetWidth,n=this._offsetParent.getBoundingClientRect(),A=this._offsetParent===window.document.body&&0===n.bottom?window.innerHeight:n.bottom+window.scrollY,o=n.right+window.scrollX;i+s>A&&(i=A-s),t+r>o&&(t=o-r),e.style.left=t-n.left-window.scrollX+"px",e.style.top=i-n.top-window.scrollY+"px"}_hideMenuElement(e){e.style.display="none"}}class A{constructor(e,t={}){this.viewer=e,this.scene=this.viewer.scene,this._lensCursorDiv=document.createElement("div"),this._lensParams={canvasSize:300,cursorBorder:2,cursorSize:10},this._lensCursorDiv.style.borderRadius="50%",this._lensCursorDiv.style.width=this._lensParams.cursorSize+"px",this._lensCursorDiv.style.height=this._lensParams.cursorSize+"px",this._lensCursorDiv.style.zIndex="100000",this._lensCursorDiv.style.position="absolute",this._lensCursorDiv.style.pointerEvents="none",this._lensContainer=document.createElement("div"),this._lensContainerId=t.containerId||"xeokit-lens",this._lensContainer.setAttribute("id",this._lensContainerId),this._lensContainer.style.border="1px solid black",this._lensContainer.style.background="white",this._lensContainer.style.borderRadius="50%",this._lensContainer.style.width=this._lensParams.canvasSize+"px",this._lensContainer.style.height=this._lensParams.canvasSize+"px",this._lensContainer.style.zIndex="15000",this._lensContainer.style.position="absolute",this._lensContainer.style.pointerEvents="none",this._lensContainer.style.visibility="hidden",this._lensCanvas=document.createElement("canvas"),this._lensCanvas.id=`${this._lensContainerId}-canvas`,this._lensCanvas.style.borderRadius="50%",this._lensCanvas.style.width=this._lensParams.canvasSize+"px",this._lensCanvas.style.height=this._lensParams.canvasSize+"px",this._lensCanvas.style.zIndex="15000",this._lensCanvas.style.pointerEvents="none",document.body.appendChild(this._lensContainer),this._lensContainer.appendChild(this._lensCanvas),this._lensContainer.appendChild(this._lensCursorDiv),this._lensCanvasContext=this._lensCanvas.getContext("2d"),this._canvasElement=this.viewer.scene.canvas.canvas,this._canvasPos=null,this._snappedCanvasPos=null,this._lensPosToggle=t.lensPosToggle||!0,this._lensPosToggleAmount=t.lensPosToggleAmount||85,this._lensPosMarginLeft=t.lensPosMarginLeft||85,this._lensPosMarginTop=t.lensPosMarginTop||25,this._lensContainer.style.marginTop=`${this._lensPosMarginTop}px`,this._lensContainer.style.marginLeft=`${this._lensPosMarginLeft}px`,this._zoomLevel=t.zoomLevel||2,this._active=!1!==t.active,this._visible=!1,this.snapped=!1,this._onViewerRendering=this.viewer.scene.on("rendering",(()=>{this._active&&this._visible&&this.update()}))}update(){if(!this._active||!this._visible)return;if(!this._canvasPos)return;const e=this._lensContainer.getBoundingClientRect(),t=this._canvasElement.getBoundingClientRect(),i=this._canvasPos[0]<e.right&&this._canvasPos[0]>e.left&&this._canvasPos[1]<e.bottom&&this._canvasPos[1]>e.top;this._lensContainer.style.marginLeft=`${this._lensPosMarginLeft}px`,i&&(this._lensPosToggle?this._lensContainer.style.marginTop=t.bottom-t.top-this._lensCanvas.height-this._lensPosToggleAmount+"px":this._lensContainer.style.marginTop=`${this._lensPosMarginTop}px`,this._lensPosToggle=!this._lensPosToggle),this._lensCanvasContext.clearRect(0,0,this._lensCanvas.width,this._lensCanvas.height);const s=Math.max(this._lensCanvas.width,this._lensCanvas.height)/this._zoomLevel;this._lensCanvasContext.drawImage(this._canvasElement,this._canvasPos[0]-s/2,this._canvasPos[1]-s/2,s,s,0,0,this._lensCanvas.width,this._lensCanvas.height);const r=this._lensParams.canvasSize/2-this._lensParams.cursorSize/2-this._lensParams.cursorBorder,n=this._snappedCanvasPos?this._snappedCanvasPos[0]-this._canvasPos[0]:0,A=this._snappedCanvasPos?this._snappedCanvasPos[1]-this._canvasPos[1]:0;this._lensCursorDiv.style.left=`${r+n*this._zoomLevel}px`,this._lensCursorDiv.style.top=`${r+A*this._zoomLevel}px`}set zoomFactor(e){this._zoomFactor=e,this.update()}get zoomFactor(){return this._zoomFactor}set canvasPos(e){this._canvasPos=e,this.update()}get canvasPos(){return this._canvasPos}set snappedCanvasPos(e){this._snappedCanvasPos=e,this.update()}get snappedCanvasPos(){return this._snappedCanvasPos}set snapped(e){this._snapped=e;const[t,i]=e?["greenyellow","green"]:["pink","red"];this._lensCursorDiv.style.background=t,this._lensCursorDiv.style.border=this._lensParams.cursorBorder+"px solid "+i}get snapped(){return this._snapped}_updateActiveVisible(){this._lensContainer.style.visibility=this._active&&this._visible?"visible":"hidden",this.update()}set active(e){this._active=e,this._updateActiveVisible()}get active(){return this._active}set visible(e){this._visible=e,this._updateActiveVisible()}get visible(){return this._visible}destroy(){this._destroyed||(this.viewer.scene.off(this._onViewerRendering),this._lensContainer.removeChild(this._lensCanvas),document.body.removeChild(this._lensContainer),this._destroyed=!0)}}function o(e,t,i=2){const s=t&&t.length,r=s?t[0]*i:e.length;let n=a(e,0,r,i,!0);const A=[];if(!n||n.next===n.prev)return A;let o,l,h;if(s&&(n=function(e,t,i,s){const r=[];for(let i=0,n=t.length;i<n;i++){const A=a(e,t[i]*s,i<n-1?t[i+1]*s:e.length,s,!1);A===A.next&&(A.steiner=!0),r.push(b(A))}r.sort(p);for(let e=0;e<r.length;e++)i=g(r[e],i);return i}(e,t,n,i)),e.length>80*i){o=1/0,l=1/0;let t=-1/0,s=-1/0;for(let n=i;n<r;n+=i){const i=e[n],r=e[n+1];i<o&&(o=i),r<l&&(l=r),i>t&&(t=i),r>s&&(s=r)}h=Math.max(t-o,s-l),h=0!==h?32767/h:0}return c(n,A,i,o,l,h,0),A}function a(e,t,i,s,r){let n;if(r===function(e,t,i,s){let r=0;for(let n=t,A=i-s;n<i;n+=s)r+=(e[A]-e[n])*(e[n+1]+e[A+1]),A=n;return r}(e,t,i,s)>0)for(let r=t;r<i;r+=s)n=I(r/s|0,e[r],e[r+1],n);else for(let r=i-s;r>=t;r-=s)n=I(r/s|0,e[r],e[r+1],n);return n&&C(n,n.next)&&(T(n),n=n.next),n}function l(e,t){if(!e)return e;t||(t=e);let i,s=e;do{if(i=!1,s.steiner||!C(s,s.next)&&0!==v(s.prev,s,s.next))s=s.next;else{if(T(s),s=t=s.prev,s===s.next)break;i=!0}}while(i||s!==t);return t}function c(e,t,i,s,r,n,A){if(!e)return;!A&&n&&function(e,t,i,s){let r=e;do{0===r.z&&(r.z=_(r.x,r.y,t,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){let t,i=1;do{let s,r=e;e=null;let n=null;for(t=0;r;){t++;let A=r,o=0;for(let e=0;e<i&&(o++,A=A.nextZ,A);e++);let a=i;for(;o>0||a>0&&A;)0!==o&&(0===a||!A||r.z<=A.z)?(s=r,r=r.nextZ,o--):(s=A,A=A.nextZ,a--),n?n.nextZ=s:e=s,s.prevZ=n,n=s;r=A}n.nextZ=null,i*=2}while(t>1)}(r)}(e,s,r,n);let o=e;for(;e.prev!==e.next;){const a=e.prev,p=e.next;if(n?u(e,s,r,n):h(e))t.push(a.i,e.i,p.i),T(e),e=p.next,o=p.next;else if((e=p)===o){A?1===A?c(e=d(l(e),t),t,i,s,r,n,2):2===A&&f(e,t,i,s,r,n):c(l(e),t,i,s,r,n,1);break}}}function h(e){const t=e.prev,i=e,s=e.next;if(v(t,i,s)>=0)return!1;const r=t.x,n=i.x,A=s.x,o=t.y,a=i.y,l=s.y,c=Math.min(r,n,A),h=Math.min(o,a,l),u=Math.max(r,n,A),d=Math.max(o,a,l);let f=s.next;for(;f!==t;){if(f.x>=c&&f.x<=u&&f.y>=h&&f.y<=d&&B(r,o,n,a,A,l,f.x,f.y)&&v(f.prev,f,f.next)>=0)return!1;f=f.next}return!0}function u(e,t,i,s){const r=e.prev,n=e,A=e.next;if(v(r,n,A)>=0)return!1;const o=r.x,a=n.x,l=A.x,c=r.y,h=n.y,u=A.y,d=Math.min(o,a,l),f=Math.min(c,h,u),p=Math.max(o,a,l),g=Math.max(c,h,u),m=_(d,f,t,i,s),b=_(p,g,t,i,s);let y=e.prevZ,w=e.nextZ;for(;y&&y.z>=m&&w&&w.z<=b;){if(y.x>=d&&y.x<=p&&y.y>=f&&y.y<=g&&y!==r&&y!==A&&B(o,c,a,h,l,u,y.x,y.y)&&v(y.prev,y,y.next)>=0)return!1;if(y=y.prevZ,w.x>=d&&w.x<=p&&w.y>=f&&w.y<=g&&w!==r&&w!==A&&B(o,c,a,h,l,u,w.x,w.y)&&v(w.prev,w,w.next)>=0)return!1;w=w.nextZ}for(;y&&y.z>=m;){if(y.x>=d&&y.x<=p&&y.y>=f&&y.y<=g&&y!==r&&y!==A&&B(o,c,a,h,l,u,y.x,y.y)&&v(y.prev,y,y.next)>=0)return!1;y=y.prevZ}for(;w&&w.z<=b;){if(w.x>=d&&w.x<=p&&w.y>=f&&w.y<=g&&w!==r&&w!==A&&B(o,c,a,h,l,u,w.x,w.y)&&v(w.prev,w,w.next)>=0)return!1;w=w.nextZ}return!0}function d(e,t){let i=e;do{const s=i.prev,r=i.next.next;!C(s,r)&&M(s,i,i.next,r)&&U(s,r)&&U(r,s)&&(t.push(s.i,i.i,r.i),T(i),T(i.next),i=e=r),i=i.next}while(i!==e);return l(i)}function f(e,t,i,s,r,n){let A=e;do{let e=A.next.next;for(;e!==A.prev;){if(A.i!==e.i&&w(A,e)){let o=x(A,e);return A=l(A,A.next),o=l(o,o.next),c(A,t,i,s,r,n,0),void c(o,t,i,s,r,n,0)}e=e.next}A=A.next}while(A!==e)}function p(e,t){let i=e.x-t.x;if(0===i&&(i=e.y-t.y,0===i)){i=(e.next.y-e.y)/(e.next.x-e.x)-(t.next.y-t.y)/(t.next.x-t.x)}return i}function g(e,t){const i=function(e,t){let i=t;const s=e.x,r=e.y;let n,A=-1/0;if(C(e,i))return i;do{if(C(e,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const e=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(e<=s&&e>A&&(A=e,n=i.x<i.next.x?i:i.next,e===s))return n}i=i.next}while(i!==t);if(!n)return null;const o=n,a=n.x,l=n.y;let c=1/0;i=n;do{if(s>=i.x&&i.x>=a&&s!==i.x&&y(r<l?s:A,r,a,l,r<l?A:s,r,i.x,i.y)){const t=Math.abs(r-i.y)/(s-i.x);U(i,e)&&(t<c||t===c&&(i.x>n.x||i.x===n.x&&m(n,i)))&&(n=i,c=t)}i=i.next}while(i!==o);return n}(e,t);if(!i)return t;const s=x(i,e);return l(s,s.next),l(i,i.next)}function m(e,t){return v(e.prev,e,t.prev)<0&&v(t.next,e,e.next)<0}function _(e,t,i,s,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-i)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-s)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function b(e){let t=e,i=e;do{(t.x<i.x||t.x===i.x&&t.y<i.y)&&(i=t),t=t.next}while(t!==e);return i}function y(e,t,i,s,r,n,A,o){return(r-A)*(t-o)>=(e-A)*(n-o)&&(e-A)*(s-o)>=(i-A)*(t-o)&&(i-A)*(n-o)>=(r-A)*(s-o)}function B(e,t,i,s,r,n,A,o){return!(e===A&&t===o)&&y(e,t,i,s,r,n,A,o)}function w(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){let i=e;do{if(i.i!==e.i&&i.next.i!==e.i&&i.i!==t.i&&i.next.i!==t.i&&M(i,i.next,e,t))return!0;i=i.next}while(i!==e);return!1}(e,t)&&(U(e,t)&&U(t,e)&&function(e,t){let i=e,s=!1;const r=(e.x+t.x)/2,n=(e.y+t.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==e);return s}(e,t)&&(v(e.prev,e,t.prev)||v(e,t.prev,t))||C(e,t)&&v(e.prev,e,e.next)>0&&v(t.prev,t,t.next)>0)}function v(e,t,i){return(t.y-e.y)*(i.x-t.x)-(t.x-e.x)*(i.y-t.y)}function C(e,t){return e.x===t.x&&e.y===t.y}function M(e,t,i,s){const r=F(v(e,t,i)),n=F(v(e,t,s)),A=F(v(i,s,e)),o=F(v(i,s,t));return r!==n&&A!==o||(!(0!==r||!E(e,i,t))||(!(0!==n||!E(e,s,t))||(!(0!==A||!E(i,e,s))||!(0!==o||!E(i,t,s)))))}function E(e,t,i){return t.x<=Math.max(e.x,i.x)&&t.x>=Math.min(e.x,i.x)&&t.y<=Math.max(e.y,i.y)&&t.y>=Math.min(e.y,i.y)}function F(e){return e>0?1:e<0?-1:0}function U(e,t){return v(e.prev,e,e.next)<0?v(e,t,e.next)>=0&&v(e,e.prev,t)>=0:v(e,t,e.prev)<0||v(e,e.next,t)<0}function x(e,t){const i=P(e.i,e.x,e.y),s=P(t.i,t.x,t.y),r=e.next,n=t.prev;return e.next=t,t.prev=e,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function I(e,t,i,s){const r=P(e,t,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function T(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function P(e,t,i){return{i:e,x:t,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}let S=!0,D=S?Float64Array:Float32Array;const k=new D(3),Q=new D(16),R=new D(16),O=new D(4),V={setDoublePrecisionEnabled(e){S=e,D=S?Float64Array:Float32Array},getDoublePrecisionEnabled:()=>S,MIN_DOUBLE:-Number.MAX_SAFE_INTEGER,MAX_DOUBLE:Number.MAX_SAFE_INTEGER,MAX_INT:1e7,DEGTORAD:.0174532925,RADTODEG:57.295779513,unglobalizeObjectId(e,t){const i=t.indexOf("#");return i===e.length&&t.startsWith(e)?t.substring(i+1):t},globalizeObjectId:(e,t)=>e+"#"+t,safeInv(e){const t=1/e;return isNaN(t)||!isFinite(t)?1:t},vec2:e=>new D(e||2),vec3:e=>new D(e||3),vec4:e=>new D(e||4),mat3:e=>new D(e||9),mat3ToMat4:(e,t=new D(16))=>(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=0,t[4]=e[3],t[5]=e[4],t[6]=e[5],t[7]=0,t[8]=e[6],t[9]=e[7],t[10]=e[8],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t),mat4:e=>new D(e||16),mat4ToMat3:(e,t=new D(9))=>(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t),doublesToFloats(e,t,i){const s=new D(2);for(let r=0,n=e.length;r<n;r++)V.splitDouble(e[r],s),t[r]=s[0],i[r]=s[1]},splitDouble(e,t){const i=D.from([e])[0],s=e-i;t[0]=i,t[1]=s},createUUID:(()=>{const e=[];for(let t=0;t<256;t++)e[t]=(t<16?"0":"")+t.toString(16);return()=>{const t=4294967295*Math.random()|0,i=4294967295*Math.random()|0,s=4294967295*Math.random()|0,r=4294967295*Math.random()|0;return`${e[255&t]+e[t>>8&255]+e[t>>16&255]+e[t>>24&255]}-${e[255&i]}${e[i>>8&255]}-${e[i>>16&15|64]}${e[i>>24&255]}-${e[63&s|128]}${e[s>>8&255]}-${e[s>>16&255]}${e[s>>24&255]}${e[255&r]}${e[r>>8&255]}${e[r>>16&255]}${e[r>>24&255]}`}})(),clamp:(e,t,i)=>Math.max(t,Math.min(i,e)),fmod(e,t){if(e<t)return console.error("math.fmod : Attempting to find modulus within negative range - would be infinite loop - ignoring"),e;for(;t<=e;)e-=t;return e},compareVec2:(e,t)=>e[0]===t[0]&&e[1]===t[1],compareVec3:(e,t)=>e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2],compareVec4:(e,t)=>e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3],negateVec3:(e,t)=>(t||(t=e),t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t),negateVec4:(e,t)=>(t||(t=e),t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t),addVec4:(e,t,i)=>(i||(i=e),i[0]=e[0]+t[0],i[1]=e[1]+t[1],i[2]=e[2]+t[2],i[3]=e[3]+t[3],i),addVec4Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]+t,i[1]=e[1]+t,i[2]=e[2]+t,i[3]=e[3]+t,i),addVec2:(e,t,i)=>(i||(i=e),i[0]=e[0]+t[0],i[1]=e[1]+t[1],i),addVec3:(e,t,i)=>(i||(i=e),i[0]=e[0]+t[0],i[1]=e[1]+t[1],i[2]=e[2]+t[2],i),addVec3Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]+t,i[1]=e[1]+t,i[2]=e[2]+t,i),subVec4:(e,t,i)=>(i||(i=e),i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],i[3]=e[3]-t[3],i),subVec3:(e,t,i)=>(i||(i=e),i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],i),subVec2:(e,t,i)=>(i||(i=e),i[0]=e[0]-t[0],i[1]=e[1]-t[1],i),geometricMeanVec2(...e){const t=new D(e[0]);for(let i=1;i<e.length;i++)t[0]+=e[i][0],t[1]+=e[i][1];return t[0]/=e.length,t[1]/=e.length,t},subVec4Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]-t,i[1]=e[1]-t,i[2]=e[2]-t,i[3]=e[3]-t,i),subScalarVec4:(e,t,i)=>(i||(i=e),i[0]=t-e[0],i[1]=t-e[1],i[2]=t-e[2],i[3]=t-e[3],i),mulVec2:(e,t,i)=>(i||(i=e),i[0]=e[0]*t[0],i[1]=e[1]*t[1],i),mulVec3:(e,t,i)=>(i||(i=e),i[0]=e[0]*t[0],i[1]=e[1]*t[1],i[2]=e[2]*t[2],i),mulVec4:(e,t,i)=>(i||(i=e),i[0]=e[0]*t[0],i[1]=e[1]*t[1],i[2]=e[2]*t[2],i[3]=e[3]*t[3],i),mulVec4Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]*t,i[1]=e[1]*t,i[2]=e[2]*t,i[3]=e[3]*t,i),mulVec3Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]*t,i[1]=e[1]*t,i[2]=e[2]*t,i),mulVec2Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]*t,i[1]=e[1]*t,i),divVec3:(e,t,i)=>(i||(i=e),i[0]=e[0]/t[0],i[1]=e[1]/t[1],i[2]=e[2]/t[2],i),divVec4:(e,t,i)=>(i||(i=e),i[0]=e[0]/t[0],i[1]=e[1]/t[1],i[2]=e[2]/t[2],i[3]=e[3]/t[3],i),divScalarVec3:(e,t,i)=>(i||(i=t),i[0]=e/t[0],i[1]=e/t[1],i[2]=e/t[2],i),divVec3Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]/t,i[1]=e[1]/t,i[2]=e[2]/t,i),divVec4Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]/t,i[1]=e[1]/t,i[2]=e[2]/t,i[3]=e[3]/t,i),divScalarVec4:(e,t,i)=>(i||(i=t),i[0]=e/t[0],i[1]=e/t[1],i[2]=e/t[2],i[3]=e/t[3],i),dotVec4:(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],cross3Vec4(e,t){const i=e[0],s=e[1],r=e[2],n=t[0],A=t[1],o=t[2];return[s*o-r*A,r*n-i*o,i*A-s*n,0]},cross3Vec3(e,t,i){i||(i=e);const s=e[0],r=e[1],n=e[2],A=t[0],o=t[1],a=t[2];return i[0]=r*a-n*o,i[1]=n*A-s*a,i[2]=s*o-r*A,i},sqLenVec4:e=>V.dotVec4(e,e),lenVec4:e=>Math.sqrt(V.sqLenVec4(e)),dotVec3:(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],dotVec2:(e,t)=>e[0]*t[0]+e[1]*t[1],sqLenVec3:e=>V.dotVec3(e,e),sqLenVec2:e=>V.dotVec2(e,e),lenVec3:e=>Math.sqrt(V.sqLenVec3(e)),distVec3:(()=>{const e=new D(3);return(t,i)=>V.lenVec3(V.subVec3(t,i,e))})(),lenVec2:e=>Math.sqrt(V.sqLenVec2(e)),distVec2:(()=>{const e=new D(2);return(t,i)=>V.lenVec2(V.subVec2(t,i,e))})(),rcpVec3:(e,t)=>V.divScalarVec3(1,e,t),normalizeVec4(e,t){const i=1/V.lenVec4(e);return V.mulVec4Scalar(e,i,t)},normalizeVec3(e,t){const i=1/V.lenVec3(e);return V.mulVec3Scalar(e,i,t)},normalizeVec2(e,t){const i=1/V.lenVec2(e);return V.mulVec2Scalar(e,i,t)},angleVec3(e,t){let i=V.dotVec3(e,t)/Math.sqrt(V.sqLenVec3(e)*V.sqLenVec3(t));return i=i<-1?-1:i>1?1:i,Math.acos(i)},vec3FromMat4Scale:(()=>{const e=new D(3);return(t,i)=>(e[0]=t[0],e[1]=t[1],e[2]=t[2],i[0]=V.lenVec3(e),e[0]=t[4],e[1]=t[5],e[2]=t[6],i[1]=V.lenVec3(e),e[0]=t[8],e[1]=t[9],e[2]=t[10],i[2]=V.lenVec3(e),i)})(),vecToArray:(()=>{function e(e){return Math.round(1e5*e)/1e5}return t=>{for(let i=0,s=(t=Array.prototype.slice.call(t)).length;i<s;i++)t[i]=e(t[i]);return t}})(),xyzArrayToObject:e=>({x:e[0],y:e[1],z:e[2]}),xyzObjectToArray:(e,t)=>((t=t||V.vec3())[0]=e.x,t[1]=e.y,t[2]=e.z,t),dupMat4:e=>e.slice(0,16),mat4To3:e=>[e[0],e[1],e[2],e[4],e[5],e[6],e[8],e[9],e[10]],m4s:e=>[e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e],setMat4ToZeroes:()=>V.m4s(0),setMat4ToOnes:()=>V.m4s(1),diagonalMat4v:e=>new D([e[0],0,0,0,0,e[1],0,0,0,0,e[2],0,0,0,0,e[3]]),diagonalMat4c:(e,t,i,s)=>V.diagonalMat4v([e,t,i,s]),diagonalMat4s:e=>V.diagonalMat4c(e,e,e,e),identityMat4:(e=new D(16))=>(e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e),identityMat3:(e=new D(9))=>(e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e),isIdentityMat4:e=>1===e[0]&&0===e[1]&&0===e[2]&&0===e[3]&&0===e[4]&&1===e[5]&&0===e[6]&&0===e[7]&&0===e[8]&&0===e[9]&&1===e[10]&&0===e[11]&&0===e[12]&&0===e[13]&&0===e[14]&&1===e[15],negateMat4:(e,t)=>(t||(t=e),t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t[4]=-e[4],t[5]=-e[5],t[6]=-e[6],t[7]=-e[7],t[8]=-e[8],t[9]=-e[9],t[10]=-e[10],t[11]=-e[11],t[12]=-e[12],t[13]=-e[13],t[14]=-e[14],t[15]=-e[15],t),addMat4:(e,t,i)=>(i||(i=e),i[0]=e[0]+t[0],i[1]=e[1]+t[1],i[2]=e[2]+t[2],i[3]=e[3]+t[3],i[4]=e[4]+t[4],i[5]=e[5]+t[5],i[6]=e[6]+t[6],i[7]=e[7]+t[7],i[8]=e[8]+t[8],i[9]=e[9]+t[9],i[10]=e[10]+t[10],i[11]=e[11]+t[11],i[12]=e[12]+t[12],i[13]=e[13]+t[13],i[14]=e[14]+t[14],i[15]=e[15]+t[15],i),addMat4Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]+t,i[1]=e[1]+t,i[2]=e[2]+t,i[3]=e[3]+t,i[4]=e[4]+t,i[5]=e[5]+t,i[6]=e[6]+t,i[7]=e[7]+t,i[8]=e[8]+t,i[9]=e[9]+t,i[10]=e[10]+t,i[11]=e[11]+t,i[12]=e[12]+t,i[13]=e[13]+t,i[14]=e[14]+t,i[15]=e[15]+t,i),addScalarMat4:(e,t,i)=>V.addMat4Scalar(t,e,i),subMat4:(e,t,i)=>(i||(i=e),i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],i[3]=e[3]-t[3],i[4]=e[4]-t[4],i[5]=e[5]-t[5],i[6]=e[6]-t[6],i[7]=e[7]-t[7],i[8]=e[8]-t[8],i[9]=e[9]-t[9],i[10]=e[10]-t[10],i[11]=e[11]-t[11],i[12]=e[12]-t[12],i[13]=e[13]-t[13],i[14]=e[14]-t[14],i[15]=e[15]-t[15],i),subMat4Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]-t,i[1]=e[1]-t,i[2]=e[2]-t,i[3]=e[3]-t,i[4]=e[4]-t,i[5]=e[5]-t,i[6]=e[6]-t,i[7]=e[7]-t,i[8]=e[8]-t,i[9]=e[9]-t,i[10]=e[10]-t,i[11]=e[11]-t,i[12]=e[12]-t,i[13]=e[13]-t,i[14]=e[14]-t,i[15]=e[15]-t,i),subScalarMat4:(e,t,i)=>(i||(i=t),i[0]=e-t[0],i[1]=e-t[1],i[2]=e-t[2],i[3]=e-t[3],i[4]=e-t[4],i[5]=e-t[5],i[6]=e-t[6],i[7]=e-t[7],i[8]=e-t[8],i[9]=e-t[9],i[10]=e-t[10],i[11]=e-t[11],i[12]=e-t[12],i[13]=e-t[13],i[14]=e-t[14],i[15]=e-t[15],i),mulMat4(e,t,i){i||(i=e);const s=e[0],r=e[1],n=e[2],A=e[3],o=e[4],a=e[5],l=e[6],c=e[7],h=e[8],u=e[9],d=e[10],f=e[11],p=e[12],g=e[13],m=e[14],_=e[15],b=t[0],y=t[1],B=t[2],w=t[3],v=t[4],C=t[5],M=t[6],E=t[7],F=t[8],U=t[9],x=t[10],I=t[11],T=t[12],P=t[13],S=t[14],D=t[15];return i[0]=b*s+y*o+B*h+w*p,i[1]=b*r+y*a+B*u+w*g,i[2]=b*n+y*l+B*d+w*m,i[3]=b*A+y*c+B*f+w*_,i[4]=v*s+C*o+M*h+E*p,i[5]=v*r+C*a+M*u+E*g,i[6]=v*n+C*l+M*d+E*m,i[7]=v*A+C*c+M*f+E*_,i[8]=F*s+U*o+x*h+I*p,i[9]=F*r+U*a+x*u+I*g,i[10]=F*n+U*l+x*d+I*m,i[11]=F*A+U*c+x*f+I*_,i[12]=T*s+P*o+S*h+D*p,i[13]=T*r+P*a+S*u+D*g,i[14]=T*n+P*l+S*d+D*m,i[15]=T*A+P*c+S*f+D*_,i},mulMat3(e,t,i){i||(i=new D(9));const s=e[0],r=e[3],n=e[6],A=e[1],o=e[4],a=e[7],l=e[2],c=e[5],h=e[8],u=t[0],d=t[3],f=t[6],p=t[1],g=t[4],m=t[7],_=t[2],b=t[5],y=t[8];return i[0]=s*u+r*p+n*_,i[3]=s*d+r*g+n*b,i[6]=s*f+r*m+n*y,i[1]=A*u+o*p+a*_,i[4]=A*d+o*g+a*b,i[7]=A*f+o*m+a*y,i[2]=l*u+c*p+h*_,i[5]=l*d+c*g+h*b,i[8]=l*f+c*m+h*y,i},mulMat4Scalar:(e,t,i)=>(i||(i=e),i[0]=e[0]*t,i[1]=e[1]*t,i[2]=e[2]*t,i[3]=e[3]*t,i[4]=e[4]*t,i[5]=e[5]*t,i[6]=e[6]*t,i[7]=e[7]*t,i[8]=e[8]*t,i[9]=e[9]*t,i[10]=e[10]*t,i[11]=e[11]*t,i[12]=e[12]*t,i[13]=e[13]*t,i[14]=e[14]*t,i[15]=e[15]*t,i),mulMat4v4(e,t,i=V.vec4()){const s=t[0],r=t[1],n=t[2],A=t[3];return i[0]=e[0]*s+e[4]*r+e[8]*n+e[12]*A,i[1]=e[1]*s+e[5]*r+e[9]*n+e[13]*A,i[2]=e[2]*s+e[6]*r+e[10]*n+e[14]*A,i[3]=e[3]*s+e[7]*r+e[11]*n+e[15]*A,i},transposeMat4(e,t){const i=e[4],s=e[14],r=e[8],n=e[13],A=e[12],o=e[9];if(!t||e===t){const t=e[1],a=e[2],l=e[3],c=e[6],h=e[7],u=e[11];return e[1]=i,e[2]=r,e[3]=A,e[4]=t,e[6]=o,e[7]=n,e[8]=a,e[9]=c,e[11]=s,e[12]=l,e[13]=h,e[14]=u,e}return t[0]=e[0],t[1]=i,t[2]=r,t[3]=A,t[4]=e[1],t[5]=e[5],t[6]=o,t[7]=n,t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=s,t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15],t},transposeMat3(e,t){if(t===e){const i=e[1],s=e[2],r=e[5];t[1]=e[3],t[2]=e[6],t[3]=i,t[5]=e[7],t[6]=s,t[7]=r}else t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8];return t},determinantMat4(e){const t=e[0],i=e[1],s=e[2],r=e[3],n=e[4],A=e[5],o=e[6],a=e[7],l=e[8],c=e[9],h=e[10],u=e[11],d=e[12],f=e[13],p=e[14],g=e[15];return d*c*o*r-l*f*o*r-d*A*h*r+n*f*h*r+l*A*p*r-n*c*p*r-d*c*s*a+l*f*s*a+d*i*h*a-t*f*h*a-l*i*p*a+t*c*p*a+d*A*s*u-n*f*s*u-d*i*o*u+t*f*o*u+n*i*p*u-t*A*p*u-l*A*s*g+n*c*s*g+l*i*o*g-t*c*o*g-n*i*h*g+t*A*h*g},inverseMat4(e,t){t||(t=e);const i=e[0],s=e[1],r=e[2],n=e[3],A=e[4],o=e[5],a=e[6],l=e[7],c=e[8],h=e[9],u=e[10],d=e[11],f=e[12],p=e[13],g=e[14],m=e[15],_=i*o-s*A,b=i*a-r*A,y=i*l-n*A,B=s*a-r*o,w=s*l-n*o,v=r*l-n*a,C=c*p-h*f,M=c*g-u*f,E=c*m-d*f,F=h*g-u*p,U=h*m-d*p,x=u*m-d*g,I=1/(_*x-b*U+y*F+B*E-w*M+v*C);return t[0]=(o*x-a*U+l*F)*I,t[1]=(-s*x+r*U-n*F)*I,t[2]=(p*v-g*w+m*B)*I,t[3]=(-h*v+u*w-d*B)*I,t[4]=(-A*x+a*E-l*M)*I,t[5]=(i*x-r*E+n*M)*I,t[6]=(-f*v+g*y-m*b)*I,t[7]=(c*v-u*y+d*b)*I,t[8]=(A*U-o*E+l*C)*I,t[9]=(-i*U+s*E-n*C)*I,t[10]=(f*w-p*y+m*_)*I,t[11]=(-c*w+h*y-d*_)*I,t[12]=(-A*F+o*M-a*C)*I,t[13]=(i*F-s*M+r*C)*I,t[14]=(-f*B+p*b-g*_)*I,t[15]=(c*B-h*b+u*_)*I,t},traceMat4:e=>e[0]+e[5]+e[10]+e[15],translationMat4v(e,t){const i=t||V.identityMat4();return i[12]=e[0],i[13]=e[1],i[14]=e[2],i},translationMat3v(e,t){const i=t||V.identityMat3();return i[6]=e[0],i[7]=e[1],i},translationMat4c:(()=>{const e=new D(3);return(t,i,s,r)=>(e[0]=t,e[1]=i,e[2]=s,V.translationMat4v(e,r))})(),translationMat4s:(e,t)=>V.translationMat4c(e,e,e,t),translateMat4v:(e,t)=>V.translateMat4c(e[0],e[1],e[2],t),translateMat4c(e,t,i,s){const r=s[3];s[0]+=r*e,s[1]+=r*t,s[2]+=r*i;const n=s[7];s[4]+=n*e,s[5]+=n*t,s[6]+=n*i;const A=s[11];s[8]+=A*e,s[9]+=A*t,s[10]+=A*i;const o=s[15];return s[12]+=o*e,s[13]+=o*t,s[14]+=o*i,s},setMat4Translation:(e,t,i)=>(i[0]=e[0],i[1]=e[1],i[2]=e[2],i[3]=e[3],i[4]=e[4],i[5]=e[5],i[6]=e[6],i[7]=e[7],i[8]=e[8],i[9]=e[9],i[10]=e[10],i[11]=e[11],i[12]=t[0],i[13]=t[1],i[14]=t[2],i[15]=e[15],i),rotationMat4v(e,t,i){const s=V.normalizeVec4([t[0],t[1],t[2],0],[]),r=Math.sin(e),n=Math.cos(e),A=1-n,o=s[0],a=s[1],l=s[2];let c,h,u,d,f,p;return c=o*a,h=a*l,u=l*o,d=o*r,f=a*r,p=l*r,(i=i||V.mat4())[0]=A*o*o+n,i[1]=A*c+p,i[2]=A*u-f,i[3]=0,i[4]=A*c-p,i[5]=A*a*a+n,i[6]=A*h+d,i[7]=0,i[8]=A*u+f,i[9]=A*h-d,i[10]=A*l*l+n,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i},rotationMat4c:(e,t,i,s,r)=>V.rotationMat4v(e,[t,i,s],r),scalingMat4v:(e,t=V.identityMat4())=>(t[0]=e[0],t[5]=e[1],t[10]=e[2],t),scalingMat3v:(e,t=V.identityMat3())=>(t[0]=e[0],t[4]=e[1],t),scalingMat4c:(()=>{const e=new D(3);return(t,i,s,r)=>(e[0]=t,e[1]=i,e[2]=s,V.scalingMat4v(e,r))})(),scaleMat4c:(e,t,i,s)=>(s[0]*=e,s[4]*=t,s[8]*=i,s[1]*=e,s[5]*=t,s[9]*=i,s[2]*=e,s[6]*=t,s[10]*=i,s[3]*=e,s[7]*=t,s[11]*=i,s),scaleMat4v(e,t){const i=e[0],s=e[1],r=e[2];return t[0]*=i,t[4]*=s,t[8]*=r,t[1]*=i,t[5]*=s,t[9]*=r,t[2]*=i,t[6]*=s,t[10]*=r,t[3]*=i,t[7]*=s,t[11]*=r,t},scalingMat4s:e=>V.scalingMat4c(e,e,e),rotationTranslationMat4(e,t,i=V.mat4()){const s=e[0],r=e[1],n=e[2],A=e[3],o=s+s,a=r+r,l=n+n,c=s*o,h=s*a,u=s*l,d=r*a,f=r*l,p=n*l,g=A*o,m=A*a,_=A*l;return i[0]=1-(d+p),i[1]=h+_,i[2]=u-m,i[3]=0,i[4]=h-_,i[5]=1-(c+p),i[6]=f+g,i[7]=0,i[8]=u+m,i[9]=f-g,i[10]=1-(c+d),i[11]=0,i[12]=t[0],i[13]=t[1],i[14]=t[2],i[15]=1,i},mat4ToEuler(e,t,i=V.vec4()){const s=V.clamp,r=e[0],n=e[4],A=e[8],o=e[1],a=e[5],l=e[9],c=e[2],h=e[6],u=e[10];return"XYZ"===t?(i[1]=Math.asin(s(A,-1,1)),Math.abs(A)<.99999?(i[0]=Math.atan2(-l,u),i[2]=Math.atan2(-n,r)):(i[0]=Math.atan2(h,a),i[2]=0)):"YXZ"===t?(i[0]=Math.asin(-s(l,-1,1)),Math.abs(l)<.99999?(i[1]=Math.atan2(A,u),i[2]=Math.atan2(o,a)):(i[1]=Math.atan2(-c,r),i[2]=0)):"ZXY"===t?(i[0]=Math.asin(s(h,-1,1)),Math.abs(h)<.99999?(i[1]=Math.atan2(-c,u),i[2]=Math.atan2(-n,a)):(i[1]=0,i[2]=Math.atan2(o,r))):"ZYX"===t?(i[1]=Math.asin(-s(c,-1,1)),Math.abs(c)<.99999?(i[0]=Math.atan2(h,u),i[2]=Math.atan2(o,r)):(i[0]=0,i[2]=Math.atan2(-n,a))):"YZX"===t?(i[2]=Math.asin(s(o,-1,1)),Math.abs(o)<.99999?(i[0]=Math.atan2(-l,a),i[1]=Math.atan2(-c,r)):(i[0]=0,i[1]=Math.atan2(A,u))):"XZY"===t&&(i[2]=Math.asin(-s(n,-1,1)),Math.abs(n)<.99999?(i[0]=Math.atan2(h,a),i[1]=Math.atan2(A,r)):(i[0]=Math.atan2(-l,u),i[1]=0)),i[0]*=V.RADTODEG,i[1]*=V.RADTODEG,i[2]*=V.RADTODEG,i},composeMat4:(e,t,i,s=V.mat4())=>(V.quaternionToRotationMat4(t,s),V.scaleMat4v(i,s),V.translateMat4v(e,s),s),decomposeMat4:(()=>{const e=new D(3),t=new D(16);return function(i,s,r,n){e[0]=i[0],e[1]=i[1],e[2]=i[2];let A=V.lenVec3(e);e[0]=i[4],e[1]=i[5],e[2]=i[6];const o=V.lenVec3(e);e[0]=i[8],e[1]=i[9],e[2]=i[10];const a=V.lenVec3(e);V.determinantMat4(i)<0&&(A=-A),s[0]=i[12],s[1]=i[13],s[2]=i[14],t.set(i);const l=1/A,c=1/o,h=1/a;return t[0]*=l,t[1]*=l,t[2]*=l,t[4]*=c,t[5]*=c,t[6]*=c,t[8]*=h,t[9]*=h,t[10]*=h,V.mat4ToQuaternion(t,r),n[0]=A,n[1]=o,n[2]=a,this}})(),getColMat4(e,t){const i=4*t;return[e[i],e[i+1],e[i+2],e[i+3]]},setRowMat4(e,t,i){e[t]=i[0],e[t+4]=i[1],e[t+8]=i[2],e[t+12]=i[3]},lookAtMat4v(e,t,i,s){s||(s=V.mat4());const r=e[0],n=e[1],A=e[2],o=i[0],a=i[1],l=i[2],c=t[0],h=t[1],u=t[2];if(r===c&&n===h&&A===u)return V.identityMat4();let d,f,p,g,m,_,b,y,B,w;return d=r-c,f=n-h,p=A-u,w=1/Math.sqrt(d*d+f*f+p*p),d*=w,f*=w,p*=w,g=a*p-l*f,m=l*d-o*p,_=o*f-a*d,w=Math.sqrt(g*g+m*m+_*_),w?(w=1/w,g*=w,m*=w,_*=w):(g=0,m=0,_=0),b=f*_-p*m,y=p*g-d*_,B=d*m-f*g,w=Math.sqrt(b*b+y*y+B*B),w?(w=1/w,b*=w,y*=w,B*=w):(b=0,y=0,B=0),s[0]=g,s[1]=b,s[2]=d,s[3]=0,s[4]=m,s[5]=y,s[6]=f,s[7]=0,s[8]=_,s[9]=B,s[10]=p,s[11]=0,s[12]=-(g*r+m*n+_*A),s[13]=-(b*r+y*n+B*A),s[14]=-(d*r+f*n+p*A),s[15]=1,s},lookAtMat4c:(e,t,i,s,r,n,A,o,a)=>V.lookAtMat4v([e,t,i],[s,r,n],[A,o,a],[]),orthoMat4c(e,t,i,s,r,n,A){A||(A=V.mat4());const o=t-e,a=s-i,l=n-r;return A[0]=2/o,A[1]=0,A[2]=0,A[3]=0,A[4]=0,A[5]=2/a,A[6]=0,A[7]=0,A[8]=0,A[9]=0,A[10]=-2/l,A[11]=0,A[12]=-(e+t)/o,A[13]=-(s+i)/a,A[14]=-(n+r)/l,A[15]=1,A},frustumMat4v(e,t,i){i||(i=V.mat4());const s=[e[0],e[1],e[2],0],r=[t[0],t[1],t[2],0];V.addVec4(r,s,Q),V.subVec4(r,s,R);const n=2*s[2],A=R[0],o=R[1],a=R[2];return i[0]=n/A,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=n/o,i[6]=0,i[7]=0,i[8]=Q[0]/A,i[9]=Q[1]/o,i[10]=-Q[2]/a,i[11]=-1,i[12]=0,i[13]=0,i[14]=-n*r[2]/a,i[15]=0,i},frustumMat4(e,t,i,s,r,n,A){A||(A=V.mat4());const o=t-e,a=s-i,l=n-r;return A[0]=2*r/o,A[1]=0,A[2]=0,A[3]=0,A[4]=0,A[5]=2*r/a,A[6]=0,A[7]=0,A[8]=(t+e)/o,A[9]=(s+i)/a,A[10]=-(n+r)/l,A[11]=-1,A[12]=0,A[13]=0,A[14]=-n*r*2/l,A[15]=0,A},perspectiveMat4(e,t,i,s,r){const n=[],A=[];return n[2]=i,A[2]=s,A[1]=n[2]*Math.tan(e/2),n[1]=-A[1],A[0]=A[1]*t,n[0]=-A[0],V.frustumMat4v(n,A,r)},compareMat4:(e,t)=>e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]&&e[4]===t[4]&&e[5]===t[5]&&e[6]===t[6]&&e[7]===t[7]&&e[8]===t[8]&&e[9]===t[9]&&e[10]===t[10]&&e[11]===t[11]&&e[12]===t[12]&&e[13]===t[13]&&e[14]===t[14]&&e[15]===t[15],transformPoint3(e,t,i=V.vec3()){const s=t[0],r=t[1],n=t[2];return i[0]=e[0]*s+e[4]*r+e[8]*n+e[12],i[1]=e[1]*s+e[5]*r+e[9]*n+e[13],i[2]=e[2]*s+e[6]*r+e[10]*n+e[14],i},transformPoint4:(e,t,i=V.vec4())=>(i[0]=e[0]*t[0]+e[4]*t[1]+e[8]*t[2]+e[12]*t[3],i[1]=e[1]*t[0]+e[5]*t[1]+e[9]*t[2]+e[13]*t[3],i[2]=e[2]*t[0]+e[6]*t[1]+e[10]*t[2]+e[14]*t[3],i[3]=e[3]*t[0]+e[7]*t[1]+e[11]*t[2]+e[15]*t[3],i),transformPoints3(e,t,i){const s=i||[],r=t.length;let n,A,o,a;const l=e[0],c=e[1],h=e[2],u=e[3],d=e[4],f=e[5],p=e[6],g=e[7],m=e[8],_=e[9],b=e[10],y=e[11],B=e[12],w=e[13],v=e[14],C=e[15];let M;for(let e=0;e<r;++e)a=t[e],n=a[0],A=a[1],o=a[2],M=s[e]||(s[e]=[0,0,0]),M[0]=l*n+d*A+m*o+B,M[1]=c*n+f*A+_*o+w,M[2]=h*n+p*A+b*o+v,M[3]=u*n+g*A+y*o+C;return s.length=r,s},transformPositions3(e,t,i=t){let s;const r=t.length;let n,A,o;const a=e[0],l=e[1],c=e[2];e[3];const h=e[4],u=e[5],d=e[6];e[7];const f=e[8],p=e[9],g=e[10];e[11];const m=e[12],_=e[13],b=e[14];for(e[15],s=0;s<r;s+=3)n=t[s+0],A=t[s+1],o=t[s+2],i[s+0]=a*n+h*A+f*o+m,i[s+1]=l*n+u*A+p*o+_,i[s+2]=c*n+d*A+g*o+b;return i},transformPositions4(e,t,i=t){let s;const r=t.length;let n,A,o;const a=e[0],l=e[1],c=e[2],h=e[3],u=e[4],d=e[5],f=e[6],p=e[7],g=e[8],m=e[9],_=e[10],b=e[11],y=e[12],B=e[13],w=e[14],v=e[15];for(s=0;s<r;s+=4)n=t[s+0],A=t[s+1],o=t[s+2],i[s+0]=a*n+u*A+g*o+y,i[s+1]=l*n+d*A+m*o+B,i[s+2]=c*n+f*A+_*o+w,i[s+3]=h*n+p*A+b*o+v;return i},transformVec3(e,t,i){const s=t[0],r=t[1],n=t[2];return(i=i||this.vec3())[0]=e[0]*s+e[4]*r+e[8]*n,i[1]=e[1]*s+e[5]*r+e[9]*n,i[2]=e[2]*s+e[6]*r+e[10]*n,i},transformVec4(e,t,i){const s=t[0],r=t[1],n=t[2],A=t[3];return(i=i||V.vec4())[0]=e[0]*s+e[4]*r+e[8]*n+e[12]*A,i[1]=e[1]*s+e[5]*r+e[9]*n+e[13]*A,i[2]=e[2]*s+e[6]*r+e[10]*n+e[14]*A,i[3]=e[3]*s+e[7]*r+e[11]*n+e[15]*A,i},rotateVec2(e,t,i,s=e){const r=Math.cos(i),n=Math.sin(i),A=e[0]-t[0],o=e[1]-t[1];return s[0]=A*r-o*n+t[0],s[1]=A*n+o*r+t[1],e},rotateVec3X(e,t,i,s){const r=[],n=[];return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],n[0]=r[0],n[1]=r[1]*Math.cos(i)-r[2]*Math.sin(i),n[2]=r[1]*Math.sin(i)+r[2]*Math.cos(i),s[0]=n[0]+t[0],s[1]=n[1]+t[1],s[2]=n[2]+t[2],s},rotateVec3Y(e,t,i,s){const r=[],n=[];return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],n[0]=r[2]*Math.sin(i)+r[0]*Math.cos(i),n[1]=r[1],n[2]=r[2]*Math.cos(i)-r[0]*Math.sin(i),s[0]=n[0]+t[0],s[1]=n[1]+t[1],s[2]=n[2]+t[2],s},rotateVec3Z(e,t,i,s){const r=[],n=[];return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],n[0]=r[0]*Math.cos(i)-r[1]*Math.sin(i),n[1]=r[0]*Math.sin(i)+r[1]*Math.cos(i),n[2]=r[2],s[0]=n[0]+t[0],s[1]=n[1]+t[1],s[2]=n[2]+t[2],s},projectVec4(e,t){const i=1/e[3];return(t=t||V.vec2())[0]=e[0]*i,t[1]=e[1]*i,t},unprojectVec3:(()=>{const e=new D(16),t=new D(16),i=new D(16);return function(s,r,n,A){return this.transformVec3(this.mulMat4(this.inverseMat4(r,e),this.inverseMat4(n,t),i),s,A)}})(),lerpVec3(e,t,i,s,r,n){const A=n||V.vec3(),o=(e-t)/(i-t);return A[0]=s[0]+o*(r[0]-s[0]),A[1]=s[1]+o*(r[1]-s[1]),A[2]=s[2]+o*(r[2]-s[2]),A},lerpMat4(e,t,i,s,r,n){const A=n||V.mat4(),o=(e-t)/(i-t);return A[0]=s[0]+o*(r[0]-s[0]),A[1]=s[1]+o*(r[1]-s[1]),A[2]=s[2]+o*(r[2]-s[2]),A[3]=s[3]+o*(r[3]-s[3]),A[4]=s[4]+o*(r[4]-s[4]),A[5]=s[5]+o*(r[5]-s[5]),A[6]=s[6]+o*(r[6]-s[6]),A[7]=s[7]+o*(r[7]-s[7]),A[8]=s[8]+o*(r[8]-s[8]),A[9]=s[9]+o*(r[9]-s[9]),A[10]=s[10]+o*(r[10]-s[10]),A[11]=s[11]+o*(r[11]-s[11]),A[12]=s[12]+o*(r[12]-s[12]),A[13]=s[13]+o*(r[13]-s[13]),A[14]=s[14]+o*(r[14]-s[14]),A[15]=s[15]+o*(r[15]-s[15]),A},flatten(e){const t=[];let i,s,r,n,A;for(i=0,s=e.length;i<s;i++)for(A=e[i],r=0,n=A.length;r<n;r++)t.push(A[r]);return t},identityQuaternion:(e=V.vec4())=>(e[0]=0,e[1]=0,e[2]=0,e[3]=1,e),eulerToQuaternion(e,t,i=V.vec4()){const s=e[0]*V.DEGTORAD/2,r=e[1]*V.DEGTORAD/2,n=e[2]*V.DEGTORAD/2,A=Math.cos(s),o=Math.cos(r),a=Math.cos(n),l=Math.sin(s),c=Math.sin(r),h=Math.sin(n);return"XYZ"===t?(i[0]=l*o*a+A*c*h,i[1]=A*c*a-l*o*h,i[2]=A*o*h+l*c*a,i[3]=A*o*a-l*c*h):"YXZ"===t?(i[0]=l*o*a+A*c*h,i[1]=A*c*a-l*o*h,i[2]=A*o*h-l*c*a,i[3]=A*o*a+l*c*h):"ZXY"===t?(i[0]=l*o*a-A*c*h,i[1]=A*c*a+l*o*h,i[2]=A*o*h+l*c*a,i[3]=A*o*a-l*c*h):"ZYX"===t?(i[0]=l*o*a-A*c*h,i[1]=A*c*a+l*o*h,i[2]=A*o*h-l*c*a,i[3]=A*o*a+l*c*h):"YZX"===t?(i[0]=l*o*a+A*c*h,i[1]=A*c*a+l*o*h,i[2]=A*o*h-l*c*a,i[3]=A*o*a-l*c*h):"XZY"===t&&(i[0]=l*o*a-A*c*h,i[1]=A*c*a-l*o*h,i[2]=A*o*h+l*c*a,i[3]=A*o*a+l*c*h),i},mat4ToQuaternion(e,t=V.vec4()){const i=e[0],s=e[4],r=e[8],n=e[1],A=e[5],o=e[9],a=e[2],l=e[6],c=e[10];let h;const u=i+A+c;return u>0?(h=.5/Math.sqrt(u+1),t[3]=.25/h,t[0]=(l-o)*h,t[1]=(r-a)*h,t[2]=(n-s)*h):i>A&&i>c?(h=2*Math.sqrt(1+i-A-c),t[3]=(l-o)/h,t[0]=.25*h,t[1]=(s+n)/h,t[2]=(r+a)/h):A>c?(h=2*Math.sqrt(1+A-i-c),t[3]=(r-a)/h,t[0]=(s+n)/h,t[1]=.25*h,t[2]=(o+l)/h):(h=2*Math.sqrt(1+c-i-A),t[3]=(n-s)/h,t[0]=(r+a)/h,t[1]=(o+l)/h,t[2]=.25*h),t},vec3PairToQuaternion(e,t,i=V.vec4()){const s=Math.sqrt(V.dotVec3(e,e)*V.dotVec3(t,t));let r=s+V.dotVec3(e,t);return r<1e-8*s?(r=0,Math.abs(e[0])>Math.abs(e[2])?(i[0]=-e[1],i[1]=e[0],i[2]=0):(i[0]=0,i[1]=-e[2],i[2]=e[1])):V.cross3Vec3(e,t,i),i[3]=r,V.normalizeQuaternion(i)},angleAxisToQuaternion(e,t=V.vec4()){const i=e[3]/2,s=Math.sin(i);return t[0]=s*e[0],t[1]=s*e[1],t[2]=s*e[2],t[3]=Math.cos(i),t},quaternionToEuler:(()=>{const e=new D(16);return(t,i,s)=>(s=s||V.vec3(),V.quaternionToRotationMat4(t,e),V.mat4ToEuler(e,i,s),s)})(),mulQuaternions(e,t,i=V.vec4()){const s=e[0],r=e[1],n=e[2],A=e[3],o=t[0],a=t[1],l=t[2],c=t[3];return i[0]=A*o+s*c+r*l-n*a,i[1]=A*a+r*c+n*o-s*l,i[2]=A*l+n*c+s*a-r*o,i[3]=A*c-s*o-r*a-n*l,i},vec3ApplyQuaternion(e,t,i=V.vec3()){const s=t[0],r=t[1],n=t[2],A=e[0],o=e[1],a=e[2],l=e[3],c=l*s+o*n-a*r,h=l*r+a*s-A*n,u=l*n+A*r-o*s,d=-A*s-o*r-a*n;return i[0]=c*l+d*-A+h*-a-u*-o,i[1]=h*l+d*-o+u*-A-c*-a,i[2]=u*l+d*-a+c*-o-h*-A,i},quaternionToMat4(e,t){t=V.identityMat4(t);const i=e[0],s=e[1],r=e[2],n=e[3],A=2*i,o=2*s,a=2*r,l=A*n,c=o*n,h=a*n,u=A*i,d=o*i,f=a*i,p=o*s,g=a*s,m=a*r;return t[0]=1-(p+m),t[1]=d+h,t[2]=f-c,t[4]=d-h,t[5]=1-(u+m),t[6]=g+l,t[8]=f+c,t[9]=g-l,t[10]=1-(u+p),t},quaternionToRotationMat4(e,t){const i=e[0],s=e[1],r=e[2],n=e[3],A=i+i,o=s+s,a=r+r,l=i*A,c=i*o,h=i*a,u=s*o,d=s*a,f=r*a,p=n*A,g=n*o,m=n*a;return t[0]=1-(u+f),t[4]=c-m,t[8]=h+g,t[1]=c+m,t[5]=1-(l+f),t[9]=d-p,t[2]=h-g,t[6]=d+p,t[10]=1-(l+u),t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},normalizeQuaternion(e,t=e){const i=V.lenVec4([e[0],e[1],e[2],e[3]]);return t[0]=e[0]/i,t[1]=e[1]/i,t[2]=e[2]/i,t[3]=e[3]/i,t},conjugateQuaternion:(e,t=e)=>(t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t),inverseQuaternion:(e,t)=>V.normalizeQuaternion(V.conjugateQuaternion(e,t)),quaternionToAngleAxis(e,t=V.vec4()){const i=(e=V.normalizeQuaternion(e,O))[3],s=2*Math.acos(i),r=Math.sqrt(1-i*i);return r<.001?(t[0]=e[0],t[1]=e[1],t[2]=e[2]):(t[0]=e[0]/r,t[1]=e[1]/r,t[2]=e[2]/r),t[3]=s,t},AABB3:e=>new D(e||6),AABB2:e=>new D(e||4),OBB3:e=>new D(e||32),OBB2:e=>new D(e||16),Sphere3:(e,t,i,s)=>new D([e,t,i,s]),transformOBB3(e,t,i=t){let s;const r=t.length;let n,A,o;const a=e[0],l=e[1],c=e[2],h=e[3],u=e[4],d=e[5],f=e[6],p=e[7],g=e[8],m=e[9],_=e[10],b=e[11],y=e[12],B=e[13],w=e[14],v=e[15];for(s=0;s<r;s+=4)n=t[s+0],A=t[s+1],o=t[s+2],i[s+0]=a*n+u*A+g*o+y,i[s+1]=l*n+d*A+m*o+B,i[s+2]=c*n+f*A+_*o+w,i[s+3]=h*n+p*A+b*o+v;return i},containsAABB3:function(e,t){return e[0]<=t[0]&&t[3]<=e[3]&&e[1]<=t[1]&&t[4]<=e[4]&&e[2]<=t[2]&&t[5]<=e[5]},getAABB3Diag:(()=>{const e=new D(3),t=new D(3),i=new D(3);return s=>(e[0]=s[0],e[1]=s[1],e[2]=s[2],t[0]=s[3],t[1]=s[4],t[2]=s[5],V.subVec3(t,e,i),Math.abs(V.lenVec3(i)))})(),getAABB3DiagPoint:(()=>{const e=new D(3),t=new D(3),i=new D(3);return(s,r)=>{e[0]=s[0],e[1]=s[1],e[2]=s[2],t[0]=s[3],t[1]=s[4],t[2]=s[5];const n=V.subVec3(t,e,i),A=r[0]-s[0],o=s[3]-r[0],a=r[1]-s[1],l=s[4]-r[1],c=r[2]-s[2],h=s[5]-r[2];return n[0]+=A>o?A:o,n[1]+=a>l?a:l,n[2]+=c>h?c:h,Math.abs(V.lenVec3(n))}})(),getAABB3Area:e=>(e[3]-e[0])*(e[4]-e[1])*(e[5]-e[2]),getAABB3Center(e,t){const i=t||V.vec3();return i[0]=(e[0]+e[3])/2,i[1]=(e[1]+e[4])/2,i[2]=(e[2]+e[5])/2,i},getAABB2Center(e,t){const i=t||V.vec2();return i[0]=(e[2]+e[0])/2,i[1]=(e[3]+e[1])/2,i},collapseAABB3:(e=V.AABB3())=>(e[0]=V.MAX_DOUBLE,e[1]=V.MAX_DOUBLE,e[2]=V.MAX_DOUBLE,e[3]=V.MIN_DOUBLE,e[4]=V.MIN_DOUBLE,e[5]=V.MIN_DOUBLE,e),AABB3ToOBB3:(e,t=V.OBB3())=>(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=1,t[4]=e[3],t[5]=e[1],t[6]=e[2],t[7]=1,t[8]=e[3],t[9]=e[4],t[10]=e[2],t[11]=1,t[12]=e[0],t[13]=e[4],t[14]=e[2],t[15]=1,t[16]=e[0],t[17]=e[1],t[18]=e[5],t[19]=1,t[20]=e[3],t[21]=e[1],t[22]=e[5],t[23]=1,t[24]=e[3],t[25]=e[4],t[26]=e[5],t[27]=1,t[28]=e[0],t[29]=e[4],t[30]=e[5],t[31]=1,t),positions3ToAABB3:(()=>{const e=new D(3);return(t,i,s)=>{i=i||V.AABB3();let r,n,A,o=V.MAX_DOUBLE,a=V.MAX_DOUBLE,l=V.MAX_DOUBLE,c=V.MIN_DOUBLE,h=V.MIN_DOUBLE,u=V.MIN_DOUBLE;for(let i=0,d=t.length;i<d;i+=3)s?(e[0]=t[i+0],e[1]=t[i+1],e[2]=t[i+2],V.decompressPosition(e,s,e),r=e[0],n=e[1],A=e[2]):(r=t[i+0],n=t[i+1],A=t[i+2]),r<o&&(o=r),n<a&&(a=n),A<l&&(l=A),r>c&&(c=r),n>h&&(h=n),A>u&&(u=A);return i[0]=o,i[1]=a,i[2]=l,i[3]=c,i[4]=h,i[5]=u,i}})(),OBB3ToAABB3(e,t=V.AABB3()){let i,s,r,n=V.MAX_DOUBLE,A=V.MAX_DOUBLE,o=V.MAX_DOUBLE,a=V.MIN_DOUBLE,l=V.MIN_DOUBLE,c=V.MIN_DOUBLE;for(let t=0,h=e.length;t<h;t+=4)i=e[t+0],s=e[t+1],r=e[t+2],i<n&&(n=i),s<A&&(A=s),r<o&&(o=r),i>a&&(a=i),s>l&&(l=s),r>c&&(c=r);return t[0]=n,t[1]=A,t[2]=o,t[3]=a,t[4]=l,t[5]=c,t},points3ToAABB3(e,t=V.AABB3()){let i,s,r,n=V.MAX_DOUBLE,A=V.MAX_DOUBLE,o=V.MAX_DOUBLE,a=V.MIN_DOUBLE,l=V.MIN_DOUBLE,c=V.MIN_DOUBLE;for(let t=0,h=e.length;t<h;t++)i=e[t][0],s=e[t][1],r=e[t][2],i<n&&(n=i),s<A&&(A=s),r<o&&(o=r),i>a&&(a=i),s>l&&(l=s),r>c&&(c=r);return t[0]=n,t[1]=A,t[2]=o,t[3]=a,t[4]=l,t[5]=c,t},points3ToSphere3:(()=>{const e=new D(3);return(t,i)=>{i=i||V.vec4();let s,r=0,n=0,A=0;const o=t.length;for(s=0;s<o;s++)r+=t[s][0],n+=t[s][1],A+=t[s][2];i[0]=r/o,i[1]=n/o,i[2]=A/o;let a,l=0;for(s=0;s<o;s++)a=Math.abs(V.lenVec3(V.subVec3(t[s],i,e))),a>l&&(l=a);return i[3]=l,i}})(),positions3ToSphere3:(()=>{const e=new D(3),t=new D(3);return(i,s)=>{s=s||V.vec4();let r,n=0,A=0,o=0;const a=i.length;let l=0;for(r=0;r<a;r+=3)n+=i[r],A+=i[r+1],o+=i[r+2];const c=a/3;let h;for(s[0]=n/c,s[1]=A/c,s[2]=o/c,r=0;r<a;r+=3)e[0]=i[r],e[1]=i[r+1],e[2]=i[r+2],h=Math.abs(V.lenVec3(V.subVec3(e,s,t))),h>l&&(l=h);return s[3]=l,s}})(),OBB3ToSphere3:(()=>{const e=new D(3),t=new D(3);return(i,s)=>{s=s||V.vec4();let r,n=0,A=0,o=0;const a=i.length,l=a/4;for(r=0;r<a;r+=4)n+=i[r+0],A+=i[r+1],o+=i[r+2];s[0]=n/l,s[1]=A/l,s[2]=o/l;let c,h=0;for(r=0;r<a;r+=4)e[0]=i[r+0],e[1]=i[r+1],e[2]=i[r+2],c=Math.abs(V.lenVec3(V.subVec3(e,s,t))),c>h&&(h=c);return s[3]=h,s}})(),getSphere3Center:(e,t=V.vec3())=>(t[0]=e[0],t[1]=e[1],t[2]=e[2],t),getPositionsCenter(e,t=V.vec3()){let i=0,s=0,r=0;for(var n=0,A=e.length;n<A;n+=3)i+=e[n+0],s+=e[n+1],r+=e[n+2];const o=e.length/3;return t[0]=i/o,t[1]=s/o,t[2]=r/o,t},expandAABB3:(e,t)=>(e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]>t[2]&&(e[2]=t[2]),e[3]<t[3]&&(e[3]=t[3]),e[4]<t[4]&&(e[4]=t[4]),e[5]<t[5]&&(e[5]=t[5]),e),expandAABB3Point3:(e,t)=>(e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]>t[2]&&(e[2]=t[2]),e[3]<t[0]&&(e[3]=t[0]),e[4]<t[1]&&(e[4]=t[1]),e[5]<t[2]&&(e[5]=t[2]),e),expandAABB3Points3(e,t){for(var i,s,r,n=0,A=t.length;n<A;n+=3)i=t[n],s=t[n+1],r=t[n+2],e[0]>i&&(e[0]=i),e[1]>s&&(e[1]=s),e[2]>r&&(e[2]=r),e[3]<i&&(e[3]=i),e[4]<s&&(e[4]=s),e[5]<r&&(e[5]=r);return e},collapseAABB2:(e=V.AABB2())=>(e[0]=V.MAX_DOUBLE,e[1]=V.MAX_DOUBLE,e[2]=V.MIN_DOUBLE,e[3]=V.MIN_DOUBLE,e),point3AABB3Intersect:(e,t)=>e[0]>t[0]||e[3]<t[0]||e[1]>t[1]||e[4]<t[1]||e[2]>t[2]||e[5]<t[2],point3AABB3AbsoluteIntersect:(e,t)=>e[0]<=t[0]&&e[3]>=t[0]&&e[1]<=t[1]&&e[4]>=t[1]&&e[2]<=t[2]&&e[5]>=t[2],planeAABB3Intersect(e,t,i){let s,r;e[0]>0?(s=e[0]*i[0],r=e[0]*i[3]):(s=e[0]*i[3],r=e[0]*i[0]),e[1]>0?(s+=e[1]*i[1],r+=e[1]*i[4]):(s+=e[1]*i[4],r+=e[1]*i[1]),e[2]>0?(s+=e[2]*i[2],r+=e[2]*i[5]):(s+=e[2]*i[5],r+=e[2]*i[2]);if(s<=-t&&r<=-t)return-1;return s>=-t&&r>=-t?1:0},OBB3ToAABB2(e,t=V.AABB2()){let i,s,r,n,A=V.MAX_DOUBLE,o=V.MAX_DOUBLE,a=V.MIN_DOUBLE,l=V.MIN_DOUBLE;for(let t=0,c=e.length;t<c;t+=4)i=e[t+0],s=e[t+1],r=e[t+3]||1,n=1/r,i*=n,s*=n,i<A&&(A=i),s<o&&(o=s),i>a&&(a=i),s>l&&(l=s);return t[0]=A,t[1]=o,t[2]=a,t[3]=l,t},expandAABB2:(e,t)=>(e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]<t[2]&&(e[2]=t[2]),e[3]<t[3]&&(e[3]=t[3]),e),expandAABB2Point2:(e,t)=>(e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]<t[0]&&(e[2]=t[0]),e[3]<t[1]&&(e[3]=t[1]),e),AABB2ToCanvas(e,t,i,s=e){const r=.5*(e[0]+1),n=.5*(e[1]+1),A=.5*(e[2]+1),o=.5*(e[3]+1);return s[0]=Math.floor(r*t),s[1]=i-Math.floor(o*i),s[2]=Math.floor(A*t),s[3]=i-Math.floor(n*i),s},tangentQuadraticBezier:(e,t,i,s)=>2*(1-e)*(i-t)+2*e*(s-i),tangentQuadraticBezier3:(e,t,i,s,r)=>-3*t*(1-e)*(1-e)+3*i*(1-e)*(1-e)-6*e*i*(1-e)+6*e*s*(1-e)-3*e*e*s+3*e*e*r,tangentSpline:e=>6*e*e-6*e+(3*e*e-4*e+1)+(-6*e*e+6*e)+(3*e*e-2*e),catmullRomInterpolate(e,t,i,s,r){const n=.5*(i-e),A=.5*(s-t),o=r*r;return(2*t-2*i+n+A)*(r*o)+(-3*t+3*i-2*n-A)*o+n*r+t},b2p0(e,t){const i=1-e;return i*i*t},b2p1:(e,t)=>2*(1-e)*e*t,b2p2:(e,t)=>e*e*t,b2(e,t,i,s){return this.b2p0(e,t)+this.b2p1(e,i)+this.b2p2(e,s)},b3p0(e,t){const i=1-e;return i*i*i*t},b3p1(e,t){const i=1-e;return 3*i*i*e*t},b3p2:(e,t)=>3*(1-e)*e*e*t,b3p3:(e,t)=>e*e*e*t,b3(e,t,i,s,r){return this.b3p0(e,t)+this.b3p1(e,i)+this.b3p2(e,s)+this.b3p3(e,r)},triangleNormal(e,t,i,s=V.vec3()){const r=t[0]-e[0],n=t[1]-e[1],A=t[2]-e[2],o=i[0]-e[0],a=i[1]-e[1],l=i[2]-e[2],c=n*l-A*a,h=A*o-r*l,u=r*a-n*o,d=Math.sqrt(c*c+h*h+u*u);return 0===d?(s[0]=0,s[1]=0,s[2]=0):(s[0]=c/d,s[1]=h/d,s[2]=u/d),s},rayTriangleIntersect:(()=>{const e=new D(3),t=new D(3),i=new D(3),s=new D(3),r=new D(3);return(n,A,o,a,l,c)=>{c=c||V.vec3();const h=V.subVec3(a,o,e),u=V.subVec3(l,o,t),d=V.cross3Vec3(A,u,i),f=V.dotVec3(h,d);if(f<1e-6)return null;const p=V.subVec3(n,o,s),g=V.dotVec3(p,d);if(g<0||g>f)return null;const m=V.cross3Vec3(p,h,r),_=V.dotVec3(A,m);if(_<0||g+_>f)return null;const b=V.dotVec3(u,m)/f;return c[0]=n[0]+b*A[0],c[1]=n[1]+b*A[1],c[2]=n[2]+b*A[2],c}})(),rayPlaneIntersect:(()=>{const e=new D(3),t=new D(3),i=new D(3),s=new D(3);return(r,n,A,o,a,l)=>{l=l||V.vec3(),n=V.normalizeVec3(n,e);const c=V.subVec3(o,A,t),h=V.subVec3(a,A,i),u=V.cross3Vec3(c,h,s);V.normalizeVec3(u,u);const d=-V.dotVec3(A,u),f=-(V.dotVec3(r,u)+d)/V.dotVec3(n,u);return l[0]=r[0]+f*n[0],l[1]=r[1]+f*n[1],l[2]=r[2]+f*n[2],l}})(),cartesianToBarycentric:(()=>{const e=new D(3),t=new D(3),i=new D(3);return(s,r,n,A,o)=>{const a=V.subVec3(A,r,e),l=V.subVec3(n,r,t),c=V.subVec3(s,r,i),h=V.dotVec3(a,a),u=V.dotVec3(a,l),d=V.dotVec3(a,c),f=V.dotVec3(l,l),p=V.dotVec3(l,c),g=h*f-u*u;if(0===g)return null;const m=1/g,_=(f*d-u*p)*m,b=(h*p-u*d)*m;return o[0]=1-_-b,o[1]=b,o[2]=_,o}})(),b