@zylem/game-lib 0.8.9 → 0.9.1

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.
Files changed (69) hide show
  1. package/README.md +7 -1
  2. package/dist/api/game-lib.api.json +37952 -19547
  3. package/dist/api/game-lib.api.md +1302 -7
  4. package/dist/api/game-lib.d.ts +1696 -3
  5. package/dist/api/game-lib.typedoc.json +174596 -76562
  6. package/dist/audio.d.ts +193 -1
  7. package/dist/audio.js +1 -1
  8. package/dist/bridge.d.ts +17 -2
  9. package/dist/bridge.js +1 -1
  10. package/dist/catalog.js +1 -1
  11. package/dist/chunk-2PFNNGTV.js +1 -0
  12. package/dist/chunk-2XMG3NJS.js +1 -0
  13. package/dist/chunk-4CZZZCFB.js +9 -0
  14. package/dist/chunk-7CBJKE42.js +1 -0
  15. package/dist/{chunk-CBUQBP2U.js → chunk-BQRMYLYD.js} +1 -1
  16. package/dist/chunk-FZNEWOC5.js +1 -0
  17. package/dist/chunk-GPCSX3M6.js +1 -0
  18. package/dist/chunk-K3NNXZIJ.js +1 -0
  19. package/dist/{chunk-JNFFTNMH.js → chunk-KSEP7AUF.js} +1 -1
  20. package/dist/{chunk-7JSZEEAE.js → chunk-LI43BZQN.js} +1 -1
  21. package/dist/chunk-NVVLLWIM.js +1 -0
  22. package/dist/chunk-QGIYILYI.js +1 -0
  23. package/dist/chunk-SHDHPDOV.js +24 -0
  24. package/dist/chunk-STVEILJJ.js +1 -0
  25. package/dist/chunk-SWDNK4GG.js +1 -0
  26. package/dist/chunk-UUOPT2N4.js +1 -0
  27. package/dist/chunk-VMXSE3EC.js +0 -0
  28. package/dist/{chunk-EYDC2PMO.js → chunk-VSFULLND.js} +1 -1
  29. package/dist/chunk-YNX3Q3CL.js +1 -0
  30. package/dist/chunk-ZZO4CKRU.js +1 -0
  31. package/dist/cinematics.d.ts +279 -0
  32. package/dist/cinematics.js +1 -0
  33. package/dist/core.d.ts +124 -10
  34. package/dist/core.js +1 -1
  35. package/dist/cutscene-definition-C479fkei.d.ts +509 -0
  36. package/dist/debug.d.ts +1 -0
  37. package/dist/debug.js +1 -1
  38. package/dist/{entity-type-map-D6BeAdvg.d.ts → entity-type-map-CrsrKT8c.d.ts} +12 -3
  39. package/dist/entity.d.ts +2 -1
  40. package/dist/entity.js +1 -1
  41. package/dist/game-D8KTP3fD.d.ts +652 -0
  42. package/dist/game-default-JV3Q6JAL.js +1 -0
  43. package/dist/graphics.d.ts +1 -1
  44. package/dist/graphics.js +1 -1
  45. package/dist/public.d.ts +12 -6
  46. package/dist/public.js +1 -1
  47. package/dist/schema/cutscene.schema.json +782 -0
  48. package/dist/schema/song.schema.json +430 -0
  49. package/dist/schema.d.ts +2 -0
  50. package/dist/schema.js +1 -1
  51. package/dist/selection-bounds-BKmSo9aG.d.ts +50 -0
  52. package/dist/song-definition-rEKksP0B.d.ts +263 -0
  53. package/dist/song-player-7QPLFLAS.js +1 -0
  54. package/dist/{game-DyKbOeck.d.ts → stage-CAPlk_cN.d.ts} +146 -647
  55. package/dist/web-components.d.ts +5 -3
  56. package/dist/web-components.js +1 -1
  57. package/dist/{zylem-camera-DZTpPOiD.d.ts → zylem-camera-CYDtrVgi.d.ts} +134 -102
  58. package/package.json +11 -4
  59. package/dist/chunk-34MYRTRP.js +0 -9
  60. package/dist/chunk-AXJTUVGC.js +0 -24
  61. package/dist/chunk-BWOZF5YK.js +0 -1
  62. package/dist/chunk-EVMLNMGU.js +0 -1
  63. package/dist/chunk-G3TBBZUI.js +0 -1
  64. package/dist/chunk-J6KD2G6F.js +0 -1
  65. package/dist/chunk-X7T7QRYP.js +0 -1
  66. package/dist/chunk-YVWDCZNT.js +0 -1
  67. package/dist/chunk-ZRT3ZQVH.js +0 -1
  68. package/dist/game-default-6YXFFZ2Q.js +0 -1
  69. /package/dist/{chunk-MSCVL5OK.js → chunk-ELQN62PQ.js} +0 -0
@@ -0,0 +1,24 @@
1
+ import{b as Oe,d as H,j as A,x as K,y as U}from"./chunk-SWDNK4GG.js";import{g as He}from"./chunk-PCFF4LLO.js";import{b as x}from"./chunk-Q2YDBMVY.js";import{b as Ke,c as Je}from"./chunk-VSFULLND.js";import{c as Ne,e as Xe,f as Ye}from"./chunk-2HSR5XDQ.js";import{c as de,d as Fe,e as ce,f as me,h as _e}from"./chunk-7CBJKE42.js";import{d as v,g as Ve,h as pe}from"./chunk-GPCSX3M6.js";import{k as je}from"./chunk-LI43BZQN.js";import{a as ge,t as fe}from"./chunk-KP6DLLJO.js";import{j as Ze}from"./chunk-6FGXC4T6.js";import{a as Ue,b as G}from"./chunk-AIQ6IVT5.js";import{t as We}from"./chunk-2XMG3NJS.js";import{b as $e}from"./chunk-7GYFZKK7.js";import{c as k}from"./chunk-D2PATZCC.js";import{c as Ie,d as V,e as Le,h as ke,i as Ae,j as De,k as ue,l as O,m as ze}from"./chunk-4QLJUQSJ.js";import{j as he}from"./chunk-7WRQ2UAN.js";import{l as L}from"./chunk-UG22Z42P.js";function mt(){return{pressed:!1,released:!1,held:0}}function ht(){return{value:0,held:0}}function J(a){let e=new Map;if(!a)return e;for(let[t,n]of Object.entries(a)){if(!n||n.length===0)continue;let i=[];for(let o of n){let[s,r]=(o||"").split(".");if(!s||!r)continue;let l=s.toLowerCase(),p=r.toLowerCase();if(l==="buttons"){let u={a:"A",b:"B",x:"X",y:"Y",start:"Start",select:"Select",l:"L",r:"R"}[p];u&&i.push({category:"buttons",property:u})}else if(l==="directions"){let u={up:"Up",down:"Down",left:"Left",right:"Right"}[p];u&&i.push({category:"directions",property:u})}else if(l==="shoulders"){let u={ltrigger:"LTrigger",rtrigger:"RTrigger"}[p];u&&i.push({category:"shoulders",property:u})}else if(l==="axes"){let u={left:{property:"Horizontal",direction:-1},right:{property:"Horizontal",direction:1},up:{property:"Vertical",direction:-1},down:{property:"Vertical",direction:1},secondaryleft:{property:"SecondaryHorizontal",direction:-1},secondaryright:{property:"SecondaryHorizontal",direction:1},secondaryup:{property:"SecondaryVertical",direction:-1},secondarydown:{property:"SecondaryVertical",direction:1}}[p];u&&i.push({category:"axes",property:u.property,axisDirection:u.direction})}}i.length>0&&e.set(t,i)}return e}function m(a,e){return!a&&!e?mt():a?e?{pressed:a.pressed||e.pressed,released:a.released||e.released,held:a.held+e.held}:{...a}:{...e}}function w(a,e){return!a&&!e?ht():a?e?{value:a.value+e.value,held:a.held+e.held}:{...a}:{...e}}var D=class{keyStates=new Map;keyButtonStates=new Map;analogStates=new Map;compiledMapping;includeDefaultBase=!0;onKeyDown=({key:e})=>this.keyStates.set(e,!0);onKeyUp=({key:e})=>this.keyStates.set(e,!1);constructor(e,t){this.includeDefaultBase=t?.includeDefaultBase??!0,this.compiledMapping=J(e??null),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp)}dispose(){window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),this.keyStates.clear(),this.keyButtonStates.clear(),this.analogStates.clear()}isKeyPressed(e){return this.keyStates.get(e)||!1}handleButtonState(e,t){let n=this.keyButtonStates.get(e);n||(n={pressed:!1,released:!1,held:0},this.keyButtonStates.set(e,n));let i=this.isKeyPressed(e);return n.pressed=i&&n.held===0,n.released=!i&&n.held>0,n.held=i?n.held+t:0,n}handleAnalogState(e,t,n){let i=`${e}:${t}`,o=this.analogStates.get(i);return o||(o={value:0,held:0},this.analogStates.set(i,o)),o.value=this.getAxisValue(e,t),o.held=o.value!==0?o.held+n:0,o}applyCustomMapping(e,t){if(this.compiledMapping.size===0)return e;let n=new Map;for(let[i,o]of this.compiledMapping.entries()){let s=null;for(let r of o)if(r.category==="axes")n.has(r.property)||n.set(r.property,0),this.isKeyPressed(i)&&n.set(r.property,n.get(r.property)+r.axisDirection);else{s||(s=this.handleButtonState(i,t));let l=e[r.category]??={};l[r.property]=m(l[r.property],s)}}if(n.size>0){e.axes||(e.axes={});for(let[i,o]of n.entries()){let s=`custom:${i}`,r=this.analogStates.get(s);r||(r={value:0,held:0},this.analogStates.set(s,r)),r.value=o,r.held=o!==0?r.held+t:0,e.axes[i]=w(e.axes[i],r)}}return e}getInput(e){let t={};return this.includeDefaultBase&&(t.buttons={A:this.handleButtonState("z",e),B:this.handleButtonState("x",e),X:this.handleButtonState("a",e),Y:this.handleButtonState("s",e),Start:this.handleButtonState(" ",e),Select:this.handleButtonState("Enter",e),L:this.handleButtonState("q",e),R:this.handleButtonState("e",e)},t.directions={Up:this.handleButtonState("ArrowUp",e),Down:this.handleButtonState("ArrowDown",e),Left:this.handleButtonState("ArrowLeft",e),Right:this.handleButtonState("ArrowRight",e)},t.shoulders={LTrigger:this.handleButtonState("Q",e),RTrigger:this.handleButtonState("E",e)}),this.applyCustomMapping(t,e)}getName(){return"keyboard"}getAxisValue(e,t){return(this.isKeyPressed(t)?1:0)-(this.isKeyPressed(e)?1:0)}isConnected(){return!0}};var $=class{gamepadIndex;connected=!1;buttonStates={};analogStates={};onConnected=e=>{e.gamepad.index===this.gamepadIndex&&(this.connected=!0)};onDisconnected=e=>{e.gamepad.index===this.gamepadIndex&&(this.connected=!1)};constructor(e){this.gamepadIndex=e,window.addEventListener("gamepadconnected",this.onConnected),window.addEventListener("gamepaddisconnected",this.onDisconnected)}dispose(){window.removeEventListener("gamepadconnected",this.onConnected),window.removeEventListener("gamepaddisconnected",this.onDisconnected),this.buttonStates={},this.analogStates={}}handleButtonState(e,t,n){let i=this.buttonStates[e];i||(i={pressed:!1,released:!1,held:0},this.buttonStates[e]=i);let o=t.buttons[e].pressed;return i.pressed=o&&i.held===0,i.released=!o&&i.held>0,i.held=o?i.held+n:0,i}handleAnalogState(e,t,n){let i=this.analogStates[e];return i||(i={value:0,held:0},this.analogStates[e]=i),i.value=t.axes[e],i.held=i.value!==0?i.held+n:0,i}getInput(e){let t=navigator.getGamepads()[this.gamepadIndex];return t?{buttons:{A:this.handleButtonState(0,t,e),B:this.handleButtonState(1,t,e),X:this.handleButtonState(2,t,e),Y:this.handleButtonState(3,t,e),Start:this.handleButtonState(9,t,e),Select:this.handleButtonState(8,t,e),L:this.handleButtonState(4,t,e),R:this.handleButtonState(5,t,e)},directions:{Up:this.handleButtonState(12,t,e),Down:this.handleButtonState(13,t,e),Left:this.handleButtonState(14,t,e),Right:this.handleButtonState(15,t,e)},axes:{Horizontal:this.handleAnalogState(0,t,e),Vertical:this.handleAnalogState(1,t,e),SecondaryHorizontal:this.handleAnalogState(2,t,e),SecondaryVertical:this.handleAnalogState(3,t,e)},shoulders:{LTrigger:this.handleButtonState(6,t,e),RTrigger:this.handleButtonState(7,t,e)}}:{}}getName(){return`gamepad-${this.gamepadIndex+1}`}isConnected(){return this.connected}};import{subscribe as gt}from"valtio/vanilla";var ft=.002;function W(a,e,t){return Math.max(e,Math.min(t,a))}function yt(a){if(a instanceof HTMLCanvasElement)return a;let e=a.querySelector("canvas");if(e instanceof HTMLCanvasElement)return e;for(let t of a.querySelectorAll("*")){let n=t.shadowRoot;if(!n)continue;let i=n.querySelector("canvas");if(i instanceof HTMLCanvasElement)return i}return null}var F=class{buttonStates=new Map;analogStates=new Map;compiledMapping;movementX=0;movementY=0;pointerX=.5;pointerY=.5;pointerCenterX=0;pointerCenterY=0;mouseButtonDown=new Set;sensitivity;usePointerLock;lookMode;isLocked=!1;targetElement;debugUnsubscribe=null;updatePointerPosition(e,t){this.pointerX=e/window.innerWidth,this.pointerY=t/window.innerHeight;let n=yt(this.targetElement);if(n){let i=n.getBoundingClientRect();if(i.width>0&&i.height>0){let o=i.left+i.width/2,s=i.top+i.height/2;this.pointerCenterX=W((e-o)/(i.width/2),-1,1),this.pointerCenterY=W((t-s)/(i.height/2),-1,1);return}}this.pointerCenterX=W((this.pointerX-.5)*2,-1,1),this.pointerCenterY=W((this.pointerY-.5)*2,-1,1)}onMouseMove=e=>{this.updatePointerPosition(e.clientX,e.clientY),!(v.enabled||this.lookMode==="screenCenter")&&(this.movementX+=e.movementX,this.movementY+=e.movementY)};onMouseDown=e=>{let t=e.target;t instanceof HTMLCanvasElement&&this.targetElement.contains(t)&&(this.mouseButtonDown.add(e.button),this.usePointerLock&&!this.isLocked&&!v.enabled&&this.targetElement.requestPointerLock())};onMouseUp=e=>{this.mouseButtonDown.delete(e.button)};onContextMenu=e=>{e.preventDefault()};onPointerLockChange=()=>{this.isLocked=document.pointerLockElement===this.targetElement};constructor(e,t){this.sensitivity=e?.sensitivity??ft,this.lookMode=e?.lookMode??"delta",this.usePointerLock=e?.pointerLock??!1,this.compiledMapping=J(e?.mapping??null),this.targetElement=t??document.body,window.addEventListener("mousemove",this.onMouseMove),this.targetElement.addEventListener("mousedown",this.onMouseDown),this.targetElement.addEventListener("mouseup",this.onMouseUp),this.targetElement.addEventListener("contextmenu",this.onContextMenu),this.usePointerLock&&(document.addEventListener("pointerlockchange",this.onPointerLockChange),this.debugUnsubscribe=gt(v,()=>{v.enabled&&document.pointerLockElement===this.targetElement&&document.exitPointerLock()}))}dispose(){window.removeEventListener("mousemove",this.onMouseMove),this.targetElement.removeEventListener("mousedown",this.onMouseDown),this.targetElement.removeEventListener("mouseup",this.onMouseUp),this.targetElement.removeEventListener("contextmenu",this.onContextMenu),document.removeEventListener("pointerlockchange",this.onPointerLockChange),this.debugUnsubscribe?.(),this.debugUnsubscribe=null,this.isLocked&&document.exitPointerLock(),this.buttonStates.clear(),this.analogStates.clear(),this.mouseButtonDown.clear(),this.movementX=0,this.movementY=0}handleMouseButton(e,t){let n=this.buttonStates.get(e);n||(n={pressed:!1,released:!1,held:0},this.buttonStates.set(e,n));let i=this.mouseButtonDown.has(e);return n.pressed=i&&n.held===0,n.released=!i&&n.held>0,n.held=i?n.held+t:0,n}handleMovementAxis(e,t){let n=this.analogStates.get(e);n||(n={value:0,held:0},this.analogStates.set(e,n));let i=e==="x"?this.movementX:this.movementY;return n.value=Math.max(-1,Math.min(1,i*this.sensitivity)),n.held=n.value!==0?n.held+t:0,n}applyCustomMapping(e,t){if(this.compiledMapping.size===0)return e;let n=new Map,i={leftbutton:()=>this.handleMouseButton(0,t),rightbutton:()=>this.handleMouseButton(2,t),middlebutton:()=>this.handleMouseButton(1,t)};for(let[o,s]of this.compiledMapping.entries()){let r=o.toLowerCase();for(let l of s)if(l.category==="axes")n.has(l.property)||n.set(l.property,0),r==="movex"?n.set(l.property,n.get(l.property)+Math.max(-1,Math.min(1,this.movementX*this.sensitivity))*l.axisDirection):r==="movey"?n.set(l.property,n.get(l.property)+Math.max(-1,Math.min(1,this.movementY*this.sensitivity))*l.axisDirection):r in i&&this.mouseButtonDown.has(this.buttonIndexForAction(r))&&n.set(l.property,n.get(l.property)+l.axisDirection);else{let p=i[r];if(p){let g=p();if(g){let u=e[l.category]??={};u[l.property]=m(u[l.property],g)}}}}if(n.size>0){e.axes||(e.axes={});for(let[o,s]of n.entries()){let r=`custom:${o}`,l=this.analogStates.get(r);l||(l={value:0,held:0},this.analogStates.set(r,l)),l.value=Math.max(-1,Math.min(1,s)),l.held=s!==0?l.held+t:0,e.axes[o]=w(e.axes[o],l)}}return e}buttonIndexForAction(e){switch(e){case"leftbutton":return 0;case"middlebutton":return 1;case"rightbutton":return 2;default:return-1}}getInput(e){v.enabled&&(this.movementX=0,this.movementY=0);let t={value:0,held:0},n=this.lookMode==="delta",i={axes:{Horizontal:t,Vertical:t,SecondaryHorizontal:n?this.handleMovementAxis("x",e):t,SecondaryVertical:n?this.handleMovementAxis("y",e):t},shoulders:{LTrigger:this.handleMouseButton(0,e),RTrigger:this.handleMouseButton(2,e)},pointer:{x:this.pointerX,y:this.pointerY,centerX:this.pointerCenterX,centerY:this.pointerCenterY}};return this.movementX=0,this.movementY=0,this.applyCustomMapping(i,e)}getName(){return"mouse"}isConnected(){return!0}};function _(a={}){if(typeof window>"u"||typeof navigator>"u")return!1;let e=navigator.userAgent,t=/android/i.test(e)||/iPad|iPhone|iPod/.test(e),n="ontouchstart"in window||navigator.maxTouchPoints>0,i=typeof window.matchMedia=="function"?window.matchMedia("(pointer: coarse)").matches:!1,o=a.viewportSize?.width??window.innerWidth??0,s=a.viewportSize?.height??window.innerHeight??0,r=Math.max(o,s),l=r===0||r<=1024;return a.allowViewportOnly&&a.viewportSize?l:t||(n||i)&&l}var bt=["A","B","X","Y","Start","Select","L","R","LTrigger","RTrigger","Up","Down","Left","Right"],vt=new Set(["flex","flexGrow","flexShrink","fontWeight","lineHeight","opacity","order","zIndex","zoom"]),St={A:{size:72,label:"A",position:{right:98,bottom:44}},B:{size:72,label:"B",position:{right:24,bottom:108}},X:{size:72,label:"X",position:{right:172,bottom:108}},Y:{size:72,label:"Y",position:{right:98,bottom:172}},Start:{size:64,label:"Start",position:{left:"50%",top:24,transform:"translateX(28px)"}},Select:{size:64,label:"Select",position:{left:"50%",top:24,transform:"translateX(-108px)"}},L:{size:62,label:"L",position:{left:28,bottom:184}},R:{size:62,label:"R",position:{right:236,bottom:184}},LTrigger:{size:76,label:"LT",position:{left:24,top:24}},RTrigger:{size:76,label:"RT",position:{right:24,top:24}},Up:{enabled:!1,size:64,label:"Up"},Down:{enabled:!1,size:64,label:"Down"},Left:{enabled:!1,size:64,label:"Left"},Right:{enabled:!1,size:64,label:"Right"}},wt={left:{size:140,thumbSize:58,maxDistance:44,deadzone:.12,directionThreshold:.34,horizontalAxis:"Horizontal",verticalAxis:"Vertical",emitDirections:!0,position:{left:24,bottom:24}},right:{size:140,thumbSize:58,maxDistance:44,deadzone:.12,directionThreshold:.34,horizontalAxis:"SecondaryHorizontal",verticalAxis:"SecondaryVertical",emitDirections:!1,position:{right:24,bottom:236}}},X=class{config;targetElement;buttonStates=new Map;analogStates=new Map;buttons=new Map;joysticks=new Map;rootElement=null;enabled=!1;onPointerMove=e=>{for(let t of this.joysticks.values())t.pointerId===e.pointerId&&(this.consumeEvent(e),this.updateJoystickFromPoint(t,e.clientX,e.clientY))};onPointerUp=e=>{for(let t of this.buttons.values())t.pointerId===e.pointerId&&(this.consumeEvent(e),this.releaseButton(t));for(let t of this.joysticks.values())t.pointerId===e.pointerId&&(this.consumeEvent(e),this.releaseJoystick(t))};onWindowBlur=()=>{for(let e of this.buttons.values())this.releaseButton(e);for(let e of this.joysticks.values())this.releaseJoystick(e)};constructor(e,t){this.config=e??{},this.targetElement=t??document.body,this.enabled=this.resolveEnabledState(),this.enabled&&(this.mountControls(),window.addEventListener("pointermove",this.onPointerMove),window.addEventListener("pointerup",this.onPointerUp),window.addEventListener("pointercancel",this.onPointerUp),window.addEventListener("blur",this.onWindowBlur))}getInput(e){if(!this.enabled)return{};let t={};for(let n of this.buttons.values()){let i=this.handleButtonState(`button:${n.slot}`,n.pointerId!==null,e);this.assignButtonState(t,this.resolveButtonTarget(n.slot),i)}for(let n of this.joysticks.values()){let i=this.handleAnalogState(`joystick:${n.id}:x`,n.valueX,e),o=this.handleAnalogState(`joystick:${n.id}:y`,n.valueY,e);this.assignAxisState(t,n.config.horizontalAxis,i),this.assignAxisState(t,n.config.verticalAxis,o),n.config.emitDirections&&(this.assignButtonState(t,this.resolveButtonTarget("Left"),this.handleButtonState(`joystick:${n.id}:left`,n.valueX<=-n.config.directionThreshold,e)),this.assignButtonState(t,this.resolveButtonTarget("Right"),this.handleButtonState(`joystick:${n.id}:right`,n.valueX>=n.config.directionThreshold,e)),this.assignButtonState(t,this.resolveButtonTarget("Up"),this.handleButtonState(`joystick:${n.id}:up`,n.valueY<=-n.config.directionThreshold,e)),this.assignButtonState(t,this.resolveButtonTarget("Down"),this.handleButtonState(`joystick:${n.id}:down`,n.valueY>=n.config.directionThreshold,e)))}return t}getName(){return"virtual-touch"}isConnected(){return this.enabled}dispose(){window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),window.removeEventListener("pointercancel",this.onPointerUp),window.removeEventListener("blur",this.onWindowBlur),this.rootElement?.remove(),this.rootElement=null,this.buttons.clear(),this.joysticks.clear(),this.buttonStates.clear(),this.analogStates.clear()}resolveEnabledState(){return typeof window>"u"||typeof document>"u"?!1:this.config.enabled===!0?!0:this.config.enabled===!1?!1:_()}mountControls(){this.rootElement=document.createElement("div"),this.rootElement.className="zylem-virtual-touch",this.rootElement.dataset.zylemTouchRoot="true",this.rootElement.style.position="absolute",this.rootElement.style.inset="0",this.rootElement.style.pointerEvents="none",this.rootElement.style.touchAction="none",this.rootElement.style.userSelect="none",this.rootElement.style.WebkitUserSelect="none",this.rootElement.style.WebkitTouchCallout="none",this.rootElement.style.color="rgba(245, 247, 255, 0.96)",this.rootElement.style.zIndex="20",this.appendClassName(this.rootElement,this.config.className),N(this.rootElement,this.config.style),this.rootElement.addEventListener("contextmenu",e=>e.preventDefault());for(let[e,t]of this.resolveButtons())this.rootElement.appendChild(this.createButton(e,t));for(let[e,t]of this.resolveJoysticks())this.rootElement.appendChild(this.createJoystick(e,t));this.targetElement.appendChild(this.rootElement)}resolveButtons(){if(this.config.buttons===!1)return[];let e=this.config.buttons,t=[];for(let n of bt){let i=St[n],o=e?.[n];if(o===!1)continue;let s={...i,...o??{},style:{...i.style,...o?.style},position:{...i.position,...o?.position},label:o?.label??i.label??n,size:o?.size??i.size??72};s.enabled!==!1&&t.push([n,s])}return t}resolveJoysticks(){if(this.config.joysticks===!1)return[];let e=this.config.joysticks,t=[];for(let n of["left","right"]){let i=wt[n],o=e?.[n];if(o===!1)continue;let s={...i,...o??{},style:{...i.style,...o?.style},position:{...i.position,...o?.position},svg:{...i.svg,...o?.svg},size:o?.size??i.size??140,thumbSize:o?.thumbSize??i.thumbSize??58,maxDistance:o?.maxDistance??i.maxDistance??44,deadzone:o?.deadzone??i.deadzone??.12,directionThreshold:o?.directionThreshold??i.directionThreshold??.34,horizontalAxis:o?.horizontalAxis??i.horizontalAxis??"Horizontal",verticalAxis:o?.verticalAxis??i.verticalAxis??"Vertical",emitDirections:o?.emitDirections??i.emitDirections??!1};s.enabled!==!1&&t.push([n,s])}return t}createButton(e,t){let n=document.createElement("button"),i=document.createElement("div");n.type="button",n.ariaLabel=t.label,n.className=`zylem-virtual-touch__button zylem-virtual-touch__button--${e}`,n.dataset.zylemTouchButton=e,n.dataset.active="false",n.style.position="absolute",n.style.width=`${t.size}px`,n.style.height=`${t.size}px`,n.style.padding="0",n.style.margin="0",n.style.border="0",n.style.background="transparent",n.style.pointerEvents="auto",n.style.touchAction="none",n.style.cursor="pointer",n.style.appearance="none",n.style.outline="none",n.style.userSelect="none",n.style.WebkitTapHighlightColor="transparent",N(n,t.position),N(n,t.style),this.appendClassName(n,t.className),i.className="zylem-virtual-touch__button-content",i.style.width="100%",i.style.height="100%",i.style.pointerEvents="none",i.style.transform="scale(1)",i.style.transformOrigin="center",i.style.transition="transform 120ms ease, opacity 120ms ease",i.style.opacity="0.92",i.innerHTML=t.svg??xt(t.label),n.appendChild(i),n.addEventListener("pointerdown",s=>{if(!qe(s))return;let r=this.buttons.get(e);!r||r.pointerId!==null||(this.consumeEvent(s),r.pointerId=s.pointerId,this.updateButtonVisual(r,!0))});let o={slot:e,config:t,element:n,content:i,pointerId:null};return this.buttons.set(e,o),n}createJoystick(e,t){let n=document.createElement("div"),i=document.createElement("div"),o=document.createElement("div");n.className=`zylem-virtual-touch__joystick zylem-virtual-touch__joystick--${e}`,n.dataset.zylemTouchJoystick=e,n.dataset.active="false",n.style.position="absolute",n.style.width=`${t.size}px`,n.style.height=`${t.size}px`,n.style.pointerEvents="auto",n.style.touchAction="none",n.style.userSelect="none",N(n,t.position),N(n,t.style),this.appendClassName(n,t.className),i.className="zylem-virtual-touch__joystick-base",i.style.position="absolute",i.style.inset="0",i.style.pointerEvents="none",i.style.opacity="0.88",i.style.transition="opacity 120ms ease",i.innerHTML=t.svg?.base??Gt(),o.className="zylem-virtual-touch__joystick-thumb",o.style.position="absolute",o.style.left="50%",o.style.top="50%",o.style.width=`${t.thumbSize}px`,o.style.height=`${t.thumbSize}px`,o.style.pointerEvents="none",o.style.transform="translate(-50%, -50%) translate(0px, 0px)",o.style.transition="transform 60ms linear, opacity 120ms ease",o.style.opacity="0.94",o.innerHTML=t.svg?.thumb??Et(),n.append(i,o);let s={id:e,config:t,element:n,base:i,thumb:o,pointerId:null,centerX:0,centerY:0,rawX:0,rawY:0,valueX:0,valueY:0};return this.joysticks.set(e,s),n.addEventListener("pointerdown",r=>{if(!qe(r))return;let l=this.joysticks.get(e);if(!l||l.pointerId!==null)return;this.consumeEvent(r);let p=l.element.getBoundingClientRect();l.pointerId=r.pointerId,l.centerX=p.left+p.width/2,l.centerY=p.top+p.height/2,this.updateJoystickVisual(l,!0),this.updateJoystickFromPoint(l,r.clientX,r.clientY)}),n}handleButtonState(e,t,n){let i=this.buttonStates.get(e);return i||(i={pressed:!1,released:!1,held:0},this.buttonStates.set(e,i)),i.pressed=t&&i.held===0,i.released=!t&&i.held>0,i.held=t?i.held+n:0,i}handleAnalogState(e,t,n){let i=this.analogStates.get(e);return i||(i={value:0,held:0},this.analogStates.set(e,i)),i.value=t,i.held=t!==0?i.held+n:0,i}assignAxisState(e,t,n){e.axes||(e.axes={}),e.axes[t]=w(e.axes[t],n)}assignButtonState(e,t,n){if(t.category==="buttons"){e.buttons??={},e.buttons[t.property]=m(e.buttons[t.property],n);return}if(t.category==="directions"){e.directions??={},e.directions[t.property]=m(e.directions[t.property],n);return}e.shoulders??={},e.shoulders[t.property]=m(e.shoulders[t.property],n)}resolveButtonTarget(e){switch(e){case"LTrigger":case"RTrigger":return{category:"shoulders",property:e};case"Up":case"Down":case"Left":case"Right":return{category:"directions",property:e};default:return{category:"buttons",property:e}}}updateJoystickFromPoint(e,t,n){let i=t-e.centerX,o=n-e.centerY,s=Math.hypot(i,o),r=e.config.maxDistance,l=s>r&&s>0?r/s:1;e.rawX=i*l,e.rawY=o*l;let p=Ct(e.rawX/r,e.rawY/r,e.config.deadzone);e.valueX=p.x,e.valueY=p.y,e.thumb.style.transform=`translate(-50%, -50%) translate(${e.rawX}px, ${e.rawY}px)`}releaseButton(e){e.pointerId=null,this.updateButtonVisual(e,!1)}releaseJoystick(e){e.pointerId=null,e.rawX=0,e.rawY=0,e.valueX=0,e.valueY=0,e.thumb.style.transform="translate(-50%, -50%) translate(0px, 0px)",this.updateJoystickVisual(e,!1)}updateButtonVisual(e,t){e.element.dataset.active=String(t),e.content.style.transform=t?"scale(0.94)":"scale(1)",e.content.style.opacity=t?"1":"0.92"}updateJoystickVisual(e,t){e.element.dataset.active=String(t),e.base.style.opacity=t?"1":"0.88",e.thumb.style.opacity=t?"1":"0.94"}consumeEvent(e){e.cancelable&&e.preventDefault(),e.stopPropagation()}appendClassName(e,t){t&&(e.className=`${e.className} ${t}`.trim())}};function N(a,e){if(e)for(let[t,n]of Object.entries(e)){if(n==null)continue;let i=typeof n=="number"&&!vt.has(t)?`${n}px`:String(n);t.includes("-")?a.style.setProperty(t,i):a.style[t]=i}}function Ct(a,e,t){let n=Math.hypot(a,e);if(n===0||n<=t)return{x:0,y:0};let o=Math.min(1,(n-t)/Math.max(1-t,1e-4))/n;return{x:a*o,y:e*o}}function xt(a){let e=Tt(a);return`
2
+ <svg viewBox="0 0 100 100" width="100%" height="100%" aria-hidden="true">
3
+ <circle cx="50" cy="50" r="45" fill="rgba(12,18,24,0.72)" stroke="currentColor" stroke-width="4" />
4
+ <circle cx="50" cy="50" r="34" fill="rgba(255,255,255,0.06)" stroke="rgba(255,255,255,0.12)" stroke-width="1.5" />
5
+ <text
6
+ x="50"
7
+ y="56"
8
+ text-anchor="middle"
9
+ font-family="ui-sans-serif, system-ui, sans-serif"
10
+ font-size="${e.length>2?24:34}"
11
+ font-weight="700"
12
+ fill="currentColor"
13
+ >${e}</text>
14
+ </svg>
15
+ `}function Gt(){return`
16
+ <svg viewBox="0 0 140 140" width="100%" height="100%" aria-hidden="true">
17
+ <circle cx="70" cy="70" r="62" fill="rgba(10,16,20,0.64)" stroke="currentColor" stroke-width="4" />
18
+ <circle cx="70" cy="70" r="40" fill="rgba(255,255,255,0.04)" stroke="rgba(255,255,255,0.12)" stroke-width="1.5" />
19
+ </svg>
20
+ `}function Et(){return`
21
+ <svg viewBox="0 0 64 64" width="100%" height="100%" aria-hidden="true">
22
+ <circle cx="32" cy="32" r="28" fill="rgba(22,30,38,0.9)" stroke="currentColor" stroke-width="3.5" />
23
+ </svg>
24
+ `}function Tt(a){return a.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function qe(a){return a.pointerType==="touch"}var j=class{inputMap=new Map;currentInputs={};previousInputs={};targetElement;mouseTargetElement;constructor(e,t){this.targetElement=t?.targetElement,this.mouseTargetElement=t?.mouseTargetElement??t?.targetElement;let n=this.buildPlayerEntries(e);for(let{player:i,config:o,gamepadIndex:s,isP1:r}of n)this.addConfigurableProviders(i,o,r),this.addInputProvider(i,new $(s))}configure(e){let t=this.buildPlayerEntries(e);for(let{player:n,config:i,isP1:o}of t){let r=(this.inputMap.get(n)??[]).filter(l=>l instanceof D||l instanceof F||l instanceof X?(l.dispose(),!1):!0);this.inputMap.set(n,[...this.createConfigurableProviders(i,o),...r])}}addInputProvider(e,t){this.inputMap.has(e)||this.inputMap.set(e,[]),this.inputMap.get(e)?.push(t)}dispose(){for(let e of this.inputMap.values())for(let t of e)t.dispose?.();this.inputMap.clear(),this.currentInputs={},this.previousInputs={}}getInputs(e){let t={};return this.inputMap.forEach((n,i)=>{let o=`p${i}`,s=n.reduce((r,l)=>{let p=l.getInput(e);return this.mergeInputs(r,p)},{});t[o]={playerNumber:i,...s}}),t}buildPlayerEntries(e){return[{player:1,config:e?.p1,gamepadIndex:0,isP1:!0},{player:2,config:e?.p2,gamepadIndex:1,isP1:!1},{player:3,config:e?.p3,gamepadIndex:2,isP1:!1},{player:4,config:e?.p4,gamepadIndex:3,isP1:!1},{player:5,config:e?.p5,gamepadIndex:4,isP1:!1},{player:6,config:e?.p6,gamepadIndex:5,isP1:!1},{player:7,config:e?.p7,gamepadIndex:6,isP1:!1},{player:8,config:e?.p8,gamepadIndex:7,isP1:!1}]}addConfigurableProviders(e,t,n){for(let i of this.createConfigurableProviders(t,n))this.addInputProvider(e,i)}createConfigurableProviders(e,t){let n=[];if(e?.key){let i=e.includeDefaults??t;n.push(new D(e.key,{includeDefaultBase:i}))}else t&&n.push(new D);return e?.mouse&&n.push(new F(e.mouse,this.mouseTargetElement)),e?.touch&&n.push(new X(e.touch,this.targetElement)),n}mergeInputs(e,t){return{buttons:{A:m(e.buttons?.A,t.buttons?.A),B:m(e.buttons?.B,t.buttons?.B),X:m(e.buttons?.X,t.buttons?.X),Y:m(e.buttons?.Y,t.buttons?.Y),Start:m(e.buttons?.Start,t.buttons?.Start),Select:m(e.buttons?.Select,t.buttons?.Select),L:m(e.buttons?.L,t.buttons?.L),R:m(e.buttons?.R,t.buttons?.R)},directions:{Up:m(e.directions?.Up,t.directions?.Up),Down:m(e.directions?.Down,t.directions?.Down),Left:m(e.directions?.Left,t.directions?.Left),Right:m(e.directions?.Right,t.directions?.Right)},axes:{Horizontal:w(e.axes?.Horizontal,t.axes?.Horizontal),Vertical:w(e.axes?.Vertical,t.axes?.Vertical),SecondaryHorizontal:w(e.axes?.SecondaryHorizontal,t.axes?.SecondaryHorizontal),SecondaryVertical:w(e.axes?.SecondaryVertical,t.axes?.SecondaryVertical)},shoulders:{LTrigger:m(e.shoulders?.LTrigger,t.shoulders?.LTrigger),RTrigger:m(e.shoulders?.RTrigger,t.shoulders?.RTrigger)},pointer:t.pointer??e.pointer}}};var q=class{_previousTime;_currentTime;_startTime;_delta;_elapsed;_timescale;_document;_pageVisibilityHandler;constructor(){this._previousTime=0,this._currentTime=0,this._startTime=ye(),this._delta=0,this._elapsed=0,this._timescale=1,this._document=null,this._pageVisibilityHandler=null}connect(e){this._document=e,e.hidden!==void 0&&(this._pageVisibilityHandler=Rt.bind(this),e.addEventListener("visibilitychange",this._pageVisibilityHandler,!1))}disconnect(){this._pageVisibilityHandler!==null&&(this._document.removeEventListener("visibilitychange",this._pageVisibilityHandler),this._pageVisibilityHandler=null),this._document=null}getDelta(){return this._delta/1e3}getElapsed(){return this._elapsed/1e3}getTimescale(){return this._timescale}setTimescale(e){return this._timescale=e,this}reset(){return this._currentTime=ye()-this._startTime,this}dispose(){this.disconnect()}update(e){return this._pageVisibilityHandler!==null&&this._document.hidden===!0?this._delta=0:(this._previousTime=this._currentTime,this._currentTime=(e!==void 0?e:ye())-this._startTime,this._delta=(this._currentTime-this._previousTime)*this._timescale,this._elapsed+=this._delta),this}};function ye(){return performance.now()}function Rt(){this._document.hidden===!1&&this.reset()}var Y={FourByThree:1.3333333333333333,SixteenByNine:1.7777777777777777,NineBySixteen:.5625,TwentyOneByNine:2.3333333333333335,OneByOne:1},Q=class{container;canvas;aspectRatio;onResize;handleResizeBound;resizeObserver=null;constructor(e){this.container=e.container,this.canvas=e.canvas,this.aspectRatio=(typeof e.aspectRatio=="number",e.aspectRatio),this.onResize=e.onResize,this.handleResizeBound=this.apply.bind(this)}attach(){window.addEventListener("resize",this.handleResizeBound),typeof ResizeObserver<"u"&&(this.resizeObserver=new ResizeObserver(this.handleResizeBound),this.resizeObserver.observe(this.container)),this.apply()}detach(){window.removeEventListener("resize",this.handleResizeBound),this.resizeObserver?.disconnect(),this.resizeObserver=null}measure(){let e=this.container.getBoundingClientRect(),t=Math.round(e.width||this.container.clientWidth||0),n=Math.round(e.height||this.container.clientHeight||0);if(t>0&&n>0){if(t/n>this.aspectRatio){let p=n;return{width:Math.round(p*this.aspectRatio),height:p}}let r=t,l=Math.round(r/this.aspectRatio);return{width:r,height:l}}if(t>0){let s=t,r=Math.round(s/this.aspectRatio);return{width:s,height:r}}if(n>0){let s=n;return{width:Math.round(s*this.aspectRatio),height:s}}let i=window.innerWidth,o=Math.round(i/this.aspectRatio);return{width:i,height:o}}apply(){let{width:e,height:t}=this.measure();this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`,this.onResize?.(e,t)}};var Qe={NES:{displayAspect:1.3333333333333333,resolutions:[{key:"256x240",width:256,height:240,notes:"Standard NTSC; effective 240p."}]},SNES:{displayAspect:1.3333333333333333,resolutions:[{key:"256x224",width:256,height:224,notes:"Common 240p-equivalent mode."},{key:"512x448",width:512,height:448,notes:"Hi-res interlaced (480i)."}]},N64:{displayAspect:1.3333333333333333,resolutions:[{key:"320x240",width:320,height:240,notes:"Common 240p mode."},{key:"640x480",width:640,height:480,notes:"Higher resolution (480i)."}]},PS1:{displayAspect:1.3333333333333333,resolutions:[{key:"320x240",width:320,height:240,notes:"Progressive 240p common."},{key:"640x480",width:640,height:480,notes:"Interlaced 480i for higher detail."}]},PS2:{displayAspect:1.3333333333333333,resolutions:[{key:"640x480",width:640,height:480,notes:"480i/480p baseline."},{key:"720x480",width:720,height:480,notes:"480p (widescreen capable in some titles)."},{key:"1280x720",width:1280,height:720,notes:"720p (select titles)."}]},PS5:{displayAspect:1.7777777777777777,resolutions:[{key:"720x480",width:720,height:480,notes:"Legacy compatibility."},{key:"1280x720",width:1280,height:720,notes:"720p."},{key:"1920x1080",width:1920,height:1080,notes:"1080p."},{key:"2560x1440",width:2560,height:1440,notes:"1440p."},{key:"3840x2160",width:3840,height:2160,notes:"4K (up to 120Hz)."},{key:"7680x4320",width:7680,height:4320,notes:"8K (limited)."}]},XboxOne:{displayAspect:1.7777777777777777,resolutions:[{key:"1280x720",width:1280,height:720,notes:"720p (original)."},{key:"1920x1080",width:1920,height:1080,notes:"1080p (original)."},{key:"3840x2160",width:3840,height:2160,notes:"4K UHD (S/X models)."}]},MobilePortrait:{displayAspect:.5625,resolutions:[{key:"360x640",width:360,height:640,notes:"Low-density phone portrait baseline."},{key:"720x1280",width:720,height:1280,notes:"HD phone portrait."},{key:"1080x1920",width:1080,height:1920,notes:"Full HD phone portrait."}]}};function be(a){return Qe[a].displayAspect}function ve(a,e){let t=Qe[a]?.resolutions||[];if(!e)return t[0];let n=e.toLowerCase().replace(/\s+/g,"").replace("\xD7","x");return t.find(i=>i.key.toLowerCase()===n)}function Se(a){if(!a)return null;let t=String(a).toLowerCase().trim().replace(/\s+/g,"").replace("\xD7","x").match(/^(\d+)x(\d+)$/);if(!t)return null;let n=parseInt(t[1],10),i=parseInt(t[2],10);return!Number.isFinite(n)||!Number.isFinite(i)?null:{width:n,height:i}}var we=null,Ce=class{constructor(e,t,n,i,o,s,r,l,p,g,u,d,S){this.id=e;this.globals=t;this.stages=n;this.debug=i;this.time=o;this.input=s;this.aspectRatio=r;this.internalResolution=l;this.fullscreen=p;this.bodyBackground=g;this.container=u;this.containerId=d;this.canvas=S}};function Pt(a={}){return a.deviceProfile==="mobile"?!0:a.deviceProfile==="desktop"?!1:a.viewportSize?_({viewportSize:a.viewportSize,allowViewportOnly:!0}):_()}function Mt(a,e){if(e)return e;if(a){let i=document.getElementById(a);if(i)return i}let t=a||"zylem-root",n=document.createElement("main");return n.setAttribute("id",t),n.style.position="relative",n.style.width="100%",n.style.height="100%",document.body.appendChild(n),n}function Bt(a){let e=a?.id??"zylem";return{id:e,globals:a?.globals??{},stages:a?.stages??[],debug:!!a?.debug,time:a?.time??0,input:a?.input,aspectRatio:Y.SixteenByNine,fullscreen:!0,bodyBackground:"#000000",containerId:e}}var et=360;function tt(a,e){if(!a)return;if(typeof a=="string"){if(a==="native")return we;let i=Se(a);if(i)return i;if(e){let o=ve(e,a);if(o)return{width:o.width,height:o.height}}return}let t=a.width,n=a.height;if(Number.isFinite(t)&&Number.isFinite(n))return{width:t,height:n}}function It(a,e,t,n){if(typeof a=="number")return a;if(typeof a=="string")return Y[a]??t;if(e)try{return be(e)||t}catch{return t}return n?n.width/n.height:t}function Lt(a){let e=Number.isFinite(a)&&a>0?a:Y.SixteenByNine;if(e>=1){let i=et;return{width:Math.round(i*e),height:i}}let t=et,n=Math.round(t/e);return{width:t,height:n}}function Z(a,e={}){let t=Bt({id:a?.id??"zylem",debug:!!a?.debug,time:a?.time??0,input:a?.input,stages:a?.stages??[],globals:a?.globals??{}}),n=a?.containerId??t.containerId,i=Mt(n,a?.container??null),o=a?.mobile,s=Pt(e),r=s?o?.preset??a?.preset:a?.preset,l=tt(a?.resolution,a?.preset),p=tt(o?.resolution,o?.preset??a?.preset),g=(s?nt(p):void 0)??nt(l),u=s?o?.aspectRatio??a?.aspectRatio:a?.aspectRatio,d=It(u,r,t.aspectRatio,g),S=kt(s,p,l,d),f=a?.fullscreen??t.fullscreen,E=a?.bodyBackground??t.bodyBackground,P=a?.canvas??void 0,M=At(a?.input??t.input,o?.controls);return new Ce(a?.id??t.id,a?.globals??t.globals,a?.stages??t.stages,!!(a?.debug??t.debug),a?.time??t.time,M,d,S,f,E,i,n,P)}function nt(a){if(a)return a}function kt(a,e,t,n){if(a)return e===we?void 0:e??Lt(n);if(t!==we)return t}function At(a,e){if(!e)return a;let n=He("p1",{enabled:"auto",...e===!0?{}:e});return L(n,a??{})}function Dt(a){return{...a}}var ee=class{id;container;canvas;bodyBackground;fullscreen;aspectRatio;ratioDelegate=null;overlayContainer=null;constructor(e){this.id=e.id,this.container=this.ensureContainer(e.containerId??e.id,e.container),this.canvas=e.canvas??document.createElement("canvas"),this.bodyBackground=e.bodyBackground,this.fullscreen=!!e.fullscreen,this.aspectRatio=(typeof e.aspectRatio=="number",e.aspectRatio)}applyBodyBackground(){this.bodyBackground&&(document.body.style.background=this.bodyBackground)}mountCanvas(){this.mountChildren(this.canvas)}mountRenderer(e,t){this.mountChildren(e),this.canvas=e,this.attachAspectRatio(t)}getOverlayContainer(){return this.ensureOverlayContainer()}centerIfFullscreen(){if(!this.fullscreen)return;let e=this.container.style;e.display="flex",e.alignItems="center",e.justifyContent="center",e.position="relative",e.inset="0"}attachAspectRatio(e){this.ratioDelegate?(this.ratioDelegate.canvas=this.canvas,this.ratioDelegate.onResize=e,this.ratioDelegate.aspectRatio=this.aspectRatio,this.ratioDelegate.apply()):(this.ratioDelegate=new Q({container:this.container,canvas:this.canvas,aspectRatio:this.aspectRatio,onResize:e}),this.ratioDelegate.attach())}setAspectRatio(e){this.aspectRatio=e,this.ratioDelegate&&(this.ratioDelegate.aspectRatio=e,this.ratioDelegate.apply())}reapplyLayout(){this.ratioDelegate?.apply()}destroy(){this.ratioDelegate?.detach(),this.ratioDelegate=null}mountChildren(e){for(;this.container.firstChild;)this.container.removeChild(this.container.firstChild);this.container.appendChild(e),this.container.appendChild(this.ensureOverlayContainer())}ensureOverlayContainer(){if(this.overlayContainer)return this.overlayContainer;let e=document.createElement("div");return e.dataset.zylemOverlayRoot="true",e.style.position="absolute",e.style.inset="0",e.style.pointerEvents="none",e.style.touchAction="none",e.style.zIndex="10",this.overlayContainer=e,e}ensureContainer(e,t){if(t)return t;if(e){let o=document.getElementById(e);if(o)return o}let n=e||this.id||"zylem-root",i=document.createElement("main");return i.setAttribute("id",n),i.style.position="relative",i.style.width="100%",i.style.height="100%",document.body.appendChild(i),i}};import zt from"stats.js";import{subscribe as Vt}from"valtio/vanilla";var te=class{statsRef=null;unsubscribe=null;constructor(){this.updateDebugUI(),this.unsubscribe=Vt(v,()=>{this.updateDebugUI()})}begin(){this.statsRef?.begin()}end(){this.statsRef?.end()}updateDebugUI(){v.enabled&&!this.statsRef?(this.statsRef=new zt,this.statsRef.showPanel(0),this.statsRef.dom.style.position="absolute",this.statsRef.dom.style.bottom="0",this.statsRef.dom.style.right="0",this.statsRef.dom.style.top="auto",this.statsRef.dom.style.left="auto",document.body.appendChild(this.statsRef.dom)):!v.enabled&&this.statsRef&&(this.statsRef.dom.parentNode&&this.statsRef.dom.parentNode.removeChild(this.statsRef.dom),this.statsRef=null)}dispose(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null),this.statsRef?.dom?.parentNode&&this.statsRef.dom.parentNode.removeChild(this.statsRef.dom),this.statsRef=null}};var ne=class{loadingHandlers=[];stageLoadingUnsubscribes=[];onLoading(e){return this.loadingHandlers.push(e),()=>{this.loadingHandlers=this.loadingHandlers.filter(t=>t!==e)}}emit(e){for(let n of this.loadingHandlers)try{n(e)}catch(i){console.error("Game loading handler failed",i)}let t=`loading:${e.type}`;G.emit(t,e)}wireStageLoading(e,t){let n=e.onLoading(i=>{this.emit({type:i.type,message:i.message??"",progress:i.progress??0,current:i.current,total:i.total,stageName:e.uuid??`Stage ${t}`,stageIndex:t})});typeof n=="function"&&this.stageLoadingUnsubscribes.push(n)}unwireAllStages(){for(let e of this.stageLoadingUnsubscribes)try{e()}catch{}this.stageLoadingUnsubscribes=[]}dispose(){this.unwireAllStages(),this.loadingHandlers=[]}};import{getZylemBridge as Ot}from"@zylem/bridge";var ie=class{container=null;camera=null;rendererManager=null;gameCanvas=null;config=null;stage=null;mounted=!1;setGameCanvas(e){this.gameCanvas=e,this.tryMount()}setConfig(e){this.config=e,this.tryMount()}setContainer(e){this.container=e,this.tryMount()}setStage(e){this.stage=e,this.mounted&&this.gameCanvas?.reapplyLayout()}setCamera(e){this.camera=e,this.tryMount()}setRendererManager(e){this.rendererManager=e,this.tryMount()}tryMount(){this.mounted||!this.container||!this.gameCanvas||(this.rendererManager?this.mountWithRendererManager():this.camera&&this.mountWithCamera())}mountWithRendererManager(){if(!this.rendererManager||!this.gameCanvas)return;let e=this.rendererManager.getDomElement();this.gameCanvas.mountRenderer(e,(t,n)=>{if(!this.rendererManager)return;let i=this.config?.internalResolution;if(i)this.rendererManager.setPixelRatio(1),this.rendererManager.resize(i.width,i.height),this.stage?.resize(i.width,i.height);else{let o=window.devicePixelRatio||1;this.rendererManager.setPixelRatio(o),this.rendererManager.resize(t,n),this.stage?.resize(t,n)}}),this.mounted=!0}mountWithCamera(){if(!this.camera||!this.gameCanvas)return;let e=this.camera.getDomElement();this.gameCanvas.mountRenderer(e,(t,n)=>{if(!this.camera)return;let i=this.config?.internalResolution;if(i)this.camera.setPixelRatio(1),this.camera.resize(i.width,i.height);else{let o=window.devicePixelRatio||1;this.camera.setPixelRatio(o),this.camera.resize(t,n)}}),this.mounted=!0}reset(){this.camera=null,this.stage=null,this.mounted=!1}dispose(){this.container=null,this.camera=null,this.rendererManager=null,this.gameCanvas=null,this.config=null,this.stage=null,this.mounted=!1}};var ae=class a{id;initialGlobals={};customSetup=null;customUpdate=null;customDestroy=null;stages=[];stageMap=new Map;currentStageId="";previousTimeStamp=0;totalTime=0;timer;inputManager;wrapperRef;globalInputConfig;defaultCamera=null;rendererManager=null;container=null;canvas=null;aspectRatioDelegate=null;resolvedConfig=null;gameCanvas=null;animationFrameId=null;isDisposed=!1;loadInFlight=!1;hasStarted=!1;debugDelegate=null;loadingDelegate=new ne;rendererObserver=new ie;eventBusUnsubscribes=[];thumbnailUnsubscribes=[];lastPublishedGameConfig=null;gameBridge=new _e;cutscenePreview=new We(()=>this.currentStage()?.wrappedStage??null,e=>this.gameBridge.publishCutsceneStatus(e),{},e=>this.gameBridge.publishCutsceneView(e));catalogUnsubscribe=null;gameUpdateParams={};stageSetupParams={};stageUpdateParams={};frameCallback=e=>this.loop(e);sourceOptions;displayRuntime;static FRAME_LIMIT=120;static FRAME_DURATION=1e3/a.FRAME_LIMIT;static MAX_DELTA_SECONDS=1/30;constructor(e,t,n={}){this.wrapperRef=t,this.timer=new q,this.timer.connect(document),this.sourceOptions={...e},this.displayRuntime={...n};let i=Z(e,this.displayRuntime);this.globalInputConfig=i.input,this.id=i.id,this.stages=i.stages||[],this.container=i.container,this.canvas=i.canvas??null,this.resolvedConfig=i,this.loadGameCanvas(i),this.container=this.gameCanvas?.container??this.container,this.inputManager=new j(i.input,{targetElement:this.gameCanvas?.getOverlayContainer(),mouseTargetElement:this.gameCanvas?.container}),this.loadDebugOptions(e),this.setGlobals(e),Ke(),Je(),this.gameBridge.connect({resolveEntity:o=>this.currentStage()?.wrappedStage?.entityDelegate.childrenMap.get(o)??null,setStageVariable:(o,s)=>{let r=this.currentStage()?.wrappedStage?.state;r&&(r.variables[o]=s)},createEntity:(o,s,r)=>{this.createCatalogEntity(o,s,r)},applySceneOperation:(o,s)=>{this.currentStage()?.wrappedStage?.debugDelegate?.applySceneOperation(o,s)},pickEntity:o=>this.pickEntityAtNdc(o),cutscene:this.cutscenePreview,cameraPose:()=>this.cutscenePreview.cameraPose(),applySwatches:o=>{let s=this.currentStage()?.wrappedStage?.debugDelegate;return s?s.applySwatches(o):{results:o.uuids.flatMap(r=>o.swatches.map(l=>({uuid:r,kind:l.kind,source:l.source,ok:!1,reason:"entity-not-found"}))),entries:[]}}}),this.publishEntityCatalog(),this.catalogUnsubscribe=Ye(()=>this.publishEntityCatalog())}pickEntityAtNdc(e){let t=this.currentStage()?.wrappedStage,n=t?.debugDelegate?.pickAtNdc(e.x,e.y);if(!t||!n)return null;let i=t.entityDelegate.childrenMap.get(n.uuid);return i?this.buildEntitySummary(i)??{uuid:n.uuid,name:n.name||"Unnamed",type:me(i),position:ce(i).position,rotation:ce(i).rotation,scale:de(i)}:null}publishEntityCatalog(){this.gameBridge.publishCatalog(Xe())}createCatalogEntity(e,t,n){let i=this.currentStage()?.wrappedStage,o=Ne(e);if(!i||!o)return;let s=n?.position??{x:0,y:0,z:0},r=o.create({position:s,props:{...o.defaultProps??{},...t??{}}});r&&Promise.resolve(r).then(l=>l&&i.entityDelegate.spawnEntity(l)).catch(l=>{console.error("entity:create failed",l)})}setDisplayRuntime(e){this.displayRuntime={...e};let t=Z(this.sourceOptions,this.displayRuntime);this.resolvedConfig=t,this.rendererObserver.setConfig(t),this.gameCanvas?.setAspectRatio(t.aspectRatio),this.publishGameConfig()}loadGameCanvas(e){this.gameCanvas=new ee({id:e.id,container:e.container,containerId:e.containerId,canvas:this.canvas??void 0,bodyBackground:e.bodyBackground,fullscreen:e.fullscreen,aspectRatio:e.aspectRatio}),this.gameCanvas.applyBodyBackground(),this.gameCanvas.mountCanvas(),this.gameCanvas.centerIfFullscreen(),this.rendererObserver.setGameCanvas(this.gameCanvas),this.resolvedConfig&&this.rendererObserver.setConfig(this.resolvedConfig),this.container&&this.rendererObserver.setContainer(this.container),this.subscribeToEventBus()}loadDebugOptions(e){e.debug!==void 0&&(v.enabled=!!e.debug),this.debugDelegate=new te}isLoading(){return this.loadInFlight}async loadStage(e,t=0,n){if(this.loadInFlight){console.warn("loadStage ignored: a stage load is already in progress");return}this.loadInFlight=!0;try{await this.performLoadStage(e,t,n)}finally{this.loadInFlight=!1}}async performLoadStage(e,t=0,n){let i=n?$e(n):null;this.cutscenePreview.releaseStage();let o=this.currentStage()??null,s=o?.wrappedStage??null,r=s?.scene?.scene??null,l=s?.cameraManagerRef?.primaryCamera?.camera??s?.cameraRef?.camera??null;i&&this.rendererManager?.initialized&&o&&r&&l&&this.rendererManager.beginSnapshotTransition(i,r,l),this.unloadCurrentStage();let g=e.options[0];if(this.loadingDelegate.wireStageLoading(e,t),this.rendererManager||(this.rendererManager=new Oe,await this.rendererManager.initRenderer()),x.setRenderer(this.rendererManager.renderer),await e.load(this.id,g?.camera,this.rendererManager),this.stageMap.set(e.wrappedStage.uuid,e),this.currentStageId=e.wrappedStage.uuid,this.defaultCamera=e.wrappedStage.cameraRef,this.wireEntityThumbnails(e),this.rendererObserver.setStage(e.wrappedStage??null),this.rendererManager&&this.rendererObserver.setRendererManager(this.rendererManager),this.applyInputConfig(e),e.onInputConfigChanged=()=>this.applyInputConfig(e),this.hasStarted&&e.wrappedStage&&!e.wrappedStage.hasSetup){let u=this.params(),d={...this.stageSetupParams};d.inputs=u.inputs,d.globals=u.globals,d.camera=u.camera,d.stage=u.stage,d.game=u.game,d.me=e.wrappedStage,e.start(d)}this.publishGameConfig(),this.publishStageSnapshot(),this.cutscenePreview.stageReady()}applyInputConfig(e){let t=L(this.globalInputConfig??{},e.inputConfig??{});this.inputManager.configure(t)}setGlobalInputConfig(e){this.globalInputConfig=e;let t=this.currentStage();t&&this.applyInputConfig(t)}unloadCurrentStage(){if(!this.currentStageId)return;let e=this.getStage(this.currentStageId);if(e){if(this.clearEntityThumbnailWiring(),x.clear(),e.onInputConfigChanged=null,e?.wrappedStage){try{e.wrappedStage.nodeDestroy({me:e.wrappedStage,globals:V.globals})}catch(t){console.error("Failed to destroy previous stage",t)}e.wrappedStage=null}e.dispose(),this.stageMap.delete(this.currentStageId),this.currentStageId="",this.defaultCamera=null,this.rendererObserver.reset()}}setGlobals(e){this.initialGlobals={...e.globals};for(let t in this.initialGlobals){let n=this.initialGlobals[t];n===void 0&&console.error(`global ${t} is undefined`),Le(t,n)}}params(){let e=this.currentStage(),t=this.timer.getDelta(),n=this.inputManager.getInputs(t),i=e?.wrappedStage?.cameraRef||this.defaultCamera,o=this.gameUpdateParams;return o.delta=t,o.inputs=n,o.globals=De(),o.me=this,o.camera=i,o.stage=e,o.game=this.wrapperRef,o}start(){let e=this.currentStage(),t=this.params(),n=this.stageSetupParams;n.inputs=t.inputs,n.globals=t.globals,n.camera=t.camera,n.stage=t.stage,n.game=t.game,n.me=e.wrappedStage,e.start(n),this.customSetup&&this.customSetup(t),this.hasStarted=!0,this.loop(0)}step(e){let t=this.currentStage();if(!t||!t.wrappedStage)return;let n=this.params(),i=e!==void 0?e:n.delta,o=Math.min(Math.max(i,0),a.MAX_DELTA_SECONDS);n.delta=o,this.customUpdate&&this.customUpdate(n);let s=this.currentStage();if(s!==t||!s?.wrappedStage){this.totalTime+=o,V.time=this.totalTime;return}let r=this.stageUpdateParams;r.delta=n.delta,r.inputs=n.inputs,r.globals=n.globals,r.camera=n.camera,r.stage=n.stage,r.game=n.game,r.me=t.wrappedStage,t.wrappedStage?.nodeUpdate(r),this.totalTime+=o,V.time=this.totalTime}loop(e){this.debugDelegate?.begin(),Ve()||(this.timer.update(e),this.step(),this.previousTimeStamp=e),this.debugDelegate?.end(),this.outOfLoop(),this.cutscenePreview.frame(),this.isDisposed||(this.animationFrameId=requestAnimationFrame(this.frameCallback))}dispose(){this.isDisposed=!0,this.cutscenePreview.unload(),this.catalogUnsubscribe?.(),this.catalogUnsubscribe=null,this.gameBridge.disconnect(),this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.unloadCurrentStage(),this.debugDelegate&&(this.debugDelegate.dispose(),this.debugDelegate=null),this.eventBusUnsubscribes.forEach(e=>e()),this.eventBusUnsubscribes=[],this.rendererObserver.dispose(),this.inputManager.dispose(),this.rendererManager&&(x.setRenderer(null),this.rendererManager.dispose(),this.rendererManager=null),x.clear(),Ot().channel.reset(),this.timer.dispose(),this.customDestroy&&this.customDestroy({me:this,globals:V.globals}),O()}outOfLoop(){let e=this.currentStage();e&&e.wrappedStage.outOfLoop()}getStage(e){return this.stageMap.get(e)}currentStage(){return this.getStage(this.currentStageId)}onLoading(e){return this.loadingDelegate.onLoading(e)}buildStageConfigPayload(){let e=this.currentStage();if(!e?.wrappedStage)return null;let t=e.wrappedStage.state,n=t.backgroundColor,i=typeof n=="string"?n:`#${n.getHexString()}`;return{id:e.wrappedStage.uuid,backgroundColor:i,backgroundImage:t.backgroundImage,gravity:{x:t.gravity.x,y:t.gravity.y,z:t.gravity.z},inputs:t.inputs,variables:t.variables}}buildEntitySummary(e){if(H(e.options))return null;let t=e.position??{x:0,y:0,z:0},n=e.rotation??{x:0,y:0,z:0},i=de(e),o=Fe(e),s=x.get(e.uuid);return{uuid:e.uuid,name:e.name||"Unnamed",type:me(e),position:{x:t.x??0,y:t.y??0,z:t.z??0},rotation:{x:n.x??0,y:n.y??0,z:n.z??0},scale:i,quaternion:o,thumbnail:s?.dataUrl??null,bounds:s?.bounds}}buildEntitiesPayload(){let e=this.currentStage();if(!e?.wrappedStage)return[];let t=[];return e.wrappedStage.entityDelegate.childrenMap.forEach(n=>{let i=this.buildEntitySummary(n);i&&t.push(i)}),t}wireEntityThumbnails(e){if(this.clearEntityThumbnailWiring(),!e.wrappedStage)return;let t=s=>{if(!this.gameBridge.wantsThumbnails()||H(s.options))return;let r=s.group??s.mesh??null;r&&x.ensure(s.uuid,r).then(l=>{l&&!this.isDisposed&&this.gameBridge.queueThumbnails([{uuid:s.uuid,url:l.dataUrl,bounds:l.bounds}])})},n=e.wrappedStage.onEntityAdded(s=>{if(this.gameBridge.wantsEntityUpdates()){let r=this.buildEntitySummary(s);r&&this.gameBridge.queueEntityUpsert([r])}t(s)},{replayExisting:!0});this.thumbnailUnsubscribes.push(n);let i=s=>{if(!s.success)return;let r=e.wrappedStage?.entityDelegate.childrenMap.get(s.entityId);r&&(x.invalidate(s.entityId),t(r))};G.on("entity:model:loaded",i),this.thumbnailUnsubscribes.push(()=>{G.off("entity:model:loaded",i)});let o=s=>{x.invalidate(s.entityId),this.gameBridge.wantsEntityUpdates()&&this.gameBridge.queueEntityRemoved([s.entityId])};G.on("entity:destroyed",o),this.thumbnailUnsubscribes.push(()=>{G.off("entity:destroyed",o)}),this.wireEditorBackfill(e)}wireEditorBackfill(e){let t=this.gameBridge.onEditorAttached(()=>{if(!(this.isDisposed||this.currentStage()!==e)){this.lastPublishedGameConfig=null,this.publishGameConfig(),this.publishStageSnapshot();for(let n of e.wrappedStage?.entityDelegate.childrenMap.values()??[]){let i=n;if(H(i.options))continue;let o=i.group??i.mesh??null;o&&x.ensure(i.uuid,o).then(s=>{s&&!this.isDisposed&&this.gameBridge.queueThumbnails([{uuid:i.uuid,url:s.dataUrl,bounds:s.bounds}])})}}});this.thumbnailUnsubscribes.push(t)}clearEntityThumbnailWiring(){this.thumbnailUnsubscribes.forEach(e=>{try{e()}catch{}}),this.thumbnailUnsubscribes=[]}buildGameConfigPayload(){return this.resolvedConfig?{id:this.resolvedConfig.id,aspectRatio:this.resolvedConfig.aspectRatio,fullscreen:this.resolvedConfig.fullscreen,bodyBackground:this.resolvedConfig.bodyBackground,internalResolution:this.resolvedConfig.internalResolution,debug:this.resolvedConfig.debug}:null}publishGameConfig(){let e=this.buildGameConfigPayload();if(!e)return;let t=JSON.stringify(e);t!==this.lastPublishedGameConfig&&(this.lastPublishedGameConfig=t,this.gameBridge.publishConfig(e))}publishStageSnapshot(){this.gameBridge.publishStageSnapshot({stage:this.buildStageConfigPayload(),entities:this.buildEntitiesPayload()})}subscribeToEventBus(){this.eventBusUnsubscribes.push(Ie.on("game:state:updated",e=>{this.gameBridge.publishVariable({path:e.path,value:e.value,previousValue:e.previousValue})}))}};async function it(a){let{getGameDefaultConfig:e}=await import("./game-default-JV3Q6JAL.js"),t={...e()},n=[],i=[],o=[];Object.values(a).forEach(r=>{if(r instanceof K)i.push(r);else if(r instanceof fe)o.push(r);else if(r instanceof ge)o.push(r);else if(r?.constructor?.name==="Object"&&typeof r=="object"){let l=Object.assign({...e()},{...r});n.push(l)}}),n.forEach(r=>{t=Object.assign(t,{...r})});let s=t;return s.input=n[0].input,i.forEach(r=>{r.addEntities(o)}),i.length?s.stages=i:s.stages[0].addEntities(o),s}function at(a){return!!a.find(t=>t instanceof K)}function xe(a){for(let e of a)if(e&&typeof e=="object"&&!(e instanceof K)&&!(e instanceof ge)&&!(e instanceof fe)){let t=e;if(t.globals)return t.globals}}import{proxy as Ht}from"valtio/vanilla";import{get as Ut,set as Ft}from"idb-keyval";import{pack as _t,unpack as Nt}from"msgpackr";var h=Ht({previous:null,current:null,next:null,isLoading:!1}),oe={staticRegistry:new Map,registerStaticStage(a,e){this.staticRegistry.set(a,e)},async loadStageData(a){try{let e=await Ut(a);if(e)return Nt(e)}catch(e){console.warn(`Failed to load stage ${a} from storage`,e)}if(this.staticRegistry.has(a))return this.staticRegistry.get(a);throw new Error(`Stage ${a} not found in storage and static loading not fully implemented.`)},async transitionForward(a,e){if(!h.isLoading){h.isLoading=!0;try{h.current&&await Ft(h.current.id,_t(h.current)),h.previous=h.current,h.current=h.next,h.current?.id!==a&&(e?h.current=await e(a):h.current=await this.loadStageData(a)),h.next=null}catch(t){console.error("Failed to transition stage:",t)}finally{h.isLoading=!1}}},async preloadNext(a,e){e?h.next=await e(a):h.next=await this.loadStageData(a)}};var Ge={async createFromBlueprint(a){let e=U({});if(a.entities)for(let t of a.entities)try{let n=await je.createFromBlueprint(t);e.add(n)}catch(n){console.error(`Failed to create entity ${t.id} for stage ${a.id}`,n)}return e}};var re=class{wrappedGame=null;options;setupCallbacks=[];updateCallbacks=[];destroyCallbacks=[];pendingLoadingCallbacks=[];globalChangeCallbacks=[];globalChangesCallbacks=[];activeGlobalSubscriptions=[];eventDelegate=new Ue;pendingInputConfig=null;displayRuntime={};refErrorMessage="lost reference to game";constructor(e){this.options=e,at(e)||this.options.push(U());let t=xe(e);t&&ue(t)}onSetup(...e){return this.setupCallbacks.push(...e),this}onUpdate(...e){return this.updateCallbacks.push(...e),this}onDestroy(...e){return this.destroyCallbacks.push(...e),this}setInputConfiguration(...e){let t=L(...e);return this.pendingInputConfig=t,this.wrappedGame&&this.wrappedGame.setGlobalInputConfig(t),this}async start(){O();let e=xe(this.options);e&&ue(e);let t=await this.load();return this.wrappedGame=t,this.setOverrides(),this.registerGlobalSubscriptions(),t.start(),this}setDisplayRuntime(e){return this.displayRuntime={...this.displayRuntime,...e},this.wrappedGame&&this.wrappedGame.setDisplayRuntime(this.displayRuntime),this}setDeviceProfile(e){return this.setDisplayRuntime({deviceProfile:e})}setViewportSize(e,t){return this.setDisplayRuntime({viewportSize:{width:e,height:t}})}async load(){let e=await it(this.options),t=Z(e,this.displayRuntime);this.pendingInputConfig&&(t.input=L(t.input??{},this.pendingInputConfig));let n=new ae({...e,...t},this,this.displayRuntime);for(let i of this.pendingLoadingCallbacks)n.onLoading(i);return await n.loadStage(e.stages[0]),n}setOverrides(){if(!this.wrappedGame){console.error(this.refErrorMessage);return}this.wrappedGame.customSetup=e=>{this.setupCallbacks.forEach(t=>t(e))},this.wrappedGame.customUpdate=e=>{this.updateCallbacks.forEach(t=>t(e))},this.wrappedGame.customDestroy=e=>{this.destroyCallbacks.forEach(t=>t(e))}}onGlobalChange(e,t){return this.globalChangeCallbacks.push({path:e,callback:t}),this}onGlobalChanges(e,t){return this.globalChangesCallbacks.push({paths:e,callback:t}),this}registerGlobalSubscriptions(){for(let{path:e,callback:t}of this.globalChangeCallbacks){let n=ke(e,i=>{t(i,this.getCurrentStage())});this.activeGlobalSubscriptions.push(n)}for(let{paths:e,callback:t}of this.globalChangesCallbacks){let n=Ae(e,i=>{t(i,this.getCurrentStage())});this.activeGlobalSubscriptions.push(n)}}getCurrentStage(){return this.wrappedGame?.currentStage()??null}experimental={getRuntime:()=>this.getCurrentStage()?.wrappedStage?.world?.simulation??null};async pause(){pe(!0)}async resume(){pe(!1),this.wrappedGame&&(this.wrappedGame.previousTimeStamp=0,this.wrappedGame.timer.reset())}step(e=1/60){if(!this.wrappedGame){console.error(this.refErrorMessage);return}this.wrappedGame.step(e)}async reset(e){if(!this.wrappedGame){console.error(this.refErrorMessage);return}this.wrappedGame.isLoading()||await this.wrappedGame.loadStage(this.wrappedGame.stages[0],0,e?.transition)}previousStage(e){if(!this.wrappedGame){console.error(this.refErrorMessage);return}if(this.wrappedGame.isLoading())return;let t=this.wrappedGame.currentStageId,n=this.wrappedGame.stages.findIndex(o=>o.wrappedStage?.uuid===t),i=this.wrappedGame.stages[n-1];if(!i){console.error("previous stage called on first stage");return}this.wrappedGame.loadStage(i,n-1,e?.transition)}async loadStageFromId(e){if(!this.wrappedGame){console.error(this.refErrorMessage);return}try{let t=await oe.loadStageData(e),n=await Ge.createFromBlueprint(t);await this.wrappedGame.loadStage(n),h.current=t}catch(t){console.error(`Failed to load stage ${e}`,t)}}nextStage(e){if(!this.wrappedGame){console.error(this.refErrorMessage);return}if(this.wrappedGame.isLoading())return;if(h.next){console.log("next stage called");let o=h.next.id;if(oe.transitionForward(o),h.current){Ge.createFromBlueprint(h.current).then(s=>{this.wrappedGame?.loadStage(s,0,e?.transition)});return}}let t=this.wrappedGame.currentStageId,n=this.wrappedGame.stages.findIndex(o=>o.wrappedStage?.uuid===t),i=this.wrappedGame.stages[n+1];if(!i){console.error("next stage called on last stage");return}this.wrappedGame.loadStage(i,n+1,e?.transition)}async goToStage(){}async end(){}dispose(){this.eventDelegate.dispose();for(let e of this.activeGlobalSubscriptions)e();this.activeGlobalSubscriptions=[],this.wrappedGame&&(this.wrappedGame.dispose(),this.wrappedGame=null),ze(),O(),Ze.clearSharedMaterialCache()}dispatch(e,t){this.eventDelegate.dispatch(e,t),G.emit(e,t)}listen(e,t){return this.eventDelegate.listen(e,t)}onLoading(e){return this.wrappedGame?this.wrappedGame.onLoading(e):(this.pendingLoadingCallbacks.push(e),()=>{this.pendingLoadingCallbacks=this.pendingLoadingCallbacks.filter(t=>t!==e),this.wrappedGame})}};function Xt(...a){return new re(a)}import{Euler as Yt,Quaternion as Zt,Vector2 as Kt}from"three";function Jt(a){return{spawn:async(e,t,n)=>{let i=await Promise.resolve(a(t,n));return e.add(i),i},spawnRelative:async(e,t,n=new Kt(0,1))=>{if(!e.body){console.warn("body missing for entity during spawnRelative");return}let{x:i,y:o,z:s}=e.body.translation(),r=e._rotation2DAngle??0;try{let u=e.body.rotation(),d=new Zt(u.x,u.y,u.z,u.w);r=new Yt().setFromQuaternion(d,"XYZ").z}catch{}let l=Math.sin(-r)*(n.x??0),p=Math.cos(-r)*(n.y??0),g=await Promise.resolve(a(i+l,o+p));return t.add(g),g}}}import{subscribe as $t}from"valtio/vanilla";var Ee="STAGE_STATE_CHANGE";function Wt(){return $t(k,()=>{let a={entities:k.entities,variables:k.variables};window.dispatchEvent(new CustomEvent(Ee,{detail:a}))})}function jt(){let a={entities:k.entities,variables:k.variables};window.dispatchEvent(new CustomEvent(Ee,{detail:a}))}import{MathUtils as qt,Vector3 as Qt}from"three";var ot={targetKey:"primary",offset:new Qt(0,0,0),lerpFactor:.1};function en(a){let e={...ot,...a,offset:he(a?.offset,ot.offset)},t=null;return{priority:0,enabled:!0,onAttach(){t=null},update(n,i){let o=n.targets[e.targetKey];if(!o)return i;let s=o.position.clone().add(e.offset),r=A(i);if(!t)t=s.clone();else{let l=qt.clamp(e.lerpFactor,0,1),p=1-Math.pow(1-l,n.dt*60);t.lerp(s,p)}return r.position.copy(t),r.lookAt=o.position.clone(),r},onDetach(){t=null}}}import{MathUtils as Te,Vector3 as rt}from"three";var tn={x:"delay",y:"settle",z:"delay"},st=["x","y","z"];function nn(a){let e={...tn,...a?.axes},t=a?.targetKey??"primary",n=a?.lerpFactor??.1,i=a?.window??0,o=a?.settleSpeed??.75,s=a?.settleTime??.15,r=a?.settleLerp??.08,l=a?.lookahead??0,p=null,g=null,u=null,d={x:0,y:0,z:0},S=new rt,f=new rt,E=()=>{p=null,g=null,u=null,d.x=d.y=d.z=0,S.set(0,0,0)};return{priority:0,enabled:!0,onAttach:E,onDetach:E,update(P,M){let B=P.targets[t];if(!B)return M;let b=B.position,y=p??b.clone(),C=g??b.clone(),I=u??b.clone();p=y,g=C,u=I;let T=P.dt,z=T>1e-8?1/T:0,pt=lt(n,T),dt=lt(r,T);if(l>0){f.set(0,0,0);for(let c of st)e[c]==="delay"&&(f[c]=(b[c]-I[c])*z);f.lengthSq()>1e-8&&S.copy(f).normalize()}for(let c of st){let Be=e[c];if(Be==="off"){y[c]=b[c];continue}let ct=Math.abs((b[c]-I[c])*z);if(Be==="settle"){ct<=o?(d[c]+=T,d[c]>=s&&(C[c]=b[c])):d[c]=0,y[c]=Te.lerp(y[c],C[c],dt);continue}let le=b[c];l>0&&(le+=S[c]*l),!(Math.abs(le-y[c])<=i)&&(y[c]=Te.lerp(y[c],le,pt))}I.copy(b);let R=A(M),Re=y.x-b.x,Pe=y.y-b.y,Me=y.z-b.z;return R.position.x+=Re,R.position.y+=Pe,R.position.z+=Me,R.lookAt&&(R.lookAt.x+=Re,R.lookAt.y+=Pe,R.lookAt.z+=Me),R}}}function lt(a,e){let t=Te.clamp(a,0,1);return 1-Math.pow(1-t,e*60)}import{MathUtils as se}from"three";function an(a){let e=a?.sampleInput??(()=>({})),t=se.clamp(a?.edgeMargin??.08,0,.5),n=a?.edgeSpeed??12,i=a?.panSpeed??16,o=a?.followLerp??.12,s=a?.breakFollowOnPan??!0,r=a?.followKey??null,l=!1,p=null,g=()=>{p=null,l=!1};return{priority:0,enabled:!0,onAttach:g,onDetach:g,setFollowKey(u){r=u,l=!1},update(u,d){let S=d.lookAt??d.position,f=p??S.clone();p=f;let E=e()??{},P=E.pan?.x??0,M=E.pan?.y??0,B=on(E.pointer,t);(Math.abs(P)>.01||Math.abs(M)>.01||B.x!==0||B.y!==0)&&s&&(l=!0);let y=!l&&r?u.targets[r]:void 0;if(y){let z=rn(o,u.dt);f.x=se.lerp(f.x,y.position.x,z),f.z=se.lerp(f.z,y.position.z,z)}else f.x+=(P*i+B.x*n)*u.dt,f.z+=(-M*i+B.y*n)*u.dt;let C=A(d),I=f.x-S.x,T=f.z-S.z;return C.position.x+=I,C.position.z+=T,C.lookAt&&(C.lookAt.x+=I,C.lookAt.z+=T),C}}}function on(a,e){if(!a||e<=0)return{x:0,y:0};let t=a.centered?(a.x+1)/2:a.x,n=a.centered?(a.y+1)/2:a.y;return{x:ut(t,e),y:ut(n,e)}}function ut(a,e){return a<e?-((e-a)/e):a>1-e?(a-(1-e))/e:0}function rn(a,e){let t=se.clamp(a,0,1);return 1-Math.pow(1-t,e*60)}import{MeshBasicMaterial as sn}from"three";function ln(a,e,t){let n=e.cameraRef;if(!n.renderTarget){let s=t?.width??512,r=t?.height??512;n.createRenderTarget(s,r)}let i=n.getRenderTexture();if(!i){console.warn("setCameraFeed: Failed to obtain render texture from camera.");return}if(!a.mesh){console.warn("setCameraFeed: Entity has no mesh to apply the camera feed to.");return}let o=new sn({map:i});a.mesh.material=o}export{Y as a,be as b,ve as c,Se as d,Dt as e,h as f,oe as g,re as h,Xt as i,Jt as j,Ee as k,Wt as l,jt as m,en as n,nn as o,an as p,ln as q};
@@ -0,0 +1 @@
1
+ import{b as R,c as xt,d as Ot,e as wt,f as St,g as vt,h as Ct,j as Mt,r as p,s as f,t as c,v as b,w as X,x as Y,y as D,z as T}from"./chunk-KP6DLLJO.js";import{j as bt}from"./chunk-6FGXC4T6.js";import{e as Pt}from"./chunk-UUOPT2N4.js";import{d as N}from"./chunk-4QLJUQSJ.js";import{b as J,c as $,d as gt,h as F,i as E,j as ft}from"./chunk-7WRQ2UAN.js";import{BoxGeometry as Qt,CapsuleGeometry as te,ConeGeometry as Zt,CylinderGeometry as ee,Mesh as z,MeshStandardMaterial as ie,SphereGeometry as oe}from"three";function B(e,t=Symbol("mesh")){if(e.material||e.color){let i=new bt;if(i.build({...e.material,color:e.color??e.material?.color},t),i.materials.length>0)return i.materials}return[new ie]}function L(e,t){if(t.position){let i=F(t.position,$);e.position.set(i.x,i.y,i.z)}return e.castShadow=!0,e.receiveShadow=!0,e}function Et(e={}){let t=F(e.size,gt),i=new Qt(t.x,t.y,t.z),o=B(e);return L(new z(i,o.at(-1)),e)}function _t(e={}){let t=new oe(e.radius??1),i=B(e);return L(new z(t,i.at(-1)),e)}function Rt(e={}){let t=new Zt(e.radius??1,e.height??2,e.radialSegments??32),i=B(e);return L(new z(t,i.at(-1)),e)}function Dt(e={}){let t=new Zt(e.radius??1,e.height??2,4),i=B(e);return L(new z(t,i.at(-1)),e)}function Tt(e={}){let t=new ee(e.radiusTop??1,e.radiusBottom??1,e.height??2,e.radialSegments??32),i=B(e);return L(new z(t,i.at(-1)),e)}function zt(e={}){let t=new te(e.radius??.5,e.length??1,e.capSegments??10,e.radialSegments??20),i=B(e);return L(new z(t,i.at(-1)),e)}import{Vector3 as le}from"three";import{MeshStandardMaterial as ne,MeshBasicMaterial as se,MeshPhongMaterial as re}from"three";function ae(e){return e&&typeof e.getDebugInfo=="function"}var u=class{entity;constructor(t){this.entity=t}getPositionString(){if(this.entity.mesh){let{x:n,y:s,z:l}=this.entity.mesh.position;return`${n.toFixed(2)}, ${s.toFixed(2)}, ${l.toFixed(2)}`}let{x:t,y:i,z:o}=this.entity.options.position||{x:0,y:0,z:0};return`${t.toFixed(2)}, ${i.toFixed(2)}, ${o.toFixed(2)}`}getRotationString(){if(this.entity.mesh){let{x:s,y:l,z:r}=this.entity.mesh.rotation,a=m=>(m*180/Math.PI).toFixed(1);return`${a(s)}\xB0, ${a(l)}\xB0, ${a(r)}\xB0`}let{x:t,y:i,z:o}=this.entity.options.rotation||{x:0,y:0,z:0},n=s=>(s*180/Math.PI).toFixed(1);return`${n(t)}\xB0, ${n(i)}\xB0, ${n(o)}\xB0`}getMaterialInfo(){if(!this.entity.mesh||!this.entity.mesh.material)return{type:"none"};let t=Array.isArray(this.entity.mesh.material)?this.entity.mesh.material[0]:this.entity.mesh.material,i={type:t.type};return(t instanceof ne||t instanceof se||t instanceof re)&&(i.color=`#${t.color.getHexString()}`,i.opacity=t.opacity,i.transparent=t.transparent),"roughness"in t&&(i.roughness=t.roughness),"metalness"in t&&(i.metalness=t.metalness),i}getPhysicsInfo(){if(!this.entity.body)return null;let t={type:this.entity.body.bodyType(),mass:this.entity.body.mass(),isEnabled:this.entity.body.isEnabled(),isSleeping:this.entity.body.isSleeping()},i=this.entity.body.linvel();return t.velocity=`${i.x.toFixed(2)}, ${i.y.toFixed(2)}, ${i.z.toFixed(2)}`,t}buildDebugInfo(){let t={name:this.entity.name||this.entity.uuid,uuid:this.entity.uuid,position:this.getPositionString(),rotation:this.getRotationString(),material:this.getMaterialInfo()},i=this.getPhysicsInfo();if(i&&(t.physics=i),ae(this.entity)){let o=this.entity.getDebugInfo();return{...t,...o}}return t}};var Bt={...p,size:new le(1,1,1)},ce=Symbol("Box"),K=class e extends c{static type=ce;constructor(t){super(),this.options={...Bt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),{x:o,y:n,z:s}=this.options.size??{x:1,y:1,z:1};return{...i,type:String(e.type),size:`${o}, ${n}, ${s}`}}};function he(...e){let t=f(e,Bt),i=new K(t);return i.add(Et({size:t.size,material:t.material,color:t.color}),xt({size:t.size,static:t.collision?.static,sensor:t.collision?.sensor,canSleep:t.collision?.canSleep,ccdEnabled:t.collision?.ccdEnabled,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>he(o??{}))}var Lt={...p,radius:1},me=Symbol("Sphere"),Q=class e extends c{static type=me;constructor(t){super(),this.options={...Lt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??1;return{...i,type:String(e.type),radius:o.toFixed(2)}}};function pe(...e){let t=f(e,Lt),i=new Q(t);return i.add(_t({radius:t.radius,material:t.material,color:t.color}),Ot({radius:t.radius,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>pe(o??{}))}var It={...p,radius:1,height:2,radialSegments:32},ue=Symbol("Cone"),tt=class e extends c{static type=ue;constructor(t){super(),this.options={...It,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??1,n=this.options.height??2;return{...i,type:String(e.type),radius:o.toFixed(2),height:n.toFixed(2)}}};function de(...e){let t=f(e,It),i=new tt(t);return i.add(Rt({radius:t.radius,height:t.height,radialSegments:t.radialSegments,material:t.material,color:t.color}),wt({radius:t.radius,height:t.height,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>de(o??{}))}var kt={...p,radius:1,height:2},ye=Symbol("Pyramid"),et=class e extends c{static type=ye;constructor(t){super(),this.options={...kt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??1,n=this.options.height??2;return{...i,type:String(e.type),radius:o.toFixed(2),height:n.toFixed(2)}}};function ge(...e){let t=f(e,kt),i=new et(t);return i.add(Dt({radius:t.radius,height:t.height,material:t.material,color:t.color}),St({radius:t.radius,height:t.height,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>ge(o??{}))}var Ft={...p,radiusTop:1,radiusBottom:1,height:2,radialSegments:32},fe=Symbol("Cylinder"),it=class e extends c{static type=fe;constructor(t){super(),this.options={...Ft,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radiusTop??1,n=this.options.radiusBottom??1,s=this.options.height??2;return{...i,type:String(e.type),radiusTop:o.toFixed(2),radiusBottom:n.toFixed(2),height:s.toFixed(2)}}};function be(...e){let t=f(e,Ft),i=new it(t);return i.add(Tt({radiusTop:t.radiusTop,radiusBottom:t.radiusBottom,height:t.height,radialSegments:t.radialSegments,material:t.material,color:t.color}),vt({radiusTop:t.radiusTop,radiusBottom:t.radiusBottom,height:t.height,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>be(o??{}))}var Gt={...p,radius:.5,length:1,capSegments:10,radialSegments:20},xe=Symbol("Pill"),ot=class e extends c{static type=xe;constructor(t){super(),this.options={...Gt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??.5,n=this.options.length??1;return{...i,type:String(e.type),radius:o.toFixed(2),length:n.toFixed(2)}}};function Oe(...e){let t=f(e,Gt),i=new ot(t);return i.add(zt({radius:t.radius,length:t.length,capSegments:t.capSegments,radialSegments:t.radialSegments,material:t.material,color:t.color}),Ct({radius:t.radius,length:t.length,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>Oe(o??{}))}import{Group as we,RingGeometry as Se}from"three";var Ht={...p,innerRadius:0,outerRadius:1,thetaSegments:32},nt=class extends X{collider(t){let i=t.outerRadius??1;return{shape:{type:"cylinder",halfHeight:.1/2,radius:i}}}},st=class extends Y{build(t){let i=t.innerRadius??0,o=t.outerRadius??1,n=t.thetaSegments??32,s=new Se(i,o,n);return s.rotateX(-Math.PI/2),s}},rt=class extends D{createEntity(t){return new G(t)}build(){let t=super.build();return t.mesh&&!t.group&&(t.group=new we,t.group.add(t.mesh)),t}},ve=Symbol("Disk"),G=class e extends c{static type=ve;constructor(t){super(),this.options={...Ht,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.innerRadius??0,n=this.options.outerRadius??1;return{...i,type:String(e.type),innerRadius:o.toFixed(2),outerRadius:n.toFixed(2)}}};function Ce(...e){return T({args:e,defaultConfig:Ht,EntityClass:G,BuilderClass:rt,MeshBuilderClass:st,CollisionBuilderClass:nt,entityType:G.type,cloneFactory:t=>Ce(t??{})})}import{PlaneGeometry as Pe,Vector2 as Vt,Vector3 as At}from"three";import{BufferGeometry as Me,Float32BufferAttribute as at}from"three";var W=class e extends Me{constructor(t=1,i=1,o=1,n=1){super(),this.type="XZPlaneGeometry",this.parameters={width:t,height:i,widthSegments:o,heightSegments:n};let s=t/2,l=i/2,r=Math.floor(o),a=Math.floor(n),m=r+1,C=a+1,M=t/r,x=i/a,O=[],w=[],d=[],P=[];for(let y=0;y<C;y++){let h=y*x-l;for(let S=0;S<m;S++){let Z=S*M-s;w.push(Z,0,h),d.push(0,1,0),P.push(S/r),P.push(1-y/a)}}for(let y=0;y<a;y++)for(let h=0;h<r;h++){let S=h+m*y,Z=h+m*(y+1),g=h+1+m*(y+1),v=h+1+m*y;O.push(S,Z,v),O.push(Z,g,v)}this.setIndex(O),this.setAttribute("position",new at(w,3)),this.setAttribute("normal",new at(d,3)),this.setAttribute("uv",new at(P,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new e(t.width,t.height,t.widthSegments,t.heightSegments)}};var U=4,Nt={...p,tile:new Vt(10,10),repeat:new Vt(1,1),collision:{static:!0},subdivisions:U,randomizeHeight:!1,heightScale:1};function $t(e){let t=e.subdivisions??U,i=e.heightMap2D,o=e.heightMap,n=e.subdivisionsX??t,s=e.subdivisionsZ??t;return i&&i.length>0&&i[0]?.length>0?(s=i.length-1,n=i[0].length-1):o&&o.length>0&&(n=o.length-1),{subdivisionsX:n,subdivisionsZ:s}}var lt=class extends X{collider(t){let i=E(t.tile,J),{subdivisionsX:o,subdivisionsZ:n}=$t(t),s=new At(i.x,1,i.y),l=t._builders?.meshBuilder?.heightData??new Float32Array((o+1)*(n+1));return{shape:{type:"heightfield",rows:o,cols:n,heights:l,scale:[s.x,1,s.z]}}}},ct=class extends Y{heightData=new Float32Array;columnsRows=new Map;subdivisionsX=U;subdivisionsZ=U;build(t){let i=E(t.tile,J),{subdivisionsX:o,subdivisionsZ:n}=$t(t);this.subdivisionsX=o,this.subdivisionsZ=n;let s=new At(i.x,1,i.y),l=t.heightScale??1,r=new W(s.x,s.z,o,n),a=new Pe(s.x,s.z,o,n),m=o>0?s.x/o:1,C=n>0?s.z/n:1,M=r.attributes.position.array,x=a.attributes.position.array,O=new Map,w=t.heightMap2D,d=t.heightMap,P=t.randomizeHeight??!1,y=(h,S)=>h<0?0:h>S?S:h;for(let h=0;h<x.length;h+=3){let S=x[h],Z=x[h+1],g=y(Math.round((S+s.x/2)/m),o),v=y(Math.round((s.z/2-Z)/C),n),_=0;if(w){let yt=w[v];yt&&(_=yt[g]??0)}else d&&d.length>0?_=d[g]??0:P&&(_=Math.random()*4);let k=_*l;x[h+2]=k,M[h+1]=k,O.get(v)||O.set(v,new Map),O.get(v).set(g,k)}return this.columnsRows=O,r}postBuild(){let t=[];for(let i=0;i<=this.subdivisionsX;++i)for(let o=0;o<=this.subdivisionsZ;++o){let n=this.columnsRows.get(o);t.push(n?.get(i)??0)}this.heightData=new Float32Array(t)}},ht=class extends D{createEntity(t){return new H(t)}},Ze=Symbol("Plane"),H=class extends c{static type=Ze;constructor(t){super(),this.options=R(Nt,t)}};function Ee(...e){return T({args:e,defaultConfig:Nt,EntityClass:H,BuilderClass:ht,MeshBuilderClass:ct,CollisionBuilderClass:lt,entityType:H.type,cloneFactory:t=>Ee(t??{})})}import{Vector3 as mt}from"three";var Xt={...p,size:new mt(1,1,1),collision:{static:!0}},_e=Symbol("Zone"),pt=class extends c{static type=_e;_enteredZone=new Map;_exitedZone=new Map;_zoneEntities=new Map;constructor(t){super(),this.options=R(Xt,t)}getSelectionBounds(t){let i=ft(this.options.size,new mt(1,1,1)),o=this.getPose()?.position??F(this.options.position,$);return t.setFromCenterAndSize(new mt(o.x,o.y,o.z),i),Pt(t)}handlePostCollision({delta:t}){return this._enteredZone.forEach((i,o)=>{this.exited(t,o)}),this._enteredZone.size>0}handleIntersectionEvent({other:t,delta:i}){this._enteredZone.get(t.uuid)?this.held(i,t):(this.entered(t),this._zoneEntities.set(t.uuid,t))}onEnter(t){return this.options.onEnter=t,this}onHeld(t){return this.options.onHeld=t,this}onExit(t){return this.options.onExit=t,this}entered(t){this._enteredZone.set(t.uuid,1),this.options.onEnter&&this.options.onEnter({self:this,visitor:t,globals:N.globals})}exited(t,i){let o=this._exitedZone.get(i);if(o&&o>1+t){this._exitedZone.delete(i),this._enteredZone.delete(i);let n=this._zoneEntities.get(i);this.options.onExit&&this.options.onExit({self:this,visitor:n,globals:N.globals});return}this._exitedZone.set(i,1+t)}held(t,i){let o=this._enteredZone.get(i.uuid)??0;this._enteredZone.set(i.uuid,o+t),this._exitedZone.set(i.uuid,1),this.options.onHeld&&this.options.onHeld({delta:t,self:this,visitor:i,globals:N.globals,heldTime:o})}};function Re(...e){let t=f(e,Xt),i=new pt(t);return i.add(Mt({size:t.size,static:t.collision?.static??!0,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>Re(o??{}))}import{Color as Yt,Group as De,Sprite as Te,SpriteMaterial as ze,CanvasTexture as Wt,LinearFilter as j,Vector2 as q,ClampToEdgeWrapping as Ut,ShaderMaterial as jt,Mesh as Be,PlaneGeometry as Le,Vector3 as qt}from"three";var I={position:void 0,width:120,height:48,fillColor:"#FFFFFF",strokeColor:null,strokeWidth:0,radius:0,padding:0,stickToViewport:!0,screenPosition:new q(24,24),zDistance:1,anchor:new q(0,0)},ut=class extends D{createEntity(t){return new V(t)}},Ie=Symbol("Rect"),V=class e extends c{static type=Ie;_sprite=null;_mesh=null;_texture=null;_canvas=null;_ctx=null;_cameraRef=null;_lastCanvasW=0;_lastCanvasH=0;constructor(t){super(),this.options=R(I,t),this.options.screenPosition=E(this.options.screenPosition,I.screenPosition),this.options.anchor=E(this.options.anchor,I.anchor),this.group=new De,this.createSprite(),this.prependSetup(this.rectSetup.bind(this)),this.prependUpdate(this.rectUpdate.bind(this))}createSprite(){this._canvas=document.createElement("canvas"),this._ctx=this._canvas.getContext("2d"),this._texture=new Wt(this._canvas),this._texture.minFilter=j,this._texture.magFilter=j;let t=new ze({map:this._texture,transparent:!0,depthTest:!1,depthWrite:!1,alphaTest:.5});this._sprite=new Te(t),this.group?.add(this._sprite),this.redrawRect()}redrawRect(){if(!this._canvas||!this._ctx)return;let t=Math.max(2,Math.floor(this.options.width??120)),i=Math.max(2,Math.floor(this.options.height??48)),o=this.options.padding??0,n=this.options.strokeWidth??0,s=t+o*2+n,l=i+o*2+n,r=Math.max(2,s),a=Math.max(2,l),m=r!==this._lastCanvasW||a!==this._lastCanvasH;this._canvas.width=r,this._canvas.height=a,this._lastCanvasW=r,this._lastCanvasH=a,this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height);let C=Math.max(0,this.options.radius??0),M=Math.floor(o+n/2),x=Math.floor(o+n/2),O=Math.floor(t),w=Math.floor(i);if(this._ctx.beginPath(),C>0?this.roundedRectPath(this._ctx,M,x,O,w,C):this._ctx.rect(M,x,O,w),this.options.fillColor&&(this._ctx.fillStyle=this.toCssColor(this.options.fillColor),this._ctx.fill()),this.options.strokeColor&&n>0&&(this._ctx.lineWidth=n,this._ctx.strokeStyle=this.toCssColor(this.options.strokeColor),this._ctx.stroke()),this._texture){if(m&&(this._texture.dispose(),this._texture=new Wt(this._canvas),this._texture.minFilter=j,this._texture.magFilter=j,this._texture.wrapS=Ut,this._texture.wrapT=Ut,this._sprite&&this._sprite.material instanceof jt)){let d=this._sprite.material;d.uniforms?.tDiffuse&&(d.uniforms.tDiffuse.value=this._texture),d.uniforms?.iResolution&&d.uniforms.iResolution.value.set(this._canvas.width,this._canvas.height,1)}this._texture.image=this._canvas,this._texture.needsUpdate=!0,this._sprite&&this._sprite.material&&(this._sprite.material.map=this._texture,this._sprite.material.needsUpdate=!0)}}getWidth(){return this.options.width??0}getHeight(){return this.options.height??0}roundedRectPath(t,i,o,n,s,l){let r=Math.min(l,Math.floor(Math.min(n,s)/2));t.moveTo(i+r,o),t.lineTo(i+n-r,o),t.quadraticCurveTo(i+n,o,i+n,o+r),t.lineTo(i+n,o+s-r),t.quadraticCurveTo(i+n,o+s,i+n-r,o+s),t.lineTo(i+r,o+s),t.quadraticCurveTo(i,o+s,i,o+s-r),t.lineTo(i,o+r),t.quadraticCurveTo(i,o,i+r,o)}toCssColor(t){return typeof t=="string"?t:`#${(t instanceof Yt?t:new Yt(t)).getHexString()}`}getResolution(){try{let t=this._cameraRef?.renderer?.domElement;if(t)return{width:t.clientWidth||1,height:t.clientHeight||1}}catch{}return{width:this._cameraRef?.screenResolution?.x??1,height:this._cameraRef?.screenResolution?.y??1}}rectSetup(t){if(this._cameraRef=t.camera,this.options.stickToViewport&&this._cameraRef&&this._cameraRef.camera.add(this.group),this.materials?.length&&this._sprite){let i=this.materials[0];i instanceof jt&&(i.transparent=!0,i.depthTest=!1,i.depthWrite=!1,this._texture&&(i.uniforms?.tDiffuse&&(i.uniforms.tDiffuse.value=this._texture),i.uniforms?.iResolution&&this._canvas&&i.uniforms.iResolution.value.set(this._canvas.width,this._canvas.height,1)),this._mesh=new Be(new Le(1,1),i),this.group?.add(this._mesh),this._sprite.visible=!1)}}rectUpdate(t){if(this._sprite){if(this._cameraRef&&this.options.bounds){let i=this.computeScreenBoundsFromOptions(this.options.bounds);if(i){let{x:o,y:n,width:s,height:l}=i,r=Math.max(2,Math.floor(s)),a=Math.max(2,Math.floor(l)),m=r!==(this.options.width??0)||a!==(this.options.height??0);this.options.screenPosition=new q(Math.floor(o),Math.floor(n)),this.options.width=r,this.options.height=a,this.options.anchor=new q(0,0),m&&this.redrawRect()}}this.options.stickToViewport&&this._cameraRef&&this.updateStickyTransform()}}updateStickyTransform(){if(!this._sprite||!this._cameraRef)return;let t=this._cameraRef.camera,{width:i,height:o}=this.getResolution(),n=E(this.options.screenPosition,I.screenPosition),s=n.x,l=n.y,r=Math.max(.001,this.options.zDistance??1),a=1,m=1;if(t.isPerspectiveCamera){let g=t,v=Math.tan(g.fov*Math.PI/180/2)*r;a=v*g.aspect,m=v}else if(t.isOrthographicCamera){let g=t;a=(g.right-g.left)/2,m=(g.top-g.bottom)/2}let C=s/i*2-1,M=1-l/o*2,x=C*a,O=M*m,w=1,d=1;if(this._canvas){let v=m*2/o,_=this._canvas.height;d=Math.max(1e-4,_*v);let k=this._canvas.width/this._canvas.height;w=d*k,this._sprite.scale.set(w,d,1),this._mesh&&this._mesh.scale.set(w,d,1)}let P=E(this.options.anchor,I.anchor),y=Math.min(100,Math.max(0,P.x))/100,h=Math.min(100,Math.max(0,P.y))/100,S=(.5-y)*w,Z=(h-.5)*d;this.group?.position.set(x+S,O+Z,-r)}worldToScreen(t){if(!this._cameraRef)return{x:0,y:0};let i=this._cameraRef.camera,{width:o,height:n}=this.getResolution(),s=t.clone().project(i),l=(s.x+1)/2*o,r=(1-s.y)/2*n;return{x:l,y:r}}computeScreenBoundsFromOptions(t){if(!this._cameraRef)return null;if(t.screen)return{...t.screen};if(t.world){let{left:i,right:o,top:n,bottom:s,z:l=0}=t.world,r=this.worldToScreen(new qt(i,n,l)),a=this.worldToScreen(new qt(o,s,l)),m=Math.min(r.x,a.x),C=Math.min(r.y,a.y),M=Math.abs(a.x-r.x),x=Math.abs(a.y-r.y);return{x:m,y:C,width:M,height:x}}return null}updateRect(t){this.options={...this.options,...t},this.redrawRect(),this.options.stickToViewport&&this._cameraRef&&this.updateStickyTransform()}buildInfo(){return{...new u(this).buildDebugInfo(),type:String(e.type),width:this.options.width??0,height:this.options.height??0,sticky:this.options.stickToViewport}}};function ke(...e){return T({args:e,defaultConfig:{...I},EntityClass:V,BuilderClass:ut,entityType:V.type,cloneFactory:t=>ke(t??{})})}import{AmbientLight as Fe,DirectionalLight as Ge,Group as He,HemisphereLight as Ve,Object3D as Ae,PointLight as Ne,SpotLight as $e}from"three";var Xe=Symbol("Light"),Ye={x:0,y:0,z:0},A=16777215,We={mapSize:2048,near:.1,far:500,bias:0,radius:1,left:-100,right:100,top:100,bottom:-100},Ue={mapSize:1024,near:.1,far:500,bias:0,radius:1},dt=class extends c{static type=Xe;light=null;lightTarget=null;constructor(t){super(),this.options={...t}}create(){super.create();let t=new He,{light:i,target:o}=je(this.options);return t.add(i),o&&t.add(o),this.group=t,this.light=i,this.lightTarget=o,this}_cleanup(t){this.light?.shadow?.map?.dispose?.(),this.light=null,this.lightTarget=null,super._cleanup(t)}};function je(e){switch(e.type){case"ambient":return{light:qe(e),target:null};case"hemisphere":return{light:Je(e),target:null};case"directional":return Ke(e);case"point":return{light:Qe(e),target:null};case"spot":return ti(e)}}function qe(e){let t=new Fe(e.color??A,e.intensity??1);return e.name&&(t.name=e.name),t}function Je(e){let t=e.skyColor??e.color??A,i=e.groundColor??0,o=new Ve(t,i,e.intensity??1);return e.name&&(o.name=e.name),o}function Ke(e){let t=new Ge(e.color??A,e.intensity??1);e.name&&(t.name=e.name),ei(t,e.castShadow??!1,e.shadow);let i=Jt(e.position,e.target);return i&&(t.target=i),{light:t,target:i}}function Qe(e){let t=new Ne(e.color??A,e.intensity??1,e.distance,e.decay);return e.name&&(t.name=e.name),Kt(t,e.castShadow??!1,e.shadow),t}function ti(e){let t=new $e(e.color??A,e.intensity??1,e.distance,e.angle,e.penumbra,e.decay);e.name&&(t.name=e.name),Kt(t,e.castShadow??!1,e.shadow);let i=Jt(e.position,e.target);return i&&(t.target=i),{light:t,target:i}}function Jt(e,t){if(!t)return null;let i=e??Ye,o=new Ae;return o.position.set(t.x-i.x,t.y-i.y,t.z-i.z),o}function ei(e,t,i){if(!t){e.castShadow=!1;return}e.castShadow=!0;let o={...We,...i??{}};e.shadow.mapSize.set(o.mapSize,o.mapSize),e.shadow.camera.near=o.near,e.shadow.camera.far=o.far,e.shadow.camera.left=o.left,e.shadow.camera.right=o.right,e.shadow.camera.top=o.top,e.shadow.camera.bottom=o.bottom,e.shadow.bias=o.bias,e.shadow.radius=o.radius,e.shadow.camera.updateProjectionMatrix()}function Kt(e,t,i){if(!t){e.castShadow=!1;return}e.castShadow=!0;let o={...Ue,...i??{}};e.shadow.mapSize.set(o.mapSize,o.mapSize),e.shadow.camera.near=o.near,e.shadow.camera.far=o.far,e.shadow.bias=o.bias,e.shadow.radius=o.radius,e.shadow.camera.updateProjectionMatrix()}function jo(e){return new dt(e)}export{u as a,Et as b,_t as c,Rt as d,Dt as e,Tt as f,zt as g,ce as h,K as i,he as j,me as k,Q as l,pe as m,ue as n,tt as o,de as p,ye as q,et as r,ge as s,fe as t,it as u,be as v,xe as w,ot as x,Oe as y,ve as z,G as A,Ce as B,Ze as C,H as D,Ee as E,_e as F,pt as G,Re as H,Ie as I,V as J,ke as K,Xe as L,dt as M,jo as N};
@@ -0,0 +1 @@
1
+ import{b as Ht,c as mi,f as gi}from"./chunk-BCFFS3FP.js";import{c as de,j as pe}from"./chunk-2HSR5XDQ.js";import{a as qt,b as lt,g as $t,i as U}from"./chunk-7CBJKE42.js";import{a as Kt,c as ot,d as at,e as Qt,f as ce,g as Yt}from"./chunk-BQRMYLYD.js";import{A as le,b as rt,d as u,e as Ft,i as oe,k as ae,o as nt,q as Gt,s as Zt,t as Nt,u as B,y as Ut,z as st}from"./chunk-GPCSX3M6.js";import{a as me,b as ai}from"./chunk-WBQ5TNRZ.js";import{b as he,d as li}from"./chunk-YQS7CGXE.js";import{a as H,k as ti,l as ii,m as ri,n as ni,o as V,p as si,q as j,t as oi,u as dt}from"./chunk-KP6DLLJO.js";import{a as ct,b as Jt,g as z,h as ue,i as ei}from"./chunk-6FGXC4T6.js";import{a as Wt,b as M}from"./chunk-AIQ6IVT5.js";import{g as W}from"./chunk-UUOPT2N4.js";import{a as ge,b as ci,c as fe,d as di,e as ui,f as pi,g as hi,m as I}from"./chunk-D2PATZCC.js";import{c as se,d as it,j as v}from"./chunk-4QLJUQSJ.js";import{c as P,i as Xt,j as h}from"./chunk-7WRQ2UAN.js";import{a as fi}from"./chunk-BH53MBAZ.js";import{l as jt}from"./chunk-UG22Z42P.js";import{Vector2 as Si,RenderTarget as Rr,HalfFloatType as _r}from"three";import{WebGPURenderer as kr,RenderPipeline as Lr}from"three/webgpu";import{pass as Ar,renderOutput as Pi,screenCoordinate as Or,vec2 as ut,vec4 as Mi,fract as wi,sin as Ei,dot as xi,texture as Br,uniform as zr}from"three/tsl";import{setConsoleFunction as Tr,getConsoleFunction as Dr}from"three";var yi="THREE.Abstract function.",vi=!1,bi=!1;function Ci(){if(vi)return;vi=!0;let s=Dr();Tr((e,t,...i)=>{if(e==="warn"&&t===yi){bi||(bi=!0,console.warn(`${yi} (suppressing further per-frame repeats; a WebGPU node is scheduled for updates without an update() implementation)`));return}if(s){s(e,t,...i);return}let r=i[0],n=e==="log"?console.log:e==="error"?console.error:console.warn;r&&r.isStackTrace&&typeof r.getError=="function"?n(r.getError(t)):n(t,...i)})}var Ti={x:0,y:0,width:1,height:1},Vr=1/20;async function Is(){if(!("gpu"in navigator))return!1;try{return await navigator.gpu.requestAdapter()!==null}catch{return!1}}var ye=class{renderer;postProcessing=null;renderScale=1;screenResolution;_initialized=!1;_sceneRef=null;_lastAnimationTimestamp=null;_postEffects=[];_postSceneRef=null;_postCameraRef=null;_transition=null;constructor(e){this.screenResolution=e||new Si(window.innerWidth,window.innerHeight)}get initialized(){return this._initialized}get isWebGPU(){return!0}async initRenderer(){this._initialized||(Ci(),this.renderer=new kr({antialias:!0,alpha:!0}),await this.renderer.init(),this.renderer.setSize(this.screenResolution.x,this.screenResolution.y),this.renderer.shadowMap.enabled=!0,this._initialized=!0)}setScene(e){this._sceneRef=e}setupPostProcessing(e,t){this.disposePostProcessing(),this._postSceneRef=e,this._postCameraRef=t;let i=new Lr(this.renderer),r=Ar(e,t);this.renderScale!==1&&r.setResolutionScale(this.renderScale);let n=r;for(let l of this._postEffects)try{n=l(n,{scenePass:r,scene:e,camera:t})}catch(c){console.error("RendererManager: post-processing effect failed, skipping.",c)}i.outputColorTransform=!1;let o=Pi(n),a=this._transition;if(a)try{o=Mi(a.resolved.shader({fromNode:a.fromNode,toNode:o,progress:a.progressUniform})),a.composed=!0}catch(l){console.error("RendererManager: stage transition shader failed, skipping.",l)}i.outputNode=o.add(Fr()),this.postProcessing=i}rebindPostProcessingCamera(e){!this.postProcessing||!this._postSceneRef||this.setupPostProcessing(this._postSceneRef,e)}get transitionActive(){return this._transition!==null}beginSnapshotTransition(e,t,i){this.finishTransition();let r=new Si;this.renderer.getDrawingBufferSize(r);let n=new Rr(Math.max(1,r.x),Math.max(1,r.y),{type:_r}),o=this.renderer.getRenderTarget();try{this.renderer.setScissorTest(!1),this.renderer.setRenderTarget(n),this.renderer.render(t,i)}catch(a){console.error("RendererManager: failed to capture transition snapshot.",a)}finally{this.renderer.setRenderTarget(o)}this._transition={resolved:e,progressUniform:zr(0),fromNode:Pi(Br(n.texture)),elapsed:0,snapshotTarget:n,composed:!1}}beginInStageTransition(e,t,i){this._initialized&&(this.beginSnapshotTransition(e,t,i),this.setupPostProcessing(t,i))}finishTransition(){let e=this._transition;if(e){this._transition=null,e.progressUniform.value=1,this._postSceneRef&&this._postCameraRef&&this.setupPostProcessing(this._postSceneRef,this._postCameraRef);try{e.resolved.onComplete?.()}catch(t){console.error("RendererManager: transition onComplete failed.",t)}this.releaseTransitionResources(e)}}cancelTransition(){let e=this._transition;if(e){this._transition=null;try{e.resolved.onComplete?.()}catch{}this.releaseTransitionResources(e)}}releaseTransitionResources(e){try{e.snapshotTarget?.dispose()}catch{}}advanceTransition(e){let t=this._transition;if(!t||!t.composed)return;t.elapsed+=Math.min(e,Vr);let i=Math.min(t.elapsed/t.resolved.duration,1);t.progressUniform.value=t.resolved.easing(i),i>=1&&this.finishTransition()}setPostProcessingEffects(e){this._postEffects=[...e],this.postProcessing&&this._postSceneRef&&this._postCameraRef&&this.setupPostProcessing(this._postSceneRef,this._postCameraRef)}setRenderScale(e){this.renderScale=Math.max(1,Number.isFinite(e)?e:1)}disposePostProcessing(){try{this.postProcessing?.dispose?.()}catch{}this.postProcessing=null}startRenderLoop(e){this._lastAnimationTimestamp=null,this.renderer.setAnimationLoop(t=>{let i=this._lastAnimationTimestamp===null?0:Math.max(0,(t-this._lastAnimationTimestamp)/1e3);this._lastAnimationTimestamp=t,this.advanceTransition(i),e(i)})}stopRenderLoop(){this._lastAnimationTimestamp=null;try{this.renderer.setAnimationLoop(null)}catch{}}renderCamera(e,t,i=!1){let r=t.viewport,n=this.screenResolution.x,o=this.screenResolution.y,a=Math.floor(r.x*n),l=Math.floor(r.y*o),c=Math.floor(r.width*n),d=Math.floor(r.height*o);this.renderer.setViewport(a,l,c,d),this.renderer.setScissor(a,l,c,d),this.renderer.setScissorTest(!0),i&&this.postProcessing?this.postProcessing.render():this.renderer.render(e,t.camera)}renderCameraToTarget(e,t){if(!t.renderTarget)return;let i=this.renderer.getRenderTarget();this.renderer.setScissorTest(!1),this.renderer.setRenderTarget(t.renderTarget),this.renderer.clear(),this.renderer.render(e,t.camera),this.renderer.setRenderTarget(i)}renderCameras(e,t){if(!e||t.length===0)return;this.renderer.setScissorTest(!1),this.renderer.clear();let i=t.length===1&&Ir(t[0].viewport);for(let r of t)this.renderCamera(e,r,i);this.renderer.setScissorTest(!1)}render(e,t){this.postProcessing?this.postProcessing.render():this.renderer.render(e,t)}resize(e,t){this.screenResolution.set(e,t),this.renderer.setSize(e,t,!1)}setPixelRatio(e){let t=Math.max(1,Number.isFinite(e)?e:1);this.renderer.setPixelRatio(t)}getDomElement(){return this.renderer.domElement}dispose(){this.stopRenderLoop(),this.cancelTransition(),this.disposePostProcessing();try{this.renderer.dispose()}catch{}this._sceneRef=null,this._postSceneRef=null,this._postCameraRef=null,this._postEffects=[],this._initialized=!1}};function Ir(s){return s.x===0&&s.y===0&&s.width===1&&s.height===1}function Fr(){let s=Or.xy,e=wi(Ei(xi(s,ut(12.9898,78.233))).mul(43758.5453)),t=wi(Ei(xi(s.add(ut(13,7)),ut(12.9898,78.233))).mul(43758.5453)),i=e.sub(t).mul(1/255);return Mi(i,i,i,0)}function q(s){return s?.category??"none"}function K(s){let e=q(s);return e==="environment"||e==="pack"}function _(s){return s.isInstanced===!0||s.isBundled===!0}import{BundleGroup as Gr}from"three/webgpu";var ve=class{bundles=new Map;entityToBundle=new Map;scene=null;setScene(e){this.scene=e}register(e,t,i,r){if(e.isBundled)return!0;let n=e.mesh??e.group;if(!n)return!1;let o=this.getOrCreateBundle(r);return n.matrixAutoUpdate=!0,n.userData.zylemEntityUuid=e.uuid,n.parent&&n.parent.remove(n),o.add(n),o.needsUpdate=!0,e.isBundled=!0,e.bundleKey=r,this.entityToBundle.set(e.uuid,r),!0}unregister(e){let t=this.entityToBundle.get(e.uuid);if(!t)return;let i=this.bundles.get(t),r=e.mesh??e.group;i&&r&&(i.remove(r),i.needsUpdate=!0),e.isBundled=!1,e.bundleKey=null,this.entityToBundle.delete(e.uuid)}getStats(){return{bundleCount:this.bundles.size,entityCount:this.entityToBundle.size}}dispose(){for(let e of this.bundles.values())this.scene&&this.scene.remove(e);this.bundles.clear(),this.entityToBundle.clear()}getOrCreateBundle(e){let t=this.bundles.get(e);return t||(t=new Gr,t.name=`bundle:${e}`,t.static=!0,this.bundles.set(e,t),this.scene&&this.scene.add(t),t)}};import{InstancedMesh as Di,Matrix4 as Q,Vector3 as Ri,Quaternion as Zr}from"three";var Y=class s{packs=new Map;entityToPack=new Map;scene=null;static DEFAULT_CAPACITY=128;static GROWTH_FACTOR=2;setScene(e){this.scene=e}static generatePackKey(e){let t={geo:`${e.geometryType}:${ct(e.dimensions)}`,mat:e.materialPath||"none",shader:e.shaderType||"standard",color:e.colorHex??16777215};return Jt(ct(t))}static generateEntityPackKey(e){let t=e.options;if(t.runtime?.packKeyOverride)return t.runtime.packKeyOverride;let i=e.constructor?.type?.description||"unknown",r=t.size||{x:1,y:1,z:1},n=t.material||{};return s.generatePackKey({geometryType:i,dimensions:{x:r.x,y:r.y,z:r.z},materialPath:n.path||null,shaderType:n.shader?"custom":"standard",colorHex:n.color?.getHex?.()||t.color?.getHex?.()||16777215})}register(e,t,i,r){let n=this.packs.get(r);n||(n=this.createPack(r,t,i));let o;return n.freeIndices.length>0?o=n.freeIndices.pop():(o=n.entities.length,o>=n.capacity&&this.growPack(n),n.entities.push(null)),n.entities[o]=e,n.entityMap.set(e.uuid,o),this.entityToPack.set(e.uuid,r),n.instancedMesh.count=Math.max(n.instancedMesh.count,o+1),n.activeIndices.push(o),n.dirtyIndices.add(o),o}unregister(e){let t=this.entityToPack.get(e.uuid);if(!t)return;let i=this.packs.get(t);if(!i)return;let r=i.entityMap.get(e.uuid);if(r===void 0)return;i.entities[r]=null,i.entityMap.delete(e.uuid),this.entityToPack.delete(e.uuid),i.freeIndices.push(r);let n=i.activeIndices.indexOf(r);if(n!==-1){let a=i.activeIndices.pop();n<i.activeIndices.length&&(i.activeIndices[n]=a)}i.dirtyIndices.delete(r);let o=new Q;o.makeScale(0,0,0),i.instancedMesh.setMatrixAt(r,o),i.instancedMesh.instanceMatrix.needsUpdate=!0}markDirty(e){let t=this.entityToPack.get(e.uuid);if(!t)return;let i=this.packs.get(t);if(!i)return;let r=i.entityMap.get(e.uuid);r!==void 0&&i.dirtyIndices.add(r)}update(e=0){let t=new Q,i=new Ri,r=new Zr,n=new Ri(1,1,1);for(let o of this.packs.values()){if(o.activeIndices.length===0)continue;let a=!1;for(let l of o.activeIndices){let c=o.entities[l];if(!c)continue;if(ti(c)){t.makeScale(0,0,0),o.instancedMesh.setMatrixAt(l,t),a=!0;continue}let d=o.dirtyIndices.has(l),p=!!c.body;if(!(!d&&!p)){if(!d&&p){let m=c.body;if(typeof m.isRenderSleeping=="function"&&m.isRenderSleeping())continue}this.updateInstanceMatrix(o,l,t,i,r,n,e),a=!0}}o.dirtyIndices.clear(),a&&(o.instancedMesh.instanceMatrix.needsUpdate=!0)}}updateInstanceMatrix(e,t,i,r,n,o,a){let l=e.entities[t];if(l){if(l.body){let c=l.body;if(typeof c.writeRenderPose=="function")c.writeRenderPose(a,r,n);else{let d=me(l.body,a);r.set(d.position.x,d.position.y,d.position.z),n.set(d.rotation.x,d.rotation.y,d.rotation.z,d.rotation.w)}i.compose(r,n,o)}else l.mesh?(l.mesh.updateMatrix(),i.copy(l.mesh.matrix)):l.group&&(l.group.updateMatrix(),i.copy(l.group.matrix));e.instancedMesh.setMatrixAt(t,i)}}getPackInfo(e){let t=this.entityToPack.get(e.uuid);if(!t)return null;let i=this.packs.get(t);if(!i)return null;let r=i.entityMap.get(e.uuid);return r===void 0?null:{packKey:t,instanceId:r}}getStats(){let e=0,t=[];for(let[i,r]of this.packs){let n=r.entityMap.size;e+=n,t.push({key:i,count:n,capacity:r.capacity})}return{packCount:this.packs.size,totalInstances:e,packs:t}}dispose(){for(let e of this.packs.values())this.scene&&this.scene.remove(e.instancedMesh),e.instancedMesh.dispose(),e.geometry.dispose();this.packs.clear(),this.entityToPack.clear()}createPack(e,t,i){let r=s.DEFAULT_CAPACITY,n=new Di(t,i,r);n.count=0,n.frustumCulled=!1;let o=new Q().makeScale(0,0,0);for(let l=0;l<r;l++)n.setMatrixAt(l,o);n.instanceMatrix.needsUpdate=!0;let a={key:e,instancedMesh:n,geometry:t,material:i,entityMap:new Map,entities:[],freeIndices:[],activeIndices:[],dirtyIndices:new Set,capacity:r};return this.packs.set(e,a),this.scene&&this.scene.add(n),a}growPack(e){let t=e.capacity*s.GROWTH_FACTOR,i=new Di(e.geometry,e.material,t);i.count=e.instancedMesh.count,i.frustumCulled=!1;let r=new Q;for(let o=0;o<e.capacity;o++)e.instancedMesh.getMatrixAt(o,r),i.setMatrixAt(o,r);let n=new Q().makeScale(0,0,0);for(let o=e.capacity;o<t;o++)i.setMatrixAt(o,n);i.instanceMatrix.needsUpdate=!0,this.scene&&(this.scene.remove(e.instancedMesh),this.scene.add(i)),e.instancedMesh.dispose(),e.instancedMesh=i,e.capacity=t}};var be=class{bundles=new ve;instances=new Y;setScene(e){this.bundles.setScene(e),this.instances.setScene(e)}register(e){let t=q(e.options);if(t==="none")return!1;if(e.isInstanced||e.isBundled)return!0;if(!e.mesh?.geometry||!e.materials?.length)return!1;let i=e.mesh.geometry,r=e.materials[0],n=Y.generateEntityPackKey(e);if(t==="pack"){let o=this.instances.register(e,i,r,n);return o<0?!1:(e.packKey=n,e.instanceId=o,e.isInstanced=!0,e.mesh&&(e.mesh.visible=!1),!0)}return t==="environment"&&this.bundles.register(e,i,r,n)?(e.mesh&&(e.mesh.visible=!0),!0):!1}unregister(e){e.isInstanced&&(this.instances.unregister(e),e.isInstanced=!1,e.instanceId=-1,e.packKey=null),e.isBundled&&this.bundles.unregister(e)}update(e=0){this.instances.update(e)}dispose(){this.bundles.dispose(),this.instances.dispose()}};var Ce=!1,w={},_i=0,ki=0,$=null;function Li(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function pt(){return Ce?!0:(typeof globalThis<"u"&&globalThis.__ZYLEM_PROFILE_STAGE__===!0&&(Ce=!0),Ce)}function to(s){Ce=s,typeof globalThis<"u"&&(globalThis.__ZYLEM_PROFILE_STAGE__=s)}function ht(s){pt()&&($=s,ki=Li())}function mt(){if(!pt()||$===null)return;let s=Li()-ki;w[$]=(w[$]??0)+s,$=null}function Ai(){if(!pt()||(_i++,_i%60!==0))return;let s=Object.values(w).reduce((t,i)=>t+(i??0),0),e=Object.keys(w).sort((t,i)=>(w[i]??0)-(w[t]??0)).map(t=>{let i=w[t]??0,r=s>0?(i/s*100).toFixed(1):"0.0";return`${t}=${i.toFixed(2)}ms (${r}%)`});console.info(`[ZylemStage profile] avg over 60 frames (${s.toFixed(2)}ms/frame): ${e.join(", ")}`);for(let t of Object.keys(w))w[t]=0}function E(s,e){ht(s);try{return e()}finally{mt()}}var y={FirstPerson:"first-person",ThirdPerson:"third-person",SecondPerson:"second-person",Isometric:"isometric",Flat2D:"flat-2d",Fixed2D:"fixed-2d",TopDown:"top-down"};function gt(s){switch(s){case y.Isometric:case y.TopDown:case y.Flat2D:case y.Fixed2D:return"orthographic";default:return"perspective"}}import{Vector3 as Nr,Quaternion as Ur,MathUtils as ft}from"three";function Se(){return{position:new Nr(0,0,10),rotation:new Ur,fov:75,zoom:1,near:.1,far:1e3}}function k(s){return{position:s.position.clone(),rotation:s.rotation.clone(),fov:s.fov,zoom:s.zoom,near:s.near,far:s.far,lookAt:s.lookAt?.clone()}}function Oi(s,e){let t=k(s);return e.position&&t.position.add(e.position),e.rotation&&t.rotation.multiply(e.rotation),e.fov!=null&&t.fov!=null&&(t.fov+=e.fov),e.zoom!=null&&t.zoom!=null&&(t.zoom+=e.zoom),t}function Bi(s,e,t,i){let r=1-Math.pow(1-ft.clamp(t,0,1),i*60),n=k(s);return n.position.lerp(e.position,r),n.rotation.slerp(e.rotation,r),e.fov!=null&&n.fov!=null&&(n.fov=ft.lerp(n.fov,e.fov,r)),e.zoom!=null&&n.zoom!=null&&(n.zoom=ft.lerp(n.zoom,e.zoom,r)),e.near!=null&&(n.near=e.near),e.far!=null&&(n.far=e.far),e.lookAt?n.lookAt?n.lookAt.lerp(e.lookAt,r):n.lookAt=e.lookAt.clone():n.lookAt=void 0,n}var Pe=class{perspective=null;behaviors=new Map;actions=[];_desiredPose=Se();_finalPose=Se();_initialized=!1;damping=.15;constructor(e){e&&(this.perspective=e,e.defaults?.damping!=null&&(this.damping=e.defaults.damping))}run(e){let t=this.perspective?this.perspective.getBasePose(e):Se(),i=this.getSortedBehaviors();for(let r of i)r.enabled!==!1&&(t=r.update(e,t));this._desiredPose=k(t);for(let r=this.actions.length-1;r>=0;r--){let n=this.actions[r],o=n.update(e);t=Oi(t,o),n.isDone(e)&&this.actions.splice(r,1)}return this._initialized?this._finalPose=Bi(this._finalPose,t,this.damping,e.dt):(this._finalPose=k(t),this._initialized=!0),this._finalPose}addBehavior(e,t,i){let r=this.behaviors.get(e);r?.onDetach&&i&&r.onDetach(i),this.behaviors.set(e,t),t.onAttach&&i&&t.onAttach(i)}removeBehavior(e,t){let i=this.behaviors.get(e);return i?(i.onDetach&&t&&i.onDetach(t),this.behaviors.delete(e)):!1}hasBehavior(e){return this.behaviors.has(e)}addAction(e){this.actions.push(e)}getState(){return{perspectiveId:this.perspective?.id??null,desiredPose:this._desiredPose?k(this._desiredPose):null,finalPose:this._finalPose?k(this._finalPose):null,activeBehaviors:Array.from(this.behaviors.keys()),activeActionCount:this.actions.length}}setPerspective(e){this.perspective=e,this._initialized=!1,e.defaults?.damping!=null&&(this.damping=e.defaults.damping)}getSortedBehaviors(){return Array.from(this.behaviors.values()).sort((e,t)=>(e.priority??0)-(t.priority??0))}};import{Vector3 as T,Quaternion as we}from"three";var Hr={distance:8,height:5,shoulderOffset:0,targetKey:"primary",fov:75,paddingFactor:1.5,minDistance:5,trailDelay:.1,trailBufferSize:120},F=class{id="third-person";projection="perspective";defaults={damping:.12};opts;initialPosition;initialLookAt;_trailBuffers=new Map;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...Hr,...r},this.initialPosition=t?h(t,P):void 0,this.initialLookAt=i?h(i,P):void 0}getBasePose(e){let t=Object.keys(e.targets),i=e.targets[this.opts.targetKey];return t.length===0||!i?this.staticPose():t.length===1?this.singleTargetPose(i.position,e,this.opts.targetKey):this.multiTargetPose(e)}staticPose(){return this.initialPosition?{position:this.initialPosition.clone(),rotation:new we,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:this.initialLookAt?.clone()??new T(0,0,0)}:{position:new T(this.opts.shoulderOffset,this.opts.height,this.opts.distance),rotation:new we,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:new T(0,0,0)}}singleTargetPose(e,t,i){let r=this.getTrailedPosition(i,e,t.time);return{position:new T(r.x+this.opts.shoulderOffset,r.y+this.opts.height,r.z+this.opts.distance),rotation:new we,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:r.clone()}}multiTargetPose(e){let i=Object.entries(e.targets).map(([p,m])=>this.getTrailedPosition(p,m.position,e.time)),r=new T;for(let p of i)r.add(p);r.divideScalar(i.length);let n=0;for(let p of i){let m=r.distanceTo(p);m>n&&(n=m)}let o=Math.max(n*this.opts.paddingFactor,this.opts.minDistance),a=new T(this.opts.shoulderOffset,this.opts.height,this.opts.distance),l=a.length(),c=l>0?a.clone().normalize():new T(0,.5,1).normalize(),d=r.clone().add(c.multiplyScalar(o));if(l>0){let p=this.opts.height/l;d.y=r.y+o*p}return{position:d,rotation:new we,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:r.clone()}}getTrailedPosition(e,t,i){let r=this.opts.trailDelay;if(r<=0)return t;let n=this._trailBuffers.get(e);n||(n=[],this._trailBuffers.set(e,n)),n.push({time:i,pos:t.clone()});let o=i-r-.05;for(;n.length>1&&n[0].time<o;)n.shift();n.length>this.opts.trailBufferSize&&n.splice(0,n.length-this.opts.trailBufferSize);let a=i-r;if(n[0].time>=a)return n[0].pos.clone();for(let l=1;l<n.length;l++){let c=n[l-1],d=n[l];if(c.time<=a&&a<=d.time){let p=d.time-c.time,m=p>1e-6?(a-c.time)/p:0;return new T().lerpVectors(c.pos,d.pos,m)}}return n[n.length-1].pos.clone()}};import{Vector3 as zi,Quaternion as jr}from"three";var Vi={position:{x:0,y:0,z:10},zoom:10},G=class{id="fixed-2d";projection="orthographic";defaults={damping:1};opts;constructor(e){this.opts={...Vi,...e,position:h(e?.position,Vi.position)}}getBasePose(e){return{position:new zi(this.opts.position.x,this.opts.position.y,this.opts.position.z),rotation:new jr,zoom:this.opts.zoom,near:1,far:1e3,lookAt:new zi(this.opts.position.x,this.opts.position.y,0)}}};import{Vector3 as yt,Quaternion as vt,Euler as Gi,MathUtils as b}from"three";var Wr={eyeHeight:1.7,defaultFov:75,pitchLimit:Math.PI/2-.01,lookAtLerpSpeed:5,fovLerpSpeed:8,targetKey:"primary",verticalSmoothing:1},X=class{id="first-person";projection="perspective";defaults={damping:1};opts;initialPosition;initialLookAt;_yaw=0;_pitch=0;_currentFov;_targetFov;_lookAtTarget=null;_lookAtLerpSpeed;_currentRotation=new vt;_rotationInitialized=!1;_smoothedY=null;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...Wr,...r},this.initialPosition=t?h(t,P):void 0,this.initialLookAt=i?h(i,P):void 0,this._currentFov=this.opts.defaultFov,this._targetFov=this.opts.defaultFov,this._lookAtLerpSpeed=this.opts.lookAtLerpSpeed,this.initialPosition&&this.initialLookAt&&this.deriveYawPitchFromLookAt(this.initialPosition,this.initialLookAt)}look(e,t){this._yaw+=e,this._pitch=b.clamp(this._pitch+t,-this.opts.pitchLimit,this.opts.pitchLimit)}setLook(e,t){this._yaw=e,this._pitch=b.clamp(t,-this.opts.pitchLimit,this.opts.pitchLimit)}setEyeHeight(e){this.opts.eyeHeight=e}get yaw(){return this._yaw}get pitch(){return this._pitch}zoom(e){this._targetFov=e}resetZoom(){this._targetFov=this.opts.defaultFov}get currentFov(){return this._currentFov}lookAt(e,t){this._lookAtTarget=e,t!=null&&(this._lookAtLerpSpeed=t)}clearLookAt(){this._lookAtTarget&&this.deriveYawPitchFromQuaternion(this._currentRotation),this._lookAtTarget=null}getBasePose(e){let t=this.computePosition(e),i=this.computeRotation(t,e.dt);return this._currentFov=this.lerpFov(e.dt),{position:t,rotation:i,fov:this._currentFov,near:.1,far:1e3}}computePosition(e){let t=e.targets[this.opts.targetKey];if(t){let i=t.position.y+this.opts.eyeHeight,r=this.smoothVertical(i,e.dt);return new yt(t.position.x,r,t.position.z)}return this.initialPosition?this.initialPosition.clone():new yt(0,this.opts.eyeHeight,0)}smoothVertical(e,t){if(this.opts.verticalSmoothing>=1)return this._smoothedY=e,e;if(this._smoothedY==null)return this._smoothedY=e,e;let i=b.clamp(this.opts.verticalSmoothing,0,1),r=1-Math.pow(1-i,t*60);return this._smoothedY=b.lerp(this._smoothedY,e,r),this._smoothedY}computeRotation(e,t){let i=new vt().setFromEuler(new Gi(this._pitch,this._yaw,0,"YXZ"));if(this._rotationInitialized||(this._currentRotation.copy(i),this._rotationInitialized=!0),this._lookAtTarget){let r=Ii.copy(this._lookAtTarget).sub(e);if(r.lengthSq()>1e-4){r.normalize();let n=Math.atan2(-r.x,-r.z),o=Math.asin(b.clamp(r.y,-1,1)),a=qr.setFromEuler(Fi.set(o,n,0,"YXZ")),l=1-Math.pow(1-Math.min(this._lookAtLerpSpeed*t,1),1);return this._currentRotation.slerp(a,b.clamp(l,0,1)),this._currentRotation.clone()}}return this._currentRotation.copy(i),i}lerpFov(e){if(Math.abs(this._currentFov-this._targetFov)<.01)return this._targetFov;let t=1-Math.pow(1-Math.min(this.opts.fovLerpSpeed*e,1),1);return b.lerp(this._currentFov,this._targetFov,b.clamp(t,0,1))}deriveYawPitchFromLookAt(e,t){let i=Ii.copy(t).sub(e).normalize();this._yaw=Math.atan2(-i.x,-i.z),this._pitch=Math.asin(b.clamp(i.y,-1,1))}deriveYawPitchFromQuaternion(e){let t=Fi.setFromQuaternion(e,"YXZ");this._yaw=t.y,this._pitch=b.clamp(t.x,-this.opts.pitchLimit,this.opts.pitchLimit)}},Ii=new yt,qr=new vt,Fi=new Gi;import{Quaternion as Kr,Vector3 as bt}from"three";var Qr={distance:10,zoom:10,targetKey:"primary"},Zi=new bt(1,1,1).normalize(),J=class{id="isometric";projection="orthographic";defaults={damping:1};opts;initialPosition;initialLookAt;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...Qr,...r},this.initialPosition=t?h(t):void 0,this.initialLookAt=i?h(i):void 0}getBasePose(e){let t=e.targets[this.opts.targetKey];if(!t)return this.staticPose();let i=t.position.clone(),r=i.clone().addScaledVector(Zi,this.opts.distance);return this.pose(r,i)}staticPose(){return this.initialPosition?this.pose(this.initialPosition.clone(),this.initialLookAt?.clone()??new bt(0,0,0)):this.pose(Zi.clone().multiplyScalar(this.opts.distance),new bt(0,0,0))}pose(e,t){return{position:e,rotation:new Kr,zoom:this.opts.zoom,near:1,far:1e3,lookAt:t}}};import{Quaternion as Yr,Vector3 as Ee}from"three";var $r={height:10,zoom:10,targetKey:"primary"},ee=class{id="top-down";projection="orthographic";defaults={damping:1};opts;initialPosition;initialLookAt;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...$r,...r},this.initialPosition=t?h(t):void 0,this.initialLookAt=i?h(i):void 0}getBasePose(e){let t=e.targets[this.opts.targetKey];if(!t)return this.staticPose();let i=t.position.clone();return this.pose(new Ee(i.x,i.y+this.opts.height,i.z),i)}staticPose(){if(this.initialPosition){let e=this.initialLookAt?.clone()??new Ee(this.initialPosition.x,this.initialPosition.y-this.opts.height,this.initialPosition.z);return this.pose(this.initialPosition.clone(),e)}return this.pose(new Ee(0,this.opts.height,0),new Ee(0,0,0))}pose(e,t){return{position:e,rotation:new Yr,zoom:this.opts.zoom,near:1,far:1e3,lookAt:t}}};import{Quaternion as Ni,Vector3 as xe}from"three";var Xr={anchorKey:"anchor",subjectKey:"primary",eyeHeight:1.7,fov:75},Ct=new xe,te=class{id="second-person";projection="perspective";defaults={damping:1};opts;initialPosition;initialLookAt;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...Xr,...r},this.initialPosition=t?h(t):void 0,this.initialLookAt=i?h(i):void 0}getBasePose(e){let t=e.targets[this.opts.anchorKey];if(!t)return this.staticPose();let i=new xe(t.position.x,t.position.y+this.opts.eyeHeight,t.position.z),r=e.targets[this.opts.subjectKey],n=r?r.position.clone():i.clone().add(this.anchorForward(t.rotation));return{position:i,rotation:new Ni,fov:this.opts.fov,near:.1,far:1e3,lookAt:n}}staticPose(){let e=this.initialPosition?.clone()??new xe(0,this.opts.eyeHeight,0),t=this.initialLookAt?.clone()??e.clone().add(new xe(0,0,-1));return{position:e,rotation:new Ni,fov:this.opts.fov,near:.1,far:1e3,lookAt:t}}anchorForward(e){return Ct.set(0,0,-1),e&&Ct.applyQuaternion(e),Ct.clone()}};function L(s,e){switch(s){case"third-person":return new F(e);case"first-person":return new X(e);case"second-person":return new te(e);case"isometric":return new J(e);case"top-down":return new ee(e);case"flat-2d":return new G(e);case"fixed-2d":return new G(e);default:return new F(e)}}import{Vector2 as sn,Object3D as on,Vector3 as Re}from"three";import{PerspectiveCamera as St,Vector3 as rn,OrthographicCamera as De,RenderTarget as nn,LinearFilter as Hi}from"three";import{Vector3 as Me}from"three";import{OrbitControls as Jr}from"three/addons/controls/OrbitControls.js";var en=Math.atan(Math.SQRT2),tn={top:{phi:0,theta:0},side:{phi:Math.PI/2,theta:Math.PI/2},isometric:{phi:en,theta:Math.PI/4}},Ui=new Me,Te=class{camera;domElement;cameraRig=null;sceneRef=null;orbitControls=null;orbitTarget=null;orbitTargetWorldPos=new Me;debugDelegate=null;debugUnsubscribe=null;debugStateSnapshot={enabled:!1,selected:[]};savedCameraPosition=null;savedCameraQuaternion=null;savedCameraZoom=null;savedCameraLocalPosition=null;savedDebugCameraPosition=null;savedDebugCameraQuaternion=null;savedDebugCameraZoom=null;savedDebugOrbitTarget=null;_userOrbitEnabled=!1;_isDebugViewCamera=!1;_defaultOrbitTarget=null;_debugPoseSeeded=!1;_interactionEnabled=!0;_followSelection=!0;_viewPreset="custom";_unsubscribeCameraView=null;constructor(e,t,i){this.camera=e,this.domElement=t,this.cameraRig=i??null,this._unsubscribeCameraView=qt(r=>{this.setViewLock(r)})}setScene(e){this.sceneRef=e}setDebugViewCamera(e){this._isDebugViewCamera=e}setDefaultOrbitTarget(e){this._defaultOrbitTarget=e,e&&!this.orbitTarget&&this.debugStateSnapshot.enabled&&this._followSelection&&(this.orbitTarget=e)}seedOrbitPose(e,t){this.camera.position.copy(e),this.camera.lookAt(t),this.orbitControls&&(this.orbitControls.target.copy(t),this.orbitControls.update()),this._debugPoseSeeded=!0}get isDebugViewCamera(){return this._isDebugViewCamera}get isDebugOrbitPoseSeeded(){return this._debugPoseSeeded}get isActive(){return this.debugStateSnapshot.enabled}get isOrbitActive(){return this.debugStateSnapshot.enabled||this._userOrbitEnabled}update(){this._followSelection&&this.orbitControls&&this.orbitTarget&&(this.orbitTarget.getWorldPosition(this.orbitTargetWorldPos),this.orbitControls.target.copy(this.orbitTargetWorldPos)),this.orbitControls?.update()}enableUserOrbitControls(){this._userOrbitEnabled=!0,this.orbitControls||this.enableOrbitControls()}disableUserOrbitControls(){this._userOrbitEnabled=!1,this.debugStateSnapshot.enabled||this.disableOrbitControls()}setDebugDelegate(e){if(this.debugDelegate===e)return;if(this.detachDebugDelegate(),this.debugDelegate=e,!e){this.applyDebugState({enabled:!1,selected:[]});return}let t=e.subscribe(i=>{this.applyDebugState(i)});this.debugUnsubscribe=()=>{t?.()}}dispose(){this._unsubscribeCameraView?.(),this._unsubscribeCameraView=null,this.disableOrbitControls(),this.detachDebugDelegate()}setViewLock(e){this._viewPreset=e,this.applyViewLock()}get viewPreset(){return this._viewPreset}get debugState(){return this.debugStateSnapshot}frameTarget(e){!this.orbitControls&&(this.debugStateSnapshot.enabled||this._userOrbitEnabled)&&this.enableOrbitControls(),this.orbitControls||this.enableOrbitControls(),this.orbitTarget=e;let t=new Me().subVectors(this.camera.position,this.orbitControls.target).normalize();t.lengthSq()<1e-8&&t.set(1,1,1).normalize();let i=Ht(e,this.camera,t);this.orbitControls.target.copy(i.center),this.orbitControls.update()}applyDebugState(e){let t=this.debugStateSnapshot.enabled;if(this.debugStateSnapshot={enabled:e.enabled,selected:[...e.selected]},this._isDebugViewCamera){e.enabled&&!t?(this.enableOrbitControls(),this._debugPoseSeeded&&this.restoreDebugCameraState(),this.updateOrbitTargetFromSelection(e.selected),this.applyViewLock()):!e.enabled&&t?(this.saveDebugCameraState(),this._userOrbitEnabled||this.disableOrbitControls()):e.enabled&&this.updateOrbitTargetFromSelection(e.selected);return}e.enabled&&!t?(this.saveCameraState(),this.detachCameraFromRig(),this.enableOrbitControls(),this.restoreDebugCameraState(),this.updateOrbitTargetFromSelection(e.selected),this.applyViewLock()):!e.enabled&&t?(this.saveDebugCameraState(),this.orbitTarget=null,this._userOrbitEnabled||this.disableOrbitControls(),this.reattachCameraToRig(),this.restoreCameraState()):e.enabled&&this.updateOrbitTargetFromSelection(e.selected)}enableOrbitControls(){this.orbitControls||(this.orbitControls=new Jr(this.camera,this.domElement),this.orbitControls.enableDamping=!0,this.orbitControls.dampingFactor=.05,this.orbitControls.screenSpacePanning=!1,this.orbitControls.minDistance=1,this.orbitControls.maxDistance=500,this.orbitControls.maxPolarAngle=Math.PI/2,this.orbitControls.enabled=this._interactionEnabled,this.orbitControls.target.set(0,0,0),this.applyViewLock())}applyViewLock(){let e=this.orbitControls;if(!e)return;if(this._viewPreset==="custom"){e.minPolarAngle=0,e.maxPolarAngle=Math.PI/2,e.minAzimuthAngle=-1/0,e.maxAzimuthAngle=1/0,e.enableRotate=!0,e.update();return}let{phi:t,theta:i}=tn[this._viewPreset];Ui.copy(this.camera.position).sub(e.target);let r=Math.max(Ui.length(),e.minDistance),n=Math.sin(t);this.camera.position.set(e.target.x+r*n*Math.sin(i),e.target.y+r*Math.cos(t),e.target.z+r*n*Math.cos(i)),e.minPolarAngle=t,e.maxPolarAngle=t,e.minAzimuthAngle=i,e.maxAzimuthAngle=i,e.enableRotate=!1,e.update()}rebindCamera(e){this.camera=e,this.orbitControls&&(this.orbitControls.object=e,this.applyViewLock())}setInteractionEnabled(e){this._interactionEnabled=e,this.orbitControls&&(this.orbitControls.enabled=e)}setFollowSelectionEnabled(e){if(this._followSelection!==e){if(this._followSelection=e,!e){this.orbitTarget=null;return}this.updateOrbitTargetFromSelection(this.debugStateSnapshot.selected)}}get isFollowingSelection(){return this._followSelection}disableOrbitControls(){this.orbitControls&&(this.orbitControls.dispose(),this.orbitControls=null)}updateOrbitTargetFromSelection(e){if(this._followSelection){if(!this.debugDelegate||e.length===0){this.orbitTarget=this._defaultOrbitTarget,this.orbitControls&&(this.orbitTarget?(this.orbitTarget.getWorldPosition(this.orbitTargetWorldPos),this.orbitControls.target.copy(this.orbitTargetWorldPos)):this.orbitControls.target.set(0,0,0));return}for(let t=e.length-1;t>=0;t-=1){let i=e[t],r=this.debugDelegate.resolveTarget(i);if(r){this.orbitTarget=r,this.orbitControls&&(r.getWorldPosition(this.orbitTargetWorldPos),this.orbitControls.target.copy(this.orbitTargetWorldPos));return}}this.orbitTarget=this._defaultOrbitTarget,this.orbitControls&&(this.orbitTarget?(this.orbitTarget.getWorldPosition(this.orbitTargetWorldPos),this.orbitControls.target.copy(this.orbitTargetWorldPos)):this.orbitControls.target.set(0,0,0))}}detachDebugDelegate(){if(this.debugUnsubscribe)try{this.debugUnsubscribe()}catch{}this.debugUnsubscribe=null,this.debugDelegate=null}saveCameraState(){this.savedCameraPosition=this.camera.position.clone(),this.savedCameraQuaternion=this.camera.quaternion.clone(),"zoom"in this.camera&&(this.savedCameraZoom=this.camera.zoom)}restoreCameraState(){this.savedCameraPosition&&(this.camera.position.copy(this.savedCameraPosition),this.savedCameraPosition=null),this.savedCameraQuaternion&&(this.camera.quaternion.copy(this.savedCameraQuaternion),this.savedCameraQuaternion=null),this.savedCameraZoom!==null&&"zoom"in this.camera&&(this.camera.zoom=this.savedCameraZoom,this.camera.updateProjectionMatrix?.(),this.savedCameraZoom=null)}saveDebugCameraState(){this.savedDebugCameraPosition=this.camera.position.clone(),this.savedDebugCameraQuaternion=this.camera.quaternion.clone(),"zoom"in this.camera&&(this.savedDebugCameraZoom=this.camera.zoom),this.orbitControls&&(this.savedDebugOrbitTarget=this.orbitControls.target.clone())}restoreDebugCameraState(){this.savedDebugCameraPosition&&this.camera.position.copy(this.savedDebugCameraPosition),this.savedDebugCameraQuaternion&&this.camera.quaternion.copy(this.savedDebugCameraQuaternion),this.savedDebugCameraZoom!==null&&"zoom"in this.camera&&(this.camera.zoom=this.savedDebugCameraZoom,this.camera.updateProjectionMatrix?.()),this.savedDebugOrbitTarget&&this.orbitControls&&this.orbitControls.target.copy(this.savedDebugOrbitTarget)}detachCameraFromRig(){if(!this.cameraRig||this.camera.parent!==this.cameraRig)return;this.savedCameraLocalPosition=this.camera.position.clone();let e=new Me;this.camera.getWorldPosition(e),this.cameraRig.remove(this.camera),this.sceneRef&&this.sceneRef.add(this.camera),this.camera.position.copy(e)}reattachCameraToRig(){!this.cameraRig||this.camera.parent===this.cameraRig||(this.sceneRef&&this.camera.parent===this.sceneRef&&this.sceneRef.remove(this.camera),this.cameraRig.add(this.camera),this.savedCameraLocalPosition&&(this.camera.position.copy(this.savedCameraLocalPosition),this.savedCameraLocalPosition=null))}};var x=class{cameraRig=null;camera;screenResolution;_perspective;frustumSize=10;sceneRef=null;name="";viewport={...Ti};targets=[];pipeline;renderTarget=null;get target(){return this.targets.length>0?this.targets[0]:null}set target(e){e?this.targets.length===0?this.targets.push(e):this.targets[0]=e:this.targets=[]}orbitController=null;_useOrbitalControls=!1;_skipDebugOrbit=!1;isDebugViewCamera=!1;_rendererManager=null;_elapsedTime=0;constructor(e,t,i=10){this._perspective=e,this.screenResolution=t,this.frustumSize=i;let r=t.x/t.y;this.camera=this.createCameraForPerspective(r),this.camera.position.set(0,0,10),this.camera.lookAt(new rn(0,0,0));let n=L(e);this.pipeline=new Pe(n)}async setup(e,t){this.sceneRef=e,t&&(this._rendererManager=t),this._rendererManager&&!this._rendererManager.initialized&&await this._rendererManager.initRenderer(),this._rendererManager&&(this.orbitController=new Te(this.camera,this._rendererManager.renderer.domElement,null),this.orbitController.setScene(e),this.isDebugViewCamera&&this.orbitController.setDebugViewCamera(!0),this._useOrbitalControls&&this.orbitController.enableUserOrbitControls())}async setupLegacy(e){this._rendererManager||(this._rendererManager=new ye(this.screenResolution),await this._rendererManager.initRenderer(),this._rendererManager.setupPostProcessing(e,this.camera),this._rendererManager.startRenderLoop(()=>{this._rendererManager&&this.sceneRef&&(this.isOrbitActive&&this.updateOrbitControls(),this._rendererManager.render(this.sceneRef,this.camera))})),await this.setup(e,this._rendererManager)}update(e){if(this.isDebugModeActive()||this._useOrbitalControls)return;this._elapsedTime+=e;let t=this.buildContext(e),i=this.pipeline.run(t);this.commitPose(i)}isDebugModeActive(){return this.orbitController?.isActive??!1}get isOrbitActive(){return this.orbitController?.isOrbitActive??!1}updateOrbitControls(){this.orbitController?.update()}enableOrbitalControls(){this._useOrbitalControls=!0,this.orbitController?.enableUserOrbitControls()}disableOrbitalControls(){this._useOrbitalControls=!1,this.orbitController?.disableUserOrbitControls()}get useOrbitalControls(){return this._useOrbitalControls}addTarget(e){this.targets.includes(e)||this.targets.push(e)}removeTarget(e){let t=this.targets.indexOf(e);t!==-1&&this.targets.splice(t,1)}clearTargets(){this.targets=[]}setViewport(e,t,i,r){this.viewport={x:e,y:t,width:i,height:r}}resize(e,t){if(this.screenResolution.set(e,t),this.camera instanceof St&&(this.camera.aspect=e/t,this.camera.updateProjectionMatrix()),this.camera instanceof De){let i=e/t;this.camera.left=this.frustumSize*i/-2,this.camera.right=this.frustumSize*i/2,this.camera.top=this.frustumSize/2,this.camera.bottom=this.frustumSize/-2,this.camera.updateProjectionMatrix()}}createRenderTarget(e=512,t=512){return this.renderTarget&&this.renderTarget.dispose(),this.renderTarget=new nn(e,t,{minFilter:Hi,magFilter:Hi}),this.renderTarget}getRenderTexture(){return this.renderTarget?.texture??null}destroy(){try{this.orbitController?.dispose()}catch{}try{this.renderTarget?.dispose()}catch{}this.renderTarget=null,this.sceneRef=null,this.targets=[],this._rendererManager=null}setDefaultOrbitTarget(e){this.orbitController?.setDefaultOrbitTarget(e)}seedDebugOrbitPose(e,t){this.isDebugViewCamera&&this.isDebugOrbitPoseSeeded()||this.orbitController?.seedOrbitPose(e,t)}isDebugOrbitPoseSeeded(){return this.orbitController?.isDebugOrbitPoseSeeded??!1}setDebugDelegate(e){this._skipDebugOrbit||this.orbitController?.setDebugDelegate(e)}frameObject(e){this.orbitController?.frameTarget(e)}setOrbitInteractionEnabled(e){this.orbitController?.setInteractionEnabled(e)}setOrbitFollowEnabled(e){this.orbitController?.setFollowSelectionEnabled(e)}move(e){(this._perspective===y.Flat2D||this._perspective===y.Fixed2D)&&(this.frustumSize=e.z),this.camera.position.set(e.x,e.y,e.z)}rotate(e,t,i){this.camera.rotateX(e),this.camera.rotateY(t),this.camera.rotateZ(i)}getDomElement(){if(this._rendererManager)return this._rendererManager.getDomElement();throw new Error("ZylemCamera: No renderer manager available. Call setup() first.")}getRendererManager(){return this._rendererManager}setRendererManager(e){this._rendererManager=e}get renderer(){return this._rendererManager?.renderer}get composer(){return this._rendererManager?.postProcessing}setPixelRatio(e){this._rendererManager?.setPixelRatio(e)}buildContext(e){let t={};for(let i=0;i<this.targets.length;i++){let r=this.targets[i],n=i===0?"primary":`target_${i}`;r.group&&(t[n]={position:r.group.position,rotation:r.group.quaternion})}return{dt:e,time:this._elapsedTime,viewport:{width:this.screenResolution.x,height:this.screenResolution.y,aspect:this.screenResolution.x/this.screenResolution.y},targets:t}}commitPose(e){if(this.camera.position.copy(e.position),e.lookAt){let t=e.lookAt.x-e.position.x,i=e.lookAt.y-e.position.y,r=e.lookAt.z-e.position.z,n=Math.hypot(t,i,r);n>1e-8&&Math.abs(i)/n>.999?this.camera.up.set(0,0,-1):this.camera.up.set(0,1,0),this.camera.lookAt(e.lookAt)}else this.camera.quaternion.copy(e.rotation);if(this.camera instanceof St&&(e.fov!=null&&(this.camera.fov=e.fov),e.near!=null&&(this.camera.near=e.near),e.far!=null&&(this.camera.far=e.far),this.camera.updateProjectionMatrix()),this.camera instanceof De){if(e.zoom!=null){let t=this.screenResolution.x/this.screenResolution.y,i=e.zoom;this.camera.left=-i*t/2,this.camera.right=i*t/2,this.camera.top=i/2,this.camera.bottom=-i/2}e.near!=null&&(this.camera.near=e.near),e.far!=null&&(this.camera.far=e.far),this.camera.updateProjectionMatrix()}}applyPerspective(e,t){this._perspective=e,this.pipeline.setPerspective(t),this.ensureProjection(t.projection??gt(e))}ensureProjection(e){if((this.camera instanceof De?"orthographic":"perspective")===e)return;let i=this.screenResolution.x/Math.max(this.screenResolution.y,1),r=e==="orthographic"?this.createOrthographicCamera(i):this.createPerspectiveCamera(i);if(r.position.copy(this.camera.position),r.quaternion.copy(this.camera.quaternion),r.up.copy(this.camera.up),r.layers.mask=this.camera.layers.mask,r.name=this.camera.name,"near"in this.camera&&"near"in r){let o=this.camera,a=r;a.near=o.near,a.far=o.far,a.zoom=o.zoom,a.updateProjectionMatrix()}let n=this.camera.parent;n&&(n.add(r),n.remove(this.camera)),this.camera=r,this.orbitController?.rebindCamera(r),this._rendererManager?.rebindPostProcessingCamera(r)}createCameraForPerspective(e){return gt(this._perspective)==="orthographic"?this.createOrthographicCamera(e):this.createPerspectiveCamera(e)}createPerspectiveCamera(e){return new St(75,e,.1,1e3)}createOrthographicCamera(e){return new De(this.frustumSize*e/-2,this.frustumSize*e/2,this.frustumSize/2,this.frustumSize/-2,1,1e3)}};var _e=class{cameras=new Map;_activeCameras=[];_debugCamera=null;_preDebugPrimary=null;_debugOrbitTargetAnchor=null;_rendererManager=null;_sceneRef=null;_autoNameCounter=0;constructor(){}get activeCameras(){return this._activeCameras}get primaryCamera(){return this._activeCameras.length>0?this._activeCameras[0]:null}get debugCamera(){return this._debugCamera}get preDebugPrimary(){return this._preDebugPrimary}get allCameras(){return Array.from(this.cameras.values())}addCamera(e,t){let i=t||e.name||`camera_${this._autoNameCounter++}`;return e.name=i,this.cameras.set(i,e),this._activeCameras.length===0&&this._activeCameras.push(e),i}removeCamera(e){let t;if(typeof e=="string")t=e;else for(let[n,o]of this.cameras.entries())if(o===e){t=n;break}if(!t)return!1;let i=this.cameras.get(t);if(!i)return!1;if(i===this._debugCamera)return console.warn("CameraManager: Cannot remove the debug camera"),!1;this.cameras.delete(t);let r=this._activeCameras.indexOf(i);return r!==-1&&this._activeCameras.splice(r,1),!0}setActiveCamera(e){let t=this.resolveCamera(e);if(!t)return console.warn(`CameraManager: Camera not found: ${e}`),!1;let i=this._activeCameras.filter(r=>r!==this._activeCameras[0]&&r.viewport.width<1);return this._activeCameras=[t,...i],!0}addActiveCamera(e){let t=this.resolveCamera(e);return t?(this._activeCameras.includes(t)||this._activeCameras.push(t),!0):!1}deactivateCamera(e){let t=this.resolveCamera(e);if(!t)return!1;let i=this._activeCameras.indexOf(t);return i!==-1?(this._activeCameras.splice(i,1),!0):!1}getCamera(e){return this.cameras.get(e)??null}async setup(e,t){this._sceneRef=e,this._rendererManager=t,this.createDebugCamera(t.screenResolution),this._debugOrbitTargetAnchor=new on,this._debugOrbitTargetAnchor.name="__debug_orbit_target__",e.add(this._debugOrbitTargetAnchor);for(let i of this.cameras.values())i.setRendererManager(t),await i.setup(e,t);this._debugCamera&&this._debugOrbitTargetAnchor&&this._debugCamera.setDefaultOrbitTarget(this._debugOrbitTargetAnchor)}activateDebugCamera(){if(!this._debugCamera)return!1;let e=this.primaryCamera;if(e===this._debugCamera)return!0;this._preDebugPrimary=e;let t=this.setActiveCamera(this._debugCamera);return t&&this.seedDebugCameraPose(e),t}deactivateDebugCamera(){if(!this._debugCamera)return!1;let e=this._preDebugPrimary;if(this._preDebugPrimary=null,e&&e!==this._debugCamera)return this.setActiveCamera(e);for(let t of this.cameras.values())if(t!==this._debugCamera)return this.setActiveCamera(t);return!1}update(e){for(let t of this._activeCameras)t.update(e)}render(e){if(!this._rendererManager||this._activeCameras.length===0)return;this.updateOrbitingCamerasForRender();let t=[],i=[];for(let r of this._activeCameras)r.renderTarget?t.push(r):i.push(r);for(let r of t)this._rendererManager.renderCameraToTarget(e,r);i.length>0&&this._rendererManager.renderCameras(e,i)}updateOrbitingCamerasForRender(){for(let e of this._activeCameras)e.isOrbitActive&&e.updateOrbitControls()}ensureDefaultCamera(){if(this.cameras.size===0||this._activeCameras.length===0){let e=this._rendererManager?.screenResolution||new sn(window.innerWidth,window.innerHeight),t=new x(y.ThirdPerson,e);return this.addCamera(t,"default"),t}return this._activeCameras[0]}dispose(){for(let e of this.cameras.values())e.destroy();this._debugCamera&&!this.cameras.has("__debug__")&&this._debugCamera.destroy(),this.cameras.clear(),this._activeCameras=[],this._debugCamera=null,this._preDebugPrimary=null,this._debugOrbitTargetAnchor&&this._sceneRef&&this._sceneRef.remove(this._debugOrbitTargetAnchor),this._debugOrbitTargetAnchor=null,this._rendererManager=null,this._sceneRef=null}createDebugCamera(e){this._debugCamera=new x(y.ThirdPerson,e),this._debugCamera.name="__debug__",this._debugCamera.isDebugViewCamera=!0,this._debugCamera.enableOrbitalControls(),this.cameras.set("__debug__",this._debugCamera)}seedDebugCameraPose(e){if(!this._debugCamera||this._debugCamera.isDebugOrbitPoseSeeded())return;let t=new Re(0,0,0),i=new Re(0,6,12);if(e&&e!==this._debugCamera){let r=e.camera.position,n=new Re().subVectors(r,t);n.lengthSq()>1&&i.copy(n.normalize().multiplyScalar(12).add(new Re(0,4,0)))}this._debugCamera.seedDebugOrbitPose(i,t)}resolveCamera(e){if(typeof e=="string")return this.cameras.get(e)??null;if(e===this._debugCamera)return this._debugCamera;for(let t of this.cameras.values())if(t===e)return t;return null}};var C=class{cameraRef;constructor(e){this.cameraRef=e}addTarget(e){this.cameraRef.addTarget(e)}removeTarget(e){this.cameraRef.removeTarget(e)}clearTargets(){this.cameraRef.clearTargets()}enableOrbitalControls(){this.cameraRef.enableOrbitalControls()}disableOrbitalControls(){this.cameraRef.disableOrbitalControls()}setViewport(e,t,i,r){this.cameraRef.setViewport(e,t,i,r)}addBehavior(e,t){this.cameraRef.pipeline.addBehavior(e,t)}removeBehavior(e){return this.cameraRef.pipeline.removeBehavior(e)}addAction(e){this.cameraRef.pipeline.addAction(e)}setPerspective(e,t){this.cameraRef.applyPerspective(e,L(e,t))}getPerspective(){return this.cameraRef.pipeline.perspective}getState(){return this.cameraRef.pipeline.getState()}getRenderTexture(){return this.cameraRef.getRenderTexture()}};function Ma(s){let e=Xt(s.screenResolution,{x:window.innerWidth,y:window.innerHeight}),t=10;(s.perspective==="fixed-2d"||s.perspective==="isometric"||s.perspective==="top-down")&&(t=s.zoom||10);let i=new x(s.perspective||"third-person",e,t);s.name&&(i.name=s.name);let r=h(s.position,P),n=h(s.target,P);i.move(r),i.camera.lookAt(n);let o=s.perspective||"third-person";if(o==="fixed-2d"||o==="flat-2d"?i.applyPerspective(o,L(o,{zoom:t})):o==="isometric"||o==="top-down"?i.applyPerspective(o,L(o,{zoom:t,initialPosition:r.clone(),initialLookAt:n.clone()})):i.applyPerspective(o,L(o,{initialPosition:r.clone(),initialLookAt:n.clone()})),s.viewport&&(i.viewport={...s.viewport}),s.useOrbitalControls&&(i._useOrbitalControls=!0),s.skipDebugOrbit&&(i._skipDebugOrbit=!0),s.damping!=null&&(i.pipeline.damping=s.damping),s.behaviors)for(let[a,l]of Object.entries(s.behaviors))i.pipeline.addBehavior(a,l);if(s.renderToTexture){let{width:a=512,height:l=512}=s.renderToTexture;i.createRenderTarget(a,l)}return new C(i)}import{Vector3 as an}from"three";function D(s){return!!s&&typeof s=="object"&&typeof s.create=="function"}function ie(s){return!!s&&typeof s.then=="function"}function Pt(s){return!!s&&typeof s=="object"&&s instanceof C}function ji(s){return!s||typeof s!="object"||D(s)||Pt(s)||ie(s)||typeof s.then=="function"?!1:s.constructor===Object||s.constructor?.name==="Object"}function Wi(s){return s?!!(D(s)||typeof s=="function"||ie(s)):!1}var ln="/three/basis/";function Le(s){return{...s,ktx2TranscoderPath:s?.ktx2TranscoderPath??ln}}var ke=class{constructor(e,t,i,r,n,o,a=60,l={},c=!0,d=[]){this.inputs=e;this.backgroundColor=t;this.backgroundImage=i;this.backgroundShader=r;this.gravity=n;this.variables=o;this.physicsRate=a;this.assetLoaders=l;this.defaultLighting=c;this.postProcessingEffects=d}};function cn(){return new ke({p1:["gamepad-1","keyboard-1"],p2:["gamepad-2","keyboard-2"]},ge,null,null,new an(0,0,0),{},60,{},!0)}function qi(s=[]){let e=cn(),t={},i=[],r=[],n=[];for(let l of s)Pt(l)?n.push(l):D(l)?i.push(l):Wi(l)&&!D(l)?r.push(l):ji(l)&&(t={...t,...l});let o=new ke(t.inputs??e.inputs,t.backgroundColor??e.backgroundColor,t.backgroundImage??e.backgroundImage,t.backgroundShader??e.backgroundShader,t.gravity??e.gravity,t.variables??e.variables,t.physicsRate??e.physicsRate,t.assetLoaders??e.assetLoaders,t.defaultLighting??e.defaultLighting,t.postProcessingEffects??e.postProcessingEffects),a=n.length>0?n[0]:void 0;return{config:o,entities:i,asyncEntities:r,camera:a,cameras:n}}function Oa(s){return{...s}}var dn=Symbol("vessel"),re=class extends H{static type=dn;_setup(e){}async _loaded(e){}_update(e){}_destroy(e){}_cleanup(e){}create(){return this}clone(){let e=un();return this.replayUserLifecycleRegistrationsTo(e),this.cloneChildrenInto(e),e}add(...e){for(let t of e)super.add(t);return this}};function un(...s){let e=new re;return s.forEach(t=>e.add(t)),e.enableUserLifecycleTracking(),e}import{Color as Er,Vector3 as xr}from"three";import{createSimulation as pn}from"@zylem/behaviors/core";function wt(s){return typeof s?.handlePostCollision=="function"&&typeof s?.handleIntersectionEvent=="function"}function hn(s,e){return s<e?`${s}|${e}`:`${e}|${s}`}var Ae=class s{type="World";simulation;collisionMap=new Map;collisionBehaviorMap=new Map;_removalMap=new Map;activeCollisionPairs=new Map;livePairs=new Map;handleIdToUuid=new Map;currentCollisionTimeMs=0;zeroGravity;fixedTimestep;interpolationAlpha=0;stepClock={steps:0};static async create(e,t=60){let i={x:e?.x??0,y:e?.y??0,z:e?.z??0},r=await pn({gravity:[i.x,i.y,i.z],fixedTimestep:1/t,initialCapacity:4096});return new s(r,t,i.x===0&&i.y===0&&i.z===0)}constructor(e,t=60,i=!1){this.simulation=e,this.fixedTimestep=1/t,this.zeroGravity=i,this.simulation?.setEventsEnabled?.(!1)}addEntity(e){let t={...e.bodyDesc??{}},i=e.colliderDescs?.length?e.colliderDescs:e.colliderDesc?[e.colliderDesc]:[];this.zeroGravity&&(t.lockTranslation=t.lockTranslation??[!0,!0,!0],t.lockRotation=t.lockRotation??[!0,!0,!0]),(e.controlledRotation||e instanceof he)&&e.bodyDesc?.lockRotation===void 0&&(t.lockRotation=[!0,!0,!0]);let r=this.simulation.spawn({body:t,colliders:i});if(!r){console.warn(`ZylemWorld: failed to spawn entity ${e.uuid} into simulation`);return}e.body=new ai(this.simulation,r,this.stepClock),e.physicsAttached=!0,e.physicsWorldRef=this,e.simulationHandle=r,e.runtimeHandle=r.slot,e.runtimeAttached=!0,e.wasmStageRef=this.simulation.adapter,this.handleIdToUuid.set(r.id,e.uuid),this.collisionMap.set(e.uuid,e)}setForRemoval(e){e.physicsAttached&&this._removalMap.set(e.uuid,e)}destroyEntity(e){if(!(e.physicsWorldRef===this)){this.removeEntityFromTracking(e.uuid);return}let i=e.simulationHandle;if(i){try{this.simulation.despawn(i)}catch{}this.handleIdToUuid.delete(i.id)}this.removeEntityFromTracking(e.uuid),this.clearEntityPhysicsState(e)}setup(){}update(e){let{delta:t}=e;this.currentCollisionTimeMs+=t*1e3,this.processPendingRemovals();let i=this.hasCollisionPhaseListeners();i&&!this.simulation.areEventsEnabled&&this.simulation.setEventsEnabled?.(!0);let r=this.simulation.update(t);this.stepClock.steps+=r.stepsTaken,this.interpolationAlpha=r.alpha,i&&(this.applyCollisionEvents(r.events),this.processCollisionPairs(t,this.currentCollisionTimeMs))}hasCollisionPhaseListeners(){for(let e of this.collisionMap.values())if(e?.collisionDelegate?.collision?.length)return!0;return!1}applyCollisionEvents(e){for(let t of e){if(t.type!=="collisionStarted"&&t.type!=="collisionStopped")continue;let i=t.a?this.handleIdToUuid.get(t.a.id):void 0,r=t.b?this.handleIdToUuid.get(t.b.id):void 0;if(!i||!r||i===r)continue;let n=hn(i,r),o=this.livePairs.get(n);o||(o={uuidA:i<r?i:r,uuidB:i<r?r:i,contactCount:0,intersectionCount:0},this.livePairs.set(n,o));let a=t.type==="collisionStarted"?1:-1;t.sensor?o.intersectionCount=Math.max(0,o.intersectionCount+a):o.contactCount=Math.max(0,o.contactCount+a),o.contactCount===0&&o.intersectionCount===0&&this.livePairs.delete(n)}}snapshotLivePairs(){let e=new Map;for(let[t,i]of this.livePairs)e.set(t,{uuidA:i.uuidA,uuidB:i.uuidB,hasContact:i.contactCount>0,hasIntersection:i.intersectionCount>0});return e}updatePostCollisionBehaviors(e){let t=this.collisionBehaviorMap;for(let[i,r]of t){let n=r;if(!wt(n))continue;n.handlePostCollision({entity:n,delta:e})||this.collisionBehaviorMap.delete(i)}}processPendingRemovals(){if(this._removalMap.size!==0){for(let[,e]of this._removalMap)this.destroyEntity(e);this._removalMap.clear()}}removeEntityFromTracking(e){this.collisionMap.delete(e),this._removalMap.delete(e),this.pruneActiveCollisionPairs(e)}pruneActiveCollisionPairs(e){for(let[t,i]of this.activeCollisionPairs)(i.uuidA===e||i.uuidB===e)&&this.activeCollisionPairs.delete(t);for(let[t,i]of this.livePairs)(i.uuidA===e||i.uuidB===e)&&this.livePairs.delete(t)}entityHasCollisionPhaseListener(e,t){let i=e?.collisionDelegate.collision;if(!i?.length)return!1;for(let r of i)if(r.options.phase===t)return!0;return!1}processCollisionPairs(e,t=this.currentCollisionTimeMs){let i=this.snapshotLivePairs();for(let[r,n]of i){let o=this.collisionMap.get(n.uuidA),a=this.collisionMap.get(n.uuidB);this.activeCollisionPairs.has(r)||this.dispatchCollisionPhase(n,"enter",t),(this.entityHasCollisionPhaseListener(o,"stay")||this.entityHasCollisionPhaseListener(a,"stay"))&&this.dispatchCollisionPhase(n,"stay",t),n.hasIntersection&&this.dispatchIntersectionDelegates(n,e)}this.updatePostCollisionBehaviors(e),this.activeCollisionPairs=i}dispatchCollisionPhase(e,t,i){let r={phase:t,nowMs:i},n=this.collisionMap.get(e.uuidA),o=this.collisionMap.get(e.uuidB);n&&o&&n._collision(o,it.globals,r);let a=this.collisionMap.get(e.uuidA),l=this.collisionMap.get(e.uuidB);a&&l&&l._collision(a,it.globals,r)}dispatchIntersectionDelegates(e,t){let i=this.collisionMap.get(e.uuidA),r=this.collisionMap.get(e.uuidB);i&&r&&wt(i)&&(i.handleIntersectionEvent({entity:i,other:r,delta:t}),this.collisionBehaviorMap.set(i.uuid,i));let n=this.collisionMap.get(e.uuidA),o=this.collisionMap.get(e.uuidB);n&&o&&wt(o)&&(o.handleIntersectionEvent({entity:o,other:n,delta:t}),this.collisionBehaviorMap.set(o.uuid,o))}raycast(e,t,i){let r=this.simulation.castRay([e.x,e.y,e.z],[t.x,t.y,t.z],i,!0);return r?{uuid:r.entity?this.handleIdToUuid.get(r.entity.id)??null:null,distance:r.distance,normal:r.normal}:null}destroy(){try{for(let[,e]of this.collisionMap)try{this.clearEntityPhysicsState(e)}catch{}try{this.simulation.dispose()}catch{}this.collisionMap.clear(),this.collisionBehaviorMap.clear(),this._removalMap.clear(),this.activeCollisionPairs.clear(),this.livePairs.clear(),this.handleIdToUuid.clear()}catch{}}clearEntityPhysicsState(e){e.physicsAttached=!1,e.body=null,e.runtimeHandle=-1,e.runtimeAttached=!1,e.wasmStageRef=null,e.simulationHandle=void 0,e.physicsWorldRef===this&&(e.physicsWorldRef=null)}};import{Scene as mn,Color as Ki,AmbientLight as gn,DirectionalLight as fn,Vector3 as Oe,GridHelper as yn,Texture as vn,SRGBColorSpace as bn}from"three";var Be=class{type="Scene";_setup;scene;zylemCamera;cameraManager=null;containerElement=null;update=()=>{};_collision;_destroy;name;tag;constructor(e,t,i){let r=new mn,o=i.backgroundColor instanceof Ki?i.backgroundColor:new Ki(i.backgroundColor);r.background=o,i.backgroundShader?this.setupBackgroundShader(r,i.backgroundShader):i.backgroundImage&&z.loadTexture(i.backgroundImage,{colorSpace:bn}).then(a=>{r.background=a}),this.scene=r,this.zylemCamera=t,i.defaultLighting!==!1&&this.setupLighting(r),u.enabled&&this.debugScene()}setupBackgroundShader(e,t){if(!ue(t)){console.warn("ZylemScene: GLSL background shaders are not supported on the WebGPU renderer. Provide a TSL shader (ZylemTSLShader) as backgroundShader. Keeping solid background.");return}e.background=null,e.backgroundNode=t.colorNode}setup(){this._setup&&this._setup({me:this,camera:this.zylemCamera,globals:v()})}destroy(){this.cameraManager?(this.cameraManager.dispose(),this.cameraManager=null):this.zylemCamera&&this.zylemCamera.destroy&&this.zylemCamera.destroy(),this.scene&&(this.scene.backgroundNode=null,this.scene.background instanceof vn&&(this.scene.background.dispose(),this.scene.background=null),this.scene.traverse(e=>{if(e.geometry&&e.geometry.dispose?.(),e.material){let t=Array.isArray(e.material)?e.material:[e.material];for(let i of t)i.map&&i.map.dispose?.(),i.normalMap&&i.normalMap.dispose?.(),i.aoMap&&i.aoMap.dispose?.(),i.emissiveMap&&i.emissiveMap.dispose?.(),i.roughnessMap&&i.roughnessMap.dispose?.(),i.metalnessMap&&i.metalnessMap.dispose?.(),i.envMap&&i.envMap.dispose?.(),i.lightMap&&i.lightMap.dispose?.(),i.bumpMap&&i.bumpMap.dispose?.(),i.displacementMap&&i.displacementMap.dispose?.(),i.alphaMap&&i.alphaMap.dispose?.(),i.dispose?.()}e.isLight&&e.shadow?.map&&e.shadow.map.dispose()}),this.scene.clear())}async setupCamera(e,t,i){this.addCameraToScene(e,t),i?await t.setup(e,i):await t.setupLegacy(e)}async setupCameraManager(e,t,i){this.cameraManager=t;for(let r of t.activeCameras)this.addCameraToScene(e,r);await t.setup(e,i)}addCameraToScene(e,t){t.cameraRig?e.add(t.cameraRig):e.add(t.camera)}setupLighting(e){let t=new gn(16777215,1);e.add(t);let i=new fn(16777215,2);i.name="Light",i.position.set(0,100,0),i.castShadow=!0,i.shadow.camera.near=.1,i.shadow.camera.far=2e3,i.shadow.camera.left=-100,i.shadow.camera.right=100,i.shadow.camera.top=100,i.shadow.camera.bottom=-100,i.shadow.mapSize.width=2048,i.shadow.mapSize.height=2048,e.add(i)}updateRenderer(e,t){if(this.cameraManager)for(let i of this.cameraManager.allCameras)i.resize(e,t);else this.zylemCamera.resize(e,t)}add(e,t=new Oe(0,0,0)){e.position.set(t.x,t.y,t.z),this.scene.add(e)}addEntity(e){let t=e.group??e.mesh;!t||this.isAttachedOutsideScene(t)||this.add(t,e.options.position)}addEntityGroup(e){if(_(e))return;let t=e.group??e.mesh;if(!t||this.isAttachedOutsideScene(t))return;let i=Cn(e);i&&i.attachToScene(this.scene);let r=e.options.position??new Oe(0,0,0);if(e.physicsAttached&&e.body)try{let n=e.body.translation();r=new Oe(n.x,n.y,n.z)}catch{r=e.options.position??new Oe(0,0,0)}this.add(t,r),j(e)}isAttachedOutsideScene(e){return e.parent!=null&&e.parent!==this.scene}debugScene(){let i=new yn(1e3,100);this.scene.add(i)}};function Cn(s){return s.constructor.type===li?s:null}var ze=class{update=()=>{};setup=()=>{};destroy=()=>{};nodeSetup(e){typeof this._setup=="function"&&this._setup(e),this.setup&&this.setup(e)}nodeUpdate(e){typeof this._update=="function"&&this._update(e),this.update&&this.update(e)}nodeDestroy(e){this.destroy&&this.destroy(e),typeof this._destroy=="function"&&this._destroy(e)}};import{Quaternion as Sn}from"three";var Qi=new Sn;function Yi(s){let e=s._childrenMap,t=s._world;for(let[,i]of e){if(!i?.body||i.markedForRemoval||i.isInstanced||i.isBundled||i.skipRenderPoseSync)continue;let r=i.body,n=i.group??i.mesh,o=n?me(r,t?.interpolationAlpha??0):null;n&&o&&n.position.set(o.position.x,o.position.y,o.position.z),!i.controlledRotation&&n&&o&&(Qi.set(o.rotation.x,o.rotation.y,o.rotation.z,o.rotation.w),n.setRotationFromQuaternion(Qi))}}import{nanoid as Es}from"nanoid";import{Box3 as zt,BufferAttribute as br,BufferGeometry as gs,LineBasicMaterial as fs,LineSegments as ys,Raycaster as vs,Vector2 as bs,Vector3 as Vt}from"three";import{subscribe as Cs}from"valtio/vanilla";import{nanoid as Cr}from"nanoid";import{subscribe as Pn}from"valtio/vanilla";var Ve=class{stage;constructor(e){this.stage=e}subscribe(e){let t=()=>e(this.snapshot());return t(),Pn(u,t)}resolveTarget(e){let t=this.stage.entityDelegate.debugMap.get(e)||this.stage.entityDelegate.childrenMap.get(e)||this.stage.world?.collisionMap.get(e)||null;return t?.group??t?.mesh??null??null}snapshot(){return{enabled:u.enabled,selected:[...u.selectedEntityIds]}}};import{Box3 as wn,BoxGeometry as $i,Color as En,EdgesGeometry as Xi,Group as xn,LineBasicMaterial as Mn,LineSegments as Tn,Mesh as Dn,MeshBasicMaterial as Rn,Vector3 as Ji}from"three";var Ie=class{scene;container;fillMesh;edgeLines;currentColor=new En(65280);bbox=new wn;size=new Ji;center=new Ji;constructor(e){this.scene=e;let t=new $i(1,1,1);this.fillMesh=new Dn(t,new Rn({color:this.currentColor,transparent:!0,opacity:.12,depthWrite:!1}));let i=new Xi(t);this.edgeLines=new Tn(i,new Mn({color:this.currentColor,linewidth:1})),this.container=new xn,this.container.name="DebugEntityCursor",this.container.add(this.fillMesh),this.container.add(this.edgeLines),this.container.visible=!1,this.scene.add(this.container)}setColor(e){this.currentColor.set(e),this.fillMesh.material.color.set(this.currentColor),this.edgeLines.material.color.set(this.currentColor)}updateFromObject(e){if(!e){this.hide();return}this.bbox.setFromObject(e),this.updateFromBounds(this.bbox)}updateFromBounds(e){if(!e||e.isEmpty()){this.hide();return}if(e!==this.bbox&&this.bbox.copy(e),!isFinite(this.bbox.min.x)||!isFinite(this.bbox.max.x)){this.hide();return}this.bbox.getSize(this.size),this.bbox.getCenter(this.center);let t=new $i(Math.max(this.size.x,1e-6),Math.max(this.size.y,1e-6),Math.max(this.size.z,1e-6));this.fillMesh.geometry.dispose(),this.fillMesh.geometry=t;let i=new Xi(t);this.edgeLines.geometry.dispose(),this.edgeLines.geometry=i,this.container.position.copy(this.center),this.container.visible=!0}hide(){this.container.visible=!1}dispose(){this.scene.remove(this.container),this.fillMesh.geometry.dispose(),this.fillMesh.material.dispose(),this.edgeLines.geometry.dispose(),this.edgeLines.material.dispose()}};import{Box3 as _n,BoxGeometry as kn,Group as Ln,Mesh as An,MeshBasicMaterial as On,Vector3 as er}from"three";var Bn={x:0,y:0,z:0},zn=7128319,Vn=.35;function In(){return new On({color:zn,transparent:!0,opacity:Vn,depthWrite:!1})}function Fn(s){let e=s.size;return new er(e?.x??1,e?.y??1,e?.z??1)}function Gn(s,e){try{let t=s.create({position:Bn,props:e});if(!t||typeof t.then=="function")return null;let i=t,r=i.group??i.mesh??null;return r?r.clone():null}catch(t){return console.warn(`[zylem] placement ghost: the "${s.id}" factory failed, falling back to a box`,t),null}}function Zn(s,e){s.traverse(t=>{let i=t;i.isMesh&&(i.material=e,i.castShadow=!1,i.receiveShadow=!1)})}var Fe=class{scene;container;builtFor=null;builtProps=null;material=null;extent=null;bounds=new _n;constructor(e){this.scene=e,this.container=new Ln,this.container.name="PlacementGhost",this.container.visible=!1,this.scene.add(this.container)}setType(e,t){let i=t??null;if(e===this.builtFor&&i===this.builtProps)return;if(this.builtFor=e,this.builtProps=i,this.clearSilhouette(),!e){this.hide();return}let r=de(e),n={...r?.defaultProps??{},...t??{}},a=(r?Gn(r,n):null)??new An(new kn(...Fn(n).toArray()));a.position.set(0,0,0),this.material=In(),Zn(a,this.material),this.container.add(a),this.bounds.setFromObject(a),this.extent=this.bounds.isEmpty()?null:this.bounds.getSize(new er)}measure(){return this.extent}showAt(e){if(this.container.children.length===0){this.hide();return}this.container.position.copy(e),this.container.visible=!0}hide(){this.container.visible=!1}dispose(){this.clearSilhouette(),this.scene.remove(this.container),this.builtFor=null,this.builtProps=null}clearSilhouette(){for(let e of[...this.container.children])this.container.remove(e),e.traverse(t=>{let i=t;i.isMesh&&i.geometry?.dispose()});this.material?.dispose(),this.material=null,this.extent=null}};import{Vector3 as Et}from"three";var Nn=0;function Un(s,e){if(e)return{position:s.origin.clone().add(s.direction.clone().multiplyScalar(e.distance)),normal:new Et(e.normal[0],e.normal[1],e.normal[2])};if(Math.abs(s.direction.y)<1e-6)return null;let t=(Nn-s.origin.y)/s.direction.y;return t<0?null:{position:s.origin.clone().add(s.direction.clone().multiplyScalar(t)),normal:new Et(0,1,0)}}function Hn(s,e){if(e.lengthSq()<1e-8)return 0;let t=e.clone().normalize();return(Math.abs(t.x)*s.x+Math.abs(t.y)*s.y+Math.abs(t.z)*s.z)/2}function xt(s,e,t){let i=Hn(e,t);return i<=0?s.clone():s.clone().add(t.clone().normalize().multiplyScalar(i))}function Mt(s,e,t,i){let r=Un(s,e);if(!r)return null;let{normal:n}=r,o=t.enabled?ce(r.position,t.translate):r.position,a=new Et(o.x,o.y,o.z);return{position:i?xt(a,i,n):a,normal:n}}import{Box3 as Kn,Quaternion as Ue,Vector3 as S}from"three";import{nanoid as Qn}from"nanoid";import{Vector3 as Z}from"three";var Dt=.95,jn=16,ne=new Z,Wn=new Z,tr=new Z,Tt=new Z;function ir(s){return s?s.isPerspectiveCamera===!0||s.isOrthographicCamera===!0:!1}function Ge(s,e,t=Dt){return ne.copy(s).project(e),Math.abs(ne.x)<=t&&Math.abs(ne.y)<=t&&ne.z>=-1&&ne.z<=1}function rr(s){let e=0,t=1;for(let i=0;i<jn;i+=1){let r=(e+t)/2;s(r)?e=r:t=r}return e}function nr(s,e,t,i=Dt){if(!ir(t))return e.clone();let r=t;if(Ge(e,r,i)||!Ge(s,r,i))return e.clone();let n=rr(o=>Ge(Wn.copy(s).lerp(e,o),r,i));return s.clone().lerp(e,n)}function sr(s,e,t,i,r=Dt){if(!ir(i)||t.x<=1&&t.y<=1&&t.z<=1||s.isEmpty())return t.clone();let n=i;tr.copy(e);let o=new Z(1,1,1),a=c=>(o.set(1+(t.x-1)*c,1+(t.y-1)*c,1+(t.z-1)*c),qn(s,tr,o,n,r));if(a(1))return t.clone();let l=rr(a);return new Z(1+(t.x-1)*l,1+(t.y-1)*l,1+(t.z-1)*l)}function qn(s,e,t,i,r){for(let n=0;n<8;n+=1)if(Tt.set(n&1?s.max.x:s.min.x,n&2?s.max.y:s.min.y,n&4?s.max.z:s.min.z),Tt.sub(e).multiply(t).add(e),!Ge(Tt,i,r))return!1;return!0}var Yn={translate:"Move",rotate:"Rotate",scale:"Scale"};function Rt(s){let e=typeof s?.getPose=="function"?s.getPose():null,t=s?.group??s?.mesh,i=e?.position??(t?{x:t.position.x,y:t.position.y,z:t.position.z}:null)??{x:0,y:0,z:0},r=e?.rotation??{x:0,y:0,z:0,w:1},n=typeof s?.getScale=="function"?s.getScale():{x:1,y:1,z:1};return{position:new S(i.x,i.y,i.z),quaternion:new Ue(r.x,r.y,r.z,r.w),scale:new S(n.x,n.y,n.z)}}function or(s){let e=at(s.quaternion);return{position:{x:s.position.x,y:s.position.y,z:s.position.z},rotation:e,quaternion:{x:s.quaternion.x,y:s.quaternion.y,z:s.quaternion.z,w:s.quaternion.w},scale:{x:s.scale.x,y:s.scale.y,z:s.scale.z}}}function $n(s,e){return s.position.distanceToSquared(e.position)>1e-5*1e-5||Math.abs(s.quaternion.dot(e.quaternion))<1-1e-5||s.scale.distanceToSquared(e.scale)>1e-5*1e-5}function Ze(s,e){(e.position||e.quaternion)&&s.setPose?.({position:e.position?{x:e.position.x,y:e.position.y,z:e.position.z}:void 0,rotation:e.quaternion?{x:e.quaternion.x,y:e.quaternion.y,z:e.quaternion.z,w:e.quaternion.w}:void 0}),e.scale&&s.setScale?.(e.scale.x,e.scale.y,e.scale.z)}function Xn(s){let e=s?.group??s?.mesh;if(!e?.isObject3D)return null;let t=new Kn().setFromObject(e);return t.isEmpty()?null:t}var _t=.02,kt=50;function Jn(s){return new S(Lt(s.x,_t,kt),Lt(s.y,_t,kt),Lt(s.z,_t,kt))}function Lt(s,e,t){return Math.min(Math.max(s,e),t)}var At=new Ue,es=new S,Ne=class{gizmo=new gi;context;mode=null;session=null;pausedBeforeEntry=null;constructor(e){this.context=e}setMode(e){if(this.mode!==e){if(e&&this.pausedBeforeEntry===null?(this.pausedBeforeEntry=u.paused,u.paused=!0):!e&&this.pausedBeforeEntry!==null&&(u.paused=this.pausedBeforeEntry,this.pausedBeforeEntry=null),this.mode=e,this.cancelDrag(),!e){this.gizmo.hide();return}this.gizmo.setMode(e)}}getMode(){return this.mode}get isDragging(){return this.session!==null}update(){let e=this.context.getScene();if(e&&this.gizmo.addTo(e),!this.mode){this.gizmo.hide();return}if(!this.session){let i=this.selectionPivot();if(!i){this.gizmo.hide();return}this.gizmo.show(i)}let t=this.context.getCamera();t&&this.gizmo.update(t)}hover(e){if(!this.mode||this.session)return null;let t=this.gizmo.pick(e);return this.gizmo.setHighlight(t),t}pointerDown(e){if(!this.mode)return!1;let t=this.context.getCamera();if(!t)return!1;let i=this.gizmo.pick(e);if(!i||!this.gizmo.beginDrag(i,e,t))return!1;let r=[];for(let n of u.selectedEntityIds){let o=this.context.resolveEntity(n);o&&r.push({uuid:n,entity:o,start:Rt(o),startBounds:this.mode==="scale"?Xn(o):null})}return r.length?(this.session={mode:this.mode,axis:i,entries:r,pivotStart:this.gizmo.pivot.clone(),changed:!1},!0):(this.gizmo.endDrag(),!1)}pointerMove(e,t){let i=this.session;if(!i)return;let r=this.context.getCamera();if(!r)return;let n=this.gizmo.updateDrag(e,r);if(!n)return;let o=B(),a=o.enabled&&!t;switch(n.kind){case"translate":this.applyTranslate(i,n.offset,a?o.translate:0,r);break;case"rotate":this.applyRotate(i,n.axis,n.angle,a?o.rotate:0);break;case"scale":this.applyScale(i,n.factor,a?o.scale:0,r);break}i.changed=!0}pointerUp(){let e=this.session;if(this.session=null,this.gizmo.endDrag(),!e)return;let t=[];for(let i of e.entries){let r=Rt(i.entity);$n(i.start,r)&&(e.mode==="scale"&&lt(i.entity),t.push({uuid:i.uuid,before:or(i.start),after:or(r)}))}t.length&&U({opId:Qn(10),kind:"transform",label:this.describeOperation(e),entries:t})}cancelDrag(){this.session=null,this.gizmo.endDrag()}dispose(){this.cancelDrag(),this.pausedBeforeEntry!==null&&(u.paused=this.pausedBeforeEntry,this.pausedBeforeEntry=null),this.gizmo.dispose()}applyTranslate(e,t,i,r){let n=es.copy(e.pivotStart).add(t),o=nr(e.pivotStart,n,r),a=i>0?ce(o,i):o,l=new S(a.x-e.pivotStart.x,a.y-e.pivotStart.y,a.z-e.pivotStart.z);for(let c of e.entries)Ze(c.entity,{position:c.start.position.clone().add(l)})}applyRotate(e,t,i,r){let n=e.axis;for(let o of e.entries){At.setFromAxisAngle(t,i);let a=At.clone().multiply(o.start.quaternion),l=a;if(r>0&&(n==="x"||n==="y"||n==="z")){let d=at(a);d[n]=Qt(d[n],r);let p=ot(d);l=new Ue(p.x,p.y,p.z,p.w)}let c=o.start.position.clone().sub(e.pivotStart).applyQuaternion(At).add(e.pivotStart);Ze(o.entity,{position:c,quaternion:l})}}applyScale(e,t,i,r){for(let n of e.entries){let o=n.startBounds?sr(n.startBounds,n.start.position,t,r):t,a=Jn(o),l=new S(n.start.scale.x*a.x,n.start.scale.y*a.y,n.start.scale.z*a.z),c=i>0?Yt(l,i):l;Ze(n.entity,{scale:new S(c.x,c.y,c.z)})}}describeOperation(e){let t=Yn[e.mode];if(e.entries.length>1)return`${t} ${e.entries.length} entities`;let i=e.entries[0]?.entity,r=i?.name||String(i?.constructor?.type??"").replace("Symbol(","").replace(")","")||"Entity";return`${t} ${r}`}selectionPivot(){let e=u.selectedEntityIds;if(!e.length)return null;let t=new S,i=0;for(let r of e){let n=this.context.resolveEntity(r);n&&(t.add(Rt(n).position),i++)}return i?t.divideScalar(i):null}};function ar(s,e,t){for(let i of s.entries){let r=e==="undo"?i.before:i.after;if(!r)continue;let n=t(i.uuid);if(!n)continue;let o=r.quaternion??(r.rotation?ot(r.rotation):void 0);Ze(n,{position:r.position?new S(r.position.x,r.position.y,r.position.z):void 0,quaternion:o?new Ue(o.x,o.y,o.z,o.w):void 0,scale:r.scale?new S(r.scale.x,r.scale.y,r.scale.z):void 0}),r.scale&&lt(n)}}var ts=200;function lr(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function is(s){return lr(s)&&(ue(s)||ei(s))}var He=class{stage;snapshots=new Map;constructor(e){this.stage=e}applySwatches(e){let t=new Map,i=[],r=[];for(let n of e.uuids)for(let o of e.swatches){let{result:a,entry:l}=this.applyPair(n,o,t);i.push(a),l&&r.push(l)}return t.size>0&&this.remember(e.opId,t),{results:i,entries:r}}applySceneOperation(e,t){if(e.kind!=="swatch")return;let i=this.snapshots.get(e.opId);if(i){t==="undo"?this.undoFromSnapshot(i):this.redoFromSnapshot(i);return}if(t==="redo"){let r=new Map;for(let n of e.entries)n.swatch&&this.applyPair(n.uuid,n.swatch,r);r.size>0&&this.remember(e.opId,r);return}this.undoWithoutSnapshot(e)}hasSnapshot(e){return this.snapshots.has(e)}dispose(){for(let[e]of this.snapshots)this.forget(e)}applyPair(e,t,i){let r={uuid:e,kind:t.kind,source:t.source},n=this.stage.resolveEntity(e);if(!n)return{result:{...r,ok:!1,reason:"entity-not-found"}};if(!lr(t.props))return{result:{...r,ok:!1,reason:"invalid-props"}};let o=i.get(e)??{previousRefs:new Map,appliedRefs:new Map},a=t.kind==="shader"?this.applyShader(n,t,o):this.applyBehavior(n,t,o);return a.ok?(i.set(e,o),{result:{...r,ok:!0,replaced:a.replaced},entry:{uuid:e,swatch:t,...a.replacedSpec?{replaced:a.replacedSpec}:{}}}):{result:{...r,ok:!1,reason:a.reason}}}applyShader(e,t,i){let r=pe("shader",t.source);if(!r)return{ok:!1,reason:"unknown-source"};if(!e.hasMaterial())return{ok:!1,reason:"no-material"};let n;try{n=r.create(t.props)}catch(a){return console.warn(`[zylem] swatch shader "${t.source}" threw`,a),{ok:!1,reason:"invalid-props"}}if(!is(n))return{ok:!1,reason:"invalid-props"};let o=e.setMaterial({shader:n},{disposePrevious:!1});return o?(i.previousMaterials?Ot(o,i.previousMaterials):i.previousMaterials=o,{ok:!0,replaced:!1}):{ok:!1,reason:"no-material"}}applyBehavior(e,t,i){let r=pe("behavior",t.source);if(!r)return{ok:!1,reason:"unknown-source"};let{descriptor:n}=r,o=n.key,a=!1,l,c=e.getBehaviorRef(n);c&&(e.removeBehavior(c),this.stage.detachBehaviorLink(e,c),i.appliedRefs.get(o)===c||(a=!0,l={source:t.source,props:{...c.options}},i.previousRefs.has(o)||i.previousRefs.set(o,c)));let d;try{e.use(n,t.props),d=e.getBehaviorRefs().at(-1)}catch(p){console.warn(`[zylem] swatch behavior "${t.source}" failed to attach`,p)}return!d||d.descriptor.key!==o?(c&&(e.restoreBehaviorRef(c),this.stage.attachBehaviorLink(e,c),i.previousRefs.get(o)===c&&i.previousRefs.delete(o)),{ok:!1,reason:"invalid-props"}):(this.stage.attachBehaviorLink(e,d),i.appliedRefs.set(o,d),{ok:!0,replaced:a,replacedSpec:l})}undoFromSnapshot(e){for(let[t,i]of[...e].reverse()){let r=this.stage.resolveEntity(t);if(r){if(i.previousMaterials){let n=r.replaceMaterials(i.previousMaterials,{disposePrevious:!1});n&&(i.redoMaterials=n)}for(let n of i.appliedRefs.values())r.removeBehavior(n)&&this.stage.detachBehaviorLink(r,n);for(let n of i.previousRefs.values())r.restoreBehaviorRef(n),this.stage.attachBehaviorLink(r,n)}}}redoFromSnapshot(e){for(let[t,i]of e){let r=this.stage.resolveEntity(t);if(r){i.redoMaterials&&r.replaceMaterials(i.redoMaterials,{disposePrevious:!1});for(let n of i.previousRefs.values())r.removeBehavior(n)&&this.stage.detachBehaviorLink(r,n);for(let n of i.appliedRefs.values())r.restoreBehaviorRef(n),this.stage.attachBehaviorLink(r,n)}}}undoWithoutSnapshot(e){for(let t of[...e.entries].reverse()){let i=this.stage.resolveEntity(t.uuid);if(!(!i||!t.swatch)){if(t.swatch.kind==="behavior"){let r=pe("behavior",t.swatch.source);if(!r)continue;let n=i.removeBehavior(r.descriptor);if(n&&this.stage.detachBehaviorLink(i,n),t.replaced){i.use(r.descriptor,t.replaced.props);let o=i.getBehaviorRefs().at(-1);o&&this.stage.attachBehaviorLink(i,o)}continue}i.setMaterial({})}}}remember(e,t){for(this.snapshots.has(e)&&this.forget(e),this.snapshots.set(e,t);this.snapshots.size>ts;){let i=this.snapshots.keys().next().value;if(i===void 0)break;this.forget(i)}}forget(e){let t=this.snapshots.get(e);if(this.snapshots.delete(e),!!t)for(let[i,r]of t){let n=this.stage.resolveEntity(i)?.getMaterials()??[];Ot(r.previousMaterials??[],n),Ot(r.redoMaterials??[],n)}}};function Ot(s,e){for(let t of s)e.includes(t)||t.dispose()}import{Box3 as os,Frustum as as,Vector2 as We}from"three";import{Frustum as rs,Vector2 as cr,Vector3 as ns}from"three";var dr=Array.from({length:8},()=>new ns),g=new cr,f=new cr;function ur(s,e,t,i=new rs){g.set(Math.min(e.x,t.x),Math.min(e.y,t.y)),f.set(Math.max(e.x,t.x),Math.max(e.y,t.y));let r=1e-5;f.x-g.x<r&&(f.x=g.x+r),f.y-g.y<r&&(f.y=g.y+r),R(0,g.x,g.y,-1,s),R(1,f.x,g.y,-1,s),R(2,f.x,f.y,-1,s),R(3,g.x,f.y,-1,s),R(4,g.x,g.y,1,s),R(5,f.x,g.y,1,s),R(6,f.x,f.y,1,s),R(7,g.x,f.y,1,s);let[n,o,a,l,c,d,p,m]=dr,O=i.planes;return N(O[0],n,c,m),N(O[1],o,p,d),N(O[2],l,m,p),N(O[3],n,d,c),N(O[4],n,l,a),N(O[5],c,p,m),i}function R(s,e,t,i,r){dr[s].set(e,t,i).unproject(r)}function N(s,e,t,i){s.setFromCoplanarPoints(e,t,i)}function pr(s,e){return e.isEmpty()||!Number.isFinite(e.min.x)||!Number.isFinite(e.max.x)?!1:s.intersectsBox(e)}function hr(s,e,t){switch(t){case"add":{let i=new Set(s),r=[...s];for(let n of e)i.has(n)||(i.add(n),r.push(n));return r}case"subtract":{let i=new Set(e);return s.filter(r=>!i.has(r))}default:return[...new Set(e)]}}function mr(s){return s.altKey?"subtract":s.shiftKey?"add":"replace"}var ss="[data-zylem-overlay-root]";function gr(s){let e=s.parentElement;return e?e.querySelector(ss)??e:null}var je=class{element=null;host=null;show(e,t){let i=this.ensureElement(e);i.style.left=`${t.left}px`,i.style.top=`${t.top}px`,i.style.width=`${t.width}px`,i.style.height=`${t.height}px`,i.style.display="block"}hide(){this.element&&(this.element.style.display="none")}dispose(){this.element?.remove(),this.element=null,this.host=null}ensureElement(e){if(this.element&&this.host===e)return this.element;this.element?.remove();let t=document.createElement("div");t.dataset.zylemMarquee="true";let i=t.style;return i.position="absolute",i.pointerEvents="none",i.boxSizing="border-box",i.border="1px solid rgba(34, 255, 34, 0.9)",i.background="rgba(34, 255, 34, 0.12)",i.display="none",i.zIndex="20",e.appendChild(t),this.element=t,this.host=e,t}};var ls=4,cs=new os,fr=new as,qe=class{context;overlay=new je;armed=!1;dragging=!1;mode="replace";baseSelection=[];startNdc=new We;currentNdc=new We;startClient=new We;currentClient=new We;host=null;constructor(e){this.context=e}get isArmed(){return this.armed}get isDragging(){return this.dragging}pointerDown(e,t,i){this.armed=!0,this.dragging=!1,this.mode=mr(t),this.baseSelection=[...u.selectedEntityIds],this.startNdc.copy(e),this.currentNdc.copy(e),this.startClient.set(t.clientX,t.clientY),this.currentClient.copy(this.startClient),this.host=gr(i)}pointerMove(e,t){if(!this.armed)return!1;this.currentNdc.copy(e),this.currentClient.set(t.clientX,t.clientY);let i=!1;if(!this.dragging){if(this.currentClient.distanceTo(this.startClient)<ls)return!1;this.dragging=!0,i=!0}return this.drawOverlay(),i}pointerUp(e){if(!this.armed)return"idle";let t=this.dragging;return this.currentNdc.copy(e),this.reset(),t?(this.commit(),"marquee"):"click"}cancel(){this.reset()}dispose(){this.reset(),this.overlay.dispose()}reset(){this.armed=!1,this.dragging=!1,this.overlay.hide()}drawOverlay(){if(!this.host)return;let e=this.host.getBoundingClientRect(),t=Math.min(this.startClient.x,this.currentClient.x)-e.left,i=Math.min(this.startClient.y,this.currentClient.y)-e.top;this.overlay.show(this.host,{left:t,top:i,width:Math.abs(this.currentClient.x-this.startClient.x),height:Math.abs(this.currentClient.y-this.startClient.y)})}commit(){let e=this.context.getCamera();if(!e)return;ur(e,this.startNdc,this.currentNdc,fr);let t=[];this.context.forEachEntity((i,r)=>{let n=W(r,cs);n&&pr(fr,n)&&t.push(i)}),Gt(hr(this.baseSelection,t,this.mode))}};import{BoxGeometry as ds,EdgesGeometry as us,Group as ps,LineBasicMaterial as hs,LineSegments as ms,Vector3 as vr}from"three";var Ke=new vr,yr=new vr,Qe=class{scene;container=new ps;edges;material;pool=[];constructor(e,t=16765503){this.scene=e;let i=new ds(1,1,1);this.edges=new us(i),i.dispose(),this.material=new hs({color:t,depthTest:!1,transparent:!0,opacity:.9}),this.container.name="SelectionHighlight",this.container.renderOrder=999,this.scene.add(this.container)}setColor(e){this.material.color.set(e)}update(e){let t=0;for(let i of e){if(i.isEmpty()||!Number.isFinite(i.min.x)||!Number.isFinite(i.max.x))continue;i.getSize(Ke),i.getCenter(yr);let r=this.acquire(t);t+=1,r.position.copy(yr),r.scale.set(Math.max(Ke.x,1e-6),Math.max(Ke.y,1e-6),Math.max(Ke.z,1e-6)),r.visible=!0}for(let i=t;i<this.pool.length;i+=1)this.pool[i].visible=!1}hide(){for(let e of this.pool)e.visible=!1}dispose(){this.scene.remove(this.container),this.edges.dispose(),this.material.dispose(),this.pool.length=0}acquire(e){let t=this.pool[e];if(t)return t;let i=new ms(this.edges,this.material);return i.frustumCulled=!1,this.container.add(i),this.pool.push(i),i}};var Sr=2293538,Ss=16724787,Bt=new zt,Pr=new Vt,Ye=class{stage;options;mouseNdc=new bs(-2,-2);raycaster=new vs;domDisposeFns=[];domListenersAttached=!1;debugCursor=null;placementGhost=null;debugLines=null;cameraDebugDelegate=null;debugStateUnsubscribe=null;focusContextUnregister=null;entityResolverUnregister=null;lastDebugEnabled=null;warnedMissingAddFactory=!1;transformTool;swatchApplier;marquee;selectionHighlight=null;selectionBoundsPool=[];hoverBounds=new zt;grid=new mi;lastTool=null;capturedPointer=null;constructor(e,t){this.stage=e,this.options={maxRayDistance:t?.maxRayDistance??5e3,addEntityFactory:t?.addEntityFactory??null},this.transformTool=new Ne({getScene:()=>this.stage.scene?.scene??null,getCamera:()=>this.getDebugViewCamera()?.camera??null,resolveEntity:i=>this.resolveEntity(i)}),this.swatchApplier=new He({resolveEntity:i=>this.resolveEntity(i),attachBehaviorLink:(i,r)=>this.stage.entityDelegate.attachBehaviorLink(i,r),detachBehaviorLink:(i,r)=>this.stage.entityDelegate.detachBehaviorLink(i,r)}),this.marquee=new qe({getCamera:()=>this.getDebugViewCamera()?.camera??null,forEachEntity:i=>this.forEachSelectableEntity(i)}),this.syncWithDebugState(),this.debugStateUnsubscribe=Cs(u,()=>{this.syncWithDebugState()}),this.entityResolverUnregister=Ft(i=>this.resolveEntity(i)),this.focusContextUnregister=Kt({resolveEntity:i=>this.resolveEntity(i),frameObject:i=>{this.ensureCameraDebugDelegate(),this.getDebugViewCamera()?.frameObject(i)},ensureDebugReady:()=>{u.enabled||(u.enabled=!0),this.lastDebugEnabled=!0,this.activate()}})}setAddEntityFactory(e){this.options.addEntityFactory=e,this.warnedMissingAddFactory=!1}getDebugViewCamera(){return this.stage.cameraManagerRef?.primaryCamera??this.stage.cameraManagerRef?.debugCamera??this.stage.cameraRef??null}resolveEntity(e){let t=this.stage.entityDelegate.debugMap.get(e);if(t)return t;let i=this.stage.entityDelegate.childrenMap.get(e);return i||(this.stage.world?.collisionMap.get(e)??null)}forEachSelectableEntity(e){let t=new Set,i=(r,n)=>{t.has(n)||(t.add(n),e(n,r))};this.stage.entityDelegate.childrenMap.forEach(i),this.stage.entityDelegate.debugMap.forEach(i)}populateDebugMap(){this.stage.entityDelegate.childrenMap.forEach((e,t)=>{this.stage.entityDelegate.debugMap.set(t,e)})}ensureCameraDebugDelegate(){let e=this.stage.cameraManagerRef?.debugCamera??null;e&&(this.cameraDebugDelegate||(this.cameraDebugDelegate=new Ve(this.stage)),e.setDebugDelegate(this.cameraDebugDelegate))}syncWithDebugState(){this.syncToolMode(),this.syncGrid();let e=u.enabled;e!==this.lastDebugEnabled&&(this.lastDebugEnabled=e,e?this.activate():this.deactivate())}syncToolMode(){let e=u.tool;if(e===this.lastTool)return;this.lastTool=e,this.marquee.isArmed&&(this.marquee.cancel(),this.endPointerCapture()),e!=="none"&&(this.ensureInteraction(),this.populateDebugMap()),this.parkToolVisuals(e);let t=rt(e);this.getDebugViewCamera()?.setOrbitFollowEnabled(!t),this.transformTool.setMode(t?e:null)}syncGrid(){let e=this.stage.scene?.scene;e&&(this.grid.addTo(e),this.grid.setIncrement(B().translate),this.grid.setVisible(u.gridVisible))}activate(){this.domListenersAttached||(this.domListenersAttached=this.attachDomListeners()),this.populateDebugMap(),this.stage.cameraManagerRef?.activateDebugCamera();let e=this.stage.cameraManagerRef?.debugCamera??null;this.rebindPostProcessing(e),this.ensureCameraDebugDelegate(),document.pointerLockElement&&document.exitPointerLock()}deactivate(){this.disposeDebugVisuals(),this.transformTool.cancelDrag(),this.grid.setVisible(!1);let e=this.stage.cameraManagerRef?.debugCamera;e&&e.setDebugDelegate(null),this.stage.cameraRef&&this.stage.cameraRef!==e&&this.stage.cameraRef.setDebugDelegate(null),this.cameraDebugDelegate=null,this.stage.cameraManagerRef?.deactivateDebugCamera();let t=this.stage.cameraManagerRef?.primaryCamera??this.stage.cameraRef??null;this.rebindPostProcessing(t)}rebindPostProcessing(e){let t=this.stage.scene?.scene,i=this.stage.rendererManager;t&&i&&e&&i.setupPostProcessing(t,e.camera)}initDebugVisuals(){this.debugLines||!this.stage.scene||(this.debugLines=new ys(new gs,new fs({vertexColors:!0})),this.stage.scene.scene.add(this.debugLines),this.debugLines.visible=!0)}disposeDebugVisuals(){this.debugLines&&this.stage.scene&&(this.stage.scene.scene.remove(this.debugLines),this.debugLines.geometry.dispose(),this.debugLines.material.dispose(),this.debugLines=null)}ensureToolVisuals(){let e=this.stage.scene?.scene;e&&(this.debugCursor??=new Ie(e),this.placementGhost??=new Fe(e),this.selectionHighlight??=new Qe(e))}updateSelectionHighlight(){let e=this.selectionHighlight;if(!e)return;let t=u.selectedEntityIds;if(t.length===0){e.hide();return}let i=[];for(let r of t){let n=this.resolveEntity(r),o=this.selectionBoundsPool[i.length]??=new zt,a=W(n,o);a&&i.push(a)}e.update(i)}parkToolVisuals(e){e!=="add"&&this.placementGhost?.hide(),e!=="select"&&e!=="delete"&&!u.pickMode&&this.debugCursor?.hide(),e==="none"&&!u.enabled&&this.selectionHighlight?.hide()}disposeToolVisuals(){this.debugCursor?.dispose(),this.debugCursor=null,this.placementGhost?.dispose(),this.placementGhost=null,this.selectionHighlight?.dispose(),this.selectionHighlight=null}update(){let e=this.getDebugViewCamera();if(!this.stage.scene||!this.stage.world||!e)return;let{world:t}=this.stage,i=oe();if(this.ensureInteraction(),this.ensureToolVisuals(),u.enabled?(this.initDebugVisuals(),this.updateColliderWireframes(t)):this.disposeDebugVisuals(),this.updatePlacementGhost(i,t),this.updateSelectionHighlight(),rt(i)){this.debugCursor?.hide(),this.transformTool.update(),this.transformTool.isDragging||this.transformTool.hover(this.currentRay());return}if(this.transformTool.update(),!(i==="select"||i==="delete"||u.pickMode)){this.debugCursor?.hide();return}let n=this.currentRay(),o=t.raycast(n.origin,n.direction,this.options.maxRayDistance);o?st(o.uuid??null):le();let a=Ut();if(!a){this.debugCursor?.hide();return}let l=W(this.resolveEntity(a),this.hoverBounds);if(!l){this.debugCursor?.hide();return}switch(i){case"select":this.debugCursor?.setColor(Sr);break;case"delete":this.debugCursor?.setColor(Ss);break;default:this.debugCursor?.setColor(u.pickMode?Sr:16777215);break}this.debugCursor?.updateFromBounds(l)}pickAtNdc(e,t,i={}){let r=i.updateHover??u.pickMode;this.mouseNdc.set(e,t);let n=this.stage.world;if(!n||!this.getDebugViewCamera())return r&&le(),null;let o=this.currentRay(),l=n.raycast(o.origin,o.direction,this.options.maxRayDistance)?.uuid??null;if(!l)return r&&le(),null;r&&st(l);let c=this.resolveEntity(l);return{uuid:l,name:c?.name??""}}applySwatches(e){return this.swatchApplier.applySwatches(e)}updateColliderWireframes(e){if(!this.debugLines)return;let t=e.simulation.getDebugRender();t&&t.vertices.length>0?(this.debugLines.geometry.setAttribute("position",new br(new Float32Array(t.vertices),3)),this.debugLines.geometry.setAttribute("color",new br(new Float32Array(t.colors),4)),this.debugLines.geometry.attributes.position.needsUpdate=!0,this.debugLines.geometry.attributes.color.needsUpdate=!0,this.debugLines.visible=!0):this.debugLines.visible=!1}ensureInteraction(){this.domListenersAttached||!ae()||(this.domListenersAttached=this.attachDomListeners())}updatePlacementGhost(e,t){let i=this.placementGhost;if(!i)return;let r=u.addTypeId;if(e!=="add"||!r){i.hide();return}i.setType(r,u.addTypeProps??null);let n=this.currentRay(),o=t.raycast(n.origin,n.direction,this.options.maxRayDistance)??null,a=Mt(n,o,B(),i.measure());if(!a){i.hide();return}i.showAt(a.position)}dispose(){this.focusContextUnregister?.(),this.focusContextUnregister=null,this.entityResolverUnregister?.(),this.entityResolverUnregister=null,this.debugStateUnsubscribe?.(),this.debugStateUnsubscribe=null,this.endPointerCapture(),this.marquee.dispose(),this.transformTool.dispose(),this.swatchApplier.dispose(),this.grid.dispose(),this.deactivate(),this.disposeToolVisuals(),this.domDisposeFns.forEach(e=>e()),this.domDisposeFns=[],this.domListenersAttached=!1}applySceneOperation(e,t){let i=t==="undo";switch(e.kind){case"transform":ar(e,t,r=>this.resolveEntity(r));break;case"create":for(let r of e.entries)i?this.stage.entityDelegate.detachEntity(r.uuid):this.stage.entityDelegate.restoreEntity(r.uuid);break;case"delete":for(let r of e.entries)i?this.stage.entityDelegate.restoreEntity(r.uuid):this.stage.entityDelegate.detachEntity(r.uuid);break;case"swatch":this.swatchApplier.applySceneOperation(e,t);break}}currentRay(){let e=this.getDebugViewCamera();return e?(this.raycaster.setFromCamera(this.mouseNdc,e.camera),{origin:this.raycaster.ray.origin.clone(),direction:this.raycaster.ray.direction.clone().normalize()}):{origin:new Vt,direction:new Vt(0,0,-1)}}handleAction(e,t={shiftKey:!1,altKey:!1}){let i=oe();if(i!=="select"&&i!=="delete"&&i!=="add")return;let n=this.stage.world?.raycast(e.origin,e.direction,this.options.maxRayDistance)??null;switch(i){case"select":{let o=n?.uuid??null,a=o&&this.resolveEntity(o)?o:null;t.altKey?a&&Zt([a]):t.shiftKey?a&&Nt(a):a?nt(a):nt(null);break}case"delete":{let o=n?.uuid??null;if(!o)break;this.stage.entityDelegate.detachEntity(o)&&U({opId:Cr(10),kind:"delete",label:"Delete entity",entries:[{uuid:o}]});break}case"add":this.placeEntity(e,n);break}}placeEntity(e,t){let i=Mt(e,t,B());if(!i)return;let{position:r,normal:n}=i,o=u.addTypeId?de(u.addTypeId):null;if(!o&&!this.options.addEntityFactory){this.warnMissingAddSource();return}let a=o?o.create({position:{x:r.x,y:r.y,z:r.z},normal:{x:n.x,y:n.y,z:n.z},props:{...o.defaultProps??{},...u.addTypeProps??{}}}):this.options.addEntityFactory({position:r,normal:n});a&&Promise.resolve(a).then(async l=>{l&&(await this.stage.entityDelegate.spawnEntity(l),this.restOnSurface(l,r,n),U({opId:Cr(10),kind:"create",label:`Add ${o?.label??"entity"}`,entries:[{uuid:l.uuid}]}))}).catch(l=>{console.error("Add tool: failed to spawn entity",l)})}restOnSurface(e,t,i){let r=e?.group??e?.mesh;if(!r||typeof e.setPose!="function"||(Bt.setFromObject(r),Bt.isEmpty()))return;Bt.getSize(Pr);let n=xt(t,Pr,i);n.equals(t)||e.setPose({position:{x:n.x,y:n.y,z:n.z}})}warnMissingAddSource(){if(this.warnedMissingAddFactory)return;this.warnedMissingAddFactory=!0;let e="Add tool: no entity type is armed and no `addEntityFactory` is configured, so there is nothing to spawn.";console.warn(e),$t("warn",e)}attachDomListeners(){let e=this.stage.rendererManager?.getDomElement();if(!e)return!1;let t=a=>{let l=e.getBoundingClientRect(),c=(a.clientX-l.left)/l.width*2-1,d=-((a.clientY-l.top)/l.height*2-1);this.mouseNdc.set(c,d)},i=a=>{if(t(a),this.marquee.isArmed){this.marquee.pointerMove(this.mouseNdc,a);return}this.transformTool.isDragging&&this.transformTool.pointerMove(this.currentRay(),a.altKey)},r=a=>{if(a.button!==0)return;t(a);let l=this.currentRay();if(this.transformTool.pointerDown(l)){this.beginPointerCapture(e,a.pointerId);return}if(oe()==="select"){this.marquee.pointerDown(this.mouseNdc,a,e),this.beginPointerCapture(e,a.pointerId);return}this.handleAction(l,a)},n=a=>{if(this.marquee.isArmed){let l=this.marquee.pointerUp(this.mouseNdc);this.endPointerCapture(),l==="click"&&this.handleAction(this.currentRay(),a);return}this.transformTool.isDragging&&(this.transformTool.pointerUp(),this.endPointerCapture())},o=a=>{if(this.marquee.isArmed){this.marquee.cancel(),this.endPointerCapture();return}n(a)};return e.addEventListener("pointermove",i),e.addEventListener("pointerdown",r),e.addEventListener("pointerup",n),e.addEventListener("pointercancel",o),this.domDisposeFns.push(()=>e.removeEventListener("pointermove",i),()=>e.removeEventListener("pointerdown",r),()=>e.removeEventListener("pointerup",n),()=>e.removeEventListener("pointercancel",o)),!0}beginPointerCapture(e,t){this.getDebugViewCamera()?.setOrbitInteractionEnabled(!1);try{e.setPointerCapture(t),this.capturedPointer={element:e,pointerId:t}}catch{this.capturedPointer=null}}endPointerCapture(){if(this.getDebugViewCamera()?.setOrbitInteractionEnabled(!0),!!this.capturedPointer){try{this.capturedPointer.element.releasePointerCapture(this.capturedPointer.pointerId)}catch{}this.capturedPointer=null}}};import{Vector2 as Ps}from"three";var $e=class{stage;constructor(e){this.stage=e}createDefaultCamera(){let e=window.innerWidth,t=window.innerHeight,i=new Ps(e,t);return new x(y.ThirdPerson,i)}resolveCamera(e,t){return e||(t?t.cameraRef:this.createDefaultCamera())}buildCameraManager(e,...t){let i=new _e;if(e)return i.addCamera(e,e.name||"main"),i;let r=t.filter(n=>n!==void 0);if(r.length>0){for(let n of r){let o=n.cameraRef;i.addCamera(o,o.name||void 0)}for(let n=1;n<r.length;n++)i.addActiveCamera(r[n].cameraRef)}else{let n=this.createDefaultCamera();i.addCamera(n,"default")}return i}};var Xe=class{loadingHandlers=[];stageName;stageIndex;setStageContext(e,t){this.stageName=e,this.stageIndex=t}onLoading(e){return this.loadingHandlers.push(e),()=>{this.loadingHandlers=this.loadingHandlers.filter(t=>t!==e)}}emit(e){for(let i of this.loadingHandlers)try{i(e)}catch(r){console.error("Loading handler failed",r)}let t={...e,stageName:this.stageName,stageIndex:this.stageIndex};e.type==="start"?se.emit("stage:loading:start",t):e.type==="progress"?se.emit("stage:loading:progress",t):e.type==="complete"&&se.emit("stage:loading:complete",t)}emitStart(e="Loading stage..."){this.emit({type:"start",message:e,progress:0})}emitProgress(e,t,i){let r=i>0?t/i:0;this.emit({type:"progress",message:e,progress:r,current:t,total:i})}emitComplete(e="Stage loaded"){this.emit({type:"complete",message:e,progress:1})}dispose(){this.loadingHandlers=[]}};var Je=class{scene=null;onEntityReady=null;pendingEntities=new Map;modelLoadedHandler=null;attach(e,t){this.scene=e,this.onEntityReady=t??null,this.modelLoadedHandler=i=>{this.handleModelLoaded(i.entityId,i.success)},M.on("entity:model:loaded",this.modelLoadedHandler)}observe(e){if(e.group||e.mesh){K(e.options)||(this.scene?.addEntityGroup(e),j(e),V(e),this.onEntityReady?.(e));return}this.pendingEntities.set(e.uuid,e)}unobserve(e){this.pendingEntities.delete(e)}handleModelLoaded(e,t){let i=this.pendingEntities.get(e);if(!i||!t){this.pendingEntities.delete(e);return}this.scene?.addEntityGroup(i),j(i),V(i),K(i.options)||this.onEntityReady?.(i),this.pendingEntities.delete(e)}dispose(){this.modelLoadedHandler&&(M.off("entity:model:loaded",this.modelLoadedHandler),this.modelLoadedHandler=null),this.pendingEntities.clear(),this.onEntityReady=null,this.scene=null}};import{StageBodyKind as wr}from"@zylem/behaviors/core";var ws=200,et=class s{static EMPTY_BEHAVIOR_LINKS=[];children=[];childrenMap=new Map;debugMap=new Map;detachedMap=new Map;pendingEntities=[];pendingPromises=[];_isLoaded=!1;entityAddedHandlers=[];behaviorSystems=[];behaviorSystemByKey=new Map;registeredSystemKeys=new Set;behaviorEntityIndex=new Map;behaviorLinksByUuid=new Map;scene=null;world=null;renderStrategy=null;camera=null;wasmStage=null;loadingDelegate;entityModelDelegate;constructor(e,t){this.loadingDelegate=e,this.entityModelDelegate=t}get isLoaded(){return this._isLoaded}set isLoaded(e){this._isLoaded=e}attach(e){this.scene=e.scene,this.world=e.world,this.renderStrategy=e.renderStrategy,this.camera=e.camera,this.wasmStage=e.world.simulation.adapter}async spawnEntity(e){if(!this.scene||!this.world)return;if(e instanceof re){e.create();for(let i of e.getChildren())i instanceof H&&await this.spawnEntity(i);e.nodeSetup({me:e,globals:v(),camera:this.camera}),this.addEntityToStage(e);return}let t=e.create();ri(t),this.registerBehaviorLinks(t),this.ensureEnvironmentStatic(t),this.maybeAttachEntityPhysics(t);for(let i of e.getChildren())i instanceof H&&await this.spawnEntity(i);e.nodeSetup({me:e,globals:v(),camera:this.camera}),this.tryRegisterRenderStrategy(t),_(t)||this.scene.addEntityGroup(t),V(t),this.addEntityToStage(t),this.entityModelDelegate.observe(t),ni(t)}handleLateModelReady(e){!this.world||!this.scene||!this.childrenMap.has(e.uuid)||(this.ensureEnvironmentStatic(e),this.maybeAttachEntityPhysics(e),this.tryRegisterRenderStrategy(e),_(e)||this.scene.addEntityGroup(e),V(e))}tryRegisterRenderStrategy(e){this.renderStrategy&&this.renderStrategy.register(e)}ensureEnvironmentStatic(e){if(q(e.options)!=="environment")return;let t=e.options.collision??{};t.static!==!0&&(console.warn(`category 'environment' forces static collision for entity '${e.name||e.uuid}'`),e.options.collision={...t,static:!0}),e.bodyDesc&&e.bodyDesc.kind!==wr.Static&&(e.bodyDesc.kind=wr.Static)}maybeAttachEntityPhysics(e){if(!(!this.world||e.physicsAttached||!e.colliderDesc)){if(e instanceof he){if(e.needsDeferredModelCollision())return;e.synchronizeRuntimeCollider()}this.world.addEntity(e)}}addEntityToStage(e){this.childrenMap.set(e.uuid,e),u.enabled&&this.debugMap.set(e.uuid,e);for(let t of this.entityAddedHandlers)try{t(e)}catch(i){console.error("onEntityAdded handler failed",i)}}removeEntityByUuid(e){return this.detachEntity(e)}detachEntity(e){if(!this.scene||!this.world)return!1;let t=this.world.collisionMap.get(e),i=this.childrenMap.get(e),r=t??i??this.debugMap.get(e);if(!r)return!1;let n=typeof r.getPose=="function"?r.getPose():null;return this.unregisterBehaviorLinks(r),this.entityModelDelegate.unobserve(e),_(r)&&this.renderStrategy?.unregister(r),this.world.destroyEntity(r),r.group?this.scene.scene.remove(r.group):r.mesh&&this.scene.scene.remove(r.mesh),this.childrenMap.delete(e),this.debugMap.delete(e),this.detachedMap.set(e,{entity:r,position:n?.position??null,rotation:n?.rotation??null}),this.evictOldestDetached(),M.emit("entity:destroyed",{entityId:e}),!0}restoreEntity(e){if(!this.scene||!this.world)return!1;let t=this.detachedMap.get(e);if(!t)return!1;this.detachedMap.delete(e);let{entity:i,position:r,rotation:n}=t;return i.bodyDesc&&(r&&(i.bodyDesc.position=[r.x,r.y,r.z]),n&&(i.bodyDesc.rotation=[n.x,n.y,n.z,n.w])),this.registerBehaviorLinks(i),this.maybeAttachEntityPhysics(i),this.tryRegisterRenderStrategy(i),_(i)||this.scene.addEntityGroup(i),ii(i),si(i),this.addEntityToStage(i),this.entityModelDelegate.observe(i),!0}isDetached(e){return this.detachedMap.has(e)}evictOldestDetached(){for(;this.detachedMap.size>ws;){let e=this.detachedMap.keys().next();if(e.done)return;let t=this.detachedMap.get(e.value);if(this.detachedMap.delete(e.value),!!t){try{t.entity.nodeDestroy?.({me:t.entity,globals:v()})}catch{}I(t.entity)}}}getEntityByName(e){for(let t of this.childrenMap.values())if(t.name===e)return t;return console.warn(`Entity ${e} not found`),null}buildEntityState(e){return e instanceof oi?{...e.buildInfo()}:{uuid:e.uuid,name:e.name}}onEntityAdded(e,t){return this.entityAddedHandlers.push(e),t?.replayExisting&&this._isLoaded&&this.childrenMap.forEach(i=>{try{e(i)}catch(r){console.error("onEntityAdded replay failed",r)}}),()=>{this.entityAddedHandlers=this.entityAddedHandlers.filter(i=>i!==e)}}enqueue(...e){for(let t of e)if(t){if(D(t)){this.handleEntityImmediatelyOrQueue(t);continue}if(typeof t=="function"){try{let i=t();D(i)?this.handleEntityImmediatelyOrQueue(i):ie(i)&&this.handlePromiseWithSpawnOnResolve(i)}catch(i){console.error("Error executing entity factory",i)}continue}ie(t)&&this.handlePromiseWithSpawnOnResolve(t)}}handleEntityImmediatelyOrQueue(e){this._isLoaded?this.spawnEntity(e):this.children.push(e)}handlePromiseWithSpawnOnResolve(e){this._isLoaded?e.then(t=>this.spawnEntity(t)).catch(t=>console.error("Failed to build async entity",t)):this.pendingPromises.push(e)}yieldToEventLoop(){return new Promise(e=>{let t=new MessageChannel;t.port1.onmessage=()=>e(),t.port2.postMessage(void 0)})}async runEntityLoadGenerator(){let t=0;if(this.pendingEntities.length){let n=[...this.pendingEntities];this.pendingEntities=[],this.enqueue(...n)}let i=[...this.pendingPromises];this.pendingPromises=[];let r=this.children.length+i.length;for(let n of this.children)await this.spawnEntity(n),t++,this.loadingDelegate.emitProgress(`Loaded ${n.name||"unknown"}`,t,r),t%5===0&&await this.yieldToEventLoop();for(let n of i){try{let o=await n;o&&await this.spawnEntity(o)}catch(o){console.error("Failed to resolve pending stage entity",o)}t++,this.loadingDelegate.emitProgress("Loaded async entity",t,r),t%5===0&&await this.yieldToEventLoop()}t%5!==0&&await this.yieldToEventLoop()}registerSystem(e){if(!this.world||!this.scene)return;let t;typeof e=="function"?t=e({world:this.world,scene:this.scene,getBehaviorLinks:i=>this.behaviorEntityIndex.get(i)??s.EMPTY_BEHAVIOR_LINKS,createEntity:dt,getGlobals:v}):t=e,this.behaviorSystems.push(t)}destroyAll(){for(let t of this.behaviorSystems)t.destroy?.();this.behaviorSystems.length=0,this.behaviorSystemByKey.clear(),this.registeredSystemKeys.clear(),this.behaviorEntityIndex.clear(),this.behaviorLinksByUuid.clear();let e=[];this.childrenMap.forEach(t=>{try{t.nodeDestroy({me:t,globals:v()})}catch{}I(t),e.push(t.uuid)}),this.detachedMap.forEach(({entity:t})=>{try{t.nodeDestroy?.({me:t,globals:v()})}catch{}I(t)}),this.detachedMap.clear(),this.childrenMap.clear(),this.debugMap.clear(),this.entityAddedHandlers=[];for(let t of e)M.emit("entity:destroyed",{entityId:t});this._isLoaded=!1,this.scene=null,this.world=null,this.renderStrategy=null,this.camera=null,this.wasmStage=null}registerBehaviorLinks(e){if(!this.world||!this.scene||typeof e?.getBehaviorRefs!="function")return;let t=e.getBehaviorRefs();if(!Array.isArray(t)||t.length===0)return;let i=[];for(let r of t)i.push(this.linkBehaviorRef(e,r));this.behaviorLinksByUuid.set(e.uuid,i)}linkBehaviorRef(e,t){let i=t.descriptor.key,r={entity:e,ref:t},n=this.behaviorEntityIndex.get(i);n||(n=new Set,this.behaviorEntityIndex.set(i,n)),n.add(r);let o=this.behaviorSystemByKey.get(i);if(!o&&!this.registeredSystemKeys.has(i)){let a=t.descriptor.systemFactory({world:this.world,scene:this.scene,wasmStage:this.wasmStage,getBehaviorLinks:l=>this.behaviorEntityIndex.get(l)??s.EMPTY_BEHAVIOR_LINKS,createEntity:dt,getGlobals:v});o=a,this.behaviorSystems.push(a),this.behaviorSystemByKey.set(i,a),this.registeredSystemKeys.add(i)}return o?.attach?.(r),r}unlinkBehaviorLink(e){let t=e.ref?.descriptor?.key;if(!t)return;this.behaviorSystemByKey.get(t)?.detach?.(e);let i=this.behaviorEntityIndex.get(t);i&&(i.delete(e),i.size===0&&this.behaviorEntityIndex.delete(t))}syncBehaviorLinks(e){this.unregisterBehaviorLinks(e),this.registerBehaviorLinks(e)}attachBehaviorLink(e,t){if(!this.world||!this.scene||!e?.uuid)return!1;let i=this.behaviorLinksByUuid.get(e.uuid)??[];return i.some(r=>r.ref===t)?!1:(i.push(this.linkBehaviorRef(e,t)),this.behaviorLinksByUuid.set(e.uuid,i),!0)}detachBehaviorLink(e,t){let i=this.behaviorLinksByUuid.get(e?.uuid);if(!i)return!1;let r=i.findIndex(o=>o.ref===t);if(r===-1)return!1;let[n]=i.splice(r,1);return n&&this.unlinkBehaviorLink(n),i.length===0&&this.behaviorLinksByUuid.delete(e.uuid),!0}unregisterBehaviorLinks(e){let t=this.behaviorLinksByUuid.get(e?.uuid);if(t){for(let i of t)this.unlinkBehaviorLink(i);this.behaviorLinksByUuid.delete(e.uuid)}}};var xs="Stage",tt=class extends ze{type=xs;state={...ci};gravity;world;scene;renderStrategy=null;debugDelegate=null;uuid;wrapperRef=null;camera;cameras=[];cameraRef=null;cameraManagerRef=null;rendererManager=null;cameraDelegate;loadingDelegate;entityModelDelegate;childUpdateParams={};entityDelegate;constructor(e=[]){super(),this.world=null,this.scene=null,this.uuid=Es(),this.cameraDelegate=new $e(this),this.loadingDelegate=new Xe,this.entityModelDelegate=new Je,this.entityDelegate=new et(this.loadingDelegate,this.entityModelDelegate);let t=qi(e);this.camera=t.camera,this.cameras=t.cameras,this.entityDelegate.children=t.entities,t.asyncEntities.length&&this.entityDelegate.enqueue(...t.asyncEntities),this.state={...this.state,inputs:t.config.inputs,backgroundColor:t.config.backgroundColor,backgroundImage:t.config.backgroundImage,backgroundShader:t.config.backgroundShader,gravity:t.config.gravity,variables:t.config.variables,physicsRate:t.config.physicsRate,assetLoaders:t.config.assetLoaders,defaultLighting:t.config.defaultLighting,postProcessingEffects:t.config.postProcessingEffects,entities:[]},this.gravity=t.config.gravity??new xr(0,0,0)}setState(){let{backgroundColor:e,backgroundImage:t}=this.state,i=e instanceof Er?e:new Er(e);di(i),ui(t),pi(this.state.variables??{})}resolveRenderer(e){return this.rendererManager?.renderer?this.rendererManager.renderer:e.renderer?e.renderer:null}async load(e,t,i){this.setState(),i&&(this.rendererManager=i),this.rendererManager&&(this.cameraManagerRef=this.cameraDelegate.buildCameraManager(t,...this.cameras));let r=this.cameraManagerRef?.primaryCamera??this.cameraDelegate.resolveCamera(t,this.camera);this.cameraRef=r,this.scene=new Be(e,r,this.state);let n=this.gravity??new xr(0,0,0);if(this.world=await Ae.create(n,this.state.physicsRate),this.scene.setup(),this.cameraManagerRef&&this.rendererManager){await this.scene.setupCameraManager(this.scene.scene,this.cameraManagerRef,this.rendererManager);let a=this.cameraManagerRef.primaryCamera;a&&(this.rendererManager.setPostProcessingEffects(this.state.postProcessingEffects??[]),this.rendererManager.setupPostProcessing(this.scene.scene,a.camera)),this.rendererManager.startRenderLoop(()=>{this.cameraManagerRef?.render(this.scene.scene)})}else await this.scene.setupCamera(this.scene.scene,r);let o=this.resolveRenderer(r);await z.configureGLTFRuntime({renderer:o,...Le(this.state.assetLoaders?.gltf)}),this.entityModelDelegate.attach(this.scene,a=>this.entityDelegate.handleLateModelReady(a)),this.renderStrategy=new be,this.renderStrategy.setScene(this.scene.scene),this.entityDelegate.attach({scene:this.scene,world:this.world,renderStrategy:this.renderStrategy,camera:r}),this.loadingDelegate.emitStart(),await this.entityDelegate.runEntityLoadGenerator(),this.entityDelegate.isLoaded=!0,this.loadingDelegate.emitComplete()}hasSetup=!1;_setup(e){if(!this.hasSetup){if(!this.scene||!this.world){this.logMissingEntities();return}this.debugDelegate=new Ye(this),this.hasSetup=!0}}_update(e){let{delta:t}=e;if(!this.scene||!this.world){this.logMissingEntities();return}let i=this.world,r=this.scene;E("behaviorSystems",()=>{for(let n of this.entityDelegate.behaviorSystems)n.update(void 0,t)}),E("entityLoop",()=>{for(let n of this.entityDelegate.childrenMap.values()){let o=this.childUpdateParams;o.delta=e.delta,o.inputs=e.inputs,o.globals=e.globals,o.camera=e.camera,o.stage=e.stage,o.game=e.game,o.me=n,n.nodeUpdate(o);let a=n;a.transformStore&&fi(a,a.transformStore),n.markedForRemoval&&this.entityDelegate.removeEntityByUuid(n.uuid)}}),E("worldUpdate",()=>{i.update(e)}),E("behaviorPostUpdate",()=>{for(let n of this.entityDelegate.behaviorSystems)n.postUpdate?.(void 0,t)}),E("syncRenderPoses",()=>{Yi({_childrenMap:this.entityDelegate.childrenMap,_world:i})}),E("renderStrategy",()=>{this.renderStrategy?.update(i.interpolationAlpha)}),E("camera",()=>{this.cameraManagerRef?this.cameraManagerRef.update(t):this.cameraRef?.update(t)}),E("scene",()=>{r.update({delta:t})}),Ai()}outOfLoop(){this.debugUpdate()}debugUpdate(){ae()&&(ht("debugUpdate"),this.debugDelegate?.update(),mt())}_destroy(e){this.entityDelegate.destroyAll(),this.world?.destroy(),this.scene?.destroy(),this.debugDelegate?.dispose(),this.debugDelegate=null,this.entityModelDelegate.dispose(),this.renderStrategy?.dispose(),this.renderStrategy=null,this.rendererManager&&this.rendererManager.stopRenderLoop(),this.world=null,this.scene=null,this.cameraRef=null,this.cameraManagerRef=null,hi(),I(this)}async spawnEntity(e){return this.entityDelegate.spawnEntity(e)}buildEntityState(e){return this.entityDelegate.buildEntityState(e)}onEntityAdded(e,t){return this.entityDelegate.onEntityAdded(e,t)}onLoading(e){return this.loadingDelegate.onLoading(e)}registerSystem(e){return this.entityDelegate.registerSystem(e),this}removeEntityByUuid(e){return this.entityDelegate.removeEntityByUuid(e)}getEntityByName(e){return this.entityDelegate.getEntityByName(e)}enqueue(...e){this.entityDelegate.enqueue(...e)}logMissingEntities(){console.warn("Zylem world or scene is null")}addCamera(e,t){return this.cameraManagerRef?this.cameraManagerRef.addCamera(e,t):(console.warn("ZylemStage: CameraManager not available. Ensure stage is loaded with a RendererManager."),null)}removeCamera(e){return this.cameraManagerRef?.removeCamera(e)??!1}setActiveCamera(e){return this.cameraManagerRef?.setActiveCamera(e)??!1}getCamera(e){return this.cameraManagerRef?.getCamera(e)??null}resize(e,t){this.scene&&this.scene.updateRenderer(e,t)}};import{proxy as Ms}from"valtio/vanilla";import{Vector3 as Ts}from"three";var Ds={backgroundColor:ge,backgroundImage:null,inputs:{p1:["gamepad-1","keyboard"],p2:["gamepad-2","keyboard"]},gravity:new Ts(0,0,0),variables:{}},A=Ms({...Ds});function Mr(s){let e=Rs(),t={};return typeof s[0]=="object"&&(t=s.shift()??{}),[{...e,...t},...s]}function Rs(){return{backgroundColor:A.backgroundColor,backgroundImage:A.backgroundImage??null,inputs:A.inputs?{...A.inputs}:void 0,gravity:A.gravity,variables:A.variables?{...A.variables}:void 0}}var It=class{wrappedStage;options=[];_pendingEntities=[];setupCallbacks=[];updateCallbacks=[];destroyCallbacks=[];pendingLoadingCallbacks=[];eventDelegate=new Wt;inputConfig=null;onInputConfigChanged=null;constructor(e){this.options=e,this.wrappedStage=null;let t=this.options[0];z.prepareGLTFRuntime(Le(t?.assetLoaders?.gltf))}setInputConfiguration(...e){return this.inputConfig=jt(...e),this.onInputConfigChanged&&this.onInputConfigChanged(),this}async load(e,t,i){fe.entities=[];let r=[...this.options,...this._pendingEntities];this._pendingEntities=[],this.wrappedStage=new tt(r),this.wrappedStage.wrapperRef=this,this.pendingLoadingCallbacks.forEach(c=>{this.wrappedStage.onLoading(c)}),this.pendingLoadingCallbacks=[];let n=t instanceof C?t.cameraRef:t;await this.wrappedStage.load(e,n,i);let o=null,a=!1,l=()=>{if(a=!1,!o?.length){o=null;return}let c=o;o=null,fe.entities=[...fe.entities,...c]};this.wrappedStage.onEntityAdded(c=>{if(K(c.options))return;let d=this.wrappedStage.buildEntityState(c);o||(o=[]),o.push(d),a||(a=!0,queueMicrotask(l))},{replayExisting:!0}),this.applyLifecycleCallbacks()}applyLifecycleCallbacks(){this.wrappedStage&&(this.setupCallbacks.length>0&&(this.wrappedStage.setup=e=>{let t={...e,stage:this};this.setupCallbacks.forEach(i=>i(t))}),this.updateCallbacks.length>0&&(this.wrappedStage.update=e=>{let t={...e,stage:this};this.updateCallbacks.forEach(i=>i(t))}),this.destroyCallbacks.length>0&&(this.wrappedStage.destroy=e=>{let t={...e,stage:this};this.destroyCallbacks.forEach(i=>i(t))}))}async addEntities(e){this._pendingEntities.push(...e),this.wrappedStage&&this.wrappedStage.enqueue(...e)}add(...e){this.addToBlueprints(...e),this.addToStage(...e)}addToBlueprints(...e){this.wrappedStage||this.options.push(...e)}addToStage(...e){this.wrappedStage&&this.wrappedStage.enqueue(...e)}start(e){!this.wrappedStage||this.wrappedStage.hasSetup||this.wrappedStage.nodeSetup(e)}onUpdate(...e){return this.updateCallbacks.push(...e),this.wrappedStage&&(this.wrappedStage.update=t=>{let i={...t,stage:this};this.updateCallbacks.forEach(r=>r(i))}),this}onSetup(...e){return this.setupCallbacks.push(...e),this.wrappedStage&&(this.wrappedStage.setup=t=>{let i={...t,stage:this};this.setupCallbacks.forEach(r=>r(i))}),this}onDestroy(...e){return this.destroyCallbacks.push(...e),this.wrappedStage&&(this.wrappedStage.destroy=t=>{let i={...t,stage:this};this.destroyCallbacks.forEach(r=>r(i))}),this}onLoading(e){return this.wrappedStage?this.wrappedStage.onLoading(e):(this.pendingLoadingCallbacks.push(e),()=>{this.pendingLoadingCallbacks=this.pendingLoadingCallbacks.filter(t=>t!==e)})}getEntityByName(e,t){return this.wrappedStage?.getEntityByName(e)}addCamera(e,t){let i=e instanceof C?e.cameraRef:e;return this.wrappedStage?.addCamera(i,t)??null}removeCamera(e){return e instanceof C?this.wrappedStage?.removeCamera(e.cameraRef)??!1:this.wrappedStage?.removeCamera(e)??!1}setActiveCamera(e){return e instanceof C?this.wrappedStage?.setActiveCamera(e.cameraRef)??!1:this.wrappedStage?.setActiveCamera(e)??!1}getCamera(e){return this.wrappedStage?.getCamera(e)??null}dispatch(e,t){this.eventDelegate.dispatch(e,t),M.emit(e,t)}listen(e,t){return this.eventDelegate.listen(e,t)}dispose(){this.eventDelegate.dispose()}};function Dd(...s){let e=Mr(s);return new It([...e])}export{Is as a,ye as b,q as c,K as d,_ as e,ve as f,be as g,to as h,y as i,k as j,Pe as k,F as l,G as m,X as n,J as o,ee as p,te as q,L as r,_e as s,C as t,Ma as u,Oa as v,un as w,It as x,Dd as y};
@@ -0,0 +1 @@
1
+ import{Vector3 as c}from"three";var l=.02,m=.05,a=.1,B=1;function x(e){return!!e&&typeof e.getSelectionBounds=="function"}var i=new c;function s(e){return!e.isEmpty()&&Number.isFinite(e.min.x)&&Number.isFinite(e.min.y)&&Number.isFinite(e.min.z)&&Number.isFinite(e.max.x)&&Number.isFinite(e.max.y)&&Number.isFinite(e.max.z)}function S(e,n,t){return Math.min(t,Math.max(n,e))}function p(e){if(!s(e))return e;e.getSize(i);let n=Math.max(i.x,i.y,i.z),t=S(n*m,a,B);for(let o of["x","y","z"]){let r=i[o];if(r>=t)continue;let u=(t-r)/2;e.min[o]-=u,e.max[o]+=u}return e.expandByScalar(n*l),e}function f(e,n){return n.setFromObject(e),p(n)}function I(e,n){if(!e)return null;let t;if(x(e))t=e.getSelectionBounds(n);else{let o=e,r=o.group??o.mesh??null;if(!r)return null;t=f(r,n)}return t&&s(t)?t:null}export{l as a,m as b,a as c,B as d,p as e,f,I as g};
File without changes
@@ -1 +1 @@
1
- import{b as c,o as b}from"./chunk-2HSR5XDQ.js";import{B as y,E as g,H as f,K as x,N as z,j as s,m as p,p as d,s as h,v as u,y as m}from"./chunk-X7T7QRYP.js";import{a as w}from"./chunk-VUJXR5K5.js";import{Vector3 as S}from"three";var C='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">';function t(r){return`${C}${r}</svg>`}var i={box:t('<path d="M12 2.5 21 7v10l-9 4.5L3 17V7z"/><path d="M3 7l9 4.5L21 7"/><path d="M12 11.5v10"/>'),sphere:t('<circle cx="12" cy="12" r="9"/><ellipse cx="12" cy="12" rx="9" ry="3.5"/>'),cone:t('<path d="M12 3 20 18H4z"/><ellipse cx="12" cy="18" rx="8" ry="3"/>'),pyramid:t('<path d="M12 3 21 19H3z"/><path d="M12 3v16"/><path d="M3 19l9-5 9 5"/>'),cylinder:t('<ellipse cx="12" cy="6" rx="7" ry="3"/><path d="M5 6v12"/><path d="M19 6v12"/><ellipse cx="12" cy="18" rx="7" ry="3"/>'),pill:t('<rect x="7" y="3" width="10" height="18" rx="5"/><path d="M7 12h10"/>'),disk:t('<ellipse cx="12" cy="12" rx="9" ry="4"/><ellipse cx="12" cy="12" rx="3" ry="1.3"/>'),plane:t('<path d="M2 17 12 11l10 6-10 5z"/><path d="M12 11V4"/>'),zone:t('<rect x="3.5" y="3.5" width="17" height="17" rx="2" stroke-dasharray="3 2.5"/>'),rect:t('<rect x="3.5" y="6" width="17" height="12" rx="1.5"/>'),light:t('<circle cx="12" cy="9" r="4.5"/><path d="M12 2v1.5"/><path d="M12 14.5V22"/><path d="M4.9 4.9 6 6"/><path d="M19.1 4.9 18 6"/><path d="M2 9h1.5"/><path d="M20.5 9H22"/>')};function n(r,e,v,k,M,P){return{id:r,label:e,description:v,icon:k,group:"Shapes",tags:P,defaultProps:{size:{x:1,y:1,z:1}},create:M}}function o(r){let e=r.size;return new S(e?.x??1,e?.y??1,e?.z??1)}var T=[n("box","Box","Cuboid mesh with a matching box collider.",i.box,({position:r,props:e})=>s({position:r,size:o(e),...e}),["cube","block","platform","wall"]),n("sphere","Sphere","Ball mesh with a sphere collider.",i.sphere,({position:r,props:e})=>p({position:r,size:o(e),...e}),["ball","orb","round"]),n("cone","Cone","Cone mesh with a cone collider.",i.cone,({position:r,props:e})=>d({position:r,size:o(e),...e}),["spike","point"]),n("pyramid","Pyramid","Four-sided pyramid mesh and collider.",i.pyramid,({position:r,props:e})=>h({position:r,size:o(e),...e}),["tetra","spike"]),n("cylinder","Cylinder","Cylinder mesh with a matching collider.",i.cylinder,({position:r,props:e})=>u({position:r,size:o(e),...e}),["tube","pillar","column"]),n("pill","Pill","Capsule mesh with a capsule collider.",i.pill,({position:r,props:e})=>m({position:r,size:o(e),...e}),["capsule","character"]),n("disk","Disk","Flat cylinder, useful for pucks and platforms.",i.disk,({position:r,props:e})=>y({position:r,size:o(e),...e}),["puck","coin","circle"]),{id:"plane",label:"Plane",description:"Static ground plane with a tiled surface.",icon:i.plane,group:"Scene",tags:["ground","floor","terrain"],defaultProps:{size:{x:10,y:1,z:10}},create:({position:r,props:e})=>g({position:r,size:o(e),...e})},{id:"zone",label:"Zone",description:"Invisible sensor volume that reports overlaps.",icon:i.zone,group:"Scene",tags:["trigger","sensor","area"],defaultProps:{size:{x:2,y:2,z:2}},create:({position:r,props:e})=>f({position:r,size:o(e),...e})},{id:"rect",label:"Rect",description:"Flat rectangle for 2D scenes and UI panels.",icon:i.rect,group:"Scene",tags:["quad","panel","2d"],defaultProps:{size:{x:1,y:1,z:1}},create:({position:r,props:e})=>x({position:r,size:o(e),...e})},{id:"light",label:"Point Light",description:"Point light placed at the click position.",icon:i.light,group:"Scene",tags:["lamp","illumination"],defaultProps:{intensity:1},create:({position:r,props:e})=>z({type:"point",position:r,...e})}],a=null;function Y(){return a||(a=c(T),a)}var l=null;function j(){return l||(l=b("behavior",w),l)}export{T as a,Y as b,j as c};
1
+ import{b as c,o as b}from"./chunk-2HSR5XDQ.js";import{B as y,E as g,H as f,K as x,N as z,j as s,m as p,p as d,s as h,v as u,y as m}from"./chunk-STVEILJJ.js";import{a as w}from"./chunk-VUJXR5K5.js";import{Vector3 as S}from"three";var C='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">';function t(r){return`${C}${r}</svg>`}var i={box:t('<path d="M12 2.5 21 7v10l-9 4.5L3 17V7z"/><path d="M3 7l9 4.5L21 7"/><path d="M12 11.5v10"/>'),sphere:t('<circle cx="12" cy="12" r="9"/><ellipse cx="12" cy="12" rx="9" ry="3.5"/>'),cone:t('<path d="M12 3 20 18H4z"/><ellipse cx="12" cy="18" rx="8" ry="3"/>'),pyramid:t('<path d="M12 3 21 19H3z"/><path d="M12 3v16"/><path d="M3 19l9-5 9 5"/>'),cylinder:t('<ellipse cx="12" cy="6" rx="7" ry="3"/><path d="M5 6v12"/><path d="M19 6v12"/><ellipse cx="12" cy="18" rx="7" ry="3"/>'),pill:t('<rect x="7" y="3" width="10" height="18" rx="5"/><path d="M7 12h10"/>'),disk:t('<ellipse cx="12" cy="12" rx="9" ry="4"/><ellipse cx="12" cy="12" rx="3" ry="1.3"/>'),plane:t('<path d="M2 17 12 11l10 6-10 5z"/><path d="M12 11V4"/>'),zone:t('<rect x="3.5" y="3.5" width="17" height="17" rx="2" stroke-dasharray="3 2.5"/>'),rect:t('<rect x="3.5" y="6" width="17" height="12" rx="1.5"/>'),light:t('<circle cx="12" cy="9" r="4.5"/><path d="M12 2v1.5"/><path d="M12 14.5V22"/><path d="M4.9 4.9 6 6"/><path d="M19.1 4.9 18 6"/><path d="M2 9h1.5"/><path d="M20.5 9H22"/>')};function n(r,e,v,k,M,P){return{id:r,label:e,description:v,icon:k,group:"Shapes",tags:P,defaultProps:{size:{x:1,y:1,z:1}},create:M}}function o(r){let e=r.size;return new S(e?.x??1,e?.y??1,e?.z??1)}var T=[n("box","Box","Cuboid mesh with a matching box collider.",i.box,({position:r,props:e})=>s({position:r,size:o(e),...e}),["cube","block","platform","wall"]),n("sphere","Sphere","Ball mesh with a sphere collider.",i.sphere,({position:r,props:e})=>p({position:r,size:o(e),...e}),["ball","orb","round"]),n("cone","Cone","Cone mesh with a cone collider.",i.cone,({position:r,props:e})=>d({position:r,size:o(e),...e}),["spike","point"]),n("pyramid","Pyramid","Four-sided pyramid mesh and collider.",i.pyramid,({position:r,props:e})=>h({position:r,size:o(e),...e}),["tetra","spike"]),n("cylinder","Cylinder","Cylinder mesh with a matching collider.",i.cylinder,({position:r,props:e})=>u({position:r,size:o(e),...e}),["tube","pillar","column"]),n("pill","Pill","Capsule mesh with a capsule collider.",i.pill,({position:r,props:e})=>m({position:r,size:o(e),...e}),["capsule","character"]),n("disk","Disk","Flat cylinder, useful for pucks and platforms.",i.disk,({position:r,props:e})=>y({position:r,size:o(e),...e}),["puck","coin","circle"]),{id:"plane",label:"Plane",description:"Static ground plane with a tiled surface.",icon:i.plane,group:"Scene",tags:["ground","floor","terrain"],defaultProps:{size:{x:10,y:1,z:10}},create:({position:r,props:e})=>g({position:r,size:o(e),...e})},{id:"zone",label:"Zone",description:"Invisible sensor volume that reports overlaps.",icon:i.zone,group:"Scene",tags:["trigger","sensor","area"],defaultProps:{size:{x:2,y:2,z:2}},create:({position:r,props:e})=>f({position:r,size:o(e),...e})},{id:"rect",label:"Rect",description:"Flat rectangle for 2D scenes and UI panels.",icon:i.rect,group:"Scene",tags:["quad","panel","2d"],defaultProps:{size:{x:1,y:1,z:1}},create:({position:r,props:e})=>x({position:r,size:o(e),...e})},{id:"light",label:"Point Light",description:"Point light placed at the click position.",icon:i.light,group:"Scene",tags:["lamp","illumination"],defaultProps:{intensity:1},create:({position:r,props:e})=>z({type:"point",position:r,...e})}],a=null;function Y(){return a||(a=c(T),a)}var l=null;function j(){return l||(l=b("behavior",w),l)}export{T as a,Y as b,j as c};
@@ -0,0 +1 @@
1
+ import{Type as e}from"@sinclair/typebox";var t=e.Object({x:e.Number(),y:e.Number(),z:e.Number()},{title:"Vec3",additionalProperties:!1}),a=e.Union([e.Literal("linear"),e.Literal("easeIn"),e.Literal("easeOut"),e.Literal("easeInOut")],{title:"CutsceneEasing"}),n=e.Union([e.Literal("cut"),e.Literal("fade"),e.Literal("wipe"),e.Literal("radial"),e.Literal("noise"),e.Literal("cells")],{title:"SceneTransitionType"}),r=e.Object({type:n,duration:e.Number({minimum:0}),easing:a},{title:"SceneTransition",additionalProperties:!1}),o=e.Object({id:e.String(),name:e.String(),start:e.Number({minimum:0}),end:e.Number({minimum:0}),transitionIn:r},{title:"CutsceneScene",additionalProperties:!1}),c=e.Object({position:t,lookAt:t},{title:"CameraPoseDef",additionalProperties:!1}),m=e.Object({id:e.String(),time:e.Number({minimum:0}),position:e.Optional(t),lookAt:e.Optional(t),fov:e.Optional(e.Number({minimum:1,maximum:179})),easing:a},{title:"CameraKeyframe",additionalProperties:!1}),s=e.Union([e.Literal("static"),e.Literal("dolly"),e.Literal("follow")],{title:"CutsceneCameraKind"}),l=e.Object({id:e.String(),name:e.String(),kind:s,fov:e.Number({minimum:1,maximum:179}),pose:c,dollyId:e.Optional(e.String()),dollyEasing:a,target:e.Optional(e.String()),offset:e.Optional(t),damping:e.Number({minimum:0,maximum:1}),keyframes:e.Array(m)},{title:"CutsceneCamera",additionalProperties:!1}),p=e.Object({id:e.String(),name:e.String(),points:e.Array(t,{minItems:2}),closed:e.Boolean(),tension:e.Number({minimum:0,maximum:1})},{title:"DollyPath",additionalProperties:!1}),S=e.Object({duration:e.Number({minimum:0}),easing:a},{title:"ShotBlend",additionalProperties:!1}),d=e.Object({id:e.String(),cameraId:e.String(),start:e.Number({minimum:0}),end:e.Number({minimum:0}),blend:S},{title:"CameraShot",additionalProperties:!1}),i=e.Union([e.String(),e.Number(),e.Boolean()]),u=e.Union([e.Object({type:e.Literal("emit"),name:e.String(),payload:e.Record(e.String(),i)},{additionalProperties:!1}),e.Object({type:e.Literal("playAnimation"),entity:e.String(),key:e.String()},{additionalProperties:!1}),e.Object({type:e.Literal("playSong"),song:e.String(),loop:e.Boolean()},{additionalProperties:!1}),e.Object({type:e.Literal("stopSong"),song:e.Optional(e.String())},{additionalProperties:!1}),e.Object({type:e.Literal("setVariable"),name:e.String(),value:i},{additionalProperties:!1})],{title:"CutsceneEvent"}),y=e.Object({id:e.String(),time:e.Number({minimum:0}),event:u},{title:"EventItem",additionalProperties:!1}),f=e.Object({id:e.String(),time:e.Number({minimum:0}),kind:e.Union([e.Literal("song"),e.Literal("sfx")]),ref:e.String(),loop:e.Boolean(),volume:e.Number()},{title:"AudioItem",additionalProperties:!1}),h=e.Object({kind:e.Literal("camera"),id:e.String(),name:e.String(),items:e.Array(d)},{title:"CameraTrack",additionalProperties:!1}),C=e.Object({kind:e.Literal("event"),id:e.String(),name:e.String(),items:e.Array(y)},{title:"EventTrack",additionalProperties:!1}),g=e.Object({kind:e.Literal("audio"),id:e.String(),name:e.String(),items:e.Array(f)},{title:"AudioTrack",additionalProperties:!1}),x=e.Union([h,C,g],{title:"CutsceneTrack"}),O=e.Object({id:e.String(),name:e.String(),duration:e.Number({exclusiveMinimum:0}),stage:e.Union([e.String(),e.Null()]),skippable:e.Boolean(),scenes:e.Array(o),cameras:e.Array(l),dollies:e.Array(p),tracks:e.Array(x)},{$id:"CutsceneDefinition",title:"CutsceneDefinition",additionalProperties:!1});export{r as a,o as b,m as c,l as d,p as e,d as f,u as g,y as h,f as i,x as j,O as k};
@@ -0,0 +1 @@
1
+ import{b as S,c as g}from"./chunk-2PFNNGTV.js";import{k as f}from"./chunk-QGIYILYI.js";function h(e=800,n=.05){b(e,n)}function b(e,n){let o=new(window.AudioContext||window.webkitAudioContext),t=o.createOscillator(),a=o.createGain();t.type="sawtooth",t.frequency.value=e,a.gain.setValueAtTime(.05,o.currentTime),a.gain.exponentialRampToValueAtTime(.001,o.currentTime+n),t.connect(a),a.connect(o.destination),t.start(),t.stop(o.currentTime+n)}function T(e=440,n=.1){w(e,n)}function w(e,n){let o=new(window.AudioContext||window.webkitAudioContext),t=o.createOscillator(),a=o.createGain();t.type="square",t.frequency.value=e,a.gain.setValueAtTime(.05,o.currentTime),a.gain.exponentialRampToValueAtTime(.001,o.currentTime+n),t.connect(a),a.connect(o.destination),t.start(),t.stop(o.currentTime+n)}import{Howl as se}from"howler";async function x(e,n={}){let o=await g(),t=n.trackIds?[...n.trackIds]:void 0,a=f(e,{trackIds:t,ignoreMix:!!t}),s=new Map;await Promise.all([...new Set(a.audio.map(r=>r.url))].map(async r=>{let c=n.resolveUrl?n.resolveUrl(r):r;s.set(r,await o.ToneAudioBuffer.fromUrl(c))}));let l=Math.max(.1,a.length+(n.tail??1.5)),i=t?{...e,tracks:e.tracks.filter(r=>t.includes(r.id)).map(r=>({...r,mute:!1,solo:!1}))}:e,u=(await o.Offline(({transport:r})=>{r.bpm.value=e.bpm;let c=new o.Volume(e.masterVolume??0).toDestination();S(o,i,{master:c,schedule:a,buffers:s,resolveUrl:n.resolveUrl}),r.start(0)},l,2,n.sampleRate??44100)).get();if(!u)throw new Error("Offline render produced no audio");return u}function y(e){let n=Math.max(1,e.numberOfChannels),o=e.length,t=2,a=n*t,s=o*a,l=new ArrayBuffer(44+s),i=new DataView(l);m(i,0,"RIFF"),i.setUint32(4,36+s,!0),m(i,8,"WAVE"),m(i,12,"fmt "),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,n,!0),i.setUint32(24,e.sampleRate,!0),i.setUint32(28,e.sampleRate*a,!0),i.setUint16(32,a,!0),i.setUint16(34,t*8,!0),m(i,36,"data"),i.setUint32(40,s,!0);let p=[];for(let r=0;r<n;r+=1)p.push(e.getChannelData(Math.min(r,e.numberOfChannels-1)));let u=44;for(let r=0;r<o;r+=1)for(let c=0;c<n;c+=1){let d=Math.max(-1,Math.min(1,p[c]?.[r]??0));i.setInt16(u,d<0?d*32768:d*32767,!0),u+=t}return l}function A(e){return new Blob([y(e)],{type:"audio/wav"})}function m(e,n,o){for(let t=0;t<o.length;t+=1)e.setUint8(n+t,o.charCodeAt(t))}export{h as a,T as b,x as c,y as d,A as e,se as f};