@seatlayer/core 0.97.0 → 0.98.0
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/dist/chunk-2MXDWZQ4.js +1 -0
- package/dist/core/chart-ops/index.js +1 -1
- package/dist/view3d/index.cjs +84 -42
- package/dist/view3d/index.d.cts +6 -0
- package/dist/view3d/index.d.ts +6 -0
- package/dist/view3d/index.js +82 -40
- package/dist/view3d/scene/scene.worker.cjs +1 -1
- package/dist/view3d/scene/scene.worker.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-NGZXKXOY.js +0 -1
package/dist/view3d/index.js
CHANGED
|
@@ -1,12 +1,40 @@
|
|
|
1
|
-
import{A as Mn,B as Cn,C as He,D as Ft,E as An,F as Pn,a as Be,b as Ae,c as nt,d as Pt,e as cn,f as un,g as be,h as dn,i as mn,j as ot,k as Re,l as Ge,m as hn,n as Et,o as hr,p as pn,q as fn,r as vn,s as bn,t as xe,u as gn,v as yn,w as xn,x as Sn,y as wn,z as rt}from"../chunk-NGZXKXOY.js";import"../chunk-2P72QUJR.js";import"../chunk-OLGPAFXW.js";import"../chunk-QJXSZT3H.js";import"../chunk-ASIIXY5M.js";import"../chunk-M5VINTGE.js";import"../chunk-P4C24CIZ.js";import"../chunk-IW7QZIMF.js";import"../chunk-Z43H6AWN.js";import"../chunk-4N5CHKHD.js";import"../chunk-TQN2VWQO.js";import"../chunk-5BMXWOE7.js";import"../chunk-FLMKHAUT.js";import{Va as an}from"../chunk-VAI2VDQR.js";import"../chunk-5ITK5236.js";import{d as sn,l as ln}from"../chunk-JBOTRSMY.js";import"../chunk-CRCGO52K.js";function En(t,e,n){let r=Math.floor(e.length/3),a=n.center[0],o=n.center[2];if(r>0){let l=Math.max(1,Math.floor(r/4e3)),u=0,p=0,h=0;for(let v=0;v<r;v+=l)u+=e[v*3],p+=e[v*3+2],h++;a=u/h,o=p/h}let i=t[0]-a,s=t[2]-o;return Math.hypot(i,s)>n.radius*.12?Math.atan2(i,s):void 0}var Rt=78,Fn=18;function Rn(){let t=[],e=[],n=[],r=[],a=[],o=[{n:[1,0,0],c:[[1,0,0],[1,1,0],[1,1,1],[1,0,1]]},{n:[-1,0,0],c:[[0,0,1],[0,1,1],[0,1,0],[0,0,0]]},{n:[0,1,0],c:[[0,1,0],[0,1,1],[1,1,1],[1,1,0]]},{n:[0,-1,0],c:[[0,0,1],[0,0,0],[1,0,0],[1,0,1]]},{n:[0,0,1],c:[[0,0,1],[1,0,1],[1,1,1],[0,1,1]]},{n:[0,0,-1],c:[[1,0,0],[0,0,0],[0,1,0],[1,1,0]]}];for(let s of[{part:1,min:[-1,.36,-.95],max:[1,.45,1]},{part:2,min:[-1,Ae,-1],max:[1,nt,-.72]}])for(let l of o){let u=t.length/3,p=l.n[1]+(s.part===2?Math.abs(l.n[0])*(1-Pt)/(nt-Ae):0),h=Math.hypot(l.n[0],p,l.n[2]),v=[l.n[0]/h,p/h,l.n[2]/h];for(let[f,c]of l.c.entries()){let b=c.map((E,P)=>s.min[P]+E*(s.max[P]-s.min[P]));s.part===2&&(b[0]*=1-c[1]*(1-Pt)),t.push(...b),e.push(...v),n.push(s.part),r.push(...[[-1,-1],[1,-1],[1,1],[-1,1]][f])}a.push(u,u+1,u+2,u,u+2,u+3)}let i=t.length/3;for(let[s,l]of[[-1,-1],[1,-1],[1,1],[-1,1]])t.push(s,l,0),e.push(0,1,0),n.push(0),r.push(s,l);return a.push(i,i+1,i+2,i,i+2,i+3),a.push(...a.slice(12,18),...a.slice(60,66),...a.slice(72,78)),{position:new Float32Array(t),normal:new Float32Array(e),surface:new Float32Array(n),uv:new Float32Array(r),index:new Uint16Array(a)}}import{Renderer as pr}from"ogl";function fr(){let t=typeof window<"u"&&window.devicePixelRatio||1,e=navigator.deviceMemory,n=typeof e=="number"&&e<=4?1.5:2;return Math.min(t,n)}var at=class{constructor(e,n){this.clearRgb=[0,0,0];this.container=e,this.canvas=document.createElement("canvas"),this.canvas.style.display="block",this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.touchAction="none",this.canvas.tabIndex=0,this.canvas.setAttribute("role","application"),this.canvas.setAttribute("aria-label","Interactive 3D venue. Drag or use arrow keys to look around; pinch, scroll, plus or minus to zoom."),this.renderer=new pr({canvas:this.canvas,dpr:fr(),alpha:!1,antialias:!1,depth:!0,stencil:!1,powerPreference:"high-performance",webgl:2}),this.gl=this.renderer.gl,this.clearRgb=[ot.top[0],ot.top[1],ot.top[2]],this.gl.clearColor(this.clearRgb[0],this.clearRgb[1],this.clearRgb[2],1),e.appendChild(this.canvas),this.lostHandler=r=>{r.preventDefault(),n.onContextLost()},this.restoredHandler=()=>n.onContextRestored(),this.canvas.addEventListener("webglcontextlost",this.lostHandler,!1),this.canvas.addEventListener("webglcontextrestored",this.restoredHandler,!1),this.resize()}setClearColor(e){this.clearRgb=[e[0],e[1],e[2]],this.gl.clearColor(e[0],e[1],e[2],1)}get clearColor(){return this.clearRgb}resize(){let e=Math.max(1,this.container.clientWidth||this.canvas.clientWidth||1),n=Math.max(1,this.container.clientHeight||this.canvas.clientHeight||1);return this.renderer.setSize(e,n),{width:e,height:n}}get pixelHeight(){return this.renderer.height*this.renderer.dpr}get aspect(){return this.renderer.width/Math.max(1,this.renderer.height)}dispose(){this.canvas.removeEventListener("webglcontextlost",this.lostHandler,!1),this.canvas.removeEventListener("webglcontextrestored",this.restoredHandler,!1);let e=this.gl.getExtension("WEBGL_lose_context");e&&e.loseContext(),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)}simulateContextLossCycle(){let e=this.gl.getExtension("WEBGL_lose_context");e&&(e.loseContext(),setTimeout(()=>{e.restoreContext&&e.restoreContext()},300))}};import{Camera as vr,Vec3 as Dt}from"ogl";var de=Math.PI/180,Tt=15*de,It=80*de,De=.12,Dn=35,Tn=1.25,In=.006,br=4,Te=.82,We=1/Te,gr=.12,yr=2;function xr(t,e){return{azimuth:t*In,polar:-e*In}}function Sr(t,e,n){let r=Math.max(yr,Math.max(1,e)*gr),a=n*br;return{minDist:t?Math.min(t.minDist,r):r,maxDist:t?Math.max(t.maxDist,a):a}}var wr=1.5;function Mr(t,e,n){let r=Math.max(1,n)*wr;if(!t)return{anchor:[e[0],e[1],e[2]],limit:r};let[a,o,i]=t.anchor,s=e[1]-o,l=Math.max(Math.abs(e[0]-a),Math.abs(e[2]-i),s>=0?s:-s*2);return{anchor:t.anchor,limit:Math.max(t.limit,l+r)}}var it=class{constructor(e,n,r,a){this.fovY=Dn;this.target=new Dt;this.azimuth=-30*de;this.polar=55*de;this.distance=10;this.azT=-30*de;this.polT=55*de;this.distT=10;this.minDist=1;this.maxDist=100;this.envelope=null;this.gestureFired=!1;this.interactionEnabled=!0;this.dragging=!1;this.panning=!1;this.lastX=0;this.lastY=0;this.activePointers=new Map;this.pinchDist=0;this.pinchCx=0;this.pinchCy=0;this.targetT=new Dt;this.panAnchor=new Dt;this.panLimit=0;this.panBox=null;this.primaryDragMode="orbit";this.camera=new vr(e,{fov:Dn,near:.1,far:5e3,aspect:1}),this.canvas=n,this.requestRender=r,this.onGesture=a,this.onPointerDown=o=>{if(this.interactionEnabled){try{this.canvas.setPointerCapture?.(o.pointerId)}catch{}if(this.activePointers.set(o.pointerId,{x:o.clientX,y:o.clientY}),this.activePointers.size===1){let i=o.button===2||o.button===1,s=o.button===0&&(o.shiftKey?this.primaryDragMode==="orbit":this.primaryDragMode==="pan");this.panning=i||s,this.dragging=!this.panning,this.lastX=o.clientX,this.lastY=o.clientY}else if(this.activePointers.size===2){this.dragging=!1,this.panning=!1,this.pinchDist=this.currentPinchDistance();let i=this.pinchCentroid();this.pinchCx=i.x,this.pinchCy=i.y}}},this.onPointerMove=o=>{if(!this.interactionEnabled||!this.activePointers.has(o.pointerId))return;if(this.activePointers.set(o.pointerId,{x:o.clientX,y:o.clientY}),this.activePointers.size>=2){let u=this.currentPinchDistance();this.pinchDist>0&&(this.dollyBy(Math.exp((this.pinchDist-u)*.005)),this.fireGesture()),this.pinchDist=u;let p=this.pinchCentroid();this.panBy(p.x-this.pinchCx,p.y-this.pinchCy),this.pinchCx=p.x,this.pinchCy=p.y;return}let i=o.clientX-this.lastX,s=o.clientY-this.lastY;if(this.panning){this.lastX=o.clientX,this.lastY=o.clientY,(i!==0||s!==0)&&(this.panBy(i,s),this.fireGesture());return}if(!this.dragging)return;this.lastX=o.clientX,this.lastY=o.clientY,(i!==0||s!==0)&&this.fireGesture();let l=xr(i,s);this.azT+=l.azimuth,this.polT=Math.max(Tt,Math.min(It,this.polT+l.polar)),this.requestRender()},this.onPointerUp=o=>{this.activePointers.delete(o.pointerId);try{this.canvas.releasePointerCapture?.(o.pointerId)}catch{}this.activePointers.size<2&&(this.pinchDist=0),this.activePointers.size===0&&(this.dragging=!1,this.panning=!1)},this.onContextMenu=o=>{o.preventDefault()},this.onWheel=o=>{if(o.preventDefault(),!this.interactionEnabled)return;let i=o.deltaMode===1?16:o.deltaMode===2?100:1,s=Math.max(-2,Math.min(2,o.deltaY*i/100));this.dollyBy(Math.exp(s*.22)),this.fireGesture()},this.onKeyDown=o=>{if(!this.interactionEnabled)return;let i=7*de;if(o.shiftKey&&(o.key==="ArrowLeft"||o.key==="ArrowRight"||o.key==="ArrowUp"||o.key==="ArrowDown"))this.panBy(o.key==="ArrowLeft"?-32:o.key==="ArrowRight"?32:0,o.key==="ArrowUp"?-32:o.key==="ArrowDown"?32:0);else if(o.key==="ArrowLeft"||o.key==="ArrowRight")this.azT+=o.key==="ArrowLeft"?-i:i;else if(o.key==="ArrowUp"||o.key==="ArrowDown")this.polT=Math.max(Tt,Math.min(It,this.polT+(o.key==="ArrowUp"?-i:i)));else if(o.key==="+"||o.key==="=")this.dollyBy(Te);else if(o.key==="-"||o.key==="_")this.dollyBy(We);else return;o.preventDefault(),this.fireGesture(),this.requestRender()},n.addEventListener("pointerdown",this.onPointerDown),n.addEventListener("pointermove",this.onPointerMove),n.addEventListener("pointerup",this.onPointerUp),n.addEventListener("pointercancel",this.onPointerUp),n.addEventListener("wheel",this.onWheel,{passive:!1}),n.addEventListener("keydown",this.onKeyDown),n.addEventListener("contextmenu",this.onContextMenu)}pinchCentroid(){let e=[...this.activePointers.values()];if(!e.length)return{x:0,y:0};let n=0,r=0;for(let a of e)n+=a.x,r+=a.y;return{x:n/e.length,y:r/e.length}}panBy(e,n){let r=this.canvas.clientHeight||1,a=2*this.distance*Math.tan(this.fovY*de/2)/r,o=Math.sin(this.azimuth),i=Math.cos(this.azimuth),s=i,l=-o,u=Math.cos(this.polar),p=Math.sin(this.polar),h=-o*u,v=-i*u;this.targetT.x+=(-e*s+n*h)*a,this.targetT.z+=(-e*l+n*v)*a,this.targetT.y+=n*p*a,this.clampPan(),this.requestRender()}widenPanBox(e){this.panBox=Mr(this.panBox,e.center,e.radius),this.panAnchor.set(this.panBox.anchor[0],this.panBox.anchor[1],this.panBox.anchor[2]),this.panLimit=this.panBox.limit}clampPan(){if(this.panLimit<=0)return;let e=this.panLimit,n=this.panAnchor.x,r=this.panAnchor.y,a=this.panAnchor.z;this.targetT.x=Math.max(n-e,Math.min(n+e,this.targetT.x)),this.targetT.z=Math.max(a-e,Math.min(a+e,this.targetT.z)),this.targetT.y=Math.max(r-e*.5,Math.min(r+e,this.targetT.y))}fireGesture(){this.gestureFired||(this.gestureFired=!0,this.onGesture?.())}currentPinchDistance(){let e=[...this.activePointers.values()];return e.length<2?0:Math.hypot(e[0].x-e[1].x,e[0].y-e[1].y)}dollyBy(e){this.distT=Math.max(this.minDist,Math.min(this.maxDist,this.distT*e)),this.requestRender()}zoomBy(e){this.interactionEnabled&&(this.dollyBy(e),this.fireGesture())}dollyLimitState(){return{atMin:this.distT<=this.minDist+1e-6,atMax:this.distT>=this.maxDist-1e-6}}setPrimaryDragMode(e){this.primaryDragMode=e}setInteractionEnabled(e){this.interactionEnabled=e,!e&&(this.activePointers.clear(),this.dragging=!1,this.panning=!1,this.pinchDist=0)}frame(e,n=!1,r,a=!1,o){this.camera.perspective({fov:this.fovY,aspect:this.camera.aspect}),this.target.set(e.center[0],e.center[1],e.center[2]),this.targetT.copy(this.target),this.widenPanBox(e);let i=Math.max(1,e.radius),s=this.fovY*de/2,l=a?Math.max(.82,this.camera.aspect||1):this.camera.aspect||1,u=Math.atan(Math.tan(s)*l);this.azT=r??-30*de,this.polT=Math.max(15,Math.min(80,o?.polarDeg??55))*de;let p=this.fitDistance(e,s,u,this.azT,this.polT);this.distT=p*Math.max(1.05,Math.min(2,o?.margin??Tn)),this.envelope=Sr(this.envelope,i,p),this.minDist=this.envelope.minDist,this.maxDist=this.envelope.maxDist,n?(this.azimuth=this.azT,this.polar=12*de,this.distance=this.distT*1.7):(this.azimuth=this.azT,this.polar=this.polT,this.distance=this.distT),this.applyPosition()}setAspect(e){if(!(e>0)||!Number.isFinite(e))return;let n=this.camera.aspect;if(this.interactionEnabled&&n>0){let r=Math.min(n,1)/Math.min(e,1);this.distance*=r,this.distT*=r,this.maxDist=Math.max(this.maxDist,this.distance,this.distT),this.applyPosition()}this.camera.perspective({aspect:e})}frameSoft(e,n,r=!1,a){this.target.set(e.center[0],e.center[1],e.center[2]),this.targetT.copy(this.target),this.widenPanBox(e),this.syncFromCamera(),this.camera.perspective({fov:this.fovY,aspect:this.camera.aspect});let o=this.fovY*de/2,i=r?Math.max(.82,this.camera.aspect||1):this.camera.aspect||1,s=Math.atan(Math.tan(o)*i);this.azT=n??this.azimuth,this.polT=Math.max(15,Math.min(80,a?.polarDeg??55))*de;let l=this.fitDistance(e,o,s,this.azT,this.polT);this.distT=l*Math.max(1.05,Math.min(2,a?.margin??Tn))}fitDistance(e,n,r,a,o){let i=Math.max(1,e.radius),s=Math.max(i/Math.tan(n),i/Math.tan(r)),l=e.box;if(!l)return s;let u=Math.sin(o),p=-u*Math.sin(a),h=-Math.cos(o),v=-u*Math.cos(a);if(Math.abs(h)>.999)return s;let f=-v,c=p,b=Math.hypot(f,c);f/=b,c/=b;let E=-c*h,P=c*p-f*v,L=f*h,C=Math.tan(r),F=Math.tan(n),g=1;for(let A=0;A<8;A++){let S=(A&1?l.max[0]:l.min[0])-e.center[0],w=(A&2?l.max[1]:l.min[1])-e.center[1],R=(A&4?l.max[2]:l.min[2])-e.center[2],T=S*p+w*h+R*v,I=Math.abs(S*f+R*c),Y=Math.abs(S*E+w*P+R*L);g=Math.max(g,I/C-T,Y/F-T)}return Math.min(s,Math.max(g,i*.35))}updateClipping(e){let n=this.camera.position.x-e.center[0],r=this.camera.position.y-e.center[1],a=this.camera.position.z-e.center[2],o=Math.hypot(this.camera.position.x-this.target.x,this.camera.position.y-this.target.y,this.camera.position.z-this.target.z),i=this.interactionEnabled&&Math.abs(o-this.distance)<=this.distance*.01,{near:s,far:l}=Pr(Math.hypot(n,r,a),e.radius,i?this.distance:null);this.camera.perspective({near:s,far:l,aspect:this.camera.aspect})}update(){let e=this.azT-this.azimuth,n=this.polT-this.polar,r=this.distT-this.distance,a=this.targetT.x-this.target.x,o=this.targetT.y-this.target.y,i=this.targetT.z-this.target.z,s=Math.max(1e-4,this.distance*1e-4),l=Math.abs(e)>1e-4||Math.abs(n)>1e-4||Math.abs(r)>1e-4||Math.abs(a)>s||Math.abs(o)>s||Math.abs(i)>s;return this.azimuth+=e*De,this.polar+=n*De,this.distance+=r*De,this.target.x+=a*De,this.target.y+=o*De,this.target.z+=i*De,l&&this.applyPosition(),l}get currentDistance(){return this.distance}syncFromCamera(){let e=this.camera.position.x-this.target.x,n=this.camera.position.y-this.target.y,r=this.camera.position.z-this.target.z,a=Math.hypot(e,n,r)||1,o=Math.max(Tt,Math.min(It,Math.acos(Math.max(-1,Math.min(1,n/a)))));this.distance=this.distT=a,this.polar=this.polT=o,this.azimuth=this.azT=Math.atan2(e,r)}setTarget(e){this.target.set(e[0],e[1],e[2]),this.targetT.copy(this.target)}resumeAfterFlight(e){this.camera.perspective({fov:this.fovY,aspect:this.camera.aspect}),e&&this.target.set(e[0],e[1],e[2]),this.targetT.copy(this.target),this.syncFromCamera()}applyPosition(){let e=Math.sin(this.polar),n=this.target.x+this.distance*e*Math.sin(this.azimuth),r=this.target.y+this.distance*Math.cos(this.polar),a=this.target.z+this.distance*e*Math.cos(this.azimuth);this.camera.position.set(n,r,a),this.camera.lookAt(this.target)}dispose(){this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp),this.canvas.removeEventListener("pointercancel",this.onPointerUp),this.canvas.removeEventListener("wheel",this.onWheel),this.canvas.removeEventListener("keydown",this.onKeyDown),this.canvas.removeEventListener("contextmenu",this.onContextMenu),this.activePointers.clear()}},Cr=.1,Ar=.25;function Pr(t,e,n){let r=Math.max(1,e)*1.18,a=n==null?Ar:Math.max(.05,n*Cr),o=Math.max(a,t-r),i=Math.max(o+10,t+r);return{near:o,far:i}}var st=class{constructor(e){this.rafId=0;this.running=!1;this.lastTime=0;this.fpsEma=0;this.rendered=0;this.tick=e=>{let n=this.lastTime?(e-this.lastTime)/1e3:.016666666666666666;if(this.lastTime=e,n>0){let a=1/n;this.fpsEma=this.fpsEma?this.fpsEma*.9+a*.1:a}this.rendered++,this.frame(n)?this.rafId=requestAnimationFrame(this.tick):(this.running=!1,this.rafId=0)};this.frame=e}requestRender(){this.running||(this.running=!0,this.lastTime=0,this.rafId=requestAnimationFrame(this.tick))}stats(){return{fps:this.running?Math.round(this.fpsEma):0,rendered:this.rendered,idle:!this.running}}stop(){this.rafId&&cancelAnimationFrame(this.rafId),this.rafId=0,this.running=!1}};var Ie=2.5,Er=1.15,Ue=12,_e=22,_n=6,Vn=9.5,Ln=.9,kn=2.2,_t=30,Vt=4,lt=8192;var pi=_e+Vt;function On(t,e){let n=e*1.4,r=e*3.2;if(t<=n)return{scale:1,fade:0,minPixels:Ie};let a=Math.min(1,(t-n)/Math.max(.001,r-n));return{scale:1-a*.4,fade:a*.55,minPixels:Ie+a*(Er-Ie)}}function zn(t,e,n){return!(t>0)||!(e>0)||!(n>0)?!1:e*n/t>=64}function Nn(t,e,n,r,a){if(!(t>0)||!(e>0)||!(n>0)||!(r>0)||!(a>0))return!1;let o=Math.tan(r/2*Math.PI/180);if(!(o>0))return!1;let i=e/(n*o)*(a/2);return Math.PI*i*i/t>=64}var Bn=88,Gn=20,Hn={floor:{size:14,weight:"700",opacity:.98},zone:{size:15,weight:"600",opacity:.95},section:{size:12,weight:"500",opacity:.88},ga:{size:12,weight:"500",opacity:.88},booth:{size:11,weight:"500",opacity:.85},annotation:{size:11,weight:"400",opacity:.75},row:{size:11.5,weight:"700",opacity:.94},seat:{size:12.5,weight:"800",opacity:1}},Fr=640,Rr=.8,Dr=11,Tr="3px 7px",Ir="2px 5px",Wn="rgba(10,14,22,.62)",_r="#f4f7fb",Un=5,Yn=2,Vr=6,Ye=new Set(["row","seat"]),Xn={floor:5,zone:4,section:3,ga:3,booth:2,annotation:1},Ve={row:{x:66,y:20},seat:{x:52,y:22}},kt=sn,Lt=t=>ln(t);function Ot(t,e){let n=Lt(t),r=Lt(e);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}function zt(t,e){let n=/rgba\((\d+),(\d+),(\d+),([\d.]+)\)/.exec(t.replace(/\s/g,""));if(!n)return e;let r=Math.max(0,Math.min(1,Number(n[4])));return[1,2,3].map(a=>Number(n[a])/255*r+e[a-1]*(1-r))}function Lr(t,e=[.04,.06,.1],n=!0){let r=Lt(e)<.42,a=r?"#f4f7fb":"#0b1220",o=r?"rgba(8,12,22,.78)":"rgba(255,255,255,.84)",i=n?zt(o,e):e,s=kt(t),l=n?7:4.5,u=s&&Ot(s,i)>=l?t:a;return r?{ink:u,backing:o,border:"rgba(210,222,245,.24)"}:{ink:u,backing:o,border:"rgba(11,18,32,.22)"}}function kr(t,e=[.04,.06,.1]){let n=zt(Wn,e),r=kt(t);return{ink:r&&Ot(r,n)>=4.5?t:_r,backing:Wn}}var Or='ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',ct=class{constructor(e,n={}){this.nodes=new Map;this.labels=[];this.nodeAppearance=new WeakMap;this.forcedDense=!1;this.selectedSeatLabelIds=new Set;this.narrowStage=!1;this.opts=n,this.root=document.createElement("div"),this.root.setAttribute("data-view3d-labels","");let r=this.root.style;r.position="absolute",r.inset="0",r.pointerEvents="none",r.overflow="hidden",r.fontFamily=n.fontFamily||Or,e.appendChild(this.root)}setVisible(e){this.root.style.visibility=e?"":"hidden"}setLabels(e){this.labels=e;let n=new Set(e.map(r=>r.id));for(let[r,a]of this.nodes)n.has(r)||(a.remove(),this.nodes.delete(r))}setForcedDense(e){this.forcedDense=e}setSelectedSeatIds(e){this.selectedSeatLabelIds=new Set(Array.from(e,n=>`seat:${n}`))}sizeFor(e){let n=Hn[e].size;return!this.narrowStage||Ye.has(e)?n:Math.max(Dr,n*Rr)}qualityEvidence(){let e=this.root.getBoundingClientRect(),n=this.root.style.visibility!=="hidden";return this.labels.map(r=>{let a=this.nodes.get(r.id),o=a?.getBoundingClientRect(),i=!!(n&&a&&a.style.display!=="none"&&o&&o.width>0&&o.height>0);return{id:r.id,kind:r.kind,text:r.text,visible:i,renderedFontPx:a&&Number.parseFloat(a.style.fontSize)||0,contrast:a?Number(a.dataset.qualityContrast??0):0,...i&&o?{screenBox:{x:o.x-e.x,y:o.y-e.y,width:o.width,height:o.height}}:{}}})}update(e,n,r,a,o,i){if(!this.labels.length)return;this.narrowStage=n>0&&n<Fr;let s=vn(a,o,{hasZoneLabels:this.labels.some(g=>g.kind==="zone")});this.forcedDense&&(s.add("row"),s.add("seat"));let l=[];for(let g of this.labels){if(!s.has(g.kind)&&!(g.kind==="seat"&&this.selectedSeatLabelIds.has(g.id)))continue;let A=xe(e,g.anchor,n,r);if(!A.visible)continue;let S=Ye.has(g.kind),w=this.sizeFor(g.kind),R=xn(g.text,w,!S)+(S?Un*2:0);if(g.kind==="seat"&&g.seatWidthM!==void 0&&!this.selectedSeatLabelIds.has(g.id)&&Mn(e,g.anchor,g.seatWidthM,n)<Math.max(22,R))continue;let T=bn(A,R/2,w/2+(S?Yn:4),n,r),I=i?Math.hypot(g.anchor[0]-i[0],g.anchor[1]-i[1],g.anchor[2]-i[2]):1;l.push({label:g,screen:T,focus:wn(T,I,n,r),halfWidth:R/2,...this.selectedSeatLabelIds.has(g.id)?{priority:1}:{}})}let u=fn(l.filter(g=>g.label.kind==="floor"),n),p=[...l.filter(g=>!Ye.has(g.label.kind)&&g.label.kind!=="floor"),...u],h=Sn(n),v=rt(l.filter(g=>g.label.kind==="seat"&&this.selectedSeatLabelIds.has(g.label.id)),Ve.seat.x,Ve.seat.y,h.seat),f=gn(p,Bn,Gn).filter(g=>!v.some(A=>yn(g,A,Bn,Gn))),c=rt(l.filter(g=>g.label.kind==="row"),Ve.row.x,Ve.row.y,h.row,[...f,...v]),b=rt(l.filter(g=>g.label.kind==="seat"&&!this.selectedSeatLabelIds.has(g.label.id)),Ve.seat.x,Ve.seat.y,h.seat-v.length,[...f,...v,...c]),E=[...f,...c,...v,...b],P=new Set(E.map(g=>g.label.id));for(let{label:g,screen:A}of E){let w=this.nodeFor(g).style;w.display="",w.transform=`translate(-50%, -50%) translate(${A.x.toFixed(1)}px, ${A.y.toFixed(1)}px)`}let C=E.filter(({label:g})=>!Ye.has(g.kind)).sort((g,A)=>Xn[A.label.kind]-Xn[g.label.kind]||g.screen.depth-A.screen.depth||g.focus-A.focus).flatMap(({label:g})=>{let A=this.nodes.get(g.id);return A&&A.style.display!=="none"?[{node:A,box:A.getBoundingClientRect()}]:[]}),F=[];for(let{node:g,box:A}of C)F.some(w=>A.left<w.right+3&&A.right+3>w.left&&A.top<w.bottom+3&&A.bottom+3>w.top)?g.style.display="none":F.push(A);for(let[g,A]of this.nodes)P.has(g)||(A.style.display="none")}nodeFor(e){let n=this.nodes.get(e.id);if(!n){n=document.createElement("div");let b=n.style;b.position="absolute",b.left="0",b.top="0",b.whiteSpace="nowrap",b.textShadow="0 1px 3px rgba(0,0,0,0.85), 0 0 8px rgba(0,0,0,0.55)",b.display="none",this.root.appendChild(n),this.nodes.set(e.id,n)}let r=this.selectedSeatLabelIds.has(e.id),a=this.nodeAppearance.get(n);if(a&&a.text===e.text&&a.kind===e.kind&&a.color===e.color&&a.selected===r&&a.narrow===this.narrowStage)return n;this.nodeAppearance.set(n,{text:e.text,kind:e.kind,color:e.color,selected:r,narrow:this.narrowStage}),n.textContent=e.text,n.setAttribute("data-label-kind",e.kind),n.toggleAttribute("data-selected-seat",r);let o=Hn[e.kind],i=n.style;i.fontSize=`${this.sizeFor(e.kind)}px`,i.fontWeight=r?"800":o.weight,i.opacity=r?"1":String(o.opacity);let s=Ye.has(e.kind),l=!s,u=Lr(e.color??this.opts.ink,this.opts.backgroundRgb,!0),p=s?kr(e.color??this.opts.ink,this.opts.backgroundRgb):u;i.color=r?"#ecf8ff":p.ink,i.background=r?"rgba(10,28,45,.9)":p.backing,i.border=r?"1px solid rgba(89,199,255,.92)":l?`1px solid ${u.border}`:"",i.borderRadius=r||l?"999px":`${Vr}px`;let h=this.narrowStage?Ir:Tr;i.padding=r||l?h:`${Yn}px ${Un}px`,i.lineHeight=s?"1.1":"",i.boxShadow=r?"0 0 0 2px rgba(41,176,255,.18), 0 5px 14px rgba(0,0,0,.35)":l?"0 3px 10px rgba(0,0,0,.24)":"0 1px 4px rgba(0,0,0,.28)",i.letterSpacing=e.kind==="zone"||e.kind==="floor"?"0.08em":"0.02em";let v=this.opts.backgroundRgb??[.04,.06,.1],f=kt(r?"#ecf8ff":p.ink)??[1,1,1],c=zt(r?"rgba(10,28,45,.9)":p.backing,v);return n.dataset.qualityContrast=Ot(f,c).toFixed(3),i.textTransform=e.kind==="zone"||e.kind==="floor"?"uppercase":"",n}dispose(){this.root.remove(),this.nodes.clear()}};var zr=1;var Nr=new Set(["floor","zone","section","ga","booth","annotation"]);function Br(t){return t.every(e=>Number.isFinite(e))}function Gr(t,e){return t.x<e.x+e.width&&t.x+t.width>e.x&&t.y<e.y+e.height&&t.y+t.height>e.y}function qn(t){return t.length?Math.round(Math.min(...t)*100)/100:null}function Pe(t){return Math.round(t*1e4)/1e4}function Hr(t){if(t)return{box:{x:Pe(t.box.x),y:Pe(t.box.y),width:Pe(t.box.width),height:Pe(t.box.height)},horizontalFillRatio:Pe(t.horizontalFillRatio),verticalFillRatio:Pe(t.verticalFillRatio),visibleAreaRatio:Pe(t.visibleAreaRatio),clippedEdges:[...t.clippedEdges]}}function fe(t,e,n){return n.length?{code:t,message:e,count:n.length,samples:n.slice(0,20)}:null}function Nt(t){let e=t.labels.filter(s=>s.visible&&s.screenBox),n=e.filter(s=>Nr.has(s.kind)),r=t.scene.floorCount>1?t.scene.floorCount:t.scene.zoneCount||t.scene.sectionCount,a=[];for(let s=0;s<n.length;s+=1)for(let l=0;l<s;l+=1)Gr(n[s].screenBox,n[l].screenBox)&&a.push({primaryId:n[s].id,primaryLabel:n[s].text,secondaryId:n[l].id});let o=[...t.camera.position,t.camera.distance,t.camera.verticalFovDeg],i=[fe("webgl2-unavailable","The venue scene must render through WebGL2",t.context.webgl2?[]:[{primaryId:"renderer",primaryLabel:"WebGL2"}]),fe("context-lost","The WebGL context must be live at capture",t.context.lost?[{primaryId:"renderer",primaryLabel:"context lost"}]:[]),fe("frame-not-stable","The captured 3D frame must be rendered and parked",t.frame.rendered>0&&t.frame.idle?[]:[{primaryId:"renderer",primaryLabel:"unstable frame"}]),fe("viewport-empty","The 3D viewport must have visible dimensions",t.viewport.width>1&&t.viewport.height>1?[]:[{primaryId:"viewport",primaryLabel:`${t.viewport.width}\xD7${t.viewport.height}`}]),fe("camera-invalid","The capture camera must have a finite physical pose",Br(o)&&t.camera.distance>0&&t.camera.verticalFovDeg>0&&t.camera.verticalFovDeg<180?[]:[{primaryId:"camera",primaryLabel:"invalid pose"}]),fe("authored-relief-not-visible","Authored 3D height or rake must produce visible screen-space relief",!t.scene.authoredRelief||t.scene.renderedVerticalSpanM>.05&&t.scene.projectedReliefPx>=2?[]:[{primaryId:"scene",primaryLabel:"authored relief",measured:t.scene.projectedReliefPx,minimum:2}]),fe("hierarchy-label-missing","A venue with authored hierarchy must show at least one structural label",r===0||n.length>0?[]:[{primaryId:"labels",primaryLabel:`${r} expected hierarchy labels`}]),fe("hierarchy-label-undersized","Visible 3D hierarchy labels must remain readable",n.filter(s=>s.renderedFontPx<11).map(s=>({primaryId:s.id,primaryLabel:s.text,measured:s.renderedFontPx,minimum:11}))),fe("hierarchy-label-contrast-low","Visible 3D hierarchy labels must meet text contrast",n.filter(s=>s.contrast<4.5).map(s=>({primaryId:s.id,primaryLabel:s.text,measured:s.contrast,minimum:4.5}))),fe("hierarchy-label-collision","Visible 3D hierarchy labels must not overlap",a)].filter(s=>!!s);return{version:1,state:"venue3d",passed:i.length===0,resolvedRules:["rendered-3d-webgl-context","rendered-3d-stable-frame","rendered-3d-camera-pose","rendered-3d-relief-projection","rendered-3d-label-size","rendered-3d-label-contrast","rendered-3d-label-collision"],viewport:t.viewport,context:t.context,frame:t.frame,camera:t.camera,scene:t.scene,composition:{visibleLabels:e.map(({id:s,kind:l,text:u})=>({id:s,kind:l,text:u})).sort((s,l)=>s.kind.localeCompare(l.kind)||s.id.localeCompare(l.id)),framing:Hr(t.framing)},metrics:{minimumHierarchyFontPx:qn(n.map(s=>s.renderedFontPx)),minimumHierarchyContrast:qn(n.map(s=>s.contrast)),projectedReliefPx:Math.round(t.scene.projectedReliefPx*100)/100},findings:i}}function jn(t,e,n){t.fill(0);for(let r=0;r<Math.min(n,e.length);r++)t[e[r]]=1}import{Geometry as Xe,Mesh as qe,Program as ma,Texture as ha,Transform as lo}from"ogl";import{Program as Ee}from"ogl";var ut=`
|
|
1
|
+
import{A as zn,B as Nn,C as Ye,D as Vt,E as Hn,F as Gn,a as We,b as Ce,c as st,d as _t,e as An,f as Pn,g as be,h as Cn,i as En,j as lt,k as Te,l as Ue,m as Rn,n as It,o as Lr,p as Tn,q as Dn,r as Fn,s as _n,t as ge,u as In,v as Vn,w as Ln,x as kn,y as On,z as ct}from"../chunk-2MXDWZQ4.js";import"../chunk-2P72QUJR.js";import"../chunk-OLGPAFXW.js";import"../chunk-QJXSZT3H.js";import"../chunk-ASIIXY5M.js";import"../chunk-M5VINTGE.js";import"../chunk-P4C24CIZ.js";import"../chunk-IW7QZIMF.js";import"../chunk-Z43H6AWN.js";import"../chunk-4N5CHKHD.js";import"../chunk-TQN2VWQO.js";import"../chunk-5BMXWOE7.js";import"../chunk-FLMKHAUT.js";import{Va as Sn}from"../chunk-VAI2VDQR.js";import"../chunk-5ITK5236.js";import{d as wn,l as Mn}from"../chunk-JBOTRSMY.js";import"../chunk-CRCGO52K.js";function Bn(t,e,n){let r=Math.floor(e.length/3),i=n.center[0],o=n.center[2];if(r>0){let l=Math.max(1,Math.floor(r/4e3)),u=0,m=0,d=0;for(let p=0;p<r;p+=l)u+=e[p*3],m+=e[p*3+2],d++;i=u/d,o=m/d}let a=t[0]-i,s=t[2]-o;return Math.hypot(a,s)>n.radius*.12?Math.atan2(a,s):void 0}var Lt=78,Wn=18;function Un(){let t=[],e=[],n=[],r=[],i=[],o=[{n:[1,0,0],c:[[1,0,0],[1,1,0],[1,1,1],[1,0,1]]},{n:[-1,0,0],c:[[0,0,1],[0,1,1],[0,1,0],[0,0,0]]},{n:[0,1,0],c:[[0,1,0],[0,1,1],[1,1,1],[1,1,0]]},{n:[0,-1,0],c:[[0,0,1],[0,0,0],[1,0,0],[1,0,1]]},{n:[0,0,1],c:[[0,0,1],[1,0,1],[1,1,1],[0,1,1]]},{n:[0,0,-1],c:[[1,0,0],[0,0,0],[0,1,0],[1,1,0]]}];for(let s of[{part:1,min:[-1,.36,-.95],max:[1,.45,1]},{part:2,min:[-1,Ce,-1],max:[1,st,-.72]}])for(let l of o){let u=t.length/3,m=l.n[1]+(s.part===2?Math.abs(l.n[0])*(1-_t)/(st-Ce):0),d=Math.hypot(l.n[0],m,l.n[2]),p=[l.n[0]/d,m/d,l.n[2]/d];for(let[f,c]of l.c.entries()){let g=c.map((S,w)=>s.min[w]+S*(s.max[w]-s.min[w]));s.part===2&&(g[0]*=1-c[1]*(1-_t)),t.push(...g),e.push(...p),n.push(s.part),r.push(...[[-1,-1],[1,-1],[1,1],[-1,1]][f])}i.push(u,u+1,u+2,u,u+2,u+3)}let a=t.length/3;for(let[s,l]of[[-1,-1],[1,-1],[1,1],[-1,1]])t.push(s,l,0),e.push(0,1,0),n.push(0),r.push(s,l);return i.push(a,a+1,a+2,a,a+2,a+3),i.push(...i.slice(12,18),...i.slice(60,66),...i.slice(72,78)),{position:new Float32Array(t),normal:new Float32Array(e),surface:new Float32Array(n),uv:new Float32Array(r),index:new Uint16Array(i)}}import{Renderer as kr}from"ogl";function Or(){let t=typeof window<"u"&&window.devicePixelRatio||1,e=navigator.deviceMemory,n=typeof e=="number"&&e<=4?1.5:2;return Math.min(t,n)}var ut=class{constructor(e,n){this.clearRgb=[0,0,0];this.container=e,this.canvas=document.createElement("canvas"),this.canvas.style.display="block",this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.touchAction="none",this.canvas.tabIndex=0,this.canvas.setAttribute("role","application"),this.canvas.setAttribute("aria-label","Interactive 3D venue. Drag or use arrow keys to look around; pinch, scroll, plus or minus to zoom."),this.renderer=new kr({canvas:this.canvas,dpr:Or(),alpha:!1,antialias:!1,depth:!0,stencil:!1,powerPreference:"high-performance",webgl:2}),this.gl=this.renderer.gl,this.clearRgb=[lt.top[0],lt.top[1],lt.top[2]],this.gl.clearColor(this.clearRgb[0],this.clearRgb[1],this.clearRgb[2],1),e.appendChild(this.canvas),this.lostHandler=r=>{r.preventDefault(),n.onContextLost()},this.restoredHandler=()=>n.onContextRestored(),this.canvas.addEventListener("webglcontextlost",this.lostHandler,!1),this.canvas.addEventListener("webglcontextrestored",this.restoredHandler,!1),this.resize()}setClearColor(e){this.clearRgb=[e[0],e[1],e[2]],this.gl.clearColor(e[0],e[1],e[2],1)}get clearColor(){return this.clearRgb}resize(){let e=Math.max(1,this.container.clientWidth||this.canvas.clientWidth||1),n=Math.max(1,this.container.clientHeight||this.canvas.clientHeight||1);return this.renderer.setSize(e,n),{width:e,height:n}}get pixelHeight(){return this.renderer.height*this.renderer.dpr}get aspect(){return this.renderer.width/Math.max(1,this.renderer.height)}dispose(){this.canvas.removeEventListener("webglcontextlost",this.lostHandler,!1),this.canvas.removeEventListener("webglcontextrestored",this.restoredHandler,!1);let e=this.gl.getExtension("WEBGL_lose_context");e&&e.loseContext(),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)}simulateContextLossCycle(){let e=this.gl.getExtension("WEBGL_lose_context");e&&(e.loseContext(),setTimeout(()=>{e.restoreContext&&e.restoreContext()},300))}};import{Camera as zr,Vec3 as kt}from"ogl";var se=Math.PI/180,Ot=15*se,zt=80*se,De=.12,Yn=35,Nt=1.25,Xn=.006,Nr=4,Fe=.82,Xe=1/Fe,Hr=.12,Gr=2;function Br(t,e){return{azimuth:t*Xn,polar:-e*Xn}}function Wr(t,e,n){if(!n)return 1;let r=e[0]-t[0],i=e[2]-t[2];return(n[0]-e[0])*r+(n[2]-e[2])*i<0?-1:1}function qn(t,e,n){let r=Math.max(Gr,Math.max(1,e)*Hr),i=n*Nr;return{minDist:t?Math.min(t.minDist,r):r,maxDist:t?Math.max(t.maxDist,i):i}}var Ur=1.5;function Yr(t,e,n){let r=Math.max(1,n)*Ur;if(!t)return{anchor:[e[0],e[1],e[2]],limit:r};let[i,o,a]=t.anchor,s=e[1]-o,l=Math.max(Math.abs(e[0]-i),Math.abs(e[2]-a),s>=0?s:-s*2);return{anchor:t.anchor,limit:Math.max(t.limit,l+r)}}function jn(t,e,n,r,i,o,a,s){let l=Math.sin(n),u=[l*Math.sin(e),Math.cos(n),l*Math.cos(e)],m=[t[0]+r*u[0],t[1]+r*u[1],t[2]+r*u[2]],d=[-u[0],-u[1],-u[2]],p=[-d[2],0,d[0]],f=Math.hypot(p[0],p[2])||1;p=[p[0]/f,0,p[2]/f];let c=[p[1]*d[2]-p[2]*d[1],p[2]*d[0]-p[0]*d[2],p[0]*d[1]-p[1]*d[0]],g=Math.tan(i*se/2),S=g*(o>0?o:1),w=[0,1,2].map(E=>d[E]+a*S*p[E]+s*g*c[E]);if(w[1]>=-1e-6)return null;let I=(t[1]-m[1])/w[1],P=Math.hypot(w[0],w[1],w[2]);return!(I>0)||I*P>r*Xr?null:[m[0]+w[0]*I,t[1],m[2]+w[2]*I]}var Kn=3,Xr=4,dt=class{constructor(e,n,r,i){this.fovY=Yn;this.target=new kt;this.azimuth=-30*se;this.polar=55*se;this.distance=10;this.azT=-30*se;this.polT=55*se;this.distT=10;this.minDist=1;this.maxDist=100;this.envelope=null;this.gestureFired=!1;this.interactionEnabled=!0;this.dragging=!1;this.panning=!1;this.lastX=0;this.lastY=0;this.activePointers=new Map;this.pinchDist=0;this.pinchCx=0;this.pinchCy=0;this.targetT=new kt;this.panAnchor=new kt;this.panLimit=0;this.panBox=null;this.grabSign=1;this.zoomPointResolver=null;this.primaryDragMode="orbit";this.camera=new zr(e,{fov:Yn,near:.1,far:5e3,aspect:1}),this.canvas=n,this.requestRender=r,this.onGesture=i,this.onPointerDown=o=>{if(this.interactionEnabled){try{this.canvas.setPointerCapture?.(o.pointerId)}catch{}if(this.activePointers.set(o.pointerId,{x:o.clientX,y:o.clientY}),this.activePointers.size===1){let a=o.button===2||o.button===1,s=o.button===0&&(o.shiftKey?this.primaryDragMode==="orbit":this.primaryDragMode==="pan");this.panning=a||s,this.dragging=!this.panning,this.dragging&&(this.grabSign=this.grabSignAt(o.clientX,o.clientY)),this.lastX=o.clientX,this.lastY=o.clientY}else if(this.activePointers.size===2){this.dragging=!1,this.panning=!1,this.pinchDist=this.currentPinchDistance();let a=this.pinchCentroid();this.pinchCx=a.x,this.pinchCy=a.y}}},this.onPointerMove=o=>{if(!this.interactionEnabled||!this.activePointers.has(o.pointerId))return;if(this.activePointers.set(o.pointerId,{x:o.clientX,y:o.clientY}),this.activePointers.size>=2){let u=this.currentPinchDistance(),m=this.pinchCentroid();this.pinchDist>0&&(this.dollyAt(Math.exp((this.pinchDist-u)*.005),m.x,m.y),this.fireGesture()),this.pinchDist=u,this.panBy(m.x-this.pinchCx,m.y-this.pinchCy),this.pinchCx=m.x,this.pinchCy=m.y;return}let a=o.clientX-this.lastX,s=o.clientY-this.lastY;if(this.panning){this.lastX=o.clientX,this.lastY=o.clientY,(a!==0||s!==0)&&(this.panBy(a,s),this.fireGesture());return}if(!this.dragging)return;this.lastX=o.clientX,this.lastY=o.clientY,(a!==0||s!==0)&&this.fireGesture();let l=Br(a,s);this.azT+=l.azimuth*this.grabSign,this.polT=Math.max(Ot,Math.min(zt,this.polT+l.polar)),this.requestRender()},this.onPointerUp=o=>{this.activePointers.delete(o.pointerId);try{this.canvas.releasePointerCapture?.(o.pointerId)}catch{}this.activePointers.size<2&&(this.pinchDist=0),this.activePointers.size===0&&(this.dragging=!1,this.panning=!1)},this.onContextMenu=o=>{o.preventDefault()},this.onWheel=o=>{if(o.preventDefault(),!this.interactionEnabled)return;let a=o.deltaMode===1?16:o.deltaMode===2?100:1,s=Math.max(-2,Math.min(2,o.deltaY*a/100));this.dollyAt(Math.exp(s*.22),o.clientX,o.clientY),this.fireGesture()},this.onKeyDown=o=>{if(!this.interactionEnabled)return;let a=7*se;if(o.shiftKey&&(o.key==="ArrowLeft"||o.key==="ArrowRight"||o.key==="ArrowUp"||o.key==="ArrowDown"))this.panBy(o.key==="ArrowLeft"?-32:o.key==="ArrowRight"?32:0,o.key==="ArrowUp"?-32:o.key==="ArrowDown"?32:0);else if(o.key==="ArrowLeft"||o.key==="ArrowRight")this.azT+=o.key==="ArrowLeft"?-a:a;else if(o.key==="ArrowUp"||o.key==="ArrowDown")this.polT=Math.max(Ot,Math.min(zt,this.polT+(o.key==="ArrowUp"?-a:a)));else if(o.key==="+"||o.key==="=")this.dollyBy(Fe);else if(o.key==="-"||o.key==="_")this.dollyBy(Xe);else return;o.preventDefault(),this.fireGesture(),this.requestRender()},n.addEventListener("pointerdown",this.onPointerDown),n.addEventListener("pointermove",this.onPointerMove),n.addEventListener("pointerup",this.onPointerUp),n.addEventListener("pointercancel",this.onPointerUp),n.addEventListener("wheel",this.onWheel,{passive:!1}),n.addEventListener("keydown",this.onKeyDown),n.addEventListener("contextmenu",this.onContextMenu)}pinchCentroid(){let e=[...this.activePointers.values()];if(!e.length)return{x:0,y:0};let n=0,r=0;for(let i of e)n+=i.x,r+=i.y;return{x:n/e.length,y:r/e.length}}panBy(e,n){let r=this.canvas.clientHeight||1,i=2*this.distance*Math.tan(this.fovY*se/2)/r,o=Math.sin(this.azimuth),a=Math.cos(this.azimuth),s=a,l=-o,u=Math.cos(this.polar),m=Math.sin(this.polar),d=-o*u,p=-a*u;this.targetT.x+=(-e*s+n*d)*i,this.targetT.z+=(-e*l+n*p)*i,this.targetT.y+=n*m*i,this.clampPan(),this.requestRender()}widenPanBox(e){this.panBox=Yr(this.panBox,e.center,e.radius),this.panAnchor.set(this.panBox.anchor[0],this.panBox.anchor[1],this.panBox.anchor[2]),this.panLimit=this.panBox.limit}clampPan(){if(this.panLimit<=0)return;let e=this.panLimit,n=this.panAnchor.x,r=this.panAnchor.y,i=this.panAnchor.z;this.targetT.x=Math.max(n-e,Math.min(n+e,this.targetT.x)),this.targetT.z=Math.max(i-e,Math.min(i+e,this.targetT.z)),this.targetT.y=Math.max(r-e*.5,Math.min(r+e,this.targetT.y))}fireGesture(){this.gestureFired||(this.gestureFired=!0,this.onGesture?.())}currentPinchDistance(){let e=[...this.activePointers.values()];return e.length<2?0:Math.hypot(e[0].x-e[1].x,e[0].y-e[1].y)}dollyBy(e){this.distT=Math.max(this.minDist,Math.min(this.maxDist,this.distT*e)),this.requestRender()}dollyAt(e,n,r){let i=this.distT,o=this.canvas.getBoundingClientRect?.(),a=this.zoomPointResolver?.(n,r)??null;if(a){this.distT=Math.max(Kn,Math.min(this.maxDist,this.distT*e)),this.minDist=Math.min(this.minDist,Math.max(Kn,this.distT)),this.requestRender(),this.scaleTargetAbout(a,this.distT/i);return}let s=o&&o.width>0&&o.height>0?jn([this.targetT.x,this.targetT.y,this.targetT.z],this.azT,this.polT,this.distT,this.fovY,this.camera.aspect||o.width/o.height,(n-o.left)/o.width*2-1,1-(r-o.top)/o.height*2):null;this.dollyBy(e),s&&this.scaleTargetAbout(s,this.distT/i)}scaleTargetAbout(e,n){!Number.isFinite(n)||n===1||(this.targetT.x=e[0]+(this.targetT.x-e[0])*n,this.targetT.y=e[1]+(this.targetT.y-e[1])*n,this.targetT.z=e[2]+(this.targetT.z-e[2])*n,this.clampPan())}grabSignAt(e,n){let r=this.canvas.getBoundingClientRect?.(),i=this.zoomPointResolver?.(e,n)??(r&&r.width>0&&r.height>0?jn([this.target.x,this.target.y,this.target.z],this.azimuth,this.polar,this.distance,this.fovY,this.camera.aspect||r.width/r.height,(e-r.left)/r.width*2-1,1-(n-r.top)/r.height*2):null),o=this.camera.position;return Wr([o.x,o.y,o.z],[this.target.x,this.target.y,this.target.z],i)}setZoomPointResolver(e){this.zoomPointResolver=e}zoomBy(e){this.interactionEnabled&&(this.dollyBy(e),this.fireGesture())}dollyLimitState(){return{atMin:this.distT<=this.minDist+1e-6,atMax:this.distT>=this.maxDist-1e-6}}setPrimaryDragMode(e){this.primaryDragMode=e}setInteractionEnabled(e){this.interactionEnabled=e,!e&&(this.activePointers.clear(),this.dragging=!1,this.panning=!1,this.pinchDist=0)}frame(e,n=!1,r,i=!1,o){this.camera.perspective({fov:this.fovY,aspect:this.camera.aspect}),this.target.set(e.center[0],e.center[1],e.center[2]),this.targetT.copy(this.target),this.widenPanBox(e);let a=Math.max(1,e.radius),s=this.fovY*se/2,l=i?Math.max(.82,this.camera.aspect||1):this.camera.aspect||1,u=Math.atan(Math.tan(s)*l);this.azT=r??-30*se,this.polT=Math.max(15,Math.min(80,o?.polarDeg??55))*se;let m=this.fitDistance(e,s,u,this.azT,this.polT);this.distT=m*Math.max(1.05,Math.min(2,o?.margin??Nt)),this.envelope=qn(this.envelope,a,m),this.minDist=this.envelope.minDist,this.maxDist=this.envelope.maxDist,n?(this.azimuth=this.azT,this.polar=12*se,this.distance=this.distT*1.7):(this.azimuth=this.azT,this.polar=this.polT,this.distance=this.distT),this.applyPosition()}setAspect(e){if(!(e>0)||!Number.isFinite(e))return;let n=this.camera.aspect;if(this.interactionEnabled&&n>0){let r=Math.min(n,1)/Math.min(e,1);this.distance*=r,this.distT*=r,this.maxDist=Math.max(this.maxDist,this.distance,this.distT),this.applyPosition()}this.camera.perspective({aspect:e})}glideTo(e,n){this.syncFromCamera(),this.camera.perspective({fov:this.fovY,aspect:this.camera.aspect}),this.widenPanBox(e),this.targetT.set(e.center[0],e.center[1],e.center[2]);let r=this.fovY*se/2,i=Math.atan(Math.tan(r)*(this.camera.aspect||1));this.azT=this.azimuth,this.polT=Math.max(15,Math.min(80,n?.polarDeg??55))*se;let o=this.fitDistance(e,r,i,this.azT,this.polT);this.distT=o*Math.max(1.05,Math.min(2,n?.margin??Nt)),this.envelope=qn(this.envelope,Math.max(1,e.radius),o),this.minDist=this.envelope.minDist,this.maxDist=this.envelope.maxDist,this.requestRender()}frameSoft(e,n,r=!1,i){this.target.set(e.center[0],e.center[1],e.center[2]),this.targetT.copy(this.target),this.widenPanBox(e),this.syncFromCamera(),this.camera.perspective({fov:this.fovY,aspect:this.camera.aspect});let o=this.fovY*se/2,a=r?Math.max(.82,this.camera.aspect||1):this.camera.aspect||1,s=Math.atan(Math.tan(o)*a);this.azT=n??this.azimuth,this.polT=Math.max(15,Math.min(80,i?.polarDeg??55))*se;let l=this.fitDistance(e,o,s,this.azT,this.polT);this.distT=l*Math.max(1.05,Math.min(2,i?.margin??Nt))}fitDistance(e,n,r,i,o){let a=Math.max(1,e.radius),s=Math.max(a/Math.tan(n),a/Math.tan(r)),l=e.box;if(!l)return s;let u=Math.sin(o),m=-u*Math.sin(i),d=-Math.cos(o),p=-u*Math.cos(i);if(Math.abs(d)>.999)return s;let f=-p,c=m,g=Math.hypot(f,c);f/=g,c/=g;let S=-c*d,w=c*m-f*p,I=f*d,P=Math.tan(r),E=Math.tan(n),W=1;for(let H=0;H<8;H++){let v=(H&1?l.max[0]:l.min[0])-e.center[0],y=(H&2?l.max[1]:l.min[1])-e.center[1],T=(H&4?l.max[2]:l.min[2])-e.center[2],R=v*m+y*d+T*p,U=Math.abs(v*f+T*c),F=Math.abs(v*S+y*w+T*I);W=Math.max(W,U/P-R,F/E-R)}return Math.min(s,Math.max(W,a*.35))}updateClipping(e){let n=this.camera.position.x-e.center[0],r=this.camera.position.y-e.center[1],i=this.camera.position.z-e.center[2],o=Math.hypot(this.camera.position.x-this.target.x,this.camera.position.y-this.target.y,this.camera.position.z-this.target.z),a=this.interactionEnabled&&Math.abs(o-this.distance)<=this.distance*.01,{near:s,far:l}=Kr(Math.hypot(n,r,i),e.radius,a?this.distance:null);this.camera.perspective({near:s,far:l,aspect:this.camera.aspect})}update(){let e=this.azT-this.azimuth,n=this.polT-this.polar,r=this.distT-this.distance,i=this.targetT.x-this.target.x,o=this.targetT.y-this.target.y,a=this.targetT.z-this.target.z,s=Math.max(1e-4,this.distance*1e-4),l=Math.abs(e)>1e-4||Math.abs(n)>1e-4||Math.abs(r)>1e-4||Math.abs(i)>s||Math.abs(o)>s||Math.abs(a)>s;return this.azimuth+=e*De,this.polar+=n*De,this.distance+=r*De,this.target.x+=i*De,this.target.y+=o*De,this.target.z+=a*De,l&&this.applyPosition(),l}get currentAzimuth(){return this.azimuth}get currentDistance(){return this.distance}syncFromCamera(){let e=this.camera.position.x-this.target.x,n=this.camera.position.y-this.target.y,r=this.camera.position.z-this.target.z,i=Math.hypot(e,n,r)||1,o=Math.max(Ot,Math.min(zt,Math.acos(Math.max(-1,Math.min(1,n/i)))));this.distance=this.distT=i,this.polar=this.polT=o,this.azimuth=this.azT=Math.atan2(e,r)}setTarget(e){this.target.set(e[0],e[1],e[2]),this.targetT.copy(this.target)}resumeAfterFlight(e){this.camera.perspective({fov:this.fovY,aspect:this.camera.aspect}),e&&this.target.set(e[0],e[1],e[2]),this.targetT.copy(this.target),this.syncFromCamera()}applyPosition(){let e=Math.sin(this.polar),n=this.target.x+this.distance*e*Math.sin(this.azimuth),r=this.target.y+this.distance*Math.cos(this.polar),i=this.target.z+this.distance*e*Math.cos(this.azimuth);this.camera.position.set(n,r,i),this.camera.lookAt(this.target)}dispose(){this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp),this.canvas.removeEventListener("pointercancel",this.onPointerUp),this.canvas.removeEventListener("wheel",this.onWheel),this.canvas.removeEventListener("keydown",this.onKeyDown),this.canvas.removeEventListener("contextmenu",this.onContextMenu),this.activePointers.clear()}},qr=.1,jr=.25;function Kr(t,e,n){let r=Math.max(1,e)*1.18,i=n==null?jr:Math.max(.05,n*qr),o=Math.max(i,t-r),a=Math.max(o+10,t+r);return{near:o,far:a}}var mt=class{constructor(e){this.rafId=0;this.running=!1;this.lastTime=0;this.fpsEma=0;this.rendered=0;this.tick=e=>{let n=this.lastTime?(e-this.lastTime)/1e3:.016666666666666666;if(this.lastTime=e,n>0){let i=1/n;this.fpsEma=this.fpsEma?this.fpsEma*.9+i*.1:i}this.rendered++,this.frame(n)?this.rafId=requestAnimationFrame(this.tick):(this.running=!1,this.rafId=0)};this.frame=e}requestRender(){this.running||(this.running=!0,this.lastTime=0,this.rafId=requestAnimationFrame(this.tick))}stats(){return{fps:this.running?Math.round(this.fpsEma):0,rendered:this.rendered,idle:!this.running}}stop(){this.rafId&&cancelAnimationFrame(this.rafId),this.rafId=0,this.running=!1}};var _e=2.5,$r=1.15,qe=12,Ie=22,$n=6,Qn=9.5,Zn=.9,Jn=2.2,Ht=30,Gt=4,ht=8192;var ms=Ie+Gt;function eo(t,e){let n=e*1.4,r=e*3.2;if(t<=n)return{scale:1,fade:0,minPixels:_e};let i=Math.min(1,(t-n)/Math.max(.001,r-n));return{scale:1-i*.4,fade:i*.55,minPixels:_e+i*($r-_e)}}function to(t,e,n){return!(t>0)||!(e>0)||!(n>0)?!1:e*n/t>=64}var Qr=12;function no(t,e,n,r,i){if(!(t>0)||!(e>0)||!(n>0)||!(r>0)||!(i>0))return!1;let o=Math.tan(r/2*Math.PI/180);if(!(o>0))return!1;let a=e/(n*o)*(i/2);return Math.PI*a*a/t>=Qr}import{Geometry as Zr,Mesh as Jr,Program as ei,Transform as ti}from"ogl";var ni=.05,oi=.6,ri=12,ii=1.6,ai=1,si=2.5,li=650,oo=24;function ci(t){let e=[],n=[],r=[],i=(d,p,f)=>{e.push(...d),n.push(...p),r.push(f)};for(let d=0;d<16;d++){let p=d/16*Math.PI*2,f=(d+1)/16*Math.PI*2,c=P=>[Math.cos(P),0,Math.sin(P)],g=[Math.cos(p)*.012,0,Math.sin(p)*.012],S=[Math.cos(f)*.012,0,Math.sin(f)*.012],w=[Math.cos(p)*.03,1,Math.sin(p)*.03],I=[Math.cos(f)*.03,1,Math.sin(f)*.03];i(g,c(p),0),i(w,c(p),0),i(I,c(f),0),i(g,c(p),0),i(I,c(f),0),i(S,c(f),0)}let l=.16,u=.24,m=.01;for(let d=0;d<48;d++){let p=d/48*Math.PI*2,f=(d+1)/48*Math.PI*2,c=[Math.cos(p)*l,m,Math.sin(p)*l],g=[Math.cos(p)*u,m,Math.sin(p)*u],S=[Math.cos(f)*u,m,Math.sin(f)*u],w=[Math.cos(f)*l,m,Math.sin(f)*l];for(let I of[c,g,S,c,S,w])i(I,[0,1,0],1)}return new Zr(t,{position:{size:3,data:new Float32Array(e)},normal:{size:3,data:new Float32Array(n)},part:{size:1,data:new Float32Array(r)}})}var ui=`#version 300 es
|
|
2
|
+
precision highp float;
|
|
3
|
+
in vec3 position; in vec3 normal; in float part;
|
|
4
|
+
uniform mat4 modelViewMatrix; uniform mat4 projectionMatrix; uniform mat3 normalMatrix;
|
|
5
|
+
uniform vec3 uSeat; uniform float uHeight; uniform float uLift; uniform float uRingScale;
|
|
6
|
+
out vec3 vNormal; out float vPart;
|
|
7
|
+
void main() {
|
|
8
|
+
vNormal = normalize(normalMatrix * normal);
|
|
9
|
+
vPart = part;
|
|
10
|
+
// The stem rises out of the ring as the pin lands (uLift runs 1 \u2192 0).
|
|
11
|
+
float grow = part > 0.5 ? 1.0 : 1.0 - uLift;
|
|
12
|
+
// The ring is the seat's own size, not the stem's: grown with the stem it
|
|
13
|
+
// spread over the neighbouring seats and read as a horseshoe from afar.
|
|
14
|
+
float scale = part > 0.5 ? uRingScale : uHeight;
|
|
15
|
+
vec3 world = uSeat + vec3(position.x, position.y * grow, position.z) * scale;
|
|
16
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(world, 1.0);
|
|
17
|
+
}`,di=`#version 300 es
|
|
18
|
+
precision highp float;
|
|
19
|
+
in vec3 vNormal; in float vPart;
|
|
20
|
+
uniform vec3 uColor; uniform float uRingAlpha;
|
|
21
|
+
out vec4 fragColor;
|
|
22
|
+
void main() {
|
|
23
|
+
if (vPart > 0.5) { fragColor = vec4(uColor, uRingAlpha); return; }
|
|
24
|
+
// View-space light from the upper left: a lit, round stem reads as an
|
|
25
|
+
// object standing in the venue rather than a line drawn on the screen.
|
|
26
|
+
float key = max(dot(normalize(vNormal), normalize(vec3(-0.4, 0.7, 0.6))), 0.0);
|
|
27
|
+
vec3 c = uColor * (0.55 + 0.5 * key) + vec3(0.12) * pow(key, 12.0);
|
|
28
|
+
fragColor = vec4(c, 1.0);
|
|
29
|
+
}`;function mi(t){if(t>=1)return 1;if(t<.72){let n=t/.72;return 1-(1-n)*(1-n)}let e=(t-.72)/.28;return 1-.08*Math.sin(e*Math.PI)}function Bt(t){return Math.max(oi,Math.min(ri,t*ni))}function ro(t,e){let n=new ti,r=ci(t),i=new Map,o=(a,s)=>{let l=new ei(t,{vertex:ui,fragment:di,uniforms:{uSeat:{value:a},uHeight:{value:1},uLift:{value:0},uRingScale:{value:1},uColor:{value:e},uRingAlpha:{value:.85}},transparent:!0,depthTest:!0,depthWrite:!1,cullFace:!1}),u=new Jr(t,{geometry:r,program:l});return u.frustumCulled=!1,u.setParent(n),{mesh:u,program:l,seat:a,start:s}};return{root:n,setSeats(a,s,l){let u=new Set(a.slice(0,oo).map(m=>m.id));for(let[m,d]of i)u.has(m)||(d.mesh.setParent(null),i.delete(m));for(let m of a.slice(0,oo))i.has(m.id)||i.set(m.id,o(m.position,l?s:-1/0))},update(a,s,l,u=!1){let m=!1;for(let d of i.values()){let p=s[0]-d.seat[0],f=s[1]-d.seat[1],c=s[2]-d.seat[2],g=Math.hypot(p,f,c);d.mesh.visible=!l&&g>(u?ai:si);let S=Bt(g),w=Math.max(0,Math.min(1,(a-d.start)/li));w<1&&(m=!0),d.program.uniforms.uHeight.value=S,d.program.uniforms.uRingScale.value=Math.min(S,ii),d.program.uniforms.uLift.value=u?1:1-mi(w),d.program.uniforms.uRingAlpha.value=.55+.4*(w<1?Math.sin(w*Math.PI):0)}return m},dispose(){for(let a of i.values())a.mesh.setParent(null);i.clear(),r.remove()}}}var je="#ffffff",io="#0b1220",Ke=6,hi=80,ao=14,so=88,lo=20,co={floor:{size:14,weight:"700",opacity:.98},zone:{size:15,weight:"600",opacity:.95},section:{size:12,weight:"500",opacity:.88},ga:{size:12,weight:"500",opacity:.88},booth:{size:11,weight:"500",opacity:.85},annotation:{size:11,weight:"400",opacity:.75},row:{size:11.5,weight:"700",opacity:.94},seat:{size:12.5,weight:"800",opacity:1}},pi=640,fi=.8,vi=11,bi="3px 7px",gi="2px 5px",uo="rgba(10,14,22,.62)",yi="#f4f7fb",mo=5,ho=2,xi=6,$e=new Set(["row","seat"]),po={floor:5,zone:4,section:3,ga:3,booth:2,annotation:1},Ve={row:{x:66,y:20},seat:{x:52,y:22}},Ut=wn,Wt=t=>Mn(t);function Yt(t,e){let n=Wt(t),r=Wt(e);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}function Xt(t,e){let n=/rgba\((\d+),(\d+),(\d+),([\d.]+)\)/.exec(t.replace(/\s/g,""));if(!n)return e;let r=Math.max(0,Math.min(1,Number(n[4])));return[1,2,3].map(i=>Number(n[i])/255*r+e[i-1]*(1-r))}function Si(t,e=[.04,.06,.1],n=!0){let r=Wt(e)<.42,i=r?"#f4f7fb":"#0b1220",o=r?"rgba(8,12,22,.78)":"rgba(255,255,255,.84)",a=n?Xt(o,e):e,s=Ut(t),l=n?7:4.5,u=s&&Yt(s,a)>=l?t:i;return r?{ink:u,backing:o,border:"rgba(210,222,245,.24)"}:{ink:u,backing:o,border:"rgba(11,18,32,.22)"}}function wi(t,e=[.04,.06,.1]){let n=Xt(uo,e),r=Ut(t);return{ink:r&&Yt(r,n)>=4.5?t:yi,backing:uo}}var Mi='ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',pt=class{constructor(e,n={}){this.nodes=new Map;this.labels=[];this.nodeAppearance=new WeakMap;this.forcedDense=!1;this.selectedSeatLabelIds=new Set;this.narrowStage=!1;this.seatNumberRow=void 0;this.pinHeads=[];this.opts=n,this.root=document.createElement("div"),this.root.setAttribute("data-view3d-labels","");let r=this.root.style;r.position="absolute",r.inset="0",r.pointerEvents="none",r.overflow="hidden",r.fontFamily=n.fontFamily||Mi,e.appendChild(this.root)}setVisible(e){this.root.style.visibility=e?"":"hidden"}setLabels(e){this.labels=e;let n=new Set(e.map(r=>r.id));for(let[r,i]of this.nodes)n.has(r)||(i.remove(),this.nodes.delete(r))}setForcedDense(e){this.forcedDense=e}setSeatNumberRow(e){return e===this.seatNumberRow?!1:(this.seatNumberRow=e,!0)}setSelectedSeatIds(e){this.selectedSeatLabelIds=new Set(Array.from(e,n=>`seat:${n}`))}sizeFor(e){let n=co[e].size;return!this.narrowStage||$e.has(e)?n:Math.max(vi,n*fi)}qualityEvidence(){let e=this.root.getBoundingClientRect(),n=this.root.style.visibility!=="hidden";return this.labels.map(r=>{let i=this.nodes.get(r.id),o=i?.getBoundingClientRect(),a=!!(n&&i&&i.style.display!=="none"&&o&&o.width>0&&o.height>0);return{id:r.id,kind:r.kind,text:r.text,visible:a,renderedFontPx:i&&Number.parseFloat(i.style.fontSize)||0,contrast:i?Number(i.dataset.qualityContrast??0):0,...a&&o?{screenBox:{x:o.x-e.x,y:o.y-e.y,width:o.width,height:o.height}}:{}}})}update(e,n,r,i,o,a){if(!this.labels.length)return;this.narrowStage=n>0&&n<pi;let s=Fn(i,o,{hasZoneLabels:this.labels.some(v=>v.kind==="zone")});this.forcedDense&&(s.add("row"),s.add("seat"));let l=[];for(let v of this.labels){if(!s.has(v.kind)&&!(v.kind==="seat"&&this.selectedSeatLabelIds.has(v.id)))continue;let y=v.kind==="seat"&&a&&this.selectedSeatLabelIds.has(v.id)?v.pinBase:void 0,T=y&&a?[y[0],y[1]+Bt(Math.hypot(y[0]-a[0],y[1]-a[1],y[2]-a[2])),y[2]]:v.anchor,R=ge(e,T,n,r);if(!R.visible)continue;let U=$e.has(v.kind),F=this.sizeFor(v.kind),D=Ln(v.text,F,!U)+(U?mo*2:0);if(v.kind==="seat"&&v.seatWidthM!==void 0&&!this.selectedSeatLabelIds.has(v.id)&&zn(e,v.anchor,v.seatWidthM,n)<Math.max(22,D))continue;let Y=_n(R,D/2,F/2+(U?ho:4),n,r),q=a?Math.hypot(v.anchor[0]-a[0],v.anchor[1]-a[1],v.anchor[2]-a[2]):1;l.push({label:v,screen:Y,focus:On(Y,q,n,r),halfWidth:D/2,...this.selectedSeatLabelIds.has(v.id)?{priority:1}:{}})}let u=Dn(l.filter(v=>v.label.kind==="floor"),n),m=[...l.filter(v=>!$e.has(v.label.kind)&&v.label.kind!=="floor"),...u],d=kn(n),p=l.filter(v=>v.label.kind==="seat"&&this.selectedSeatLabelIds.has(v.label.id)),f=ct(p,Ve.seat.x,Ve.seat.y,d.seat);this.placePinHeads(p.filter(v=>v.label.pinBase&&!f.includes(v)).map(v=>v.screen));let c=In(m,so,lo).filter(v=>!f.some(y=>Vn(v,y,so,lo))),g=ct(l.filter(v=>v.label.kind==="row"),Ve.row.x,Ve.row.y,d.row,[...c,...f]),S=this.seatNumberRow!==void 0,w=ct(l.filter(v=>v.label.kind==="seat"&&!this.selectedSeatLabelIds.has(v.label.id)&&(!S||this.seatNumberRow!==null&&v.label.rowId===this.seatNumberRow)),Ve.seat.x,Ve.seat.y,S?hi:d.seat-f.length,[...c,...f,...g]),I=[...c,...g,...f,...w],P=new Set(I.map(v=>v.label.id));for(let{label:v,screen:y}of I){let R=this.nodeFor(v).style;R.display="";let U=!!v.pinBase&&this.selectedSeatLabelIds.has(v.id);R.transform=U?`translate(-50%, -100%) translate(${y.x.toFixed(1)}px, ${(y.y-Ke).toFixed(1)}px)`:`translate(-50%, -50%) translate(${y.x.toFixed(1)}px, ${y.y.toFixed(1)}px)`}let W=I.filter(({label:v})=>!$e.has(v.kind)).sort((v,y)=>po[y.label.kind]-po[v.label.kind]||v.screen.depth-y.screen.depth||v.focus-y.focus).flatMap(({label:v})=>{let y=this.nodes.get(v.id);return y&&y.style.display!=="none"?[{node:y,box:y.getBoundingClientRect()}]:[]}),H=[];for(let{node:v,box:y}of W)H.some(R=>y.left<R.right+3&&y.right+3>R.left&&y.top<R.bottom+3&&y.bottom+3>R.top)?v.style.display="none":H.push(y);for(let[v,y]of this.nodes)P.has(v)||(y.style.display="none")}nodeFor(e){let n=this.nodes.get(e.id);if(!n){n=document.createElement("div");let g=n.style;g.position="absolute",g.left="0",g.top="0",g.whiteSpace="nowrap",g.textShadow="0 1px 3px rgba(0,0,0,0.85), 0 0 8px rgba(0,0,0,0.55)",g.display="none",this.root.appendChild(n),this.nodes.set(e.id,n)}let r=this.selectedSeatLabelIds.has(e.id),i=this.nodeAppearance.get(n);if(i&&i.text===e.text&&i.kind===e.kind&&i.color===e.color&&i.selected===r&&i.narrow===this.narrowStage)return n;if(this.nodeAppearance.set(n,{text:e.text,kind:e.kind,color:e.color,selected:r,narrow:this.narrowStage}),n.textContent=e.text,r){let g=document.createElement("span"),S=g.style;S.position="absolute",S.left="50%",S.bottom=`-${Ke}px`,S.transform="translateX(-50%)",S.borderLeft=`${Ke}px solid transparent`,S.borderRight=`${Ke}px solid transparent`,S.borderTop=`${Ke}px solid ${je}`,n.appendChild(g)}n.setAttribute("data-label-kind",e.kind),n.toggleAttribute("data-selected-seat",r);let o=co[e.kind],a=n.style;a.fontSize=`${this.sizeFor(e.kind)}px`,a.fontWeight=r?"800":o.weight,a.opacity=r?"1":String(o.opacity);let s=$e.has(e.kind),l=!s,u=Si(e.color??this.opts.ink,this.opts.backgroundRgb,!0),m=s?wi(e.color??this.opts.ink,this.opts.backgroundRgb):u;a.color=r?io:m.ink,a.background=r?je:m.backing,a.border=r?`1px solid ${je}`:l?`1px solid ${u.border}`:"",a.borderRadius=r||l?"999px":`${xi}px`;let d=this.narrowStage?gi:bi;a.padding=r||l?d:`${ho}px ${mo}px`,a.lineHeight=s?"1.1":"",a.boxShadow=r?"0 0 0 3px rgba(255,255,255,.28), 0 0 18px rgba(255,255,255,.55), 0 5px 14px rgba(0,0,0,.45)":l?"0 3px 10px rgba(0,0,0,.24)":"0 1px 4px rgba(0,0,0,.28)",a.textShadow=r?"none":"0 1px 3px rgba(0,0,0,0.85), 0 0 8px rgba(0,0,0,0.55)",a.letterSpacing=e.kind==="zone"||e.kind==="floor"?"0.08em":"0.02em";let p=this.opts.backgroundRgb??[.04,.06,.1],f=Ut(r?io:m.ink)??[1,1,1],c=Xt(r?je:m.backing,p);return n.dataset.qualityContrast=Yt(f,c).toFixed(3),a.textTransform=e.kind==="zone"||e.kind==="floor"?"uppercase":"",n}placePinHeads(e){for(;this.pinHeads.length<e.length;){let n=document.createElement("div");n.setAttribute("data-pin-head",""),n.setAttribute("aria-hidden","true");let r=n.style;r.position="absolute",r.left="0",r.top="0",r.width=`${ao}px`,r.height=`${ao}px`,r.borderRadius="50%",r.background=je,r.boxShadow="0 0 0 3px rgba(255,255,255,.28), 0 0 14px rgba(255,255,255,.55), 0 3px 8px rgba(0,0,0,.45)",r.pointerEvents="none",this.root.appendChild(n),this.pinHeads.push(n)}this.pinHeads.forEach((n,r)=>{let i=e[r];n.style.display=i?"":"none",i&&(n.style.transform=`translate(-50%, -100%) translate(${i.x.toFixed(1)}px, ${i.y.toFixed(1)}px)`)})}dispose(){this.pinHeads=[],this.root.remove(),this.nodes.clear()}};var Ai=1;var Pi=new Set(["floor","zone","section","ga","booth","annotation"]);function Ci(t){return t.every(e=>Number.isFinite(e))}function Ei(t,e){return t.x<e.x+e.width&&t.x+t.width>e.x&&t.y<e.y+e.height&&t.y+t.height>e.y}function fo(t){return t.length?Math.round(Math.min(...t)*100)/100:null}function Ee(t){return Math.round(t*1e4)/1e4}function Ri(t){if(t)return{box:{x:Ee(t.box.x),y:Ee(t.box.y),width:Ee(t.box.width),height:Ee(t.box.height)},horizontalFillRatio:Ee(t.horizontalFillRatio),verticalFillRatio:Ee(t.verticalFillRatio),visibleAreaRatio:Ee(t.visibleAreaRatio),clippedEdges:[...t.clippedEdges]}}function ye(t,e,n){return n.length?{code:t,message:e,count:n.length,samples:n.slice(0,20)}:null}function qt(t){let e=t.labels.filter(s=>s.visible&&s.screenBox),n=e.filter(s=>Pi.has(s.kind)),r=t.scene.floorCount>1?t.scene.floorCount:t.scene.zoneCount||t.scene.sectionCount,i=[];for(let s=0;s<n.length;s+=1)for(let l=0;l<s;l+=1)Ei(n[s].screenBox,n[l].screenBox)&&i.push({primaryId:n[s].id,primaryLabel:n[s].text,secondaryId:n[l].id});let o=[...t.camera.position,t.camera.distance,t.camera.verticalFovDeg],a=[ye("webgl2-unavailable","The venue scene must render through WebGL2",t.context.webgl2?[]:[{primaryId:"renderer",primaryLabel:"WebGL2"}]),ye("context-lost","The WebGL context must be live at capture",t.context.lost?[{primaryId:"renderer",primaryLabel:"context lost"}]:[]),ye("frame-not-stable","The captured 3D frame must be rendered and parked",t.frame.rendered>0&&t.frame.idle?[]:[{primaryId:"renderer",primaryLabel:"unstable frame"}]),ye("viewport-empty","The 3D viewport must have visible dimensions",t.viewport.width>1&&t.viewport.height>1?[]:[{primaryId:"viewport",primaryLabel:`${t.viewport.width}\xD7${t.viewport.height}`}]),ye("camera-invalid","The capture camera must have a finite physical pose",Ci(o)&&t.camera.distance>0&&t.camera.verticalFovDeg>0&&t.camera.verticalFovDeg<180?[]:[{primaryId:"camera",primaryLabel:"invalid pose"}]),ye("authored-relief-not-visible","Authored 3D height or rake must produce visible screen-space relief",!t.scene.authoredRelief||t.scene.renderedVerticalSpanM>.05&&t.scene.projectedReliefPx>=2?[]:[{primaryId:"scene",primaryLabel:"authored relief",measured:t.scene.projectedReliefPx,minimum:2}]),ye("hierarchy-label-missing","A venue with authored hierarchy must show at least one structural label",r===0||n.length>0?[]:[{primaryId:"labels",primaryLabel:`${r} expected hierarchy labels`}]),ye("hierarchy-label-undersized","Visible 3D hierarchy labels must remain readable",n.filter(s=>s.renderedFontPx<11).map(s=>({primaryId:s.id,primaryLabel:s.text,measured:s.renderedFontPx,minimum:11}))),ye("hierarchy-label-contrast-low","Visible 3D hierarchy labels must meet text contrast",n.filter(s=>s.contrast<4.5).map(s=>({primaryId:s.id,primaryLabel:s.text,measured:s.contrast,minimum:4.5}))),ye("hierarchy-label-collision","Visible 3D hierarchy labels must not overlap",i)].filter(s=>!!s);return{version:1,state:"venue3d",passed:a.length===0,resolvedRules:["rendered-3d-webgl-context","rendered-3d-stable-frame","rendered-3d-camera-pose","rendered-3d-relief-projection","rendered-3d-label-size","rendered-3d-label-contrast","rendered-3d-label-collision"],viewport:t.viewport,context:t.context,frame:t.frame,camera:t.camera,scene:t.scene,composition:{visibleLabels:e.map(({id:s,kind:l,text:u})=>({id:s,kind:l,text:u})).sort((s,l)=>s.kind.localeCompare(l.kind)||s.id.localeCompare(l.id)),framing:Ri(t.framing)},metrics:{minimumHierarchyFontPx:fo(n.map(s=>s.renderedFontPx)),minimumHierarchyContrast:fo(n.map(s=>s.contrast)),projectedReliefPx:Math.round(t.scene.projectedReliefPx*100)/100},findings:a}}function vo(t,e,n){t.fill(0);for(let r=0;r<Math.min(n,e.length);r++)t[e[r]]=1}import{Geometry as Qe,Mesh as Ze,Program as Zi,Texture as Ji,Transform as Do}from"ogl";import{Program as Re}from"ogl";var ft=`
|
|
2
30
|
float chairWeight(float depth) {
|
|
3
31
|
return 1.0 - smoothstep(uChairFull, uChairNone, depth);
|
|
4
|
-
}`,
|
|
32
|
+
}`,bo=`
|
|
5
33
|
float occupantWeight(float depth) {
|
|
6
|
-
float nearWeight = smoothstep(${
|
|
7
|
-
float farWeight = 1.0 - smoothstep(${
|
|
34
|
+
float nearWeight = smoothstep(${Zn.toFixed(1)}, ${Jn.toFixed(1)}, depth);
|
|
35
|
+
float farWeight = 1.0 - smoothstep(${$n.toFixed(1)}, ${Qn.toFixed(1)}, depth);
|
|
8
36
|
return nearWeight * farWeight;
|
|
9
|
-
}`,
|
|
37
|
+
}`,jt=`
|
|
10
38
|
float glyphEq(float glyph, float expected) {
|
|
11
39
|
return 1.0 - step(0.25, abs(glyph - expected));
|
|
12
40
|
}
|
|
@@ -55,7 +83,7 @@ vec3 glyphChairPosition(vec3 p, float partId, float glyph) {
|
|
|
55
83
|
p.y += 0.16;
|
|
56
84
|
}
|
|
57
85
|
return p;
|
|
58
|
-
}`,
|
|
86
|
+
}`,Ti=`#version 300 es
|
|
59
87
|
precision highp float;
|
|
60
88
|
in vec3 position;
|
|
61
89
|
in vec3 normal;
|
|
@@ -93,7 +121,7 @@ void main() {
|
|
|
93
121
|
vNormalWorld = normalize(mat3(modelMatrix) * normal);
|
|
94
122
|
vColor = color;
|
|
95
123
|
gl_Position = projectionMatrix * mv;
|
|
96
|
-
}`,
|
|
124
|
+
}`,Di=`#version 300 es
|
|
97
125
|
precision highp float;
|
|
98
126
|
in vec3 vColor;
|
|
99
127
|
in vec3 vNormalWorld;
|
|
@@ -233,8 +261,8 @@ void main() {
|
|
|
233
261
|
+ vec3(0.20, 0.10, 0.34) * focalHalo;
|
|
234
262
|
base = mix(base, display, poweredDisplay * verticalFace * 0.92);
|
|
235
263
|
fragColor = vec4(base, 1.0);
|
|
236
|
-
}`,
|
|
237
|
-
${
|
|
264
|
+
}`,go=`
|
|
265
|
+
${jt}
|
|
238
266
|
vec4 seatSurface(vec3 source, float radius) {
|
|
239
267
|
vec4 origin = modelViewMatrix * vec4(iOffset, 1.0);
|
|
240
268
|
if (iPhysicalSeat < 0.5) {
|
|
@@ -248,12 +276,12 @@ vec4 seatSurface(vec3 source, float radius) {
|
|
|
248
276
|
if (surface < 0.5) return origin;
|
|
249
277
|
vec3 p = glyphChairPosition(source, surface, iGlyph);
|
|
250
278
|
p.xz *= iChairWidth;
|
|
251
|
-
if (surface > 1.5) p.z -= max(p.y - ${
|
|
279
|
+
if (surface > 1.5) p.z -= max(p.y - ${Ce.toFixed(2)}, 0.0) * ${We.toFixed(2)} * glyphBackRake(iGlyph);
|
|
252
280
|
float c = cos(iYaw), s = sin(iYaw);
|
|
253
281
|
vec3 rotated = vec3(p.x * c + p.z * s, p.y, -p.x * s + p.z * c);
|
|
254
282
|
return modelViewMatrix * vec4(iOffset + rotated, 1.0);
|
|
255
283
|
}
|
|
256
|
-
`,
|
|
284
|
+
`,Fi=`#version 300 es
|
|
257
285
|
precision highp float;
|
|
258
286
|
in float surface;
|
|
259
287
|
in float iYaw;
|
|
@@ -292,8 +320,8 @@ out float vSectionFade;
|
|
|
292
320
|
out float vDotWeight; // 1 = the dot IS this seat, 0 = the chair has taken over
|
|
293
321
|
out float vPhysicalSeat;
|
|
294
322
|
out float vPixelRadius;
|
|
295
|
-
${
|
|
296
|
-
${
|
|
323
|
+
${ft}
|
|
324
|
+
${go}
|
|
297
325
|
void main() {
|
|
298
326
|
vec4 mv = modelViewMatrix * vec4(iOffset, 1.0);
|
|
299
327
|
float depth = max(-mv.z, 0.001);
|
|
@@ -314,7 +342,7 @@ void main() {
|
|
|
314
342
|
mv = seatSurface(position, r);
|
|
315
343
|
// Match the shell's non-uniform width/depth scale before its back rake.
|
|
316
344
|
vec3 n = vec3(normal.x / iChairWidth, normal.y, normal.z / iChairWidth);
|
|
317
|
-
if (surface > 1.5) n.y += n.z * ${
|
|
345
|
+
if (surface > 1.5) n.y += n.z * ${We.toFixed(2)} * glyphBackRake(iGlyph);
|
|
318
346
|
n = normalize(n);
|
|
319
347
|
vSeatNormal = vec3(n.x * cos(iYaw) + n.z * sin(iYaw), n.y, -n.x * sin(iYaw) + n.z * cos(iYaw));
|
|
320
348
|
vSeatHeight = position.y;
|
|
@@ -326,13 +354,13 @@ void main() {
|
|
|
326
354
|
vDim = (uFocusFloor < -0.5 || abs(iFloor - uFocusFloor) < 0.5) ? 0.0 : 1.0;
|
|
327
355
|
vSectionFade = (uFocusSection < -0.5 || abs(iSection - uFocusSection) < 0.5) ? 0.0 : 1.0;
|
|
328
356
|
gl_Position = projectionMatrix * mv;
|
|
329
|
-
}
|
|
357
|
+
}`,yo=`
|
|
330
358
|
float seatSilhouette(vec2 uv, float physical) {
|
|
331
359
|
// Solid furniture owns its silhouette in geometry. Only empty bays need
|
|
332
360
|
// a fragment mask; cutting physical faces would open holes in the volume.
|
|
333
361
|
return mix(max(abs(uv.x), abs(uv.y)), 0.0, physical);
|
|
334
362
|
}
|
|
335
|
-
`,
|
|
363
|
+
`,_i=`#version 300 es
|
|
336
364
|
precision highp float;
|
|
337
365
|
in vec3 vSeatNormal;
|
|
338
366
|
in float vSeatHeight;
|
|
@@ -352,7 +380,7 @@ uniform float uSeatDetail; // 0 for venue/area overview; 1 in section/row/sea
|
|
|
352
380
|
uniform vec3 uFadeColor;
|
|
353
381
|
uniform float uRoughness;
|
|
354
382
|
out vec4 fragColor;
|
|
355
|
-
${
|
|
383
|
+
${yo}
|
|
356
384
|
void main() {
|
|
357
385
|
if (vDim > 0.5) discard;
|
|
358
386
|
// Same screen-door dissolve as the structure rung (uStructureDetail): the
|
|
@@ -391,7 +419,10 @@ void main() {
|
|
|
391
419
|
// seat rather than a sample in a dense screen-space pattern. This is based on
|
|
392
420
|
// actual projected pixels, so it remains correct for unusually large or small
|
|
393
421
|
// venues where a radius-normalised camera distance is misleading.
|
|
394
|
-
|
|
422
|
+
// Seats show from ~2 px across. At the old 2.4-3.2 px radius a stadium's
|
|
423
|
+
// whole-venue view hid every seat behind its tier tint and read as a flat
|
|
424
|
+
// 2D map (owner, 2026-09-23); below ~1 px they still dissolve, not alias.
|
|
425
|
+
float detailedAlpha = alpha * smoothstep(0.9, 1.5, vPixelRadius) * uSeatDetail;
|
|
395
426
|
float grainAlpha = smoothstep(1.0, 0.55, d) * overviewGrain * 0.42;
|
|
396
427
|
c = mix(vec3(0.27, 0.31, 0.32), c, uSeatDetail);
|
|
397
428
|
alpha = max(detailedAlpha, grainAlpha);
|
|
@@ -414,7 +445,7 @@ void main() {
|
|
|
414
445
|
c = mix(c, mix(vec3(lum), vec3(0.93), 0.35), 0.45);
|
|
415
446
|
}
|
|
416
447
|
fragColor = vec4(c, alpha);
|
|
417
|
-
}`,
|
|
448
|
+
}`,Ii=`#version 300 es
|
|
418
449
|
precision highp float;
|
|
419
450
|
in vec3 position; // local: x/z in units of the seat radius, y in METRES
|
|
420
451
|
in vec3 normal;
|
|
@@ -449,9 +480,10 @@ out float vDim;
|
|
|
449
480
|
out float vSectionFade;
|
|
450
481
|
out float vOccupant; // 1 = this vertex belongs to a person, not to the chair
|
|
451
482
|
out vec3 vOccupantTint;
|
|
452
|
-
|
|
453
|
-
${
|
|
454
|
-
${
|
|
483
|
+
out float vTaken; // 1 = sold or held: not for sale
|
|
484
|
+
${ft}
|
|
485
|
+
${bo}
|
|
486
|
+
${jt}
|
|
455
487
|
void main() {
|
|
456
488
|
vec4 anchor = modelViewMatrix * vec4(iOffset, 1.0);
|
|
457
489
|
float viewDepth = -anchor.z;
|
|
@@ -473,6 +505,7 @@ void main() {
|
|
|
473
505
|
// rasteriser discards, exactly as the chair itself collapses at w=0.
|
|
474
506
|
float occupant = step(9.5, part);
|
|
475
507
|
float taken = step(0.0, iSeed);
|
|
508
|
+
vTaken = taken;
|
|
476
509
|
vOccupant = occupant;
|
|
477
510
|
p = glyphChairPosition(p, part, iGlyph);
|
|
478
511
|
if (iPhysicalSeat < 0.5) {
|
|
@@ -536,7 +569,7 @@ void main() {
|
|
|
536
569
|
vDim = (uFocusFloor < -0.5 || abs(iFloor - uFocusFloor) < 0.5) ? 0.0 : 1.0;
|
|
537
570
|
vSectionFade = (uFocusSection < -0.5 || abs(iSection - uFocusSection) < 0.5) ? 0.0 : 1.0;
|
|
538
571
|
gl_Position = projectionMatrix * mv;
|
|
539
|
-
}`,
|
|
572
|
+
}`,Vi=`#version 300 es
|
|
540
573
|
precision highp float;
|
|
541
574
|
in vec3 vColor;
|
|
542
575
|
in vec3 vNormalWorld;
|
|
@@ -549,6 +582,7 @@ in float vDim;
|
|
|
549
582
|
in float vSectionFade;
|
|
550
583
|
in float vOccupant;
|
|
551
584
|
in vec3 vOccupantTint;
|
|
585
|
+
in float vTaken;
|
|
552
586
|
uniform vec3 uKeyDir;
|
|
553
587
|
uniform vec3 uFadeColor;
|
|
554
588
|
uniform float uRoughness;
|
|
@@ -595,6 +629,14 @@ void main() {
|
|
|
595
629
|
// Occupant silhouettes retain their existing stronger separation.
|
|
596
630
|
float sheen = clamp((1.0 - uRoughness) / 0.22, 0.15, 2.0);
|
|
597
631
|
base += vec3(0.26, 0.31, 0.38) * fres * mix(0.24, 0.55, vOccupant) * mix(sheen, 1.0, vOccupant);
|
|
632
|
+
// Not for sale: the chair and the person in it go one muted grey, a step
|
|
633
|
+
// toward the venue. Their own clothing and the chair's category tint made a
|
|
634
|
+
// taken seat look like any other at a glance (owner report, 2026-09-23);
|
|
635
|
+
// now only the seats a buyer can take wear full colour.
|
|
636
|
+
if (vTaken > 0.5) {
|
|
637
|
+
float takenLum = dot(base, vec3(0.299, 0.587, 0.114));
|
|
638
|
+
base = mix(vec3(takenLum), uFadeColor, 0.35) * 0.92;
|
|
639
|
+
}
|
|
598
640
|
// Outside the entered section: quieter, still visible and pickable. Not the
|
|
599
641
|
// strong grey of a filtered seat, which means nothing to buy there.
|
|
600
642
|
if (vSectionFade > 0.5) {
|
|
@@ -602,14 +644,14 @@ void main() {
|
|
|
602
644
|
base = mix(base, mix(vec3(lum), vec3(0.93), 0.35), 0.45);
|
|
603
645
|
}
|
|
604
646
|
fragColor = vec4(base, 1.0);
|
|
605
|
-
}`,
|
|
647
|
+
}`,Li=`#version 300 es
|
|
606
648
|
precision highp float;
|
|
607
649
|
in vec2 position;
|
|
608
650
|
out vec2 vUv;
|
|
609
651
|
void main() {
|
|
610
652
|
vUv = position * 0.5 + 0.5;
|
|
611
653
|
gl_Position = vec4(position, 0.999, 1.0);
|
|
612
|
-
}`,
|
|
654
|
+
}`,ki=`#version 300 es
|
|
613
655
|
precision highp float;
|
|
614
656
|
in vec2 vUv;
|
|
615
657
|
uniform vec3 uTop;
|
|
@@ -620,7 +662,7 @@ void main() {
|
|
|
620
662
|
vec2 c = vUv - 0.5;
|
|
621
663
|
float vig = 1.0 - dot(c, c) * 0.16; // soft vignette
|
|
622
664
|
fragColor = vec4(col * vig, 1.0);
|
|
623
|
-
}
|
|
665
|
+
}`,Oi=`#version 300 es
|
|
624
666
|
precision highp float;
|
|
625
667
|
in float surface;
|
|
626
668
|
in float iYaw;
|
|
@@ -648,8 +690,8 @@ out float vPhysicalSeat;
|
|
|
648
690
|
out float vDotWeight;
|
|
649
691
|
out float vHidden;
|
|
650
692
|
flat out vec3 vPick;
|
|
651
|
-
${
|
|
652
|
-
${
|
|
693
|
+
${ft}
|
|
694
|
+
${go}
|
|
653
695
|
void main() {
|
|
654
696
|
int id = gl_InstanceID + 1; // 0 reserved for no-hit
|
|
655
697
|
vPick = vec3(float(id & 255), float((id >> 8) & 255), float((id >> 16) & 255)) / 255.0;
|
|
@@ -663,7 +705,7 @@ void main() {
|
|
|
663
705
|
vPhysicalSeat = iPhysicalSeat;
|
|
664
706
|
vHidden = (uFocusFloor > -0.5 && abs(iFloor - uFocusFloor) > 0.5) ? 1.0 : 0.0;
|
|
665
707
|
gl_Position = projectionMatrix * mv;
|
|
666
|
-
}`,
|
|
708
|
+
}`,zi=`#version 300 es
|
|
667
709
|
precision highp float;
|
|
668
710
|
in vec2 vUv;
|
|
669
711
|
in float vPhysicalSeat;
|
|
@@ -671,7 +713,7 @@ in float vDotWeight;
|
|
|
671
713
|
in float vHidden;
|
|
672
714
|
flat in vec3 vPick;
|
|
673
715
|
out vec4 fragColor;
|
|
674
|
-
${
|
|
716
|
+
${yo}
|
|
675
717
|
void main() {
|
|
676
718
|
if (vHidden > 0.5) discard;
|
|
677
719
|
if (vDotWeight <= 0.99) discard;
|
|
@@ -679,7 +721,7 @@ void main() {
|
|
|
679
721
|
float d = seatSilhouette(vUv, vPhysicalSeat);
|
|
680
722
|
if (d > 1.0) discard; // hit-mask matches chair/bay shape
|
|
681
723
|
fragColor = vec4(vPick, 1.0);
|
|
682
|
-
}`,
|
|
724
|
+
}`,Ni=`#version 300 es
|
|
683
725
|
precision highp float;
|
|
684
726
|
in vec3 position;
|
|
685
727
|
in float part;
|
|
@@ -701,9 +743,9 @@ uniform float uFocusFloor;
|
|
|
701
743
|
flat out vec3 vPick;
|
|
702
744
|
out float vChairWeight;
|
|
703
745
|
out float vHidden;
|
|
704
|
-
${
|
|
705
|
-
${
|
|
706
|
-
${
|
|
746
|
+
${ft}
|
|
747
|
+
${bo}
|
|
748
|
+
${jt}
|
|
707
749
|
void main() {
|
|
708
750
|
int id = int(iPickIndex + 0.5); // already global index + 1
|
|
709
751
|
vPick = vec3(float(id & 255), float((id >> 8) & 255), float((id >> 16) & 255)) / 255.0;
|
|
@@ -737,7 +779,7 @@ void main() {
|
|
|
737
779
|
float c = cos(iYaw), s = sin(iYaw);
|
|
738
780
|
vec3 rp = vec3(p.x * c + p.z * s, p.y, -p.x * s + p.z * c);
|
|
739
781
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(iOffset + rp, 1.0);
|
|
740
|
-
}`,
|
|
782
|
+
}`,Hi=`#version 300 es
|
|
741
783
|
precision highp float;
|
|
742
784
|
flat in vec3 vPick;
|
|
743
785
|
in float vHidden;
|
|
@@ -747,7 +789,7 @@ void main() {
|
|
|
747
789
|
if (vHidden > 0.5) discard;
|
|
748
790
|
if (vChairWeight < 0.01) discard;
|
|
749
791
|
fragColor = vec4(vPick, 1.0);
|
|
750
|
-
}`,
|
|
792
|
+
}`,Gi=`#version 300 es
|
|
751
793
|
precision highp float;
|
|
752
794
|
in vec3 position;
|
|
753
795
|
in float floorIndex;
|
|
@@ -758,14 +800,14 @@ out float vHidden;
|
|
|
758
800
|
void main() {
|
|
759
801
|
vHidden = (uFocusFloor > -0.5 && abs(floorIndex - uFocusFloor) > 0.5) ? 1.0 : 0.0;
|
|
760
802
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
761
|
-
}`,
|
|
803
|
+
}`,Bi=`#version 300 es
|
|
762
804
|
precision highp float;
|
|
763
805
|
in float vHidden;
|
|
764
806
|
out vec4 fragColor;
|
|
765
807
|
void main() {
|
|
766
808
|
if (vHidden > 0.5) discard;
|
|
767
809
|
fragColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
768
|
-
}`;function
|
|
810
|
+
}`;function xo(t){return new Re(t,{vertex:Oi,fragment:zi,transparent:!1,depthTest:!0,depthWrite:!0,cullFace:!1,uniforms:{uSeatRadius:{value:Ue},uSeatScale:{value:1},uMinPixels:{value:_e},uPixelToWorld:{value:.002},uChairFull:{value:qe},uChairNone:{value:Ie},uFocusFloor:{value:-1}}})}function So(t){return new Re(t,{vertex:Ni,fragment:Hi,transparent:!1,depthTest:!0,depthWrite:!0,cullFace:!1,uniforms:{uChairFull:{value:qe},uChairNone:{value:Ie},uBackRake:{value:We},uBackBase:{value:Ce},uFocusFloor:{value:-1}}})}function wo(t){return new Re(t,{vertex:Gi,fragment:Bi,transparent:!1,depthTest:!0,depthWrite:!0,cullFace:!1,uniforms:{uFocusFloor:{value:-1}}})}function Mo(t,e=.78,n=[.63,.66,.65]){return new Re(t,{vertex:Ti,fragment:Di,cullFace:!1,depthTest:!0,depthWrite:!0,uniforms:{uKeyDir:{value:new Float32Array([-.48,.78,.4])},uFocusFloor:{value:-1},uStructureDetail:{value:0},uDeckColor:{value:new Float32Array(n)},uSectionFilter:{value:0},uRoughness:{value:e}}})}function Ao(t){return new Re(t,{vertex:Fi,fragment:_i,transparent:!0,depthTest:!0,depthWrite:!0,cullFace:!1,uniforms:{uKeyDir:{value:new Float32Array([-.48,.78,.4])},uSeatRadius:{value:Ue},uSeatScale:{value:1},uMinPixels:{value:_e},uPixelToWorld:{value:.002},uSeatFade:{value:0},uSeatDetail:{value:0},uFocusFloor:{value:-1},uFocusSection:{value:-1},uFadeColor:{value:new Float32Array([.32,.37,.43])},uChairFull:{value:qe},uChairNone:{value:Ie}}})}function Po(t,e=.78){return new Re(t,{vertex:Ii,fragment:Vi,transparent:!1,depthTest:!0,depthWrite:!0,cullFace:!1,uniforms:{uKeyDir:{value:new Float32Array([-.48,.78,.4])},uFadeColor:{value:new Float32Array([.32,.37,.43])},uChairFull:{value:qe},uChairNone:{value:Ie},uBackRake:{value:We},uBackBase:{value:Ce},uFocusFloor:{value:-1},uFocusSection:{value:-1},uRoughness:{value:e}}})}function Co(t,e,n){return new Re(t,{vertex:Li,fragment:ki,depthTest:!1,depthWrite:!1,cullFace:!1,uniforms:{uTop:{value:new Float32Array(e)},uBottom:{value:new Float32Array(n)}}})}import{Camera as Wi,Mat4 as Ui,Mesh as Yi,Program as Xi,RenderTarget as qi,Transform as ji}from"ogl";function Eo(t,e,n){let i=Math.max(3,n.radius*1.04),[o,a,s]=n.center,l=new Wi(t,{left:-i,right:i,bottom:-i,top:i,near:.1,far:i*6});l.position.set(o-i*1.44,a+i*2.34,s+i*1.2),l.lookAt([o,a,s]);let u=new qi(t,{width:1024,height:1024,depthTexture:!0,minFilter:t.NEAREST,magFilter:t.NEAREST}),m=new Xi(t,{cullFace:!1,vertex:`#version 300 es
|
|
769
811
|
in vec3 position;
|
|
770
812
|
uniform mat4 modelViewMatrix;
|
|
771
813
|
uniform mat4 projectionMatrix;
|
|
@@ -774,7 +816,7 @@ void main() {
|
|
|
774
816
|
out vec4 fragColor;
|
|
775
817
|
void main() {
|
|
776
818
|
fragColor = vec4(1.0);
|
|
777
|
-
}`}),
|
|
819
|
+
}`}),d=new ji,p=new Yi(t,{geometry:e,program:m});p.frustumCulled=!1,p.setParent(d);let f=t.getParameter(t.COLOR_CLEAR_VALUE),c=t.isEnabled(t.DITHER);try{t.disable(t.DITHER),t.clearColor(1,1,1,1),t.renderer.render({scene:d,camera:l,target:u})}finally{c&&t.enable(t.DITHER),t.clearColor(f[0],f[1],f[2],f[3]),m.remove()}let g=new Ui().multiply(l.projectionMatrix,l.viewMatrix);return{texture:u.depthTexture,matrix:g,dispose(){for(let S of u.textures)t.deleteTexture(S.texture);t.deleteTexture(u.depthTexture.texture),t.deleteFramebuffer(u.buffer),u.depthBuffer&&t.deleteRenderbuffer(u.depthBuffer)}}}var Ki=.65,$i=new Set(["dimmed","sold"]),Qi=new Set(["dimmed","sold","held"]);function Ro(t,e,n){let r=new Set,i=!1,o=be.indexOf("dimmed"),a=!1;for(let l=0;l<n.length;l+=1)if(n[l]===o){a=!0;break}let s=a?Qi:$i;for(let l of t){let u=e.get(l.sectionId);if(!u||!u.length){r.add(l.sectionId);continue}let m=!1;for(let d of u){let p=be[n[d]]??"available";if(!s.has(p)){m=!0;break}}m?r.add(l.sectionId):i=!0}return{lit:r,anyUnlit:i}}function To(t,e,n,r,i,o){let a=[];for(let s of t){let l=i===null||i.has(s.sectionId);if(r.get(s.sectionId)===l)continue;r.set(s.sectionId,l);let u=(s.start+s.count)*3;for(let m=s.start*3;m<u;m++)e[m]=l?n[m]:n[m]+(o[m%3]-n[m])*Ki;a.push(s)}return a}var Fo=be.indexOf("selected");function ea(t,e){return[0,1,2].map(n=>t[n]*.15+.75+e[n]*.1)}function _o(t,e,n,r,i,o){for(let a=n;a<n+r;a++){let s=o&&e[a]===0,l=o&&e[a]===Fo?ea([o[a*3],o[a*3+1],o[a*3+2]],i[Fo]??i[0]):s?null:i[e[a]]??i[0];t[a*3]=l?l[0]:o[a*3],t[a*3+1]=l?l[1]:o[a*3+1],t[a*3+2]=l?l[2]:o[a*3+2]}}var ta=new Float32Array([-1,-1,3,-1,-1,3]);function Io(t,e){let n=new Do,r=new Do,i=new Qe(t,{position:{size:2,data:ta}}),o=Co(t,e.theme.background.top,e.theme.background.bottom),a=new Ze(t,{geometry:i,program:o});a.frustumCulled=!1,a.setParent(r);let s=new Qe(t,{position:{size:3,data:e.solids.position},normal:{size:3,data:e.solids.normal},color:{size:3,data:e.solids.color},floorIndex:{size:1,data:e.solids.floor},materialIndex:{size:1,data:e.solids.material}}),l=Eo(t,s,e.renderBounds),u=Mo(t,e.theme.materials.roughness,e.theme.structure.tierTop);u.uniforms.tVenueShadow={value:l.texture},u.uniforms.uShadowMatrix={value:l.matrix};let m=new Ze(t,{geometry:s,program:u});m.frustumCulled=!1,m.setParent(n);let d=Ao(t),p=new Float32Array(e.seats.count*3),f=be.map(N=>e.theme.seatStates[N]),c=e.seats.iCategory.slice();for(let N=0;N<e.seats.count;N++){if(e.seats.iPhysicalSeat[N]<.5)continue;let $=e.theme.materials.seat??En([c[N*3],c[N*3+1],c[N*3+2]]);c.set($,N*3)}_o(p,e.seats.iState,0,e.seats.count,f,c);let g=Un(),S=new Uint8Array(e.seats.count),w=new Qe(t,{position:{size:3,data:g.position},normal:{size:3,data:g.normal},uv:{size:2,data:g.uv},index:{size:1,data:g.index},surface:{size:1,data:g.surface},iYaw:{size:1,data:e.seats.iYaw,instanced:1},iChairWidth:{size:1,data:e.seats.iChairWidth,instanced:1},iGlyph:{size:1,data:e.seats.iGlyph,instanced:1},iOffset:{size:3,data:e.seats.iPosition,instanced:1},iColor:{size:3,data:p,instanced:1},iMaxRadius:{size:1,data:e.seats.iMaxRadius,instanced:1},iHasChair:{size:1,data:S,type:t.UNSIGNED_BYTE,usage:t.DYNAMIC_DRAW,instanced:1},iPhysicalSeat:{size:1,data:e.seats.iPhysicalSeat,instanced:1},iRing:{size:3,data:e.seats.iRing,instanced:1},iFloor:{size:1,data:e.seats.iFloor,instanced:1},iSection:{size:1,data:e.seats.iSection,instanced:1}}),I=new Ze(t,{geometry:w,program:d});I.frustumCulled=!1,e.seats.count>0&&I.setParent(n);let P=w.attributes.iColor,E=e.solids.color.slice(),W=e.theme.structure.ground,H=new Map(e.sectionSolidRanges.map(N=>[N.sectionId,!0])),v=Pn(),y=Po(t,e.theme.materials.roughness),T=ht,R=new Float32Array(T*3),U=new Float32Array(T*3),F=new Float32Array(T),D=new Float32Array(T),Y=new Float32Array(T),q=new Float32Array(T*3),V=new Float32Array(T),j=new Float32Array(T),C=new Float32Array(T),x=new Float32Array(T),ie=new Float32Array(T),k=new Qe(t,{position:{size:3,data:v.position},normal:{size:3,data:v.normal},part:{size:1,data:v.part},index:{data:v.index},iOffset:{size:3,data:R,instanced:1},iColor:{size:3,data:U,instanced:1},iRadius:{size:1,data:F,instanced:1},iYaw:{size:1,data:D,instanced:1},iGlyph:{size:1,data:Y,instanced:1},iRing:{size:3,data:q,instanced:1},iFloor:{size:1,data:V,instanced:1},iSection:{size:1,data:j,instanced:1},iPhysicalSeat:{size:1,data:C,instanced:1},iSeed:{size:1,data:ie,instanced:1},iPickIndex:{size:1,data:x,instanced:1}}),M=new Ze(t,{geometry:k,program:y});M.frustumCulled=!1;let z=0,te=!1,X=!1,oe=null,K=null,ue=null,ae=new Int32Array(0),re=()=>{let N=e.seats;for(let $=0;$<z;$++){let G=ae[$];ie[$]=Rn(N.iState[G],G),U[$*3]=p[G*3],U[$*3+1]=p[G*3+1],U[$*3+2]=p[G*3+2]}k.attributes.iColor.needsUpdate=!0,k.attributes.iSeed.needsUpdate=!0},de={main:n,background:r,seatProgram:d,solidProgram:u,chairProgram:y,seatGeometry:w,chairGeometry:k,solidGeometry:s,drawCalls:3,setNearSeats(N,$){let G=Math.min($,T,N.length);if(vo(S,N,G),w.attributes.iHasChair.needsUpdate=!0,ae=N,z=G,G===0){M.parent&&M.setParent(null),k.instancedCount=0,de.drawCalls=3+(te?1:0);return}let ee=e.seats;for(let Q=0;Q<G;Q++){let B=N[Q];R[Q*3]=ee.iPosition[B*3],R[Q*3+1]=ee.iPosition[B*3+1],R[Q*3+2]=ee.iPosition[B*3+2],F[Q]=ee.iChairWidth[B],D[Q]=ee.iYaw[B],Y[Q]=ee.iGlyph[B],q[Q*3]=ee.iRing[B*3],q[Q*3+1]=ee.iRing[B*3+1],q[Q*3+2]=ee.iRing[B*3+2],V[Q]=ee.iFloor[B],j[Q]=ee.iSection[B],C[Q]=ee.iPhysicalSeat[B],x[Q]=B+1}re(),k.attributes.iOffset.needsUpdate=!0,k.attributes.iRadius.needsUpdate=!0,k.attributes.iYaw.needsUpdate=!0,k.attributes.iGlyph.needsUpdate=!0,k.attributes.iRing.needsUpdate=!0,k.attributes.iFloor.needsUpdate=!0,k.attributes.iSection.needsUpdate=!0,k.attributes.iPhysicalSeat.needsUpdate=!0,k.attributes.iSeed.needsUpdate=!0,k.attributes.iPickIndex.needsUpdate=!0,k.instancedCount=G,M.parent||M.setParent(n),de.drawCalls=4+(te?1:0)},nearSeatCount(){return z},setSectionShellLit(N){u.uniforms.uSectionFilter.value=N===null?0:1;let $=To(e.sectionSolidRanges,e.solids.color,E,H,N,W);if(!$.length)return;let G=s.attributes.color,ee=G.buffer;if(!ee){G.needsUpdate=!0;return}t.bindBuffer(t.ARRAY_BUFFER,ee);for(let Q of $){let B=e.solids.color.subarray(Q.start*3,(Q.start+Q.count)*3);t.bufferSubData(t.ARRAY_BUFFER,Q.start*3*Float32Array.BYTES_PER_ELEMENT,B)}},uploadSeatStateRuns(N){if(!N.length)return;z&&re();for(let G of N)_o(p,e.seats.iState,G.start,G.length,f,c);let $=P.buffer;if(!$){P.needsUpdate=!0;return}t.bindBuffer(t.ARRAY_BUFFER,$);for(let G of N){let ee=p.subarray(G.start*3,(G.start+G.length)*3);t.bufferSubData(t.ARRAY_BUFFER,G.start*3*Float32Array.BYTES_PER_ELEMENT,ee)}},dispose(){X=!0,l.dispose(),i.remove(),o.remove(),s.remove(),u.remove(),w.remove(),d.remove(),k.remove(),y.remove(),oe?.remove(),K?.remove(),ue?.texture&&t.deleteTexture(ue.texture)}},le=e.productionElements.find(N=>N.contentImageUrl&&N.contentPlane);if(le?.contentImageUrl&&le.contentPlane?.length===4&&typeof Image<"u"){let N=new Image;N.crossOrigin="anonymous",N.onload=()=>{if(X)return;let $=le.contentPlane;oe=new Qe(t,{position:{size:3,data:new Float32Array($.flat())},uv:{size:2,data:new Float32Array([0,1,1,1,0,0,1,0])},floorIndex:{size:1,data:new Float32Array(4).fill(le.floorIndex)},index:{data:new Uint16Array([0,1,2,2,1,3])}}),ue=new Ji(t,{image:N,generateMipmaps:!0,wrapS:t.CLAMP_TO_EDGE,wrapT:t.CLAMP_TO_EDGE,flipY:!1}),K=new Zi(t,{vertex:`#version 300 es
|
|
778
820
|
precision highp float;
|
|
779
821
|
in vec3 position; in vec2 uv; in float floorIndex;
|
|
780
822
|
uniform mat4 modelViewMatrix; uniform mat4 projectionMatrix; uniform float uFocusFloor;
|
|
@@ -782,4 +824,4 @@ void main() {
|
|
|
782
824
|
void main(){ vUv=uv; vDim=(uFocusFloor < -0.5 || abs(floorIndex-uFocusFloor)<0.5)?0.0:1.0; gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0); }`,fragment:`#version 300 es
|
|
783
825
|
precision highp float;
|
|
784
826
|
in vec2 vUv; in float vDim; uniform sampler2D uImage; out vec4 fragColor;
|
|
785
|
-
void main(){ if(vDim>0.5) discard; vec4 c=texture(uImage,vUv); if(c.a<0.01) discard; fragColor=c; }`,uniforms:{uImage:{value:te},uFocusFloor:{value:-1}},transparent:!1,depthTest:!0,depthWrite:!0,cullFace:!1});let j=new qe(t,{geometry:Q,program:ie});j.frustumCulled=!1,j.setParent(n),re.screenProgram=ie,ee=!0,re.drawCalls=3+(Z?1:0)+1},k.src=le.contentImageUrl}return re}import{Mesh as Gt,RenderTarget as va,Transform as Ht}from"ogl";function fa(t,e,n){let r=t+(e<<8)+(n<<16);return r===0?-1:r-1}function mo(t,e,n,r,a,o){let i=-1,s=1/0;for(let l=0;l<n;l++)for(let u=0;u<e;u++){let p=(l*e+u)*4,h=fa(t[p],t[p+1],t[p+2]);if(h<0||h>=o)continue;let v=u-r,f=l-a,c=v*v+f*f;c<s&&(s=c,i=h)}return i}function ho(t,e,n,r,a,o){let i=t-n.left,s=e-n.top,l=Math.round(i*r),u=Math.round((n.height-s)*r);return{x:Math.max(0,Math.min(a-1,l)),y:Math.max(0,Math.min(o-1,u))}}var ba=["uSeatRadius","uSeatScale","uMinPixels","uPixelToWorld"],dt=class{constructor(e,n,r,a,o){this.seatScene=new Ht;this.chairScene=new Ht;this.solidScene=new Ht;this.target=null;this.restoreClear=[0,0,0];this.renderer=e,this.gl=e.gl,this.maxIndex=o,this.seatProg=Zn(this.gl),this.chairProg=Jn(this.gl),this.depthProg=eo(this.gl);let i=new Gt(this.gl,{geometry:n,program:this.seatProg});i.frustumCulled=!1,i.setParent(this.seatScene);let s=new Gt(this.gl,{geometry:r,program:this.chairProg});s.frustumCulled=!1,s.setParent(this.chairScene);let l=new Gt(this.gl,{geometry:a,program:this.depthProg});l.frustumCulled=!1,l.setParent(this.solidScene)}setRestoreClear(e){this.restoreClear=[e[0],e[1],e[2]]}syncFromSeatProgram(e){for(let r of ba)this.seatProg.uniforms[r].value=e.uniforms[r].value;let n=e.uniforms.uFocusFloor.value;this.seatProg.uniforms.uFocusFloor.value=n,this.chairProg.uniforms.uFocusFloor.value=n,this.depthProg.uniforms.uFocusFloor.value=n}ensureTarget(){let e=this.gl.drawingBufferWidth,n=this.gl.drawingBufferHeight;return this.target&&(this.target.width!==e||this.target.height!==n)&&this.destroyTarget(),this.target||(this.target=new va(this.gl,{width:e,height:n,depth:!0})),this.target}destroyTarget(){if(!this.target)return;let e=this.gl;this.target.buffer&&e.deleteFramebuffer(this.target.buffer);for(let n of this.target.textures??[])n.texture&&e.deleteTexture(n.texture);this.target.depthBuffer&&e.deleteRenderbuffer(this.target.depthBuffer),this.target=null}pick(e,n,r,a){let o=this.gl,i=this.ensureTarget(),s=o.drawingBufferWidth,l=o.drawingBufferHeight,u=Math.max(0,n-a),p=Math.max(0,r-a),h=Math.max(1,Math.min(s,n+a+1)-u),v=Math.max(1,Math.min(l,r+a+1)-p);o.enable(o.SCISSOR_TEST),o.scissor(u,p,h,v);let[f,c,b]=this.restoreClear;o.clearColor(0,0,0,1),this.renderer.render({scene:this.solidScene,camera:e,target:i,clear:!0}),this.renderer.render({scene:this.seatScene,camera:e,target:i,clear:!1}),this.renderer.render({scene:this.chairScene,camera:e,target:i,clear:!1}),o.clearColor(f,c,b,1),o.disable(o.SCISSOR_TEST);let E=new Uint8Array(h*v*4);return this.renderer.bindFramebuffer(i),o.readPixels(u,p,h,v,o.RGBA,o.UNSIGNED_BYTE,E),this.renderer.bindFramebuffer(),mo(E,h,v,n-u,r-p,this.maxIndex)}dispose(){this.destroyTarget(),this.seatProg.remove(),this.chairProg.remove(),this.depthProg.remove()}};function po(t,e){let n=[];for(let r of e)t.has(r.seatId)?t.set(r.seatId,dn(r.state)):n.push(r);return n}function fo(t,e,n){let r=new Set;for(let i of e)(t.has(i)||n(i)!==void 0)&&r.add(i);let a=new Map(t),o=[];for(let[i,s]of t)r.has(i)||(o.push({seatId:i,state:be[s]??"available"}),a.delete(i));for(let i of r){if(a.has(i))continue;let s=n(i);s!==void 0&&(a.set(i,s),o.push({seatId:i,state:"selected"}))}return{updates:o,next:a}}import{Quat as je,Vec3 as xa}from"ogl";function ga(t,e){return[t[0]-e[0],t[1]-e[1],t[2]-e[2]]}function vo(t,e){return[t[0]+e[0],t[1]+e[1],t[2]+e[2]]}function ya(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function bo(t){let e=Math.hypot(t[0],t[1],t[2]);return e>1e-6?[t[0]/e,t[1]/e,t[2]/e]:[0,0,0]}function Wt(t){let e=Math.max(0,Math.min(1,t));return e*e*e*(e*(e*6-15)+10)}function Ut(t,e){return Math.max(0,Math.min(1,t+e))}function go(t,e){let n=t.length;if(n===0)return[0,0,0];if(n===1)return[...t[0]];let r=Math.max(0,Math.min(1,e)),a=n-1,o=Math.floor(r*a);o>=a&&(o=a-1);let i=r*a-o,s=t[Math.max(0,o-1)],l=t[o],u=t[o+1],p=t[Math.min(n-1,o+2)],h=i*i,v=h*i,f=[0,0,0];for(let c=0;c<3;c++)f[c]=.5*(2*l[c]+(-s[c]+u[c])*i+(2*s[c]-5*l[c]+4*u[c]-p[c])*h+(-s[c]+3*l[c]-3*u[c]+p[c])*v);return f}function Yt(t,e,n,r,a){let o=bo(ga(e,n));o[0]===0&&o[1]===0&&o[2]===0&&(o=[0,0,1]);let i=vo(vo(e,ya(o,2.5)),[0,1.5,0]),s=[e[0]-r[0],0,e[2]-r[2]],l=bo(s);l[0]===0&&l[2]===0&&(l=[o[0],0,o[2]]);let u=Math.max(1,a),p=[r[0]+l[0]*u*1.3,r[1]+u*.75,r[2]+l[2]*u*1.3];return{waypoints:[t,p,i],finalPos:i}}function Xt(t,e,n=35,r=28){let a=Wt(e),o=go(t,a),i=Wt(Math.max(0,Math.min(1,(e-.66)/.34)));return{pos:o,fov:n+(r-n)*i,eased:a}}function wo(t,e,n){let r=t.position.clone(),a=new je().copy(t.quaternion);t.position.set(e[0],e[1],e[2]),t.lookAt(new xa(n[0],n[1],n[2]));let o=new je().copy(t.quaternion);return t.position.copy(r),t.quaternion.copy(a),o}var mt=class{constructor(e){this.active=!1;this.waypoints=[];this.startQuat=new je;this.endQuat=new je;this.outQuat=new je;this.startTime=0;this.duration=2500;this.endFov=28;this.resolveFn=null;this.camera=e}start(e,n,r,a=2500,o=28){return this.settle(),this.waypoints=e,this.startQuat.copy(n),this.endQuat.copy(r),this.duration=a,this.endFov=o,this.startTime=performance.now(),this.active=!0,new Promise(i=>{this.resolveFn=i})}update(e){if(!this.active)return!1;let n=Math.min(1,(e-this.startTime)/this.duration),{pos:r,fov:a,eased:o}=Xt(this.waypoints,n,35,this.endFov);return this.camera.position.set(r[0],r[1],r[2]),this.outQuat.copy(this.startQuat).slerp(this.endQuat,Ut(o,.15)),this.camera.quaternion.copy(this.outQuat),this.camera.fov=a,this.camera.updateProjectionMatrix(),n>=1?(this.settle(),!1):!0}cancel(){this.settle()}settle(){this.active=!1;let e=this.resolveFn;this.resolveFn=null,e&&e()}};var Mo=cn,Sa=.12,wa=.25,Ma=1.5;function Co(t,e,n=0,r,a){let o=[e.x*Re,n+Ma,e.y*Re],i=a?[a[0],a[1],a[2]]:o,s=t[1],l=Number.isFinite(s)?s+Mo:Number.isFinite(r)?n+r:n+Mo,u=o[0]-t[0],p=o[2]-t[2],h=Math.hypot(u,p),v=h>.001?Math.min(Sa,h*wa):0,f=h>.001?u/h:0,c=h>.001?p/h:0;return{eye:[t[0]+f*v,l,t[2]+c*v],focal:i}}var Fe=Math.PI/180,Ca=45,Ao=80,ht=70,Aa=1,Pa=.99;function Ea(t,e){if(!(t<Aa))return Ao;if(!(Number.isFinite(e)&&e>0))return ht;let n=2*Math.atan(e/(2*pt*Pa)/Math.max(.05,t))/Fe;return Math.max(ht,Math.min(Ao,n))}var Fa=.25,pt=1,Ra=.25,Da=12*Fe,Ta=.2,Ia=1.5,Po=.8,Eo=6,To=1.9,_a=2/3,Va=.12,La=.9,ka=1.2,Oa=2,Io=.05,za=6;function _o(t,e,n=0){if(!t.length)return{min:[e[0]-6,n,e[2]-6],max:[e[0]+6,Math.max(n+Po,e[1]),e[2]+6]};let r=1/0,a=-1/0,o=1/0,i=-1/0,s=n;for(let c of t)r=Math.min(r,c.cx-c.halfX),a=Math.max(a,c.cx+c.halfX),o=Math.min(o,c.cz-c.halfZ),i=Math.max(i,c.cz+c.halfZ),s=Math.max(s,c.y);let l=a-r,u=i-o,p=Math.max(l,Math.min(u,Eo))/2,h=Math.max(u,Math.min(l,Eo))/2,v=(r+a)/2,f=(o+i)/2;return{min:[v-p,n,f-h],max:[v+p,Math.max(n+Po,s),f+h]}}function Na(t){return{min:[t.min[0],t.min[1],t.min[2]],max:[t.max[0],t.max[1]+To,t.max[2]]}}function qt(t){let e=t.max[1];return[(t.min[0]+t.max[0])/2,Math.max(t.min[1]+Ia,e+Ta,e+To*_a),(t.min[2]+t.max[2])/2]}function Vo(t,e){let n=t[0]-e[0],r=t[2]-e[2],a=Math.hypot(n,r);return a<.001?{x:0,z:1}:{x:n/a,z:r/a}}function Fo(t,e,n){let r=e[0]-t[0],a=e[1]-t[1],o=e[2]-t[2],i=Math.hypot(r,a,o)||1;r/=i,a/=i,o/=i;let s=-o,l=r,u=Math.hypot(s,l);if(u<1e-6)return 1/0;s/=u,l/=u;let p=1/0,h=-1/0;for(let v=0;v<8;v++){let f=(v&1?n.max[0]:n.min[0])-t[0],c=(v&2?n.max[1]:n.min[1])-t[1],b=(v&4?n.max[2]:n.min[2])-t[2],E=Math.max(Io,f*r+c*a+b*o),P=(f*s+b*l)/E;P<p&&(p=P),P>h&&(h=P)}return h-p}function Ro(t,e,n){let r=e[0]-t[0],a=e[1]-t[1],o=e[2]-t[2],i=Math.hypot(r,a,o)||1;r/=i,a/=i,o/=i;let s=-o,l=r,u=Math.hypot(s,l);if(u<1e-6)return 1/0;s/=u,l/=u;let p=-l*a,h=l*r-s*o,v=s*a,f=1/0,c=-1/0;for(let b=0;b<8;b++){let E=(b&1?n.max[0]:n.min[0])-t[0],P=(b&2?n.max[1]:n.min[1])-t[1],L=(b&4?n.max[2]:n.min[2])-t[2],C=Math.max(Io,E*r+P*a+L*o),F=(E*p+P*h+L*v)/C;F<f&&(f=F),F>c&&(c=F)}return c-f}function ft(t,e){return Math.tan(t*Fe/2)*Math.max(.05,e)}function Do(t,e,n){let r=Ea(n,t),a=l=>Math.max(Ca,Math.min(r,l)),o=l=>2*Math.atan(l)/Fe,i=Number.isFinite(t)&&t>0?a(o(t/(2*Fa)/Math.max(.05,n))):r;if(!(Number.isFinite(e)&&e>0))return i;let s=Math.min(i,a(o(e/(2*Va))));return t/(2*ft(s,n))>pt?i:s}function Lo(t,e,n,r={}){let a=qt(e),o=[t[0],t[1],t[2]],i=0,s=0,l=c=>{if(!(c>0))return;let b=Vo(o,a);o[0]+=b.x*c,o[2]+=b.z*c,s+=c},u=r.preserveEye?0:e.max[1]+Ra-o[1];u>0&&(o[1]+=u,i=u,l(u/Math.tan(Da)));let p=Na(e),h=Fo(o,a,e),v=Do(h,Ro(o,a,p),n),f=h/(2*ft(v,n));for(let c=0;!r.preserveEye&&c<za&&f>pt;c++){let b=Math.max(1,Math.hypot(o[0]-a[0],o[2]-a[2])),E=Number.isFinite(f)?f/pt:2;l(Math.min(60,b*(Math.min(4,E)-1)+.5)),h=Fo(o,a,e),v=Do(h,Ro(o,a,p),n),f=h/(2*ft(v,n))}return{eye:o,focal:a,fov:v,raisedM:i,pulledBackM:s,stageFrameWidth:f}}function Ba(t,e,n){let r=Math.tan(e*Fe/2),a=ft(e,n);return Math.max(1,t/Math.max(.05,Math.min(r,a)))}function ko(t,e){let{aspect:n,venue:r}=e,a=t.focal,o=Vo(t.eye,a),i=v=>(v[0]-a[0])*o.x+(v[2]-a[2])*o.z,s=[{name:"seat",eye:t.eye,focal:a,fov:t.fov}],l=Oa*(e.rowDepthM??La);s.push({name:"row",eye:[t.eye[0]+o.x*l,t.eye[1]+ka,t.eye[2]+o.z*l],focal:a,fov:t.fov});let u=(v,f,c,b)=>{let E=Ba(c,t.fov,n)*1.08,P=E*Math.sin(b*Fe),L=Number.isFinite(e.seatingTopY)?e.seatingTopY+2:-1/0,C=Math.max(P,L-f[1]),F=E*Math.cos(b*Fe);return{name:v,eye:[f[0]+o.x*F,f[1]+C,f[2]+o.z*F],focal:f,fov:t.fov}};e.section&&e.section.radius>0&&s.push(u("section",e.section.center,e.section.radius,35)),s.push(u("venue",r.center,Math.max(1,r.radius),40));let p=[],h=-1/0;for(let v of s){let f=i(v.eye);p.length&&f<=h+.5||(p.push(v),h=f)}return p}import{Vec3 as Ga}from"ogl";var Qe=Math.PI/180,Oo=320,zo=70*Qe,Ha=32*Qe,Wa=24*Qe,No=.0026,Ua=.22,Ya=.006,Xa=180,qa=4,me=(t,e,n)=>Math.max(e,Math.min(n,t)),Bo=t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;function Go(t){let{canvas:e,camera:n}=t,r=[],a=!1,o=0,i=0,s=0,l=0,u=0,p=0,h=!1,v=[0,0],f=0,c=!1,b=null,E=null,P=new Map,L=!1,C=0,F=0,g=0,A=0,S=()=>a&&r.length?r[me(Math.round(o),0,r.length-1)].name:null,w=()=>{let y=S();y!==b&&(b=y,t.onStopChange?.(y))},R=()=>{if(!a||!r.length)return;let y=r[me(Math.floor(o),0,r.length-1)],G=r[me(Math.ceil(o),0,r.length-1)],N=me(o-Math.floor(o),0,1),q=(X,j)=>X+(j-X)*N,Z=[q(y.eye[0],G.eye[0]),q(y.eye[1],G.eye[1]),q(y.eye[2],G.eye[2])],ee=[q(y.focal[0],G.focal[0]),q(y.focal[1],G.focal[1]),q(y.focal[2],G.focal[2])],he=ee[0]-Z[0],Q=ee[1]-Z[1],ie=ee[2]-Z[2],te=Math.hypot(he,Q,ie)||1,se=Math.atan2(he,ie),ve=Math.asin(me(Q/te,-1,1)),re=se+i,le=me(ve+s,-80*Qe,80*Qe),k=Math.cos(le)*te;he=Math.sin(re)*k,Q=Math.sin(le)*te,ie=Math.cos(re)*k,n.position.set(Z[0],Z[1],Z[2]),n.fov=q(y.fov,G.fov),n.updateProjectionMatrix(),n.lookAt(new Ga(Z[0]+he,Z[1]+Q,Z[2]+ie)),t.onApplied?.()},T=()=>{if(!a||!r.length)return;let y=me(Math.round(o),0,r.length-1);if(t.reducedMotion()){h=!1,o=y,R(),w(),t.requestRender();return}if(Math.abs(y-o)<.001){h=!1,w();return}l=o,u=y,p=performance.now(),h=!0,t.requestRender()},I=y=>{!a||r.length<2||(h=!1,o=me(o+y,0,r.length-1),R(),w(),t.requestRender())},Y=(y,G)=>{a&&(h=!1,c=!1,i=me(i-y*No,-zo,zo),s=me(s-G*No,-Wa,Ha),R(),t.requestRender())},B=y=>{a&&(P.set(y.pointerId,{x:y.clientX,y:y.clientY}),P.size===1?(L=!0,A=0,C=y.clientX,F=y.clientY):P.size===2&&(L=!1,g=U()))},U=()=>{let y=[...P.values()];return y.length<2?0:Math.hypot(y[0].x-y[1].x,y[0].y-y[1].y)},V=y=>{if(!a||!P.has(y.pointerId))return;if(P.set(y.pointerId,{x:y.clientX,y:y.clientY}),P.size>=2){let q=U();g>0&&I((g-q)*Ya),g=q;return}if(!L)return;let G=y.clientX-C,N=y.clientY-F;C=y.clientX,F=y.clientY,A+=Math.abs(G)+Math.abs(N),!(A<=qa)&&Y(G,N)},H=y=>{P.delete(y.pointerId)&&(P.size<2&&(g=0),P.size===0&&(L=!1,T()))},D=y=>{if(!a)return;y.preventDefault();let G=y.deltaMode===1?16:y.deltaMode===2?100:1,N=me(y.deltaY*G/100,-2,2);I(N*Ua),E&&clearTimeout(E),E=setTimeout(()=>{E=null,T()},Xa)},x=()=>{a&&(a=!1,h=!1,c=!1,r=[],P.clear(),L=!1,E&&(clearTimeout(E),E=null),b!==null&&(b=null,t.onStopChange?.(null)))};return e.addEventListener("pointerdown",B),e.addEventListener("pointermove",V),e.addEventListener("pointerup",H),e.addEventListener("pointercancel",H),e.addEventListener("wheel",D,{passive:!1}),{get active(){return a},enter(y){if(y.length<2){x();return}r=y,a=!0,o=0,i=0,s=0,h=!1,c=!1,b=null,R(),w(),t.requestRender()},exit:x,recentre(){return a?Math.abs(i)<1e-4&&Math.abs(s)<1e-4?!0:t.reducedMotion()?(c=!1,i=0,s=0,R(),t.requestRender(),!0):(v=[i,s],f=performance.now(),c=!0,t.requestRender(),!0):!1},update(y){if(!a)return!1;let G=!1;if(c){let N=me((y-f)/Oo,0,1),q=1-Bo(N);i=v[0]*q,s=v[1]*q,N>=1?(c=!1,i=0,s=0):G=!0}if(h){let N=me((y-p)/Oo,0,1);o=l+(u-l)*Bo(N),N>=1?(h=!1,o=u,w()):G=!0}return R(),G},currentStop:S,dispose(){x(),e.removeEventListener("pointerdown",B),e.removeEventListener("pointermove",V),e.removeEventListener("pointerup",H),e.removeEventListener("pointercancel",H),e.removeEventListener("wheel",D)}}}function Ho(t){return t.flying?"cinematic":t.panoramaMounted?"panorama":t.seatViewActive?"seatView":"orbit"}var jt=null;function Wo(){return jt??=import("../openPanorama-6FMXAJ6O.js").catch(t=>{throw jt=null,t}),jt}var Uo=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),vt=class{constructor(e){this.orbitLatched=!1;this.panoramaOpenedAt=0;this.cb=e}emit(e,n){if(this.cb)try{this.cb(e,n)}catch{}}opened(e,n,r,a){this.emit("3d_opened",{seats:e,hasHeights:n,...r===void 0?{}:{buildMs:Math.round(r)},...a===void 0?{}:{prepSource:a}})}orbitEngaged(){this.orbitLatched||(this.orbitLatched=!0,this.emit("3d_orbit_engaged"))}seatPicked(e,n){this.emit("3d_seat_picked",{seatId:e,sectionId:n})}cinematicPlayed(e){this.emit("3d_cinematic_played",{durationMs:e,reducedMotion:!1})}cinematicSkipped(){this.emit("3d_cinematic_skipped",{reducedMotion:!0})}cinematicCancelled(){this.emit("3d_cinematic_cancelled")}panoramaOpened(){this.panoramaOpenedAt=Uo(),this.emit("3d_panorama_opened")}panoramaClosed(){let e=this.panoramaOpenedAt?Math.round(Uo()-this.panoramaOpenedAt):0;this.panoramaOpenedAt=0,this.emit("3d_panorama_closed",{viewMs:e})}panoramaFailed(e,n){this.emit("3d_panorama_failed",{seatId:e,phase:n})}panoramaFallback(e){this.emit("3d_panorama_fallback",{seatId:e})}contextLost(){this.emit("3d_context_lost")}contextRestored(){this.emit("3d_context_restored")}};function Yo(t){let e=t.style.position;return getComputedStyle(t).position!=="static"?()=>{}:(t.style.position="relative",()=>{t.style.position==="relative"&&(t.style.position=e)})}function Xo(t){let{container:e,model:n,opts:r,expandedSeatById:a,seatIdsByRow:o,isNarrow:i}=t,s=null,l=()=>{if(!s)return;let h=i();Object.assign(s.style,h?{left:"12px",right:"12px",bottom:"70px",transform:"none",justifyContent:"center"}:{left:"50%",right:"auto",bottom:"18px",transform:"translateX(-50%)",justifyContent:"initial"})},u=()=>{s?.remove(),s=null};return{show:(h,v,f=!1)=>{if(u(),t.isDisposed())return null;let c=document.createElement("div");c.setAttribute("role","group"),Object.assign(c.style,{position:"absolute",display:"flex",flexDirection:"column",alignItems:"center",gap:"6px",zIndex:"4"});let b=r.chrome?.caption!==!1,E=r.chrome?.seatStepper!==!1;if(!b&&!E)return null;let P=a.get(h),L=P?.sectionId?n.sections.find(T=>T.id===P.sectionId):void 0,C=P?.label??h;c.setAttribute("aria-label",`Explore views near ${L?.label?`${L.label}, `:""}seat ${C}`);let F=document.createElement("span");F.textContent=r.seatViewCaption?.(h)??["Live 3D seat view",L?.label,C].filter(Boolean).join(" \xB7 "),Object.assign(F.style,{maxWidth:"min(70vw, 560px)",padding:"5px 10px",borderRadius:"999px",overflow:"hidden",color:"#d9e3f5",background:"rgba(12,18,32,0.72)",font:"600 11px/1.2 inherit",textOverflow:"ellipsis",whiteSpace:"nowrap",backdropFilter:"blur(6px)"}),b&&c.appendChild(F);let g=document.createElement("div");Object.assign(g.style,{display:"flex",alignItems:"center",justifyContent:"center",gap:"6px"}),c.appendChild(g);let A=P?.rowId?o.get(P.rowId):void 0,S=A?.indexOf(h)??-1,w=S>=0?[A?.[S-1],A?.[S+1]]:[void 0,void 0],R=(T,I,Y,B=!1)=>{let U=document.createElement("button");U.type="button",U.textContent=T,U.setAttribute("aria-label",I),Object.assign(U.style,{minHeight:"44px",padding:B?"10px 16px":"10px",borderRadius:"999px",background:"rgba(12,18,32,0.78)",color:"#eef1f8",border:"1px solid rgba(150,165,205,0.4)",backdropFilter:"blur(6px)",font:"600 13px/1 inherit",cursor:"pointer",whiteSpace:"nowrap"}),B||(U.style.minWidth="44px"),B&&(U.dataset.panoramaTrigger=""),U.addEventListener("click",Y),g.appendChild(U)};if(E&&w[0]){let T=a.get(w[0])?.label??w[0];R("\u2039",`View previous seat ${T}`,()=>{t.flyToSeat(w[0])})}if(E&&r.getSeatView){let T=r.seatViewActionLabel?.(h)??"Open 360\xB0 panorama";R(f?`\u21BB Retry ${T}`:`\u25C9 ${T}`,`${f?"Retry":T} from seat ${C}`,()=>{if(t.isDisposed()||v!==t.flightGen()){u();return}u(),t.openPanorama(h,400,v)},!0)}if(E&&w[1]){let T=a.get(w[1])?.label??w[1];R("\u203A",`View next seat ${T}`,()=>{t.flyToSeat(w[1])})}return!g.childElementCount&&!b?null:(e.appendChild(c),s=c,l(),c)},remove:u,layout:l}}var ja={rotate:"Drag to rotate the venue",move:"Drag to move the venue",zoomIn:"Zoom in",zoomOut:"Zoom out",fitView:"Show whole venue"};function qo(t){let{container:e,orbit:n,isNarrow:r}=t,a={...ja,...t.labels??{}},o=(C,F)=>{C.setAttribute("aria-label",F),C.title=F},i=document.createElement("div"),s=!1;i.className="sl-3d-navigation-controls",Object.assign(i.style,{position:"absolute",right:"14px",bottom:"14px",display:"flex",zIndex:"4",flexDirection:"column",alignItems:"flex-end",gap:"7px"});let l=document.createElement("div");l.setAttribute("role","group"),l.setAttribute("aria-label","3D drag mode"),Object.assign(l.style,{display:"flex",flexDirection:"column",gap:"6px",alignItems:"flex-end"});let u=document.createElement("div");u.setAttribute("role","group"),u.setAttribute("aria-label","3D view controls"),Object.assign(u.style,{display:"flex",flexDirection:"column",gap:"6px",alignItems:"flex-end"});let p=document.createElement("button");p.type="button",p.textContent="\u21BB",o(p,a.rotate);let h=document.createElement("button");h.type="button",h.textContent="\u2725",o(h,a.move);let v=document.createElement("button");v.type="button",v.textContent="\u2212",o(v,a.zoomOut);let f=document.createElement("button");f.type="button",f.textContent="+",o(f,a.zoomIn);for(let C of[p,h,v,f])C.className="sl-3d-icon-control",Object.assign(C.style,{width:"44px",minWidth:"44px",minHeight:"44px",padding:"9px",border:"1px solid rgba(150,165,205,0.35)",borderRadius:"999px",color:"#c9d4ea",background:"rgba(12,18,32,0.82)",font:"600 17px/1 inherit",backdropFilter:"blur(6px)",cursor:"pointer",whiteSpace:"nowrap"});l.append(p,h),u.append(f,v);let c=C=>{n.setPrimaryDragMode(C);let F=C==="orbit";p.setAttribute("aria-pressed",String(F)),h.setAttribute("aria-pressed",String(!F)),p.style.background=F?"rgba(96,110,150,0.68)":"rgba(12,18,32,0.82)",h.style.background=F?"rgba(12,18,32,0.82)":"rgba(96,110,150,0.68)",i.title=F?`${a.rotate} \xB7 ${a.move} with Shift`:`${a.move} \xB7 ${a.rotate} with Shift`};p.addEventListener("click",()=>c("orbit")),h.addEventListener("click",()=>c("pan"));let b=()=>{let{atMin:C,atMax:F}=n.dollyLimitState();f.disabled!==C&&(f.disabled=C),v.disabled!==F&&(v.disabled=F)};v.addEventListener("click",()=>{n.zoomBy(We),b()}),f.addEventListener("click",()=>{n.zoomBy(Te),b()}),i.append(l,u),c("orbit"),e.appendChild(i);let E=t.enabled!==!1,P=()=>{let C=r();i.style.display=s||!E?"none":"flex",i.style.right=C?"12px":"14px",i.style.bottom=C?"calc(env(safe-area-inset-bottom, 0px) + 76px)":"14px",l.style.display=C?"none":"flex",f.style.display=C?"none":"",v.style.display=C?"none":""};return P(),{element:i,utilityControls:u,setNavigationMode:c,syncZoomLimits:b,setSeatViewLocked:C=>{s=C,n.setInteractionEnabled(!C),P()},seatViewLocked:()=>s,layout:P}}var Ka=12;function Qa(t,e){if(!t)return!1;let n=t.x-e[0],r=t.y-e[1],a=t.z-e[2];return Math.hypot(n,r,a)>Ka}function jo(t){let{glctx:e,orbit:n,model:r,seats:a,opts:o,cinematic:i,analytics:s,seatIdByIndex:l,sectionIdBySeatId:u,tapSlop:p,tapMs:h,cancelFlight:v,focusSectionCamera:f,setSelection:c,ensureSeatView:b}=t,E=0,P=0,L=0,C=-1,F=!1,g=!1,A=I=>{t.seatViewLocked()||C===-1&&(C=I.pointerId,E=I.clientX,P=I.clientY,L=performance.now(),F=!1,g=i.active,i.active&&(s.cinematicCancelled(),v(),o.onViewTargetChange?.(null)))},S=I=>{I.pointerId===C&&Math.hypot(I.clientX-E,I.clientY-P)>p&&(F=!0)},w=(I,Y,B,U,V)=>{let H=e.canvas.getBoundingClientRect(),D=e.canvas.clientWidth||H.width||1,x=e.canvas.clientHeight||H.height||1,y=I-H.left,G=Y-H.top,N=U*U,q=-1,Z=N,ee=1/0;for(let he of a){if(B&&he.sectionId!==B)continue;let Q=r.seats.idToIndex.get(he.id);if(Q===void 0)continue;if(V){let le=Math.round(r.seats.iState[Q]??0);if(le!==0&&le!==3)continue}let ie=Q*3,te=xe(n.camera.projectionViewMatrix,[r.seats.iPosition[ie],r.seats.iPosition[ie+1]+.55,r.seats.iPosition[ie+2]],D,x);if(!te.visible)continue;let se=te.x-y,ve=te.y-G,re=se*se+ve*ve;(re<Z||Math.abs(re-Z)<1&&te.depth<ee)&&(q=Q,Z=re,ee=te.depth)}return q},R=(I,Y)=>{let B=t.gpu(),U=t.pick();if(!B||!U)return-1;U.syncFromSeatProgram(B.seatProgram);let V=e.canvas.getBoundingClientRect(),H=e.renderer.dpr,{x:D,y:x}=ho(I,Y,V,H,e.gl.drawingBufferWidth,e.gl.drawingBufferHeight),y=Math.max(2,Math.round(8*H));return U.pick(n.camera,D,x,y)};return{onDown:A,onMove:S,onUp:I=>{if(I.pointerId!==C)return;let Y=!F&&performance.now()-L<h;if(C=-1,g){g=!1;return}let B=t.gpu(),U=t.pick();if(!Y||!B||!U)return;let V=R(I.clientX,I.clientY);if(t.focusedSectionId()&&V>=0){let x=l[V],y=x?u.get(x):void 0;if(y&&y!==t.focusedSectionId()&&f(y))return}if(t.focusedSectionId()&&V<0&&(V=w(I.clientX,I.clientY,t.focusedSectionId(),44,!1)),t.focusedSectionId()&&V<0){let x=w(I.clientX,I.clientY,null,72,!1),y=x>=0?l[x]:void 0,G=y?u.get(y):void 0;if(G&&G!==t.focusedSectionId()&&f(G))return}if(!t.focusedSectionId()){V<0&&(V=w(I.clientX,I.clientY,null,42,!1));let x=V>=0?l[V]:void 0,y=x?u.get(x):void 0;if(y&&f(y))return}if(V<0||V>=l.length){t.selection().size&&(c([]),o.onViewTargetChange?.(null));return}let H=l[V],D=be[Math.round(r.seats.iState[V]??0)]??"available";if(D!=="available"&&D!=="selected"){o.onSeatInspect?.(H,D);return}if(t.selection().has(H)&&t.selection().size===1){c([]),o.onViewTargetChange?.(null),o.onSeatPick?.(H);return}if(c([H]),b(H),s.seatPicked(H,u.get(H)),o.onSeatPick?.(H),t.focusedSectionId()){let x=V*3,y=[r.seats.iPosition[x],r.seats.iPosition[x+1],r.seats.iPosition[x+2]];Qa(n.camera?.position,y)&&t.focusSeatCamera(H)}}}}var bt=class{constructor(e,n){this.minX=0;this.minZ=0;this.cell=1;this.cols=1;this.rows=1;this.cellStart=null;this.cellItems=null;this.iPosition=e,this.count=n}ensureGrid(){if(this.cellStart||this.count===0)return;let e=this.iPosition,n=1/0,r=1/0,a=-1/0,o=-1/0;for(let f=0;f<this.count;f++){let c=e[f*3],b=e[f*3+2];c<n&&(n=c),c>a&&(a=c),b<r&&(r=b),b>o&&(o=b)}let i=Math.max(a-n,.001),s=Math.max(o-r,.001);this.cell=Math.max(Math.sqrt(i*s*4/this.count),.25),this.cols=Math.max(1,Math.ceil(i/this.cell)+1),this.rows=Math.max(1,Math.ceil(s/this.cell)+1),this.minX=n,this.minZ=r;let l=this.cols*this.rows,u=new Int32Array(l+1),p=f=>{let c=Math.min(this.cols-1,Math.max(0,Math.floor((e[f*3]-n)/this.cell)));return Math.min(this.rows-1,Math.max(0,Math.floor((e[f*3+2]-r)/this.cell)))*this.cols+c};for(let f=0;f<this.count;f++)u[p(f)+1]++;for(let f=0;f<l;f++)u[f+1]+=u[f];let h=new Int32Array(this.count),v=u.slice(0,l);for(let f=0;f<this.count;f++)h[v[p(f)]++]=f;this.cellStart=u,this.cellItems=h}gather(e,n,r,a,o){this.ensureGrid();let i=this.cellStart,s=this.cellItems;if(!i||!s)return 0;let l=a.length,u=r*r,p=Math.floor((e-this.minX)/this.cell),h=Math.floor((n-this.minZ)/this.cell),v=Math.ceil(r/this.cell)+1,f=this.iPosition,c=0;for(let b=0;b<=v&&c<l;b++){let E=h-b,P=h+b,L=p-b,C=p+b;for(let F=E;F<=P&&c<l;F++){if(F<0||F>=this.rows)continue;let g=F===E||F===P;for(let A=L;A<=C&&c<l;A++){if(!g&&A!==L&&A!==C){A=C-1;continue}if(A<0||A>=this.cols)continue;let S=F*this.cols+A;for(let w=i[S],R=i[S+1];w<R&&c<l;w++){let T=s[w],I=f[T*3]-e,Y=f[T*3+2]-n,B=o===void 0?0:f[T*3+1]-o;I*I+B*B+Y*Y<=u&&(a[c++]=T)}}}}return c}};var gt=class{constructor(e){this.ctx=e;this.detailVisible=!1;this.seatDetailMix=0;this.structureDetailMix=0;this.nearBuf=new Int32Array(lt);this.lastGatherX=1/0;this.lastGatherZ=1/0;this.lastGatherY=1/0;this.nearIndex=new bt(e.model.seats.iPosition,e.model.seats.count)}forceRegather(){this.lastGatherX=1/0}setDetailEnabled(e){let n=this.ctx.gpu();e||(this.detailVisible=!1),this.lastGatherX=1/0,this.lastGatherZ=1/0,!e&&n?.nearSeatCount()&&n.setNearSeats(this.nearBuf,0)}update(e){let{model:n}=this.ctx,r=this.ctx.gpu();if(!r)return;if(!e){r.nearSeatCount()&&r.setNearSeats(this.nearBuf,0);return}let a=this.ctx.orbit().camera.position;if(Math.hypot(a.x-this.lastGatherX,a.y-this.lastGatherY,a.z-this.lastGatherZ)<Vt)return;if(this.lastGatherX=a.x,this.lastGatherY=a.y,this.lastGatherZ=a.z,Math.hypot(a.x-n.bounds.center[0],a.y-n.bounds.center[1],a.z-n.bounds.center[2])-n.bounds.radius>_t){r.nearSeatCount()&&r.setNearSeats(this.nearBuf,0);return}let s=this.nearIndex.gather(a.x,a.z,_t,this.nearBuf,a.y);s===0&&r.nearSeatCount()===0||r.setNearSeats(this.nearBuf,s)}ease(e,n,r){let a=1-Math.exp(-e*9),o=1-Math.exp(-e*20);this.seatDetailMix+=(n-this.seatDetailMix)*(n>this.seatDetailMix?a:o),this.structureDetailMix+=(r-this.structureDetailMix)*(r>this.structureDetailMix?a:o),Math.abs(n-this.seatDetailMix)<.01&&(this.seatDetailMix=n),Math.abs(r-this.structureDetailMix)<.01&&(this.structureDetailMix=r)}};function Ko(t){let e=Math.max(5,t.radius),n=t.focalWorld[0]-t.center[0],r=t.focalWorld[2]-t.center[2],a=Math.hypot(n,r);if(a<e*.12)return{center:t.center,radius:e,polarDeg:48};let o=Math.min(a*.25,e*1.2);return{center:[t.center[0]+n/a*o,t.center[1],t.center[2]+r/a*o],radius:e+o*.4,azimuth:Math.atan2(-n,-r),polarDeg:50}}import{Quat as $a,Vec3 as Za}from"ogl";function Qo(){let t="http://www.w3.org/2000/svg",e=document.createElementNS(t,"svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","18"),e.setAttribute("height","18"),e.setAttribute("aria-hidden","true"),e.setAttribute("focusable","false"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round");let n=document.createElementNS(t,"path");return n.setAttribute("d","M8 3H5a2 2 0 0 0-2 2v3M16 3h3a2 2 0 0 0 2 2v3M8 21H5a2 2 0 0 0-2-2v-3M16 21h3a2 2 0 0 0 2-2v-3"),e.appendChild(n),e}function Jo(t){let{container:e,model:n,opts:r,orbit:a,cinematic:o,analytics:i,loop:s,labelOverlay:l,stageAzimuth:u,overviewFraming:p}=t,h=0,v=-1,f=(S,w,R=28)=>{a.camera.position.set(S[0],S[1],S[2]),a.camera.lookAt(new Za(w[0],w[1],w[2])),a.camera.fov=R,a.camera.updateProjectionMatrix()},c=document.createElement("button");c.className="sl-3d-overview-control sl-3d-icon-control",c.type="button",c.replaceChildren(Qo());let b=r.navLabels?.fitView??"Show whole venue";c.setAttribute("aria-label",b),c.title=b,Object.assign(c.style,{width:"44px",minWidth:"44px",minHeight:"44px",padding:"9px",borderRadius:"999px",background:"rgba(12,18,32,0.72)",color:"#c9d4ea",border:"1px solid rgba(150,165,205,0.35)",backdropFilter:"blur(6px)",font:"600 11px/1 inherit",cursor:"pointer",whiteSpace:"nowrap"});let E=()=>{c.firstElementChild||c.replaceChildren(Qo())};E();let P=S=>{v=S;let w=t.gpu();w&&(w.seatProgram.uniforms.uFocusFloor.value=S,w.solidProgram.uniforms.uFocusFloor.value=S,w.chairProgram.uniforms.uFocusFloor.value=S),t.showSectionSeatLabels(null)},L=()=>{if(t.isDisposed())return;r.onViewTargetChange?.(null),r.onSectionFocusChange?.(null),t.panorama()&&(t.panorama().dispose(),t.setPanorama(null),i.panoramaClosed()),t.setPanoramaSphereVisible(!1),t.panoramaLoadAbort()?.abort(),t.setPanoramaLoadAbort(null),t.restorePanoramaLayer(),c.style.display="",l.setVisible(!0),t.setFrozen(!1);let S=v>=0?n.floors[v]:null;if(t.setNearFieldDetailEnabled(!!S),t.setSeatViewLocked(!1),C(),t.removeArriveChip(),t.setNavigationMode("orbit"),S){let w=S.focalWorld[0]-S.center[0],R=S.focalWorld[2]-S.center[2],T=Math.hypot(w,R)>S.radius*.12?Math.atan2(w,R):u,I={center:S.center,radius:S.radius,box:S.box},Y={polarDeg:58,margin:1.12};t.reducedMotion()?a.frame(I,!1,T,!1,Y):a.frameSoft(I,T,!1,Y)}else t.reducedMotion()?a.frame(n.bounds,!1,u,r.portraitOverviewCrop===!0,p):a.frameSoft(n.bounds,u,r.portraitOverviewCrop===!0,p);t.showSectionSeatLabels(null),s.requestRender()},C=()=>{h++,t.setSeatStepping(!1),t.panoramaLoadAbort()?.abort(),t.setPanoramaLoadAbort(null),o.active&&(o.cancel(),a.resumeAfterFlight(n.focalWorld))},F=S=>{if(t.isDisposed()||!t.gpu())return Promise.resolve();let w=n.seats.idToIndex.get(S);if(w===void 0)return Promise.resolve();t.setNearFieldDetailEnabled(!0),r.onViewTargetChange?.(S),t.panorama()&&(t.panorama().dispose(),t.setPanorama(null),t.setPanoramaSphereVisible(!1),c.style.display="",t.restorePanoramaLayer()),t.panoramaLoadAbort()?.abort(),t.setPanoramaLoadAbort(null),t.setFrozen(!1);let R=t.inSeatView()&&r.arriveAtSeatEye===!0;t.setSeatStepping(R),t.setSeatViewLocked(!1);let T=++h;R?t.showArriveChip(S,T):t.removeArriveChip();let{eye:I,focal:Y}=t.resolvedSeatViewPose(S,w),B=r.arriveAtSeatEye?t.seatViewArrival(S,w):null,U=B?B.focal:Y,V=[a.camera.position.x,a.camera.position.y,a.camera.position.z],H=Yt(V,B?.eye??I,U,n.bounds.center,n.bounds.radius),D=B?B.eye:r.arriveAtSeatEye?I:H.finalPos,x=B?B.fov:r.arriveAtSeatEye?e.clientWidth/Math.max(1,e.clientHeight)<.7?ht:65:28,y=[H.waypoints[0],H.waypoints[1],D];if(l.setVisible(!1),t.reducedMotion())return t.setSeatStepping(!1),f(D,U,x),s.requestRender(),i.cinematicSkipped(),t.isDisposed()||a.syncFromCamera(),t.setSeatViewLocked(r.arriveAtSeatEye===!0),B&&t.enterSeatView(B.stops),t.showArriveChip(S,T),Promise.resolve();let G=new $a().copy(a.camera.quaternion),N=wo(a.camera,D,U);s.requestRender();let q=R?700:2500;return o.start(y,G,N,q,x).then(()=>{t.isDisposed()||T!==h||(t.setSeatStepping(!1),i.cinematicPlayed(q),a.resumeAfterFlight(U),t.setSeatViewLocked(r.arriveAtSeatEye===!0),B&&t.enterSeatView(B.stops),s.requestRender(),t.showArriveChip(S,T))})},g=S=>{let w=n.sections.find(T=>T.id===S);if(!w||w.seatCount===0)return!1;t.setNearFieldDetailEnabled(!0),t.setSeatStepping(!1),t.setSeatViewLocked(!1),o.cancel(),t.removeArriveChip(),n.floors.length>1&&v!==w.floorIndex&&P(w.floorIndex),t.setNavigationMode("pan"),t.panorama()||l.setVisible(!0),t.showSectionSeatLabels(S);let R=Ko(w);return a.frame({center:R.center,radius:R.radius},!1,R.azimuth,!1,{polarDeg:R.polarDeg,margin:1.12}),r.onSectionFocusChange?.(S),s.requestRender(),!0},A=S=>{if(t.isDisposed()||!t.gpu())return!1;let w=n.seats.idToIndex.get(S);if(w===void 0)return!1;let R=w*3,T=[n.seats.iPosition[R],n.seats.iPosition[R+1]+.55,n.seats.iPosition[R+2]];return t.reducedMotion()?a.frame({center:T,radius:$o},!1,void 0,!1,Zo):a.frameSoft({center:T,radius:$o},void 0,!1,Zo),s.requestRender(),!0};return c.addEventListener("click",L),{overviewChip:c,layoutOverviewChip:E,flightGen:()=>h,focusedFloor:()=>v,applyFloorFocus:P,placeCameraFinal:f,cancelFlight:C,focusOverview:L,flyToSeat:F,focusSectionCamera:g,focusSeatCamera:A}}var $o=4.5,Zo={polarDeg:48,margin:1.25};function er(t){let e=performance.now(),{input:n,estimate:r}=Pn(t);return{model:He(n),buildMs:performance.now()-e,source:"main",...r?{estimate:r}:{}}}function Ja(t){let e=an(t.doc);return{...er({...t,seats:e}),seats:e}}function tr(t,e,n){if(typeof Worker>"u")return Promise.resolve(e());let r;try{r=new Worker(new URL("./scene/scene.worker.js",import.meta.url),{type:"module"})}catch{return Promise.resolve(e())}return new Promise(a=>{let o=!1,i=u=>{o||(o=!0,clearTimeout(l),r.terminate(),a(u))},s=()=>i(e()),l=window.setTimeout(s,15e3);r.onerror=s,r.onmessage=u=>{let p=n(u.data);p?i(p):s()},r.postMessage(t)})}function ei(t){return tr(t,()=>er(t),({model:e,buildMs:n,estimate:r})=>({model:e,buildMs:n,source:"worker",...r?{estimate:r}:{}}))}function ti(t){return tr(t,()=>Ja(t),({model:e,buildMs:n,seats:r,estimate:a})=>r?{model:e,buildMs:n,seats:r,source:"worker",...a?{estimate:a}:{}}:null)}var ni=Math.PI/180,oi=6,ri=500;function fl(t,e,n={}){let r=performance.now(),a=e.prepared?e.prepared.estimate:e.estimate===!1?null:Ft(e.doc,e.seats);a&&(e={...e,doc:a.doc,seats:An(e.seats,a)});let o=e.prepared?.model??He(e),i=new vt(n.onAnalytics),s=new Array(o.seats.count);for(let[d,m]of o.seats.idToIndex)s[m]=d;let l=new Map(e.seats.map(d=>[d.id,d])),u=new Map;for(let d of e.seats){if(!d.rowId)continue;let m=u.get(d.rowId);m?m.push(d.id):u.set(d.rowId,[d.id])}let p=new Map;e.seats.forEach((d,m)=>{p.set(d.id,o.seatSectionIds?.[m]??d.sectionId)});let h=new Map;for(let[d,m]of o.seats.idToIndex){let M=p.get(d);if(!M)continue;let z=h.get(M);z?z.push(m):h.set(M,[m])}let v=()=>{if(!c||!o.sectionSolidRanges.length)return;let{lit:d,anyUnlit:m}=io(o.sectionSolidRanges,h,o.seats.iState);c.setSectionShellLit(m?d:null)},f=e.doc.floors?.some(m=>(m.baseHeightM??0)>0)?!0:(e.doc.floors?.flatMap(m=>m.objects)??e.doc.objects).some(m=>m.type==="section"&&((m.height??0)>0||(m.rake??0)>0)),c=null,b=null,E=!1,P=!1,L=!1,C=new Map,F=null,g=null,A=null,S=new Map,w=null,R=()=>{A===null&&(A=t.style.zIndex,t.style.zIndex="20")},T=()=>{A!==null&&(t.style.zIndex==="20"&&(t.style.zIndex=A),A=null)},I=!1,Y=()=>I?ce.focusedFloor():-1,B=()=>{c=uo(D.gl,o),v(),le(),b=new dt(D.renderer,c.seatGeometry,c.chairGeometry,c.solidGeometry,o.seats.count),D.setClearColor(o.theme.background.top),b.setRestoreClear(o.theme.background.top),c.seatProgram.uniforms.uSeatRadius.value=Ge*o.theme.seatScale,c.seatProgram.uniforms.uFocusFloor.value=Y(),c.solidProgram.uniforms.uFocusFloor.value=Y(),c.chairProgram.uniforms.uFocusFloor.value=Y(),c.screenProgram&&(c.screenProgram.uniforms.uFocusFloor.value=Y()),V.forceRegather()},U=!1,V=new gt({model:o,orbit:()=>x,gpu:()=>c}),H=d=>V.setDetailEnabled(d),D=new at(t,{onContextLost:()=>{L||i.contextLost(),E=!0,O.stop(),c=null,b=null},onContextRestored:()=>{B(),E=!1,L||i.contextRestored(),O.requestRender()}}),x=new it(D.gl,D.canvas,()=>O.requestRender(),()=>i.orbitEngaged());x.setAspect(D.aspect);let y=(e.doc.floors?.flatMap(d=>d.objects)??e.doc.objects).some(d=>d.type==="section"&&d.physical3dProvenance?.surfaceKind?.status==="inferred"),G=(()=>{if(Number.isFinite(n.overviewAzimuthDeg))return n.overviewAzimuthDeg*Math.PI/180;if(!(y&&o.stages.length===0))return En(o.focalWorld,o.seats.iPosition,o.bounds)})(),N=(e.doc.floors?.flatMap(d=>d.objects)??e.doc.objects).some(d=>d.type==="shape"&&d.stageKind?.startsWith("pitch-")),q=o.floors.length>1?{polarDeg:48,margin:1.1}:{polarDeg:N?36:48,margin:1.05},Z=typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;x.frame(o.bounds,!Z&&n.skipInitialOverviewAnimation!==!0,G,n.portraitOverviewCrop===!0,q);let ee=new mt(x.camera),he=Yo(t),Q=new ct(t,{fontFamily:e.doc.theme?.fontFamily,ink:e.doc.theme?.textColor,backgroundRgb:o.theme.background.top}),ie=o.labels,te=()=>pn(ie,o.floors.length,Y());Q.setLabels(te());let se=null,ve=()=>[...C.keys()].flatMap(d=>{let m=o.seats.idToIndex.get(d),M=m===void 0?void 0:e.seats[m];if(m===void 0||M?.id!==d)return[];let z=m*3;return[{id:`seat:${d}`,kind:"seat",seatWidthM:o.seats.iChairWidth[m]*2,text:M.displayLabel||M.label,anchor:[o.seats.iPosition[z],o.seats.iPosition[z+1]+1.05,o.seats.iPosition[z+2]]}]}),re=-1,le=()=>{c&&(re=se?o.sections.findIndex(d=>d.id===se):-1,c.seatProgram.uniforms.uFocusSection.value=re,c.chairProgram.uniforms.uFocusSection.value=re)},k=d=>{if(se=d,le(),Q.setForcedDense(!!d),!d){let _=ve(),ue=new Set(_.map(oe=>oe.id));Q.setLabels([...te().filter(oe=>!ue.has(oe.id)),..._]);return}let m=e.seats.filter(_=>p.get(_.id)===d),M=new Set(m.map(_=>_.id)),z=new Set(m.map(_=>_.rowId)),W=new Set(C.keys()),K=new Set(m.filter(_=>W.has(_.id)).map(_=>_.id)),$=te().filter(_=>_.kind!=="row"&&_.kind!=="seat"||(_.kind==="row"?z.has(_.id.slice(4)):M.has(_.id.slice(5))&&(K.size===0||K.has(_.id.slice(5)))));if(o.seatCount<=6e3&&K.size===0){Q.setLabels($);return}let ae=K.size?m.filter(_=>K.has(_.id)):m,we=new Set(ae.map(_=>`seat:${_.id}`)),Me=ae.flatMap(_=>{let ue=o.seats.idToIndex.get(_.id);if(ue===void 0)return[];let oe=ue*3;return[{id:`seat:${_.id}`,kind:"seat",seatWidthM:o.seats.iChairWidth[ue]*2,text:W.has(_.id)?_.displayLabel||_.label:Cn(_.displayLabel||_.label),anchor:[o.seats.iPosition[oe],o.seats.iPosition[oe+1]+(W.has(_.id)?1.05:.55),o.seats.iPosition[oe+2]]}]});Q.setLabels([...$.filter(_=>!we.has(_.id)),...Me])};B();let X=null,j=null,J=d=>{if(E||!c||P)return!1;let m=Ho({flying:ee.active,panoramaMounted:F!==null,seatViewActive:X?.active===!0}),M=m==="orbit"?re:-1;c.seatProgram.uniforms.uFocusSection.value=M,c.chairProgram.uniforms.uFocusSection.value=M;let z=m==="cinematic"?ee.update(performance.now()):m==="seatView"?X.update(performance.now()):m==="orbit"?x.update():!1;j?.syncZoomLimits();let W=Y()>=0?o.floors[Y()]:null,K=W?.radius??o.bounds.radius,$=On(x.currentDistance,K),ae=U?{center:[x.camera.position.x,x.camera.position.y,x.camera.position.z],radius:520}:o.clipBounds??o.renderBounds;x.updateClipping(ae);let we=W?.center??o.renderBounds.center,Me=W?.radius??o.renderBounds.radius,_=(pe,Ce)=>Math.hypot(x.camera.position.x-pe[0],x.camera.position.y-pe[1],x.camera.position.z-pe[2])<=Ce*(V.detailVisible?1.8:1.55),ue=_(we,Me);if(!ue&&se){let pe=o.sections.find(Ce=>Ce.id===se);pe&&(ue=_(pe.center,Math.max(12,pe.radius*2)))}V.detailVisible=ue;let oe=c.seatProgram.uniforms;oe.uSeatScale.value=$.scale,oe.uSeatFade.value=$.fade;let Je=!!W&&zn(W.seatCount,D.canvas.clientWidth||1,D.canvas.clientHeight||1),et=Nn(o.seats.count,K,x.currentDistance,x.camera.fov,D.canvas.clientHeight||1),ze=V.detailVisible||Je||et?1:0,Ne=V.detailVisible||Y()>=0||o.floors.length>1?1:0;V.ease(d,ze,Ne),oe.uSeatDetail.value=V.seatDetailMix;let tt=ze===0&&V.seatDetailMix<.01;return c.seatGeometry.setDrawRange(tt?Rt:0,tt?Fn:Rt),c.solidProgram.uniforms.uStructureDetail.value=V.structureDetailMix,oe.uMinPixels.value=$.minPixels,oe.uPixelToWorld.value=2*Math.tan(x.camera.fov*ni/2)/Math.max(1,D.pixelHeight),V.update(V.detailVisible),D.renderer.render({scene:c.background,clear:!0}),D.renderer.render({scene:c.main,camera:x.camera,clear:!1}),Q.update(x.camera.projectionViewMatrix,D.canvas.clientWidth||1,D.canvas.clientHeight||1,x.currentDistance,K,[x.camera.position.x,x.camera.position.y,x.camera.position.z]),z||V.seatDetailMix!==ze||V.structureDetailMix!==Ne},O=new st(J),ne=typeof ResizeObserver<"u"?new ResizeObserver(()=>At.resize()):null;ne?.observe(t);let Kt=d=>{let m=W=>{let K=o.seats.idToIndex.get(W);return K===void 0?void 0:o.seats.iState[K]},{updates:M,next:z}=fo(C,d,m);if(C=z,Q.setSelectedSeatIds(C.keys()),k(se),M.length){let W=Et(o.seats,M);c&&c.uploadSeatStateRuns(W),v(),O.requestRender()}},$e=()=>w!==null?w:typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,nr=8,Qt=d=>{if(!n.getSeatView)return null;let m=S.get(d);if(!m)for(m=Promise.resolve(n.getSeatView(d)),S.set(d,m),m.catch(()=>{S.get(d)===m&&S.delete(d)});S.size>nr;){let M=S.keys().next().value;if(M===void 0)break;S.delete(M)}return m},$t=_o(o.stages,o.focalWorld,o.bounds.groundY??0),or=qt($t),yt=(d,m)=>{let M=l.get(d),z=Math.max(0,Math.round(o.seats.iFloor[m]??0)),W=e.doc.floors?.[z],K=o.floors[z],$=W?.focalPoint??e.doc.focalPoint,ae=K?{x:K.focalWorld[0]/Re,y:K.focalWorld[2]/Re}:$,we=M?.focalPoint?{x:M.focalPoint.x+ae.x-$.x,y:M.focalPoint.y+ae.y-$.y}:ae,Me=[o.seats.iPosition[m*3],o.seats.iPosition[m*3+1],o.seats.iPosition[m*3+2]];return Co(Me,we,W?.baseHeightM??0,M?.eyeHeightM,or)},Zt=()=>(t.clientWidth||D.canvas.clientWidth)<=520,xt=null,Jt=null,rr=async(d,m,M)=>{if(!n.getSeatView||L||M!==ce.flightGen())return;let z;try{z=await Wo()}catch{if(i.panoramaFailed(d,"mount"),!L&&M===ce.flightGen()){let W=wt(d,M,!0);requestAnimationFrame(()=>W?.querySelector("[data-panorama-trigger]")?.focus())}return}if(!(L||M!==ce.flightGen()||!xt))return Jt??=z.createOpenPanorama(xt),Jt(d,m,M)},St=Xo({container:t,model:o,opts:n,expandedSeatById:l,seatIdsByRow:u,isNarrow:Zt,isDisposed:()=>L,flightGen:()=>ce.flightGen(),flyToSeat:d=>on(d),openPanorama:(d,m,M)=>rr(d,m,M)}),wt=St.show,Mt=St.remove,ar=St.layout,Se=qo({container:t,orbit:x,isNarrow:Zt,enabled:n.chrome?.controlDock!==!1,...n.navLabels?{labels:n.navLabels}:{}});j=Se;let ir=Se.element,ke=Se.setNavigationMode,sr=Se.layout,lr=Se.utilityControls,Oe=null,en=!1,Ze=d=>{Se.setSeatViewLocked(d),d||X?.exit()};X=Go({canvas:D.canvas,camera:x.camera,requestRender:()=>O.requestRender(),reducedMotion:$e,onStopChange:d=>{let m=d??(en?"seat":null);Oe=m;try{n.onSeatViewStopChange?.(m)}catch{}},onApplied:()=>{L||x.syncFromCamera()}});let tn=o.sections.reduce((d,m)=>m.seatCount>0&&m.box?Math.max(d,m.box.max[1]):d,-1/0),cr=(d,m)=>{let{eye:M}=yt(d,m),z=(t.clientWidth||D.canvas.clientWidth||1)/Math.max(1,t.clientHeight||D.canvas.clientHeight||1),W=Lo(M,$t,z,{preserveEye:!0});if(n.seatViewStops===!1)return{...W,stops:[]};let K=p.get(d),$=K?o.sections.find(ae=>ae.id===K):void 0;return{...W,stops:ko(W,{aspect:z,seatingTopY:Number.isFinite(tn)?tn:o.bounds.box.max[1],section:$&&$.seatCount>0?{center:$.center,radius:$.radius}:null,venue:{center:o.bounds.center,radius:o.bounds.radius}})}},ce=Jo({container:t,model:o,opts:n,orbit:x,cinematic:ee,analytics:i,loop:O,labelOverlay:Q,stageAzimuth:G,overviewFraming:q,gpu:()=>c,isDisposed:()=>L,panorama:()=>F,setPanorama:d=>{F=d},setPanoramaSphereVisible:d=>{U=d},panoramaLoadAbort:()=>g,setPanoramaLoadAbort:d=>{g=d},setFrozen:d=>{P=d},restorePanoramaLayer:T,reducedMotion:$e,resolvedSeatViewPose:yt,showSectionSeatLabels:k,setNearFieldDetailEnabled:H,setSeatViewLocked:Ze,setNavigationMode:ke,showArriveChip:wt,removeArriveChip:Mt,inSeatView:()=>Oe!==null,setSeatStepping:d=>{en=d},seatViewArrival:(d,m)=>n.arriveAtSeatEye?cr(d,m):null,enterSeatView:d=>X?.enter(d)});I=!0;let Ct=ce.overviewChip,ur=ce.layoutOverviewChip,dr=ce.applyFloorFocus,mr=ce.focusOverview,nn=ce.cancelFlight,on=ce.flyToSeat,rn=ce.focusSectionCamera;lr.appendChild(Ct),xt={container:t,model:o,opts:n,analytics:i,orbit:x,loop:O,seatsById:l,ensureSeatView:Qt,resolvedSeatViewPose:yt,gpu:()=>c,gl:D.gl,isContextLost:()=>E,isDisposed:()=>L,flightGen:()=>ce.flightGen(),setPanorama:d=>{F=d},getLoadAbort:()=>g,setLoadAbort:d=>{g=d},setPanoramaSphereVisible:d=>{U=d,d&&X?.exit()},setFrozen:d=>{P=d},raisePanoramaLayer:R,restorePanoramaLayer:T,getOverviewChip:()=>Ct,labelOverlay:Q,reducedMotion:$e,removeArriveChip:Mt,showArriveChip:wt};let ge=jo({glctx:D,orbit:x,model:o,seats:e.seats,opts:n,cinematic:ee,analytics:i,seatIdByIndex:s,sectionIdBySeatId:p,tapSlop:oi,tapMs:ri,gpu:()=>c,pick:()=>b,seatViewLocked:()=>Se.seatViewLocked(),focusedSectionId:()=>se,selection:()=>C,cancelFlight:nn,focusSectionCamera:rn,focusSeatCamera:ce.focusSeatCamera,setSelection:Kt,ensureSeatView:Qt});D.canvas.addEventListener("pointerdown",ge.onDown),D.canvas.addEventListener("pointermove",ge.onMove),D.canvas.addEventListener("pointerup",ge.onUp),D.canvas.addEventListener("pointercancel",ge.onUp),O.requestRender();let At={setAvailability(d){let m=po(C,d),M=Et(o.seats,m);M.length&&c&&c.uploadSeatStateRuns(M),v(),O.requestRender()},setSelection:Kt,setNavigationMode:ke,zoomIn(){x.zoomBy(Te),O.requestRender()},zoomOut(){x.zoomBy(We),O.requestRender()},flyToSeat:on,focusOverview:mr,seatViewStop:()=>Oe,recentreSeatView:()=>X?.recentre()??!1,resize(){let{width:d,height:m}=D.resize();x.setAspect(d/Math.max(1,m)),ar(),sr(),ur(),O.requestRender()},stats(){return{...O.stats(),drawCalls:c?c.drawCalls:0,fallbackTriangles:c?c.seatGeometry.drawRange.count/3*o.seats.count:0,seatCount:o.seatCount}},captureImage(d=1280){if(E||!c||typeof document>"u")return null;J(0);let m=D.canvas,M=Math.min(1,d/Math.max(m.width,m.height,1)),z=document.createElement("canvas");z.width=Math.max(1,Math.round(m.width*M)),z.height=Math.max(1,Math.round(m.height*M));let W=z.getContext("2d");return W?(W.drawImage(m,0,0,z.width,z.height),z.toDataURL("image/jpeg",.82)):null},getQualityEvidence(){let d=O.stats(),m=D.canvas.clientWidth||1,M=D.canvas.clientHeight||1,z=o.bounds.center,W=xe(x.camera.projectionViewMatrix,[z[0],o.bounds.box.min[1],z[2]],m,M),K=xe(x.camera.projectionViewMatrix,[z[0],o.bounds.box.max[1],z[2]],m,M),$=o.bounds.box,ae=[$.min[0],$.max[0]].flatMap(_=>[$.min[1],$.max[1]].flatMap(ue=>[$.min[2],$.max[2]].map(oe=>xe(x.camera.projectionViewMatrix,[_,ue,oe],m,M)))).filter(_=>Number.isFinite(_.x)&&Number.isFinite(_.y)&&Number.isFinite(_.depth)),we=ae.length?(()=>{let _=Math.min(...ae.map(ye=>ye.x)),ue=Math.max(...ae.map(ye=>ye.x)),oe=Math.min(...ae.map(ye=>ye.y)),Je=Math.max(...ae.map(ye=>ye.y)),et=Math.max(0,_),ze=Math.min(m,ue),Ne=Math.max(0,oe),tt=Math.min(M,Je),pe=Math.max(0,ze-et),Ce=Math.max(0,tt-Ne);return{box:{x:et,y:Ne,width:pe,height:Ce},horizontalFillRatio:pe/m,verticalFillRatio:Ce/M,visibleAreaRatio:pe*Ce/(m*M),clippedEdges:[...oe<0?["top"]:[],...ue>m?["right"]:[],...Je>M?["bottom"]:[],..._<0?["left"]:[]]}})():void 0,Me=String(D.gl.getParameter(D.gl.VERSION)??"");return{viewport:{width:m,height:M},context:{webgl2:/webgl\s*2/i.test(Me),lost:E},frame:{rendered:d.rendered,idle:d.idle},camera:{position:[x.camera.position.x,x.camera.position.y,x.camera.position.z],distance:x.currentDistance,verticalFovDeg:x.fovY},scene:{seatCount:o.seatCount,floorCount:o.floors.length,zoneCount:o.zones.length,sectionCount:o.sections.length,authoredRelief:f,renderedVerticalSpanM:Math.max(0,o.bounds.box.max[1]-o.bounds.box.min[1]),projectedReliefPx:W.visible&&K.visible?Math.abs(W.y-K.y):0},labels:Q.qualityEvidence(),framing:we,...Oe?{seatView:{fovDeg:x.camera.fov,stop:Oe}}:{}}},getQualityReport(){return Nt(At.getQualityEvidence())},loseContextForTest(){D.simulateContextLossCycle()},floors(){return o.floors},focusFloor(d){if(d!==null&&!o.floors.some(M=>M.index===d))return!1;let m=d??-1;if(H(d!==null),Ze(!1),dr(m),ke("orbit"),d===null)ee.cancel(),$e()?x.frame(o.bounds,!1,G,n.portraitOverviewCrop===!0,q):x.frameSoft(o.bounds,G,n.portraitOverviewCrop===!0,q);else{let M=o.floors[d];if(M.seatCount>0){ee.cancel();let z=M.focalWorld[0]-M.center[0],W=M.focalWorld[2]-M.center[2],K=Math.hypot(z,W)>M.radius*.12?Math.atan2(z,W):G;x.frame({center:M.center,radius:M.radius,box:M.box},!1,K,!1,{polarDeg:58,margin:1.12})}}return O.requestRender(),!0},zones(){return o.zones},focusZone(d){let m=o.zones.find(K=>K.id===d);if(!m||m.seatCount===0)return!1;H(!1),Ze(!1),ee.cancel(),ke("orbit"),k(null),n.onSectionFocusChange?.(null);let M=m.focalWorld[0]-m.center[0],z=m.focalWorld[2]-m.center[2],W=Math.hypot(M,z)>m.radius*.12?Math.atan2(M,z):void 0;return x.frame({center:m.center,radius:m.radius*1.25},!1,W),O.requestRender(),!0},sections(){return o.sections},focusSection(d){return rn(d)},rows(d){return d?o.rows.filter(m=>m.sectionId===d):o.rows},seatsInRow(d){return e.seats.filter(m=>m.rowId===d).map(m=>({id:m.id,label:m.displayLabel||m.label}))},focusRow(d){let m=o.rows.find(M=>M.id===d);return!m||m.seatCount===0?!1:(H(!0),Ze(!1),ee.cancel(),ke("pan"),m.sectionId&&(k(m.sectionId),n.onSectionFocusChange?.(m.sectionId)),x.frame({center:m.center,radius:Math.max(2.5,m.radius*.65)}),O.requestRender(),!0)},setReducedMotionForTest(d){w=d},dispose(){L=!0,Mt(),Ct.remove(),ir.remove(),nn(),X?.dispose(),O.stop(),Q.dispose(),ne?.disconnect(),F&&(F.dispose(),F=null),T(),he(),D.canvas.removeEventListener("pointerdown",ge.onDown),D.canvas.removeEventListener("pointermove",ge.onMove),D.canvas.removeEventListener("pointerup",ge.onUp),D.canvas.removeEventListener("pointercancel",ge.onUp),x.dispose(),b&&b.dispose(),c&&c.dispose(),c=null,b=null,D.dispose()}};return i.opened(o.seatCount,f,e.prepared?.buildMs??performance.now()-r,e.prepared?.source??"inline"),At}export{zr as VENUE3D_QUALITY_REPORT_VERSION,hr as autoVenue3d,He as buildSceneModel,Ft as estimateVenue3D,Nt as inspectVenue3DQualityEvidence,fl as mountVenue3D,ei as prepareVenue3D,ti as prepareVenue3DFromChart};
|
|
827
|
+
void main(){ if(vDim>0.5) discard; vec4 c=texture(uImage,vUv); if(c.a<0.01) discard; fragColor=c; }`,uniforms:{uImage:{value:ue},uFocusFloor:{value:-1}},transparent:!1,depthTest:!0,depthWrite:!0,cullFace:!1});let G=new Ze(t,{geometry:oe,program:K});G.frustumCulled=!1,G.setParent(n),de.screenProgram=K,te=!0,de.drawCalls=3+(z?1:0)+1},N.src=le.contentImageUrl}return de}import{Mesh as Kt,RenderTarget as oa,Transform as $t}from"ogl";function na(t,e,n){let r=t+(e<<8)+(n<<16);return r===0?-1:r-1}function Vo(t,e,n,r,i,o){let a=-1,s=1/0;for(let l=0;l<n;l++)for(let u=0;u<e;u++){let m=(l*e+u)*4,d=na(t[m],t[m+1],t[m+2]);if(d<0||d>=o)continue;let p=u-r,f=l-i,c=p*p+f*f;c<s&&(s=c,a=d)}return a}function Lo(t,e,n,r,i,o){let a=t-n.left,s=e-n.top,l=Math.round(a*r),u=Math.round((n.height-s)*r);return{x:Math.max(0,Math.min(i-1,l)),y:Math.max(0,Math.min(o-1,u))}}var ra=["uSeatRadius","uSeatScale","uMinPixels","uPixelToWorld"],vt=class{constructor(e,n,r,i,o){this.seatScene=new $t;this.chairScene=new $t;this.solidScene=new $t;this.target=null;this.restoreClear=[0,0,0];this.renderer=e,this.gl=e.gl,this.maxIndex=o,this.seatProg=xo(this.gl),this.chairProg=So(this.gl),this.depthProg=wo(this.gl);let a=new Kt(this.gl,{geometry:n,program:this.seatProg});a.frustumCulled=!1,a.setParent(this.seatScene);let s=new Kt(this.gl,{geometry:r,program:this.chairProg});s.frustumCulled=!1,s.setParent(this.chairScene);let l=new Kt(this.gl,{geometry:i,program:this.depthProg});l.frustumCulled=!1,l.setParent(this.solidScene)}setRestoreClear(e){this.restoreClear=[e[0],e[1],e[2]]}syncFromSeatProgram(e){for(let r of ra)this.seatProg.uniforms[r].value=e.uniforms[r].value;let n=e.uniforms.uFocusFloor.value;this.seatProg.uniforms.uFocusFloor.value=n,this.chairProg.uniforms.uFocusFloor.value=n,this.depthProg.uniforms.uFocusFloor.value=n}ensureTarget(){let e=this.gl.drawingBufferWidth,n=this.gl.drawingBufferHeight;return this.target&&(this.target.width!==e||this.target.height!==n)&&this.destroyTarget(),this.target||(this.target=new oa(this.gl,{width:e,height:n,depth:!0})),this.target}destroyTarget(){if(!this.target)return;let e=this.gl;this.target.buffer&&e.deleteFramebuffer(this.target.buffer);for(let n of this.target.textures??[])n.texture&&e.deleteTexture(n.texture);this.target.depthBuffer&&e.deleteRenderbuffer(this.target.depthBuffer),this.target=null}pick(e,n,r,i){let o=this.gl,a=this.ensureTarget(),s=o.drawingBufferWidth,l=o.drawingBufferHeight,u=Math.max(0,n-i),m=Math.max(0,r-i),d=Math.max(1,Math.min(s,n+i+1)-u),p=Math.max(1,Math.min(l,r+i+1)-m);o.enable(o.SCISSOR_TEST),o.scissor(u,m,d,p);let[f,c,g]=this.restoreClear;o.clearColor(0,0,0,1),this.renderer.render({scene:this.solidScene,camera:e,target:a,clear:!0}),this.renderer.render({scene:this.seatScene,camera:e,target:a,clear:!1}),this.renderer.render({scene:this.chairScene,camera:e,target:a,clear:!1}),o.clearColor(f,c,g,1),o.disable(o.SCISSOR_TEST);let S=new Uint8Array(d*p*4);return this.renderer.bindFramebuffer(a),o.readPixels(u,m,d,p,o.RGBA,o.UNSIGNED_BYTE,S),this.renderer.bindFramebuffer(),Vo(S,d,p,n-u,r-m,this.maxIndex)}dispose(){this.destroyTarget(),this.seatProg.remove(),this.chairProg.remove(),this.depthProg.remove()}};function ko(t,e){let n=[];for(let r of e)t.has(r.seatId)?t.set(r.seatId,Cn(r.state)):n.push(r);return n}function Oo(t,e,n){let r=new Set;for(let a of e)(t.has(a)||n(a)!==void 0)&&r.add(a);let i=new Map(t),o=[];for(let[a,s]of t)r.has(a)||(o.push({seatId:a,state:be[s]??"available"}),i.delete(a));for(let a of r){if(i.has(a))continue;let s=n(a);s!==void 0&&(i.set(a,s),o.push({seatId:a,state:"selected"}))}return{updates:o,next:i}}import{Quat as Je,Vec3 as sa}from"ogl";function ia(t,e){return[t[0]-e[0],t[1]-e[1],t[2]-e[2]]}function zo(t,e){return[t[0]+e[0],t[1]+e[1],t[2]+e[2]]}function aa(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function No(t){let e=Math.hypot(t[0],t[1],t[2]);return e>1e-6?[t[0]/e,t[1]/e,t[2]/e]:[0,0,0]}function Qt(t){let e=Math.max(0,Math.min(1,t));return e*e*e*(e*(e*6-15)+10)}function Zt(t,e){return Math.max(0,Math.min(1,t+e))}function Ho(t,e){let n=t.length;if(n===0)return[0,0,0];if(n===1)return[...t[0]];let r=Math.max(0,Math.min(1,e)),i=n-1,o=Math.floor(r*i);o>=i&&(o=i-1);let a=r*i-o,s=t[Math.max(0,o-1)],l=t[o],u=t[o+1],m=t[Math.min(n-1,o+2)],d=a*a,p=d*a,f=[0,0,0];for(let c=0;c<3;c++)f[c]=.5*(2*l[c]+(-s[c]+u[c])*a+(2*s[c]-5*l[c]+4*u[c]-m[c])*d+(-s[c]+3*l[c]-3*u[c]+m[c])*p);return f}function Jt(t,e,n,r,i){let o=No(ia(e,n));o[0]===0&&o[1]===0&&o[2]===0&&(o=[0,0,1]);let a=zo(zo(e,aa(o,2.5)),[0,1.5,0]),s=[e[0]-r[0],0,e[2]-r[2]],l=No(s);l[0]===0&&l[2]===0&&(l=[o[0],0,o[2]]);let u=Math.max(1,i),m=[r[0]+l[0]*u*1.3,r[1]+u*.75,r[2]+l[2]*u*1.3];return{waypoints:[t,m,a],finalPos:a}}function en(t,e,n=35,r=28){let i=Qt(e),o=Ho(t,i),a=Qt(Math.max(0,Math.min(1,(e-.66)/.34)));return{pos:o,fov:n+(r-n)*a,eased:i}}function Uo(t,e,n){let r=t.position.clone(),i=new Je().copy(t.quaternion);t.position.set(e[0],e[1],e[2]),t.lookAt(new sa(n[0],n[1],n[2]));let o=new Je().copy(t.quaternion);return t.position.copy(r),t.quaternion.copy(i),o}var bt=class{constructor(e){this.active=!1;this.waypoints=[];this.startQuat=new Je;this.endQuat=new Je;this.outQuat=new Je;this.startTime=0;this.duration=2500;this.endFov=28;this.resolveFn=null;this.camera=e}start(e,n,r,i=2500,o=28){return this.settle(),this.waypoints=e,this.startQuat.copy(n),this.endQuat.copy(r),this.duration=i,this.endFov=o,this.startTime=performance.now(),this.active=!0,new Promise(a=>{this.resolveFn=a})}update(e){if(!this.active)return!1;let n=Math.min(1,(e-this.startTime)/this.duration),{pos:r,fov:i,eased:o}=en(this.waypoints,n,35,this.endFov);return this.camera.position.set(r[0],r[1],r[2]),this.outQuat.copy(this.startQuat).slerp(this.endQuat,Zt(o,.15)),this.camera.quaternion.copy(this.outQuat),this.camera.fov=i,this.camera.updateProjectionMatrix(),n>=1?(this.settle(),!1):!0}cancel(){this.settle()}settle(){this.active=!1;let e=this.resolveFn;this.resolveFn=null,e&&e()}};var Yo=An,la=.12,ca=.25,ua=1.5;function Xo(t,e,n=0,r,i){let o=[e.x*Te,n+ua,e.y*Te],a=i?[i[0],i[1],i[2]]:o,s=t[1],l=Number.isFinite(s)?s+Yo:Number.isFinite(r)?n+r:n+Yo,u=o[0]-t[0],m=o[2]-t[2],d=Math.hypot(u,m),p=d>.001?Math.min(la,d*ca):0,f=d>.001?u/d:0,c=d>.001?m/d:0;return{eye:[t[0]+f*p,l,t[2]+c*p],focal:a}}var Se=Math.PI/180,da=45,tn=80,gt=70,ma=1,ha=.99;function pa(t,e){if(!(t<ma))return tn;if(!(Number.isFinite(e)&&e>0))return gt;let n=2*Math.atan(e/(2*yt*ha)/Math.max(.05,t))/Se;return Math.max(gt,Math.min(tn,n))}var fa=.25,yt=1,va=.25,ba=12*Se,ga=.2,ya=1.5,qo=.8,jo=6,er=1.9,xa=2/3,Sa=.12,wa=.9,Ma=1.2,Aa=2,tr=.05,Pa=6;function nr(t,e,n=0){if(!t.length)return{min:[e[0]-6,n,e[2]-6],max:[e[0]+6,Math.max(n+qo,e[1]),e[2]+6]};let r=1/0,i=-1/0,o=1/0,a=-1/0,s=n;for(let c of t)r=Math.min(r,c.cx-c.halfX),i=Math.max(i,c.cx+c.halfX),o=Math.min(o,c.cz-c.halfZ),a=Math.max(a,c.cz+c.halfZ),s=Math.max(s,c.y);let l=i-r,u=a-o,m=Math.max(l,Math.min(u,jo))/2,d=Math.max(u,Math.min(l,jo))/2,p=(r+i)/2,f=(o+a)/2;return{min:[p-m,n,f-d],max:[p+m,Math.max(n+qo,s),f+d]}}function Ca(t){return{min:[t.min[0],t.min[1],t.min[2]],max:[t.max[0],t.max[1]+er,t.max[2]]}}function nn(t){let e=t.max[1];return[(t.min[0]+t.max[0])/2,Math.max(t.min[1]+ya,e+ga,e+er*xa),(t.min[2]+t.max[2])/2]}function or(t,e){let n=t[0]-e[0],r=t[2]-e[2],i=Math.hypot(n,r);return i<.001?{x:0,z:1}:{x:n/i,z:r/i}}function Ko(t,e,n){let r=e[0]-t[0],i=e[1]-t[1],o=e[2]-t[2],a=Math.hypot(r,i,o)||1;r/=a,i/=a,o/=a;let s=-o,l=r,u=Math.hypot(s,l);if(u<1e-6)return 1/0;s/=u,l/=u;let m=1/0,d=-1/0;for(let p=0;p<8;p++){let f=(p&1?n.max[0]:n.min[0])-t[0],c=(p&2?n.max[1]:n.min[1])-t[1],g=(p&4?n.max[2]:n.min[2])-t[2],S=Math.max(tr,f*r+c*i+g*o),w=(f*s+g*l)/S;w<m&&(m=w),w>d&&(d=w)}return d-m}function $o(t,e,n){let r=e[0]-t[0],i=e[1]-t[1],o=e[2]-t[2],a=Math.hypot(r,i,o)||1;r/=a,i/=a,o/=a;let s=-o,l=r,u=Math.hypot(s,l);if(u<1e-6)return 1/0;s/=u,l/=u;let m=-l*i,d=l*r-s*o,p=s*i,f=1/0,c=-1/0;for(let g=0;g<8;g++){let S=(g&1?n.max[0]:n.min[0])-t[0],w=(g&2?n.max[1]:n.min[1])-t[1],I=(g&4?n.max[2]:n.min[2])-t[2],P=Math.max(tr,S*r+w*i+I*o),E=(S*m+w*d+I*p)/P;E<f&&(f=E),E>c&&(c=E)}return c-f}function xt(t,e){return Math.tan(t*Se/2)*Math.max(.05,e)}function Qo(t,e,n){let r=pa(n,t),i=l=>Math.max(da,Math.min(r,l)),o=l=>2*Math.atan(l)/Se,a=Number.isFinite(t)&&t>0?i(o(t/(2*fa)/Math.max(.05,n))):r;if(!(Number.isFinite(e)&&e>0))return a;let s=Math.min(a,i(o(e/(2*Sa))));return t/(2*xt(s,n))>yt?a:s}function rr(t,e,n,r={}){let i=nn(e),o=[t[0],t[1],t[2]],a=0,s=0,l=c=>{if(!(c>0))return;let g=or(o,i);o[0]+=g.x*c,o[2]+=g.z*c,s+=c},u=r.preserveEye?0:e.max[1]+va-o[1];u>0&&(o[1]+=u,a=u,l(u/Math.tan(ba)));let m=Ca(e),d=Ko(o,i,e),p=Qo(d,$o(o,i,m),n),f=d/(2*xt(p,n));for(let c=0;!r.preserveEye&&c<Pa&&f>yt;c++){let g=Math.max(1,Math.hypot(o[0]-i[0],o[2]-i[2])),S=Number.isFinite(f)?f/yt:2;l(Math.min(60,g*(Math.min(4,S)-1)+.5)),d=Ko(o,i,e),p=Qo(d,$o(o,i,m),n),f=d/(2*xt(p,n))}return{eye:o,focal:i,fov:p,raisedM:a,pulledBackM:s,stageFrameWidth:f}}function Ea(t,e,n){let r=Math.tan(e*Se/2),i=xt(e,n);return Math.max(1,t/Math.max(.05,Math.min(r,i)))}var Ra=.7,Zo=.5,Ta=.8;function Jo(t,e,n){let r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],i=[n[0]-t[0],n[1]-t[1],n[2]-t[2]],o=r[0]*i[0]+r[1]*i[1]+r[2]*i[2],a=Math.hypot(r[0],r[1],r[2])*Math.hypot(i[0],i[1],i[2])||1;return Math.acos(Math.max(-1,Math.min(1,o/a)))/Se}function Da(t,e,n){let r=u=>{let m=Math.hypot(u[0],u[1],u[2])||1;return[u[0]/m,u[1]/m,u[2]/m]},i=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],o=Math.hypot(i[0],i[1],i[2]),a=r(i),s=r([n[0]-t[0],n[1]-t[1],n[2]-t[2]]),l=r([0,1,2].map(u=>a[u]*(1-Zo)+s[u]*Zo));return[t[0]+l[0]*o,t[1]+l[1]*o,t[2]+l[2]*o]}function ir(t,e){let{aspect:n,venue:r}=e,i=t.focal,o=or(t.eye,i),a=g=>(g[0]-i[0])*o.x+(g[2]-i[2])*o.z,s=[{name:"seat",eye:t.eye,focal:i,fov:t.fov}],l=Aa*(e.rowDepthM??wa),u=[t.eye[0]+o.x*l,t.eye[1]+Ma,t.eye[2]+o.z*l],m=[t.eye[0],t.eye[1]-Ra,t.eye[2]],d=Da(u,i,m);s.push({name:"row",eye:u,focal:d,fov:Math.min(tn,Math.max(t.fov,2*Math.max(Jo(u,d,m),Jo(u,d,i))/Ta))});let p=(g,S,w,I)=>{let P=Ea(w,t.fov,n)*1.08,E=P*Math.sin(I*Se),W=Number.isFinite(e.seatingTopY)?e.seatingTopY+2:-1/0,H=Math.max(E,W-S[1]),v=P*Math.cos(I*Se);return{name:g,eye:[S[0]+o.x*v,S[1]+H,S[2]+o.z*v],focal:S,fov:t.fov}};e.section&&e.section.radius>0&&s.push(p("section",e.section.center,e.section.radius,35)),s.push(p("venue",r.center,Math.max(1,r.radius),40));let f=[],c=-1/0;for(let g of s){let S=a(g.eye);f.length&&S<=c+.5||(f.push(g),c=S)}return f}import{Vec3 as Fa}from"ogl";var tt=Math.PI/180,on=320,ar=70*tt,_a=32*tt,Ia=24*tt,sr=.0026,Va=.22,La=.006,ka=180,Oa=900,za=1100,Na=4,pe=(t,e,n)=>Math.max(e,Math.min(n,t)),lr=t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;function cr(t){let{canvas:e,camera:n}=t,r=[],i=!1,o=0,a=0,s=0,l=0,u=0,m=0,d=on,p=null,f=()=>{p&&(clearTimeout(p),p=null)},c=!1,g=[0,0],S=0,w=!1,I=null,P=null,E=new Map,W=!1,H=0,v=0,y=0,T=0,R=()=>i&&r.length?r[pe(Math.round(o),0,r.length-1)].name:null,U=()=>{let M=R();M!==I&&(I=M,t.onStopChange?.(M))},F=()=>{if(!i||!r.length)return;let M=r[pe(Math.floor(o),0,r.length-1)],z=r[pe(Math.ceil(o),0,r.length-1)],te=pe(o-Math.floor(o),0,1),X=(Q,B)=>Q+(B-Q)*te,oe=[X(M.eye[0],z.eye[0]),X(M.eye[1],z.eye[1]),X(M.eye[2],z.eye[2])],K=[X(M.focal[0],z.focal[0]),X(M.focal[1],z.focal[1]),X(M.focal[2],z.focal[2])],ue=K[0]-oe[0],ae=K[1]-oe[1],re=K[2]-oe[2],de=Math.hypot(ue,ae,re)||1,le=Math.atan2(ue,re),N=Math.asin(pe(ae/de,-1,1)),$=le+a,G=pe(N+s,-80*tt,80*tt),ee=Math.cos(G)*de;ue=Math.sin($)*ee,ae=Math.sin(G)*de,re=Math.cos($)*ee,n.position.set(oe[0],oe[1],oe[2]),n.fov=X(M.fov,z.fov),n.updateProjectionMatrix(),n.lookAt(new Fa(oe[0]+ue,oe[1]+ae,oe[2]+re)),t.onApplied?.()},D=()=>{if(!i||!r.length)return;let M=pe(Math.round(o),0,r.length-1);if(t.reducedMotion()){c=!1,o=M,F(),U(),t.requestRender();return}if(Math.abs(M-o)<.001){c=!1,U();return}l=o,u=M,m=performance.now(),d=on,c=!0,t.requestRender()},Y=M=>{!i||r.length<2||(f(),c=!1,o=pe(o+M,0,r.length-1),F(),U(),t.requestRender())},q=(M,z)=>{i&&(f(),c=!1,w=!1,a=pe(a-M*sr,-ar,ar),s=pe(s-z*sr,-Ia,_a),F(),t.requestRender())},V=M=>{i&&(E.set(M.pointerId,{x:M.clientX,y:M.clientY}),E.size===1?(W=!0,T=0,H=M.clientX,v=M.clientY):E.size===2&&(W=!1,y=j()))},j=()=>{let M=[...E.values()];return M.length<2?0:Math.hypot(M[0].x-M[1].x,M[0].y-M[1].y)},C=M=>{if(!i||!E.has(M.pointerId))return;if(E.set(M.pointerId,{x:M.clientX,y:M.clientY}),E.size>=2){let X=j();y>0&&Y((y-X)*La),y=X;return}if(!W)return;let z=M.clientX-H,te=M.clientY-v;H=M.clientX,v=M.clientY,T+=Math.abs(z)+Math.abs(te),!(T<=Na)&&q(z,te)},x=M=>{E.delete(M.pointerId)&&(E.size<2&&(y=0),E.size===0&&(W=!1,D()))},ie=M=>{if(!i)return;M.preventDefault();let z=M.deltaMode===1?16:M.deltaMode===2?100:1,te=pe(M.deltaY*z/100,-2,2);Y(te*Va),P&&clearTimeout(P),P=setTimeout(()=>{P=null,D()},ka)},k=()=>{f(),i&&(i=!1,c=!1,w=!1,r=[],E.clear(),W=!1,P&&(clearTimeout(P),P=null),I!==null&&(I=null,t.onStopChange?.(null)))};return e.addEventListener("pointerdown",V),e.addEventListener("pointermove",C),e.addEventListener("pointerup",x),e.addEventListener("pointercancel",x),e.addEventListener("wheel",ie,{passive:!1}),{get active(){return i},enter(M,z=0){if(M.length<2){k();return}f(),r=M,i=!0,o=t.reducedMotion()?0:pe(z,0,M.length-1),o>0&&(p=setTimeout(()=>{p=null,i&&(l=o,u=0,m=performance.now(),d=za,c=!0,t.requestRender())},Oa)),a=0,s=0,c=!1,w=!1,I=null,F(),U(),t.requestRender()},exit:k,recentre(){return i?Math.abs(a)<1e-4&&Math.abs(s)<1e-4?!0:t.reducedMotion()?(w=!1,a=0,s=0,F(),t.requestRender(),!0):(g=[a,s],S=performance.now(),w=!0,t.requestRender(),!0):!1},update(M){if(!i)return!1;let z=!1;if(w){let te=pe((M-S)/on,0,1),X=1-lr(te);a=g[0]*X,s=g[1]*X,te>=1?(w=!1,a=0,s=0):z=!0}if(c){let te=pe((M-m)/d,0,1);o=l+(u-l)*lr(te),te>=1?(c=!1,o=u,U()):z=!0}return F(),z},currentStop:R,dispose(){k(),e.removeEventListener("pointerdown",V),e.removeEventListener("pointermove",C),e.removeEventListener("pointerup",x),e.removeEventListener("pointercancel",x),e.removeEventListener("wheel",ie)}}}function ur(t){return t.flying?"cinematic":t.panoramaMounted?"panorama":t.seatViewActive?"seatView":"orbit"}var rn=null;function dr(){return rn??=import("../openPanorama-6FMXAJ6O.js").catch(t=>{throw rn=null,t}),rn}var mr=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),St=class{constructor(e){this.orbitLatched=!1;this.panoramaOpenedAt=0;this.cb=e}emit(e,n){if(this.cb)try{this.cb(e,n)}catch{}}opened(e,n,r,i){this.emit("3d_opened",{seats:e,hasHeights:n,...r===void 0?{}:{buildMs:Math.round(r)},...i===void 0?{}:{prepSource:i}})}orbitEngaged(){this.orbitLatched||(this.orbitLatched=!0,this.emit("3d_orbit_engaged"))}seatPicked(e,n){this.emit("3d_seat_picked",{seatId:e,sectionId:n})}cinematicPlayed(e){this.emit("3d_cinematic_played",{durationMs:e,reducedMotion:!1})}cinematicSkipped(){this.emit("3d_cinematic_skipped",{reducedMotion:!0})}cinematicCancelled(){this.emit("3d_cinematic_cancelled")}panoramaOpened(){this.panoramaOpenedAt=mr(),this.emit("3d_panorama_opened")}panoramaClosed(){let e=this.panoramaOpenedAt?Math.round(mr()-this.panoramaOpenedAt):0;this.panoramaOpenedAt=0,this.emit("3d_panorama_closed",{viewMs:e})}panoramaFailed(e,n){this.emit("3d_panorama_failed",{seatId:e,phase:n})}panoramaFallback(e){this.emit("3d_panorama_fallback",{seatId:e})}contextLost(){this.emit("3d_context_lost")}contextRestored(){this.emit("3d_context_restored")}};function hr(t){let e=t.style.position;return getComputedStyle(t).position!=="static"?()=>{}:(t.style.position="relative",()=>{t.style.position==="relative"&&(t.style.position=e)})}function pr(t){let{container:e,model:n,opts:r,expandedSeatById:i,seatIdsByRow:o,isNarrow:a}=t,s=null,l=()=>{if(!s)return;let d=a();Object.assign(s.style,d?{left:"12px",right:"12px",bottom:"70px",transform:"none",justifyContent:"center"}:{left:"50%",right:"auto",bottom:"18px",transform:"translateX(-50%)",justifyContent:"initial"})},u=()=>{s?.remove(),s=null};return{show:(d,p,f=!1)=>{if(u(),t.isDisposed())return null;let c=document.createElement("div");c.setAttribute("role","group"),Object.assign(c.style,{position:"absolute",display:"flex",flexDirection:"column",alignItems:"center",gap:"6px",zIndex:"4"});let g=r.chrome?.caption!==!1,S=r.chrome?.seatStepper!==!1;if(!g&&!S)return null;let w=i.get(d),I=w?.sectionId?n.sections.find(R=>R.id===w.sectionId):void 0,P=w?.label??d;c.setAttribute("aria-label",`Explore views near ${I?.label?`${I.label}, `:""}seat ${P}`);let E=document.createElement("span");E.textContent=r.seatViewCaption?.(d)??["Live 3D seat view",I?.label,P].filter(Boolean).join(" \xB7 "),Object.assign(E.style,{maxWidth:"min(70vw, 560px)",padding:"5px 10px",borderRadius:"999px",overflow:"hidden",color:"#d9e3f5",background:"rgba(12,18,32,0.72)",font:"600 11px/1.2 inherit",textOverflow:"ellipsis",whiteSpace:"nowrap",backdropFilter:"blur(6px)"}),g&&c.appendChild(E);let W=document.createElement("div");Object.assign(W.style,{display:"flex",alignItems:"center",justifyContent:"center",gap:"6px"}),c.appendChild(W);let H=w?.rowId?o.get(w.rowId):void 0,v=H?.indexOf(d)??-1,y=v>=0?[H?.[v-1],H?.[v+1]]:[void 0,void 0],T=(R,U,F,D=!1)=>{let Y=document.createElement("button");Y.type="button",Y.textContent=R,Y.setAttribute("aria-label",U),Object.assign(Y.style,{minHeight:"44px",padding:D?"10px 16px":"10px",borderRadius:"999px",background:"rgba(12,18,32,0.78)",color:"#eef1f8",border:"1px solid rgba(150,165,205,0.4)",backdropFilter:"blur(6px)",font:"600 13px/1 inherit",cursor:"pointer",whiteSpace:"nowrap"}),D||(Y.style.minWidth="44px"),D&&(Y.dataset.panoramaTrigger=""),Y.addEventListener("click",F),W.appendChild(Y)};if(S&&y[0]){let R=i.get(y[0])?.label??y[0];T("\u2039",`View previous seat ${R}`,()=>{t.flyToSeat(y[0])})}if(S&&r.getSeatView){let R=r.seatViewActionLabel?.(d)??"Open 360\xB0 panorama";T(f?`\u21BB Retry ${R}`:`\u25C9 ${R}`,`${f?"Retry":R} from seat ${P}`,()=>{if(t.isDisposed()||p!==t.flightGen()){u();return}u(),t.openPanorama(d,400,p)},!0)}if(S&&y[1]){let R=i.get(y[1])?.label??y[1];T("\u203A",`View next seat ${R}`,()=>{t.flyToSeat(y[1])})}return!W.childElementCount&&!g?null:(e.appendChild(c),s=c,l(),c)},remove:u,layout:l}}var Ha={rotate:"Drag to rotate the venue",move:"Drag to move the venue",zoomIn:"Zoom in",zoomOut:"Zoom out",fitView:"Show whole venue"};function fr(t){let{container:e,orbit:n,isNarrow:r}=t,i={...Ha,...t.labels??{}},o=(P,E)=>{P.setAttribute("aria-label",E),P.title=E},a=document.createElement("div"),s=!1;a.className="sl-3d-navigation-controls",Object.assign(a.style,{position:"absolute",right:"14px",bottom:"14px",display:"flex",zIndex:"4",flexDirection:"column",alignItems:"flex-end",gap:"7px"});let l=document.createElement("div");l.setAttribute("role","group"),l.setAttribute("aria-label","3D drag mode"),Object.assign(l.style,{display:"flex",flexDirection:"column",gap:"6px",alignItems:"flex-end"});let u=document.createElement("div");u.setAttribute("role","group"),u.setAttribute("aria-label","3D view controls"),Object.assign(u.style,{display:"flex",flexDirection:"column",gap:"6px",alignItems:"flex-end"});let m=document.createElement("button");m.type="button",m.textContent="\u21BB",o(m,i.rotate);let d=document.createElement("button");d.type="button",d.textContent="\u2725",o(d,i.move);let p=document.createElement("button");p.type="button",p.textContent="\u2212",o(p,i.zoomOut);let f=document.createElement("button");f.type="button",f.textContent="+",o(f,i.zoomIn);for(let P of[m,d,p,f])P.className="sl-3d-icon-control",Object.assign(P.style,{width:"44px",minWidth:"44px",minHeight:"44px",padding:"9px",border:"1px solid rgba(150,165,205,0.35)",borderRadius:"999px",color:"#c9d4ea",background:"rgba(12,18,32,0.82)",font:"600 17px/1 inherit",backdropFilter:"blur(6px)",cursor:"pointer",whiteSpace:"nowrap"});l.append(m,d),u.append(f,p);let c=P=>{n.setPrimaryDragMode(P);let E=P==="orbit";m.setAttribute("aria-pressed",String(E)),d.setAttribute("aria-pressed",String(!E)),m.style.background=E?"rgba(96,110,150,0.68)":"rgba(12,18,32,0.82)",d.style.background=E?"rgba(12,18,32,0.82)":"rgba(96,110,150,0.68)",a.title=E?`${i.rotate} \xB7 ${i.move} with Shift`:`${i.move} \xB7 ${i.rotate} with Shift`};m.addEventListener("click",()=>c("orbit")),d.addEventListener("click",()=>c("pan"));let g=()=>{let{atMin:P,atMax:E}=n.dollyLimitState();f.disabled!==P&&(f.disabled=P),p.disabled!==E&&(p.disabled=E)};p.addEventListener("click",()=>{n.zoomBy(Xe),g()}),f.addEventListener("click",()=>{n.zoomBy(Fe),g()}),a.append(l,u),c("orbit"),e.appendChild(a);let S=t.enabled!==!1,w=()=>{let P=r();a.style.display=s||!S?"none":"flex",a.style.right=P?"12px":"14px",a.style.bottom=P?"calc(env(safe-area-inset-bottom, 0px) + 76px)":"14px",l.style.display=P?"none":"flex",f.style.display=P?"none":"",p.style.display=P?"none":""};return w(),{element:a,utilityControls:u,setNavigationMode:c,syncZoomLimits:g,setSeatViewLocked:P=>{s=P,n.setInteractionEnabled(!P),w()},seatViewLocked:()=>s,layout:w}}var Ga=12;function Ba(t,e){if(!t)return!1;let n=t.x-e[0],r=t.y-e[1],i=t.z-e[2];return Math.hypot(n,r,i)>Ga}var Wa=.5,Ua=12;function Ya(t,e,n){return!(t>0)||!(n>0)?0:Wa*n/(2*t*Math.tan(e*Math.PI/360))}function vr(t){let{glctx:e,orbit:n,model:r,seats:i,opts:o,cinematic:a,analytics:s,seatIdByIndex:l,sectionIdBySeatId:u,tapSlop:m,tapMs:d,cancelFlight:p,focusSectionCamera:f,setSelection:c,ensureSeatView:g}=t,S=0,w=0,I=0,P=-1,E=!1,W=!1,H=F=>{t.seatViewLocked()||P===-1&&(P=F.pointerId,S=F.clientX,w=F.clientY,I=performance.now(),E=!1,W=a.active,a.active&&(s.cinematicCancelled(),p(),o.onViewTargetChange?.(null)))},v=F=>{F.pointerId===P&&Math.hypot(F.clientX-S,F.clientY-w)>m&&(E=!0)},y=(F,D,Y,q,V)=>{let j=e.canvas.getBoundingClientRect(),C=e.canvas.clientWidth||j.width||1,x=e.canvas.clientHeight||j.height||1,ie=F-j.left,k=D-j.top,M=q*q,z=-1,te=M,X=1/0;for(let oe of i){if(Y&&oe.sectionId!==Y)continue;let K=r.seats.idToIndex.get(oe.id);if(K===void 0)continue;if(V){let N=Math.round(r.seats.iState[K]??0);if(N!==0&&N!==3)continue}let ue=K*3,ae=ge(n.camera.projectionViewMatrix,[r.seats.iPosition[ue],r.seats.iPosition[ue+1]+.55,r.seats.iPosition[ue+2]],C,x);if(!ae.visible)continue;let re=ae.x-ie,de=ae.y-k,le=re*re+de*de;(le<te||Math.abs(le-te)<1&&ae.depth<X)&&(z=K,te=le,X=ae.depth)}return z},T=(F,D)=>{let Y=t.gpu(),q=t.pick();if(!Y||!q)return-1;q.syncFromSeatProgram(Y.seatProgram);let V=e.canvas.getBoundingClientRect(),j=e.renderer.dpr,{x:C,y:x}=Lo(F,D,V,j,e.gl.drawingBufferWidth,e.gl.drawingBufferHeight),ie=Math.max(2,Math.round(8*j));return q.pick(n.camera,C,x,ie)},R=F=>{let D=n.camera?.position;if(!D)return!1;let Y=F*3,q=Math.hypot(D.x-r.seats.iPosition[Y],D.y-r.seats.iPosition[Y+1],D.z-r.seats.iPosition[Y+2]),V=e.canvas.clientHeight||e.canvas.getBoundingClientRect().height;return Ya(q,n.fovY,V)>=Ua};return{onDown:H,onMove:v,onUp:F=>{if(F.pointerId!==P)return;let D=!E&&performance.now()-I<d;if(P=-1,W){W=!1;return}let Y=t.gpu(),q=t.pick();if(!D||!Y||!q)return;let V=T(F.clientX,F.clientY),j=V>=0&&R(V),C=!1;if(t.focusedSectionId()&&V>=0){let k=l[V],M=k?u.get(k):void 0;if(M&&M!==t.focusedSectionId()&&f(M,{keepCamera:j})){if(!j)return;C=!0}}if(t.focusedSectionId()&&V<0&&(V=y(F.clientX,F.clientY,t.focusedSectionId(),44,!1)),t.focusedSectionId()&&V<0){let k=y(F.clientX,F.clientY,null,72,!1),M=k>=0?l[k]:void 0,z=M?u.get(M):void 0;if(z&&z!==t.focusedSectionId()&&f(z))return}if(!t.focusedSectionId()){V<0&&(V=y(F.clientX,F.clientY,null,42,!1));let k=V>=0?l[V]:void 0,M=k?u.get(k):void 0;if(M&&f(M,{keepCamera:j})){if(!j)return;C=!0}}if(V<0||V>=l.length){t.selection().size&&(c([]),o.onViewTargetChange?.(null));return}let x=l[V],ie=be[Math.round(r.seats.iState[V]??0)]??"available";if(ie!=="available"&&ie!=="selected"){o.onSeatInspect?.(x,ie);return}if(t.selection().has(x)&&t.selection().size===1){c([]),o.onViewTargetChange?.(null),o.onSeatPick?.(x);return}if(c([x]),g(x),s.seatPicked(x,u.get(x)),o.onSeatPick?.(x),t.focusedSectionId()&&!C){let k=V*3,M=[r.seats.iPosition[k],r.seats.iPosition[k+1],r.seats.iPosition[k+2]];Ba(n.camera?.position,M)&&t.focusSeatCamera(x)}}}}var wt=class{constructor(e,n){this.minX=0;this.minZ=0;this.cell=1;this.cols=1;this.rows=1;this.cellStart=null;this.cellItems=null;this.iPosition=e,this.count=n}ensureGrid(){if(this.cellStart||this.count===0)return;let e=this.iPosition,n=1/0,r=1/0,i=-1/0,o=-1/0;for(let f=0;f<this.count;f++){let c=e[f*3],g=e[f*3+2];c<n&&(n=c),c>i&&(i=c),g<r&&(r=g),g>o&&(o=g)}let a=Math.max(i-n,.001),s=Math.max(o-r,.001);this.cell=Math.max(Math.sqrt(a*s*4/this.count),.25),this.cols=Math.max(1,Math.ceil(a/this.cell)+1),this.rows=Math.max(1,Math.ceil(s/this.cell)+1),this.minX=n,this.minZ=r;let l=this.cols*this.rows,u=new Int32Array(l+1),m=f=>{let c=Math.min(this.cols-1,Math.max(0,Math.floor((e[f*3]-n)/this.cell)));return Math.min(this.rows-1,Math.max(0,Math.floor((e[f*3+2]-r)/this.cell)))*this.cols+c};for(let f=0;f<this.count;f++)u[m(f)+1]++;for(let f=0;f<l;f++)u[f+1]+=u[f];let d=new Int32Array(this.count),p=u.slice(0,l);for(let f=0;f<this.count;f++)d[p[m(f)]++]=f;this.cellStart=u,this.cellItems=d}gather(e,n,r,i,o){this.ensureGrid();let a=this.cellStart,s=this.cellItems;if(!a||!s)return 0;let l=i.length,u=r*r,m=Math.floor((e-this.minX)/this.cell),d=Math.floor((n-this.minZ)/this.cell),p=Math.ceil(r/this.cell)+1,f=this.iPosition,c=0;for(let g=0;g<=p&&c<l;g++){let S=d-g,w=d+g,I=m-g,P=m+g;for(let E=S;E<=w&&c<l;E++){if(E<0||E>=this.rows)continue;let W=E===S||E===w;for(let H=I;H<=P&&c<l;H++){if(!W&&H!==I&&H!==P){H=P-1;continue}if(H<0||H>=this.cols)continue;let v=E*this.cols+H;for(let y=a[v],T=a[v+1];y<T&&c<l;y++){let R=s[y],U=f[R*3]-e,F=f[R*3+2]-n,D=o===void 0?0:f[R*3+1]-o;U*U+D*D+F*F<=u&&(i[c++]=R)}}}}return c}};var Mt=class{constructor(e){this.ctx=e;this.detailVisible=!1;this.seatDetailMix=0;this.structureDetailMix=0;this.nearBuf=new Int32Array(ht);this.lastGatherX=1/0;this.lastGatherZ=1/0;this.lastGatherY=1/0;this.nearIndex=new wt(e.model.seats.iPosition,e.model.seats.count)}forceRegather(){this.lastGatherX=1/0}setDetailEnabled(e){let n=this.ctx.gpu();e||(this.detailVisible=!1),this.lastGatherX=1/0,this.lastGatherZ=1/0,!e&&n?.nearSeatCount()&&n.setNearSeats(this.nearBuf,0)}update(e){let{model:n}=this.ctx,r=this.ctx.gpu();if(!r)return;if(!e){r.nearSeatCount()&&r.setNearSeats(this.nearBuf,0);return}let i=this.ctx.orbit().camera.position;if(Math.hypot(i.x-this.lastGatherX,i.y-this.lastGatherY,i.z-this.lastGatherZ)<Gt)return;if(this.lastGatherX=i.x,this.lastGatherY=i.y,this.lastGatherZ=i.z,Math.hypot(i.x-n.bounds.center[0],i.y-n.bounds.center[1],i.z-n.bounds.center[2])-n.bounds.radius>Ht){r.nearSeatCount()&&r.setNearSeats(this.nearBuf,0);return}let s=this.nearIndex.gather(i.x,i.z,Ht,this.nearBuf,i.y);s===0&&r.nearSeatCount()===0||r.setNearSeats(this.nearBuf,s)}ease(e,n,r){let i=1-Math.exp(-e*9),o=1-Math.exp(-e*20);this.seatDetailMix+=(n-this.seatDetailMix)*(n>this.seatDetailMix?i:o),this.structureDetailMix+=(r-this.structureDetailMix)*(r>this.structureDetailMix?i:o),Math.abs(n-this.seatDetailMix)<.01&&(this.seatDetailMix=n),Math.abs(r-this.structureDetailMix)<.01&&(this.structureDetailMix=r)}};function br(t){let e=Math.max(5,t.radius),n=t.focalWorld[0]-t.center[0],r=t.focalWorld[2]-t.center[2],i=Math.hypot(n,r);if(i<e*.12)return{center:t.center,radius:e,polarDeg:48};let o=Math.min(i*.25,e*.2);return{center:[t.center[0]+n/i*o,t.center[1],t.center[2]+r/i*o],radius:e+o,polarDeg:50}}import{Quat as Xa,Vec3 as qa}from"ogl";function gr(){let t="http://www.w3.org/2000/svg",e=document.createElementNS(t,"svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","18"),e.setAttribute("height","18"),e.setAttribute("aria-hidden","true"),e.setAttribute("focusable","false"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round");let n=document.createElementNS(t,"path");return n.setAttribute("d","M8 3H5a2 2 0 0 0-2 2v3M16 3h3a2 2 0 0 0 2 2v3M8 21H5a2 2 0 0 0-2-2v-3M16 21h3a2 2 0 0 0 2-2v-3"),e.appendChild(n),e}function Sr(t){let{container:e,model:n,opts:r,orbit:i,cinematic:o,analytics:a,loop:s,labelOverlay:l,stageAzimuth:u,overviewFraming:m}=t,d=0,p=-1,f=(v,y,T=28)=>{i.camera.position.set(v[0],v[1],v[2]),i.camera.lookAt(new qa(y[0],y[1],y[2])),i.camera.fov=T,i.camera.updateProjectionMatrix()},c=document.createElement("button");c.className="sl-3d-overview-control sl-3d-icon-control",c.type="button",c.replaceChildren(gr());let g=r.navLabels?.fitView??"Show whole venue";c.setAttribute("aria-label",g),c.title=g,Object.assign(c.style,{width:"44px",minWidth:"44px",minHeight:"44px",padding:"9px",borderRadius:"999px",background:"rgba(12,18,32,0.72)",color:"#c9d4ea",border:"1px solid rgba(150,165,205,0.35)",backdropFilter:"blur(6px)",font:"600 11px/1 inherit",cursor:"pointer",whiteSpace:"nowrap"});let S=()=>{c.firstElementChild||c.replaceChildren(gr())};S();let w=v=>{p=v;let y=t.gpu();y&&(y.seatProgram.uniforms.uFocusFloor.value=v,y.solidProgram.uniforms.uFocusFloor.value=v,y.chairProgram.uniforms.uFocusFloor.value=v),t.showSectionSeatLabels(null)},I=()=>{if(t.isDisposed())return;r.onViewTargetChange?.(null),r.onSectionFocusChange?.(null),t.panorama()&&(t.panorama().dispose(),t.setPanorama(null),a.panoramaClosed()),t.setPanoramaSphereVisible(!1),t.panoramaLoadAbort()?.abort(),t.setPanoramaLoadAbort(null),t.restorePanoramaLayer(),c.style.display="",l.setVisible(!0),t.setFrozen(!1);let v=p>=0?n.floors[p]:null;if(t.setNearFieldDetailEnabled(!!v),t.setSeatViewLocked(!1),P(),t.removeArriveChip(),t.setNavigationMode("orbit"),v){let y=v.focalWorld[0]-v.center[0],T=v.focalWorld[2]-v.center[2],R=Math.hypot(y,T)>v.radius*.12?Math.atan2(y,T):u,U={center:v.center,radius:v.radius,box:v.box},F={polarDeg:58,margin:1.12};t.reducedMotion()?i.frame(U,!1,R,!1,F):i.frameSoft(U,R,!1,F)}else t.reducedMotion()?i.frame(n.bounds,!1,u,r.portraitOverviewCrop===!0,m):i.frameSoft(n.bounds,u,r.portraitOverviewCrop===!0,m);t.showSectionSeatLabels(null),s.requestRender()},P=()=>{d++,t.setSeatStepping(!1),t.panoramaLoadAbort()?.abort(),t.setPanoramaLoadAbort(null),o.active&&(o.cancel(),i.resumeAfterFlight(n.focalWorld))},E=v=>{if(t.isDisposed()||!t.gpu())return Promise.resolve();let y=n.seats.idToIndex.get(v);if(y===void 0)return Promise.resolve();t.setNearFieldDetailEnabled(!0),r.onViewTargetChange?.(v),t.panorama()&&(t.panorama().dispose(),t.setPanorama(null),t.setPanoramaSphereVisible(!1),c.style.display="",t.restorePanoramaLayer()),t.panoramaLoadAbort()?.abort(),t.setPanoramaLoadAbort(null),t.setFrozen(!1);let T=t.inSeatView()&&r.arriveAtSeatEye===!0;t.setSeatStepping(T),t.setSeatViewLocked(!1);let R=++d;T?t.showArriveChip(v,R):t.removeArriveChip();let{eye:U,focal:F}=t.resolvedSeatViewPose(v,y),D=r.arriveAtSeatEye?t.seatViewArrival(v,y):null,Y=D&&D.stops.length>1&&D.stops[1].name==="row"?D.stops[1]:null,q=D?D.focal:F,V=[i.camera.position.x,i.camera.position.y,i.camera.position.z],j=Jt(V,D?.eye??U,q,n.bounds.center,n.bounds.radius),C=Y?Y.eye:D?D.eye:r.arriveAtSeatEye?U:j.finalPos,x=D?D.fov:r.arriveAtSeatEye?e.clientWidth/Math.max(1,e.clientHeight)<.7?gt:65:28,ie=[j.waypoints[0],j.waypoints[1],C];if(l.setVisible(!1),t.reducedMotion())return t.setSeatStepping(!1),f(C,q,x),s.requestRender(),a.cinematicSkipped(),t.isDisposed()||i.syncFromCamera(),t.setSeatViewLocked(r.arriveAtSeatEye===!0),D&&t.enterSeatView(D.stops),t.showArriveChip(v,R),Promise.resolve();let k=new Xa().copy(i.camera.quaternion),M=Uo(i.camera,C,q);s.requestRender();let z=T?700:2500;return o.start(ie,k,M,z,x).then(()=>{t.isDisposed()||R!==d||(t.setSeatStepping(!1),a.cinematicPlayed(z),i.resumeAfterFlight(q),t.setSeatViewLocked(r.arriveAtSeatEye===!0),D&&t.enterSeatView(D.stops,Y?1:0),s.requestRender(),t.showArriveChip(v,R))})},W=(v,y)=>{let T=n.sections.find(R=>R.id===v);if(!T||T.seatCount===0)return!1;if(t.setNearFieldDetailEnabled(!0),t.setSeatStepping(!1),t.setSeatViewLocked(!1),o.cancel(),t.removeArriveChip(),n.floors.length>1&&p!==T.floorIndex&&w(T.floorIndex),t.setNavigationMode("pan"),t.panorama()||l.setVisible(!0),t.showSectionSeatLabels(v),!y?.keepCamera){let R=br(T),U={polarDeg:R.polarDeg,margin:1.12};t.reducedMotion()?i.frame({center:R.center,radius:R.radius},!1,i.currentAzimuth,!1,U):i.glideTo({center:R.center,radius:R.radius},U)}return r.onSectionFocusChange?.(v),s.requestRender(),!0},H=v=>{if(t.isDisposed()||!t.gpu())return!1;let y=n.seats.idToIndex.get(v);if(y===void 0)return!1;let T=y*3,R=[n.seats.iPosition[T],n.seats.iPosition[T+1]+.55,n.seats.iPosition[T+2]];return t.reducedMotion()?i.frame({center:R,radius:yr},!1,void 0,!1,xr):i.frameSoft({center:R,radius:yr},void 0,!1,xr),s.requestRender(),!0};return c.addEventListener("click",I),{overviewChip:c,layoutOverviewChip:S,flightGen:()=>d,focusedFloor:()=>p,applyFloorFocus:w,placeCameraFinal:f,cancelFlight:P,focusOverview:I,flyToSeat:E,focusSectionCamera:W,focusSeatCamera:H}}var yr=4.5,xr={polarDeg:48,margin:1.25};function an(t,e,n,r,i,o,a,s,l=.5){let u=-1,m=s*s,d=1/0;for(let p=0;p<e;p++){let f=p*3,c=ge(n,[t[f],t[f+1]+l,t[f+2]],r,i);if(!c.visible)continue;let g=c.x-o,S=c.y-a,w=g*g+S*S;(w<m-4||w<m+4&&c.depth<d)&&(u=p,m=Math.min(m,w),d=c.depth)}return u}function wr(t){let e=performance.now(),{input:n,estimate:r}=Gn(t);return{model:Ye(n),buildMs:performance.now()-e,source:"main",...r?{estimate:r}:{}}}function ja(t){let e=Sn(t.doc);return{...wr({...t,seats:e}),seats:e}}function Mr(t,e,n){if(typeof Worker>"u")return Promise.resolve(e());let r;try{r=new Worker(new URL("./scene/scene.worker.js",import.meta.url),{type:"module"})}catch{return Promise.resolve(e())}return new Promise(i=>{let o=!1,a=u=>{o||(o=!0,clearTimeout(l),r.terminate(),i(u))},s=()=>a(e()),l=window.setTimeout(s,15e3);r.onerror=s,r.onmessage=u=>{let m=n(u.data);m?a(m):s()},r.postMessage(t)})}function Ka(t){return Mr(t,()=>wr(t),({model:e,buildMs:n,estimate:r})=>({model:e,buildMs:n,source:"worker",...r?{estimate:r}:{}}))}function $a(t){return Mr(t,()=>ja(t),({model:e,buildMs:n,seats:r,estimate:i})=>r?{model:e,buildMs:n,seats:r,source:"worker",...i?{estimate:i}:{}}:null)}var Qa=40,Za=48,Ja=Math.PI/180,es=6,ts=500;function xc(t,e,n={}){let r=performance.now(),i=e.prepared?e.prepared.estimate:e.estimate===!1?null:Vt(e.doc,e.seats);i&&(e={...e,doc:i.doc,seats:Hn(e.seats,i)});let o=e.prepared?.model??Ye(e),a=new St(n.onAnalytics),s=new Array(o.seats.count);for(let[h,b]of o.seats.idToIndex)s[b]=h;let l=new Map(e.seats.map(h=>[h.id,h])),u=new Map;for(let h of e.seats){if(!h.rowId)continue;let b=u.get(h.rowId);b?b.push(h.id):u.set(h.rowId,[h.id])}let m=new Map;e.seats.forEach((h,b)=>{m.set(h.id,o.seatSectionIds?.[b]??h.sectionId)});let d=new Map;for(let[h,b]of o.seats.idToIndex){let A=m.get(h);if(!A)continue;let _=d.get(A);_?_.push(b):d.set(A,[b])}let p=()=>{if(!c||!o.sectionSolidRanges.length)return;let{lit:h,anyUnlit:b}=Ro(o.sectionSolidRanges,d,o.seats.iState);c.setSectionShellLit(b?h:null)},f=e.doc.floors?.some(b=>(b.baseHeightM??0)>0)?!0:(e.doc.floors?.flatMap(b=>b.objects)??e.doc.objects).some(b=>b.type==="section"&&((b.height??0)>0||(b.rake??0)>0)),c=null,g=null,S=null,w=!1,I=!1,P=!1,E=new Map,W=null,H=null,v=null,y=new Map,T=null,R=()=>{v===null&&(v=t.style.zIndex,t.style.zIndex="20")},U=()=>{v!==null&&(t.style.zIndex==="20"&&(t.style.zIndex=v),v=null)},F=!1,D=()=>F?me.focusedFloor():-1,Y=()=>{c=Io(C.gl,o),g?.dispose(),g=ro(C.gl,[1,1,1]),un(!1),p(),N(),S=new vt(C.renderer,c.seatGeometry,c.chairGeometry,c.solidGeometry,o.seats.count),C.setClearColor(o.theme.background.top),S.setRestoreClear(o.theme.background.top),c.seatProgram.uniforms.uSeatRadius.value=Ue*o.theme.seatScale,c.seatProgram.uniforms.uFocusFloor.value=D(),c.solidProgram.uniforms.uFocusFloor.value=D(),c.chairProgram.uniforms.uFocusFloor.value=D(),c.screenProgram&&(c.screenProgram.uniforms.uFocusFloor.value=D()),V.forceRegather()},q=!1,V=new Mt({model:o,orbit:()=>x,gpu:()=>c}),j=h=>V.setDetailEnabled(h),C=new ut(t,{onContextLost:()=>{P||a.contextLost(),w=!0,B.stop(),c=null,S=null},onContextRestored:()=>{Y(),w=!1,P||a.contextRestored(),B.requestRender()}}),x=new dt(C.gl,C.canvas,()=>B.requestRender(),()=>a.orbitEngaged());x.setAspect(C.aspect);let ie=(e.doc.floors?.flatMap(h=>h.objects)??e.doc.objects).some(h=>h.type==="section"&&h.physical3dProvenance?.surfaceKind?.status==="inferred"),k=(()=>{if(Number.isFinite(n.overviewAzimuthDeg))return n.overviewAzimuthDeg*Math.PI/180;if(!(ie&&o.stages.length===0))return Bn(o.focalWorld,o.seats.iPosition,o.bounds)})(),M=(e.doc.floors?.flatMap(h=>h.objects)??e.doc.objects).some(h=>h.type==="shape"&&h.stageKind?.startsWith("pitch-")),z=o.floors.length>1?{polarDeg:48,margin:1.1}:{polarDeg:M?36:48,margin:1.05},te=typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;x.frame(o.bounds,!te&&n.skipInitialOverviewAnimation!==!0,k,n.portraitOverviewCrop===!0,z);let X=new bt(x.camera),oe=hr(t),K=new pt(t,{fontFamily:e.doc.theme?.fontFamily,ink:e.doc.theme?.textColor,backgroundRgb:o.theme.background.top}),ue=o.labels,ae=()=>Tn(ue,o.floors.length,D());K.setLabels(ae());let re=null,de=()=>[...E.keys()].flatMap(h=>{let b=o.seats.idToIndex.get(h),A=b===void 0?void 0:e.seats[b];if(b===void 0||A?.id!==h)return[];let _=b*3;return[{id:`seat:${h}`,kind:"seat",seatWidthM:o.seats.iChairWidth[b]*2,text:A.displayLabel||A.label,anchor:[o.seats.iPosition[_],o.seats.iPosition[_+1]+1.05,o.seats.iPosition[_+2]],pinBase:At(_)}]}),le=-1,N=()=>{c&&(le=re?o.sections.findIndex(h=>h.id===re):-1,c.seatProgram.uniforms.uFocusSection.value=le,c.chairProgram.uniforms.uFocusSection.value=le)},$=h=>{if(re=h,N(),K.setForcedDense(!!h),!h){let L=de(),he=new Set(L.map(ne=>ne.id));K.setLabels([...ae().filter(ne=>!he.has(ne.id)),...L]);return}let b=e.seats.filter(L=>m.get(L.id)===h),A=new Set(b.map(L=>L.id)),_=new Set(b.map(L=>L.rowId)),O=new Set(E.keys()),J=new Set(b.filter(L=>O.has(L.id)).map(L=>L.id)),Z=ae().filter(L=>L.kind!=="row"&&L.kind!=="seat"||(L.kind==="row"?_.has(L.id.slice(4)):A.has(L.id.slice(5))));if(o.seatCount<=6e3&&J.size===0){K.setLabels(Z);return}let ce=b,Ae=new Set(ce.map(L=>`seat:${L.id}`)),Pe=ce.flatMap(L=>{let he=o.seats.idToIndex.get(L.id);if(he===void 0)return[];let ne=he*3;return[{id:`seat:${L.id}`,kind:"seat",seatWidthM:o.seats.iChairWidth[he]*2,rowId:L.rowId,text:O.has(L.id)?L.displayLabel||L.label:Nn(L.displayLabel||L.label),anchor:[o.seats.iPosition[ne],o.seats.iPosition[ne+1]+(O.has(L.id)?1.05:.55),o.seats.iPosition[ne+2]],...O.has(L.id)?{pinBase:At(ne)}:{}}]});K.setLabels([...Z.filter(L=>!Ae.has(L.id)),...Pe])};Y();let G=null,ee=null,Q=h=>{if(w||!c||I)return!1;let b=ur({flying:X.active,panoramaMounted:W!==null,seatViewActive:G?.active===!0}),A=b==="orbit"?le:-1;c.seatProgram.uniforms.uFocusSection.value=A,c.chairProgram.uniforms.uFocusSection.value=A;let _=b==="cinematic"?X.update(performance.now()):b==="seatView"?G.update(performance.now()):b==="orbit"?x.update():!1;ee?.syncZoomLimits();let O=D()>=0?o.floors[D()]:null,J=O?.radius??o.bounds.radius,Z=eo(x.currentDistance,J),ce=q?{center:[x.camera.position.x,x.camera.position.y,x.camera.position.z],radius:520}:o.clipBounds??o.renderBounds;x.updateClipping(ce);let Ae=O?.center??o.renderBounds.center,Pe=O?.radius??o.renderBounds.radius,L=(fe,ve)=>Math.hypot(x.camera.position.x-fe[0],x.camera.position.y-fe[1],x.camera.position.z-fe[2])<=ve*(V.detailVisible?1.8:1.55),he=L(Ae,Pe);if(!he&&re){let fe=o.sections.find(ve=>ve.id===re);fe&&(he=L(fe.center,Math.max(12,fe.radius*2)))}V.detailVisible=he;let ne=c.seatProgram.uniforms;ne.uSeatScale.value=Z.scale,ne.uSeatFade.value=Z.fade;let rt=!!O&&to(O.seatCount,C.canvas.clientWidth||1,C.canvas.clientHeight||1),it=no(o.seats.count,J,x.currentDistance,x.camera.fov,C.canvas.clientHeight||1),He=V.detailVisible||rt||it?1:0,Ge=V.detailVisible||D()>=0||o.floors.length>1?1:0;V.ease(h,He,Ge),ne.uSeatDetail.value=V.seatDetailMix;let at=He===0&&V.seatDetailMix<.01;c.seatGeometry.setDrawRange(at?Lt:0,at?Wn:Lt),c.solidProgram.uniforms.uStructureDetail.value=V.structureDetailMix,ne.uMinPixels.value=Z.minPixels,ne.uPixelToWorld.value=2*Math.tan(x.camera.fov*Ja/2)/Math.max(1,C.pixelHeight),V.update(V.detailVisible),C.renderer.render({scene:c.background,clear:!0}),C.renderer.render({scene:c.main,camera:x.camera,clear:!1});let Be=g?g.update(performance.now(),[x.camera.position.x,x.camera.position.y,x.camera.position.z],W!==null,b==="seatView"):!1;return g&&C.renderer.render({scene:g.root,camera:x.camera,clear:!1}),K.update(x.camera.projectionViewMatrix,C.canvas.clientWidth||1,C.canvas.clientHeight||1,x.currentDistance,J,[x.camera.position.x,x.camera.position.y,x.camera.position.z]),_||Be||V.seatDetailMix!==He||V.structureDetailMix!==Ge},B=new mt(Q),sn=typeof ResizeObserver<"u"?new ResizeObserver(()=>Ft.resize()):null;sn?.observe(t),x.setZoomPointResolver((h,b)=>{let A=C.canvas.getBoundingClientRect(),_=C.canvas.clientWidth||A.width,O=C.canvas.clientHeight||A.height;if(!(_>0)||!(O>0))return null;x.camera.updateMatrixWorld();let J=an(o.seats.iPosition,o.seats.count,x.camera.projectionViewMatrix,_,O,h-A.left,b-A.top,Qa);if(J<0)return null;let Z=J*3;return[o.seats.iPosition[Z],o.seats.iPosition[Z+1]+.5,o.seats.iPosition[Z+2]]});function At(h){return[o.seats.iPosition[h],o.seats.iPosition[h+1]+.5,o.seats.iPosition[h+2]]}K.setSeatNumberRow(null);let ke=null,we=0,ln=()=>{we=0;let h=null;if(ke&&!G?.active&&!X.active){let b=C.canvas.getBoundingClientRect(),A=C.canvas.clientWidth||b.width,_=C.canvas.clientHeight||b.height;if(A>0&&_>0){let O=an(o.seats.iPosition,o.seats.count,x.camera.projectionViewMatrix,A,_,ke.x-b.left,ke.y-b.top,Za);h=O>=0?e.seats[O]?.rowId??null:null}}K.setSeatNumberRow(h)&&B.requestRender()},nt=h=>{ke={x:h.clientX,y:h.clientY},we||(we=requestAnimationFrame(ln))},cn=h=>{h.pointerType==="mouse"&&(ke=null,we||(we=requestAnimationFrame(ln)))};C.canvas.addEventListener("pointermove",nt),C.canvas.addEventListener("pointerdown",nt),C.canvas.addEventListener("pointerleave",cn);function un(h){if(!g)return;let b=[];for(let A of E.keys()){let _=o.seats.idToIndex.get(A);if(_===void 0)continue;let O=_*3;b.push({id:A,position:At(O)})}g.setSeats(b,performance.now(),h)}let dn=h=>{let b=O=>{let J=o.seats.idToIndex.get(O);return J===void 0?void 0:o.seats.iState[J]},{updates:A,next:_}=Oo(E,h,b);if(E=_,K.setSelectedSeatIds(E.keys()),un(!Oe()),B.requestRender(),$(re),A.length){let O=It(o.seats,A);c&&c.uploadSeatStateRuns(O),p(),B.requestRender()}},Oe=()=>T!==null?T:typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,Ar=8,mn=h=>{if(!n.getSeatView)return null;let b=y.get(h);if(!b)for(b=Promise.resolve(n.getSeatView(h)),y.set(h,b),b.catch(()=>{y.get(h)===b&&y.delete(h)});y.size>Ar;){let A=y.keys().next().value;if(A===void 0)break;y.delete(A)}return b},hn=nr(o.stages,o.focalWorld,o.bounds.groundY??0),Pr=nn(hn),Pt=(h,b)=>{let A=l.get(h),_=Math.max(0,Math.round(o.seats.iFloor[b]??0)),O=e.doc.floors?.[_],J=o.floors[_],Z=O?.focalPoint??e.doc.focalPoint,ce=J?{x:J.focalWorld[0]/Te,y:J.focalWorld[2]/Te}:Z,Ae=A?.focalPoint?{x:A.focalPoint.x+ce.x-Z.x,y:A.focalPoint.y+ce.y-Z.y}:ce,Pe=[o.seats.iPosition[b*3],o.seats.iPosition[b*3+1],o.seats.iPosition[b*3+2]];return Xo(Pe,Ae,O?.baseHeightM??0,A?.eyeHeightM,Pr)},pn=()=>(t.clientWidth||C.canvas.clientWidth)<=520,Ct=null,fn=null,Cr=async(h,b,A)=>{if(!n.getSeatView||P||A!==me.flightGen())return;let _;try{_=await dr()}catch{if(a.panoramaFailed(h,"mount"),!P&&A===me.flightGen()){let O=Rt(h,A,!0);requestAnimationFrame(()=>O?.querySelector("[data-panorama-trigger]")?.focus())}return}if(!(P||A!==me.flightGen()||!Ct))return fn??=_.createOpenPanorama(Ct),fn(h,b,A)},Et=pr({container:t,model:o,opts:n,expandedSeatById:l,seatIdsByRow:u,isNarrow:pn,isDisposed:()=>P,flightGen:()=>me.flightGen(),flyToSeat:h=>yn(h),openPanorama:(h,b,A)=>Cr(h,b,A)}),Rt=Et.show,Tt=Et.remove,Er=Et.layout,Me=fr({container:t,orbit:x,isNarrow:pn,enabled:n.chrome?.controlDock!==!1,...n.navLabels?{labels:n.navLabels}:{}});ee=Me;let Rr=Me.element,ze=Me.setNavigationMode,Tr=Me.layout,Dr=Me.utilityControls,Ne=null,vn=!1,ot=h=>{Me.setSeatViewLocked(h),h||G?.exit()};G=cr({canvas:C.canvas,camera:x.camera,requestRender:()=>B.requestRender(),reducedMotion:Oe,onStopChange:h=>{let b=h??(vn?"seat":null);Ne=b;try{n.onSeatViewStopChange?.(b)}catch{}},onApplied:()=>{P||x.syncFromCamera()}});let bn=o.sections.reduce((h,b)=>b.seatCount>0&&b.box?Math.max(h,b.box.max[1]):h,-1/0),Fr=(h,b)=>{let{eye:A}=Pt(h,b),_=(t.clientWidth||C.canvas.clientWidth||1)/Math.max(1,t.clientHeight||C.canvas.clientHeight||1),O=rr(A,hn,_,{preserveEye:!0});if(n.seatViewStops===!1)return{...O,stops:[]};let J=m.get(h),Z=J?o.sections.find(ce=>ce.id===J):void 0;return{...O,stops:ir(O,{aspect:_,seatingTopY:Number.isFinite(bn)?bn:o.bounds.box.max[1],section:Z&&Z.seatCount>0?{center:Z.center,radius:Z.radius}:null,venue:{center:o.bounds.center,radius:o.bounds.radius}})}},me=Sr({container:t,model:o,opts:n,orbit:x,cinematic:X,analytics:a,loop:B,labelOverlay:K,stageAzimuth:k,overviewFraming:z,gpu:()=>c,isDisposed:()=>P,panorama:()=>W,setPanorama:h=>{W=h},setPanoramaSphereVisible:h=>{q=h},panoramaLoadAbort:()=>H,setPanoramaLoadAbort:h=>{H=h},setFrozen:h=>{I=h},restorePanoramaLayer:U,reducedMotion:Oe,resolvedSeatViewPose:Pt,showSectionSeatLabels:$,setNearFieldDetailEnabled:j,setSeatViewLocked:ot,setNavigationMode:ze,showArriveChip:Rt,removeArriveChip:Tt,inSeatView:()=>Ne!==null,setSeatStepping:h=>{vn=h},seatViewArrival:(h,b)=>n.arriveAtSeatEye?Fr(h,b):null,enterSeatView:(h,b)=>G?.enter(h,b)});F=!0;let Dt=me.overviewChip,_r=me.layoutOverviewChip,Ir=me.applyFloorFocus,Vr=me.focusOverview,gn=me.cancelFlight,yn=me.flyToSeat,xn=me.focusSectionCamera;Dr.appendChild(Dt),Ct={container:t,model:o,opts:n,analytics:a,orbit:x,loop:B,seatsById:l,ensureSeatView:mn,resolvedSeatViewPose:Pt,gpu:()=>c,gl:C.gl,isContextLost:()=>w,isDisposed:()=>P,flightGen:()=>me.flightGen(),setPanorama:h=>{W=h},getLoadAbort:()=>H,setLoadAbort:h=>{H=h},setPanoramaSphereVisible:h=>{q=h,h&&G?.exit()},setFrozen:h=>{I=h},raisePanoramaLayer:R,restorePanoramaLayer:U,getOverviewChip:()=>Dt,labelOverlay:K,reducedMotion:Oe,removeArriveChip:Tt,showArriveChip:Rt};let xe=vr({glctx:C,orbit:x,model:o,seats:e.seats,opts:n,cinematic:X,analytics:a,seatIdByIndex:s,sectionIdBySeatId:m,tapSlop:es,tapMs:ts,gpu:()=>c,pick:()=>S,seatViewLocked:()=>Me.seatViewLocked(),focusedSectionId:()=>re,selection:()=>E,cancelFlight:gn,focusSectionCamera:xn,focusSeatCamera:me.focusSeatCamera,setSelection:dn,ensureSeatView:mn});C.canvas.addEventListener("pointerdown",xe.onDown),C.canvas.addEventListener("pointermove",xe.onMove),C.canvas.addEventListener("pointerup",xe.onUp),C.canvas.addEventListener("pointercancel",xe.onUp),B.requestRender();let Ft={setAvailability(h){let b=ko(E,h),A=It(o.seats,b);A.length&&c&&c.uploadSeatStateRuns(A),p(),B.requestRender()},setSelection:dn,setNavigationMode:ze,zoomIn(){x.zoomBy(Fe),B.requestRender()},zoomOut(){x.zoomBy(Xe),B.requestRender()},flyToSeat:yn,focusOverview:Vr,seatViewStop:()=>Ne,recentreSeatView:()=>G?.recentre()??!1,resize(){let{width:h,height:b}=C.resize();x.setAspect(h/Math.max(1,b)),Er(),Tr(),_r(),B.requestRender()},stats(){return{...B.stats(),drawCalls:c?c.drawCalls:0,fallbackTriangles:c?c.seatGeometry.drawRange.count/3*o.seats.count:0,seatCount:o.seatCount}},captureImage(h=1280){if(w||!c||typeof document>"u")return null;Q(0);let b=C.canvas,A=Math.min(1,h/Math.max(b.width,b.height,1)),_=document.createElement("canvas");_.width=Math.max(1,Math.round(b.width*A)),_.height=Math.max(1,Math.round(b.height*A));let O=_.getContext("2d");return O?(O.drawImage(b,0,0,_.width,_.height),_.toDataURL("image/jpeg",.82)):null},getQualityEvidence(){let h=B.stats(),b=C.canvas.clientWidth||1,A=C.canvas.clientHeight||1,_=o.bounds.center,O=ge(x.camera.projectionViewMatrix,[_[0],o.bounds.box.min[1],_[2]],b,A),J=ge(x.camera.projectionViewMatrix,[_[0],o.bounds.box.max[1],_[2]],b,A),Z=o.bounds.box,ce=[Z.min[0],Z.max[0]].flatMap(L=>[Z.min[1],Z.max[1]].flatMap(he=>[Z.min[2],Z.max[2]].map(ne=>ge(x.camera.projectionViewMatrix,[L,he,ne],b,A)))).filter(L=>Number.isFinite(L.x)&&Number.isFinite(L.y)&&Number.isFinite(L.depth)),Ae=ce.length?(()=>{let L=Math.min(...ce.map(ve=>ve.x)),he=Math.max(...ce.map(ve=>ve.x)),ne=Math.min(...ce.map(ve=>ve.y)),rt=Math.max(...ce.map(ve=>ve.y)),it=Math.max(0,L),He=Math.min(b,he),Ge=Math.max(0,ne),at=Math.min(A,rt),Be=Math.max(0,He-it),fe=Math.max(0,at-Ge);return{box:{x:it,y:Ge,width:Be,height:fe},horizontalFillRatio:Be/b,verticalFillRatio:fe/A,visibleAreaRatio:Be*fe/(b*A),clippedEdges:[...ne<0?["top"]:[],...he>b?["right"]:[],...rt>A?["bottom"]:[],...L<0?["left"]:[]]}})():void 0,Pe=String(C.gl.getParameter(C.gl.VERSION)??"");return{viewport:{width:b,height:A},context:{webgl2:/webgl\s*2/i.test(Pe),lost:w},frame:{rendered:h.rendered,idle:h.idle},camera:{position:[x.camera.position.x,x.camera.position.y,x.camera.position.z],distance:x.currentDistance,verticalFovDeg:x.fovY},scene:{seatCount:o.seatCount,floorCount:o.floors.length,zoneCount:o.zones.length,sectionCount:o.sections.length,authoredRelief:f,renderedVerticalSpanM:Math.max(0,o.bounds.box.max[1]-o.bounds.box.min[1]),projectedReliefPx:O.visible&&J.visible?Math.abs(O.y-J.y):0},labels:K.qualityEvidence(),framing:Ae,...Ne?{seatView:{fovDeg:x.camera.fov,stop:Ne}}:{}}},getQualityReport(){return qt(Ft.getQualityEvidence())},loseContextForTest(){C.simulateContextLossCycle()},floors(){return o.floors},focusFloor(h){if(h!==null&&!o.floors.some(A=>A.index===h))return!1;let b=h??-1;if(j(h!==null),ot(!1),Ir(b),ze("orbit"),h===null)X.cancel(),Oe()?x.frame(o.bounds,!1,k,n.portraitOverviewCrop===!0,z):x.frameSoft(o.bounds,k,n.portraitOverviewCrop===!0,z);else{let A=o.floors[h];if(A.seatCount>0){X.cancel();let _=A.focalWorld[0]-A.center[0],O=A.focalWorld[2]-A.center[2],J=Math.hypot(_,O)>A.radius*.12?Math.atan2(_,O):k;x.frame({center:A.center,radius:A.radius,box:A.box},!1,J,!1,{polarDeg:58,margin:1.12})}}return B.requestRender(),!0},zones(){return o.zones},focusZone(h){let b=o.zones.find(J=>J.id===h);if(!b||b.seatCount===0)return!1;j(!1),ot(!1),X.cancel(),ze("orbit"),$(null),n.onSectionFocusChange?.(null);let A=b.focalWorld[0]-b.center[0],_=b.focalWorld[2]-b.center[2],O=Math.hypot(A,_)>b.radius*.12?Math.atan2(A,_):void 0;return x.frame({center:b.center,radius:b.radius*1.25},!1,O),B.requestRender(),!0},sections(){return o.sections},focusSection(h){return xn(h)},rows(h){return h?o.rows.filter(b=>b.sectionId===h):o.rows},seatsInRow(h){return e.seats.filter(b=>b.rowId===h).map(b=>({id:b.id,label:b.displayLabel||b.label}))},focusRow(h){let b=o.rows.find(A=>A.id===h);return!b||b.seatCount===0?!1:(j(!0),ot(!1),X.cancel(),ze("pan"),b.sectionId&&($(b.sectionId),n.onSectionFocusChange?.(b.sectionId)),x.frame({center:b.center,radius:Math.max(2.5,b.radius*.65)}),B.requestRender(),!0)},setReducedMotionForTest(h){T=h},dispose(){P=!0,Tt(),Dt.remove(),Rr.remove(),gn(),G?.dispose(),B.stop(),K.dispose(),sn?.disconnect(),W&&(W.dispose(),W=null),U(),oe(),C.canvas.removeEventListener("pointerdown",xe.onDown),C.canvas.removeEventListener("pointermove",xe.onMove),C.canvas.removeEventListener("pointerup",xe.onUp),C.canvas.removeEventListener("pointercancel",xe.onUp),C.canvas.removeEventListener("pointermove",nt),C.canvas.removeEventListener("pointerdown",nt),C.canvas.removeEventListener("pointerleave",cn),we&&cancelAnimationFrame(we),x.dispose(),S&&S.dispose(),c&&c.dispose(),c=null,g?.dispose(),g=null,S=null,C.dispose()}};return a.opened(o.seatCount,f,e.prepared?.buildMs??performance.now()-r,e.prepared?.source??"inline"),Ft}export{Ai as VENUE3D_QUALITY_REPORT_VERSION,Lr as autoVenue3d,Ye as buildSceneModel,Vt as estimateVenue3D,qt as inspectVenue3DQualityEvidence,xc as mountVenue3D,Ka as prepareVenue3D,$a as prepareVenue3DFromChart};
|