@zylem/game-lib 0.8.3 → 0.8.6

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 (67) hide show
  1. package/dist/actions.d.ts +7 -5
  2. package/dist/api/game-lib.api.json +3564 -395
  3. package/dist/api/game-lib.api.md +196 -12
  4. package/dist/api/game-lib.d.ts +547 -14
  5. package/dist/api/game-lib.typedoc.json +213478 -129350
  6. package/dist/base-node-idopiSw5.d.ts +96 -0
  7. package/dist/bridge.d.ts +41 -5
  8. package/dist/bridge.js +1 -1
  9. package/dist/catalog.d.ts +77 -0
  10. package/dist/catalog.js +1 -0
  11. package/dist/{chunk-CM5YRNBJ.js → chunk-7NYP4YAG.js} +1 -1
  12. package/dist/chunk-AE3CTVHY.js +1 -0
  13. package/dist/chunk-BCFFS3FP.js +1 -0
  14. package/dist/chunk-BMRFDDMR.js +1 -0
  15. package/dist/chunk-DECK4UEC.js +1 -0
  16. package/dist/chunk-DQQA3VJH.js +1 -0
  17. package/dist/chunk-FYQNZCIP.js +1 -0
  18. package/dist/chunk-GHJQ2HKI.js +1 -0
  19. package/dist/chunk-LD4KDRYL.js +24 -0
  20. package/dist/chunk-MXO4VGDB.js +1 -0
  21. package/dist/chunk-Q2YDBMVY.js +19 -0
  22. package/dist/chunk-QDQ4QMAI.js +1 -0
  23. package/dist/{chunk-TV3AZKT4.js → chunk-QVIUZEYA.js} +1 -1
  24. package/dist/chunk-SAQA4SXW.js +1 -0
  25. package/dist/chunk-VJZMSBKP.js +1 -0
  26. package/dist/{chunk-YAOXFYOD.js → chunk-WBQ5TNRZ.js} +1 -1
  27. package/dist/chunk-YOVE25NW.js +1 -0
  28. package/dist/{collision-builder-B_tm8OVy.d.ts → collision-builder-BckxkdmA.d.ts} +1 -1
  29. package/dist/core.d.ts +14 -11
  30. package/dist/core.js +1 -1
  31. package/dist/debug-state-B5awuDHl.d.ts +89 -0
  32. package/dist/debug.d.ts +200 -7
  33. package/dist/debug.js +1 -1
  34. package/dist/{entity-B9yZeBm4.d.ts → entity-BIf_a4dl.d.ts} +1 -1
  35. package/dist/{entity-BGEq1yfC.d.ts → entity-XZNGBeca.d.ts} +32 -98
  36. package/dist/{entity-type-map-CW6RHQkx.d.ts → entity-type-map-CkkFMSrL.d.ts} +42 -7
  37. package/dist/entity.d.ts +9 -7
  38. package/dist/entity.js +1 -1
  39. package/dist/{game-NHkubIfI.d.ts → game-Cy8f6gJm.d.ts} +181 -17
  40. package/dist/game-default-F3KPYZ7X.js +1 -0
  41. package/dist/graphics.d.ts +6 -5
  42. package/dist/graphics.js +1 -1
  43. package/dist/{material-DbSuZBbP.d.ts → material-CxxAyJYp.d.ts} +1 -1
  44. package/dist/public.d.ts +12 -10
  45. package/dist/public.js +1 -1
  46. package/dist/runtime.d.ts +3 -3
  47. package/dist/runtime.js +1 -1
  48. package/dist/{vector-DN6zlPoE.d.ts → simulation-body-zQw-emOr.d.ts} +11 -42
  49. package/dist/vector-D3eDzvcA.d.ts +41 -0
  50. package/dist/web-components.d.ts +12 -9
  51. package/dist/web-components.js +1 -1
  52. package/dist/{zylem-camera-Du2UPW9O.d.ts → zylem-camera-DZTpPOiD.d.ts} +12 -1
  53. package/package.json +21 -16
  54. package/LICENSE +0 -21
  55. package/dist/chunk-2VSVOPQN.js +0 -19
  56. package/dist/chunk-3I537JFL.js +0 -1
  57. package/dist/chunk-C5NEGC3S.js +0 -1
  58. package/dist/chunk-CV75NSES.js +0 -1
  59. package/dist/chunk-GKHAJ3MW.js +0 -1
  60. package/dist/chunk-LGS5N5M4.js +0 -1
  61. package/dist/chunk-LKFF6XJC.js +0 -1
  62. package/dist/chunk-Q27ULMXY.js +0 -24
  63. package/dist/chunk-W5SXED5T.js +0 -1
  64. package/dist/chunk-WVSYUWTT.js +0 -1
  65. package/dist/debug-state-Dp9CQQZ4.d.ts +0 -49
  66. package/dist/game-default-5TB3T5N7.js +0 -1
  67. /package/dist/{chunk-DFLI7ICU.js → chunk-MSCVL5OK.js} +0 -0
@@ -0,0 +1 @@
1
+ import{b as yt,c as Zt,f as Gt}from"./chunk-BCFFS3FP.js";import{c as ee}from"./chunk-AE3CTVHY.js";import{a as Ge,e as wt,g as I}from"./chunk-DQQA3VJH.js";import{a as Ct,c as Ve,d as Ze,e as St,f as J,g as Pt}from"./chunk-VJZMSBKP.js";import{b as ze,d as u,e as mt,i as Fe,k as X,m as Ie,p as k,t as ht,u as gt,v as ft}from"./chunk-DECK4UEC.js";import{a as ie,b as Ot}from"./chunk-WBQ5TNRZ.js";import{b as te,d as At}from"./chunk-MXO4VGDB.js";import{a as V,k as xt,l as Tt,m as Dt,n as Mt,o as L,p as _t,q as Z,t as Rt,u as Ue}from"./chunk-SAQA4SXW.js";import{c as Ne,d as kt,g as O,h as Lt}from"./chunk-7NYP4YAG.js";import{a as vt,b as E}from"./chunk-AIQ6IVT5.js";import{a as re,b as Bt,c as ne,d as zt,e as Ft,f as It,g as Vt,m as A}from"./chunk-D2PATZCC.js";import{c as $,d as Be,j as g}from"./chunk-4QLJUQSJ.js";import{c as C,i as Et,j as h}from"./chunk-7WRQ2UAN.js";import{a as Ut}from"./chunk-BH53MBAZ.js";import{l as bt}from"./chunk-UG22Z42P.js";import{Vector2 as Kt,RenderTarget as Zi,HalfFloatType as Gi}from"three";import{WebGPURenderer as Ui,RenderPipeline as Ni}from"three/webgpu";import{pass as Hi,renderOutput as qt,screenCoordinate as Wi,vec2 as He,vec4 as Xt,fract as Qt,sin as Yt,dot as $t,texture as ji,uniform as Ki}from"three/tsl";import{setConsoleFunction as Ii,getConsoleFunction as Vi}from"three";var Nt="THREE.Abstract function.",Ht=!1,Wt=!1;function jt(){if(Ht)return;Ht=!0;let a=Vi();Ii((e,t,...i)=>{if(e==="warn"&&t===Nt){Wt||(Wt=!0,console.warn(`${Nt} (suppressing further per-frame repeats; a WebGPU node is scheduled for updates without an update() implementation)`));return}if(a){a(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 Jt={x:0,y:0,width:1,height:1};async function _n(){if(!("gpu"in navigator))return!1;try{return await navigator.gpu.requestAdapter()!==null}catch{return!1}}var ae=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 Kt(window.innerWidth,window.innerHeight)}get initialized(){return this._initialized}get isWebGPU(){return!0}async initRenderer(){this._initialized||(jt(),this.renderer=new Ui({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 Ni(this.renderer),r=Hi(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 s=qt(n),o=this._transition;if(o)try{s=Xt(o.resolved.shader({fromNode:o.fromNode,toNode:s,progress:o.progressUniform})),o.composed=!0}catch(l){console.error("RendererManager: stage transition shader failed, skipping.",l)}i.outputNode=s.add(Qi()),this.postProcessing=i}get transitionActive(){return this._transition!==null}beginSnapshotTransition(e,t,i){this.finishTransition();let r=new Kt;this.renderer.getDrawingBufferSize(r);let n=new Zi(Math.max(1,r.x),Math.max(1,r.y),{type:Gi}),s=this.renderer.getRenderTarget();try{this.renderer.setScissorTest(!1),this.renderer.setRenderTarget(n),this.renderer.render(t,i)}catch(o){console.error("RendererManager: failed to capture transition snapshot.",o)}finally{this.renderer.setRenderTarget(s)}this._transition={resolved:e,progressUniform:Ki(0),fromNode:qt(ji(n.texture)),elapsed:0,snapshotTarget:n,composed:!1}}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+=e;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,s=this.screenResolution.y,o=Math.floor(r.x*n),l=Math.floor(r.y*s),c=Math.floor(r.width*n),d=Math.floor(r.height*s);this.renderer.setViewport(o,l,c,d),this.renderer.setScissor(o,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&&qi(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 qi(a){return a.x===0&&a.y===0&&a.width===1&&a.height===1}function Qi(){let a=Wi.xy,e=Qt(Yt($t(a,He(12.9898,78.233))).mul(43758.5453)),t=Qt(Yt($t(a.add(He(13,7)),He(12.9898,78.233))).mul(43758.5453)),i=e.sub(t).mul(1/255);return Xt(i,i,i,0)}function G(a){return a?.category??"none"}function U(a){let e=G(a);return e==="environment"||e==="pack"}function D(a){return a.isInstanced===!0||a.isBundled===!0}import{BundleGroup as Yi}from"three/webgpu";var se=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 s=this.getOrCreateBundle(r);return n.matrixAutoUpdate=!0,n.userData.zylemEntityUuid=e.uuid,n.parent&&n.parent.remove(n),s.add(n),s.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 Yi,t.name=`bundle:${e}`,t.static=!0,this.bundles.set(e,t),this.scene&&this.scene.add(t),t)}};import{InstancedMesh as ei,Matrix4 as N,Vector3 as ti,Quaternion as $i}from"three";var H=class a{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}:${Ne(e.dimensions)}`,mat:e.materialPath||"none",shader:e.shaderType||"standard",color:e.colorHex??16777215};return kt(Ne(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 a.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 s;return n.freeIndices.length>0?s=n.freeIndices.pop():(s=n.entities.length,s>=n.capacity&&this.growPack(n),n.entities.push(null)),n.entities[s]=e,n.entityMap.set(e.uuid,s),this.entityToPack.set(e.uuid,r),n.instancedMesh.count=Math.max(n.instancedMesh.count,s+1),n.activeIndices.push(s),n.dirtyIndices.add(s),s}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 o=i.activeIndices.pop();n<i.activeIndices.length&&(i.activeIndices[n]=o)}i.dirtyIndices.delete(r);let s=new N;s.makeScale(0,0,0),i.instancedMesh.setMatrixAt(r,s),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 N,i=new ti,r=new $i,n=new ti(1,1,1);for(let s of this.packs.values()){if(s.activeIndices.length===0)continue;let o=!1;for(let l of s.activeIndices){let c=s.entities[l];if(!c)continue;if(xt(c)){t.makeScale(0,0,0),s.instancedMesh.setMatrixAt(l,t),o=!0;continue}let d=s.dirtyIndices.has(l),p=!!c.body;if(!(!d&&!p)){if(!d&&p){let v=c.body;if(typeof v.isRenderSleeping=="function"&&v.isRenderSleeping())continue}this.updateInstanceMatrix(s,l,t,i,r,n,e),o=!0}}s.dirtyIndices.clear(),o&&(s.instancedMesh.instanceMatrix.needsUpdate=!0)}}updateInstanceMatrix(e,t,i,r,n,s,o){let l=e.entities[t];if(l){if(l.body){let c=l.body;if(typeof c.writeRenderPose=="function")c.writeRenderPose(o,r,n);else{let d=ie(l.body,o);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,s)}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=a.DEFAULT_CAPACITY,n=new ei(t,i,r);n.count=0,n.frustumCulled=!1;let s=new N().makeScale(0,0,0);for(let l=0;l<r;l++)n.setMatrixAt(l,s);n.instanceMatrix.needsUpdate=!0;let o={key:e,instancedMesh:n,geometry:t,material:i,entityMap:new Map,entities:[],freeIndices:[],activeIndices:[],dirtyIndices:new Set,capacity:r};return this.packs.set(e,o),this.scene&&this.scene.add(n),o}growPack(e){let t=e.capacity*a.GROWTH_FACTOR,i=new ei(e.geometry,e.material,t);i.count=e.instancedMesh.count,i.frustumCulled=!1;let r=new N;for(let s=0;s<e.capacity;s++)e.instancedMesh.getMatrixAt(s,r),i.setMatrixAt(s,r);let n=new N().makeScale(0,0,0);for(let s=e.capacity;s<t;s++)i.setMatrixAt(s,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 oe=class{bundles=new se;instances=new H;setScene(e){this.bundles.setScene(e),this.instances.setScene(e)}register(e){let t=G(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=H.generateEntityPackKey(e);if(t==="pack"){let s=this.instances.register(e,i,r,n);return s<0?!1:(e.packKey=n,e.instanceId=s,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 le=!1,S={},ii=0,ri=0,W=null;function ni(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function We(){return le?!0:(typeof globalThis<"u"&&globalThis.__ZYLEM_PROFILE_STAGE__===!0&&(le=!0),le)}function jn(a){le=a,typeof globalThis<"u"&&(globalThis.__ZYLEM_PROFILE_STAGE__=a)}function je(a){We()&&(W=a,ri=ni())}function Ke(){if(!We()||W===null)return;let a=ni()-ri;S[W]=(S[W]??0)+a,W=null}function ai(){if(!We()||(ii++,ii%60!==0))return;let a=Object.values(S).reduce((t,i)=>t+(i??0),0),e=Object.keys(S).sort((t,i)=>(S[i]??0)-(S[t]??0)).map(t=>{let i=S[t]??0,r=a>0?(i/a*100).toFixed(1):"0.0";return`${t}=${i.toFixed(2)}ms (${r}%)`});console.info(`[ZylemStage profile] avg over 60 frames (${a.toFixed(2)}ms/frame): ${e.join(", ")}`);for(let t of Object.keys(S))S[t]=0}function P(a,e){je(a);try{return e()}finally{Ke()}}var m={FirstPerson:"first-person",ThirdPerson:"third-person",Isometric:"isometric",Flat2D:"flat-2d",Fixed2D:"fixed-2d",TopDown:"top-down"};import{Vector3 as Xi,Quaternion as Ji,MathUtils as qe}from"three";function ce(){return{position:new Xi(0,0,10),rotation:new Ji,fov:75,zoom:1,near:.1,far:1e3}}function M(a){return{position:a.position.clone(),rotation:a.rotation.clone(),fov:a.fov,zoom:a.zoom,near:a.near,far:a.far,lookAt:a.lookAt?.clone()}}function si(a,e){let t=M(a);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 oi(a,e,t,i){let r=1-Math.pow(1-qe.clamp(t,0,1),i*60),n=M(a);return n.position.lerp(e.position,r),n.rotation.slerp(e.rotation,r),e.fov!=null&&n.fov!=null&&(n.fov=qe.lerp(n.fov,e.fov,r)),e.zoom!=null&&n.zoom!=null&&(n.zoom=qe.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 de=class{perspective=null;behaviors=new Map;actions=[];_desiredPose=ce();_finalPose=ce();_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):ce(),i=this.getSortedBehaviors();for(let r of i)r.enabled!==!1&&(t=r.update(e,t));this._desiredPose=M(t);for(let r=this.actions.length-1;r>=0;r--){let n=this.actions[r],s=n.update(e);t=si(t,s),n.isDone(e)&&this.actions.splice(r,1)}return this._initialized?this._finalPose=oi(this._finalPose,t,this.damping,e.dt):(this._finalPose=M(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?M(this._desiredPose):null,finalPose:this._finalPose?M(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 x,Quaternion as ue}from"three";var er={distance:8,height:5,shoulderOffset:0,targetKey:"primary",fov:75,paddingFactor:1.5,minDistance:5,trailDelay:.1,trailBufferSize:120},_=class{id="third-person";defaults={damping:.12};opts;initialPosition;initialLookAt;_trailBuffers=new Map;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...er,...r},this.initialPosition=t?h(t,C):void 0,this.initialLookAt=i?h(i,C):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 ue,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:this.initialLookAt?.clone()??new x(0,0,0)}:{position:new x(this.opts.shoulderOffset,this.opts.height,this.opts.distance),rotation:new ue,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:new x(0,0,0)}}singleTargetPose(e,t,i){let r=this.getTrailedPosition(i,e,t.time);return{position:new x(r.x+this.opts.shoulderOffset,r.y+this.opts.height,r.z+this.opts.distance),rotation:new ue,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:r.clone()}}multiTargetPose(e){let i=Object.entries(e.targets).map(([p,v])=>this.getTrailedPosition(p,v.position,e.time)),r=new x;for(let p of i)r.add(p);r.divideScalar(i.length);let n=0;for(let p of i){let v=r.distanceTo(p);v>n&&(n=v)}let s=Math.max(n*this.opts.paddingFactor,this.opts.minDistance),o=new x(this.opts.shoulderOffset,this.opts.height,this.opts.distance),l=o.length(),c=l>0?o.clone().normalize():new x(0,.5,1).normalize(),d=r.clone().add(c.multiplyScalar(s));if(l>0){let p=this.opts.height/l;d.y=r.y+s*p}return{position:d,rotation:new ue,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 s=i-r-.05;for(;n.length>1&&n[0].time<s;)n.shift();n.length>this.opts.trailBufferSize&&n.splice(0,n.length-this.opts.trailBufferSize);let o=i-r;if(n[0].time>=o)return n[0].pos.clone();for(let l=1;l<n.length;l++){let c=n[l-1],d=n[l];if(c.time<=o&&o<=d.time){let p=d.time-c.time,v=p>1e-6?(o-c.time)/p:0;return new x().lerpVectors(c.pos,d.pos,v)}}return n[n.length-1].pos.clone()}};import{Vector3 as li,Quaternion as tr}from"three";var ci={position:{x:0,y:0,z:10},zoom:10},B=class{id="fixed-2d";defaults={damping:1};opts;constructor(e){this.opts={...ci,...e,position:h(e?.position,ci.position)}}getBasePose(e){return{position:new li(this.opts.position.x,this.opts.position.y,this.opts.position.z),rotation:new tr,zoom:this.opts.zoom,near:1,far:1e3,lookAt:new li(this.opts.position.x,this.opts.position.y,0)}}};import{Vector3 as Qe,Quaternion as Ye,Euler as pi,MathUtils as f}from"three";var ir={eyeHeight:1.7,defaultFov:75,pitchLimit:Math.PI/2-.01,lookAtLerpSpeed:5,fovLerpSpeed:8,targetKey:"primary",verticalSmoothing:1},j=class{id="first-person";defaults={damping:1};opts;initialPosition;initialLookAt;_yaw=0;_pitch=0;_currentFov;_targetFov;_lookAtTarget=null;_lookAtLerpSpeed;_currentRotation=new Ye;_rotationInitialized=!1;_smoothedY=null;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...ir,...r},this.initialPosition=t?h(t,C):void 0,this.initialLookAt=i?h(i,C):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=f.clamp(this._pitch+t,-this.opts.pitchLimit,this.opts.pitchLimit)}setLook(e,t){this._yaw=e,this._pitch=f.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 Qe(t.position.x,r,t.position.z)}return this.initialPosition?this.initialPosition.clone():new Qe(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=f.clamp(this.opts.verticalSmoothing,0,1),r=1-Math.pow(1-i,t*60);return this._smoothedY=f.lerp(this._smoothedY,e,r),this._smoothedY}computeRotation(e,t){let i=new Ye().setFromEuler(new pi(this._pitch,this._yaw,0,"YXZ"));if(this._rotationInitialized||(this._currentRotation.copy(i),this._rotationInitialized=!0),this._lookAtTarget){let r=di.copy(this._lookAtTarget).sub(e);if(r.lengthSq()>1e-4){r.normalize();let n=Math.atan2(-r.x,-r.z),s=Math.asin(f.clamp(r.y,-1,1)),o=rr.setFromEuler(ui.set(s,n,0,"YXZ")),l=1-Math.pow(1-Math.min(this._lookAtLerpSpeed*t,1),1);return this._currentRotation.slerp(o,f.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 f.lerp(this._currentFov,this._targetFov,f.clamp(t,0,1))}deriveYawPitchFromLookAt(e,t){let i=di.copy(t).sub(e).normalize();this._yaw=Math.atan2(-i.x,-i.z),this._pitch=Math.asin(f.clamp(i.y,-1,1))}deriveYawPitchFromQuaternion(e){let t=ui.setFromQuaternion(e,"YXZ");this._yaw=t.y,this._pitch=f.clamp(t.x,-this.opts.pitchLimit,this.opts.pitchLimit)}},di=new Qe,rr=new Ye,ui=new pi;function z(a,e){switch(a){case"third-person":return new _(e);case"first-person":return new j(e);case"isometric":return new _({distance:10,height:10,...e});case"flat-2d":return new B(e);case"fixed-2d":return new B(e);default:return new _(e)}}import{Vector2 as or,Object3D as lr,Vector3 as he}from"three";import{PerspectiveCamera as K,Vector3 as ar,OrthographicCamera as me,RenderTarget as sr,LinearFilter as mi}from"three";import{Vector3 as $e}from"three";import{OrbitControls as nr}from"three/addons/controls/OrbitControls.js";var pe=class{camera;domElement;cameraRig=null;sceneRef=null;orbitControls=null;orbitTarget=null;orbitTargetWorldPos=new $e;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;constructor(e,t,i){this.camera=e,this.domElement=t,this.cameraRig=i??null}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.disableOrbitControls(),this.detachDebugDelegate()}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 $e().subVectors(this.camera.position,this.orbitControls.target).normalize();t.lengthSq()<1e-8&&t.set(1,1,1).normalize();let i=yt(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)):!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)):!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 nr(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))}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 $e;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 w=class{cameraRig=null;camera;screenResolution;_perspective;frustumSize=10;sceneRef=null;name="";viewport={...Jt};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 ar(0,0,0));let n=z(e);this.pipeline=new de(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 pe(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 ae(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 K&&(this.camera.aspect=e/t,this.camera.updateProjectionMatrix()),this.camera instanceof me){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 sr(e,t,{minFilter:mi,magFilter:mi}),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===m.Flat2D||this._perspective===m.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?this.camera.lookAt(e.lookAt):this.camera.quaternion.copy(e.rotation),this.camera instanceof K&&(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 me){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()}}createCameraForPerspective(e){switch(this._perspective){case m.ThirdPerson:return new K(75,e,.1,1e3);case m.FirstPerson:return new K(75,e,.1,1e3);case m.Isometric:return new me(this.frustumSize*e/-2,this.frustumSize*e/2,this.frustumSize/2,this.frustumSize/-2,1,1e3);case m.Flat2D:case m.Fixed2D:return new me(this.frustumSize*e/-2,this.frustumSize*e/2,this.frustumSize/2,this.frustumSize/-2,1,1e3);default:return new K(75,e,.1,1e3)}}};var ge=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,s]of this.cameras.entries())if(s===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 lr,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 or(window.innerWidth,window.innerHeight),t=new w(m.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 w(m.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 he(0,0,0),i=new he(0,6,12);if(e&&e!==this._debugCamera){let r=e.camera.position,n=new he().subVectors(r,t);n.lengthSq()>1&&i.copy(n.normalize().multiplyScalar(12).add(new he(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 y=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.pipeline.setPerspective(z(e,t))}getPerspective(){return this.cameraRef.pipeline.perspective}getState(){return this.cameraRef.pipeline.getState()}getRenderTexture(){return this.cameraRef.getRenderTexture()}};function $a(a){let e=Et(a.screenResolution,{x:window.innerWidth,y:window.innerHeight}),t=10;a.perspective==="fixed-2d"&&(t=a.zoom||10);let i=new w(a.perspective||"third-person",e,t);a.name&&(i.name=a.name);let r=h(a.position,C),n=h(a.target,C);i.move(r),i.camera.lookAt(n);let s=a.perspective||"third-person";if(s==="fixed-2d"||s==="flat-2d"?i.pipeline.setPerspective(z(s,{zoom:t})):i.pipeline.setPerspective(z(s,{initialPosition:r.clone(),initialLookAt:n.clone()})),a.viewport&&(i.viewport={...a.viewport}),a.useOrbitalControls&&(i._useOrbitalControls=!0),a.skipDebugOrbit&&(i._skipDebugOrbit=!0),a.damping!=null&&(i.pipeline.damping=a.damping),a.behaviors)for(let[o,l]of Object.entries(a.behaviors))i.pipeline.addBehavior(o,l);if(a.renderToTexture){let{width:o=512,height:l=512}=a.renderToTexture;i.createRenderTarget(o,l)}return new y(i)}import{Vector3 as cr}from"three";function T(a){return!!a&&typeof a=="object"&&typeof a.create=="function"}function q(a){return!!a&&typeof a.then=="function"}function Xe(a){return!!a&&typeof a=="object"&&a instanceof y}function hi(a){return!a||typeof a!="object"||T(a)||Xe(a)||q(a)||typeof a.then=="function"?!1:a.constructor===Object||a.constructor?.name==="Object"}function gi(a){return a?!!(T(a)||typeof a=="function"||q(a)):!1}var dr="/three/basis/";function ye(a){return{...a,ktx2TranscoderPath:a?.ktx2TranscoderPath??dr}}var fe=class{constructor(e,t,i,r,n,s,o=60,l={},c=!0,d=[]){this.inputs=e;this.backgroundColor=t;this.backgroundImage=i;this.backgroundShader=r;this.gravity=n;this.variables=s;this.physicsRate=o;this.assetLoaders=l;this.defaultLighting=c;this.postProcessingEffects=d}};function ur(){return new fe({p1:["gamepad-1","keyboard-1"],p2:["gamepad-2","keyboard-2"]},re,null,null,new cr(0,0,0),{},60,{},!0)}function fi(a=[]){let e=ur(),t={},i=[],r=[],n=[];for(let l of a)Xe(l)?n.push(l):T(l)?i.push(l):gi(l)&&!T(l)?r.push(l):hi(l)&&(t={...t,...l});let s=new fe(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),o=n.length>0?n[0]:void 0;return{config:s,entities:i,asyncEntities:r,camera:o,cameras:n}}function as(a){return{...a}}var pr=Symbol("vessel"),Q=class extends V{static type=pr;_setup(e){}async _loaded(e){}_update(e){}_destroy(e){}_cleanup(e){}create(){return this}clone(){let e=mr();return this.replayUserLifecycleRegistrationsTo(e),this.cloneChildrenInto(e),e}add(...e){for(let t of e)super.add(t);return this}};function mr(...a){let e=new Q;return a.forEach(t=>e.add(t)),e.enableUserLifecycleTracking(),e}import{Color as Bi,Vector3 as zi}from"three";import{createSimulation as hr}from"@zylem/behaviors/core";function Je(a){return typeof a?.handlePostCollision=="function"&&typeof a?.handleIntersectionEvent=="function"}function gr(a,e){return a<e?`${a}|${e}`:`${e}|${a}`}var be=class a{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 hr({gravity:[i.x,i.y,i.z],fixedTimestep:1/t,initialCapacity:4096});return new a(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 te)&&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 Ot(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=gr(i,r),s=this.livePairs.get(n);s||(s={uuidA:i<r?i:r,uuidB:i<r?r:i,contactCount:0,intersectionCount:0},this.livePairs.set(n,s));let o=t.type==="collisionStarted"?1:-1;t.sensor?s.intersectionCount=Math.max(0,s.intersectionCount+o):s.contactCount=Math.max(0,s.contactCount+o),s.contactCount===0&&s.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(!Je(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 s=this.collisionMap.get(n.uuidA),o=this.collisionMap.get(n.uuidB);this.activeCollisionPairs.has(r)||this.dispatchCollisionPhase(n,"enter",t),(this.entityHasCollisionPhaseListener(s,"stay")||this.entityHasCollisionPhaseListener(o,"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),s=this.collisionMap.get(e.uuidB);n&&s&&n._collision(s,Be.globals,r);let o=this.collisionMap.get(e.uuidA),l=this.collisionMap.get(e.uuidB);o&&l&&l._collision(o,Be.globals,r)}dispatchIntersectionDelegates(e,t){let i=this.collisionMap.get(e.uuidA),r=this.collisionMap.get(e.uuidB);i&&r&&Je(i)&&(i.handleIntersectionEvent({entity:i,other:r,delta:t}),this.collisionBehaviorMap.set(i.uuid,i));let n=this.collisionMap.get(e.uuidA),s=this.collisionMap.get(e.uuidB);n&&s&&Je(s)&&(s.handleIntersectionEvent({entity:s,other:n,delta:t}),this.collisionBehaviorMap.set(s.uuid,s))}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 fr,Color as yi,AmbientLight as yr,DirectionalLight as br,Vector3 as ve,GridHelper as vr,Texture as Cr,SRGBColorSpace as Sr}from"three";var Ce=class{type="Scene";_setup;scene;zylemCamera;cameraManager=null;containerElement=null;update=()=>{};_collision;_destroy;name;tag;constructor(e,t,i){let r=new fr,s=i.backgroundColor instanceof yi?i.backgroundColor:new yi(i.backgroundColor);r.background=s,i.backgroundShader?this.setupBackgroundShader(r,i.backgroundShader):i.backgroundImage&&O.loadTexture(i.backgroundImage,{colorSpace:Sr}).then(o=>{r.background=o}),this.scene=r,this.zylemCamera=t,i.defaultLighting!==!1&&this.setupLighting(r),u.enabled&&this.debugScene()}setupBackgroundShader(e,t){if(!Lt(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:g()})}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 Cr&&(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 yr(16777215,1);e.add(t);let i=new br(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 ve(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(D(e))return;let t=e.group??e.mesh;if(!t||this.isAttachedOutsideScene(t))return;let i=Pr(e);i&&i.attachToScene(this.scene);let r=e.options.position??new ve(0,0,0);if(e.physicsAttached&&e.body)try{let n=e.body.translation();r=new ve(n.x,n.y,n.z)}catch{r=e.options.position??new ve(0,0,0)}this.add(t,r),Z(e)}isAttachedOutsideScene(e){return e.parent!=null&&e.parent!==this.scene}debugScene(){let i=new vr(1e3,100);this.scene.add(i)}};function Pr(a){return a.constructor.type===At?a:null}var Se=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 wr}from"three";var bi=new wr;function vi(a){let e=a._childrenMap,t=a._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,s=n?ie(r,t?.interpolationAlpha??0):null;n&&s&&n.position.set(s.position.x,s.position.y,s.position.z),!i.controlledRotation&&n&&s&&(bi.set(s.rotation.x,s.rotation.y,s.rotation.z,s.rotation.w),n.setRotationFromQuaternion(bi))}}import{nanoid as gn}from"nanoid";import{Box3 as nn,BufferAttribute as ki,BufferGeometry as an,LineBasicMaterial as sn,LineSegments as on,Raycaster as ln,Vector2 as cn,Vector3 as ut}from"three";import{subscribe as dn}from"valtio/vanilla";import{nanoid as Li}from"nanoid";import{subscribe as Er}from"valtio/vanilla";var Pe=class{stage;constructor(e){this.stage=e}subscribe(e){let t=()=>e(this.snapshot());return t(),Er(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.selectedEntityId?[u.selectedEntityId]:[]}}};import{Box3 as xr,BoxGeometry as Ci,Color as Tr,EdgesGeometry as Si,Group as Dr,LineBasicMaterial as Mr,LineSegments as _r,Mesh as Rr,MeshBasicMaterial as kr,Vector3 as Pi}from"three";var we=class{scene;container;fillMesh;edgeLines;currentColor=new Tr(65280);bbox=new xr;size=new Pi;center=new Pi;constructor(e){this.scene=e;let t=new Ci(1,1,1);this.fillMesh=new Rr(t,new kr({color:this.currentColor,transparent:!0,opacity:.12,depthWrite:!1}));let i=new Si(t);this.edgeLines=new _r(i,new Mr({color:this.currentColor,linewidth:1})),this.container=new Dr,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}if(this.bbox.setFromObject(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 Ci(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 Si(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 Lr,BoxGeometry as Or,Group as Ar,Mesh as Br,MeshBasicMaterial as zr,Vector3 as wi}from"three";var Fr={x:0,y:0,z:0},Ir=7128319,Vr=.35;function Zr(){return new zr({color:Ir,transparent:!0,opacity:Vr,depthWrite:!1})}function Gr(a){let e=a.size;return new wi(e?.x??1,e?.y??1,e?.z??1)}function Ur(a,e){try{let t=a.create({position:Fr,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 "${a.id}" factory failed, falling back to a box`,t),null}}function Nr(a,e){a.traverse(t=>{let i=t;i.isMesh&&(i.material=e,i.castShadow=!1,i.receiveShadow=!1)})}var Ee=class{scene;container;builtFor=null;builtProps=null;material=null;extent=null;bounds=new Lr;constructor(e){this.scene=e,this.container=new Ar,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=ee(e),n={...r?.defaultProps??{},...t??{}},o=(r?Ur(r,n):null)??new Br(new Or(...Gr(n).toArray()));o.position.set(0,0,0),this.material=Zr(),Nr(o,this.material),this.container.add(o),this.bounds.setFromObject(o),this.extent=this.bounds.isEmpty()?null:this.bounds.getSize(new wi)}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 Hr=0;function Wr(a,e){if(e)return{position:a.origin.clone().add(a.direction.clone().multiplyScalar(e.distance)),normal:new et(e.normal[0],e.normal[1],e.normal[2])};if(Math.abs(a.direction.y)<1e-6)return null;let t=(Hr-a.origin.y)/a.direction.y;return t<0?null:{position:a.origin.clone().add(a.direction.clone().multiplyScalar(t)),normal:new et(0,1,0)}}function jr(a,e){if(e.lengthSq()<1e-8)return 0;let t=e.clone().normalize();return(Math.abs(t.x)*a.x+Math.abs(t.y)*a.y+Math.abs(t.z)*a.z)/2}function tt(a,e,t){let i=jr(e,t);return i<=0?a.clone():a.clone().add(t.clone().normalize().multiplyScalar(i))}function it(a,e,t,i){let r=Wr(a,e);if(!r)return null;let{normal:n}=r,s=t.enabled?J(r.position,t.translate):r.position,o=new et(s.x,s.y,s.z);return{position:i?tt(o,i,n):o,normal:n}}import{Box3 as Yr,Quaternion as Me,Vector3 as b}from"three";import{nanoid as $r}from"nanoid";import{Vector3 as F}from"three";var nt=.95,Kr=16,Y=new F,qr=new F,Ei=new F,rt=new F;function xi(a){return a?a.isPerspectiveCamera===!0||a.isOrthographicCamera===!0:!1}function xe(a,e,t=nt){return Y.copy(a).project(e),Math.abs(Y.x)<=t&&Math.abs(Y.y)<=t&&Y.z>=-1&&Y.z<=1}function Ti(a){let e=0,t=1;for(let i=0;i<Kr;i+=1){let r=(e+t)/2;a(r)?e=r:t=r}return e}function Di(a,e,t,i=nt){if(!xi(t))return e.clone();let r=t;if(xe(e,r,i)||!xe(a,r,i))return e.clone();let n=Ti(s=>xe(qr.copy(a).lerp(e,s),r,i));return a.clone().lerp(e,n)}function Mi(a,e,t,i,r=nt){if(!xi(i)||t.x<=1&&t.y<=1&&t.z<=1||a.isEmpty())return t.clone();let n=i;Ei.copy(e);let s=new F(1,1,1),o=c=>(s.set(1+(t.x-1)*c,1+(t.y-1)*c,1+(t.z-1)*c),Qr(a,Ei,s,n,r));if(o(1))return t.clone();let l=Ti(o);return new F(1+(t.x-1)*l,1+(t.y-1)*l,1+(t.z-1)*l)}function Qr(a,e,t,i,r){for(let n=0;n<8;n+=1)if(rt.set(n&1?a.max.x:a.min.x,n&2?a.max.y:a.min.y,n&4?a.max.z:a.min.z),rt.sub(e).multiply(t).add(e),!xe(rt,i,r))return!1;return!0}var Xr={translate:"Move",rotate:"Rotate",scale:"Scale"};function at(a){let e=typeof a?.getPose=="function"?a.getPose():null,t=a?.group??a?.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 a?.getScale=="function"?a.getScale():{x:1,y:1,z:1};return{position:new b(i.x,i.y,i.z),quaternion:new Me(r.x,r.y,r.z,r.w),scale:new b(n.x,n.y,n.z)}}function _i(a){let e=Ze(a.quaternion);return{position:{x:a.position.x,y:a.position.y,z:a.position.z},rotation:e,quaternion:{x:a.quaternion.x,y:a.quaternion.y,z:a.quaternion.z,w:a.quaternion.w},scale:{x:a.scale.x,y:a.scale.y,z:a.scale.z}}}function Jr(a,e){return a.position.distanceToSquared(e.position)>1e-5*1e-5||Math.abs(a.quaternion.dot(e.quaternion))<1-1e-5||a.scale.distanceToSquared(e.scale)>1e-5*1e-5}function Te(a,e){(e.position||e.quaternion)&&a.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&&a.setScale?.(e.scale.x,e.scale.y,e.scale.z)}function en(a){let e=a?.group??a?.mesh;if(!e?.isObject3D)return null;let t=new Yr().setFromObject(e);return t.isEmpty()?null:t}var st=.02,ot=50;function tn(a){return new b(lt(a.x,st,ot),lt(a.y,st,ot),lt(a.z,st,ot))}function lt(a,e,t){return Math.min(Math.max(a,e),t)}var ct=new Me,rn=new b,De=class{gizmo=new Gt;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 s=this.context.resolveEntity(n);s&&r.push({uuid:n,entity:s,start:at(s),startBounds:this.mode==="scale"?en(s):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 s=k(),o=s.enabled&&!t;switch(n.kind){case"translate":this.applyTranslate(i,n.offset,o?s.translate:0,r);break;case"rotate":this.applyRotate(i,n.axis,n.angle,o?s.rotate:0);break;case"scale":this.applyScale(i,n.factor,o?s.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=at(i.entity);Jr(i.start,r)&&(e.mode==="scale"&&Ge(i.entity),t.push({uuid:i.uuid,before:_i(i.start),after:_i(r)}))}t.length&&I({opId:$r(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=rn.copy(e.pivotStart).add(t),s=Di(e.pivotStart,n,r),o=i>0?J(s,i):s,l=new b(o.x-e.pivotStart.x,o.y-e.pivotStart.y,o.z-e.pivotStart.z);for(let c of e.entries)Te(c.entity,{position:c.start.position.clone().add(l)})}applyRotate(e,t,i,r){let n=e.axis;for(let s of e.entries){ct.setFromAxisAngle(t,i);let o=ct.clone().multiply(s.start.quaternion),l=o;if(r>0&&(n==="x"||n==="y"||n==="z")){let d=Ze(o);d[n]=St(d[n],r);let p=Ve(d);l=new Me(p.x,p.y,p.z,p.w)}let c=s.start.position.clone().sub(e.pivotStart).applyQuaternion(ct).add(e.pivotStart);Te(s.entity,{position:c,quaternion:l})}}applyScale(e,t,i,r){for(let n of e.entries){let s=n.startBounds?Mi(n.startBounds,n.start.position,t,r):t,o=tn(s),l=new b(n.start.scale.x*o.x,n.start.scale.y*o.y,n.start.scale.z*o.z),c=i>0?Pt(l,i):l;Te(n.entity,{scale:new b(c.x,c.y,c.z)})}}describeOperation(e){let t=Xr[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 b,i=0;for(let r of e){let n=this.context.resolveEntity(r);n&&(t.add(at(n).position),i++)}return i?t.divideScalar(i):null}};function Ri(a,e,t){for(let i of a.entries){let r=e==="undo"?i.before:i.after;if(!r)continue;let n=t(i.uuid);if(!n)continue;let s=r.quaternion??(r.rotation?Ve(r.rotation):void 0);Te(n,{position:r.position?new b(r.position.x,r.position.y,r.position.z):void 0,quaternion:s?new Me(s.x,s.y,s.z,s.w):void 0,scale:r.scale?new b(r.scale.x,r.scale.y,r.scale.z):void 0}),r.scale&&Ge(n)}}var un=2293538,pn=16724787,dt=new nn,Oi=new ut,_e=class{stage;options;mouseNdc=new cn(-2,-2);raycaster=new ln;domDisposeFns=[];domListenersAttached=!1;debugCursor=null;placementGhost=null;debugLines=null;cameraDebugDelegate=null;debugStateUnsubscribe=null;focusContextUnregister=null;entityResolverUnregister=null;lastDebugEnabled=null;warnedMissingAddFactory=!1;transformTool;grid=new Zt;lastTool=null;capturedPointer=null;constructor(e,t){this.stage=e,this.options={maxRayDistance:t?.maxRayDistance??5e3,addEntityFactory:t?.addEntityFactory??null},this.transformTool=new De({getScene:()=>this.stage.scene?.scene??null,getCamera:()=>this.getDebugViewCamera()?.camera??null,resolveEntity:i=>this.resolveEntity(i)}),this.syncWithDebugState(),this.debugStateUnsubscribe=dn(u,()=>{this.syncWithDebugState()}),this.entityResolverUnregister=mt(i=>this.resolveEntity(i)),this.focusContextUnregister=Ct({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)}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 Pe(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,e!=="none"&&(this.ensureInteraction(),this.populateDebugMap()),this.parkToolVisuals(e);let t=ze(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(k().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 on(new an,new sn({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 we(e),this.placementGhost??=new Ee(e))}parkToolVisuals(e){e!=="add"&&this.placementGhost?.hide(),e!=="select"&&e!=="delete"&&this.debugCursor?.hide()}disposeToolVisuals(){this.debugCursor?.dispose(),this.debugCursor=null,this.placementGhost?.dispose(),this.placementGhost=null}update(){let e=this.getDebugViewCamera();if(!this.stage.scene||!this.stage.world||!e)return;let{world:t}=this.stage,i=Fe();if(this.ensureInteraction(),this.ensureToolVisuals(),u.enabled?(this.initDebugVisuals(),this.updateColliderWireframes(t)):this.disposeDebugVisuals(),this.updatePlacementGhost(i,t),ze(i)){this.debugCursor?.hide(),this.transformTool.update(),this.transformTool.isDragging||this.transformTool.hover(this.currentRay());return}if(this.transformTool.update(),!(i==="select"||i==="delete")){this.debugCursor?.hide();return}let n=this.currentRay(),s=t.raycast(n.origin,n.direction,this.options.maxRayDistance);s?gt(s.uuid??null):ft();let o=ht();if(!o){this.debugCursor?.hide();return}let l=this.resolveEntity(o),c=l?.group??l?.mesh??null;if(!c){this.debugCursor?.hide();return}switch(i){case"select":this.debugCursor?.setColor(un);break;case"delete":this.debugCursor?.setColor(pn);break;default:this.debugCursor?.setColor(16777215);break}this.debugCursor?.updateFromObject(c)}updateColliderWireframes(e){if(!this.debugLines)return;let t=e.simulation.getDebugRender();t&&t.vertices.length>0?(this.debugLines.geometry.setAttribute("position",new ki(new Float32Array(t.vertices),3)),this.debugLines.geometry.setAttribute("color",new ki(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||!X()||(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(),s=t.raycast(n.origin,n.direction,this.options.maxRayDistance)??null,o=it(n,s,k(),i.measure());if(!o){i.hide();return}i.showAt(o.position)}dispose(){this.focusContextUnregister?.(),this.focusContextUnregister=null,this.entityResolverUnregister?.(),this.entityResolverUnregister=null,this.debugStateUnsubscribe?.(),this.debugStateUnsubscribe=null,this.endPointerCapture(),this.transformTool.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":Ri(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}}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 ut,direction:new ut(0,0,-1)}}handleAction(e){let t=Fe();if(t!=="select"&&t!=="delete"&&t!=="add")return;let r=this.stage.world?.raycast(e.origin,e.direction,this.options.maxRayDistance)??null;switch(t){case"select":{let n=r?.uuid??null;n&&this.resolveEntity(n)?Ie(n):Ie(null);break}case"delete":{let n=r?.uuid??null;if(!n)break;this.stage.entityDelegate.detachEntity(n)&&I({opId:Li(10),kind:"delete",label:"Delete entity",entries:[{uuid:n}]});break}case"add":this.placeEntity(e,r);break}}placeEntity(e,t){let i=it(e,t,k());if(!i)return;let{position:r,normal:n}=i,s=u.addTypeId?ee(u.addTypeId):null;if(!s&&!this.options.addEntityFactory){this.warnMissingAddSource();return}let o=s?s.create({position:{x:r.x,y:r.y,z:r.z},normal:{x:n.x,y:n.y,z:n.z},props:{...s.defaultProps??{},...u.addTypeProps??{}}}):this.options.addEntityFactory({position:r,normal:n});o&&Promise.resolve(o).then(async l=>{l&&(await this.stage.entityDelegate.spawnEntity(l),this.restOnSurface(l,r,n),I({opId:Li(10),kind:"create",label:`Add ${s?.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"||(dt.setFromObject(r),dt.isEmpty()))return;dt.getSize(Oi);let n=tt(t,Oi,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),wt("warn",e)}attachDomListeners(){let e=this.stage.rendererManager?.getDomElement();if(!e)return!1;let t=s=>{let o=e.getBoundingClientRect(),l=(s.clientX-o.left)/o.width*2-1,c=-((s.clientY-o.top)/o.height*2-1);this.mouseNdc.set(l,c)},i=s=>{t(s),this.transformTool.isDragging&&this.transformTool.pointerMove(this.currentRay(),s.altKey)},r=s=>{if(s.button!==0)return;t(s);let o=this.currentRay();if(this.transformTool.pointerDown(o)){this.beginPointerCapture(e,s.pointerId);return}this.handleAction(o)},n=()=>{this.transformTool.isDragging&&(this.transformTool.pointerUp(),this.endPointerCapture())};return e.addEventListener("pointermove",i),e.addEventListener("pointerdown",r),e.addEventListener("pointerup",n),e.addEventListener("pointercancel",n),this.domDisposeFns.push(()=>e.removeEventListener("pointermove",i),()=>e.removeEventListener("pointerdown",r),()=>e.removeEventListener("pointerup",n),()=>e.removeEventListener("pointercancel",n)),!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 mn}from"three";var Re=class{stage;constructor(e){this.stage=e}createDefaultCamera(){let e=window.innerWidth,t=window.innerHeight,i=new mn(e,t);return new w(m.ThirdPerson,i)}resolveCamera(e,t){return e||(t?t.cameraRef:this.createDefaultCamera())}buildCameraManager(e,...t){let i=new ge;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 s=n.cameraRef;i.addCamera(s,s.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 ke=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"?$.emit("stage:loading:start",t):e.type==="progress"?$.emit("stage:loading:progress",t):e.type==="complete"&&$.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 Le=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)},E.on("entity:model:loaded",this.modelLoadedHandler)}observe(e){if(e.group||e.mesh){U(e.options)||(this.scene?.addEntityGroup(e),Z(e),L(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),Z(i),L(i),U(i.options)||this.onEntityReady?.(i),this.pendingEntities.delete(e)}dispose(){this.modelLoadedHandler&&(E.off("entity:model:loaded",this.modelLoadedHandler),this.modelLoadedHandler=null),this.pendingEntities.clear(),this.onEntityReady=null,this.scene=null}};import{StageBodyKind as Ai}from"@zylem/behaviors/core";var hn=200,Oe=class a{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 Q){e.create();for(let i of e.getChildren())i instanceof V&&await this.spawnEntity(i);e.nodeSetup({me:e,globals:g(),camera:this.camera}),this.addEntityToStage(e);return}let t=e.create();Dt(t),this.registerBehaviorLinks(t),this.ensureEnvironmentStatic(t),this.maybeAttachEntityPhysics(t);for(let i of e.getChildren())i instanceof V&&await this.spawnEntity(i);e.nodeSetup({me:e,globals:g(),camera:this.camera}),this.tryRegisterRenderStrategy(t),D(t)||this.scene.addEntityGroup(t),L(t),this.addEntityToStage(t),this.entityModelDelegate.observe(t),Mt(t)}handleLateModelReady(e){!this.world||!this.scene||!this.childrenMap.has(e.uuid)||(this.ensureEnvironmentStatic(e),this.maybeAttachEntityPhysics(e),this.tryRegisterRenderStrategy(e),D(e)||this.scene.addEntityGroup(e),L(e))}tryRegisterRenderStrategy(e){this.renderStrategy&&this.renderStrategy.register(e)}ensureEnvironmentStatic(e){if(G(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!==Ai.Static&&(e.bodyDesc.kind=Ai.Static)}maybeAttachEntityPhysics(e){if(!(!this.world||e.physicsAttached||!e.colliderDesc)){if(e instanceof te){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),D(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(),E.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),D(i)||this.scene.addEntityGroup(i),Tt(i),_t(i),this.addEntityToStage(i),this.entityModelDelegate.observe(i),!0}isDetached(e){return this.detachedMap.has(e)}evictOldestDetached(){for(;this.detachedMap.size>hn;){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:g()})}catch{}A(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 Rt?{...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(T(t)){this.handleEntityImmediatelyOrQueue(t);continue}if(typeof t=="function"){try{let i=t();T(i)?this.handleEntityImmediatelyOrQueue(i):q(i)&&this.handlePromiseWithSpawnOnResolve(i)}catch(i){console.error("Error executing entity factory",i)}continue}q(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 s=await n;s&&await this.spawnEntity(s)}catch(s){console.error("Failed to resolve pending stage entity",s)}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)??a.EMPTY_BEHAVIOR_LINKS,createEntity:Ue,getGlobals:g}):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:g()})}catch{}A(t),e.push(t.uuid)}),this.detachedMap.forEach(({entity:t})=>{try{t.nodeDestroy?.({me:t,globals:g()})}catch{}A(t)}),this.detachedMap.clear(),this.childrenMap.clear(),this.debugMap.clear(),this.entityAddedHandlers=[];for(let t of e)E.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){let n=r.descriptor.key,s={entity:e,ref:r};i.push(s);let o=this.behaviorEntityIndex.get(n);o||(o=new Set,this.behaviorEntityIndex.set(n,o)),o.add(s);let l=this.behaviorSystemByKey.get(n);if(!l&&!this.registeredSystemKeys.has(n)){let c=r.descriptor.systemFactory({world:this.world,scene:this.scene,wasmStage:this.wasmStage,getBehaviorLinks:d=>this.behaviorEntityIndex.get(d)??a.EMPTY_BEHAVIOR_LINKS,createEntity:Ue,getGlobals:g});l=c,this.behaviorSystems.push(c),this.behaviorSystemByKey.set(n,c),this.registeredSystemKeys.add(n)}l?.attach?.(s)}this.behaviorLinksByUuid.set(e.uuid,i)}unregisterBehaviorLinks(e){let t=this.behaviorLinksByUuid.get(e?.uuid);if(t){for(let i of t){let r=i.ref?.descriptor?.key;if(!r)continue;let n=this.behaviorEntityIndex.get(r);n&&(this.behaviorSystemByKey.get(r)?.detach?.(i),n.delete(i),n.size===0&&this.behaviorEntityIndex.delete(r))}this.behaviorLinksByUuid.delete(e.uuid)}}};var fn="Stage",Ae=class extends Se{type=fn;state={...Bt};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=gn(),this.cameraDelegate=new Re(this),this.loadingDelegate=new ke,this.entityModelDelegate=new Le,this.entityDelegate=new Oe(this.loadingDelegate,this.entityModelDelegate);let t=fi(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 zi(0,0,0)}setState(){let{backgroundColor:e,backgroundImage:t}=this.state,i=e instanceof Bi?e:new Bi(e);zt(i),Ft(t),It(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 Ce(e,r,this.state);let n=this.gravity??new zi(0,0,0);if(this.world=await be.create(n,this.state.physicsRate),this.scene.setup(),this.cameraManagerRef&&this.rendererManager){await this.scene.setupCameraManager(this.scene.scene,this.cameraManagerRef,this.rendererManager);let o=this.cameraManagerRef.primaryCamera;o&&(this.rendererManager.setPostProcessingEffects(this.state.postProcessingEffects??[]),this.rendererManager.setupPostProcessing(this.scene.scene,o.camera)),this.rendererManager.startRenderLoop(()=>{this.cameraManagerRef?.render(this.scene.scene)})}else await this.scene.setupCamera(this.scene.scene,r);let s=this.resolveRenderer(r);await O.configureGLTFRuntime({renderer:s,...ye(this.state.assetLoaders?.gltf)}),this.entityModelDelegate.attach(this.scene,o=>this.entityDelegate.handleLateModelReady(o)),this.renderStrategy=new oe,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 _e(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;P("behaviorSystems",()=>{for(let n of this.entityDelegate.behaviorSystems)n.update(void 0,t)}),P("entityLoop",()=>{for(let n of this.entityDelegate.childrenMap.values()){let s=this.childUpdateParams;s.delta=e.delta,s.inputs=e.inputs,s.globals=e.globals,s.camera=e.camera,s.stage=e.stage,s.game=e.game,s.me=n,n.nodeUpdate(s);let o=n;o.transformStore&&Ut(o,o.transformStore),n.markedForRemoval&&this.entityDelegate.removeEntityByUuid(n.uuid)}}),P("worldUpdate",()=>{i.update(e)}),P("behaviorPostUpdate",()=>{for(let n of this.entityDelegate.behaviorSystems)n.postUpdate?.(void 0,t)}),P("syncRenderPoses",()=>{vi({_childrenMap:this.entityDelegate.childrenMap,_world:i})}),P("renderStrategy",()=>{this.renderStrategy?.update(i.interpolationAlpha)}),P("camera",()=>{this.cameraManagerRef?this.cameraManagerRef.update(t):this.cameraRef?.update(t)}),P("scene",()=>{r.update({delta:t})}),ai()}outOfLoop(){this.debugUpdate()}debugUpdate(){X()&&(je("debugUpdate"),this.debugDelegate?.update(),Ke())}_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,Vt(),A(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 yn}from"valtio/vanilla";import{Vector3 as bn}from"three";var vn={backgroundColor:re,backgroundImage:null,inputs:{p1:["gamepad-1","keyboard"],p2:["gamepad-2","keyboard"]},gravity:new bn(0,0,0),variables:{}},R=yn({...vn});function Fi(a){let e=Cn(),t={};return typeof a[0]=="object"&&(t=a.shift()??{}),[{...e,...t},...a]}function Cn(){return{backgroundColor:R.backgroundColor,backgroundImage:R.backgroundImage??null,inputs:R.inputs?{...R.inputs}:void 0,gravity:R.gravity,variables:R.variables?{...R.variables}:void 0}}var pt=class{wrappedStage;options=[];_pendingEntities=[];setupCallbacks=[];updateCallbacks=[];destroyCallbacks=[];pendingLoadingCallbacks=[];eventDelegate=new vt;inputConfig=null;onInputConfigChanged=null;constructor(e){this.options=e,this.wrappedStage=null;let t=this.options[0];O.prepareGLTFRuntime(ye(t?.assetLoaders?.gltf))}setInputConfiguration(...e){return this.inputConfig=bt(...e),this.onInputConfigChanged&&this.onInputConfigChanged(),this}async load(e,t,i){ne.entities=[];let r=[...this.options,...this._pendingEntities];this._pendingEntities=[],this.wrappedStage=new Ae(r),this.wrappedStage.wrapperRef=this,this.pendingLoadingCallbacks.forEach(c=>{this.wrappedStage.onLoading(c)}),this.pendingLoadingCallbacks=[];let n=t instanceof y?t.cameraRef:t;await this.wrappedStage.load(e,n,i);let s=null,o=!1,l=()=>{if(o=!1,!s?.length){s=null;return}let c=s;s=null,ne.entities=[...ne.entities,...c]};this.wrappedStage.onEntityAdded(c=>{if(U(c.options))return;let d=this.wrappedStage.buildEntityState(c);s||(s=[]),s.push(d),o||(o=!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 y?e.cameraRef:e;return this.wrappedStage?.addCamera(i,t)??null}removeCamera(e){return e instanceof y?this.wrappedStage?.removeCamera(e.cameraRef)??!1:this.wrappedStage?.removeCamera(e)??!1}setActiveCamera(e){return e instanceof y?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),E.emit(e,t)}listen(e,t){return this.eventDelegate.listen(e,t)}dispose(){this.eventDelegate.dispose()}};function Ol(...a){let e=Fi(a);return new pt([...e])}export{_n as a,ae as b,G as c,U as d,D as e,se as f,oe as g,jn as h,m as i,M as j,de as k,_ as l,B as m,j as n,z as o,ge as p,y as q,$a as r,as as s,mr as t,pt as u,Ol as v};
@@ -0,0 +1 @@
1
+ import{a as T,b as u,r as w,t as f,v as d}from"./chunk-SAQA4SXW.js";import{j as v}from"./chunk-4QLJUQSJ.js";import{a as _,g as E,i as O,j as b}from"./chunk-7WRQ2UAN.js";import{Group as k,Quaternion as G,Vector3 as N}from"three";import{ParticleEmitterBehavior as x}from"@zylem/behaviors/particle-emitter";var V={...w,effect:{create(){throw new Error("createParticleSystem(...) requires an effect or preset definition.")}},preset:void 0,autoplay:!0,localOffset:void 0,followPosition:!0,followRotation:!0,autoDestroy:!1},I=Symbol("ParticleSystem");function W(n){return{effect:n.preset??n.effect,autoplay:n.autoplay,localOffset:n.localOffset,followPosition:n.followPosition,followRotation:n.followRotation,autoDestroy:n.autoDestroy}}var P=class n extends f{static type=I;particleHandle=null;constructor(o,e=!0){super(),this.options=u(V,o),this.group=new k;let t=this.options.position;t&&this.group.position.copy(b(t)),this.__zylemParticleSystemEntity=!0,this.bindStandaloneTransforms(),e&&(this.particleHandle=this.use(x,W(this.options)))}bindStandaloneTransforms(){let o=()=>{this.options.position=new N(this.group?.position.x??0,this.group?.position.y??0,this.group?.position.z??0)},e=()=>{this.group&&(this._rotation2DAngle=this.group.rotation.z)};this.setPosition=(t,i,r)=>{this.group?.position.set(t,i,r),o()},this.setPositionX=t=>{this.group&&(this.group.position.x=t,o())},this.setPositionY=t=>{this.group&&(this.group.position.y=t,o())},this.setPositionZ=t=>{this.group&&(this.group.position.z=t,o())},this.getPosition=()=>this.group?{x:this.group.position.x,y:this.group.position.y,z:this.group.position.z}:null,this.setRotation=(t,i,r)=>{this.group?.rotation.set(t,i,r),e()},this.setRotationX=t=>{this.group&&(this.group.rotation.x=t,e())},this.setRotationY=t=>{this.group&&(this.group.rotation.y=t,e())},this.setRotationZ=t=>{this.group&&(this.group.rotation.z=t,e())},this.setRotationDegrees=(t,i,r)=>{this.group?.rotation.set(t*Math.PI/180,i*Math.PI/180,r*Math.PI/180),e()},this.setRotationDegreesX=t=>{this.group&&(this.group.rotation.x=t*Math.PI/180,e())},this.setRotationDegreesY=t=>{this.group&&(this.group.rotation.y=t*Math.PI/180,e())},this.setRotationDegreesZ=t=>{this.group&&(this.group.rotation.z=t*Math.PI/180,e())},this.rotateX=t=>{this.group?.rotateX(t),e()},this.rotateY=t=>{this.group?.rotateY(t),e()},this.rotateZ=t=>{this.group?.rotateZ(t),e()},this.getRotation=()=>{if(!this.group)return null;let t=new G;return this.group.getWorldQuaternion(t),t}}resolveParticleHandle(){if(this.particleHandle)return this.particleHandle;let o=this.getBehaviorRefs().find(i=>i.descriptor.key===x.key);if(!o)return null;let e={getFSM:()=>o.fsm??null,getOptions:()=>o.options,ref:o},t=x.createHandle?.(o)??{};return this.particleHandle={...e,...t},this.particleHandle}play(){this.resolveParticleHandle()?.play()}stop(){this.resolveParticleHandle()?.stop()}pause(){this.resolveParticleHandle()?.pause()}restart(){this.resolveParticleHandle()?.restart()}burst(){this.resolveParticleHandle()?.burst()}isPlaying(){return this.resolveParticleHandle()?.isPlaying()??!1}getSystem(){return this.resolveParticleHandle()?.getSystem()}buildInfo(){return{...super.buildInfo(),type:String(n.type)}}};function Z(n,o=!0){let e=new P(n,o);return d(e,t=>Z(t,!1))}function X(n){return Z(n,!0)}import{Group as U,Sprite as Q,SpriteMaterial as $,CanvasTexture as q,LinearFilter as R,Color as H,ClampToEdgeWrapping as M}from"three";import{getCooldown as z}from"@zylem/behaviors/cooldown";var K={"top-left":{fx:0,fy:0},"top-center":{fx:.5,fy:0},"top-right":{fx:1,fy:0},"center-left":{fx:0,fy:.5},center:{fx:.5,fy:.5},"center-right":{fx:1,fy:.5},"bottom-left":{fx:0,fy:1},"bottom-center":{fx:.5,fy:1},"bottom-right":{fx:1,fy:1}},D=192,j={xs:8,sm:16,md:32,lg:48,xl:64},C={position:void 0,cooldown:"",iconSize:"md",fillColor:"#333333",showTimer:!0,stickToViewport:!0,screenAnchor:"top-left",screenPosition:{x:0,y:0},zDistance:1,overlayColor:"rgba(0, 0, 0, 0.65)"},J=Symbol("CooldownIcon"),S=class extends f{static type=J;_sprite=null;_texture=null;_canvas=null;_ctx=null;_cameraRef=null;_iconTexture=null;_iconImage=null;_lastRenderedProgress=-1;constructor(o){super(),this.options=u(C,o),this.options.screenPosition=O(this.options.screenPosition,C.screenPosition),this.group=new U,this.createSprite(),this.prependSetup(this.iconSetup.bind(this)),this.prependUpdate(this.iconUpdate.bind(this)),this.onCleanup(this.iconDestroy.bind(this))}createSprite(){this._canvas=document.createElement("canvas"),this._canvas.width=256,this._canvas.height=256,this._ctx=this._canvas.getContext("2d"),this._texture=new q(this._canvas),this._texture.minFilter=R,this._texture.magFilter=R,this._texture.wrapS=M,this._texture.wrapT=M;let e=new $({map:this._texture,transparent:!0,depthTest:!1,depthWrite:!1});if(this._sprite=new Q(e),this.group?.add(this._sprite),this.options.icon){let t=new Image;t.crossOrigin="anonymous",t.onload=()=>{this._iconImage=t,this.redraw(this._lastRenderedProgress>=0?this._lastRenderedProgress:1)},t.src=this.options.icon}this.redraw(1)}redraw(o){if(!this._canvas||!this._ctx)return;let e=this._ctx,t=this._canvas.width,i=this._canvas.height,r=t/2,s=i/2,l=Math.min(r,s);if(e.clearRect(0,0,t,i),this._iconImage?e.drawImage(this._iconImage,0,0,t,i):(e.fillStyle=this.toCssColor(this.options.fillColor??"#333333"),e.fillRect(0,0,t,i)),o<1){let p=(1-o)*Math.PI*2,c=-Math.PI/2,h=c+p;if(e.save(),e.fillStyle=this.options.overlayColor??"rgba(0, 0, 0, 0.65)",e.beginPath(),e.moveTo(r,s),e.arc(r,s,l+1,c,h,!1),e.closePath(),e.fill(),e.restore(),this.options.showTimer){let a=z(this.options.cooldown);if(a){let m=Math.max(0,a.duration-a.elapsed),g=m>=10?Math.ceil(m).toString():m.toFixed(1),y=Math.floor(t*.3);e.font=`bold ${y}px sans-serif`,e.textAlign="center",e.textBaseline="middle",e.fillStyle="#FFFFFF",e.strokeStyle="#000000",e.lineWidth=2,e.strokeText(g,r,s),e.fillText(g,r,s)}}}this._texture&&(this._texture.needsUpdate=!0),this._lastRenderedProgress=o}toCssColor(o){return typeof o=="string"?o:`#${(o instanceof H?o:new H(o)).getHexString()}`}getResolution(){try{let o=this._cameraRef?.renderer?.domElement;if(o)return{width:o.clientWidth||1,height:o.clientHeight||1}}catch{}return{width:this._cameraRef?.screenResolution?.x??1,height:this._cameraRef?.screenResolution?.y??1}}iconSetup(o){this._sprite||this.createSprite(),this._cameraRef=o.camera,this.options.stickToViewport&&this._cameraRef&&(this._cameraRef.camera.add(this.group),this.updateStickyTransform())}iconUpdate(o){let t=z(this.options.cooldown)?.progress??1;(Math.abs(t-this._lastRenderedProgress)>.02||t===1&&this._lastRenderedProgress!==1)&&this.redraw(t),this.options.stickToViewport&&this._cameraRef&&this.updateStickyTransform()}resolveScreenPosition(o,e){let t=this.options.screenAnchor??"top-left",i=E(this.options.screenPosition,_),r=i.x,s=i.y,{fx:l,fy:p}=K[t],c=l*o,h=p*e,a=e/D;return{px:c+r*a,py:h+s*a}}resolveIconSize(o){let e=this.options.iconSize??"md",t,i;typeof e=="string"?t=i=j[e]:typeof e=="number"?t=i=e:(t=e.width,i=e.height);let r=o/D;return{widthPx:t*r,heightPx:i*r}}computeWorldExtents(o,e){let t=1,i=1;if(o.isPerspectiveCamera){let r=o,s=Math.tan(r.fov*Math.PI/180/2)*e;t=s*r.aspect,i=s}else if(o.isOrthographicCamera){let r=o;t=(r.right-r.left)/2,i=(r.top-r.bottom)/2}return{worldHalfW:t,worldHalfH:i}}updateStickyTransform(){if(!this._sprite||!this._cameraRef)return;let o=this._cameraRef.camera,{width:e,height:t}=this.getResolution(),{px:i,py:r}=this.resolveScreenPosition(e,t),s=Math.max(.001,this.options.zDistance??1),{worldHalfW:l,worldHalfH:p}=this.computeWorldExtents(o,s),c=i/e*2-1,h=1-r/t*2,a=c*l,m=h*p;{let y=p*2/t,{widthPx:F,heightPx:L}=this.resolveIconSize(t),A=Math.max(1e-4,F*y),B=Math.max(1e-4,L*y);this._sprite.scale.set(A,B,1)}this.group?.position.set(a,m,-s)}iconDestroy(){this._texture?.dispose(),this._sprite?.material&&this._sprite.material.dispose(),this._sprite&&this._sprite.removeFromParent(),this.group?.removeFromParent(),this._iconTexture?.dispose(),this._sprite=null,this._texture=null,this._canvas=null,this._ctx=null,this._cameraRef=null,this._iconTexture=null,this._iconImage=null}};function Y(...n){let o=n.filter(t=>!(t instanceof T)),e={...C};for(let t of o)e={...e,...t};return d(new S(e),t=>Y(t??{}))}function tt(n,o,e){e({me:n,globals:o})}function et(n,o){let e=o??v();tt(n,e,n.nodeDestroy.bind(n))}export{I as a,P as b,X as c,Y as d,et as e};
@@ -0,0 +1,24 @@
1
+ import{b as he,d as G,j as Te,u as L,v as E}from"./chunk-FYQNZCIP.js";import{b as Re}from"./chunk-7GYFZKK7.js";import{b as y}from"./chunk-Q2YDBMVY.js";import{b as Ee}from"./chunk-QDQ4QMAI.js";import{c as we,e as Ce,f as xe}from"./chunk-AE3CTVHY.js";import{b as ye,c as be,d as ve,f as Se}from"./chunk-DQQA3VJH.js";import{d as g,g as me,h as K}from"./chunk-DECK4UEC.js";import{k as Be}from"./chunk-YOVE25NW.js";import{a as W,t as j}from"./chunk-SAQA4SXW.js";import{j as Ge}from"./chunk-7NYP4YAG.js";import{a as fe,b}from"./chunk-AIQ6IVT5.js";import{c as S}from"./chunk-D2PATZCC.js";import{c as re,d as C,e as le,h as ue,i as pe,j as de,k as J,l as x,m as ce}from"./chunk-4QLJUQSJ.js";import{j as $}from"./chunk-7WRQ2UAN.js";import{g as ge}from"./chunk-PCFF4LLO.js";import{l as v}from"./chunk-UG22Z42P.js";function _e(){return{pressed:!1,released:!1,held:0}}function Ne(){return{value:0,held:0}}function k(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[r,s]=(o||"").split(".");if(!r||!s)continue;let l=r.toLowerCase(),u=s.toLowerCase();if(l==="buttons"){let p={a:"A",b:"B",x:"X",y:"Y",start:"Start",select:"Select",l:"L",r:"R"}[u];p&&i.push({category:"buttons",property:p})}else if(l==="directions"){let p={up:"Up",down:"Down",left:"Left",right:"Right"}[u];p&&i.push({category:"directions",property:p})}else if(l==="shoulders"){let p={ltrigger:"LTrigger",rtrigger:"RTrigger"}[u];p&&i.push({category:"shoulders",property:p})}else if(l==="axes"){let p={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}}[u];p&&i.push({category:"axes",property:p.property,axisDirection:p.direction})}}i.length>0&&e.set(t,i)}return e}function d(a,e){return!a&&!e?_e():a?e?{pressed:a.pressed||e.pressed,released:a.released||e.released,held:a.held+e.held}:{...a}:{...e}}function f(a,e){return!a&&!e?Ne():a?e?{value:a.value+e.value,held:a.held+e.held}:{...a}:{...e}}var w=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=k(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 r=null;for(let s of o)if(s.category==="axes")n.has(s.property)||n.set(s.property,0),this.isKeyPressed(i)&&n.set(s.property,n.get(s.property)+s.axisDirection);else{r||(r=this.handleButtonState(i,t));let l=e[s.category]??={};l[s.property]=d(l[s.property],r)}}if(n.size>0){e.axes||(e.axes={});for(let[i,o]of n.entries()){let r=`custom:${i}`,s=this.analogStates.get(r);s||(s={value:0,held:0},this.analogStates.set(r,s)),s.value=o,s.held=o!==0?s.held+t:0,e.axes[i]=f(e.axes[i],s)}}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 D=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 Fe}from"valtio/vanilla";var Xe=.002;function z(a,e,t){return Math.max(e,Math.min(t,a))}function Ye(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 R=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=Ye(this.targetElement);if(n){let i=n.getBoundingClientRect();if(i.width>0&&i.height>0){let o=i.left+i.width/2,r=i.top+i.height/2;this.pointerCenterX=z((e-o)/(i.width/2),-1,1),this.pointerCenterY=z((t-r)/(i.height/2),-1,1);return}}this.pointerCenterX=z((this.pointerX-.5)*2,-1,1),this.pointerCenterY=z((this.pointerY-.5)*2,-1,1)}onMouseMove=e=>{this.updatePointerPosition(e.clientX,e.clientY),!(g.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&&!g.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??Xe,this.lookMode=e?.lookMode??"delta",this.usePointerLock=e?.pointerLock??!1,this.compiledMapping=k(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=Fe(g,()=>{g.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,r]of this.compiledMapping.entries()){let s=o.toLowerCase();for(let l of r)if(l.category==="axes")n.has(l.property)||n.set(l.property,0),s==="movex"?n.set(l.property,n.get(l.property)+Math.max(-1,Math.min(1,this.movementX*this.sensitivity))*l.axisDirection):s==="movey"?n.set(l.property,n.get(l.property)+Math.max(-1,Math.min(1,this.movementY*this.sensitivity))*l.axisDirection):s in i&&this.mouseButtonDown.has(this.buttonIndexForAction(s))&&n.set(l.property,n.get(l.property)+l.axisDirection);else{let u=i[s];if(u){let m=u();if(m){let p=e[l.category]??={};p[l.property]=d(p[l.property],m)}}}}if(n.size>0){e.axes||(e.axes={});for(let[o,r]of n.entries()){let s=`custom:${o}`,l=this.analogStates.get(s);l||(l={value:0,held:0},this.analogStates.set(s,l)),l.value=Math.max(-1,Math.min(1,r)),l.held=r!==0?l.held+t:0,e.axes[o]=f(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){g.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 T(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,r=a.viewportSize?.height??window.innerHeight??0,s=Math.max(o,r),l=s===0||s<=1024;return a.allowViewportOnly&&a.viewportSize?l:t||(n||i)&&l}var Ze=["A","B","X","Y","Start","Select","L","R","LTrigger","RTrigger","Up","Down","Left","Right"],Je=new Set(["flex","flexGrow","flexShrink","fontWeight","lineHeight","opacity","order","zIndex","zoom"]),Ke={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"}},$e={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}}},M=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:T()}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),B(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 Ze){let i=Ke[n],o=e?.[n];if(o===!1)continue;let r={...i,...o??{},style:{...i.style,...o?.style},position:{...i.position,...o?.position},label:o?.label??i.label??n,size:o?.size??i.size??72};r.enabled!==!1&&t.push([n,r])}return t}resolveJoysticks(){if(this.config.joysticks===!1)return[];let e=this.config.joysticks,t=[];for(let n of["left","right"]){let i=$e[n],o=e?.[n];if(o===!1)continue;let r={...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};r.enabled!==!1&&t.push([n,r])}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",B(n,t.position),B(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??je(t.label),n.appendChild(i),n.addEventListener("pointerdown",r=>{if(!Me(r))return;let s=this.buttons.get(e);!s||s.pointerId!==null||(this.consumeEvent(r),s.pointerId=r.pointerId,this.updateButtonVisual(s,!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",B(n,t.position),B(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??qe(),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??Qe(),n.append(i,o);let r={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,r),n.addEventListener("pointerdown",s=>{if(!Me(s))return;let l=this.joysticks.get(e);if(!l||l.pointerId!==null)return;this.consumeEvent(s);let u=l.element.getBoundingClientRect();l.pointerId=s.pointerId,l.centerX=u.left+u.width/2,l.centerY=u.top+u.height/2,this.updateJoystickVisual(l,!0),this.updateJoystickFromPoint(l,s.clientX,s.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]=f(e.axes[t],n)}assignButtonState(e,t,n){if(t.category==="buttons"){e.buttons??={},e.buttons[t.property]=d(e.buttons[t.property],n);return}if(t.category==="directions"){e.directions??={},e.directions[t.property]=d(e.directions[t.property],n);return}e.shoulders??={},e.shoulders[t.property]=d(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,r=Math.hypot(i,o),s=e.config.maxDistance,l=r>s&&r>0?s/r:1;e.rawX=i*l,e.rawY=o*l;let u=We(e.rawX/s,e.rawY/s,e.config.deadzone);e.valueX=u.x,e.valueY=u.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 B(a,e){if(e)for(let[t,n]of Object.entries(e)){if(n==null)continue;let i=typeof n=="number"&&!Je.has(t)?`${n}px`:String(n);t.includes("-")?a.style.setProperty(t,i):a.style[t]=i}}function We(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 je(a){let e=et(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 qe(){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 Qe(){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 et(a){return a.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function Me(a){return a.pointerType==="touch"}var A=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:r,isP1:s}of n)this.addConfigurableProviders(i,o,s),this.addInputProvider(i,new D(r))}configure(e){let t=this.buildPlayerEntries(e);for(let{player:n,config:i,isP1:o}of t){let s=(this.inputMap.get(n)??[]).filter(l=>l instanceof w||l instanceof R||l instanceof M?(l.dispose(),!1):!0);this.inputMap.set(n,[...this.createConfigurableProviders(i,o),...s])}}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}`,r=n.reduce((s,l)=>{let u=l.getInput(e);return this.mergeInputs(s,u)},{});t[o]={playerNumber:i,...r}}),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 w(e.key,{includeDefaultBase:i}))}else t&&n.push(new w);return e?.mouse&&n.push(new R(e.mouse,this.mouseTargetElement)),e?.touch&&n.push(new M(e.touch,this.targetElement)),n}mergeInputs(e,t){return{buttons:{A:d(e.buttons?.A,t.buttons?.A),B:d(e.buttons?.B,t.buttons?.B),X:d(e.buttons?.X,t.buttons?.X),Y:d(e.buttons?.Y,t.buttons?.Y),Start:d(e.buttons?.Start,t.buttons?.Start),Select:d(e.buttons?.Select,t.buttons?.Select),L:d(e.buttons?.L,t.buttons?.L),R:d(e.buttons?.R,t.buttons?.R)},directions:{Up:d(e.directions?.Up,t.directions?.Up),Down:d(e.directions?.Down,t.directions?.Down),Left:d(e.directions?.Left,t.directions?.Left),Right:d(e.directions?.Right,t.directions?.Right)},axes:{Horizontal:f(e.axes?.Horizontal,t.axes?.Horizontal),Vertical:f(e.axes?.Vertical,t.axes?.Vertical),SecondaryHorizontal:f(e.axes?.SecondaryHorizontal,t.axes?.SecondaryHorizontal),SecondaryVertical:f(e.axes?.SecondaryVertical,t.axes?.SecondaryVertical)},shoulders:{LTrigger:d(e.shoulders?.LTrigger,t.shoulders?.LTrigger),RTrigger:d(e.shoulders?.RTrigger,t.shoulders?.RTrigger)},pointer:t.pointer??e.pointer}}};var V=class{_previousTime;_currentTime;_startTime;_delta;_elapsed;_timescale;_document;_pageVisibilityHandler;constructor(){this._previousTime=0,this._currentTime=0,this._startTime=q(),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=tt.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=q()-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:q())-this._startTime,this._delta=(this._currentTime-this._previousTime)*this._timescale,this._elapsed+=this._delta),this}};function q(){return performance.now()}function tt(){this._document.hidden===!1&&this.reset()}var I={FourByThree:1.3333333333333333,SixteenByNine:1.7777777777777777,NineBySixteen:.5625,TwentyOneByNine:2.3333333333333335,OneByOne:1},H=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 u=n;return{width:Math.round(u*this.aspectRatio),height:u}}let s=t,l=Math.round(s/this.aspectRatio);return{width:s,height:l}}if(t>0){let r=t,s=Math.round(r/this.aspectRatio);return{width:r,height:s}}if(n>0){let r=n;return{width:Math.round(r*this.aspectRatio),height:r}}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 Ie={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 Q(a){return Ie[a].displayAspect}function ee(a,e){let t=Ie[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 te(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 ne=null,ie=class{constructor(e,t,n,i,o,r,s,l,u,m,p,h,Z){this.id=e;this.globals=t;this.stages=n;this.debug=i;this.time=o;this.input=r;this.aspectRatio=s;this.internalResolution=l;this.fullscreen=u;this.bodyBackground=m;this.container=p;this.containerId=h;this.canvas=Z}};function nt(a={}){return a.deviceProfile==="mobile"?!0:a.deviceProfile==="desktop"?!1:a.viewportSize?T({viewportSize:a.viewportSize,allowViewportOnly:!0}):T()}function it(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 at(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:I.SixteenByNine,fullscreen:!0,bodyBackground:"#000000",containerId:e}}var Pe=360;function Le(a,e){if(!a)return;if(typeof a=="string"){if(a==="native")return ne;let i=te(a);if(i)return i;if(e){let o=ee(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 ot(a,e,t,n){if(typeof a=="number")return a;if(typeof a=="string")return I[a]??t;if(e)try{return Q(e)||t}catch{return t}return n?n.width/n.height:t}function st(a){let e=Number.isFinite(a)&&a>0?a:I.SixteenByNine;if(e>=1){let i=Pe;return{width:Math.round(i*e),height:i}}let t=Pe,n=Math.round(t/e);return{width:t,height:n}}function P(a,e={}){let t=at({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=it(n,a?.container??null),o=a?.mobile,r=nt(e),s=r?o?.preset??a?.preset:a?.preset,l=Le(a?.resolution,a?.preset),u=Le(o?.resolution,o?.preset??a?.preset),m=(r?ke(u):void 0)??ke(l),p=r?o?.aspectRatio??a?.aspectRatio:a?.aspectRatio,h=ot(p,s,t.aspectRatio,m),Z=rt(r,u,l,h),Ve=a?.fullscreen??t.fullscreen,He=a?.bodyBackground??t.bodyBackground,Oe=a?.canvas??void 0,Ue=lt(a?.input??t.input,o?.controls);return new ie(a?.id??t.id,a?.globals??t.globals,a?.stages??t.stages,!!(a?.debug??t.debug),a?.time??t.time,Ue,h,Z,Ve,He,i,n,Oe)}function ke(a){if(a)return a}function rt(a,e,t,n){if(a)return e===ne?void 0:e??st(n);if(t!==ne)return t}function lt(a,e){if(!e)return a;let n=ge("p1",{enabled:"auto",...e===!0?{}:e});return v(n,a??{})}function ut(a){return{...a}}var O=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 H({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 pt from"stats.js";import{subscribe as dt}from"valtio/vanilla";var U=class{statsRef=null;unsubscribe=null;constructor(){this.updateDebugUI(),this.unsubscribe=dt(g,()=>{this.updateDebugUI()})}begin(){this.statsRef?.begin()}end(){this.statsRef?.end()}updateDebugUI(){g.enabled&&!this.statsRef?(this.statsRef=new pt,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)):!g.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 _=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}`;b.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 ct}from"@zylem/bridge";var N=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 F=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 _;rendererObserver=new N;eventBusUnsubscribes=[];thumbnailUnsubscribes=[];lastPublishedGameConfig=null;gameBridge=new Se;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 V,this.timer.connect(document),this.sourceOptions={...e},this.displayRuntime={...n};let i=P(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 A(i.input,{targetElement:this.gameCanvas?.getOverlayContainer(),mouseTargetElement:this.gameCanvas?.container}),this.loadDebugOptions(e),this.setGlobals(e),Ee(),this.gameBridge.connect({resolveEntity:o=>this.currentStage()?.wrappedStage?.entityDelegate.childrenMap.get(o)??null,setStageVariable:(o,r)=>{let s=this.currentStage()?.wrappedStage?.state;s&&(s.variables[o]=r)},createEntity:(o,r,s)=>{this.createCatalogEntity(o,r,s)},applySceneOperation:(o,r)=>{this.currentStage()?.wrappedStage?.debugDelegate?.applySceneOperation(o,r)}}),this.publishEntityCatalog(),this.catalogUnsubscribe=xe(()=>this.publishEntityCatalog())}publishEntityCatalog(){this.gameBridge.publishCatalog(Ce())}createCatalogEntity(e,t,n){let i=this.currentStage()?.wrappedStage,o=we(e);if(!i||!o)return;let r=n?.position??{x:0,y:0,z:0},s=o.create({position:r,props:{...o.defaultProps??{},...t??{}}});s&&Promise.resolve(s).then(l=>l&&i.entityDelegate.spawnEntity(l)).catch(l=>{console.error("entity:create failed",l)})}setDisplayRuntime(e){this.displayRuntime={...e};let t=P(this.sourceOptions,this.displayRuntime);this.resolvedConfig=t,this.rendererObserver.setConfig(t),this.gameCanvas?.setAspectRatio(t.aspectRatio),this.publishGameConfig()}loadGameCanvas(e){this.gameCanvas=new O({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&&(g.enabled=!!e.debug),this.debugDelegate=new U}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?Re(n):null,o=this.currentStage()??null,r=o?.wrappedStage??null,s=r?.scene?.scene??null,l=r?.cameraManagerRef?.primaryCamera?.camera??r?.cameraRef?.camera??null;i&&this.rendererManager?.initialized&&o&&s&&l&&this.rendererManager.beginSnapshotTransition(i,s,l),this.unloadCurrentStage();let m=e.options[0];if(this.loadingDelegate.wireStageLoading(e,t),this.rendererManager||(this.rendererManager=new he,await this.rendererManager.initRenderer()),y.setRenderer(this.rendererManager.renderer),await e.load(this.id,m?.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 p=this.params(),h={...this.stageSetupParams};h.inputs=p.inputs,h.globals=p.globals,h.camera=p.camera,h.stage=p.stage,h.game=p.game,h.me=e.wrappedStage,e.start(h)}this.publishGameConfig(),this.publishStageSnapshot()}applyInputConfig(e){let t=v(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(),y.clear(),e.onInputConfigChanged=null,e?.wrappedStage){try{e.wrappedStage.nodeDestroy({me:e.wrappedStage,globals:C.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 r=this.currentStage();if(r!==t||!r?.wrappedStage){this.totalTime+=o,C.time=this.totalTime;return}let s=this.stageUpdateParams;s.delta=n.delta,s.inputs=n.inputs,s.globals=n.globals,s.camera=n.camera,s.stage=n.stage,s.game=n.game,s.me=t.wrappedStage,t.wrappedStage?.nodeUpdate(s),this.totalTime+=o,C.time=this.totalTime}loop(e){this.debugDelegate?.begin(),me()||(this.timer.update(e),this.step(),this.previousTimeStamp=e),this.debugDelegate?.end(),this.outOfLoop(),this.isDisposed||(this.animationFrameId=requestAnimationFrame(this.frameCallback))}dispose(){this.isDisposed=!0,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&&(y.setRenderer(null),this.rendererManager.dispose(),this.rendererManager=null),y.clear(),ct().channel.reset(),this.timer.dispose(),this.customDestroy&&this.customDestroy({me:this,globals:C.globals}),x()}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(G(e.options))return null;let t=e.position??{x:0,y:0,z:0},n=e.rotation??{x:0,y:0,z:0},i=ye(e),o=be(e),r=y.get(e.uuid);return{uuid:e.uuid,name:e.name||"Unnamed",type:ve(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:r?.dataUrl??null,bounds:r?.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=r=>{if(!this.gameBridge.wantsThumbnails()||G(r.options))return;let s=r.group??r.mesh??null;s&&y.ensure(r.uuid,s).then(l=>{l&&!this.isDisposed&&this.gameBridge.queueThumbnails([{uuid:r.uuid,url:l.dataUrl,bounds:l.bounds}])})},n=e.wrappedStage.onEntityAdded(r=>{if(this.gameBridge.wantsEntityUpdates()){let s=this.buildEntitySummary(r);s&&this.gameBridge.queueEntityUpsert([s])}t(r)},{replayExisting:!0});this.thumbnailUnsubscribes.push(n);let i=r=>{if(!r.success)return;let s=e.wrappedStage?.entityDelegate.childrenMap.get(r.entityId);s&&(y.invalidate(r.entityId),t(s))};b.on("entity:model:loaded",i),this.thumbnailUnsubscribes.push(()=>{b.off("entity:model:loaded",i)});let o=r=>{y.invalidate(r.entityId),this.gameBridge.wantsEntityUpdates()&&this.gameBridge.queueEntityRemoved([r.entityId])};b.on("entity:destroyed",o),this.thumbnailUnsubscribes.push(()=>{b.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(G(i.options))continue;let o=i.group??i.mesh??null;o&&y.ensure(i.uuid,o).then(r=>{r&&!this.isDisposed&&this.gameBridge.queueThumbnails([{uuid:i.uuid,url:r.dataUrl,bounds:r.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(re.on("game:state:updated",e=>{this.gameBridge.publishVariable({path:e.path,value:e.value,previousValue:e.previousValue})}))}};async function De(a){let{getGameDefaultConfig:e}=await import("./game-default-F3KPYZ7X.js"),t={...e()},n=[],i=[],o=[];Object.values(a).forEach(s=>{if(s instanceof L)i.push(s);else if(s instanceof j)o.push(s);else if(s instanceof W)o.push(s);else if(s?.constructor?.name==="Object"&&typeof s=="object"){let l=Object.assign({...e()},{...s});n.push(l)}}),n.forEach(s=>{t=Object.assign(t,{...s})});let r=t;return r.input=n[0].input,i.forEach(s=>{s.addEntities(o)}),i.length?r.stages=i:r.stages[0].addEntities(o),r}function ze(a){return!!a.find(t=>t instanceof L)}function ae(a){for(let e of a)if(e&&typeof e=="object"&&!(e instanceof L)&&!(e instanceof W)&&!(e instanceof j)){let t=e;if(t.globals)return t.globals}}import{proxy as mt}from"valtio/vanilla";import{get as ht,set as gt}from"idb-keyval";import{pack as ft,unpack as yt}from"msgpackr";var c=mt({previous:null,current:null,next:null,isLoading:!1}),X={staticRegistry:new Map,registerStaticStage(a,e){this.staticRegistry.set(a,e)},async loadStageData(a){try{let e=await ht(a);if(e)return yt(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(!c.isLoading){c.isLoading=!0;try{c.current&&await gt(c.current.id,ft(c.current)),c.previous=c.current,c.current=c.next,c.current?.id!==a&&(e?c.current=await e(a):c.current=await this.loadStageData(a)),c.next=null}catch(t){console.error("Failed to transition stage:",t)}finally{c.isLoading=!1}}},async preloadNext(a,e){e?c.next=await e(a):c.next=await this.loadStageData(a)}};var oe={async createFromBlueprint(a){let e=E({});if(a.entities)for(let t of a.entities)try{let n=await Be.createFromBlueprint(t);e.add(n)}catch(n){console.error(`Failed to create entity ${t.id} for stage ${a.id}`,n)}return e}};var Y=class{wrappedGame=null;options;setupCallbacks=[];updateCallbacks=[];destroyCallbacks=[];pendingLoadingCallbacks=[];globalChangeCallbacks=[];globalChangesCallbacks=[];activeGlobalSubscriptions=[];eventDelegate=new fe;pendingInputConfig=null;displayRuntime={};refErrorMessage="lost reference to game";constructor(e){this.options=e,ze(e)||this.options.push(E());let t=ae(e);t&&J(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=v(...e);return this.pendingInputConfig=t,this.wrappedGame&&this.wrappedGame.setGlobalInputConfig(t),this}async start(){x();let e=ae(this.options);e&&J(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 De(this.options),t=P(e,this.displayRuntime);this.pendingInputConfig&&(t.input=v(t.input??{},this.pendingInputConfig));let n=new F({...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=ue(e,i=>{t(i,this.getCurrentStage())});this.activeGlobalSubscriptions.push(n)}for(let{paths:e,callback:t}of this.globalChangesCallbacks){let n=pe(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(){K(!0)}async resume(){K(!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 X.loadStageData(e),n=await oe.createFromBlueprint(t);await this.wrappedGame.loadStage(n),c.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(c.next){console.log("next stage called");let o=c.next.id;if(X.transitionForward(o),c.current){oe.createFromBlueprint(c.current).then(r=>{this.wrappedGame?.loadStage(r,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),ce(),x(),Ge.clearSharedMaterialCache()}dispatch(e,t){this.eventDelegate.dispatch(e,t),b.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 bt(...a){return new Y(a)}import{Euler as vt,Quaternion as St,Vector2 as wt}from"three";function Ct(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 wt(0,1))=>{if(!e.body){console.warn("body missing for entity during spawnRelative");return}let{x:i,y:o,z:r}=e.body.translation(),s=e._rotation2DAngle??0;try{let p=e.body.rotation(),h=new St(p.x,p.y,p.z,p.w);s=new vt().setFromQuaternion(h,"XYZ").z}catch{}let l=Math.sin(-s)*(n.x??0),u=Math.cos(-s)*(n.y??0),m=await Promise.resolve(a(i+l,o+u));return t.add(m),m}}}import{subscribe as xt}from"valtio/vanilla";var se="STAGE_STATE_CHANGE";function Gt(){return xt(S,()=>{let a={entities:S.entities,variables:S.variables};window.dispatchEvent(new CustomEvent(se,{detail:a}))})}function Et(){let a={entities:S.entities,variables:S.variables};window.dispatchEvent(new CustomEvent(se,{detail:a}))}import{MathUtils as Rt,Vector3 as Tt}from"three";var Ae={targetKey:"primary",offset:new Tt(0,0,0),lerpFactor:.1};function Bt(a){let e={...Ae,...a,offset:$(a?.offset,Ae.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 r=o.position.clone().add(e.offset),s=Te(i);if(!t)t=r.clone();else{let l=Rt.clamp(e.lerpFactor,0,1),u=1-Math.pow(1-l,n.dt*60);t.lerp(r,u)}return s.position.copy(t),s.lookAt=o.position.clone(),s},onDetach(){t=null}}}import{MeshBasicMaterial as Mt}from"three";function It(a,e,t){let n=e.cameraRef;if(!n.renderTarget){let r=t?.width??512,s=t?.height??512;n.createRenderTarget(r,s)}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 Mt({map:i});a.mesh.material=o}export{I as a,Q as b,ee as c,te as d,ut as e,c as f,X as g,Y as h,bt as i,Ct as j,se as k,Gt as l,Et as m,Bt as n,It as o};
@@ -0,0 +1 @@
1
+ import{b as K,q,r as $,t as j,w as J,y as Q,z as ee}from"./chunk-SAQA4SXW.js";import{b as H,f as X,g as D}from"./chunk-7NYP4YAG.js";import{c as B,d as P,h as M,j as Y}from"./chunk-7WRQ2UAN.js";import{Box3 as I,BufferAttribute as Ae,SkinnedMesh as Me,MeshStandardMaterial as Fe,Group as Oe,Vector3 as x,Matrix4 as se}from"three";var S=class{async loadFile(e,t){switch(X(e)){case"fbx":{let i=await D.loadFBX(e,t);return{object:i.object,animation:i.animations?.[0]}}case"gltf":case"glb":{let i=await D.loadGLTF(e,t);return{object:i.object,gltf:i.gltf}}case"obj":return{object:(await D.loadOBJ(e,t)).object};default:throw new Error(`Unsupported file type: ${e}`)}}};import{AnimationMixer as ge,Bone as te,LoopOnce as be,LoopRepeat as xe}from"three";function _e(n){let e=n.lastIndexOf(".");return e>=0?n.slice(0,e):n}function ie(n,e){if(!n?.name?.endsWith(".position"))return!1;let t=_e(n.name),o=e.get(t);return o instanceof te?!(o.parent instanceof te):/hips\.position$/i.test(n.name)||/root\.position$/i.test(n.name)}function ve(n,e,t,o){for(let i of n.tracks){if(!ie(i,e)||!i.values||i.values.length<3)continue;let s=i.values[0],r=o??i.values[1],a=i.values[2];for(let l=0;l<i.values.length;l+=3)i.values[l]=s,t&&(i.values[l+1]=r),i.values[l+2]=a}return n}function Se(n,e){for(let t of n.tracks)if(ie(t,e)&&!(!t.values||t.values.length<3))return t.values[1];return null}var E=class{constructor(e){this.target=e}_mixer=null;_actions={};_animations=[];_currentAction=null;_pauseAtPercentage=0;_isPaused=!1;_queuedKey=null;_fadeDuration=.5;_currentKey="";_assetLoader=new S;async loadAnimations(e,t={}){if(!e.length)return;let o=t.stripRootMotionY??!1,i=t.referenceRootY,s=t.referenceAnimationPath,r=await Promise.all(e.map(c=>this._assetLoader.loadFile(c.path))),a=new Map;this.target.traverse(c=>{c.name&&a.set(c.name,c)});let l=[];if(r.forEach((c,u)=>{c.animation&&l.push({key:e[u].key||u.toString(),clip:c.animation,path:e[u].path})}),!l.length)return;let h=i;if(o&&h===void 0){let c=s?l.findIndex(p=>p.path===s):0,u=c>=0?[c,...l.map((p,f)=>f).filter(p=>p!==c)]:l.map((p,f)=>f);for(let p of u){let f=Se(l[p].clip,a);if(f!==null){h=f;break}}}let d=l.map(({key:c,clip:u})=>({key:c,clip:ve(u,a,o,h)}));this._animations=d.map(c=>c.clip),this._mixer=new ge(this.target),d.forEach(({key:c,clip:u})=>{this._actions[c]=this._mixer.clipAction(u)}),this.playAnimation({key:d[0].key})}update(e){if(!this._mixer||!this._currentAction)return;this._mixer.update(e);let t=this._currentAction.getClip().duration*(this._pauseAtPercentage/100);if(!this._isPaused&&this._pauseAtPercentage>0&&this._currentAction.time>=t&&(this._currentAction.time=t,this._currentAction.paused=!0,this._isPaused=!0,this._queuedKey!==null)){let o=this._actions[this._queuedKey];o.reset().play(),this._currentAction.crossFadeTo(o,this._fadeDuration,!1),this._currentAction=o,this._currentKey=this._queuedKey,this._queuedKey=null}}playAnimation(e){if(!this._mixer)return;let{key:t,pauseAtPercentage:o=0,pauseAtEnd:i=!1,fadeToKey:s,fadeDuration:r=.5}=e;if(t===this._currentKey)return;let a=this._actions[t];if(!a)return;if(a===this._currentAction){this._currentKey=t;return}this._queuedKey=s||null,this._fadeDuration=r,this._pauseAtPercentage=i?100:o,this._isPaused=!1;let l=this._currentAction;this._pauseAtPercentage>0?(a.setLoop(be,1/0),a.clampWhenFinished=!0):(a.setLoop(xe,1/0),a.clampWhenFinished=!1),a.reset().play(),l&&l.crossFadeTo(a,r,!1),this._currentAction=a,this._currentKey=t}dispose(){Object.values(this._actions).forEach(e=>{e.stop()}),this._mixer&&(this._mixer.stopAllAction(),this._mixer.uncacheRoot(this.target),this._mixer=null),this._actions={},this._animations=[],this._currentAction=null,this._currentKey=""}get currentAnimationKey(){return this._currentKey}get animations(){return this._animations}};var re={...$,material:{shader:H},animations:[],models:[],collisionShape:"capsule"};function F(n){return Y(n.scale,P)}var Ce=1e-4,je=/foot$/i,Z=new x,w=new x,ne=new x,T=new x,oe=new se;function De(n){let e=1/0,t=!1;return n.traverse(o=>{if(!o.isSkinnedMesh)return;let i=o,s=i.geometry,r=s.attributes.position,a=s.attributes.skinIndex,l=s.attributes.skinWeight,h=i.skeleton;if(!r||!a||!l||!h)return;t=!0,h.update(),i.updateMatrixWorld(!0);let d=h.boneMatrices;if(d)for(let c=0;c<r.count;c++){ne.fromBufferAttribute(r,c).applyMatrix4(i.bindMatrix),T.set(0,0,0);for(let u=0;u<4;u++){let p=l.getComponent(c,u);if(p===0)continue;let f=a.getComponent(c,u);oe.fromArray(d,f*16),T.addScaledVector(w.copy(ne).applyMatrix4(oe),p)}T.applyMatrix4(i.bindMatrixInverse).applyMatrix4(i.matrixWorld),e=Math.min(e,T.y)}}),!t||!Number.isFinite(e)?null:e}function Ee(n,e){e.updateMatrixWorld(!0);let t=e.getWorldPosition(Z).y,o=De(n)??1/0;if(n.traverse(i=>{!i.isBone||!je.test(i.name)||(i.getWorldPosition(Z),o=Math.min(o,Z.y))}),Number.isFinite(o)||n.traverse(i=>{if(!i.isSkinnedMesh)return;let s=i;if(s.computeBoundingBox(),!s.boundingBox)return;let{min:r,max:a}=s.boundingBox;for(let l of[[r.x,r.y,r.z],[r.x,r.y,a.z],[r.x,a.y,r.z],[r.x,a.y,a.z],[a.x,r.y,r.z],[a.x,r.y,a.z],[a.x,a.y,r.z],[a.x,a.y,a.z]])w.set(l[0],l[1],l[2]),w.applyMatrix4(s.matrixWorld),o=Math.min(o,w.y)}),!Number.isFinite(o)){let i=new I().setFromObject(n);if(i.isEmpty())return null;o=i.min.y}return o-t}function Te(n,e,t){return n.stripRootMotionY!==void 0?n.stripRootMotionY:!!(e&&t.some(o=>o===e))}function C(n){let e=n.collision?.position;return e?M(e,B):null}function R(n){return!!n.collision?.size}function ze(n){n.hasWarnedDynamicTrimesh||(n.hasWarnedDynamicTrimesh=!0,console.warn(`Actor "${n.name||n.uuid}" requested collisionShape="trimesh" on a dynamic body; falling back to bounds.`))}function ae(n,e,t){let o=n==="model"?"bounds":n??"capsule";return o==="trimesh"&&!e?(t?.(),"bounds"):o}function le(n,e){let t=n.x||.5,o=n.y||1,i=n.z||.5,s=Math.max(t,i)/2,r=o/2;return{shape:{type:"capsule",halfHeight:Math.max(0,r-s),radius:s},offset:[e.x,e.y,e.z],sensor:!1}}function v(n){let e=M(n.collision?.size??n.size,{x:.5,y:1,z:.5}),t=e.y||1,o=C(n);return le({x:e.x||.5,y:t,z:e.z||.5},o??{x:0,y:t/2,z:0})}function ce(n){let e=n.collision?.size;if(!e)return null;let t=M(e,B),o=t.x/2,i=t.y/2,s=t.z/2,r=C(n);return{shape:{type:"box",halfExtents:[o,i,s]},offset:[r?.x??0,r?.y??i,r?.z??0],sensor:!1}}function ue(n,e,t){let i=e.matrixWorld.clone().invert().multiply(n.matrixWorld);return new se().makeScale(t.x,t.y,t.z).multiply(i)}function V(n,e,t){n.updateMatrixWorld(!0);let o=!1,i=new I;if(n.traverse(a=>{if(!a.isMesh)return;let l=a,h=l.geometry;if(!h)return;let d=null;if(l instanceof Me?(l.computeBoundingBox(),d=l.boundingBox?.clone()??null):(h.computeBoundingBox(),d=h.boundingBox?.clone()??null),!d)return;let c=d.applyMatrix4(ue(l,e,t));if(!o){i.copy(c),o=!0;return}i.union(c)}),!o||i.isEmpty())return null;let s=new x,r=new x;return i.getSize(s),i.getCenter(r),{size:s,center:r}}function we(n,e,t){n.updateMatrixWorld(!0);let o=[],i=[],s=new I,r=new x,a=!1;if(n.traverse(h=>{if(!h.isMesh)return;let d=h,c=d.geometry;if(!c)return;let u=c.getAttribute("position");if(!(u instanceof Ae))return;let p=ue(d,e,t),f=o.length/3;for(let m=0;m<u.count;m++)r.set(u.getX(m),u.getY(m),u.getZ(m)),r.applyMatrix4(p),o.push(r.x,r.y,r.z),s.expandByPoint(r);let A=c.getIndex();if(A)for(let m=0;m<A.count;m++)i.push(f+A.getX(m));else for(let m=0;m<u.count;m++)i.push(f+m);a=!0}),!a||o.length===0||i.length===0)return null;let l=new x;return s.getCenter(l),{vertices:new Float32Array(o),indices:new Uint32Array(i),center:l}}function he(n,e,t){let o=ce(t);if(o)return o;if(!n||!e)return v(t);let i=V(n,e,F(t));if(!i)return v(t);let s=C(t);return{shape:{type:"box",halfExtents:[i.size.x/2,i.size.y/2,i.size.z/2]},offset:[s?.x??i.center.x,s?.y??i.center.y,s?.z??i.center.z],sensor:!1}}function de(n,e,t,o,i){if(R(i)||!n||!e)return v(i);let s=V(n,e,F(i));if(!s)return v(i);let a=C(i);if(!a){let l=t&&o?V(t,o,F(i)):null;a=l?{x:l.center.x,y:l.center.y,z:l.center.z}:{x:s.center.x,y:s.center.y,z:s.center.z}}return le({x:s.size.x,y:s.size.y,z:s.size.z},a)}function pe(n,e,t){let o=ce(t);if(o)return o;if(!n||!e)return v(t);let i=we(n,e,F(t));if(!i)return v(t);let s=C(t);return{shape:{type:"trimesh",vertices:i.vertices,indices:i.indices},offset:s?[s.x-i.center.x,s.y-i.center.y,s.z-i.center.z]:[0,0,0],sensor:!1}}function z(n){n&&n.traverse(e=>{if(!e.isMesh)return;let t=e;t.geometry?.dispose(),Array.isArray(t.material)?t.material.forEach(o=>o.dispose()):t.material?.dispose()})}var k=class extends J{objectModel=null;collisionSource=null;collisionShape="capsule";constructor(e){super(),this.objectModel=e.objectModel,this.collisionSource=e.collisionSource??e.objectModel??null,this.collisionShape=e.collisionShape??"capsule"}collider(e){let t=ae(this.collisionShape,!!e.collision?.static);return t==="bounds"?he(this.objectModel,this.objectModel,e):t==="trimesh"?pe(this.objectModel,this.objectModel,e):de(this.collisionSource,this.collisionSource,this.objectModel,this.objectModel,e)}},U=class extends Q{createEntity(e){return new O(e)}},Le=Symbol("Actor"),O=class extends j{static type=Le;_object=null;_collisionSource=null;_animationDelegate=null;_modelFileNames=[];_assetLoader=new S;_loadGeneration=0;_loadStatus="idle";controlledRotation=!1;hasWarnedDynamicTrimesh=!1;constructor(e){super(),this.options=K(re,e),this.prependUpdate(this.actorUpdate.bind(this)),this.controlledRotation=!0}create(){return this._loadStatus==="idle"&&(this.options.models?.length??0)>0&&this.load(),super.create()}load(){this._loadStatus==="loading"||this._loadStatus==="loaded"||(this._modelFileNames=[...this.options.models||[]],this._modelFileNames.length!==0&&(this.disposeRuntimeState(!0),this._loadStatus="loading",this.loadModelsDeferred(++this._loadGeneration)))}data(){return{animations:this._animationDelegate?.animations,objectModel:this._object,collisionSource:this._collisionSource??this._object,collisionShape:this.options.collisionShape}}needsDeferredModelCollision(){return this.requiresLoadedCollisionSource()?!this.getRuntimeCollisionSource():!1}synchronizeRuntimeCollider(){let e=this.getResolvedCollisionShape(),t;if(e==="bounds")t=he(this._object,this.group??this._object,this.options);else if(e==="trimesh")t=pe(this._object,this.group??this._object,this.options);else{let o=this.getRuntimeCollisionSource();t=de(o,o,this._object,this._object,this.options)}this.colliderDesc=t,this.colliderDescs.length>0?this.colliderDescs[0]=t:this.colliderDescs.push(t)}actorUpdate(e){this._animationDelegate?.update(e.delta)}actorDestroy(){this._loadGeneration+=1,this._loadStatus="idle",this.disposeRuntimeState(!0),this._modelFileNames=[]}_cleanup(e){super._cleanup(e),this.actorDestroy()}playAnimation(e){this._animationDelegate?.playAnimation(e)}get object(){return this._object}get collisionSource(){return this._collisionSource??this._object}getDebugInfo(){let e={type:"Actor",models:this._modelFileNames.length>0?this._modelFileNames:"none",modelLoaded:!!this._object,scale:(()=>{let t=M(this.options.scale,P);return`${t.x}, ${t.y}, ${t.z}`})(),collisionShape:this.getResolvedCollisionShape()};if(this._animationDelegate&&(e.currentAnimation=this._animationDelegate.currentAnimationKey||"none",e.animationsCount=this.options.animations?.length||0),this._object){let t=0,o=0;this._object.traverse(i=>{if(!i.isMesh)return;t++;let s=i.geometry;s?.attributes.position&&(o+=s.attributes.position.count)}),e.meshCount=t,e.vertexCount=o}return e}getResolvedCollisionShape(){return ae(this.options.collisionShape,!!this.options.collision?.static,()=>ze(this))}requiresLoadedCollisionSource(){let e=this.getResolvedCollisionShape();return e==="bounds"||e==="trimesh"?!R(this.options):e==="capsule"?!R(this.options)&&this.getCollisionSourceSelection().file!==null:!1}getRuntimeCollisionSource(){let e=this.getResolvedCollisionShape();return e==="bounds"||e==="trimesh"?this._object:this._collisionSource??this._object}getCollisionSourceSelection(){let e=this.options.models?.[0]??null,t=this.options.animations?.[0]?.path??null;return t?{file:t,reuseVisibleModel:t===e}:{file:e,reuseVisibleModel:!0}}disposeRuntimeState(e){this._animationDelegate&&(this._animationDelegate.dispose(),this._animationDelegate=null);let t=this._collisionSource;z(this._object),t&&t!==this._object&&z(t),this._object=null,this._collisionSource=null,e&&this.group&&(this.group.clear(),this.group=void 0)}loadModelsDeferred(e){this.dispatch("entity:model:loading",{entityId:this.uuid,files:this._modelFileNames});let t=this.getCollisionSourceSelection(),o=this._modelFileNames.map(s=>this._assetLoader.loadFile(s,{clone:!0})),i=t.file&&!t.reuseVisibleModel?this._assetLoader.loadFile(t.file,{clone:!0}):Promise.resolve(null);Promise.all([Promise.all(o),i]).then(([s,r])=>{if(e!==this._loadGeneration){s.forEach(l=>z(l.object??null)),r?.object&&z(r.object);return}this._object=s[0]?.object??null,this._collisionSource=t.reuseVisibleModel?this._object:r?.object??this._object,this._loadStatus=this._object?"loaded":"idle";let a=0;if(this._object){this._object.traverse(u=>{u.isMesh&&a++}),this.group=new Oe,this.group.add(this._object),this.group.scale.copy(F(this.options)),q(this),this.applyMaterialOverrides(),this._animationDelegate=new E(this._object);let l=this.options.animations||[],h=this.options.models?.[0],d=l.map(u=>u.path),c=Te(this.options,h,d);l.length>0?this._animationDelegate.loadAnimations(l,{stripRootMotionY:c,referenceAnimationPath:h}).then(()=>{e===this._loadGeneration&&(this.alignVisualModelToGround(),this.dispatch("entity:animation:loaded",{entityId:this.uuid,animationCount:l.length}))}):this.alignVisualModelToGround()}this.dispatch("entity:model:loaded",{entityId:this.uuid,success:!!this._object,meshCount:a})}).catch(s=>{e===this._loadGeneration&&(this._loadStatus="idle",console.error("Failed to load actor model",s),this.dispatch("entity:model:loaded",{entityId:this.uuid,success:!1,meshCount:0,errorMessage:s instanceof Error?s.message:String(s)}))})}alignVisualModelToGround(){if(!this._object||!this.group)return;this._animationDelegate?.update(0),this._object.updateMatrixWorld(!0);let e=Ee(this._object,this.group);if(e===null||Math.abs(e)<Ce)return;let t=this.group.scale.y||1;this._object.position.y-=e/t}applyMaterialOverrides(){let e=this.options.material;!e||!e.color&&!e.path&&e.opacity===void 0||this._object&&this._object.traverse(t=>{if(!t.isMesh)return;let o=t;o.material=Array.isArray(o.material)?o.material.map(i=>this.tintMaterial(i,e)):this.tintMaterial(o.material,e),e.color&&(o.castShadow=!0,o.receiveShadow=!0)})}tintMaterial(e,t){let o="color"in e,i=!!t.color,s=t.opacity!==void 0;if(!i&&!s)return e;if(i&&!o)return new Fe({color:t.color,emissiveIntensity:.5,lightMapIntensity:.5,fog:!0,opacity:t.opacity??1,transparent:s&&t.opacity<1});let r=e.clone();if(i&&"color"in r&&r.color.copy(t.color),s&&"opacity"in r&&"transparent"in r){let a=r;a.opacity=t.opacity,a.transparent=t.opacity<1}return r.needsUpdate=!0,r}};function Be(...n){return ee({args:n,defaultConfig:re,EntityClass:O,BuilderClass:U,CollisionBuilderClass:k,entityType:O.type,cloneFactory:e=>Be(e??{})})}import{Color as We,Fog as Ye,FogExp2 as Ke,Group as He}from"three";import{Color as Pe}from"three";import{Fn as fe,fog as Ze,positionWorld as me,positionView as Re,uniform as y,float as Ve,vec3 as g,clamp as N,mix as b,max as ke,smoothstep as Ue,floor as Ie,fract as G,dot as Ne}from"three/tsl";var L=class{values;u={time:y(0),heightEnabled:y(0),heightLevel:y(0),heightFalloff:y(0),noiseEnabled:y(0),noiseScale:y(0),noiseStrength:y(0),noiseSpeed:y(0)};attachedScene=null;constructor(e){this.values={...e},this.syncUniforms()}setValues(e){Object.assign(this.values,e),this.syncUniforms()}tick(e){this.values.time+=e,this.u.time.value=this.values.time}scan(e){if(this.attachedScene===e)return;let t=e.fog;t&&(e.fogNode=this.buildFogNode(t),this.attachedScene=e)}unpatchAll(){this.attachedScene&&(this.attachedScene.fogNode=null,this.attachedScene=null)}syncUniforms(){this.u.time.value=this.values.time,this.u.heightEnabled.value=this.values.heightEnabled,this.u.heightLevel.value=this.values.heightLevel,this.u.heightFalloff.value=this.values.heightFalloff,this.u.noiseEnabled.value=this.values.noiseEnabled,this.u.noiseScale.value=this.values.noiseScale,this.u.noiseStrength.value=this.values.noiseStrength,this.u.noiseSpeed.value=this.values.noiseSpeed}buildFogNode(e){let t=e.isFogExp2===!0,o=y(new Pe(e.color)),i=Re.z.negate(),s=t?this.exp2Factor(y(e.density),i):Ue(y(e.near),y(e.far),i),r=this.u.heightLevel.sub(me.y),a=N(r.mul(ke(this.u.heightFalloff,0)),0,1),l=b(s,s.mul(a),this.u.heightEnabled),h=me.mul(this.u.noiseScale).add(g(this.u.time.mul(this.u.noiseSpeed),0,this.u.time.mul(this.u.noiseSpeed).mul(.5))),c=Ge(h).sub(.5).mul(2).mul(N(this.u.noiseStrength,0,1)),u=N(l.add(l.mul(c)),0,1),p=b(l,u,this.u.noiseEnabled);return Ze(o,p)}exp2Factor(e,t){return e.mul(e).mul(t).mul(t).negate().exp().oneMinus()}},_=fe(([n])=>{let e=G(n.mul(g(443.8975,397.2973,491.1871))),t=e.add(Ne(e,e.yzx.add(19.27)));return G(t.x.add(t.y).mul(t.z))}),Ge=fe(([n])=>{let e=Ie(n),t=G(n),o=t.mul(t).mul(Ve(3).sub(t.mul(2))),i=_(e.add(g(0,0,0))),s=_(e.add(g(1,0,0))),r=_(e.add(g(0,1,0))),a=_(e.add(g(1,1,0))),l=_(e.add(g(0,0,1))),h=_(e.add(g(1,0,1))),d=_(e.add(g(0,1,1))),c=_(e.add(g(1,1,1))),u=b(i,s,o.x),p=b(r,a,o.x),f=b(l,h,o.x),A=b(d,c,o.x),m=b(u,p,o.y),ye=b(f,A,o.y);return b(m,ye,o.z)});var qe=Symbol("Fog"),$e="#9aa3ad",Xe=.015,Je=10,Qe=250,et=5,tt=.2,it=.05,nt=.15,ot=.1,W=class extends j{static type=qe;threeFog=null;attachedScene=null;patcher;patcherEnabled;constructor(e={}){super(),this.options={...e};let t=this.resolveUniformValues(this.options);this.patcher=new L(t),this.patcherEnabled=rt(this.options)}create(){return super.create(),this.threeFog=st(this.options),this.group=new He,this.group.name=this.name?`Fog:${this.name}`:"Fog",this}attachToScene(e){this.threeFog&&(this.attachedScene=e,e.fog=this.threeFog,this.patcherEnabled&&this.patcher.scan(e))}_update(e){super._update(e),!(!this.attachedScene||!this.patcherEnabled)&&(this.patcher.tick(e.delta),this.patcher.scan(this.attachedScene))}_cleanup(e){this.patcher.unpatchAll(),this.attachedScene&&this.attachedScene.fog===this.threeFog&&(this.attachedScene.fog=null),this.attachedScene=null,this.threeFog=null,super._cleanup(e)}resolveUniformValues(e){let t=e.height,o=e.noise;return{time:0,heightEnabled:t?.enabled?1:0,heightLevel:t?.level??et,heightFalloff:t?.falloff??tt,noiseEnabled:o?1:0,noiseScale:o?.scale??it,noiseStrength:o?.strength??nt,noiseSpeed:o?.speed??ot}}};function st(n){let e=new We(n.color??$e);return(n.type??"linear")==="exp2"?new Ke(e,n.density??Xe):new Ye(e,n.start??Je,n.end??Qe)}function rt(n){let e=!!n.height?.enabled,t=!!n.noise;return e||t}function Nt(n={}){return new W(n)}export{Le as a,O as b,Be as c,qe as d,W as e,Nt as f};
@@ -0,0 +1,19 @@
1
+ import{a as g}from"./chunk-BCFFS3FP.js";import{AmbientLight as k,Object3D as R,PerspectiveCamera as U,RenderTarget as T,Scene as C,Color as O,LinearFilter as w,SpotLight as P,Vector3 as v}from"three";function d(a,e,t,i={}){let s=e*4,r=new Uint8ClampedArray(t*s),n=null;if(i.srgb){n=new Uint8Array(256);for(let o=0;o<256;o+=1){let c=o/255,u=c<=.0031308?c*12.92:1.055*Math.pow(c,1/2.4)-.055;n[o]=Math.round(Math.max(0,Math.min(1,u))*255)}}for(let o=0;o<t;o+=1){let c=(i.flipY?t-1-o:o)*s,u=o*s;if(n===null){r.set(a.subarray(c,c+s),u);continue}for(let l=0;l<s;l+=4)r[u+l]=n[a[c+l]],r[u+l+1]=n[a[c+l+1]],r[u+l+2]=n[a[c+l+2]],r[u+l+3]=a[c+l+3]}return r}var x=`
2
+ const encodeReadbackPixels = ${d.toString()};
3
+
4
+ self.onmessage = async (event) => {
5
+ const { id, buffer, width, height, options } = event.data;
6
+ try {
7
+ const src = new Uint8ClampedArray(buffer);
8
+ const pixels = encodeReadbackPixels(src, width, height, options);
9
+ const canvas = new OffscreenCanvas(width, height);
10
+ const ctx = canvas.getContext('2d');
11
+ if (!ctx) throw new Error('OffscreenCanvas 2d context unavailable');
12
+ ctx.putImageData(new ImageData(pixels, width, height), 0, 0);
13
+ const blob = await canvas.convertToBlob({ type: 'image/png' });
14
+ self.postMessage({ id, blob });
15
+ } catch (error) {
16
+ self.postMessage({ id, error: String(error) });
17
+ }
18
+ };
19
+ `,h=class{worker=null;workerFailed=!1;nextId=1;pending=new Map;isSupported(){return!this.workerFailed&&typeof Worker<"u"&&typeof OffscreenCanvas<"u"&&typeof URL<"u"&&typeof Blob<"u"}async encodeThumbnail(e,t,i,s={}){if(!this.isSupported())return null;let r=this.ensureWorker();if(!r)return null;let n=new Uint8Array(e.byteLength);n.set(e instanceof Uint8Array?e:new Uint8Array(e.buffer,e.byteOffset,e.byteLength));let o=this.nextId++;try{let c=await new Promise((u,l)=>{this.pending.set(o,{resolve:u,reject:l}),r.postMessage({id:o,buffer:n.buffer,width:t,height:i,options:s},[n.buffer])});return URL.createObjectURL(c)}catch{return null}}dispose(){this.worker&&(this.worker.terminate(),this.worker=null);for(let{reject:e}of this.pending.values())e(new Error("EntityPayloadWorker disposed"));this.pending.clear()}ensureWorker(){if(this.worker)return this.worker;try{let e=new Blob([x],{type:"text/javascript"}),t=URL.createObjectURL(e),i=new Worker(t,{type:"module"});return URL.revokeObjectURL(t),i.onmessage=s=>{let{id:r}=s.data,n=this.pending.get(r);n&&(this.pending.delete(r),"blob"in s.data?n.resolve(s.data.blob):n.reject(new Error(s.data.error)))},i.onerror=()=>{this.workerFailed=!0,this.dispose()},this.worker=i,i}catch{return this.workerFailed=!0,null}}},y=new h;var W=128,S=256,M=1,E=32,p=class{cache=new Map;inFlight=new Map;renderer=null;size;maxEntries;queue=[];activeRenders=0;constructor(e=W,t=S){this.size=e,this.maxEntries=t}setRenderer(e){this.renderer=e}get(e){let t=this.cache.get(e);return t?(this.touch(e,t),t):null}invalidate(e){this.cache.delete(e),this.inFlight.delete(e),this.queue=this.queue.filter(t=>t.uuid!==e?!0:(t.resolve(null),!1))}clear(){this.cache.clear(),this.inFlight.clear();for(let e of this.queue)e.resolve(null);this.queue=[]}get cacheSize(){return this.cache.size}get pendingCount(){return this.queue.length}async ensure(e,t){let i=this.cache.get(e);if(i)return this.touch(e,i),i;let s=this.inFlight.get(e);if(s)return s;if(!t||!this.renderer)return null;let r=new Promise(n=>{if(this.queue.push({uuid:e,object:t,resolve:n}),this.queue.length>E){let o=this.queue.splice(0,this.queue.length-E);for(let c of o)this.inFlight.delete(c.uuid),c.resolve(null)}this.drainQueue()});return this.inFlight.set(e,r),r}drainQueue(){for(;this.activeRenders<M&&this.queue.length>0;){let e=this.queue.shift();if(!e)return;this.activeRenders+=1,this.render(e.uuid,e.object).then(t=>{t&&(this.cache.set(e.uuid,t),this.evictOverflow()),e.resolve(t)}).catch(t=>{console.warn("EntityThumbnailCache: failed to render thumbnail",e.uuid,t),e.resolve(null)}).finally(()=>{this.activeRenders-=1,this.inFlight.delete(e.uuid),this.drainQueue()})}}touch(e,t){this.cache.delete(e),this.cache.set(e,t)}evictOverflow(){for(;this.cache.size>this.maxEntries;){let e=this.cache.keys().next();if(e.done)return;this.cache.delete(e.value)}}async render(e,t){let i=this.renderer;if(!i)return null;let s=new C;s.background=new O(3815994);let r=t.clone(!0);r.position.set(0,0,0),r.rotation.set(0,0,0),r.updateMatrixWorld(!0),s.add(r);let n=new U(50,1,.1,100),o=g(r,n);F(s,n,o);let c=new T(this.size,this.size,{minFilter:w,magFilter:w}),u=i.getRenderTarget(),l=i.getScissorTest();try{i.setScissorTest(!1),i.setRenderTarget(c),i.render(s,n)}finally{i.setRenderTarget(u),i.setScissorTest(l)}let f=await i.readRenderTargetPixelsAsync(c,0,0,this.size,this.size);c.dispose(),s.remove(r);let b={flipY:A(i),srgb:!0},m=await y.encodeThumbnail(f,this.size,this.size,b)??D(f,this.size,this.size,b);return m?{uuid:e,dataUrl:m,bounds:{width:o.width,height:o.height,depth:o.depth}}:null}},Q=new p;function A(a){return a?.backend?.isWebGLBackend===!0}function F(a,e,t){a.add(new k(16777215,.7)),e.updateMatrixWorld(!0);let i=new v().setFromMatrixColumn(e.matrixWorld,0),s=new v().setFromMatrixColumn(e.matrixWorld,1),r=e.position.distanceTo(t.center)||1,n=new P(16777215,5);n.position.copy(e.position).addScaledVector(i,r*.35).addScaledVector(s,r*.45),n.decay=0,n.distance=0,n.penumbra=.5,n.angle=L(Math.atan(t.maxDim/r)+.25,.4,Math.PI/3),n.castShadow=!1;let o=new R;o.position.copy(t.center),a.add(o),n.target=o,a.add(n)}function L(a,e,t){return Math.min(t,Math.max(e,a))}function D(a,e,t,i={}){if(typeof document>"u")return null;let s=document.createElement("canvas");s.width=e,s.height=t;let r=s.getContext("2d");if(!r)return null;let n=a instanceof Uint8Array?a:new Uint8Array(a.buffer,a.byteOffset,a.byteLength),o=r.createImageData(e,t);return o.data.set(d(n,e,t,i)),r.putImageData(o,0,0),s.toDataURL("image/png")}export{p as a,Q as b};
@@ -0,0 +1 @@
1
+ import{b as l}from"./chunk-AE3CTVHY.js";import{B as m,E as u,H as g,K as x,N as f,j as c,m as s,p,s as d,v as h,y}from"./chunk-BMRFDDMR.js";import{Vector3 as k}from"three";var v='<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 r(t){return`${v}${t}</svg>`}var i={box:r('<path d="M12 2.5 21 7v10l-9 4.5L3 17V7z"/><path d="M3 7l9 4.5L21 7"/><path d="M12 11.5v10"/>'),sphere:r('<circle cx="12" cy="12" r="9"/><ellipse cx="12" cy="12" rx="9" ry="3.5"/>'),cone:r('<path d="M12 3 20 18H4z"/><ellipse cx="12" cy="18" rx="8" ry="3"/>'),pyramid:r('<path d="M12 3 21 19H3z"/><path d="M12 3v16"/><path d="M3 19l9-5 9 5"/>'),cylinder:r('<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:r('<rect x="7" y="3" width="10" height="18" rx="5"/><path d="M7 12h10"/>'),disk:r('<ellipse cx="12" cy="12" rx="9" ry="4"/><ellipse cx="12" cy="12" rx="3" ry="1.3"/>'),plane:r('<path d="M2 17 12 11l10 6-10 5z"/><path d="M12 11V4"/>'),zone:r('<rect x="3.5" y="3.5" width="17" height="17" rx="2" stroke-dasharray="3 2.5"/>'),rect:r('<rect x="3.5" y="6" width="17" height="12" rx="1.5"/>'),light:r('<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 o(t,e,z,b,w,M){return{id:t,label:e,description:z,icon:b,group:"Shapes",tags:M,defaultProps:{size:{x:1,y:1,z:1}},create:w}}function n(t){let e=t.size;return new k(e?.x??1,e?.y??1,e?.z??1)}var P=[o("box","Box","Cuboid mesh with a matching box collider.",i.box,({position:t,props:e})=>c({position:t,size:n(e),...e}),["cube","block","platform","wall"]),o("sphere","Sphere","Ball mesh with a sphere collider.",i.sphere,({position:t,props:e})=>s({position:t,size:n(e),...e}),["ball","orb","round"]),o("cone","Cone","Cone mesh with a cone collider.",i.cone,({position:t,props:e})=>p({position:t,size:n(e),...e}),["spike","point"]),o("pyramid","Pyramid","Four-sided pyramid mesh and collider.",i.pyramid,({position:t,props:e})=>d({position:t,size:n(e),...e}),["tetra","spike"]),o("cylinder","Cylinder","Cylinder mesh with a matching collider.",i.cylinder,({position:t,props:e})=>h({position:t,size:n(e),...e}),["tube","pillar","column"]),o("pill","Pill","Capsule mesh with a capsule collider.",i.pill,({position:t,props:e})=>y({position:t,size:n(e),...e}),["capsule","character"]),o("disk","Disk","Flat cylinder, useful for pucks and platforms.",i.disk,({position:t,props:e})=>m({position:t,size:n(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:t,props:e})=>u({position:t,size:n(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:t,props:e})=>g({position:t,size:n(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:t,props:e})=>x({position:t,size:n(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:t,props:e})=>f({type:"point",position:t,...e})}],a=null;function H(){return a||(a=l(P),a)}export{P as a,H as b};
@@ -1,4 +1,4 @@
1
- import{a as s,e as o,g as a}from"./chunk-W5SXED5T.js";import{announceBridgeReady as c}from"@zylem/bridge";var n=class r extends HTMLElement{_game=null;_state={};container;resizeObserver=null;_viewportProfile="auto";static HOST_CONFIG_MARKER=Symbol("zylem:host-config");constructor(){super(),this.attachShadow({mode:"open"});let e=document.createElement("style");e.textContent=`
1
+ import{d as s,h as o,j as a}from"./chunk-DECK4UEC.js";import{announceBridgeReady as c}from"@zylem/bridge";var n=class r extends HTMLElement{_game=null;_state={};container;resizeObserver=null;_viewportProfile="auto";static HOST_CONFIG_MARKER=Symbol("zylem:host-config");constructor(){super(),this.attachShadow({mode:"open"});let e=document.createElement("style");e.textContent=`
2
2
  :host {
3
3
  display: block;
4
4
  width: 100%;
@@ -0,0 +1 @@
1
+ import{b as Z,j}from"./chunk-7NYP4YAG.js";import{a as I,b as G}from"./chunk-AIQ6IVT5.js";import{a as S,b as H,c as X}from"./chunk-EVYHPR3J.js";import{c as m,d as B,e as V,f as F,g as z,h as c,i as L,j as U}from"./chunk-7WRQ2UAN.js";import{p as N}from"./chunk-XRP4JJXL.js";import{StageBodyKind as W}from"@zylem/behaviors/core";import{Color as bt,Vector2 as Y,Vector3 as K}from"three";function g(i){if(!i||typeof i!="object")return!1;let t=Object.getPrototypeOf(i);return t===Object.prototype||t===null}function l(i){if(i==null||typeof i=="function"||typeof i!="object")return i;if(i instanceof bt||i instanceof Y||i instanceof K)return i.clone();if(i instanceof Float32Array)return new Float32Array(i);if(Array.isArray(i))return i.map(t=>l(t));if(g(i)){let t={};for(let[e,o]of Object.entries(i))e!=="_builders"&&(t[e]=l(o));return t}return i}function d(i,t){let e=l(i);if(!t)return e;if(!g(e)||!g(t))return l(t);let o=e;for(let[n,s]of Object.entries(t)){if(n==="_builders"||s===void 0)continue;let r=o[n];if(n==="shader"){o[n]=l(s);continue}if(r instanceof Y&&V(s)){o[n]=L(s,r);continue}if(r instanceof K&&F(s)){o[n]=U(s,r);continue}if(g(r)&&g(s)){o[n]=d(r,s);continue}o[n]=l(s)}return o}function $(i){return i&&i.__kind==="collision"}function k(i){return i.cloneComponent()}function Ct(i,t){let e={kind:i?W.Static:W.Dynamic,position:[0,0,0],gravityScale:t.gravityScale??1,canSleep:t.canSleep??!1,ccdEnabled:t.ccdEnabled??!0},o=S(t.lockRotations);o&&(e.lockRotation=o);let n=S(t.lockTranslations);return n&&(e.lockTranslation=n),e}function gt(i,t){if(t.offset){let e=c(t.offset,m);i.offset=[e.x,e.y,e.z]}t.sensor&&(i.sensor=!0),t.collisionType&&(i.collisionGroups=H(t.collisionType,t.collisionFilter))}function f(i,t,e){return gt(i,t),{__kind:"collision",bodyDesc:Ct(t.static??!1,t),colliderDesc:i,cloneComponent:e}}function xt(i={}){let t=c(i.size,B),e={shape:{type:"box",halfExtents:[t.x/2,t.y/2,t.z/2]}},o=l(i);return f(e,i,()=>xt(o))}function vt(i={}){let t={shape:{type:"sphere",radius:i.radius??1}},e=l(i);return f(t,i,()=>vt(e))}function Et(i={}){let t=i.radius??1,o={shape:{type:"cone",halfHeight:(i.height??2)/2,radius:t}},n=l(i);return f(o,i,()=>Et(n))}function Ot(i={}){let t=i.radius??1,o={shape:{type:"cone",halfHeight:(i.height??2)/2,radius:t}},n=l(i);return f(o,i,()=>Ot(n))}function Pt(i={}){let t=Math.max(i.radiusTop??1,i.radiusBottom??1),o={shape:{type:"cylinder",halfHeight:(i.height??2)/2,radius:t}},n=l(i);return f(o,i,()=>Pt(n))}function Rt(i={}){let t=i.radius??.5,o={shape:{type:"capsule",halfHeight:(i.length??1)/2,radius:t}},n=l(i);return f(o,i,()=>Rt(n))}function wt(i={}){let t=z(i.tile,{x:10,y:10}),e=i.subdivisions??10,o=(e+1)*(e+1),n=i.heightData??new Float32Array(o),s={shape:{type:"heightfield",rows:e,cols:e,heights:n,scale:[t.x,1,t.y]}},r={...i,static:i.static??!0},a=l(r);return f(s,r,()=>wt(a))}function Bt(i={}){let t=c(i.size,B),e={shape:{type:"box",halfExtents:[t.x/2,t.y/2,t.z/2]},sensor:!0},o={...i,static:i.static??!0,sensor:!0},n=l(o);return f(e,o,()=>Bt(n))}import{Mesh as at,ShaderMaterial as Vt,Group as Ft}from"three";var Q=import.meta.env.VITE_DEBUG_FLAG==="true";import{nanoid as St}from"nanoid";var p=class i{parent=null;children=[];options;uuid="";name="";markedForRemoval=!1;lifecycleCallbacks={setup:[],loaded:[],update:[],destroy:[],cleanup:[]};trackLifecycleRegistrations=!1;userLifecycleRegistrations=[];constructor(t=[]){let e=t.filter(o=>!(o instanceof i)).reduce((o,n)=>({...o,...n}),{});this.options=e,this.uuid=St()}onSetup(...t){return this.lifecycleCallbacks.setup.push(...t),this.recordLifecycleRegistration("onSetup",t),this}onLoaded(...t){return this.lifecycleCallbacks.loaded.push(...t),this.recordLifecycleRegistration("onLoaded",t),this}onUpdate(...t){return this.lifecycleCallbacks.update.push(...t),this.recordLifecycleRegistration("onUpdate",t),this}onDestroy(...t){return this.lifecycleCallbacks.destroy.push(...t),this.recordLifecycleRegistration("onDestroy",t),this}onCleanup(...t){return this.lifecycleCallbacks.cleanup.push(...t),this.recordLifecycleRegistration("onCleanup",t),this}prependSetup(...t){return this.lifecycleCallbacks.setup.unshift(...t),this.recordLifecycleRegistration("prependSetup",t),this}prependUpdate(...t){return this.lifecycleCallbacks.update.unshift(...t),this.recordLifecycleRegistration("prependUpdate",t),this}setParent(t){this.parent=t}getParent(){return this.parent}add(t){this.children.push(t),t.setParent(this)}remove(t){let e=this.children.indexOf(t);e!==-1&&(this.children.splice(e,1),t.setParent(null))}getChildren(){return this.children}isComposite(){return this.children.length>0}enableUserLifecycleTracking(){this.trackLifecycleRegistrations=!0}replayUserLifecycleRegistrationsTo(t,e){for(let o of this.userLifecycleRegistrations){let n=e?o.callbacks.map(s=>e(s)):[...o.callbacks];switch(o.method){case"onSetup":t.onSetup(...n);break;case"onLoaded":t.onLoaded(...n);break;case"onUpdate":t.onUpdate(...n);break;case"onDestroy":t.onDestroy(...n);break;case"onCleanup":t.onCleanup(...n);break;case"prependSetup":t.prependSetup(...n);break;case"prependUpdate":t.prependUpdate(...n);break}}}cloneChildrenInto(t){for(let e of this.children)t.add(kt(e))}nodeSetup(t){this.markedForRemoval=!1,typeof this._setup=="function"&&this._setup(t);for(let e of this.lifecycleCallbacks.setup)e(t);this.children.forEach(e=>e.nodeSetup(t))}nodeUpdate(t){if(!this.markedForRemoval){typeof this._update=="function"&&this._update(t),typeof this._tickActions=="function"&&this._tickActions(t.delta);for(let e of this.lifecycleCallbacks.update)e(t);this.children.forEach(e=>e.nodeUpdate(t))}}nodeDestroy(t){if(!this.markedForRemoval){this.children.forEach(e=>e.nodeDestroy(t));for(let e of this.lifecycleCallbacks.destroy)e(t);typeof this._destroy=="function"&&this._destroy(t),this.markedForRemoval=!0;for(let e of this.lifecycleCallbacks.cleanup)e(t);typeof this._cleanup=="function"&&this._cleanup(t)}}async nodeLoaded(t){typeof this._loaded=="function"&&await this._loaded(t);for(let e of this.lifecycleCallbacks.loaded)e(t)}nodeCleanup(t){this.children.forEach(e=>e.nodeCleanup?.(t));for(let e of this.lifecycleCallbacks.cleanup)e(t);typeof this._cleanup=="function"&&this._cleanup(t)}getOptions(){return this.options}setOptions(t){this.options={...this.options,...t}}recordLifecycleRegistration(t,e){!this.trackLifecycleRegistrations||e.length===0||this.userLifecycleRegistrations.push({method:t,callbacks:[...e]})}};function kt(i){let t=i?.clone;if(typeof t!="function")throw new Error(`Cannot clone child node "${i.name||i.uuid||"unknown"}": missing clone() support.`);return t.call(i)}import{createTransformStore as zt}from"@zylem/behaviors/core";import{makeMoveable as Dt}from"@zylem/behaviors/core";function q(i){let t=Dt(i);return N(t)}import{clearVelocityIntent as lt}from"@zylem/behaviors/core";import{Color as It,Vector3 as Gt}from"three";import{Quaternion as Mt}from"three";var J=Symbol("explicitSpawnPosition"),E=new Mt;function tt(i){return i.filter(t=>!(t instanceof p)).some(t=>t!=null&&typeof t=="object"&&"position"in t)}function et(i){i[J]=!0}function Tt(i){return i._spawnPositionExplicit?!0:i.options[J]===!0}function _t(i){return i.options.hideUntilPositioned!==!1}function it(i){return i._spawnPlacementPending===!0}function At(i){return i._spawnPositionExplicit===!0||i._spawnPlacementReady===!0}function O(i){let t=i.group??i.mesh;if(t){if(i.physicsAttached&&i.body)try{let e=i.body.translation();t.position.set(e.x,e.y,e.z);return}catch{}if(i.wasmStageRef&&(i.runtimeHandle??-1)>=0){let e=i.wasmStageRef.getPose(i.runtimeHandle);if(e){t.position.set(e.position[0],e.position[1],e.position[2]);return}}if(i.options.position){let e=c(i.options.position,m);t.position.set(e.x,e.y,e.z)}}}function ot(i){let t=i.group??i.mesh;if(!(!t||i.controlledRotation)){if(i.physicsAttached&&i.body)try{let e=i.body.rotation();E.set(e.x,e.y,e.z,e.w),t.setRotationFromQuaternion(E);return}catch{}if(i.wasmStageRef&&(i.runtimeHandle??-1)>=0){let e=i.wasmStageRef.getPose(i.runtimeHandle);e&&(E.set(e.rotation[0],e.rotation[1],e.rotation[2],e.rotation[3]),t.setRotationFromQuaternion(E))}}}function x(i,t){i.group&&(i.group.visible=t),i.mesh&&(i.mesh.visible=t)}function ye(i){if(i._spawnInProgress=!0,i._spawnPlacementReady=!1,!_t(i)){i._spawnPlacementPending=!1;return}i._spawnPositionExplicit=Tt(i),i._spawnPlacementPending=!0,x(i,!1)}function be(i){i._spawnInProgress=!1}function nt(i){i._spawnPlacementReady=!0}function D(i){if(i._spawnPlacementPending){if(O(i),i._spawnPlacementPending=!1,i.options.visible===!1){x(i,!1);return}x(i,!0)}}function Ce(i){!it(i)||i.options.hideUntilPositioned===!0&&!At(i)||D(i)}function st(i){O(i),i._spawnPlacementPending=!1,x(i,!0)}function ge(i){it(i)&&x(i,!1)}var rt={position:new Gt(0,0,0),material:{color:new It("#ffffff"),shader:Z},collision:{static:!1}};function we(i,t){let e=i.filter(n=>!(n instanceof p)),o=d(t);for(let n of e)o=d(o,n);return tt(i)&&et(o),o}function Lt(i){return i!=null&&typeof i=="object"}function ct(i){return{phase:i?.phase??"stay",cooldownMs:i?.cooldownMs}}function Ut(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}var M=class extends p{group;mesh;materials;bodyDesc=null;body=null;physicsAttached=!1;physicsWorldRef=null;colliderDesc;custom={};colliderBaseline=null;colliderScaleDirty=!1;colliderDescs=[];compoundMeshes=[];debugInfo={};debugMaterial;collisionDelegate={collision:[],cooldowns:new Map,nextId:0};collisionType;packKey=null;bundleKey=null;instanceId=-1;isInstanced=!1;isBundled=!1;runtimeHandle=-1;runtimeAttached=!1;wasmStageRef=null;eventDelegate=new I;behaviorRefs=[];cloneFactory=null;trackAddedComponents=!1;trackedComponents=[];transformStore;_scale={x:1,y:1,z:1};_spawnPlacementPending=!1;_spawnPositionExplicit=!1;_spawnPlacementReady=!1;_spawnInProgress=!1;moveX;moveY;moveZ;moveXY;moveXZ;move;resetVelocity;moveForwardXY;getPosition;getVelocity;setPosition;setPositionX;setPositionY;setPositionZ;wrapAroundXY;wrapAround3D;rotateInDirection;rotateYEuler;rotateEuler;rotateX;rotateY;rotateZ;setRotationY;setRotationX;setRotationZ;setRotationDegrees;setRotationDegreesY;setRotationDegreesX;setRotationDegreesZ;setRotation;getRotation;constructor(){super(),this.transformStore=zt(),q(this),this.wrapSpawnPlacementMutators()}wrapSpawnPlacementMutators(){let t=()=>{nt(this),!this._spawnInProgress&&(O(this),D(this))},e=r=>(a,h,y)=>{!this.body&&!(this.wasmStageRef&&this.runtimeHandle>=0)||(r(a,h,y),t())},o=r=>a=>{!this.body&&!(this.wasmStageRef&&this.runtimeHandle>=0)||(r(a),t())};this.setPosition=e(this.setPosition.bind(this)),this.setPositionX=o(this.setPositionX.bind(this)),this.setPositionY=o(this.setPositionY.bind(this)),this.setPositionZ=o(this.setPositionZ.bind(this));let n=()=>{this._spawnInProgress||ot(this)},s=this.setPose.bind(this);this.setPose=r=>{let a=s(r);return a&&(r.position!=null&&t(),r.rotation!=null&&n(),a)}}reveal(){this.options.visible=!0,st(this)}getPose(){if(this.wasmStageRef&&this.runtimeHandle>=0){let n=this.wasmStageRef.getPose(this.runtimeHandle);if(n)return{position:{x:n.position[0],y:n.position[1],z:n.position[2]},rotation:{x:n.rotation[0],y:n.rotation[1],z:n.rotation[2],w:n.rotation[3]}}}let t=this.body;if(!t)return null;let e=t.translation(),o=t.rotation();return{position:{x:e.x,y:e.y,z:e.z},rotation:{x:o.x,y:o.y,z:o.z,w:o.w}}}setPose(t){if(this.wasmStageRef&&this.runtimeHandle>=0){let o=!0;if(t.position){let n=c(t.position);o=this.wasmStageRef.setPosition(this.runtimeHandle,n.x,n.y,n.z)&&o}if(t.rotation){let{x:n,y:s,z:r,w:a}=t.rotation;o=this.wasmStageRef.setRotation(this.runtimeHandle,n,s,r,a)&&o}return o&&this.body?.markPoseDiscontinuity(),o}let e=this.body;if(!e)return!1;if(t.position){let o=c(t.position);e.setTranslation({x:o.x,y:o.y,z:o.z},!0)}return t.rotation&&e.setRotation(t.rotation,!0),!0}getScale(){return{...this._scale}}setScale(t,e,o){this._scale={x:t,y:e,z:o},(this.group??this.mesh)?.scale.set(t,e,o),this.colliderScaleDirty=!0}add(...t){for(let e of t)e instanceof at?(this.addMeshComponent(e),this.trackComponent(e)):$(e)?(this.addCollisionComponent(e),this.trackComponent(e)):super.add(e);return this}addMeshComponent(t){if(this.mesh)this.compoundMeshes.push(t),this.group||(this.group=new Ft,this.group.add(this.mesh)),this.group.add(t);else if(this.mesh=t,this.materials||(this.materials=[]),t.material){let e=t.material;Array.isArray(e)?this.materials.push(...e):this.materials.push(e)}}addCollisionComponent(t){if(this.bodyDesc)this.colliderDescs.push(t.colliderDesc);else{this.bodyDesc=t.bodyDesc,this.colliderDesc=t.colliderDesc,this.colliderDescs.push(t.colliderDesc);let e=c(this.options?.position,m);this.bodyDesc.position=[e.x,e.y,e.z]}}trackComponent(t){if(this.trackAddedComponents){if(t instanceof at){this.trackedComponents.push({kind:"mesh",component:pt(t)});return}this.trackedComponents.push({kind:"collision",component:k(t)})}}_actions=[];runAction(t){return this._actions.push(t),t}action(t){return t.persistent=!0,this._actions.push(t),t}clearActions(){this._actions.length=0}_tickActions(t){if(this._actions.length===0)return;let e=this.transformStore;e.velocity.x=0,e.velocity.y=0,e.velocity.z=0,lt(e,"actions"),e.angularVelocity.x=0,e.angularVelocity.y=0,e.angularVelocity.z=0,e.dirty.angularVelocity=!1;for(let o=this._actions.length-1;o>=0;o--){let n=this._actions[o];n.tick(this,t),n.done&&!n.persistent&&this._actions.splice(o,1)}this._actions.length===0&&(e.velocity.x=0,e.velocity.y=0,e.velocity.z=0,lt(e,"actions"),e.angularVelocity.x=0,e.angularVelocity.y=0,e.angularVelocity.z=0,e.dirty.angularVelocity=!1)}create(){return this.name=this.options.name||"",this}clone(t){if(!this.cloneFactory)throw new Error(`Cannot clone ${this.constructor.name}: clone() is only supported for entities created by official factory helpers.`);let e=this.cloneFactory(d(this.options,t)),o=this.copyBehaviorRefsTo(e),n=r=>Ht(r,o);this.replayUserLifecycleRegistrationsTo(e,n);let s=this.getCollisionRegistrations();if(s.length>0)for(let r of s)e.onCollision(n(r.callback),r.options);for(let r of this.trackedComponents){if(r.kind==="mesh"){e.add(pt(r.component));continue}e.add(k(r.component))}return this.cloneChildrenInto(e),e}finalizeCloneSupport(t){return this.cloneFactory=t,this.enableUserLifecycleTracking(),this.trackAddedComponents=!0,this}onCollision(...t){let e=[...this.collisionDelegate.collision??[]],o=this.collisionDelegate.nextId??0;if(t.length===1||t.length===2&&(t[1]==null||Lt(t[1]))){let n=t[0];if(!n)return this;let s=t[1];return e.push({id:o,callback:n,options:ct(s)}),o+=1,this.collisionDelegate.collision=e,this.collisionDelegate.nextId=o,this}for(let n of t)e.push({id:o,callback:n,options:ct()}),o+=1;return this.collisionDelegate.collision=e,this.collisionDelegate.nextId=o,this}use(t,e){let o={descriptor:t,options:{...t.defaultOptions,...e}};this.behaviorRefs.push(o);let n={getFSM:()=>o.fsm??null,getOptions:()=>o.options,ref:o},s=t.createHandle?.(o)??{};return{...n,...s}}getBehaviorRefs(){return this.behaviorRefs}getCollisionCallbacks(){return this.getCollisionRegistrations().map(t=>t.callback)}getCollisionRegistrations(){return(this.collisionDelegate.collision??[]).map(t=>({id:t.id,callback:t.callback,options:{...t.options}}))}copyBehaviorRefsTo(t){let e=new Map;for(let o of this.behaviorRefs){t.use(o.descriptor,l(o.options));let n=t.getBehaviorRefs().at(-1);n&&e.set(o,n)}return e}_setup(t){for(let e=this._actions.length-1;e>=0;e--){let o=this._actions[e];o.done&&!o.persistent?this._actions.splice(e,1):o.reset()}}async _loaded(t){}_update(t){this.updateMaterials(t)}_destroy(t){}_cleanup(t){this.disposeEvents();for(let e of this.compoundMeshes)e.geometry?.dispose(),Array.isArray(e.material)?e.material.forEach(o=>o.dispose()):e.material?.dispose();this.compoundMeshes.length=0,this.debugMaterial?.dispose(),this.debugMaterial=void 0,this.group?.removeFromParent()}_collision(t,e,o={phase:"stay",nowMs:Ut()}){if(!this.collisionDelegate.collision?.length)return;let n=this.collisionDelegate.cooldowns??new Map;this.collisionDelegate.cooldowns=n;for(let s of this.collisionDelegate.collision){if(s.options.phase!==o.phase)continue;let r=s.options.cooldownMs;if(r!=null){let a=`${s.id}:${t.uuid}`,h=n.get(a);if(h!=null&&o.nowMs-h<r)continue;n.set(a,o.nowMs)}s.callback({entity:this,other:t,globals:e})}}updateMaterials(t){if(this.materials?.length)for(let e of this.materials)e instanceof Vt&&e.uniforms&&e.uniforms.iTime&&(e.uniforms.iTime.value+=t.delta)}buildInfo(){let t={};return t.name=this.name,t.uuid=this.uuid,t}dispatch(t,e){this.eventDelegate.dispatch(t,e),G.emit(t,e)}listen(t,e){return this.eventDelegate.listen(t,e)}disposeEvents(){this.eventDelegate.dispose()}};function Nt(i){let t=new M;return t.options={...rt,...i},T(t,e=>Nt(e??{}))}function pt(i){let t=i.clone(!0),e=[],o=[];i.traverse(n=>e.push(n)),t.traverse(n=>o.push(n));for(let n=0;n<e.length;n++){let s=e[n],r=o[n];s?.geometry?.clone&&(r.geometry=s.geometry.clone()),s?.material&&(r.material=Array.isArray(s.material)?s.material.map(a=>a.clone()):s.material.clone())}return t}function Ht(i,t){return t.size===0?i:((...e)=>{let o=Array.from(t.entries()).map(([n,s])=>({sourceRef:n,options:n.options,fsm:n.fsm,hasFSM:Object.prototype.hasOwnProperty.call(n,"fsm"),targetRef:s}));for(let n of o)n.sourceRef.options=n.targetRef.options,n.targetRef.fsm===void 0?delete n.sourceRef.fsm:n.sourceRef.fsm=n.targetRef.fsm;try{return i(...e)}finally{for(let n=o.length-1;n>=0;n--){let s=o[n];s.sourceRef.options=s.options,s.hasFSM?s.sourceRef.fsm=s.fsm:delete s.sourceRef.fsm}}})}function T(i,t){return i.finalizeCloneSupport(t),i}function ut(i){return typeof i?.load=="function"&&typeof i?.data=="function"}var P=class{entityReference;constructor(t){this.entityReference=t}load(){this.entityReference.load&&this.entityReference.load()}data(){return this.entityReference.data?this.entityReference.data():null}};function qe(i){let{args:t,defaultConfig:e,EntityClass:o,BuilderClass:n,entityType:s,MeshBuilderClass:r,CollisionBuilderClass:a,cloneFactory:h}=i,y=null,b,_=t.findIndex(u=>!(u instanceof p));_!==-1&&(b=t.splice(_,1).find(C=>!(C instanceof p)));let yt=b?d(e,b):d(e);t.push(yt);for(let u of t){if(u instanceof p)continue;let C=null,w=new o(u);try{if(ut(w)){let v=new P(w);v.load(),C=v.data()}}catch(v){console.error("Error creating entity with loader:",v)}y=new n(u,w,r?new r(C):null,a?new a(C):null),u.material&&y.withMaterial(u.material,s)}if(!y)throw new Error(`missing options for ${String(s)}, builder is not initialized.`);let A=y.build();return b!=null&&typeof b=="object"&&"position"in b&&(A._spawnPositionExplicit=!0),T(A,u=>h(u))}import{BufferGeometry as Zt,Mesh as dt,Color as jt}from"three";import{Mesh as Xt}from"three";var R=class{_build(t,e,o){let n=new Xt(e,o.at(-1));return n.position.set(0,0,0),n.castShadow=!0,n.receiveShadow=!0,n}_postBuild(){}};var mt=class extends X{},ft=class extends R{build(t){return new Zt}postBuild(){}},ht=class{meshBuilder;collisionBuilder;materialBuilder;options;entity;constructor(t,e,o,n){this.options=t,this.entity=e,this.meshBuilder=o,this.collisionBuilder=n,this.materialBuilder=new j;let s={meshBuilder:this.meshBuilder,collisionBuilder:this.collisionBuilder,materialBuilder:this.materialBuilder};this.options._builders=s,e&&e.options&&(e.options._builders=s)}withPosition(t){return this.options.position=t,this}withMaterial(t,e){return this.materialBuilder&&this.materialBuilder.build(t,e),this}applyMaterialToGroup(t,e){t.traverse(o=>{o instanceof dt&&o.type==="SkinnedMesh"&&e[0]&&!o.material.map&&(o.material=e[0]),o.castShadow=!0,o.receiveShadow=!0})}build(){let t=this.entity;if(this.materialBuilder&&(t.materials=this.materialBuilder.materials),this.meshBuilder&&t.materials){let e=this.meshBuilder.build(this.options);t.mesh=this.meshBuilder._build(this.options,e,t.materials),this.meshBuilder.postBuild()}if(t.group&&t.materials&&this.applyMaterialToGroup(t.group,t.materials),this.collisionBuilder){this.collisionBuilder.withCollision(this.options?.collision||{});let[e,o]=this.collisionBuilder.build(this.options);t.bodyDesc=e,t.colliderDesc=o,t.colliderDescs.push(o);let{x:n,y:s,z:r}=c(this.options.position,m);t.bodyDesc.position=[n,s,r]}if(this.options.collisionType&&(t.collisionType=this.options.collisionType),this.options.color instanceof jt){let e=o=>{let n=o;n&&n.color&&n.color.set&&n.color.set(this.options.color)};if(t.materials?.length)for(let o of t.materials)e(o);if(t.mesh&&t.mesh.material){let o=t.mesh.material;Array.isArray(o)?o.forEach(e):e(o)}t.group&&t.group.traverse(o=>{if(o instanceof dt&&o.material){let n=o.material;Array.isArray(n)?n.forEach(e):e(n)}})}return t}};export{p as a,d as b,xt as c,vt as d,Et as e,Ot as f,Pt as g,Rt as h,wt as i,Bt as j,it as k,O as l,ye as m,be as n,Ce as o,st as p,ge as q,rt as r,we as s,M as t,Nt as u,T as v,mt as w,ft as x,ht as y,qe as z};
@@ -0,0 +1 @@
1
+ import{d as i,m as f}from"./chunk-DECK4UEC.js";var n=null;function b(e){return n=e,()=>{n===e&&(n=null)}}function x(e){if(!n)return console.warn("focusEntity: no active stage focus context"),!1;let t=n.resolveEntity(e);if(!t)return console.warn(`focusEntity: entity ${e} not found`),!1;let o=t.group??t.mesh??null;return o?(i.enabled||(i.enabled=!0),n.ensureDebugReady?.(),f(e),n.frameObject(o),!0):(console.warn(`focusEntity: entity ${e} has no group/mesh`),!1)}import{Euler as y,Quaternion as m}from"three";var u=new y,r=new m;function d(e){return u.set(e.x,e.y,e.z,"XYZ"),r.setFromEuler(u),{x:r.x,y:r.y,z:r.z,w:r.w}}function g(e){return r.set(e.x,e.y,e.z,e.w),u.setFromQuaternion(r,"XYZ"),{x:u.x,y:u.y,z:u.z}}function s(e,t){return!Number.isFinite(t)||t<=0?e:Math.round(e/t)*t}function h(e,t){return{x:s(e.x,t),y:s(e.y,t),z:s(e.z,t)}}function z(e,t){let o=a=>{let c=s(a,t);return c!==0?c:t>0?t:a};return{x:o(e.x),y:o(e.y),z:o(e.z)}}function w(e){return e*Math.PI/180}function I(e){return e*180/Math.PI}export{b as a,x as b,d as c,g as d,s as e,h as f,z as g,w as h,I as i};