@zylem/game-lib 0.9.4 → 0.9.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 (47) hide show
  1. package/dist/actions.d.ts +2 -2
  2. package/dist/api/game-lib.api.json +526 -175
  3. package/dist/api/game-lib.api.md +41 -11
  4. package/dist/api/game-lib.d.ts +172 -26
  5. package/dist/api/game-lib.typedoc.json +48945 -48304
  6. package/dist/bridge.d.ts +8 -1
  7. package/dist/bridge.js +1 -1
  8. package/dist/catalog.js +1 -1
  9. package/dist/{chunk-BQRMYLYD.js → chunk-273CUPEO.js} +1 -1
  10. package/dist/chunk-5V52N34T.js +1 -0
  11. package/dist/{chunk-YQS7CGXE.js → chunk-FUZDTRCU.js} +1 -1
  12. package/dist/{chunk-4CZZZCFB.js → chunk-JCGW5PIR.js} +1 -1
  13. package/dist/chunk-KIFB427K.js +1 -0
  14. package/dist/chunk-P6IOYQHU.js +1 -0
  15. package/dist/{chunk-2IJLXFWY.js → chunk-RPMV7GDX.js} +4 -4
  16. package/dist/chunk-UM5VNQPY.js +1 -0
  17. package/dist/chunk-VKWJHFUR.js +1 -0
  18. package/dist/chunk-VXE3CV3K.js +1 -0
  19. package/dist/chunk-Y23IJJPD.js +1 -0
  20. package/dist/chunk-YRHRMVHS.js +1 -0
  21. package/dist/cinematics.d.ts +4 -3
  22. package/dist/core.d.ts +20 -7
  23. package/dist/core.js +1 -1
  24. package/dist/{debug-state-Cg3f5FB6.d.ts → debug-state-DhVkY2aM.d.ts} +2 -2
  25. package/dist/debug.d.ts +2 -2
  26. package/dist/debug.js +1 -1
  27. package/dist/{entity-XqvuWgPm.d.ts → entity-DC0P747T.d.ts} +5 -0
  28. package/dist/{entity-type-map-CrsrKT8c.d.ts → entity-type-map-B0S5cfv7.d.ts} +52 -13
  29. package/dist/entity.d.ts +5 -17
  30. package/dist/entity.js +1 -1
  31. package/dist/{game-default-BAZPDNPS.js → game-default-VUMUMTXA.js} +1 -1
  32. package/dist/{game-DBt7iVu4.d.ts → game-mu6OSCrq.d.ts} +7 -7
  33. package/dist/level-types-D10LiOcn.d.ts +91 -0
  34. package/dist/public.d.ts +8 -7
  35. package/dist/public.js +1 -1
  36. package/dist/{stage-PBmwT5-Y.d.ts → stage-B_KdSEK6.d.ts} +15 -2
  37. package/dist/web-components.d.ts +6 -5
  38. package/dist/web-components.js +1 -1
  39. package/package.json +3 -3
  40. package/dist/chunk-3CLQWJ2I.js +0 -1
  41. package/dist/chunk-GPCSX3M6.js +0 -1
  42. package/dist/chunk-K3NNXZIJ.js +0 -1
  43. package/dist/chunk-KP6DLLJO.js +0 -1
  44. package/dist/chunk-LI43BZQN.js +0 -1
  45. package/dist/chunk-NK4IXK5V.js +0 -1
  46. package/dist/chunk-STVEILJJ.js +0 -1
  47. package/dist/chunk-VSFULLND.js +0 -1
@@ -1,13 +1,13 @@
1
- import { G as Game, D as DeviceProfile } from './game-DBt7iVu4.js';
2
- import { v as DebugTools } from './debug-state-Cg3f5FB6.js';
1
+ import { G as Game, D as DeviceProfile } from './game-mu6OSCrq.js';
2
+ import { v as DebugTools } from './debug-state-DhVkY2aM.js';
3
3
  import './base-node-life-cycle-BK9xebT9.js';
4
4
  import 'three';
5
5
  import './stage-transition-CmGpV4tc.js';
6
6
  import './game-interfaces-vF5sRi1n.js';
7
7
  import './base-node-idopiSw5.js';
8
- import './stage-PBmwT5-Y.js';
9
- import './entity-type-map-CrsrKT8c.js';
10
- import './entity-XqvuWgPm.js';
8
+ import './stage-B_KdSEK6.js';
9
+ import './entity-type-map-B0S5cfv7.js';
10
+ import './entity-DC0P747T.js';
11
11
  import '@zylem/behaviors/core';
12
12
  import './simulation-body-zQw-emOr.js';
13
13
  import './vector-D3eDzvcA.js';
@@ -22,6 +22,7 @@ import '@zylem/behaviors/particle-emitter';
22
22
  import 'three/addons/lines/webgpu/Line2.js';
23
23
  import './zylem-camera-CWhIGXlW.js';
24
24
  import '@zylem/bridge';
25
+ import './level-types-D10LiOcn.js';
25
26
  import './default-controls-CAKJ5zlo.js';
26
27
 
27
28
  /**
@@ -1 +1 @@
1
- import{a}from"./chunk-4CZZZCFB.js";import"./chunk-GPCSX3M6.js";import"./chunk-WOT6VMZA.js";export{a as ZylemGameElement};
1
+ import{a}from"./chunk-JCGW5PIR.js";import"./chunk-UM5VNQPY.js";import"./chunk-WOT6VMZA.js";export{a as ZylemGameElement};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zylem/game-lib",
3
- "version": "0.9.4",
3
+ "version": "0.9.6",
4
4
  "type": "module",
5
5
  "description": "A powerful and easy-to-use framework for creating simple 3D digital interactive applications using TypeScript.",
6
6
  "license": "MIT",
@@ -115,8 +115,8 @@
115
115
  "@dgreenheck/three-pinata": "^2.0.1",
116
116
  "@sinclair/typebox": "^0.34.52",
117
117
  "@types/howler": "^2.2.13",
118
- "@zylem/behaviors": "^0.8.8",
119
- "@zylem/bridge": "^0.9.4",
118
+ "@zylem/behaviors": "^0.8.11",
119
+ "@zylem/bridge": "^0.9.6",
120
120
  "comlink": "^4.4.2",
121
121
  "howler": "^2.2.4",
122
122
  "idb-keyval": "^6.2.6",
@@ -1 +0,0 @@
1
- import{b as A,c as k,d as B}from"./chunk-BQRMYLYD.js";import{d as s,h as b,j as g,l as v,o as S,q as p,r as E,s as w,t as C,v as P,w as x,x as D}from"./chunk-GPCSX3M6.js";function I(){return new Promise(t=>{let e=new MessageChannel;e.port1.onmessage=()=>t(),e.port2.postMessage(void 0)})}async function O(t,e,i={}){let n=Math.max(1,i.batchSize??5),o=0;for(let a of t.entries)await e(a),o+=1,o%n===0&&await I();return o%n!==0&&await I(),{spawned:o}}import{subscribe as F}from"valtio/vanilla";import{announceBridgeReady as H,getZylemBridge as h}from"@zylem/bridge";var ee="game",te={side:"editor:side",top:"editor:top",isometric:"editor:isometric",free:"editor:free"},d=!1,c=new Set;function ne(){return d}function ie(t){return c.add(t),d&&t.ensureEditorCameras(),()=>{c.delete(t)}}function u(t){if(!t&&!d)return Promise.resolve();if(d=t,!t){for(let e of c)e.destroyEditorCameras();return Promise.resolve()}return Promise.all([...c].map(e=>e.ensureEditorCameras())).then(()=>{})}function z(t){let e=!1;for(let i of c)i.activateCameraById(t)&&(e=!0);return e}function y(t,e){return[t[0]*e.x,t[1]*e.y,t[2]*e.z]}function V(t,e){let i=new Float32Array(t.length);for(let n=0;n<t.length;n+=3)i[n]=t[n]*e.x,i[n+1]=t[n+1]*e.y,i[n+2]=t[n+2]*e.z;return i}function G(t,e){let{shape:i}=t,n=t.offset?y(t.offset,e):t.offset,o;switch(i.type){case"box":o={type:"box",halfExtents:y(i.halfExtents,e)};break;case"sphere":o={type:"sphere",radius:i.radius*Math.max(e.x,e.y,e.z)};break;case"capsule":case"cylinder":case"cone":o={type:i.type,halfHeight:i.halfHeight*e.y,radius:i.radius*Math.max(e.x,e.z)};break;case"convexHull":o={type:"convexHull",vertices:V(i.vertices,e)};break;case"trimesh":o={type:"trimesh",vertices:V(i.vertices,e),indices:i.indices};break;case"heightfield":o={...i,scale:y(i.scale,e)};break;default:o=i;break}return{...t,shape:o,offset:n}}function K(t){if(!t.colliderBaseline){let e=t.colliderDescs.length?t.colliderDescs:t.colliderDesc?[t.colliderDesc]:[];t.colliderBaseline=e.map(i=>({...i}))}return t.colliderBaseline}function L(t){if(!t.colliderScaleDirty)return!1;t.colliderScaleDirty=!1;let e=K(t);if(!e.length)return!1;let i=t.getScale(),n=e.map(r=>G(r,i));t.colliderDescs=n,t.colliderDesc=n[0];let o=t.physicsWorldRef;if(!o)return!0;let a=t.getPose();return o.destroyEntity(t),a&&t.bodyDesc&&(t.bodyDesc.position=[a.position.x,a.position.y,a.position.z],t.bodyDesc.rotation=[a.rotation.x,a.rotation.y,a.rotation.z,a.rotation.w]),o.addEntity(t),!0}function R(t){return(t?.group??t?.mesh)?.scale}function M(t){let i=(typeof t?.getScale=="function"?t.getScale():void 0)??t?.scale??R(t)??{};return{x:i.x??1,y:i.y??1,z:i.z??1}}function ye(t){let e=typeof t?.getPose=="function"?t.getPose():null;if(!e?.rotation)return;let{x:i,y:n,z:o,w:a}=e.rotation;return{x:i,y:n,z:o,w:a}}function m(t){let e=typeof t?.getPose=="function"?t.getPose():null,i=e?.position??{x:0,y:0,z:0},n=e?.rotation??{x:0,y:0,z:0,w:1};return{position:{x:i.x,y:i.y,z:i.z},rotation:B(n),quaternion:{x:n.x,y:n.y,z:n.z,w:n.w},scale:M(t)}}function N(t,e){if(typeof t?.setScale=="function"){t.setScale(e.x,e.y,e.z);return}R(t)?.set?.(e.x,e.y,e.z)}function $(t){!t||typeof t.getScale!="function"||L(t)}function W(t,e){if(!t)return!1;let i=e.quaternion??(e.rotation?k(e.rotation):void 0),n=!1;return(e.position||i)&&typeof t.setPose=="function"&&(n=t.setPose({position:e.position,rotation:i})),e.scale&&(N(t,e.scale),n=!0),n}function _(t){let e=t?.constructor?.type;return e?String(e).replace("Symbol(","").replace(")",""):"Unknown"}function Q(t){let e=t;if(!e?.uuid)return;let i=h().channel;if(!i.hasSubscribers("entity:upsert"))return;let n=m(t);i.queue("entity:upsert",[{uuid:e.uuid,name:e.name||"Unnamed",type:_(t),position:n.position,rotation:n.rotation,scale:n.scale,quaternion:n.quaternion}])}function me(t,e){h().channel.send("game:notice",{level:t,message:e})}function j(t,e,i){let n=[...new Set(t.swatches.map(r=>r.source))],o=[...new Set(e.map(r=>r.uuid))],a=o.length===1?i(o[0])||"entity":`${o.length} entities`;return`Apply ${n.join(", ")} to ${a}`}function Z(t,e){return!e||t.length!==e.length?!1:t.every((i,n)=>i===e[n])}function J(t,e){switch(e){case"add":E(t);break;case"subtract":w(t);break;case"toggle":for(let i of t)C(i);break;default:p(t);break}}function X(t,e){return t.on.bind(t)("camera:activate",({id:n})=>e(n))}var q=class{channel;unsubscribes=[];host=null;editorKnown={};applyingSceneOperation=!1;editorCameraFrame=0;constructor(){this.channel=h().channel}connect(e,i){this.disconnect(),this.host=e,this.unsubscribes.push(this.channel.on("debug:set",({enabled:n})=>{this.editorKnown.debug=n,s.enabled=n}),this.channel.on("tool:set",({tool:n})=>{g(n)}),this.channel.on("playback:set",({paused:n})=>{this.editorKnown.paused=n,b(n)}),this.channel.on("entity:select",({uuid:n,uuids:o,mode:a})=>{o?J(o,a??"replace"):S(n),this.editorKnown.selectedUuid=s.selectedEntityId,this.editorKnown.selectedUuids=[...s.selectedEntityIds]}),this.channel.on("entity:focus",({uuid:n})=>{A(n)}),this.channel.on("entity:transform",({uuid:n,position:o,rotation:a,quaternion:r,scale:f})=>{let l=this.host?.resolveEntity(n);if(!l)return;let U=m(l);if(W(l,{position:o,rotation:a,quaternion:r,scale:f}),f&&$(l),Q(l),this.applyingSceneOperation)return;let T=m(l);this.channel.send("scene:operation",{opId:`tx-${n}-${Date.now().toString(36)}`,kind:"transform",label:`Set ${l.name||"entity"} transform`,entries:[{uuid:n,before:U,after:T}]})}),this.channel.on("entity:create",({typeId:n,props:o,pose:a})=>{this.host?.createEntity?.(n,o,a)}),this.channel.on("level:load",({buffer:n})=>{this.loadLevel(n)}),this.channel.on("scene:operation:apply",({op:n,direction:o})=>{this.applyingSceneOperation=!0;try{this.host?.applySceneOperation?.(n,o)}finally{this.applyingSceneOperation=!1}}),this.channel.on("add:type:set",({typeId:n,props:o})=>{D(n,o??null)}),this.channel.on("snap:set",n=>{P(n)}),this.channel.on("grid:set",({visible:n})=>{x(n)}),this.channel.on("stage:variable:set",({key:n,value:o})=>{this.host?.setStageVariable?.(n,o)}),this.channel.on("pick:mode:set",({enabled:n})=>{v(n)}),this.channel.on("entity:pick",({requestId:n,ndc:o})=>{let a=this.host?.pickEntity?.(o)??null;this.channel.send("entity:pick:result",{requestId:n,hit:a})}),this.channel.on("entity:apply-swatch",n=>{this.handleApplySwatch(n)}),this.channel.on("cutscene:load",n=>this.host?.cutscene?.load(n)),this.channel.on("cutscene:play",({from:n})=>this.host?.cutscene?.play(n)),this.channel.on("cutscene:pause",()=>this.host?.cutscene?.pause()),this.channel.on("cutscene:stop",()=>this.host?.cutscene?.stop()),this.channel.on("cutscene:seek",({time:n})=>this.host?.cutscene?.seek(n)),this.channel.on("cutscene:unload",()=>this.host?.cutscene?.unload()),this.channel.on("camera:pose:get",({requestId:n})=>{let o=this.host?.cameraPose?.();o&&this.channel.send("camera:pose",{requestId:n,...o})}),X(this.channel,z),this.onEditorAttached(()=>{this.attachEditorCameras()}),this.onEditorDetached(()=>{this.detachEditorCameras()}),F(s,()=>this.publishDebugStateChanges())),this.publishDebugStateChanges(),this.editorIsAttached()&&this.attachEditorCameras(),H(i)}publishCutsceneStatus(e){this.channel.queue("cutscene:status",e)}publishCutsceneView(e){this.channel.queue("cutscene:view",e)}disconnect(){for(let e of this.unsubscribes)e();this.unsubscribes=[],this.host=null,this.editorKnown={},this.detachEditorCameras()}handleApplySwatch(e){let i=e.opId??`swatch-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,n=this.host?.applySwatches?this.host.applySwatches({...e,opId:i}):{results:e.uuids.flatMap(a=>e.swatches.map(r=>({uuid:a,kind:r.kind,source:r.source,ok:!1,reason:"entity-not-found"}))),entries:[]},o=[...new Set(n.entries.map(a=>a.uuid))];e.select&&o.length>0&&p(o),n.entries.length>0&&!this.applyingSceneOperation&&this.channel.send("scene:operation",{opId:i,kind:"swatch",label:j(e,n.entries,a=>this.host?.resolveEntity(a)?.name),entries:n.entries}),this.channel.send("entity:swatch-applied",{opId:i,results:n.results})}publishDebugStateChanges(){let e={};s.paused!==this.editorKnown.paused&&(this.editorKnown.paused=s.paused,e.paused=s.paused),s.enabled!==this.editorKnown.debug&&(this.editorKnown.debug=s.enabled,e.debug=s.enabled),(e.paused!==void 0||e.debug!==void 0)&&this.publishStatus(e),(s.selectedEntityId!==this.editorKnown.selectedUuid||s.hoveredEntityId!==this.editorKnown.hoveredUuid||!Z(s.selectedEntityIds,this.editorKnown.selectedUuids))&&(this.editorKnown.selectedUuid=s.selectedEntityId,this.editorKnown.selectedUuids=[...s.selectedEntityIds],this.editorKnown.hoveredUuid=s.hoveredEntityId,this.channel.queue("entity:selection",{selectedUuid:s.selectedEntityId,hoveredUuid:s.hoveredEntityId,selectedUuids:[...s.selectedEntityIds]}))}wantsEntityUpdates(){return this.channel.hasSubscribers("entity:upsert")||this.channel.hasSubscribers("stage:snapshot")}wantsThumbnails(){return this.channel.hasSubscribers("entity:thumbnail")}onEditorAttached(e){return this.channel.onSubscriberAdded(i=>{if(i!=="entity:upsert"&&i!=="entity:thumbnail")return;let n=i==="entity:upsert"?"entity:thumbnail":"entity:upsert";this.channel.subscriberCount(n)>0||e()})}onEditorDetached(e){let i=this.channel;return typeof i.onSubscriberRemoved!="function"?()=>{}:i.onSubscriberRemoved(n=>{if(n!=="entity:upsert"&&n!=="entity:thumbnail")return;let o=n==="entity:upsert"?"entity:thumbnail":"entity:upsert";this.channel.subscriberCount(o)>0||e()})}editorIsAttached(){return this.channel.hasSubscribers("entity:upsert")||this.channel.hasSubscribers("entity:thumbnail")}attachEditorCameras(){u(!0),this.watchEditorDetached()}detachEditorCameras(){this.stopWatchingEditorDetached(),u(!1)}watchEditorDetached(){if(typeof this.channel.onSubscriberRemoved=="function"||this.editorCameraFrame)return;let i=()=>{if(!this.editorIsAttached()){this.editorCameraFrame=0,u(!1);return}this.editorCameraFrame=requestAnimationFrame(i)};this.editorCameraFrame=requestAnimationFrame(i)}stopWatchingEditorDetached(){this.editorCameraFrame&&(cancelAnimationFrame(this.editorCameraFrame),this.editorCameraFrame=0)}publishConfig(e){this.channel.send("game:config",e)}publishLoading(e){this.channel.send("game:loading",e)}publishStatus(e){this.channel.queue("game:status",e)}publishVariable(e){this.channel.send("game:variable",e)}async loadLevel(e){let{spawned:i}=await O(e,n=>{this.host?.createEntity?.(n.typeId,void 0,n.pose)});this.publishNotice("info",`Streamed ${i} level entries`)}publishNotice(e,i){this.channel.send("game:notice",{level:e,message:i})}publishStageSnapshot(e){this.channel.send("stage:snapshot",e)}queueEntityUpsert(e){e.length&&this.channel.queue("entity:upsert",e)}queueEntityRemoved(e){e.length&&this.channel.queue("entity:removed",{uuids:e})}queueThumbnails(e){e.length&&this.channel.queue("entity:thumbnail",e)}publishCatalog(e){this.channel.send("catalog:snapshot",{entities:e})}publishSceneOperation(e){this.channel.send("scene:operation",e)}wantsSceneOperations(){return this.channel.hasSubscribers("scene:operation")}};function fe(t){h().channel.send("scene:operation",t)}export{ee as a,te as b,ne as c,ie as d,O as e,L as f,M as g,ye as h,m as i,$ as j,W as k,_ as l,me as m,q as n,fe as o};
@@ -1 +0,0 @@
1
- import{proxy as c}from"valtio/vanilla";var a=["translate","rotate","scale"];function b(t){return a.includes(t)}var y={enabled:!0,translate:.25,rotate:Math.PI/12,scale:.1},e=c({enabled:!1,paused:!1,tool:"none",selectedEntityId:null,selectedEntityIds:[],hoveredEntityId:null,snap:{...y},gridVisible:!1,addTypeId:null,addTypeProps:null,pickMode:!1,flags:new Set}),l=null;function S(t){return l=t,()=>{l===t&&(l=null)}}function d(t){return!t||!l?null:l(t)}function s(t,n){if(t==null)return null;if(typeof t=="string")return t;let o=t.uuid;if(typeof o=="string")return console.warn(`${n}: received a live entity. Pass the UUID instead \u2014 storing entities in debugState makes valtio deep-proxy the scene graph.`),o;throw new TypeError(`${n} expects an entity UUID string or null, received ${typeof t}.`)}function v(){return e.paused}function T(t){e.paused=t}function m(){return e.tool}function D(t){e.tool=t}function h(){return e.enabled||e.tool!=="none"||e.pickMode}function k(t){e.pickMode=t,!t&&e.tool!=="select"&&e.tool!=="delete"&&x()}function P(){return e.pickMode}function R(){return e.selectedEntityId}function p(t){let n=s(t,"setSelectedEntityId");e.selectedEntityId!==n&&(e.selectedEntityId=n,e.selectedEntityIds=n?[n]:[])}function M(){return[...e.selectedEntityIds]}function u(t){let n=t.map((i,r)=>s(i,`setSelectedEntityIds[${r}]`)).filter(i=>i!==null);n.length===e.selectedEntityIds.length&&n.every((i,r)=>e.selectedEntityIds[r]===i)||(e.selectedEntityIds=n,e.selectedEntityId=n[0]??null)}function g(t){let n=e.selectedEntityIds,o=t.filter((i,r)=>!n.includes(i)&&t.indexOf(i)===r);o.length!==0&&u([...n,...o])}function f(t){let n=new Set(t);u(e.selectedEntityIds.filter(o=>!n.has(o)))}function w(t){let n=s(t,"toggleSelectedEntityId");n&&(e.selectedEntityIds.includes(n)?f([n]):g([n]))}function G(){return{...e.snap}}function O(t){Object.assign(e.snap,t)}function H(t){e.gridVisible=t}function A(t,n){e.addTypeId=t,e.addTypeProps=t?n??null:null}function U(){return e.hoveredEntityId}function E(t){let n=s(t,"setHoveredEntityId");e.hoveredEntityId!==n&&(e.hoveredEntityId=n)}function x(){E(null)}function F(){return d(e.selectedEntityId)}function N(){return d(e.hoveredEntityId)}function V(t){p(s(t,"setSelectedEntity"))}export{a,b,y as c,e as d,S as e,d as f,v as g,T as h,m as i,D as j,h as k,k as l,P as m,R as n,p as o,M as p,u as q,g as r,f as s,w as t,G as u,O as v,H as w,A as x,U as y,E as z,x as A,F as B,N as C,V as D};
@@ -1 +0,0 @@
1
- import{a as I,b as y,r as Z,t as f,v as d}from"./chunk-KP6DLLJO.js";import{e as R}from"./chunk-UUOPT2N4.js";import{j as E}from"./chunk-4QLJUQSJ.js";import{a as O,g as b,i as T,j as w}from"./chunk-7WRQ2UAN.js";import{Group as W,Quaternion as X,Vector3 as S}from"three";import{ParticleEmitterBehavior as x}from"@zylem/behaviors/particle-emitter";var U={...Z,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},M=Symbol("ParticleSystem"),C=1,Q=new S(C,C,C),H=new S;function $(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=M;particleHandle=null;getSelectionBounds(o){return this.group?(this.group.getWorldPosition(H),o.setFromCenterAndSize(H,Q),R(o)):null}constructor(o,e=!0){super(),this.options=y(U,o),this.group=new W;let t=this.options.position;t&&this.group.position.copy(w(t)),this.__zylemParticleSystemEntity=!0,this.bindStandaloneTransforms(),e&&(this.particleHandle=this.use(x,$(this.options)))}bindStandaloneTransforms(){let o=()=>{this.options.position=new S(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 X;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 q(n){return z(n,!0)}import{Group as K,Sprite as j,SpriteMaterial as J,CanvasTexture as tt,LinearFilter as D,Color as Y,ClampToEdgeWrapping as B}from"three";import{getCooldown as L}from"@zylem/behaviors/cooldown";var et={"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}},A=192,ot={xs:8,sm:16,md:32,lg:48,xl:64},_={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)"},it=Symbol("CooldownIcon"),v=class extends f{static type=it;_sprite=null;_texture=null;_canvas=null;_ctx=null;_cameraRef=null;_iconTexture=null;_iconImage=null;_lastRenderedProgress=-1;constructor(o){super(),this.options=y(_,o),this.options.screenPosition=T(this.options.screenPosition,_.screenPosition),this.group=new K,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 tt(this._canvas),this._texture.minFilter=D,this._texture.magFilter=D,this._texture.wrapS=B,this._texture.wrapT=B;let e=new J({map:this._texture,transparent:!0,depthTest:!1,depthWrite:!1});if(this._sprite=new j(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=L(this.options.cooldown);if(a){let m=Math.max(0,a.duration-a.elapsed),g=m>=10?Math.ceil(m).toString():m.toFixed(1),u=Math.floor(t*.3);e.font=`bold ${u}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 Y?o:new Y(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=L(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=b(this.options.screenPosition,O),r=i.x,s=i.y,{fx:l,fy:p}=et[t],c=l*o,h=p*e,a=e/A;return{px:c+r*a,py:h+s*a}}resolveIconSize(o){let e=this.options.iconSize??"md",t,i;typeof e=="string"?t=i=ot[e]:typeof e=="number"?t=i=e:(t=e.width,i=e.height);let r=o/A;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 u=p*2/t,{widthPx:k,heightPx:N}=this.resolveIconSize(t),G=Math.max(1e-4,k*u),V=Math.max(1e-4,N*u);this._sprite.scale.set(G,V,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 F(...n){let o=n.filter(t=>!(t instanceof I)),e={..._};for(let t of o)e={...e,...t};return d(new v(e),t=>F(t??{}))}function rt(n,o,e){e({me:n,globals:o})}function nt(n,o){let e=o??E();rt(n,e,n.nodeDestroy.bind(n))}export{M as a,P as b,q as c,F as d,nt as e};
@@ -1 +0,0 @@
1
- import{d as H,j as E}from"./chunk-6FGXC4T6.js";import{a as G,b as V}from"./chunk-AIQ6IVT5.js";import{a as M,b as Z,c as j}from"./chunk-EVYHPR3J.js";import{c as m,d as S,e as z,f as F,g as L,h as c,i as U,j as N}from"./chunk-7WRQ2UAN.js";import{p as X}from"./chunk-XRP4JJXL.js";import{StageBodyKind as W}from"@zylem/behaviors/core";import{Color as be,Vector2 as Y,Vector3 as K}from"three";function g(i){if(!i||typeof i!="object")return!1;let e=Object.getPrototypeOf(i);return e===Object.prototype||e===null}function l(i){if(i==null||typeof i=="function"||typeof i!="object")return i;if(i instanceof be||i instanceof Y||i instanceof K)return i.clone();if(i instanceof Float32Array)return new Float32Array(i);if(Array.isArray(i))return i.map(e=>l(e));if(g(i)){let e={};for(let[t,o]of Object.entries(i))t!=="_builders"&&(e[t]=l(o));return e}return i}function d(i,e){let t=l(i);if(!e)return t;if(!g(t)||!g(e))return l(e);let o=t;for(let[n,s]of Object.entries(e)){if(n==="_builders"||s===void 0)continue;let r=o[n];if(n==="shader"){o[n]=l(s);continue}if(r instanceof Y&&z(s)){o[n]=U(s,r);continue}if(r instanceof K&&F(s)){o[n]=N(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 Ce(i,e){let t={kind:i?W.Static:W.Dynamic,position:[0,0,0],gravityScale:e.gravityScale??1,canSleep:e.canSleep??!1,ccdEnabled:e.ccdEnabled??!0},o=M(e.lockRotations);o&&(t.lockRotation=o);let n=M(e.lockTranslations);return n&&(t.lockTranslation=n),t}function ge(i,e){if(e.offset){let t=c(e.offset,m);i.offset=[t.x,t.y,t.z]}e.sensor&&(i.sensor=!0),e.collisionType&&(i.collisionGroups=Z(e.collisionType,e.collisionFilter))}function h(i,e,t){return ge(i,e),{__kind:"collision",bodyDesc:Ce(e.static??!1,e),colliderDesc:i,cloneComponent:t}}function ve(i={}){let e=c(i.size,S),t={shape:{type:"box",halfExtents:[e.x/2,e.y/2,e.z/2]}},o=l(i);return h(t,i,()=>ve(o))}function xe(i={}){let e={shape:{type:"sphere",radius:i.radius??1}},t=l(i);return h(e,i,()=>xe(t))}function Ee(i={}){let e=i.radius??1,o={shape:{type:"cone",halfHeight:(i.height??2)/2,radius:e}},n=l(i);return h(o,i,()=>Ee(n))}function Oe(i={}){let e=i.radius??1,o={shape:{type:"cone",halfHeight:(i.height??2)/2,radius:e}},n=l(i);return h(o,i,()=>Oe(n))}function Pe(i={}){let e=Math.max(i.radiusTop??1,i.radiusBottom??1),o={shape:{type:"cylinder",halfHeight:(i.height??2)/2,radius:e}},n=l(i);return h(o,i,()=>Pe(n))}function Re(i={}){let e=i.radius??.5,o={shape:{type:"capsule",halfHeight:(i.length??1)/2,radius:e}},n=l(i);return h(o,i,()=>Re(n))}function Be(i={}){let e=L(i.tile,{x:10,y:10}),t=i.subdivisions??10,o=(t+1)*(t+1),n=i.heightData??new Float32Array(o),s={shape:{type:"heightfield",rows:t,cols:t,heights:n,scale:[e.x,1,e.y]}},r={...i,static:i.static??!0},a=l(r);return h(s,r,()=>Be(a))}function we(i={}){let e=c(i.size,S),t={shape:{type:"box",halfExtents:[e.x/2,e.y/2,e.z/2]},sensor:!0},o={...i,static:i.static??!0,sensor:!0},n=l(o);return h(t,o,()=>we(n))}import{Mesh as ae,ShaderMaterial as Ve,Group as ze}from"three";var Q=import.meta.env.VITE_DEBUG_FLAG==="true";import{nanoid as Se}from"nanoid";var p=class i{parent=null;children=[];options;uuid="";name="";markedForRemoval=!1;lifecycleCallbacks={setup:[],loaded:[],update:[],destroy:[],cleanup:[]};trackLifecycleRegistrations=!1;userLifecycleRegistrations=[];constructor(e=[]){let t=e.filter(o=>!(o instanceof i)).reduce((o,n)=>({...o,...n}),{});this.options=t,this.uuid=Se()}onSetup(...e){return this.lifecycleCallbacks.setup.push(...e),this.recordLifecycleRegistration("onSetup",e),this}onLoaded(...e){return this.lifecycleCallbacks.loaded.push(...e),this.recordLifecycleRegistration("onLoaded",e),this}onUpdate(...e){return this.lifecycleCallbacks.update.push(...e),this.recordLifecycleRegistration("onUpdate",e),this}onDestroy(...e){return this.lifecycleCallbacks.destroy.push(...e),this.recordLifecycleRegistration("onDestroy",e),this}onCleanup(...e){return this.lifecycleCallbacks.cleanup.push(...e),this.recordLifecycleRegistration("onCleanup",e),this}prependSetup(...e){return this.lifecycleCallbacks.setup.unshift(...e),this.recordLifecycleRegistration("prependSetup",e),this}prependUpdate(...e){return this.lifecycleCallbacks.update.unshift(...e),this.recordLifecycleRegistration("prependUpdate",e),this}setParent(e){this.parent=e}getParent(){return this.parent}add(e){this.children.push(e),e.setParent(this)}remove(e){let t=this.children.indexOf(e);t!==-1&&(this.children.splice(t,1),e.setParent(null))}getChildren(){return this.children}isComposite(){return this.children.length>0}enableUserLifecycleTracking(){this.trackLifecycleRegistrations=!0}replayUserLifecycleRegistrationsTo(e,t){for(let o of this.userLifecycleRegistrations){let n=t?o.callbacks.map(s=>t(s)):[...o.callbacks];switch(o.method){case"onSetup":e.onSetup(...n);break;case"onLoaded":e.onLoaded(...n);break;case"onUpdate":e.onUpdate(...n);break;case"onDestroy":e.onDestroy(...n);break;case"onCleanup":e.onCleanup(...n);break;case"prependSetup":e.prependSetup(...n);break;case"prependUpdate":e.prependUpdate(...n);break}}}cloneChildrenInto(e){for(let t of this.children)e.add(Me(t))}nodeSetup(e){this.markedForRemoval=!1,typeof this._setup=="function"&&this._setup(e);for(let t of this.lifecycleCallbacks.setup)t(e);this.children.forEach(t=>t.nodeSetup(e))}nodeUpdate(e){if(!this.markedForRemoval){typeof this._update=="function"&&this._update(e),typeof this._tickActions=="function"&&this._tickActions(e.delta);for(let t of this.lifecycleCallbacks.update)t(e);this.children.forEach(t=>t.nodeUpdate(e))}}nodeDestroy(e){if(!this.markedForRemoval){this.children.forEach(t=>t.nodeDestroy(e));for(let t of this.lifecycleCallbacks.destroy)t(e);typeof this._destroy=="function"&&this._destroy(e),this.markedForRemoval=!0;for(let t of this.lifecycleCallbacks.cleanup)t(e);typeof this._cleanup=="function"&&this._cleanup(e)}}async nodeLoaded(e){typeof this._loaded=="function"&&await this._loaded(e);for(let t of this.lifecycleCallbacks.loaded)t(e)}nodeCleanup(e){this.children.forEach(t=>t.nodeCleanup?.(e));for(let t of this.lifecycleCallbacks.cleanup)t(e);typeof this._cleanup=="function"&&this._cleanup(e)}getOptions(){return this.options}setOptions(e){this.options={...this.options,...e}}recordLifecycleRegistration(e,t){!this.trackLifecycleRegistrations||t.length===0||this.userLifecycleRegistrations.push({method:e,callbacks:[...t]})}};function Me(i){let e=i?.clone;if(typeof e!="function")throw new Error(`Cannot clone child node "${i.name||i.uuid||"unknown"}": missing clone() support.`);return e.call(i)}import{createTransformStore as Fe}from"@zylem/behaviors/core";import{makeMoveable as ke}from"@zylem/behaviors/core";function q(i){let e=ke(i);return X(e)}import{clearVelocityIntent as le}from"@zylem/behaviors/core";import{Color as Ie,Vector3 as Ge}from"three";import{Quaternion as De}from"three";var J=Symbol("explicitSpawnPosition"),O=new De;function ee(i){return i.filter(e=>!(e instanceof p)).some(e=>e!=null&&typeof e=="object"&&"position"in e)}function te(i){i[J]=!0}function Te(i){return i._spawnPositionExplicit?!0:i.options[J]===!0}function _e(i){return i.options.hideUntilPositioned!==!1}function ie(i){return i._spawnPlacementPending===!0}function Ae(i){return i._spawnPositionExplicit===!0||i._spawnPlacementReady===!0}function P(i){let e=i.group??i.mesh;if(e){if(i.physicsAttached&&i.body)try{let t=i.body.translation();e.position.set(t.x,t.y,t.z);return}catch{}if(i.wasmStageRef&&(i.runtimeHandle??-1)>=0){let t=i.wasmStageRef.getPose(i.runtimeHandle);if(t){e.position.set(t.position[0],t.position[1],t.position[2]);return}}if(i.options.position){let t=c(i.options.position,m);e.position.set(t.x,t.y,t.z)}}}function oe(i){let e=i.group??i.mesh;if(!(!e||i.controlledRotation)){if(i.physicsAttached&&i.body)try{let t=i.body.rotation();O.set(t.x,t.y,t.z,t.w),e.setRotationFromQuaternion(O);return}catch{}if(i.wasmStageRef&&(i.runtimeHandle??-1)>=0){let t=i.wasmStageRef.getPose(i.runtimeHandle);t&&(O.set(t.rotation[0],t.rotation[1],t.rotation[2],t.rotation[3]),e.setRotationFromQuaternion(O))}}}function v(i,e){i.group&&(i.group.visible=e),i.mesh&&(i.mesh.visible=e)}function yt(i){if(i._spawnInProgress=!0,i._spawnPlacementReady=!1,!_e(i)){i._spawnPlacementPending=!1;return}i._spawnPositionExplicit=Te(i),i._spawnPlacementPending=!0,v(i,!1)}function bt(i){i._spawnInProgress=!1}function ne(i){i._spawnPlacementReady=!0}function D(i){if(i._spawnPlacementPending){if(P(i),i._spawnPlacementPending=!1,i.options.visible===!1){v(i,!1);return}v(i,!0)}}function Ct(i){!ie(i)||i.options.hideUntilPositioned===!0&&!Ae(i)||D(i)}function se(i){P(i),i._spawnPlacementPending=!1,v(i,!0)}function gt(i){ie(i)&&v(i,!1)}var re={position:new Ge(0,0,0),material:{color:new Ie("#ffffff"),shader:H},collision:{static:!1}};function Bt(i,e){let t=i.filter(n=>!(n instanceof p)),o=d(e);for(let n of t)o=d(o,n);return ee(i)&&te(o),o}function Le(i){return i!=null&&typeof i=="object"}function ce(i){return{phase:i?.phase??"stay",cooldownMs:i?.cooldownMs}}function Ue(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}var T=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 G;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=Fe(),q(this),this.wrapSpawnPlacementMutators()}wrapSpawnPlacementMutators(){let e=()=>{ne(this),!this._spawnInProgress&&(P(this),D(this))},t=r=>(a,f,y)=>{!this.body&&!(this.wasmStageRef&&this.runtimeHandle>=0)||(r(a,f,y),e())},o=r=>a=>{!this.body&&!(this.wasmStageRef&&this.runtimeHandle>=0)||(r(a),e())};this.setPosition=t(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||oe(this)},s=this.setPose.bind(this);this.setPose=r=>{let a=s(r);return a&&(r.position!=null&&e(),r.rotation!=null&&n(),a)}}reveal(){this.options.visible=!0,se(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 e=this.body;if(!e)return null;let t=e.translation(),o=e.rotation();return{position:{x:t.x,y:t.y,z:t.z},rotation:{x:o.x,y:o.y,z:o.z,w:o.w}}}setPose(e){if(this.wasmStageRef&&this.runtimeHandle>=0){let o=!0;if(e.position){let n=c(e.position);o=this.wasmStageRef.setPosition(this.runtimeHandle,n.x,n.y,n.z)&&o}if(e.rotation){let{x:n,y:s,z:r,w:a}=e.rotation;o=this.wasmStageRef.setRotation(this.runtimeHandle,n,s,r,a)&&o}return o&&this.body?.markPoseDiscontinuity(),o}let t=this.body;if(!t)return!1;if(e.position){let o=c(e.position);t.setTranslation({x:o.x,y:o.y,z:o.z},!0)}return e.rotation&&t.setRotation(e.rotation,!0),!0}getScale(){return{...this._scale}}setScale(e,t,o){this._scale={x:e,y:t,z:o},(this.group??this.mesh)?.scale.set(e,t,o),this.colliderScaleDirty=!0}add(...e){for(let t of e)t instanceof ae?(this.addMeshComponent(t),this.trackComponent(t)):$(t)?(this.addCollisionComponent(t),this.trackComponent(t)):super.add(t);return this}addMeshComponent(e){if(this.mesh)this.compoundMeshes.push(e),this.group||(this.group=new ze,this.group.add(this.mesh)),this.group.add(e);else if(this.mesh=e,this.materials||(this.materials=[]),e.material){let t=e.material;Array.isArray(t)?this.materials.push(...t):this.materials.push(t)}}addCollisionComponent(e){if(this.bodyDesc)this.colliderDescs.push(e.colliderDesc);else{this.bodyDesc=e.bodyDesc,this.colliderDesc=e.colliderDesc,this.colliderDescs.push(e.colliderDesc);let t=c(this.options?.position,m);this.bodyDesc.position=[t.x,t.y,t.z]}}trackComponent(e){if(this.trackAddedComponents){if(e instanceof ae){this.trackedComponents.push({kind:"mesh",component:pe(e)});return}this.trackedComponents.push({kind:"collision",component:k(e)})}}_actions=[];runAction(e){return this._actions.push(e),e}action(e){return e.persistent=!0,this._actions.push(e),e}clearActions(){this._actions.length=0}_tickActions(e){if(this._actions.length===0)return;let t=this.transformStore;t.velocity.x=0,t.velocity.y=0,t.velocity.z=0,le(t,"actions"),t.angularVelocity.x=0,t.angularVelocity.y=0,t.angularVelocity.z=0,t.dirty.angularVelocity=!1;for(let o=this._actions.length-1;o>=0;o--){let n=this._actions[o];n.tick(this,e),n.done&&!n.persistent&&this._actions.splice(o,1)}this._actions.length===0&&(t.velocity.x=0,t.velocity.y=0,t.velocity.z=0,le(t,"actions"),t.angularVelocity.x=0,t.angularVelocity.y=0,t.angularVelocity.z=0,t.dirty.angularVelocity=!1)}create(){return this.name=this.options.name||"",this}clone(e){if(!this.cloneFactory)throw new Error(`Cannot clone ${this.constructor.name}: clone() is only supported for entities created by official factory helpers.`);let t=this.cloneFactory(d(this.options,e)),o=this.copyBehaviorRefsTo(t),n=r=>He(r,o);this.replayUserLifecycleRegistrationsTo(t,n);let s=this.getCollisionRegistrations();if(s.length>0)for(let r of s)t.onCollision(n(r.callback),r.options);for(let r of this.trackedComponents){if(r.kind==="mesh"){t.add(pe(r.component));continue}t.add(k(r.component))}return this.cloneChildrenInto(t),t}finalizeCloneSupport(e){return this.cloneFactory=e,this.enableUserLifecycleTracking(),this.trackAddedComponents=!0,this}onCollision(...e){let t=[...this.collisionDelegate.collision??[]],o=this.collisionDelegate.nextId??0;if(e.length===1||e.length===2&&(e[1]==null||Le(e[1]))){let n=e[0];if(!n)return this;let s=e[1];return t.push({id:o,callback:n,options:ce(s)}),o+=1,this.collisionDelegate.collision=t,this.collisionDelegate.nextId=o,this}for(let n of e)t.push({id:o,callback:n,options:ce()}),o+=1;return this.collisionDelegate.collision=t,this.collisionDelegate.nextId=o,this}use(e,t){let o={descriptor:e,options:{...e.defaultOptions,...t}};this.behaviorRefs.push(o);let n={getFSM:()=>o.fsm??null,getOptions:()=>o.options,ref:o},s=e.createHandle?.(o)??{};return{...n,...s}}getBehaviorRefs(){return this.behaviorRefs}getBehaviorRef(e){return this.behaviorRefs.find(t=>t.descriptor.key===e.key)??null}hasBehavior(e){return this.getBehaviorRef(e)!==null}removeBehavior(e){let t="descriptor"in e?this.behaviorRefs.indexOf(e):this.behaviorRefs.findIndex(n=>n.descriptor.key===e.key);if(t===-1)return null;let[o]=this.behaviorRefs.splice(t,1);return o??null}restoreBehaviorRef(e){this.behaviorRefs.includes(e)||this.behaviorRefs.push(e)}getCollisionCallbacks(){return this.getCollisionRegistrations().map(e=>e.callback)}getCollisionRegistrations(){return(this.collisionDelegate.collision??[]).map(e=>({id:e.id,callback:e.callback,options:{...e.options}}))}copyBehaviorRefsTo(e){let t=new Map;for(let o of this.behaviorRefs){e.use(o.descriptor,l(o.options));let n=e.getBehaviorRefs().at(-1);n&&t.set(o,n)}return t}_setup(e){for(let t=this._actions.length-1;t>=0;t--){let o=this._actions[t];o.done&&!o.persistent?this._actions.splice(t,1):o.reset()}}async _loaded(e){}_update(e){this.updateMaterials(e)}_destroy(e){}_cleanup(e){this.disposeEvents();for(let t of this.compoundMeshes)t.geometry?.dispose(),Array.isArray(t.material)?t.material.forEach(o=>o.dispose()):t.material?.dispose();this.compoundMeshes.length=0,this.debugMaterial?.dispose(),this.debugMaterial=void 0,this.group?.removeFromParent()}_collision(e,t,o={phase:"stay",nowMs:Ue()}){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}:${e.uuid}`,f=n.get(a);if(f!=null&&o.nowMs-f<r)continue;n.set(a,o.nowMs)}s.callback({entity:this,other:e,globals:t})}}hasMaterial(){return this.mesh!==void 0||this.compoundMeshes.length>0}getMaterials(){return this.materials?[...this.materials]:[]}setMaterial(e,t={}){if(!this.hasMaterial())return null;let o=new E,n=this.constructor.type??Symbol.for("zylem:entity");return o.build(e,n),this.replaceMaterials(o.materials,t)}replaceMaterials(e,t={}){if(!this.hasMaterial()||e.length===0)return null;let{disposePrevious:o=!0}=t,n=this.materials?[...this.materials]:[],s=r=>{Array.isArray(r.material)?r.material=r.material.map((a,f)=>e[f%e.length]):r.material=e[0]};this.mesh&&s(this.mesh);for(let r of this.compoundMeshes)s(r);if(this.materials=[...e],o)for(let r of n)e.includes(r)||r.dispose();return n}updateMaterials(e){if(this.materials?.length)for(let t of this.materials)t instanceof Ve&&t.uniforms&&t.uniforms.iTime&&(t.uniforms.iTime.value+=e.delta)}buildInfo(){let e={};return e.name=this.name,e.uuid=this.uuid,e}dispatch(e,t){this.eventDelegate.dispatch(e,t),V.emit(e,t)}listen(e,t){return this.eventDelegate.listen(e,t)}disposeEvents(){this.eventDelegate.dispose()}};function Ne(i){let e=new T;return e.options={...re,...i},_(e,t=>Ne(t??{}))}function pe(i){let e=i.clone(!0),t=[],o=[];i.traverse(n=>t.push(n)),e.traverse(n=>o.push(n));for(let n=0;n<t.length;n++){let s=t[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 e}function He(i,e){return e.size===0?i:((...t)=>{let o=Array.from(e.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(...t)}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 _(i,e){return i.finalizeCloneSupport(e),i}function ue(i){return typeof i?.load=="function"&&typeof i?.data=="function"}var R=class{entityReference;constructor(e){this.entityReference=e}load(){this.entityReference.load&&this.entityReference.load()}data(){return this.entityReference.data?this.entityReference.data():null}};function ei(i){let{args:e,defaultConfig:t,EntityClass:o,BuilderClass:n,entityType:s,MeshBuilderClass:r,CollisionBuilderClass:a,cloneFactory:f}=i,y=null,b,A=e.findIndex(u=>!(u instanceof p));A!==-1&&(b=e.splice(A,1).find(C=>!(C instanceof p)));let ye=b?d(t,b):d(t);e.push(ye);for(let u of e){if(u instanceof p)continue;let C=null,w=new o(u);try{if(ue(w)){let x=new R(w);x.load(),C=x.data()}}catch(x){console.error("Error creating entity with loader:",x)}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 I=y.build();return b!=null&&typeof b=="object"&&"position"in b&&(I._spawnPositionExplicit=!0),_(I,u=>f(u))}import{BufferGeometry as Ze,Mesh as de,Color as je}from"three";import{Mesh as Xe}from"three";var B=class{_build(e,t,o){let n=new Xe(t,o.at(-1));return n.position.set(0,0,0),n.castShadow=!0,n.receiveShadow=!0,n}_postBuild(){}};var fe=class extends j{},me=class extends B{build(e){return new Ze}postBuild(){}},he=class{meshBuilder;collisionBuilder;materialBuilder;options;entity;constructor(e,t,o,n){this.options=e,this.entity=t,this.meshBuilder=o,this.collisionBuilder=n,this.materialBuilder=new E;let s={meshBuilder:this.meshBuilder,collisionBuilder:this.collisionBuilder,materialBuilder:this.materialBuilder};this.options._builders=s,t&&t.options&&(t.options._builders=s)}withPosition(e){return this.options.position=e,this}withMaterial(e,t){return this.materialBuilder&&this.materialBuilder.build(e,t),this}applyMaterialToGroup(e,t){e.traverse(o=>{o instanceof de&&o.type==="SkinnedMesh"&&t[0]&&!o.material.map&&(o.material=t[0]),o.castShadow=!0,o.receiveShadow=!0})}build(){let e=this.entity;if(this.materialBuilder&&(e.materials=this.materialBuilder.materials),this.meshBuilder&&e.materials){let t=this.meshBuilder.build(this.options);e.mesh=this.meshBuilder._build(this.options,t,e.materials),this.meshBuilder.postBuild()}if(e.group&&e.materials&&this.applyMaterialToGroup(e.group,e.materials),this.collisionBuilder){this.collisionBuilder.withCollision(this.options?.collision||{});let[t,o]=this.collisionBuilder.build(this.options);e.bodyDesc=t,e.colliderDesc=o,e.colliderDescs.push(o);let{x:n,y:s,z:r}=c(this.options.position,m);e.bodyDesc.position=[n,s,r]}if(this.options.collisionType&&(e.collisionType=this.options.collisionType),this.options.color instanceof je){let t=o=>{let n=o;n&&n.color&&n.color.set&&n.color.set(this.options.color)};if(e.materials?.length)for(let o of e.materials)t(o);if(e.mesh&&e.mesh.material){let o=e.mesh.material;Array.isArray(o)?o.forEach(t):t(o)}e.group&&e.group.traverse(o=>{if(o instanceof de&&o.material){let n=o.material;Array.isArray(n)?n.forEach(t):t(n)}})}return e}};export{p as a,d as b,ve as c,xe as d,Ee as e,Oe as f,Pe as g,Re as h,Be as i,we as j,ie as k,P as l,yt as m,bt as n,Ct as o,se as p,gt as q,re as r,Bt as s,T as t,Ne as u,_ as v,fe as w,me as x,he as y,ei as z};
@@ -1 +0,0 @@
1
- import{a as f}from"./chunk-STVEILJJ.js";import{b as u,r as C,s as G,t as d,v as D,w as U,y as v,z as b}from"./chunk-KP6DLLJO.js";import{e as V}from"./chunk-6FGXC4T6.js";import{c as h,d as y,h as m,i as E,j as x}from"./chunk-7WRQ2UAN.js";import{Color as B,Group as st,Sprite as ot,SpriteMaterial as at,CanvasTexture as H,LinearFilter as w,Vector2 as pt,ClampToEdgeWrapping as W}from"three";var g={position:void 0,text:"",fontFamily:'Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',fontSize:18,fontColor:"#FFFFFF",backgroundColor:null,padding:4,stickToViewport:!0,screenPosition:new pt(24,24),zDistance:1},O=class extends v{createEntity(t){return new _(t)}},lt=Symbol("Text"),_=class i extends d{static type=lt;_sprite=null;_texture=null;_canvas=null;_ctx=null;_cameraRef=null;_lastCanvasW=0;_lastCanvasH=0;constructor(t){super(),this.options=u(g,t),this.options.screenPosition=E(this.options.screenPosition,g.screenPosition),this.prependSetup(this.textSetup.bind(this)),this.prependUpdate(this.textUpdate.bind(this)),this.onCleanup(this.textDestroy.bind(this))}create(){return this._sprite=null,this._texture=null,this._canvas=null,this._ctx=null,this._lastCanvasW=0,this._lastCanvasH=0,this.group=new st,this.createSprite(),super.create()}createSprite(){this._canvas=document.createElement("canvas"),this._ctx=this._canvas.getContext("2d"),this._texture=new H(this._canvas),this._texture.minFilter=w,this._texture.magFilter=w;let t=new at({map:this._texture,transparent:!0,depthTest:!1,depthWrite:!1,alphaTest:.5});this._sprite=new ot(t),this.group?.add(this._sprite),this.redrawText(this.options.text??"")}measureAndResizeCanvas(t,e,n,s){if(!this._canvas||!this._ctx)return{sizeChanged:!1};this._ctx.font=`${e}px ${n}`;let r=this._ctx.measureText(t),o=Math.ceil(r.width),a=Math.ceil(e*1.4),p=Math.max(2,o+s*2),l=Math.max(2,a+s*2),T=p!==this._lastCanvasW||l!==this._lastCanvasH;return this._canvas.width=p,this._canvas.height=l,this._lastCanvasW=p,this._lastCanvasH=l,{sizeChanged:T}}drawCenteredText(t,e,n){!this._canvas||!this._ctx||(this._ctx.font=`${e}px ${n}`,this._ctx.textAlign="center",this._ctx.textBaseline="middle",this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this.options.backgroundColor&&(this._ctx.fillStyle=this.toCssColor(this.options.backgroundColor),this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height)),this._ctx.fillStyle=this.toCssColor(this.options.fontColor??"#FFFFFF"),this._ctx.fillText(t,this._canvas.width/2,this._canvas.height/2))}updateTexture(t){!this._texture||!this._canvas||(t&&(this._texture.dispose(),this._texture=new H(this._canvas),this._texture.minFilter=w,this._texture.magFilter=w,this._texture.wrapS=W,this._texture.wrapT=W),this._texture.image=this._canvas,this._texture.needsUpdate=!0,this._sprite&&this._sprite.material&&(this._sprite.material.map=this._texture,this._sprite.material.needsUpdate=!0))}redrawText(t){if(!this._canvas||!this._ctx)return;let e=this.options.fontSize??18,n=this.options.fontFamily??g.fontFamily,s=this.options.padding??4,{sizeChanged:r}=this.measureAndResizeCanvas(t,e,n,s);this.drawCenteredText(t,e,n),this.updateTexture(!!r),this.options.stickToViewport&&this._cameraRef?this.updateStickyTransform():this.updateWorldSpriteScale()}toCssColor(t){return typeof t=="string"?t:`#${(t instanceof B?t:new B(t)).getHexString()}`}textSetup(t){this._cameraRef=t.camera,this.options.stickToViewport&&this._cameraRef&&(this._cameraRef.camera.add(this.group),this.updateStickyTransform())}textUpdate(t){this._sprite&&this.options.stickToViewport&&this._cameraRef&&this.updateStickyTransform()}getResolution(){return{width:this._cameraRef?.screenResolution.x??1,height:this._cameraRef?.screenResolution.y??1}}getScreenPixels(t,e,n){let s=t.x>=0&&t.x<=1,r=t.y>=0&&t.y<=1;return{px:s?t.x*e:t.x,py:r?t.y*n:t.y}}computeWorldExtents(t,e){let n=1,s=1;if(t.isPerspectiveCamera){let r=t,o=Math.tan(r.fov*Math.PI/180/2)*e;n=o*r.aspect,s=o}else if(t.isOrthographicCamera){let r=t;n=(r.right-r.left)/2,s=(r.top-r.bottom)/2}return{worldHalfW:n,worldHalfH:s}}updateSpriteScale(t,e){if(!this._canvas||!this._sprite)return;let s=t*2/e,r=this._canvas.height,o=Math.max(1e-4,r*s),a=this._canvas.width/this._canvas.height,p=o*a;this._sprite.scale.set(p,o,1)}updateWorldSpriteScale(){if(!this._canvas||!this._sprite)return;let t=this._canvas.width/Math.max(1,this._canvas.height),e=Math.max(1,this.options.fontSize??18),n=Math.max(.25,e/32),s=n*t;this._sprite.scale.set(s,n,1)}updateStickyTransform(){if(!this._sprite||!this._cameraRef)return;let t=this._cameraRef.camera,{width:e,height:n}=this.getResolution(),s=E(this.options.screenPosition,g.screenPosition),{px:r,py:o}=this.getScreenPixels(s,e,n),a=Math.max(.001,this.options.zDistance??1),{worldHalfW:p,worldHalfH:l}=this.computeWorldExtents(t,a),T=r/e*2-1,it=1-o/n*2,nt=T*p,rt=it*l;this.group?.position.set(nt,rt,-a),this.updateSpriteScale(l,n)}updateText(t){this.options.text=t,this.redrawText(t),this.options.stickToViewport&&this._cameraRef&&this.updateStickyTransform()}buildInfo(){return{...new f(this).buildDebugInfo(),type:String(i.type),text:this.options.text??"",sticky:this.options.stickToViewport}}textDestroy(){this._texture?.dispose(),this._sprite?.material&&this._sprite.material.dispose(),this._sprite&&this._sprite.removeFromParent(),this.group?.removeFromParent(),this._sprite=null,this._texture=null,this._canvas=null,this._ctx=null,this._cameraRef=null}};function F(...i){return b({args:i,defaultConfig:{...g},EntityClass:_,BuilderClass:O,entityType:_.type,cloneFactory:t=>F(t??{})})}import{Euler as ct,Group as X,Quaternion as ht,Vector3 as mt}from"three";import{TextureLoader as N,SpriteMaterial as Y,Sprite as $,SRGBColorSpace as j}from"three";import{ClampToEdgeWrapping as Q,LinearFilter as ut,NearestFilter as dt}from"three";var q={...C,size:new mt(1,1,1),images:[],animations:[]},L=class extends U{collider(t){let e=x(t.collisionSize,t.size??y);return{shape:{type:"box",halfExtents:[e.x/2,e.y/2,e.z/2]}}}},I=class extends v{createEntity(t){return new S(t)}},ft=Symbol("Sprite"),S=class i extends d{static type=ft;sprites=[];spriteMap=new Map;currentSpriteIndex=0;animations=new Map;currentAnimation=null;currentAnimationFrame="";currentAnimationIndex=0;currentAnimationTime=0;sheetTexture=null;flippedX=!1;constructor(t){super(),this.options=u(q,t),this.prependSetup(this.spriteSetup.bind(this)),this.prependUpdate(this.spriteUpdate.bind(this)),this.onCleanup(this.spriteDestroy.bind(this))}create(){return this.sprites=[],this.spriteMap.clear(),this.animations.clear(),this.currentAnimation=null,this.currentAnimationFrame="",this.currentAnimationIndex=0,this.currentAnimationTime=0,this.sheetTexture=null,this.group=void 0,this.options?.sheet?this.createSpriteFromSheet(this.options.sheet):this.createSpritesFromImages(this.options?.images||[]),this.createAnimations(this.options?.animations||[]),super.create()}createSpritesFromImages(t){let e=new N,n=x(this.options.size,y);t.forEach((s,r)=>{let o=e.load(s.file);o.colorSpace=j,o.anisotropy=V;let a=new Y({map:o,transparent:!0}),p=new $(a);p.position.normalize(),p.scale.set(n.x,n.y,n.z),p.visible=r===0,this.sprites.push(p),this.spriteMap.set(s.name,r)}),this.group=new X,this.group.add(...this.sprites)}createSpriteFromSheet(t){let e=x(this.options.size,y),n=new N().load(t.file);n.colorSpace=j,n.wrapS=Q,n.wrapT=Q;let s=t.filter==="linear"?ut:dt;n.magFilter=s,n.minFilter=s,n.generateMipmaps=!1,n.repeat.set(1/t.columns,1/t.rows);let r=new Y({map:n,transparent:!0}),o=new $(r);o.position.normalize(),o.scale.set(e.x,e.y,e.z),this.sheetTexture=n,this.sprites.push(o),t.frames.forEach((p,l)=>{p&&this.spriteMap.set(p,l)}),this.group=new X,this.group.add(o);let a=t.frames.find(p=>!!p);a&&this.setSprite(a)}createAnimations(t){t.forEach(e=>{let{name:n,frames:s,loop:r=!1,speed:o=1}=e,a={frames:s.map((p,l)=>({key:p,index:l,duration:typeof o=="number"?o:o[l]})),loop:r};this.animations.set(n,a)})}setSprite(t){let n=this.spriteMap.get(t)??0;if(this.currentSpriteIndex=n,this.sheetTexture){this.applySheetFrame(n);return}this.sprites.forEach((s,r)=>{s.visible=this.currentSpriteIndex===r})}setFlipX(t){if(this.flippedX!==t){if(this.flippedX=t,this.sheetTexture){this.applySheetFrame(this.currentSpriteIndex);return}this.sprites.forEach(e=>{e.material.map?.repeat.setX(t?-1:1),e.material.map?.offset.setX(t?1:0)})}}isFlippedX(){return this.flippedX}applySheetFrame(t){let e=this.options.sheet,n=this.sheetTexture;if(!e||!n)return;let s=t%e.columns,r=Math.floor(t/e.columns),o=1/e.columns,a=1/e.rows;n.repeat.x=this.flippedX?-o:o,n.offset.x=this.flippedX?(s+1)*o:s*o,n.offset.y=1-(r+1)*a}setAnimation(t,e){let n=this.animations.get(t);if(!n)return;let{loop:s,frames:r}=n;if(r.length!==0){for(t!==this.currentAnimation?(this.currentAnimation=t,this.currentAnimationIndex=0,this.currentAnimationTime=0):this.currentAnimationTime+=e;;){let o=r[this.currentAnimationIndex].duration;if(!(o>0)||this.currentAnimationTime<o)break;if(this.currentAnimationTime-=o,this.currentAnimationIndex+1<r.length)this.currentAnimationIndex++;else if(s)this.currentAnimationIndex=0;else{this.currentAnimationTime=0;break}}this.currentAnimationFrame=r[this.currentAnimationIndex].key,this.setSprite(this.currentAnimationFrame)}}getCurrentRotationQuaternion(){return this.transformStore?.dirty.rotation?this.transformStore.rotation:this.body?.rotation?.()??null}syncSpriteMaterials(){let t=this.getCurrentRotationQuaternion();this.sprites.forEach(e=>{if(e.material&&t){let s=new ht(t.x,t.y,t.z,t.w),r=new ct().setFromQuaternion(s,"XYZ");e.material.rotation=r.z}let n=x(this.options.size,y);e.scale.set(n.x,n.y,n.z)})}spriteSetup(t){this.syncSpriteMaterials()}spriteUpdate(t){this.syncSpriteMaterials()}spriteDestroy(t){this.sprites.forEach(e=>{e.removeFromParent()}),this.group?.remove(...this.sprites),this.group?.removeFromParent(),this.sheetTexture?.dispose(),this.sheetTexture=null}buildInfo(){return{...new f(this).buildDebugInfo(),type:String(i.type)}}};function z(...i){return b({args:i,defaultConfig:q,EntityClass:S,BuilderClass:I,CollisionBuilderClass:L,entityType:S.type,cloneFactory:t=>z(t??{})})}import{Color as tt,Group as xt}from"three";import{Line2NodeMaterial as gt}from"three/webgpu";import{Line2 as _t}from"three/addons/lines/webgpu/Line2.js";import{Color as J}from"three";import{LineGeometry as yt}from"three/addons/lines/LineGeometry.js";function R(i){let t=[];for(let e of i){let{x:n,y:s,z:r}=m(e,h);t.push(n,s,r)}return t}function P(i,t,e){if(!i||i.length===0)return;let n=[],s=new J(e);for(let r=0;r<t;r++){let o=i[r]??i[i.length-1]??e,a=new J(o??s);n.push(a.r,a.g,a.b)}return n}function K(i){let t=new yt,e=R(i.points);t.setPositions(e);let n=P(i.colors,i.points.length,"#ffffff");return n&&t.setColors(n),t}var c={...C,points:[{x:0,y:0,z:0},{x:1,y:0,z:0}],linewidth:1,worldUnits:!0,alphaToCoverage:!1,opacity:1,transparent:!1,dashed:!1,dashSize:1,gapSize:1,pickThreshold:0},St=Symbol("Line");function Z(i,t){if(!i||i.length<2)throw new Error(`${t}: at least two points are required`);return i}function et(i){return i instanceof tt?i.clone():new tt(i??"#ffffff")}function Ct(i){let t=!!i.colors?.length,e=new gt({color:et(i.color).getHex(),linewidth:i.linewidth??c.linewidth,worldUnits:i.worldUnits??c.worldUnits,vertexColors:t,dashed:i.dashed??!1,dashSize:i.dashSize??c.dashSize,gapSize:i.gapSize??c.gapSize,transparent:i.transparent??!1,opacity:i.opacity??1});return e.alphaToCoverage=i.alphaToCoverage??!1,e}function vt(i){return!i.point||!i.pointOnLine||i.faceIndex==null?null:{point:i.point.clone(),pointOnLine:i.pointOnLine.clone(),faceIndex:i.faceIndex,distance:i.distance}}function bt(i,t,e={}){let n=t.getLineObject();if(!n)return null;let s=e.threshold??t.options.pickThreshold??0,r=i.params.Line2??{threshold:0};r.threshold=s,i.params.Line2=r;let a=i.intersectObject(n,!1)[0];return a?vt(a):null}var A=class i extends d{static type=St;_line=null;_geometry=null;_material=null;constructor(t){super();let e=u(c,t);e.points=Z(e.points,"ZylemLine").map(n=>m(n,h)),this.options=e}create(){return this.disposeLineResources(),this.group=new xt,this.rebuildLine(),this.applyGroupPosition(),super.create()}setPoints(t,e){if(Z(t,"setPoints"),this.options.points=t.map(s=>m(s,h)),e&&(this.options.colors=e),!this._line||!this._geometry||!this._material)return this;this._geometry.setPositions(R(this.options.points));let n=P(this.options.colors,this.options.points.length,et(this.options.color));return n&&this._geometry.setColors(n),this._material.vertexColors=!!this.options.colors?.length,this.options.dashed&&this._line.computeLineDistances(),this._geometry.computeBoundingBox(),this._geometry.computeBoundingSphere(),this}getLineObject(){return this._line}pickFromRaycaster(t,e={}){return bt(t,this,e)}buildInfo(){return{...new f(this).buildDebugInfo(),type:String(i.type),points:this.options.points.length,linewidth:this.options.linewidth??c.linewidth,worldUnits:this.options.worldUnits??c.worldUnits}}rebuildLine(){this._geometry=K({points:this.options.points,colors:this.options.colors}),this._material=Ct(this.options),this._line=new _t(this._geometry,this._material),this.options.dashed&&this._line.computeLineDistances(),this.group?.add(this._line)}applyGroupPosition(){if(!this.group)return;let t=m(this.options.position,h);this.group.position.set(t.x,t.y,t.z)}_cleanup(t){this.disposeLineResources(),super._cleanup(t)}disposeLineResources(){this._line?.removeFromParent(),this._geometry?.dispose(),this._material?.dispose(),this._line=null,this._geometry=null,this._material=null}};function M(...i){let t=G(i,c);Z(t.points,"createLine");let e=new A(t);return D(e,n=>M(n??{}))}var k={registry:new Map,register(i,t){this.registry.set(i,t)},createFromBlueprint(i){let t=this.registry.get(i.type);if(!t)throw new Error(`Unknown entity type: ${i.type}`);let e={...i.data,position:i.position?{x:i.position[0],y:i.position[1],z:0}:void 0,name:i.id};return t(e)}};k.register("text",i=>F(i));k.register("sprite",i=>z(i));k.register("line",i=>M(i));function ge(i){return{template:i,generate(t){let e=[];for(let n=0;n<t;n++)e.push(i.clone());return e}}}export{lt as a,_ as b,F as c,ft as d,S as e,z as f,St as g,bt as h,A as i,M as j,k,ge as l};
@@ -1 +0,0 @@
1
- import{b as jt,c as gi,f as yi}from"./chunk-47HAZZWF.js";import{c as he,j as fe}from"./chunk-2HSR5XDQ.js";import{a as Kt,b as D,c as pe,d as Qt,f as ct,m as Jt,o as j}from"./chunk-3CLQWJ2I.js";import{a as Yt,c as at,d as lt,e as $t,f as ue,g as Xt}from"./chunk-BQRMYLYD.js";import{A as de,b as nt,d as p,e as Gt,i as le,k as ce,o as ot,q as Zt,s as Nt,t as Ht,u as V,y as Ut,z as st}from"./chunk-GPCSX3M6.js";import{a as ye,b as ci}from"./chunk-WBQ5TNRZ.js";import{b as ge,d as di}from"./chunk-YQS7CGXE.js";import{a as W,k as ri,l as ni,m as oi,n as si,o as F,p as ai,q,t as li,u as pt}from"./chunk-KP6DLLJO.js";import{a as dt,b as ti,g as I,h as me,i as ii}from"./chunk-6FGXC4T6.js";import{a as qt,b as T}from"./chunk-AIQ6IVT5.js";import{g as K}from"./chunk-UUOPT2N4.js";import{a as ve,b as pi,c as be,d as ui,e as hi,f as mi,g as fi,m as G}from"./chunk-D2PATZCC.js";import{c as ae,d as rt,j as v}from"./chunk-4QLJUQSJ.js";import{c as P,i as ei,j as h}from"./chunk-7WRQ2UAN.js";import{a as vi}from"./chunk-BH53MBAZ.js";import{l as Wt}from"./chunk-UG22Z42P.js";import{Vector2 as wi,RenderTarget as Dr,HalfFloatType as Lr}from"three";import{WebGPURenderer as Ar,RenderPipeline as Or}from"three/webgpu";import{pass as Br,renderOutput as Ei,screenCoordinate as zr,vec2 as ut,vec4 as Ri,fract as xi,sin as Mi,dot as Ti,texture as Vr,uniform as Ir}from"three/tsl";import{setConsoleFunction as kr,getConsoleFunction as _r}from"three";var bi="THREE.Abstract function.",Ci=!1,Si=!1;function Pi(){if(Ci)return;Ci=!0;let o=_r();kr((e,t,...i)=>{if(e==="warn"&&t===bi){Si||(Si=!0,console.warn(`${bi} (suppressing further per-frame repeats; a WebGPU node is scheduled for updates without an update() implementation)`));return}if(o){o(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 ki={x:0,y:0,width:1,height:1},Fr=1/20;async function Zo(){if(!("gpu"in navigator))return!1;try{return await navigator.gpu.requestAdapter()!==null}catch{return!1}}var Ce=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 wi(window.innerWidth,window.innerHeight)}get initialized(){return this._initialized}get isWebGPU(){return!0}async initRenderer(){this._initialized||(Pi(),this.renderer=new Ar({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 Or(this.renderer),r=Br(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=Ei(n),a=this._transition;if(a)try{s=Ri(a.resolved.shader({fromNode:a.fromNode,toNode:s,progress:a.progressUniform})),a.composed=!0}catch(l){console.error("RendererManager: stage transition shader failed, skipping.",l)}i.outputNode=s.add(Zr()),this.postProcessing=i}rebindPostProcessingCamera(e){!this.postProcessing||!this._postSceneRef||this.setupPostProcessing(this._postSceneRef,e)}get transitionActive(){return this._transition!==null}beginSnapshotTransition(e,t,i){this.finishTransition();let r=new wi;this.renderer.getDrawingBufferSize(r);let n=new Dr(Math.max(1,r.x),Math.max(1,r.y),{type:Lr}),s=this.renderer.getRenderTarget();try{this.renderer.setScissorTest(!1),this.renderer.setRenderTarget(n),this.renderer.render(t,i)}catch(a){console.error("RendererManager: failed to capture transition snapshot.",a)}finally{this.renderer.setRenderTarget(s)}this._transition={resolved:e,progressUniform:Ir(0),fromNode:Ei(Vr(n.texture)),elapsed:0,snapshotTarget:n,composed:!1}}beginInStageTransition(e,t,i){this._initialized&&(this.beginSnapshotTransition(e,t,i),this.setupPostProcessing(t,i))}finishTransition(){let e=this._transition;if(e){this._transition=null,e.progressUniform.value=1,this._postSceneRef&&this._postCameraRef&&this.setupPostProcessing(this._postSceneRef,this._postCameraRef);try{e.resolved.onComplete?.()}catch(t){console.error("RendererManager: transition onComplete failed.",t)}this.releaseTransitionResources(e)}}cancelTransition(){let e=this._transition;if(e){this._transition=null;try{e.resolved.onComplete?.()}catch{}this.releaseTransitionResources(e)}}releaseTransitionResources(e){try{e.snapshotTarget?.dispose()}catch{}}advanceTransition(e){let t=this._transition;if(!t||!t.composed)return;t.elapsed+=Math.min(e,Fr);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,a=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(a,l,c,d),this.renderer.setScissor(a,l,c,d),this.renderer.setScissorTest(!0),i&&this.postProcessing?this.postProcessing.render():this.renderer.render(e,t.camera)}renderCameraToTarget(e,t){if(!t.renderTarget)return;let i=this.renderer.getRenderTarget();this.renderer.setScissorTest(!1),this.renderer.setRenderTarget(t.renderTarget),this.renderer.clear(),this.renderer.render(e,t.camera),this.renderer.setRenderTarget(i)}renderCameras(e,t){if(!e||t.length===0)return;this.renderer.setScissorTest(!1),this.renderer.clear();let i=t.length===1&&Gr(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 Gr(o){return o.x===0&&o.y===0&&o.width===1&&o.height===1}function Zr(){let o=zr.xy,e=xi(Mi(Ti(o,ut(12.9898,78.233))).mul(43758.5453)),t=xi(Mi(Ti(o.add(ut(13,7)),ut(12.9898,78.233))).mul(43758.5453)),i=e.sub(t).mul(1/255);return Ri(i,i,i,0)}function Q(o){return o?.category??"none"}function Y(o){let e=Q(o);return e==="environment"||e==="pack"}function L(o){return o.isInstanced===!0||o.isBundled===!0}import{BundleGroup as Nr}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 Nr,t.name=`bundle:${e}`,t.static=!0,this.bundles.set(e,t),this.scene&&this.scene.add(t),t)}};import{InstancedMesh as _i,Matrix4 as $,Vector3 as Di,Quaternion as Hr}from"three";var X=class o{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}:${dt(e.dimensions)}`,mat:e.materialPath||"none",shader:e.shaderType||"standard",color:e.colorHex??16777215};return ti(dt(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 o.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 a=i.activeIndices.pop();n<i.activeIndices.length&&(i.activeIndices[n]=a)}i.dirtyIndices.delete(r);let s=new $;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 $,i=new Di,r=new Hr,n=new Di(1,1,1);for(let s of this.packs.values()){if(s.activeIndices.length===0)continue;let a=!1;for(let l of s.activeIndices){let c=s.entities[l];if(!c)continue;if(ri(c)){t.makeScale(0,0,0),s.instancedMesh.setMatrixAt(l,t),a=!0;continue}let d=s.dirtyIndices.has(l),u=!!c.body;if(!(!d&&!u)){if(!d&&u){let f=c.body;if(typeof f.isRenderSleeping=="function"&&f.isRenderSleeping())continue}this.updateInstanceMatrix(s,l,t,i,r,n,e),a=!0}}s.dirtyIndices.clear(),a&&(s.instancedMesh.instanceMatrix.needsUpdate=!0)}}updateInstanceMatrix(e,t,i,r,n,s,a){let l=e.entities[t];if(l){if(l.body){let c=l.body;if(typeof c.writeRenderPose=="function")c.writeRenderPose(a,r,n);else{let d=ye(l.body,a);r.set(d.position.x,d.position.y,d.position.z),n.set(d.rotation.x,d.rotation.y,d.rotation.z,d.rotation.w)}i.compose(r,n,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=o.DEFAULT_CAPACITY,n=new _i(t,i,r);n.count=0,n.frustumCulled=!1;let s=new $().makeScale(0,0,0);for(let l=0;l<r;l++)n.setMatrixAt(l,s);n.instanceMatrix.needsUpdate=!0;let a={key:e,instancedMesh:n,geometry:t,material:i,entityMap:new Map,entities:[],freeIndices:[],activeIndices:[],dirtyIndices:new Set,capacity:r};return this.packs.set(e,a),this.scene&&this.scene.add(n),a}growPack(e){let t=e.capacity*o.GROWTH_FACTOR,i=new _i(e.geometry,e.material,t);i.count=e.instancedMesh.count,i.frustumCulled=!1;let r=new $;for(let s=0;s<e.capacity;s++)e.instancedMesh.getMatrixAt(s,r),i.setMatrixAt(s,r);let n=new $().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 Pe=class{bundles=new Se;instances=new X;setScene(e){this.bundles.setScene(e),this.instances.setScene(e)}register(e){let t=Q(e.options);if(t==="none")return!1;if(e.isInstanced||e.isBundled)return!0;if(!e.mesh?.geometry||!e.materials?.length)return!1;let i=e.mesh.geometry,r=e.materials[0],n=X.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 we=!1,w={},Li=0,Ai=0,J=null;function Oi(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function ht(){return we?!0:(typeof globalThis<"u"&&globalThis.__ZYLEM_PROFILE_STAGE__===!0&&(we=!0),we)}function ns(o){we=o,typeof globalThis<"u"&&(globalThis.__ZYLEM_PROFILE_STAGE__=o)}function mt(o){ht()&&(J=o,Ai=Oi())}function ft(){if(!ht()||J===null)return;let o=Oi()-Ai;w[J]=(w[J]??0)+o,J=null}function Bi(){if(!ht()||(Li++,Li%60!==0))return;let o=Object.values(w).reduce((t,i)=>t+(i??0),0),e=Object.keys(w).sort((t,i)=>(w[i]??0)-(w[t]??0)).map(t=>{let i=w[t]??0,r=o>0?(i/o*100).toFixed(1):"0.0";return`${t}=${i.toFixed(2)}ms (${r}%)`});console.info(`[ZylemStage profile] avg over 60 frames (${o.toFixed(2)}ms/frame): ${e.join(", ")}`);for(let t of Object.keys(w))w[t]=0}function E(o,e){mt(o);try{return e()}finally{ft()}}var m={FirstPerson:"first-person",ThirdPerson:"third-person",SecondPerson:"second-person",Isometric:"isometric",Flat2D:"flat-2d",Fixed2D:"fixed-2d",TopDown:"top-down"};function gt(o){switch(o){case m.Isometric:case m.TopDown:case m.Flat2D:case m.Fixed2D:return"orthographic";default:return"perspective"}}import{Vector3 as Ur,Quaternion as jr,MathUtils as yt}from"three";function Ee(){return{position:new Ur(0,0,10),rotation:new jr,fov:75,zoom:1,near:.1,far:1e3}}function A(o){return{position:o.position.clone(),rotation:o.rotation.clone(),fov:o.fov,zoom:o.zoom,near:o.near,far:o.far,lookAt:o.lookAt?.clone()}}function zi(o,e){let t=A(o);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 Vi(o,e,t,i){let r=1-Math.pow(1-yt.clamp(t,0,1),i*60),n=A(o);return n.position.lerp(e.position,r),n.rotation.slerp(e.rotation,r),e.fov!=null&&n.fov!=null&&(n.fov=yt.lerp(n.fov,e.fov,r)),e.zoom!=null&&n.zoom!=null&&(n.zoom=yt.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 xe=class{perspective=null;behaviors=new Map;actions=[];_desiredPose=Ee();_finalPose=Ee();_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):Ee(),i=this.getSortedBehaviors();for(let r of i)r.enabled!==!1&&(t=r.update(e,t));this._desiredPose=A(t);for(let r=this.actions.length-1;r>=0;r--){let n=this.actions[r],s=n.update(e);t=zi(t,s),n.isDone(e)&&this.actions.splice(r,1)}return this._initialized?this._finalPose=Vi(this._finalPose,t,this.damping,e.dt):(this._finalPose=A(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?A(this._desiredPose):null,finalPose:this._finalPose?A(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 R,Quaternion as Me}from"three";var Wr={distance:8,height:5,shoulderOffset:0,targetKey:"primary",fov:75,paddingFactor:1.5,minDistance:5,trailDelay:.1,trailBufferSize:120},Z=class{id="third-person";projection="perspective";defaults={damping:.12};opts;initialPosition;initialLookAt;_trailBuffers=new Map;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...Wr,...r},this.initialPosition=t?h(t,P):void 0,this.initialLookAt=i?h(i,P):void 0}getBasePose(e){let t=Object.keys(e.targets),i=e.targets[this.opts.targetKey];return t.length===0||!i?this.staticPose():t.length===1?this.singleTargetPose(i.position,e,this.opts.targetKey):this.multiTargetPose(e)}staticPose(){return this.initialPosition?{position:this.initialPosition.clone(),rotation:new Me,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:this.initialLookAt?.clone()??new R(0,0,0)}:{position:new R(this.opts.shoulderOffset,this.opts.height,this.opts.distance),rotation:new Me,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:new R(0,0,0)}}singleTargetPose(e,t,i){let r=this.getTrailedPosition(i,e,t.time);return{position:new R(r.x+this.opts.shoulderOffset,r.y+this.opts.height,r.z+this.opts.distance),rotation:new Me,fov:this.opts.fov,zoom:1,near:.1,far:1e3,lookAt:r.clone()}}multiTargetPose(e){let i=Object.entries(e.targets).map(([u,f])=>this.getTrailedPosition(u,f.position,e.time)),r=new R;for(let u of i)r.add(u);r.divideScalar(i.length);let n=0;for(let u of i){let f=r.distanceTo(u);f>n&&(n=f)}let s=Math.max(n*this.opts.paddingFactor,this.opts.minDistance),a=new R(this.opts.shoulderOffset,this.opts.height,this.opts.distance),l=a.length(),c=l>0?a.clone().normalize():new R(0,.5,1).normalize(),d=r.clone().add(c.multiplyScalar(s));if(l>0){let u=this.opts.height/l;d.y=r.y+s*u}return{position:d,rotation:new Me,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 a=i-r;if(n[0].time>=a)return n[0].pos.clone();for(let l=1;l<n.length;l++){let c=n[l-1],d=n[l];if(c.time<=a&&a<=d.time){let u=d.time-c.time,f=u>1e-6?(a-c.time)/u:0;return new R().lerpVectors(c.pos,d.pos,f)}}return n[n.length-1].pos.clone()}};import{Vector3 as Ii,Quaternion as qr}from"three";var Fi={position:{x:0,y:0,z:10},zoom:10},N=class{id="fixed-2d";projection="orthographic";defaults={damping:1};opts;constructor(e){this.opts={...Fi,...e,position:h(e?.position,Fi.position)}}getBasePose(e){return{position:new Ii(this.opts.position.x,this.opts.position.y,this.opts.position.z),rotation:new qr,zoom:this.opts.zoom,near:1,far:1e3,lookAt:new Ii(this.opts.position.x,this.opts.position.y,0)}}};import{Vector3 as vt,Quaternion as bt,Euler as Ni,MathUtils as b}from"three";var Kr={eyeHeight:1.7,defaultFov:75,pitchLimit:Math.PI/2-.01,lookAtLerpSpeed:5,fovLerpSpeed:8,targetKey:"primary",verticalSmoothing:1},ee=class{id="first-person";projection="perspective";defaults={damping:1};opts;initialPosition;initialLookAt;_yaw=0;_pitch=0;_currentFov;_targetFov;_lookAtTarget=null;_lookAtLerpSpeed;_currentRotation=new bt;_rotationInitialized=!1;_smoothedY=null;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...Kr,...r},this.initialPosition=t?h(t,P):void 0,this.initialLookAt=i?h(i,P):void 0,this._currentFov=this.opts.defaultFov,this._targetFov=this.opts.defaultFov,this._lookAtLerpSpeed=this.opts.lookAtLerpSpeed,this.initialPosition&&this.initialLookAt&&this.deriveYawPitchFromLookAt(this.initialPosition,this.initialLookAt)}look(e,t){this._yaw+=e,this._pitch=b.clamp(this._pitch+t,-this.opts.pitchLimit,this.opts.pitchLimit)}setLook(e,t){this._yaw=e,this._pitch=b.clamp(t,-this.opts.pitchLimit,this.opts.pitchLimit)}setEyeHeight(e){this.opts.eyeHeight=e}get yaw(){return this._yaw}get pitch(){return this._pitch}zoom(e){this._targetFov=e}resetZoom(){this._targetFov=this.opts.defaultFov}get currentFov(){return this._currentFov}lookAt(e,t){this._lookAtTarget=e,t!=null&&(this._lookAtLerpSpeed=t)}clearLookAt(){this._lookAtTarget&&this.deriveYawPitchFromQuaternion(this._currentRotation),this._lookAtTarget=null}getBasePose(e){let t=this.computePosition(e),i=this.computeRotation(t,e.dt);return this._currentFov=this.lerpFov(e.dt),{position:t,rotation:i,fov:this._currentFov,near:.1,far:1e3}}computePosition(e){let t=e.targets[this.opts.targetKey];if(t){let i=t.position.y+this.opts.eyeHeight,r=this.smoothVertical(i,e.dt);return new vt(t.position.x,r,t.position.z)}return this.initialPosition?this.initialPosition.clone():new vt(0,this.opts.eyeHeight,0)}smoothVertical(e,t){if(this.opts.verticalSmoothing>=1)return this._smoothedY=e,e;if(this._smoothedY==null)return this._smoothedY=e,e;let i=b.clamp(this.opts.verticalSmoothing,0,1),r=1-Math.pow(1-i,t*60);return this._smoothedY=b.lerp(this._smoothedY,e,r),this._smoothedY}computeRotation(e,t){let i=new bt().setFromEuler(new Ni(this._pitch,this._yaw,0,"YXZ"));if(this._rotationInitialized||(this._currentRotation.copy(i),this._rotationInitialized=!0),this._lookAtTarget){let r=Gi.copy(this._lookAtTarget).sub(e);if(r.lengthSq()>1e-4){r.normalize();let n=Math.atan2(-r.x,-r.z),s=Math.asin(b.clamp(r.y,-1,1)),a=Qr.setFromEuler(Zi.set(s,n,0,"YXZ")),l=1-Math.pow(1-Math.min(this._lookAtLerpSpeed*t,1),1);return this._currentRotation.slerp(a,b.clamp(l,0,1)),this._currentRotation.clone()}}return this._currentRotation.copy(i),i}lerpFov(e){if(Math.abs(this._currentFov-this._targetFov)<.01)return this._targetFov;let t=1-Math.pow(1-Math.min(this.opts.fovLerpSpeed*e,1),1);return b.lerp(this._currentFov,this._targetFov,b.clamp(t,0,1))}deriveYawPitchFromLookAt(e,t){let i=Gi.copy(t).sub(e).normalize();this._yaw=Math.atan2(-i.x,-i.z),this._pitch=Math.asin(b.clamp(i.y,-1,1))}deriveYawPitchFromQuaternion(e){let t=Zi.setFromQuaternion(e,"YXZ");this._yaw=t.y,this._pitch=b.clamp(t.x,-this.opts.pitchLimit,this.opts.pitchLimit)}},Gi=new vt,Qr=new bt,Zi=new Ni;import{Quaternion as Yr,Vector3 as Ct}from"three";var $r={distance:10,zoom:10,targetKey:"primary"},Hi=new Ct(1,1,1).normalize(),te=class{id="isometric";projection="orthographic";defaults={damping:1};opts;initialPosition;initialLookAt;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...$r,...r},this.initialPosition=t?h(t):void 0,this.initialLookAt=i?h(i):void 0}getBasePose(e){let t=e.targets[this.opts.targetKey];if(!t)return this.staticPose();let i=t.position.clone(),r=i.clone().addScaledVector(Hi,this.opts.distance);return this.pose(r,i)}staticPose(){return this.initialPosition?this.pose(this.initialPosition.clone(),this.initialLookAt?.clone()??new Ct(0,0,0)):this.pose(Hi.clone().multiplyScalar(this.opts.distance),new Ct(0,0,0))}pose(e,t){return{position:e,rotation:new Yr,zoom:this.opts.zoom,near:1,far:1e3,lookAt:t}}};import{Quaternion as Xr,Vector3 as Te}from"three";var Jr={height:10,zoom:10,targetKey:"primary"},ie=class{id="top-down";projection="orthographic";defaults={damping:1};opts;initialPosition;initialLookAt;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...Jr,...r},this.initialPosition=t?h(t):void 0,this.initialLookAt=i?h(i):void 0}getBasePose(e){let t=e.targets[this.opts.targetKey];if(!t)return this.staticPose();let i=t.position.clone();return this.pose(new Te(i.x,i.y+this.opts.height,i.z),i)}staticPose(){if(this.initialPosition){let e=this.initialLookAt?.clone()??new Te(this.initialPosition.x,this.initialPosition.y-this.opts.height,this.initialPosition.z);return this.pose(this.initialPosition.clone(),e)}return this.pose(new Te(0,this.opts.height,0),new Te(0,0,0))}pose(e,t){return{position:e,rotation:new Xr,zoom:this.opts.zoom,near:1,far:1e3,lookAt:t}}};import{Quaternion as Ui,Vector3 as Re}from"three";var en={anchorKey:"anchor",subjectKey:"primary",eyeHeight:1.7,fov:75},St=new Re,re=class{id="second-person";projection="perspective";defaults={damping:1};opts;initialPosition;initialLookAt;constructor(e){let{initialPosition:t,initialLookAt:i,...r}=e??{};this.opts={...en,...r},this.initialPosition=t?h(t):void 0,this.initialLookAt=i?h(i):void 0}getBasePose(e){let t=e.targets[this.opts.anchorKey];if(!t)return this.staticPose();let i=new Re(t.position.x,t.position.y+this.opts.eyeHeight,t.position.z),r=e.targets[this.opts.subjectKey],n=r?r.position.clone():i.clone().add(this.anchorForward(t.rotation));return{position:i,rotation:new Ui,fov:this.opts.fov,near:.1,far:1e3,lookAt:n}}staticPose(){let e=this.initialPosition?.clone()??new Re(0,this.opts.eyeHeight,0),t=this.initialLookAt?.clone()??e.clone().add(new Re(0,0,-1));return{position:e,rotation:new Ui,fov:this.opts.fov,near:.1,far:1e3,lookAt:t}}anchorForward(e){return St.set(0,0,-1),e&&St.applyQuaternion(e),St.clone()}};function O(o,e){switch(o){case"third-person":return new Z(e);case"first-person":return new ee(e);case"second-person":return new re(e);case"isometric":return new te(e);case"top-down":return new ie(e);case"flat-2d":return new N(e);case"fixed-2d":return new N(e);default:return new Z(e)}}import{Vector2 as on,Vector3 as M,OrthographicCamera as sn,PerspectiveCamera as an}from"three";import{PerspectiveCamera as Pt,Vector3 as rn,OrthographicCamera as De,RenderTarget as nn,LinearFilter as ji}from"three";import{Vector3 as ke}from"three";import{OrbitControls as tn}from"three/addons/controls/OrbitControls.js";var _e=class{camera;domElement;cameraRig=null;sceneRef=null;orbitControls=null;orbitTarget=null;orbitTargetWorldPos=new ke;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;_rotationLocked=!1;_screenSpacePanning=!1;_seededLookAt=null;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._seededLookAt=t.clone(),this.camera.position.copy(e),this.camera.lookAt(t),this.orbitControls&&(this.orbitControls.target.copy(t),this.orbitControls.update(),this._rotationLocked&&this.applyRotationLock()),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()}setRotationLocked(e){this._rotationLocked=e,e?this.applyRotationLock():this.releaseRotationLock()}setScreenSpacePanning(e){this._screenSpacePanning=e,this.orbitControls&&(this.orbitControls.screenSpacePanning=e)}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 ke().subVectors(this.camera.position,this.orbitControls.target).normalize();t.lengthSq()<1e-8&&t.set(1,1,1).normalize();let i=jt(e,this.camera,t);this.orbitControls.target.copy(i.center),this.orbitControls.update()}applyDebugState(e){let t=this.debugStateSnapshot.enabled;if(this.debugStateSnapshot={enabled:e.enabled,selected:[...e.selected]},this._isDebugViewCamera){e.enabled&&!t?(this.enableOrbitControls(),this._debugPoseSeeded&&this.restoreDebugCameraState(),this.updateOrbitTargetFromSelection(e.selected),this._rotationLocked&&this.applyRotationLock()):!e.enabled&&t?(this.saveDebugCameraState(),this._userOrbitEnabled||this.disableOrbitControls()):e.enabled&&this.updateOrbitTargetFromSelection(e.selected);return}e.enabled&&!t?(this.saveCameraState(),this.detachCameraFromRig(),this.enableOrbitControls(),this.restoreDebugCameraState(),this.updateOrbitTargetFromSelection(e.selected),this._rotationLocked&&this.applyRotationLock()):!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 tn(this.camera,this.domElement),this.orbitControls.enableDamping=!0,this.orbitControls.dampingFactor=.05,this.orbitControls.screenSpacePanning=this._screenSpacePanning,this.orbitControls.minDistance=1,this.orbitControls.maxDistance=500,this.orbitControls.maxPolarAngle=Math.PI/2,this.orbitControls.enabled=this._interactionEnabled,this.orbitControls.target.copy(this._seededLookAt??new ke),this._rotationLocked&&this.applyRotationLock())}applyRotationLock(){let e=this.orbitControls;if(!e)return;e.update();let t=e.getPolarAngle(),i=e.getAzimuthalAngle();e.minPolarAngle=t,e.maxPolarAngle=t,e.minAzimuthAngle=i,e.maxAzimuthAngle=i,e.enableRotate=!1,e.update()}releaseRotationLock(){let e=this.orbitControls;e&&(e.minPolarAngle=0,e.maxPolarAngle=Math.PI/2,e.minAzimuthAngle=-1/0,e.maxAzimuthAngle=1/0,e.enableRotate=!0,e.update())}rebindCamera(e){this.camera=e,this.orbitControls&&(this.orbitControls.object=e,this._rotationLocked&&this.applyRotationLock())}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 ke;this.camera.getWorldPosition(e),this.cameraRig.remove(this.camera),this.sceneRef&&this.sceneRef.add(this.camera),this.camera.position.copy(e)}reattachCameraToRig(){!this.cameraRig||this.camera.parent===this.cameraRig||(this.sceneRef&&this.camera.parent===this.sceneRef&&this.sceneRef.remove(this.camera),this.cameraRig.add(this.camera),this.savedCameraLocalPosition&&(this.camera.position.copy(this.savedCameraLocalPosition),this.savedCameraLocalPosition=null))}};var x=class{cameraRig=null;camera;screenResolution;_perspective;frustumSize=10;sceneRef=null;name="";viewport={...ki};targets=[];pipeline;renderTarget=null;get target(){return this.targets.length>0?this.targets[0]:null}set target(e){e?this.targets.length===0?this.targets.push(e):this.targets[0]=e:this.targets=[]}orbitController=null;_useOrbitalControls=!1;_skipDebugOrbit=!1;isDebugViewCamera=!1;_rendererManager=null;_elapsedTime=0;constructor(e,t,i=10){this._perspective=e,this.screenResolution=t,this.frustumSize=i;let r=t.x/t.y;this.camera=this.createCameraForPerspective(r),this.camera.position.set(0,0,10),this.camera.lookAt(new rn(0,0,0));let n=O(e);this.pipeline=new xe(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 _e(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 Ce(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()}armEditorOrbit(e,t=!1){this._skipDebugOrbit=!0,this.orbitController?.setScreenSpacePanning(t),this.orbitController?.setRotationLocked(e),this.enableOrbitalControls(),this.setOrbitInteractionEnabled(!0)}disarmEditorOrbit(){this.setOrbitInteractionEnabled(!1)}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 Pt&&(this.camera.aspect=e/t,this.camera.updateProjectionMatrix()),this.camera instanceof De){let i=e/t;this.camera.left=this.frustumSize*i/-2,this.camera.right=this.frustumSize*i/2,this.camera.top=this.frustumSize/2,this.camera.bottom=this.frustumSize/-2,this.camera.updateProjectionMatrix()}}createRenderTarget(e=512,t=512){return this.renderTarget&&this.renderTarget.dispose(),this.renderTarget=new nn(e,t,{minFilter:ji,magFilter:ji}),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){let t=e.lookAt.x-e.position.x,i=e.lookAt.y-e.position.y,r=e.lookAt.z-e.position.z,n=Math.hypot(t,i,r);n>1e-8&&Math.abs(i)/n>.999?this.camera.up.set(0,0,-1):this.camera.up.set(0,1,0),this.camera.lookAt(e.lookAt)}else this.camera.quaternion.copy(e.rotation);if(this.camera instanceof Pt&&(e.fov!=null&&(this.camera.fov=e.fov),e.near!=null&&(this.camera.near=e.near),e.far!=null&&(this.camera.far=e.far),this.camera.updateProjectionMatrix()),this.camera instanceof De){if(e.zoom!=null){let t=this.screenResolution.x/this.screenResolution.y,i=e.zoom;this.camera.left=-i*t/2,this.camera.right=i*t/2,this.camera.top=i/2,this.camera.bottom=-i/2}e.near!=null&&(this.camera.near=e.near),e.far!=null&&(this.camera.far=e.far),this.camera.updateProjectionMatrix()}}applyPerspective(e,t){this._perspective=e,this.pipeline.setPerspective(t),this.ensureProjection(t.projection??gt(e))}ensureProjection(e){if((this.camera instanceof De?"orthographic":"perspective")===e)return;let i=this.screenResolution.x/Math.max(this.screenResolution.y,1),r=e==="orthographic"?this.createOrthographicCamera(i):this.createPerspectiveCamera(i);if(r.position.copy(this.camera.position),r.quaternion.copy(this.camera.quaternion),r.up.copy(this.camera.up),r.layers.mask=this.camera.layers.mask,r.name=this.camera.name,"near"in this.camera&&"near"in r){let s=this.camera,a=r;a.near=s.near,a.far=s.far,a.zoom=s.zoom,a.updateProjectionMatrix()}let n=this.camera.parent;n&&(n.add(r),n.remove(this.camera)),this.camera=r,this.orbitController?.rebindCamera(r),this._rendererManager?.rebindPostProcessingCamera(r)}createCameraForPerspective(e){return gt(this._perspective)==="orthographic"?this.createOrthographicCamera(e):this.createPerspectiveCamera(e)}createPerspectiveCamera(e){return new Pt(75,e,.1,1e3)}createOrthographicCamera(e){return new De(this.frustumSize*e/-2,this.frustumSize*e/2,this.frustumSize/2,this.frustumSize/-2,1,1e3)}};var Wi=1e4,ln=[{id:D.side,perspective:m.Fixed2D,lockRotation:!0,screenSpacePan:!0,position:(o,e)=>new M(o.x+e,o.y,o.z),up:()=>new M(0,1,0)},{id:D.top,perspective:m.TopDown,lockRotation:!0,screenSpacePan:!0,position:(o,e)=>new M(o.x,o.y+e,o.z),up:()=>new M(0,0,-1)},{id:D.isometric,perspective:m.Isometric,lockRotation:!0,screenSpacePan:!0,near:-Wi,far:Wi,position:(o,e)=>o.clone().add(new M(1,1,1).normalize().multiplyScalar(e)),up:()=>new M(0,1,0)},{id:D.free,perspective:m.ThirdPerson,lockRotation:!1,screenSpacePan:!1,position:(o,e,t)=>t.distanceTo(o)>.5?t.clone():o.clone().add(new M(0,e*.5,e)),up:o=>o.clone()}];function cn(o){let e=new M;o.getWorldDirection(e);let i=new M().sub(o.position).dot(e),r=i>1?i:12;return{lookAt:o.position.clone().add(e.multiplyScalar(r)),distance:r}}var Le=class{cameras=new Map;_activeCameras=[];_editorCameras=new Map;_lockedEditorIds=new Set;_screenSpacePanIds=new Set;_rememberedGameCamera=null;_editorViewLocked=!1;_suspendedOrbits=new Set;_editorCamerasPromise=null;_rendererManager=null;_sceneRef=null;_autoNameCounter=0;_unregisterEditorHost=null;get activeCameras(){return this._activeCameras}get primaryCamera(){return this._activeCameras.length>0?this._activeCameras[0]:null}isEditorViewActive(){return this._editorViewLocked}hasEditorCameras(){return this._editorCameras.size>0}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;this.cameras.delete(t);let r=this._activeCameras.indexOf(i);return r!==-1&&this._activeCameras.splice(r,1),this._rememberedGameCamera===i&&(this._rememberedGameCamera=null),this._suspendedOrbits.delete(i),!0}setActiveCamera(e){let t=this.resolveCamera(e);return t?this._editorViewLocked&&!this.isEditorCamera(t)?(this._rememberedGameCamera=t,!0):(this.isEditorCamera(t)||(this._rememberedGameCamera=t,this.restoreOrbitFor(t)),this.commitActive(t)):(console.warn(`CameraManager: Camera not found: ${e}`),!1)}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;for(let i of this.cameras.values())i.setRendererManager(t),await i.setup(e,t);this._unregisterEditorHost=Qt(this),pe()&&await this.ensureEditorCameras()}ensureEditorCameras(){return this._editorCameras.size>0?Promise.resolve():this._editorCamerasPromise?this._editorCamerasPromise:(this._editorCamerasPromise=this.createEditorCameras().finally(()=>{this._editorCamerasPromise=null}),this._editorCamerasPromise)}destroyEditorCameras(){let e=this.primaryCamera!==null&&this.isEditorCamera(this.primaryCamera);if(this._editorViewLocked=!1,e){let t=this.gameCameraToRestore();t&&(this.restoreOrbitFor(t),this.commitActive(t))}for(let t of this._editorCameras.values())this.removeCamera(t),t.destroy();this._editorCameras.clear(),this._lockedEditorIds.clear(),this._screenSpacePanIds.clear()}activateCameraById(e){if(e===Kt){let r=this.gameCameraToRestore();return r?this.showGameCamera(r):!1}let t=this._editorCameras.get(e);if(t)return this.showEditorCamera(e,t);let i=this.getCamera(e);return!i||this.isEditorCamera(i)?!1:(this._rememberedGameCamera=i,this.showGameCamera(i))}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 on(window.innerWidth,window.innerHeight),t=new x(m.ThirdPerson,e);return this.addCamera(t,"default"),t}return this._activeCameras[0]}dispose(){this._unregisterEditorHost?.(),this._unregisterEditorHost=null,this._editorViewLocked=!1;for(let e of this.cameras.values())e.destroy();this.cameras.clear(),this._activeCameras=[],this._editorCameras.clear(),this._lockedEditorIds.clear(),this._screenSpacePanIds.clear(),this._rememberedGameCamera=null,this._suspendedOrbits.clear(),this._rendererManager=null,this._sceneRef=null}async createEditorCameras(){if(this._editorCameras.size>0||!this._sceneRef||!this._rendererManager)return;let e=this.primaryCamera??this.ensureDefaultCamera();e.sceneRef||(e.setRendererManager(this._rendererManager),await e.setup(this._sceneRef,this._rendererManager));let t=cn(e.camera),i=this._rendererManager.screenResolution.clone(),r=Math.max(t.distance,4);this.isEditorCamera(e)||(this._rememberedGameCamera=e);for(let n of ln){let s=new x(n.perspective,i,r);s._skipDebugOrbit=!0;let a=n.position(t.lookAt,t.distance,e.camera.position),l=n.up(e.camera.up);s.camera.up.copy(l),s.camera.position.copy(a),s.camera.lookAt(t.lookAt),(s.camera instanceof sn||s.camera instanceof an)&&(s.camera.near=n.near??.1,s.camera.far=n.far??2e3,s.camera.updateProjectionMatrix()),this.addCamera(s,n.id),this._editorCameras.set(n.id,s),n.lockRotation&&this._lockedEditorIds.add(n.id),n.screenSpacePan&&this._screenSpacePanIds.add(n.id),s.setRendererManager(this._rendererManager),await s.setup(this._sceneRef,this._rendererManager),s.seedDebugOrbitPose(a,t.lookAt)}}showEditorCamera(e,t){if(!this._editorViewLocked){let i=this.primaryCamera;i&&!this.isEditorCamera(i)&&(this._rememberedGameCamera=i)}return this._editorViewLocked=!0,this.suspendOtherOrbits(t),this.syncEditorOrbit(e),this.commitActive(t)}showGameCamera(e){return this._editorViewLocked=!1,this.syncEditorOrbit(null),this.restoreOrbitFor(e),this.commitActive(e)}syncEditorOrbit(e){for(let[t,i]of this._editorCameras)t===e?i.armEditorOrbit(this._lockedEditorIds.has(t),this._screenSpacePanIds.has(t)):i.disarmEditorOrbit()}suspendOtherOrbits(e){for(let t of this.cameras.values())t===e||this.isEditorCamera(t)||t.isOrbitActive&&(t.setOrbitInteractionEnabled(!1),this._suspendedOrbits.add(t))}restoreOrbitFor(e){this._suspendedOrbits.has(e)&&(e.setOrbitInteractionEnabled(!0),this._suspendedOrbits.delete(e))}gameCameraToRestore(){if(this._rememberedGameCamera&&this.cameraIsRegistered(this._rememberedGameCamera))return this._rememberedGameCamera;for(let e of this.cameras.values())if(!this.isEditorCamera(e))return e;return null}cameraIsRegistered(e){for(let t of this.cameras.values())if(t===e)return!0;return!1}isEditorCamera(e){for(let t of this._editorCameras.values())if(t===e)return!0;return!1}commitActive(e){let t=this.primaryCamera,i=this._activeCameras.filter(r=>r!==this._activeCameras[0]&&r.viewport.width<1);return this._activeCameras=[e,...i],t!==e&&this._rendererManager?.rebindPostProcessingCamera(e.camera),!0}resolveCamera(e){if(typeof e=="string")return this.cameras.get(e)??null;for(let t of this.cameras.values())if(t===e)return t;return null}};var C=class{cameraRef;constructor(e){this.cameraRef=e}addTarget(e){this.cameraRef.addTarget(e)}removeTarget(e){this.cameraRef.removeTarget(e)}clearTargets(){this.cameraRef.clearTargets()}enableOrbitalControls(){this.cameraRef.enableOrbitalControls()}disableOrbitalControls(){this.cameraRef.disableOrbitalControls()}setViewport(e,t,i,r){this.cameraRef.setViewport(e,t,i,r)}addBehavior(e,t){this.cameraRef.pipeline.addBehavior(e,t)}removeBehavior(e){return this.cameraRef.pipeline.removeBehavior(e)}addAction(e){this.cameraRef.pipeline.addAction(e)}setPerspective(e,t){this.cameraRef.applyPerspective(e,O(e,t))}getPerspective(){return this.cameraRef.pipeline.perspective}getState(){return this.cameraRef.pipeline.getState()}getRenderTexture(){return this.cameraRef.getRenderTexture()}};function Ra(o){let e=ei(o.screenResolution,{x:window.innerWidth,y:window.innerHeight}),t=10;(o.perspective==="fixed-2d"||o.perspective==="isometric"||o.perspective==="top-down")&&(t=o.zoom||10);let i=new x(o.perspective||"third-person",e,t);o.name&&(i.name=o.name);let r=h(o.position,P),n=h(o.target,P);i.move(r),i.camera.lookAt(n);let s=o.perspective||"third-person";if(s==="fixed-2d"||s==="flat-2d"?i.applyPerspective(s,O(s,{zoom:t})):s==="isometric"||s==="top-down"?i.applyPerspective(s,O(s,{zoom:t,initialPosition:r.clone(),initialLookAt:n.clone()})):i.applyPerspective(s,O(s,{initialPosition:r.clone(),initialLookAt:n.clone()})),o.viewport&&(i.viewport={...o.viewport}),o.useOrbitalControls&&(i._useOrbitalControls=!0),o.skipDebugOrbit&&(i._skipDebugOrbit=!0),o.damping!=null&&(i.pipeline.damping=o.damping),o.behaviors)for(let[a,l]of Object.entries(o.behaviors))i.pipeline.addBehavior(a,l);if(o.renderToTexture){let{width:a=512,height:l=512}=o.renderToTexture;i.createRenderTarget(a,l)}return new C(i)}import{Vector3 as dn}from"three";function k(o){return!!o&&typeof o=="object"&&typeof o.create=="function"}function ne(o){return!!o&&typeof o.then=="function"}function wt(o){return!!o&&typeof o=="object"&&o instanceof C}function qi(o){return!o||typeof o!="object"||k(o)||wt(o)||ne(o)||typeof o.then=="function"?!1:o.constructor===Object||o.constructor?.name==="Object"}function Ki(o){return o?!!(k(o)||typeof o=="function"||ne(o)):!1}var pn="/three/basis/";function Oe(o){return{...o,ktx2TranscoderPath:o?.ktx2TranscoderPath??pn}}var Ae=class{constructor(e,t,i,r,n,s,a=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=a;this.assetLoaders=l;this.defaultLighting=c;this.postProcessingEffects=d}};function un(){return new Ae({p1:["gamepad-1","keyboard-1"],p2:["gamepad-2","keyboard-2"]},ve,null,null,new dn(0,0,0),{},60,{},!0)}function Qi(o=[]){let e=un(),t={},i=[],r=[],n=[];for(let l of o)wt(l)?n.push(l):k(l)?i.push(l):Ki(l)&&!k(l)?r.push(l):qi(l)&&(t={...t,...l});let s=new Ae(t.inputs??e.inputs,t.backgroundColor??e.backgroundColor,t.backgroundImage??e.backgroundImage,t.backgroundShader??e.backgroundShader,t.gravity??e.gravity,t.variables??e.variables,t.physicsRate??e.physicsRate,t.assetLoaders??e.assetLoaders,t.defaultLighting??e.defaultLighting,t.postProcessingEffects??e.postProcessingEffects),a=n.length>0?n[0]:void 0;return{config:s,entities:i,asyncEntities:r,camera:a,cameras:n}}function za(o){return{...o}}var hn=Symbol("vessel"),oe=class extends W{static type=hn;_setup(e){}async _loaded(e){}_update(e){}_destroy(e){}_cleanup(e){}create(){return this}clone(){let e=mn();return this.replayUserLifecycleRegistrationsTo(e),this.cloneChildrenInto(e),e}add(...e){for(let t of e)super.add(t);return this}};function mn(...o){let e=new oe;return o.forEach(t=>e.add(t)),e.enableUserLifecycleTracking(),e}import{Color as Mr,Vector3 as Tr}from"three";import{createSimulation as fn}from"@zylem/behaviors/core";function Et(o){return typeof o?.handlePostCollision=="function"&&typeof o?.handleIntersectionEvent=="function"}function gn(o,e){return o<e?`${o}|${e}`:`${e}|${o}`}var Be=class o{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 fn({gravity:[i.x,i.y,i.z],fixedTimestep:1/t,initialCapacity:4096});return new o(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 ge)&&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 ci(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=gn(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 a=t.type==="collisionStarted"?1:-1;t.sensor?s.intersectionCount=Math.max(0,s.intersectionCount+a):s.contactCount=Math.max(0,s.contactCount+a),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(!Et(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),a=this.collisionMap.get(n.uuidB);this.activeCollisionPairs.has(r)||this.dispatchCollisionPhase(n,"enter",t),(this.entityHasCollisionPhaseListener(s,"stay")||this.entityHasCollisionPhaseListener(a,"stay"))&&this.dispatchCollisionPhase(n,"stay",t),n.hasIntersection&&this.dispatchIntersectionDelegates(n,e)}this.updatePostCollisionBehaviors(e),this.activeCollisionPairs=i}dispatchCollisionPhase(e,t,i){let r={phase:t,nowMs:i},n=this.collisionMap.get(e.uuidA),s=this.collisionMap.get(e.uuidB);n&&s&&n._collision(s,rt.globals,r);let a=this.collisionMap.get(e.uuidA),l=this.collisionMap.get(e.uuidB);a&&l&&l._collision(a,rt.globals,r)}dispatchIntersectionDelegates(e,t){let i=this.collisionMap.get(e.uuidA),r=this.collisionMap.get(e.uuidB);i&&r&&Et(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&&Et(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 yn,Color as Yi,AmbientLight as vn,DirectionalLight as bn,Vector3 as ze,GridHelper as Cn,Texture as Sn,SRGBColorSpace as Pn}from"three";var Ve=class{type="Scene";_setup;scene;zylemCamera;cameraManager=null;containerElement=null;update=()=>{};_collision;_destroy;name;tag;constructor(e,t,i){let r=new yn,s=i.backgroundColor instanceof Yi?i.backgroundColor:new Yi(i.backgroundColor);r.background=s,i.backgroundShader?this.setupBackgroundShader(r,i.backgroundShader):i.backgroundImage&&I.loadTexture(i.backgroundImage,{colorSpace:Pn}).then(a=>{r.background=a}),this.scene=r,this.zylemCamera=t,i.defaultLighting!==!1&&this.setupLighting(r),p.enabled&&this.debugScene()}setupBackgroundShader(e,t){if(!me(t)){console.warn("ZylemScene: GLSL background shaders are not supported on the WebGPU renderer. Provide a TSL shader (ZylemTSLShader) as backgroundShader. Keeping solid background.");return}e.background=null,e.backgroundNode=t.colorNode}setup(){this._setup&&this._setup({me:this,camera:this.zylemCamera,globals:v()})}destroy(){this.cameraManager?(this.cameraManager.dispose(),this.cameraManager=null):this.zylemCamera&&this.zylemCamera.destroy&&this.zylemCamera.destroy(),this.scene&&(this.scene.backgroundNode=null,this.scene.background instanceof Sn&&(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 vn(16777215,1);e.add(t);let i=new bn(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 ze(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(L(e))return;let t=e.group??e.mesh;if(!t||this.isAttachedOutsideScene(t))return;let i=wn(e);i&&i.attachToScene(this.scene);let r=e.options.position??new ze(0,0,0);if(e.physicsAttached&&e.body)try{let n=e.body.translation();r=new ze(n.x,n.y,n.z)}catch{r=e.options.position??new ze(0,0,0)}this.add(t,r),q(e)}isAttachedOutsideScene(e){return e.parent!=null&&e.parent!==this.scene}debugScene(){let i=new Cn(1e3,100);this.scene.add(i)}};function wn(o){return o.constructor.type===di?o:null}var Ie=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 En}from"three";var $i=new En;function Xi(o){let e=o._childrenMap,t=o._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?ye(r,t?.interpolationAlpha??0):null;n&&s&&n.position.set(s.position.x,s.position.y,s.position.z),!i.controlledRotation&&n&&s&&($i.set(s.rotation.x,s.rotation.y,s.rotation.z,s.rotation.w),n.setRotationFromQuaternion($i))}}import{nanoid as To}from"nanoid";import{Box3 as Vt,BufferAttribute as Sr,BufferGeometry as vo,LineBasicMaterial as bo,LineSegments as Co,Raycaster as So,Vector2 as Po,Vector3 as It}from"three";import{subscribe as wo}from"valtio/vanilla";import{nanoid as Pr}from"nanoid";import{Box3 as xn,BoxGeometry as Ji,Color as Mn,EdgesGeometry as er,Group as Tn,LineBasicMaterial as Rn,LineSegments as kn,Mesh as _n,MeshBasicMaterial as Dn,Vector3 as tr}from"three";var Fe=class{scene;container;fillMesh;edgeLines;currentColor=new Mn(65280);bbox=new xn;size=new tr;center=new tr;constructor(e){this.scene=e;let t=new Ji(1,1,1);this.fillMesh=new _n(t,new Dn({color:this.currentColor,transparent:!0,opacity:.12,depthWrite:!1}));let i=new er(t);this.edgeLines=new kn(i,new Rn({color:this.currentColor,linewidth:1})),this.container=new Tn,this.container.name="DebugEntityCursor",this.container.add(this.fillMesh),this.container.add(this.edgeLines),this.container.visible=!1,this.scene.add(this.container)}setColor(e){this.currentColor.set(e),this.fillMesh.material.color.set(this.currentColor),this.edgeLines.material.color.set(this.currentColor)}updateFromObject(e){if(!e){this.hide();return}this.bbox.setFromObject(e),this.updateFromBounds(this.bbox)}updateFromBounds(e){if(!e||e.isEmpty()){this.hide();return}if(e!==this.bbox&&this.bbox.copy(e),!isFinite(this.bbox.min.x)||!isFinite(this.bbox.max.x)){this.hide();return}this.bbox.getSize(this.size),this.bbox.getCenter(this.center);let t=new Ji(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 er(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 Ln,BoxGeometry as An,Group as On,Mesh as Bn,MeshBasicMaterial as zn,Vector3 as ir}from"three";var Vn={x:0,y:0,z:0},In=7128319,Fn=.35;function Gn(){return new zn({color:In,transparent:!0,opacity:Fn,depthWrite:!1})}function Zn(o){let e=o.size;return new ir(e?.x??1,e?.y??1,e?.z??1)}function Nn(o,e){try{let t=o.create({position:Vn,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 "${o.id}" factory failed, falling back to a box`,t),null}}function Hn(o,e){o.traverse(t=>{let i=t;i.isMesh&&(i.material=e,i.castShadow=!1,i.receiveShadow=!1)})}var Ge=class{scene;container;builtFor=null;builtProps=null;material=null;extent=null;bounds=new Ln;constructor(e){this.scene=e,this.container=new On,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=he(e),n={...r?.defaultProps??{},...t??{}},a=(r?Nn(r,n):null)??new Bn(new An(...Zn(n).toArray()));a.position.set(0,0,0),this.material=Gn(),Hn(a,this.material),this.container.add(a),this.bounds.setFromObject(a),this.extent=this.bounds.isEmpty()?null:this.bounds.getSize(new ir)}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 xt}from"three";var Un=0;function jn(o,e){if(e)return{position:o.origin.clone().add(o.direction.clone().multiplyScalar(e.distance)),normal:new xt(e.normal[0],e.normal[1],e.normal[2])};if(Math.abs(o.direction.y)<1e-6)return null;let t=(Un-o.origin.y)/o.direction.y;return t<0?null:{position:o.origin.clone().add(o.direction.clone().multiplyScalar(t)),normal:new xt(0,1,0)}}function Wn(o,e){if(e.lengthSq()<1e-8)return 0;let t=e.clone().normalize();return(Math.abs(t.x)*o.x+Math.abs(t.y)*o.y+Math.abs(t.z)*o.z)/2}function Mt(o,e,t){let i=Wn(e,t);return i<=0?o.clone():o.clone().add(t.clone().normalize().multiplyScalar(i))}function Tt(o,e,t,i){let r=jn(o,e);if(!r)return null;let{normal:n}=r,s=t.enabled?ue(r.position,t.translate):r.position,a=new xt(s.x,s.y,s.z);return{position:i?Mt(a,i,n):a,normal:n}}import{Box3 as Yn,Quaternion as Ue,Vector3 as S}from"three";import{nanoid as $n}from"nanoid";import{Vector3 as H}from"three";var kt=.95,qn=16,se=new H,Kn=new H,rr=new H,Rt=new H;function nr(o){return o?o.isPerspectiveCamera===!0||o.isOrthographicCamera===!0:!1}function Ze(o,e,t=kt){return se.copy(o).project(e),Math.abs(se.x)<=t&&Math.abs(se.y)<=t&&se.z>=-1&&se.z<=1}function or(o){let e=0,t=1;for(let i=0;i<qn;i+=1){let r=(e+t)/2;o(r)?e=r:t=r}return e}function sr(o,e,t,i=kt){if(!nr(t))return e.clone();let r=t;if(Ze(e,r,i)||!Ze(o,r,i))return e.clone();let n=or(s=>Ze(Kn.copy(o).lerp(e,s),r,i));return o.clone().lerp(e,n)}function ar(o,e,t,i,r=kt){if(!nr(i)||t.x<=1&&t.y<=1&&t.z<=1||o.isEmpty())return t.clone();let n=i;rr.copy(e);let s=new H(1,1,1),a=c=>(s.set(1+(t.x-1)*c,1+(t.y-1)*c,1+(t.z-1)*c),Qn(o,rr,s,n,r));if(a(1))return t.clone();let l=or(a);return new H(1+(t.x-1)*l,1+(t.y-1)*l,1+(t.z-1)*l)}function Qn(o,e,t,i,r){for(let n=0;n<8;n+=1)if(Rt.set(n&1?o.max.x:o.min.x,n&2?o.max.y:o.min.y,n&4?o.max.z:o.min.z),Rt.sub(e).multiply(t).add(e),!Ze(Rt,i,r))return!1;return!0}var Xn={translate:"Move",rotate:"Rotate",scale:"Scale"};function _t(o){let e=typeof o?.getPose=="function"?o.getPose():null,t=o?.group??o?.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 o?.getScale=="function"?o.getScale():{x:1,y:1,z:1};return{position:new S(i.x,i.y,i.z),quaternion:new Ue(r.x,r.y,r.z,r.w),scale:new S(n.x,n.y,n.z)}}function lr(o){let e=lt(o.quaternion);return{position:{x:o.position.x,y:o.position.y,z:o.position.z},rotation:e,quaternion:{x:o.quaternion.x,y:o.quaternion.y,z:o.quaternion.z,w:o.quaternion.w},scale:{x:o.scale.x,y:o.scale.y,z:o.scale.z}}}function Jn(o,e){return o.position.distanceToSquared(e.position)>1e-5*1e-5||Math.abs(o.quaternion.dot(e.quaternion))<1-1e-5||o.scale.distanceToSquared(e.scale)>1e-5*1e-5}function Ne(o,e){(e.position||e.quaternion)&&o.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&&o.setScale?.(e.scale.x,e.scale.y,e.scale.z)}function eo(o){let e=o?.group??o?.mesh;if(!e?.isObject3D)return null;let t=new Yn().setFromObject(e);return t.isEmpty()?null:t}var Dt=.02,Lt=50;function to(o){return new S(At(o.x,Dt,Lt),At(o.y,Dt,Lt),At(o.z,Dt,Lt))}function At(o,e,t){return Math.min(Math.max(o,e),t)}var Ot=new Ue,io=new S,He=class{gizmo=new yi;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=p.paused,p.paused=!0):!e&&this.pausedBeforeEntry!==null&&(p.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 p.selectedEntityIds){let s=this.context.resolveEntity(n);s&&r.push({uuid:n,entity:s,start:_t(s),startBounds:this.mode==="scale"?eo(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=V(),a=s.enabled&&!t;switch(n.kind){case"translate":this.applyTranslate(i,n.offset,a?s.translate:0,r);break;case"rotate":this.applyRotate(i,n.axis,n.angle,a?s.rotate:0);break;case"scale":this.applyScale(i,n.factor,a?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=_t(i.entity);Jn(i.start,r)&&(e.mode==="scale"&&ct(i.entity),t.push({uuid:i.uuid,before:lr(i.start),after:lr(r)}))}t.length&&j({opId:$n(10),kind:"transform",label:this.describeOperation(e),entries:t})}cancelDrag(){this.session=null,this.gizmo.endDrag()}dispose(){this.cancelDrag(),this.pausedBeforeEntry!==null&&(p.paused=this.pausedBeforeEntry,this.pausedBeforeEntry=null),this.gizmo.dispose()}applyTranslate(e,t,i,r){let n=io.copy(e.pivotStart).add(t),s=sr(e.pivotStart,n,r),a=i>0?ue(s,i):s,l=new S(a.x-e.pivotStart.x,a.y-e.pivotStart.y,a.z-e.pivotStart.z);for(let c of e.entries)Ne(c.entity,{position:c.start.position.clone().add(l)})}applyRotate(e,t,i,r){let n=e.axis;for(let s of e.entries){Ot.setFromAxisAngle(t,i);let a=Ot.clone().multiply(s.start.quaternion),l=a;if(r>0&&(n==="x"||n==="y"||n==="z")){let d=lt(a);d[n]=$t(d[n],r);let u=at(d);l=new Ue(u.x,u.y,u.z,u.w)}let c=s.start.position.clone().sub(e.pivotStart).applyQuaternion(Ot).add(e.pivotStart);Ne(s.entity,{position:c,quaternion:l})}}applyScale(e,t,i,r){for(let n of e.entries){let s=n.startBounds?ar(n.startBounds,n.start.position,t,r):t,a=to(s),l=new S(n.start.scale.x*a.x,n.start.scale.y*a.y,n.start.scale.z*a.z),c=i>0?Xt(l,i):l;Ne(n.entity,{scale:new S(c.x,c.y,c.z)})}}describeOperation(e){let t=Xn[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=p.selectedEntityIds;if(!e.length)return null;let t=new S,i=0;for(let r of e){let n=this.context.resolveEntity(r);n&&(t.add(_t(n).position),i++)}return i?t.divideScalar(i):null}};function cr(o,e,t){for(let i of o.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?at(r.rotation):void 0);Ne(n,{position:r.position?new S(r.position.x,r.position.y,r.position.z):void 0,quaternion:s?new Ue(s.x,s.y,s.z,s.w):void 0,scale:r.scale?new S(r.scale.x,r.scale.y,r.scale.z):void 0}),r.scale&&ct(n)}}var ro=200;function dr(o){return typeof o=="object"&&o!==null&&!Array.isArray(o)}function no(o){return dr(o)&&(me(o)||ii(o))}var je=class{stage;snapshots=new Map;constructor(e){this.stage=e}applySwatches(e){let t=new Map,i=[],r=[];for(let n of e.uuids)for(let s of e.swatches){let{result:a,entry:l}=this.applyPair(n,s,t);i.push(a),l&&r.push(l)}return t.size>0&&this.remember(e.opId,t),{results:i,entries:r}}applySceneOperation(e,t){if(e.kind!=="swatch")return;let i=this.snapshots.get(e.opId);if(i){t==="undo"?this.undoFromSnapshot(i):this.redoFromSnapshot(i);return}if(t==="redo"){let r=new Map;for(let n of e.entries)n.swatch&&this.applyPair(n.uuid,n.swatch,r);r.size>0&&this.remember(e.opId,r);return}this.undoWithoutSnapshot(e)}hasSnapshot(e){return this.snapshots.has(e)}dispose(){for(let[e]of this.snapshots)this.forget(e)}applyPair(e,t,i){let r={uuid:e,kind:t.kind,source:t.source},n=this.stage.resolveEntity(e);if(!n)return{result:{...r,ok:!1,reason:"entity-not-found"}};if(!dr(t.props))return{result:{...r,ok:!1,reason:"invalid-props"}};let s=i.get(e)??{previousRefs:new Map,appliedRefs:new Map},a=t.kind==="shader"?this.applyShader(n,t,s):this.applyBehavior(n,t,s);return a.ok?(i.set(e,s),{result:{...r,ok:!0,replaced:a.replaced},entry:{uuid:e,swatch:t,...a.replacedSpec?{replaced:a.replacedSpec}:{}}}):{result:{...r,ok:!1,reason:a.reason}}}applyShader(e,t,i){let r=fe("shader",t.source);if(!r)return{ok:!1,reason:"unknown-source"};if(!e.hasMaterial())return{ok:!1,reason:"no-material"};let n;try{n=r.create(t.props)}catch(a){return console.warn(`[zylem] swatch shader "${t.source}" threw`,a),{ok:!1,reason:"invalid-props"}}if(!no(n))return{ok:!1,reason:"invalid-props"};let s=e.setMaterial({shader:n},{disposePrevious:!1});return s?(i.previousMaterials?Bt(s,i.previousMaterials):i.previousMaterials=s,{ok:!0,replaced:!1}):{ok:!1,reason:"no-material"}}applyBehavior(e,t,i){let r=fe("behavior",t.source);if(!r)return{ok:!1,reason:"unknown-source"};let{descriptor:n}=r,s=n.key,a=!1,l,c=e.getBehaviorRef(n);c&&(e.removeBehavior(c),this.stage.detachBehaviorLink(e,c),i.appliedRefs.get(s)===c||(a=!0,l={source:t.source,props:{...c.options}},i.previousRefs.has(s)||i.previousRefs.set(s,c)));let d;try{e.use(n,t.props),d=e.getBehaviorRefs().at(-1)}catch(u){console.warn(`[zylem] swatch behavior "${t.source}" failed to attach`,u)}return!d||d.descriptor.key!==s?(c&&(e.restoreBehaviorRef(c),this.stage.attachBehaviorLink(e,c),i.previousRefs.get(s)===c&&i.previousRefs.delete(s)),{ok:!1,reason:"invalid-props"}):(this.stage.attachBehaviorLink(e,d),i.appliedRefs.set(s,d),{ok:!0,replaced:a,replacedSpec:l})}undoFromSnapshot(e){for(let[t,i]of[...e].reverse()){let r=this.stage.resolveEntity(t);if(r){if(i.previousMaterials){let n=r.replaceMaterials(i.previousMaterials,{disposePrevious:!1});n&&(i.redoMaterials=n)}for(let n of i.appliedRefs.values())r.removeBehavior(n)&&this.stage.detachBehaviorLink(r,n);for(let n of i.previousRefs.values())r.restoreBehaviorRef(n),this.stage.attachBehaviorLink(r,n)}}}redoFromSnapshot(e){for(let[t,i]of e){let r=this.stage.resolveEntity(t);if(r){i.redoMaterials&&r.replaceMaterials(i.redoMaterials,{disposePrevious:!1});for(let n of i.previousRefs.values())r.removeBehavior(n)&&this.stage.detachBehaviorLink(r,n);for(let n of i.appliedRefs.values())r.restoreBehaviorRef(n),this.stage.attachBehaviorLink(r,n)}}}undoWithoutSnapshot(e){for(let t of[...e.entries].reverse()){let i=this.stage.resolveEntity(t.uuid);if(!(!i||!t.swatch)){if(t.swatch.kind==="behavior"){let r=fe("behavior",t.swatch.source);if(!r)continue;let n=i.removeBehavior(r.descriptor);if(n&&this.stage.detachBehaviorLink(i,n),t.replaced){i.use(r.descriptor,t.replaced.props);let s=i.getBehaviorRefs().at(-1);s&&this.stage.attachBehaviorLink(i,s)}continue}i.setMaterial({})}}}remember(e,t){for(this.snapshots.has(e)&&this.forget(e),this.snapshots.set(e,t);this.snapshots.size>ro;){let i=this.snapshots.keys().next().value;if(i===void 0)break;this.forget(i)}}forget(e){let t=this.snapshots.get(e);if(this.snapshots.delete(e),!!t)for(let[i,r]of t){let n=this.stage.resolveEntity(i)?.getMaterials()??[];Bt(r.previousMaterials??[],n),Bt(r.redoMaterials??[],n)}}};function Bt(o,e){for(let t of o)e.includes(t)||t.dispose()}import{Box3 as lo,Frustum as co,Vector2 as qe}from"three";import{Frustum as oo,Vector2 as pr,Vector3 as so}from"three";var ur=Array.from({length:8},()=>new so),g=new pr,y=new pr;function hr(o,e,t,i=new oo){g.set(Math.min(e.x,t.x),Math.min(e.y,t.y)),y.set(Math.max(e.x,t.x),Math.max(e.y,t.y));let r=1e-5;y.x-g.x<r&&(y.x=g.x+r),y.y-g.y<r&&(y.y=g.y+r),_(0,g.x,g.y,-1,o),_(1,y.x,g.y,-1,o),_(2,y.x,y.y,-1,o),_(3,g.x,y.y,-1,o),_(4,g.x,g.y,1,o),_(5,y.x,g.y,1,o),_(6,y.x,y.y,1,o),_(7,g.x,y.y,1,o);let[n,s,a,l,c,d,u,f]=ur,z=i.planes;return U(z[0],n,c,f),U(z[1],s,u,d),U(z[2],l,f,u),U(z[3],n,d,c),U(z[4],n,l,a),U(z[5],c,u,f),i}function _(o,e,t,i,r){ur[o].set(e,t,i).unproject(r)}function U(o,e,t,i){o.setFromCoplanarPoints(e,t,i)}function mr(o,e){return e.isEmpty()||!Number.isFinite(e.min.x)||!Number.isFinite(e.max.x)?!1:o.intersectsBox(e)}function fr(o,e,t){switch(t){case"add":{let i=new Set(o),r=[...o];for(let n of e)i.has(n)||(i.add(n),r.push(n));return r}case"subtract":{let i=new Set(e);return o.filter(r=>!i.has(r))}default:return[...new Set(e)]}}function gr(o){return o.altKey?"subtract":o.shiftKey?"add":"replace"}var ao="[data-zylem-overlay-root]";function yr(o){let e=o.parentElement;return e?e.querySelector(ao)??e:null}var We=class{element=null;host=null;show(e,t){let i=this.ensureElement(e);i.style.left=`${t.left}px`,i.style.top=`${t.top}px`,i.style.width=`${t.width}px`,i.style.height=`${t.height}px`,i.style.display="block"}hide(){this.element&&(this.element.style.display="none")}dispose(){this.element?.remove(),this.element=null,this.host=null}ensureElement(e){if(this.element&&this.host===e)return this.element;this.element?.remove();let t=document.createElement("div");t.dataset.zylemMarquee="true";let i=t.style;return i.position="absolute",i.pointerEvents="none",i.boxSizing="border-box",i.border="1px solid rgba(34, 255, 34, 0.9)",i.background="rgba(34, 255, 34, 0.12)",i.display="none",i.zIndex="20",e.appendChild(t),this.element=t,this.host=e,t}};var po=4,uo=new lo,vr=new co,Ke=class{context;overlay=new We;armed=!1;dragging=!1;mode="replace";baseSelection=[];startNdc=new qe;currentNdc=new qe;startClient=new qe;currentClient=new qe;host=null;constructor(e){this.context=e}get isArmed(){return this.armed}get isDragging(){return this.dragging}pointerDown(e,t,i){this.armed=!0,this.dragging=!1,this.mode=gr(t),this.baseSelection=[...p.selectedEntityIds],this.startNdc.copy(e),this.currentNdc.copy(e),this.startClient.set(t.clientX,t.clientY),this.currentClient.copy(this.startClient),this.host=yr(i)}pointerMove(e,t){if(!this.armed)return!1;this.currentNdc.copy(e),this.currentClient.set(t.clientX,t.clientY);let i=!1;if(!this.dragging){if(this.currentClient.distanceTo(this.startClient)<po)return!1;this.dragging=!0,i=!0}return this.drawOverlay(),i}pointerUp(e){if(!this.armed)return"idle";let t=this.dragging;return this.currentNdc.copy(e),this.reset(),t?(this.commit(),"marquee"):"click"}cancel(){this.reset()}dispose(){this.reset(),this.overlay.dispose()}reset(){this.armed=!1,this.dragging=!1,this.overlay.hide()}drawOverlay(){if(!this.host)return;let e=this.host.getBoundingClientRect(),t=Math.min(this.startClient.x,this.currentClient.x)-e.left,i=Math.min(this.startClient.y,this.currentClient.y)-e.top;this.overlay.show(this.host,{left:t,top:i,width:Math.abs(this.currentClient.x-this.startClient.x),height:Math.abs(this.currentClient.y-this.startClient.y)})}commit(){let e=this.context.getCamera();if(!e)return;hr(e,this.startNdc,this.currentNdc,vr);let t=[];this.context.forEachEntity((i,r)=>{let n=K(r,uo);n&&mr(vr,n)&&t.push(i)}),Zt(fr(this.baseSelection,t,this.mode))}};import{BoxGeometry as ho,EdgesGeometry as mo,Group as fo,LineBasicMaterial as go,LineSegments as yo,Vector3 as Cr}from"three";var Qe=new Cr,br=new Cr,Ye=class{scene;container=new fo;edges;material;pool=[];constructor(e,t=16765503){this.scene=e;let i=new ho(1,1,1);this.edges=new mo(i),i.dispose(),this.material=new go({color:t,depthTest:!1,transparent:!0,opacity:.9}),this.container.name="SelectionHighlight",this.container.renderOrder=999,this.scene.add(this.container)}setColor(e){this.material.color.set(e)}update(e){let t=0;for(let i of e){if(i.isEmpty()||!Number.isFinite(i.min.x)||!Number.isFinite(i.max.x))continue;i.getSize(Qe),i.getCenter(br);let r=this.acquire(t);t+=1,r.position.copy(br),r.scale.set(Math.max(Qe.x,1e-6),Math.max(Qe.y,1e-6),Math.max(Qe.z,1e-6)),r.visible=!0}for(let i=t;i<this.pool.length;i+=1)this.pool[i].visible=!1}hide(){for(let e of this.pool)e.visible=!1}dispose(){this.scene.remove(this.container),this.edges.dispose(),this.material.dispose(),this.pool.length=0}acquire(e){let t=this.pool[e];if(t)return t;let i=new yo(this.edges,this.material);return i.frustumCulled=!1,this.container.add(i),this.pool.push(i),i}};var wr=2293538,Eo=16724787,zt=new Vt,Er=new It,$e=class{stage;options;mouseNdc=new Po(-2,-2);raycaster=new So;domDisposeFns=[];domListenersAttached=!1;debugCursor=null;placementGhost=null;debugLines=null;debugStateUnsubscribe=null;focusContextUnregister=null;entityResolverUnregister=null;lastDebugEnabled=null;warnedMissingAddFactory=!1;transformTool;swatchApplier;marquee;selectionHighlight=null;selectionBoundsPool=[];hoverBounds=new Vt;grid=new gi;lastTool=null;capturedPointer=null;constructor(e,t){this.stage=e,this.options={maxRayDistance:t?.maxRayDistance??5e3,addEntityFactory:t?.addEntityFactory??null},this.transformTool=new He({getScene:()=>this.stage.scene?.scene??null,getCamera:()=>this.getDebugViewCamera()?.camera??null,resolveEntity:i=>this.resolveEntity(i)}),this.swatchApplier=new je({resolveEntity:i=>this.resolveEntity(i),attachBehaviorLink:(i,r)=>this.stage.entityDelegate.attachBehaviorLink(i,r),detachBehaviorLink:(i,r)=>this.stage.entityDelegate.detachBehaviorLink(i,r)}),this.marquee=new Ke({getCamera:()=>this.getDebugViewCamera()?.camera??null,forEachEntity:i=>this.forEachSelectableEntity(i)}),this.syncWithDebugState(),this.debugStateUnsubscribe=wo(p,()=>{this.syncWithDebugState()}),this.entityResolverUnregister=Gt(i=>this.resolveEntity(i)),this.focusContextUnregister=Yt({resolveEntity:i=>this.resolveEntity(i),frameObject:i=>{let r=this.stage.cameraManagerRef,n=()=>{r&&!r.isEditorViewActive()&&r.hasEditorCameras()&&r.activateCameraById(D.free),this.getDebugViewCamera()?.frameObject(i)};if(r&&pe()&&!r.hasEditorCameras()){r.ensureEditorCameras().then(n);return}n()},ensureDebugReady:()=>{p.enabled||(p.enabled=!0),this.lastDebugEnabled=!0,this.activate()}})}setAddEntityFactory(e){this.options.addEntityFactory=e,this.warnedMissingAddFactory=!1}getDebugViewCamera(){return this.stage.cameraManagerRef?.primaryCamera??this.stage.cameraRef??null}resolveEntity(e){let t=this.stage.entityDelegate.debugMap.get(e);if(t)return t;let i=this.stage.entityDelegate.childrenMap.get(e);return i||(this.stage.world?.collisionMap.get(e)??null)}forEachSelectableEntity(e){let t=new Set,i=(r,n)=>{t.has(n)||(t.add(n),e(n,r))};this.stage.entityDelegate.childrenMap.forEach(i),this.stage.entityDelegate.debugMap.forEach(i)}populateDebugMap(){this.stage.entityDelegate.childrenMap.forEach((e,t)=>{this.stage.entityDelegate.debugMap.set(t,e)})}syncWithDebugState(){this.syncToolMode(),this.syncGrid();let e=p.enabled;e!==this.lastDebugEnabled&&(this.lastDebugEnabled=e,e?this.activate():this.deactivate())}syncToolMode(){let e=p.tool;if(e===this.lastTool)return;this.lastTool=e,this.marquee.isArmed&&(this.marquee.cancel(),this.endPointerCapture()),e!=="none"&&(this.ensureInteraction(),this.populateDebugMap()),this.parkToolVisuals(e);let t=nt(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(V().translate),this.grid.setVisible(p.gridVisible))}activate(){this.domListenersAttached||(this.domListenersAttached=this.attachDomListeners()),this.populateDebugMap(),this.rebindPostProcessing(this.getDebugViewCamera()),document.pointerLockElement&&document.exitPointerLock()}deactivate(){this.disposeDebugVisuals(),this.transformTool.cancelDrag(),this.grid.setVisible(!1),this.rebindPostProcessing(this.getDebugViewCamera())}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 Co(new vo,new bo({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 Fe(e),this.placementGhost??=new Ge(e),this.selectionHighlight??=new Ye(e))}updateSelectionHighlight(){let e=this.selectionHighlight;if(!e)return;let t=p.selectedEntityIds;if(t.length===0){e.hide();return}let i=[];for(let r of t){let n=this.resolveEntity(r),s=this.selectionBoundsPool[i.length]??=new Vt,a=K(n,s);a&&i.push(a)}e.update(i)}parkToolVisuals(e){e!=="add"&&this.placementGhost?.hide(),e!=="select"&&e!=="delete"&&!p.pickMode&&this.debugCursor?.hide(),e==="none"&&!p.enabled&&this.selectionHighlight?.hide()}disposeToolVisuals(){this.debugCursor?.dispose(),this.debugCursor=null,this.placementGhost?.dispose(),this.placementGhost=null,this.selectionHighlight?.dispose(),this.selectionHighlight=null}update(){let e=this.getDebugViewCamera();if(!this.stage.scene||!this.stage.world||!e)return;let{world:t}=this.stage,i=le();if(this.ensureInteraction(),this.ensureToolVisuals(),p.enabled?(this.initDebugVisuals(),this.updateColliderWireframes(t)):this.disposeDebugVisuals(),this.updatePlacementGhost(i,t),this.updateSelectionHighlight(),nt(i)){this.debugCursor?.hide(),this.transformTool.update(),this.transformTool.isDragging||this.transformTool.hover(this.currentRay());return}if(this.transformTool.update(),!(i==="select"||i==="delete"||p.pickMode)){this.debugCursor?.hide();return}let n=this.currentRay(),s=t.raycast(n.origin,n.direction,this.options.maxRayDistance);s?st(s.uuid??null):de();let a=Ut();if(!a){this.debugCursor?.hide();return}let l=K(this.resolveEntity(a),this.hoverBounds);if(!l){this.debugCursor?.hide();return}switch(i){case"select":this.debugCursor?.setColor(wr);break;case"delete":this.debugCursor?.setColor(Eo);break;default:this.debugCursor?.setColor(p.pickMode?wr:16777215);break}this.debugCursor?.updateFromBounds(l)}pickAtNdc(e,t,i={}){let r=i.updateHover??p.pickMode;this.mouseNdc.set(e,t);let n=this.stage.world;if(!n||!this.getDebugViewCamera())return r&&de(),null;let s=this.currentRay(),l=n.raycast(s.origin,s.direction,this.options.maxRayDistance)?.uuid??null;if(!l)return r&&de(),null;r&&st(l);let c=this.resolveEntity(l);return{uuid:l,name:c?.name??""}}applySwatches(e){return this.swatchApplier.applySwatches(e)}updateColliderWireframes(e){if(!this.debugLines)return;let t=e.simulation.getDebugRender();t&&t.vertices.length>0?(this.debugLines.geometry.setAttribute("position",new Sr(new Float32Array(t.vertices),3)),this.debugLines.geometry.setAttribute("color",new Sr(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||!ce()||(this.domListenersAttached=this.attachDomListeners())}updatePlacementGhost(e,t){let i=this.placementGhost;if(!i)return;let r=p.addTypeId;if(e!=="add"||!r){i.hide();return}i.setType(r,p.addTypeProps??null);let n=this.currentRay(),s=t.raycast(n.origin,n.direction,this.options.maxRayDistance)??null,a=Tt(n,s,V(),i.measure());if(!a){i.hide();return}i.showAt(a.position)}dispose(){this.focusContextUnregister?.(),this.focusContextUnregister=null,this.entityResolverUnregister?.(),this.entityResolverUnregister=null,this.debugStateUnsubscribe?.(),this.debugStateUnsubscribe=null,this.endPointerCapture(),this.marquee.dispose(),this.transformTool.dispose(),this.swatchApplier.dispose(),this.grid.dispose(),this.deactivate(),this.disposeToolVisuals(),this.domDisposeFns.forEach(e=>e()),this.domDisposeFns=[],this.domListenersAttached=!1}applySceneOperation(e,t){let i=t==="undo";switch(e.kind){case"transform":cr(e,t,r=>this.resolveEntity(r));break;case"create":for(let r of e.entries)i?this.stage.entityDelegate.detachEntity(r.uuid):this.stage.entityDelegate.restoreEntity(r.uuid);break;case"delete":for(let r of e.entries)i?this.stage.entityDelegate.restoreEntity(r.uuid):this.stage.entityDelegate.detachEntity(r.uuid);break;case"swatch":this.swatchApplier.applySceneOperation(e,t);break}}currentRay(){let e=this.getDebugViewCamera();return e?(this.raycaster.setFromCamera(this.mouseNdc,e.camera),{origin:this.raycaster.ray.origin.clone(),direction:this.raycaster.ray.direction.clone().normalize()}):{origin:new It,direction:new It(0,0,-1)}}handleAction(e,t={shiftKey:!1,altKey:!1}){let i=le();if(i!=="select"&&i!=="delete"&&i!=="add")return;let n=this.stage.world?.raycast(e.origin,e.direction,this.options.maxRayDistance)??null;switch(i){case"select":{let s=n?.uuid??null,a=s&&this.resolveEntity(s)?s:null;t.altKey?a&&Nt([a]):t.shiftKey?a&&Ht(a):a?ot(a):ot(null);break}case"delete":{let s=n?.uuid??null;if(!s)break;this.stage.entityDelegate.detachEntity(s)&&j({opId:Pr(10),kind:"delete",label:"Delete entity",entries:[{uuid:s}]});break}case"add":this.placeEntity(e,n);break}}placeEntity(e,t){let i=Tt(e,t,V());if(!i)return;let{position:r,normal:n}=i,s=p.addTypeId?he(p.addTypeId):null;if(!s&&!this.options.addEntityFactory){this.warnMissingAddSource();return}let a=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??{},...p.addTypeProps??{}}}):this.options.addEntityFactory({position:r,normal:n});a&&Promise.resolve(a).then(async l=>{l&&(await this.stage.entityDelegate.spawnEntity(l),this.restOnSurface(l,r,n),j({opId:Pr(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"||(zt.setFromObject(r),zt.isEmpty()))return;zt.getSize(Er);let n=Mt(t,Er,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),Jt("warn",e)}attachDomListeners(){let e=this.stage.rendererManager?.getDomElement();if(!e)return!1;let t=a=>{let l=e.getBoundingClientRect(),c=(a.clientX-l.left)/l.width*2-1,d=-((a.clientY-l.top)/l.height*2-1);this.mouseNdc.set(c,d)},i=a=>{if(t(a),this.marquee.isArmed){this.marquee.pointerMove(this.mouseNdc,a);return}this.transformTool.isDragging&&this.transformTool.pointerMove(this.currentRay(),a.altKey)},r=a=>{if(a.button!==0)return;t(a);let l=this.currentRay();if(this.transformTool.pointerDown(l)){this.beginPointerCapture(e,a.pointerId);return}if(le()==="select"){this.marquee.pointerDown(this.mouseNdc,a,e),this.beginPointerCapture(e,a.pointerId);return}this.handleAction(l,a)},n=a=>{if(this.marquee.isArmed){let l=this.marquee.pointerUp(this.mouseNdc);this.endPointerCapture(),l==="click"&&this.handleAction(this.currentRay(),a);return}this.transformTool.isDragging&&(this.transformTool.pointerUp(),this.endPointerCapture())},s=a=>{if(this.marquee.isArmed){this.marquee.cancel(),this.endPointerCapture();return}n(a)};return e.addEventListener("pointermove",i),e.addEventListener("pointerdown",r),e.addEventListener("pointerup",n),e.addEventListener("pointercancel",s),this.domDisposeFns.push(()=>e.removeEventListener("pointermove",i),()=>e.removeEventListener("pointerdown",r),()=>e.removeEventListener("pointerup",n),()=>e.removeEventListener("pointercancel",s)),!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 xo}from"three";var Xe=class{stage;constructor(e){this.stage=e}createDefaultCamera(){let e=window.innerWidth,t=window.innerHeight,i=new xo(e,t);return new x(m.ThirdPerson,i)}resolveCamera(e,t){return e||(t?t.cameraRef:this.createDefaultCamera())}buildCameraManager(e,...t){let i=new Le;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 Je=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"?ae.emit("stage:loading:start",t):e.type==="progress"?ae.emit("stage:loading:progress",t):e.type==="complete"&&ae.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 et=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)},T.on("entity:model:loaded",this.modelLoadedHandler)}observe(e){if(e.group||e.mesh){Y(e.options)||(this.scene?.addEntityGroup(e),q(e),F(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),q(i),F(i),Y(i.options)||this.onEntityReady?.(i),this.pendingEntities.delete(e)}dispose(){this.modelLoadedHandler&&(T.off("entity:model:loaded",this.modelLoadedHandler),this.modelLoadedHandler=null),this.pendingEntities.clear(),this.onEntityReady=null,this.scene=null}};import{StageBodyKind as xr}from"@zylem/behaviors/core";var Mo=200,tt=class o{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 oe){e.create();for(let i of e.getChildren())i instanceof W&&await this.spawnEntity(i);e.nodeSetup({me:e,globals:v(),camera:this.camera}),this.addEntityToStage(e);return}let t=e.create();oi(t),this.registerBehaviorLinks(t),this.ensureEnvironmentStatic(t),this.maybeAttachEntityPhysics(t);for(let i of e.getChildren())i instanceof W&&await this.spawnEntity(i);e.nodeSetup({me:e,globals:v(),camera:this.camera}),this.tryRegisterRenderStrategy(t),L(t)||this.scene.addEntityGroup(t),F(t),this.addEntityToStage(t),this.entityModelDelegate.observe(t),si(t)}handleLateModelReady(e){!this.world||!this.scene||!this.childrenMap.has(e.uuid)||(this.ensureEnvironmentStatic(e),this.maybeAttachEntityPhysics(e),this.tryRegisterRenderStrategy(e),L(e)||this.scene.addEntityGroup(e),F(e))}tryRegisterRenderStrategy(e){this.renderStrategy&&this.renderStrategy.register(e)}ensureEnvironmentStatic(e){if(Q(e.options)!=="environment")return;let t=e.options.collision??{};t.static!==!0&&(console.warn(`category 'environment' forces static collision for entity '${e.name||e.uuid}'`),e.options.collision={...t,static:!0}),e.bodyDesc&&e.bodyDesc.kind!==xr.Static&&(e.bodyDesc.kind=xr.Static)}maybeAttachEntityPhysics(e){if(!(!this.world||e.physicsAttached||!e.colliderDesc)){if(e instanceof ge){if(e.needsDeferredModelCollision())return;e.synchronizeRuntimeCollider()}this.world.addEntity(e)}}addEntityToStage(e){this.childrenMap.set(e.uuid,e),p.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),L(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(),T.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),L(i)||this.scene.addEntityGroup(i),ni(i),ai(i),this.addEntityToStage(i),this.entityModelDelegate.observe(i),!0}isDetached(e){return this.detachedMap.has(e)}evictOldestDetached(){for(;this.detachedMap.size>Mo;){let e=this.detachedMap.keys().next();if(e.done)return;let t=this.detachedMap.get(e.value);if(this.detachedMap.delete(e.value),!!t){try{t.entity.nodeDestroy?.({me:t.entity,globals:v()})}catch{}G(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 li?{...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(k(t)){this.handleEntityImmediatelyOrQueue(t);continue}if(typeof t=="function"){try{let i=t();k(i)?this.handleEntityImmediatelyOrQueue(i):ne(i)&&this.handlePromiseWithSpawnOnResolve(i)}catch(i){console.error("Error executing entity factory",i)}continue}ne(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)??o.EMPTY_BEHAVIOR_LINKS,createEntity:pt,getGlobals:v}):t=e,this.behaviorSystems.push(t)}destroyAll(){for(let t of this.behaviorSystems)t.destroy?.();this.behaviorSystems.length=0,this.behaviorSystemByKey.clear(),this.registeredSystemKeys.clear(),this.behaviorEntityIndex.clear(),this.behaviorLinksByUuid.clear();let e=[];this.childrenMap.forEach(t=>{try{t.nodeDestroy({me:t,globals:v()})}catch{}G(t),e.push(t.uuid)}),this.detachedMap.forEach(({entity:t})=>{try{t.nodeDestroy?.({me:t,globals:v()})}catch{}G(t)}),this.detachedMap.clear(),this.childrenMap.clear(),this.debugMap.clear(),this.entityAddedHandlers=[];for(let t of e)T.emit("entity:destroyed",{entityId:t});this._isLoaded=!1,this.scene=null,this.world=null,this.renderStrategy=null,this.camera=null,this.wasmStage=null}registerBehaviorLinks(e){if(!this.world||!this.scene||typeof e?.getBehaviorRefs!="function")return;let t=e.getBehaviorRefs();if(!Array.isArray(t)||t.length===0)return;let i=[];for(let r of t)i.push(this.linkBehaviorRef(e,r));this.behaviorLinksByUuid.set(e.uuid,i)}linkBehaviorRef(e,t){let i=t.descriptor.key,r={entity:e,ref:t},n=this.behaviorEntityIndex.get(i);n||(n=new Set,this.behaviorEntityIndex.set(i,n)),n.add(r);let s=this.behaviorSystemByKey.get(i);if(!s&&!this.registeredSystemKeys.has(i)){let a=t.descriptor.systemFactory({world:this.world,scene:this.scene,wasmStage:this.wasmStage,getBehaviorLinks:l=>this.behaviorEntityIndex.get(l)??o.EMPTY_BEHAVIOR_LINKS,createEntity:pt,getGlobals:v});s=a,this.behaviorSystems.push(a),this.behaviorSystemByKey.set(i,a),this.registeredSystemKeys.add(i)}return s?.attach?.(r),r}unlinkBehaviorLink(e){let t=e.ref?.descriptor?.key;if(!t)return;this.behaviorSystemByKey.get(t)?.detach?.(e);let i=this.behaviorEntityIndex.get(t);i&&(i.delete(e),i.size===0&&this.behaviorEntityIndex.delete(t))}syncBehaviorLinks(e){this.unregisterBehaviorLinks(e),this.registerBehaviorLinks(e)}attachBehaviorLink(e,t){if(!this.world||!this.scene||!e?.uuid)return!1;let i=this.behaviorLinksByUuid.get(e.uuid)??[];return i.some(r=>r.ref===t)?!1:(i.push(this.linkBehaviorRef(e,t)),this.behaviorLinksByUuid.set(e.uuid,i),!0)}detachBehaviorLink(e,t){let i=this.behaviorLinksByUuid.get(e?.uuid);if(!i)return!1;let r=i.findIndex(s=>s.ref===t);if(r===-1)return!1;let[n]=i.splice(r,1);return n&&this.unlinkBehaviorLink(n),i.length===0&&this.behaviorLinksByUuid.delete(e.uuid),!0}unregisterBehaviorLinks(e){let t=this.behaviorLinksByUuid.get(e?.uuid);if(t){for(let i of t)this.unlinkBehaviorLink(i);this.behaviorLinksByUuid.delete(e.uuid)}}};var Ro="Stage",it=class extends Ie{type=Ro;state={...pi};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=To(),this.cameraDelegate=new Xe(this),this.loadingDelegate=new Je,this.entityModelDelegate=new et,this.entityDelegate=new tt(this.loadingDelegate,this.entityModelDelegate);let t=Qi(e);this.camera=t.camera,this.cameras=t.cameras,this.entityDelegate.children=t.entities,t.asyncEntities.length&&this.entityDelegate.enqueue(...t.asyncEntities),this.state={...this.state,inputs:t.config.inputs,backgroundColor:t.config.backgroundColor,backgroundImage:t.config.backgroundImage,backgroundShader:t.config.backgroundShader,gravity:t.config.gravity,variables:t.config.variables,physicsRate:t.config.physicsRate,assetLoaders:t.config.assetLoaders,defaultLighting:t.config.defaultLighting,postProcessingEffects:t.config.postProcessingEffects,entities:[]},this.gravity=t.config.gravity??new Tr(0,0,0)}setState(){let{backgroundColor:e,backgroundImage:t}=this.state,i=e instanceof Mr?e:new Mr(e);ui(i),hi(t),mi(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 Ve(e,r,this.state);let n=this.gravity??new Tr(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 a=this.cameraManagerRef.primaryCamera;a&&(this.rendererManager.setPostProcessingEffects(this.state.postProcessingEffects??[]),this.rendererManager.setupPostProcessing(this.scene.scene,a.camera)),this.rendererManager.startRenderLoop(()=>{this.cameraManagerRef?.render(this.scene.scene)})}else await this.scene.setupCamera(this.scene.scene,r);let s=this.resolveRenderer(r);await I.configureGLTFRuntime({renderer:s,...Oe(this.state.assetLoaders?.gltf)}),this.entityModelDelegate.attach(this.scene,a=>this.entityDelegate.handleLateModelReady(a)),this.renderStrategy=new Pe,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;E("behaviorSystems",()=>{for(let n of this.entityDelegate.behaviorSystems)n.update(void 0,t)}),E("entityLoop",()=>{for(let n of this.entityDelegate.childrenMap.values()){let 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 a=n;a.transformStore&&vi(a,a.transformStore),n.markedForRemoval&&this.entityDelegate.removeEntityByUuid(n.uuid)}}),E("worldUpdate",()=>{i.update(e)}),E("behaviorPostUpdate",()=>{for(let n of this.entityDelegate.behaviorSystems)n.postUpdate?.(void 0,t)}),E("syncRenderPoses",()=>{Xi({_childrenMap:this.entityDelegate.childrenMap,_world:i})}),E("renderStrategy",()=>{this.renderStrategy?.update(i.interpolationAlpha)}),E("camera",()=>{this.cameraManagerRef?this.cameraManagerRef.update(t):this.cameraRef?.update(t)}),E("scene",()=>{r.update({delta:t})}),Bi()}outOfLoop(){this.debugUpdate()}debugUpdate(){ce()&&(mt("debugUpdate"),this.debugDelegate?.update(),ft())}_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,fi(),G(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 ko}from"valtio/vanilla";import{Vector3 as _o}from"three";var Do={backgroundColor:ve,backgroundImage:null,inputs:{p1:["gamepad-1","keyboard"],p2:["gamepad-2","keyboard"]},gravity:new _o(0,0,0),variables:{}},B=ko({...Do});function Rr(o){let e=Lo(),t={};return typeof o[0]=="object"&&(t=o.shift()??{}),[{...e,...t},...o]}function Lo(){return{backgroundColor:B.backgroundColor,backgroundImage:B.backgroundImage??null,inputs:B.inputs?{...B.inputs}:void 0,gravity:B.gravity,variables:B.variables?{...B.variables}:void 0}}var Ft=class{wrappedStage;options=[];_pendingEntities=[];setupCallbacks=[];updateCallbacks=[];destroyCallbacks=[];pendingLoadingCallbacks=[];eventDelegate=new qt;inputConfig=null;onInputConfigChanged=null;constructor(e){this.options=e,this.wrappedStage=null;let t=this.options[0];I.prepareGLTFRuntime(Oe(t?.assetLoaders?.gltf))}setInputConfiguration(...e){return this.inputConfig=Wt(...e),this.onInputConfigChanged&&this.onInputConfigChanged(),this}async load(e,t,i){be.entities=[];let r=[...this.options,...this._pendingEntities];this._pendingEntities=[],this.wrappedStage=new it(r),this.wrappedStage.wrapperRef=this,this.pendingLoadingCallbacks.forEach(c=>{this.wrappedStage.onLoading(c)}),this.pendingLoadingCallbacks=[];let n=t instanceof C?t.cameraRef:t;await this.wrappedStage.load(e,n,i);let s=null,a=!1,l=()=>{if(a=!1,!s?.length){s=null;return}let c=s;s=null,be.entities=[...be.entities,...c]};this.wrappedStage.onEntityAdded(c=>{if(Y(c.options))return;let d=this.wrappedStage.buildEntityState(c);s||(s=[]),s.push(d),a||(a=!0,queueMicrotask(l))},{replayExisting:!0}),this.applyLifecycleCallbacks()}applyLifecycleCallbacks(){this.wrappedStage&&(this.setupCallbacks.length>0&&(this.wrappedStage.setup=e=>{let t={...e,stage:this};this.setupCallbacks.forEach(i=>i(t))}),this.updateCallbacks.length>0&&(this.wrappedStage.update=e=>{let t={...e,stage:this};this.updateCallbacks.forEach(i=>i(t))}),this.destroyCallbacks.length>0&&(this.wrappedStage.destroy=e=>{let t={...e,stage:this};this.destroyCallbacks.forEach(i=>i(t))}))}async addEntities(e){this._pendingEntities.push(...e),this.wrappedStage&&this.wrappedStage.enqueue(...e)}add(...e){this.addToBlueprints(...e),this.addToStage(...e)}addToBlueprints(...e){this.wrappedStage||this.options.push(...e)}addToStage(...e){this.wrappedStage&&this.wrappedStage.enqueue(...e)}start(e){!this.wrappedStage||this.wrappedStage.hasSetup||this.wrappedStage.nodeSetup(e)}onUpdate(...e){return this.updateCallbacks.push(...e),this.wrappedStage&&(this.wrappedStage.update=t=>{let i={...t,stage:this};this.updateCallbacks.forEach(r=>r(i))}),this}onSetup(...e){return this.setupCallbacks.push(...e),this.wrappedStage&&(this.wrappedStage.setup=t=>{let i={...t,stage:this};this.setupCallbacks.forEach(r=>r(i))}),this}onDestroy(...e){return this.destroyCallbacks.push(...e),this.wrappedStage&&(this.wrappedStage.destroy=t=>{let i={...t,stage:this};this.destroyCallbacks.forEach(r=>r(i))}),this}onLoading(e){return this.wrappedStage?this.wrappedStage.onLoading(e):(this.pendingLoadingCallbacks.push(e),()=>{this.pendingLoadingCallbacks=this.pendingLoadingCallbacks.filter(t=>t!==e)})}getEntityByName(e,t){return this.wrappedStage?.getEntityByName(e)}addCamera(e,t){let i=e instanceof C?e.cameraRef:e;return this.wrappedStage?.addCamera(i,t)??null}removeCamera(e){return e instanceof C?this.wrappedStage?.removeCamera(e.cameraRef)??!1:this.wrappedStage?.removeCamera(e)??!1}setActiveCamera(e){return e instanceof C?this.wrappedStage?.setActiveCamera(e.cameraRef)??!1:this.wrappedStage?.setActiveCamera(e)??!1}getCamera(e){return this.wrappedStage?.getCamera(e)??null}dispatch(e,t){this.eventDelegate.dispatch(e,t),T.emit(e,t)}listen(e,t){return this.eventDelegate.listen(e,t)}dispose(){this.eventDelegate.dispose()}};function Td(...o){let e=Rr(o);return new Ft([...e])}export{Zo as a,Ce as b,Q as c,Y as d,L as e,Se as f,Pe as g,ns as h,m as i,A as j,xe as k,Z as l,N as m,ee as n,te as o,ie as p,re as q,O as r,Le as s,C as t,Ra as u,za as v,mn as w,Ft as x,Td as y};
@@ -1 +0,0 @@
1
- import{b as R,c as xt,d as Ot,e as wt,f as St,g as vt,h as Ct,j as Mt,r as p,s as f,t as c,v as b,w as X,x as Y,y as D,z as T}from"./chunk-KP6DLLJO.js";import{j as bt}from"./chunk-6FGXC4T6.js";import{e as Pt}from"./chunk-UUOPT2N4.js";import{d as N}from"./chunk-4QLJUQSJ.js";import{b as J,c as $,d as gt,h as F,i as E,j as ft}from"./chunk-7WRQ2UAN.js";import{BoxGeometry as Qt,CapsuleGeometry as te,ConeGeometry as Zt,CylinderGeometry as ee,Mesh as z,MeshStandardMaterial as ie,SphereGeometry as oe}from"three";function B(e,t=Symbol("mesh")){if(e.material||e.color){let i=new bt;if(i.build({...e.material,color:e.color??e.material?.color},t),i.materials.length>0)return i.materials}return[new ie]}function L(e,t){if(t.position){let i=F(t.position,$);e.position.set(i.x,i.y,i.z)}return e.castShadow=!0,e.receiveShadow=!0,e}function Et(e={}){let t=F(e.size,gt),i=new Qt(t.x,t.y,t.z),o=B(e);return L(new z(i,o.at(-1)),e)}function _t(e={}){let t=new oe(e.radius??1),i=B(e);return L(new z(t,i.at(-1)),e)}function Rt(e={}){let t=new Zt(e.radius??1,e.height??2,e.radialSegments??32),i=B(e);return L(new z(t,i.at(-1)),e)}function Dt(e={}){let t=new Zt(e.radius??1,e.height??2,4),i=B(e);return L(new z(t,i.at(-1)),e)}function Tt(e={}){let t=new ee(e.radiusTop??1,e.radiusBottom??1,e.height??2,e.radialSegments??32),i=B(e);return L(new z(t,i.at(-1)),e)}function zt(e={}){let t=new te(e.radius??.5,e.length??1,e.capSegments??10,e.radialSegments??20),i=B(e);return L(new z(t,i.at(-1)),e)}import{Vector3 as le}from"three";import{MeshStandardMaterial as ne,MeshBasicMaterial as se,MeshPhongMaterial as re}from"three";function ae(e){return e&&typeof e.getDebugInfo=="function"}var u=class{entity;constructor(t){this.entity=t}getPositionString(){if(this.entity.mesh){let{x:n,y:s,z:l}=this.entity.mesh.position;return`${n.toFixed(2)}, ${s.toFixed(2)}, ${l.toFixed(2)}`}let{x:t,y:i,z:o}=this.entity.options.position||{x:0,y:0,z:0};return`${t.toFixed(2)}, ${i.toFixed(2)}, ${o.toFixed(2)}`}getRotationString(){if(this.entity.mesh){let{x:s,y:l,z:r}=this.entity.mesh.rotation,a=m=>(m*180/Math.PI).toFixed(1);return`${a(s)}\xB0, ${a(l)}\xB0, ${a(r)}\xB0`}let{x:t,y:i,z:o}=this.entity.options.rotation||{x:0,y:0,z:0},n=s=>(s*180/Math.PI).toFixed(1);return`${n(t)}\xB0, ${n(i)}\xB0, ${n(o)}\xB0`}getMaterialInfo(){if(!this.entity.mesh||!this.entity.mesh.material)return{type:"none"};let t=Array.isArray(this.entity.mesh.material)?this.entity.mesh.material[0]:this.entity.mesh.material,i={type:t.type};return(t instanceof ne||t instanceof se||t instanceof re)&&(i.color=`#${t.color.getHexString()}`,i.opacity=t.opacity,i.transparent=t.transparent),"roughness"in t&&(i.roughness=t.roughness),"metalness"in t&&(i.metalness=t.metalness),i}getPhysicsInfo(){if(!this.entity.body)return null;let t={type:this.entity.body.bodyType(),mass:this.entity.body.mass(),isEnabled:this.entity.body.isEnabled(),isSleeping:this.entity.body.isSleeping()},i=this.entity.body.linvel();return t.velocity=`${i.x.toFixed(2)}, ${i.y.toFixed(2)}, ${i.z.toFixed(2)}`,t}buildDebugInfo(){let t={name:this.entity.name||this.entity.uuid,uuid:this.entity.uuid,position:this.getPositionString(),rotation:this.getRotationString(),material:this.getMaterialInfo()},i=this.getPhysicsInfo();if(i&&(t.physics=i),ae(this.entity)){let o=this.entity.getDebugInfo();return{...t,...o}}return t}};var Bt={...p,size:new le(1,1,1)},ce=Symbol("Box"),K=class e extends c{static type=ce;constructor(t){super(),this.options={...Bt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),{x:o,y:n,z:s}=this.options.size??{x:1,y:1,z:1};return{...i,type:String(e.type),size:`${o}, ${n}, ${s}`}}};function he(...e){let t=f(e,Bt),i=new K(t);return i.add(Et({size:t.size,material:t.material,color:t.color}),xt({size:t.size,static:t.collision?.static,sensor:t.collision?.sensor,canSleep:t.collision?.canSleep,ccdEnabled:t.collision?.ccdEnabled,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>he(o??{}))}var Lt={...p,radius:1},me=Symbol("Sphere"),Q=class e extends c{static type=me;constructor(t){super(),this.options={...Lt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??1;return{...i,type:String(e.type),radius:o.toFixed(2)}}};function pe(...e){let t=f(e,Lt),i=new Q(t);return i.add(_t({radius:t.radius,material:t.material,color:t.color}),Ot({radius:t.radius,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>pe(o??{}))}var It={...p,radius:1,height:2,radialSegments:32},ue=Symbol("Cone"),tt=class e extends c{static type=ue;constructor(t){super(),this.options={...It,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??1,n=this.options.height??2;return{...i,type:String(e.type),radius:o.toFixed(2),height:n.toFixed(2)}}};function de(...e){let t=f(e,It),i=new tt(t);return i.add(Rt({radius:t.radius,height:t.height,radialSegments:t.radialSegments,material:t.material,color:t.color}),wt({radius:t.radius,height:t.height,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>de(o??{}))}var kt={...p,radius:1,height:2},ye=Symbol("Pyramid"),et=class e extends c{static type=ye;constructor(t){super(),this.options={...kt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??1,n=this.options.height??2;return{...i,type:String(e.type),radius:o.toFixed(2),height:n.toFixed(2)}}};function ge(...e){let t=f(e,kt),i=new et(t);return i.add(Dt({radius:t.radius,height:t.height,material:t.material,color:t.color}),St({radius:t.radius,height:t.height,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>ge(o??{}))}var Ft={...p,radiusTop:1,radiusBottom:1,height:2,radialSegments:32},fe=Symbol("Cylinder"),it=class e extends c{static type=fe;constructor(t){super(),this.options={...Ft,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radiusTop??1,n=this.options.radiusBottom??1,s=this.options.height??2;return{...i,type:String(e.type),radiusTop:o.toFixed(2),radiusBottom:n.toFixed(2),height:s.toFixed(2)}}};function be(...e){let t=f(e,Ft),i=new it(t);return i.add(Tt({radiusTop:t.radiusTop,radiusBottom:t.radiusBottom,height:t.height,radialSegments:t.radialSegments,material:t.material,color:t.color}),vt({radiusTop:t.radiusTop,radiusBottom:t.radiusBottom,height:t.height,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>be(o??{}))}var Gt={...p,radius:.5,length:1,capSegments:10,radialSegments:20},xe=Symbol("Pill"),ot=class e extends c{static type=xe;constructor(t){super(),this.options={...Gt,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.radius??.5,n=this.options.length??1;return{...i,type:String(e.type),radius:o.toFixed(2),length:n.toFixed(2)}}};function Oe(...e){let t=f(e,Gt),i=new ot(t);return i.add(zt({radius:t.radius,length:t.length,capSegments:t.capSegments,radialSegments:t.radialSegments,material:t.material,color:t.color}),Ct({radius:t.radius,length:t.length,static:t.collision?.static,sensor:t.collision?.sensor,gravityScale:t.collision?.gravityScale,lockRotations:t.collision?.lockRotations,lockTranslations:t.collision?.lockTranslations,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>Oe(o??{}))}import{Group as we,RingGeometry as Se}from"three";var Ht={...p,innerRadius:0,outerRadius:1,thetaSegments:32},nt=class extends X{collider(t){let i=t.outerRadius??1;return{shape:{type:"cylinder",halfHeight:.1/2,radius:i}}}},st=class extends Y{build(t){let i=t.innerRadius??0,o=t.outerRadius??1,n=t.thetaSegments??32,s=new Se(i,o,n);return s.rotateX(-Math.PI/2),s}},rt=class extends D{createEntity(t){return new G(t)}build(){let t=super.build();return t.mesh&&!t.group&&(t.group=new we,t.group.add(t.mesh)),t}},ve=Symbol("Disk"),G=class e extends c{static type=ve;constructor(t){super(),this.options={...Ht,...t}}buildInfo(){let i=new u(this).buildDebugInfo(),o=this.options.innerRadius??0,n=this.options.outerRadius??1;return{...i,type:String(e.type),innerRadius:o.toFixed(2),outerRadius:n.toFixed(2)}}};function Ce(...e){return T({args:e,defaultConfig:Ht,EntityClass:G,BuilderClass:rt,MeshBuilderClass:st,CollisionBuilderClass:nt,entityType:G.type,cloneFactory:t=>Ce(t??{})})}import{PlaneGeometry as Pe,Vector2 as Vt,Vector3 as At}from"three";import{BufferGeometry as Me,Float32BufferAttribute as at}from"three";var W=class e extends Me{constructor(t=1,i=1,o=1,n=1){super(),this.type="XZPlaneGeometry",this.parameters={width:t,height:i,widthSegments:o,heightSegments:n};let s=t/2,l=i/2,r=Math.floor(o),a=Math.floor(n),m=r+1,C=a+1,M=t/r,x=i/a,O=[],w=[],d=[],P=[];for(let y=0;y<C;y++){let h=y*x-l;for(let S=0;S<m;S++){let Z=S*M-s;w.push(Z,0,h),d.push(0,1,0),P.push(S/r),P.push(1-y/a)}}for(let y=0;y<a;y++)for(let h=0;h<r;h++){let S=h+m*y,Z=h+m*(y+1),g=h+1+m*(y+1),v=h+1+m*y;O.push(S,Z,v),O.push(Z,g,v)}this.setIndex(O),this.setAttribute("position",new at(w,3)),this.setAttribute("normal",new at(d,3)),this.setAttribute("uv",new at(P,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new e(t.width,t.height,t.widthSegments,t.heightSegments)}};var U=4,Nt={...p,tile:new Vt(10,10),repeat:new Vt(1,1),collision:{static:!0},subdivisions:U,randomizeHeight:!1,heightScale:1};function $t(e){let t=e.subdivisions??U,i=e.heightMap2D,o=e.heightMap,n=e.subdivisionsX??t,s=e.subdivisionsZ??t;return i&&i.length>0&&i[0]?.length>0?(s=i.length-1,n=i[0].length-1):o&&o.length>0&&(n=o.length-1),{subdivisionsX:n,subdivisionsZ:s}}var lt=class extends X{collider(t){let i=E(t.tile,J),{subdivisionsX:o,subdivisionsZ:n}=$t(t),s=new At(i.x,1,i.y),l=t._builders?.meshBuilder?.heightData??new Float32Array((o+1)*(n+1));return{shape:{type:"heightfield",rows:o,cols:n,heights:l,scale:[s.x,1,s.z]}}}},ct=class extends Y{heightData=new Float32Array;columnsRows=new Map;subdivisionsX=U;subdivisionsZ=U;build(t){let i=E(t.tile,J),{subdivisionsX:o,subdivisionsZ:n}=$t(t);this.subdivisionsX=o,this.subdivisionsZ=n;let s=new At(i.x,1,i.y),l=t.heightScale??1,r=new W(s.x,s.z,o,n),a=new Pe(s.x,s.z,o,n),m=o>0?s.x/o:1,C=n>0?s.z/n:1,M=r.attributes.position.array,x=a.attributes.position.array,O=new Map,w=t.heightMap2D,d=t.heightMap,P=t.randomizeHeight??!1,y=(h,S)=>h<0?0:h>S?S:h;for(let h=0;h<x.length;h+=3){let S=x[h],Z=x[h+1],g=y(Math.round((S+s.x/2)/m),o),v=y(Math.round((s.z/2-Z)/C),n),_=0;if(w){let yt=w[v];yt&&(_=yt[g]??0)}else d&&d.length>0?_=d[g]??0:P&&(_=Math.random()*4);let k=_*l;x[h+2]=k,M[h+1]=k,O.get(v)||O.set(v,new Map),O.get(v).set(g,k)}return this.columnsRows=O,r}postBuild(){let t=[];for(let i=0;i<=this.subdivisionsX;++i)for(let o=0;o<=this.subdivisionsZ;++o){let n=this.columnsRows.get(o);t.push(n?.get(i)??0)}this.heightData=new Float32Array(t)}},ht=class extends D{createEntity(t){return new H(t)}},Ze=Symbol("Plane"),H=class extends c{static type=Ze;constructor(t){super(),this.options=R(Nt,t)}};function Ee(...e){return T({args:e,defaultConfig:Nt,EntityClass:H,BuilderClass:ht,MeshBuilderClass:ct,CollisionBuilderClass:lt,entityType:H.type,cloneFactory:t=>Ee(t??{})})}import{Vector3 as mt}from"three";var Xt={...p,size:new mt(1,1,1),collision:{static:!0}},_e=Symbol("Zone"),pt=class extends c{static type=_e;_enteredZone=new Map;_exitedZone=new Map;_zoneEntities=new Map;constructor(t){super(),this.options=R(Xt,t)}getSelectionBounds(t){let i=ft(this.options.size,new mt(1,1,1)),o=this.getPose()?.position??F(this.options.position,$);return t.setFromCenterAndSize(new mt(o.x,o.y,o.z),i),Pt(t)}handlePostCollision({delta:t}){return this._enteredZone.forEach((i,o)=>{this.exited(t,o)}),this._enteredZone.size>0}handleIntersectionEvent({other:t,delta:i}){this._enteredZone.get(t.uuid)?this.held(i,t):(this.entered(t),this._zoneEntities.set(t.uuid,t))}onEnter(t){return this.options.onEnter=t,this}onHeld(t){return this.options.onHeld=t,this}onExit(t){return this.options.onExit=t,this}entered(t){this._enteredZone.set(t.uuid,1),this.options.onEnter&&this.options.onEnter({self:this,visitor:t,globals:N.globals})}exited(t,i){let o=this._exitedZone.get(i);if(o&&o>1+t){this._exitedZone.delete(i),this._enteredZone.delete(i);let n=this._zoneEntities.get(i);this.options.onExit&&this.options.onExit({self:this,visitor:n,globals:N.globals});return}this._exitedZone.set(i,1+t)}held(t,i){let o=this._enteredZone.get(i.uuid)??0;this._enteredZone.set(i.uuid,o+t),this._exitedZone.set(i.uuid,1),this.options.onHeld&&this.options.onHeld({delta:t,self:this,visitor:i,globals:N.globals,heldTime:o})}};function Re(...e){let t=f(e,Xt),i=new pt(t);return i.add(Mt({size:t.size,static:t.collision?.static??!0,collisionType:t.collisionType,collisionFilter:t.collisionFilter})),b(i,o=>Re(o??{}))}import{Color as Yt,Group as De,Sprite as Te,SpriteMaterial as ze,CanvasTexture as Wt,LinearFilter as j,Vector2 as q,ClampToEdgeWrapping as Ut,ShaderMaterial as jt,Mesh as Be,PlaneGeometry as Le,Vector3 as qt}from"three";var I={position:void 0,width:120,height:48,fillColor:"#FFFFFF",strokeColor:null,strokeWidth:0,radius:0,padding:0,stickToViewport:!0,screenPosition:new q(24,24),zDistance:1,anchor:new q(0,0)},ut=class extends D{createEntity(t){return new V(t)}},Ie=Symbol("Rect"),V=class e extends c{static type=Ie;_sprite=null;_mesh=null;_texture=null;_canvas=null;_ctx=null;_cameraRef=null;_lastCanvasW=0;_lastCanvasH=0;constructor(t){super(),this.options=R(I,t),this.options.screenPosition=E(this.options.screenPosition,I.screenPosition),this.options.anchor=E(this.options.anchor,I.anchor),this.group=new De,this.createSprite(),this.prependSetup(this.rectSetup.bind(this)),this.prependUpdate(this.rectUpdate.bind(this))}createSprite(){this._canvas=document.createElement("canvas"),this._ctx=this._canvas.getContext("2d"),this._texture=new Wt(this._canvas),this._texture.minFilter=j,this._texture.magFilter=j;let t=new ze({map:this._texture,transparent:!0,depthTest:!1,depthWrite:!1,alphaTest:.5});this._sprite=new Te(t),this.group?.add(this._sprite),this.redrawRect()}redrawRect(){if(!this._canvas||!this._ctx)return;let t=Math.max(2,Math.floor(this.options.width??120)),i=Math.max(2,Math.floor(this.options.height??48)),o=this.options.padding??0,n=this.options.strokeWidth??0,s=t+o*2+n,l=i+o*2+n,r=Math.max(2,s),a=Math.max(2,l),m=r!==this._lastCanvasW||a!==this._lastCanvasH;this._canvas.width=r,this._canvas.height=a,this._lastCanvasW=r,this._lastCanvasH=a,this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height);let C=Math.max(0,this.options.radius??0),M=Math.floor(o+n/2),x=Math.floor(o+n/2),O=Math.floor(t),w=Math.floor(i);if(this._ctx.beginPath(),C>0?this.roundedRectPath(this._ctx,M,x,O,w,C):this._ctx.rect(M,x,O,w),this.options.fillColor&&(this._ctx.fillStyle=this.toCssColor(this.options.fillColor),this._ctx.fill()),this.options.strokeColor&&n>0&&(this._ctx.lineWidth=n,this._ctx.strokeStyle=this.toCssColor(this.options.strokeColor),this._ctx.stroke()),this._texture){if(m&&(this._texture.dispose(),this._texture=new Wt(this._canvas),this._texture.minFilter=j,this._texture.magFilter=j,this._texture.wrapS=Ut,this._texture.wrapT=Ut,this._sprite&&this._sprite.material instanceof jt)){let d=this._sprite.material;d.uniforms?.tDiffuse&&(d.uniforms.tDiffuse.value=this._texture),d.uniforms?.iResolution&&d.uniforms.iResolution.value.set(this._canvas.width,this._canvas.height,1)}this._texture.image=this._canvas,this._texture.needsUpdate=!0,this._sprite&&this._sprite.material&&(this._sprite.material.map=this._texture,this._sprite.material.needsUpdate=!0)}}getWidth(){return this.options.width??0}getHeight(){return this.options.height??0}roundedRectPath(t,i,o,n,s,l){let r=Math.min(l,Math.floor(Math.min(n,s)/2));t.moveTo(i+r,o),t.lineTo(i+n-r,o),t.quadraticCurveTo(i+n,o,i+n,o+r),t.lineTo(i+n,o+s-r),t.quadraticCurveTo(i+n,o+s,i+n-r,o+s),t.lineTo(i+r,o+s),t.quadraticCurveTo(i,o+s,i,o+s-r),t.lineTo(i,o+r),t.quadraticCurveTo(i,o,i+r,o)}toCssColor(t){return typeof t=="string"?t:`#${(t instanceof Yt?t:new Yt(t)).getHexString()}`}getResolution(){try{let t=this._cameraRef?.renderer?.domElement;if(t)return{width:t.clientWidth||1,height:t.clientHeight||1}}catch{}return{width:this._cameraRef?.screenResolution?.x??1,height:this._cameraRef?.screenResolution?.y??1}}rectSetup(t){if(this._cameraRef=t.camera,this.options.stickToViewport&&this._cameraRef&&this._cameraRef.camera.add(this.group),this.materials?.length&&this._sprite){let i=this.materials[0];i instanceof jt&&(i.transparent=!0,i.depthTest=!1,i.depthWrite=!1,this._texture&&(i.uniforms?.tDiffuse&&(i.uniforms.tDiffuse.value=this._texture),i.uniforms?.iResolution&&this._canvas&&i.uniforms.iResolution.value.set(this._canvas.width,this._canvas.height,1)),this._mesh=new Be(new Le(1,1),i),this.group?.add(this._mesh),this._sprite.visible=!1)}}rectUpdate(t){if(this._sprite){if(this._cameraRef&&this.options.bounds){let i=this.computeScreenBoundsFromOptions(this.options.bounds);if(i){let{x:o,y:n,width:s,height:l}=i,r=Math.max(2,Math.floor(s)),a=Math.max(2,Math.floor(l)),m=r!==(this.options.width??0)||a!==(this.options.height??0);this.options.screenPosition=new q(Math.floor(o),Math.floor(n)),this.options.width=r,this.options.height=a,this.options.anchor=new q(0,0),m&&this.redrawRect()}}this.options.stickToViewport&&this._cameraRef&&this.updateStickyTransform()}}updateStickyTransform(){if(!this._sprite||!this._cameraRef)return;let t=this._cameraRef.camera,{width:i,height:o}=this.getResolution(),n=E(this.options.screenPosition,I.screenPosition),s=n.x,l=n.y,r=Math.max(.001,this.options.zDistance??1),a=1,m=1;if(t.isPerspectiveCamera){let g=t,v=Math.tan(g.fov*Math.PI/180/2)*r;a=v*g.aspect,m=v}else if(t.isOrthographicCamera){let g=t;a=(g.right-g.left)/2,m=(g.top-g.bottom)/2}let C=s/i*2-1,M=1-l/o*2,x=C*a,O=M*m,w=1,d=1;if(this._canvas){let v=m*2/o,_=this._canvas.height;d=Math.max(1e-4,_*v);let k=this._canvas.width/this._canvas.height;w=d*k,this._sprite.scale.set(w,d,1),this._mesh&&this._mesh.scale.set(w,d,1)}let P=E(this.options.anchor,I.anchor),y=Math.min(100,Math.max(0,P.x))/100,h=Math.min(100,Math.max(0,P.y))/100,S=(.5-y)*w,Z=(h-.5)*d;this.group?.position.set(x+S,O+Z,-r)}worldToScreen(t){if(!this._cameraRef)return{x:0,y:0};let i=this._cameraRef.camera,{width:o,height:n}=this.getResolution(),s=t.clone().project(i),l=(s.x+1)/2*o,r=(1-s.y)/2*n;return{x:l,y:r}}computeScreenBoundsFromOptions(t){if(!this._cameraRef)return null;if(t.screen)return{...t.screen};if(t.world){let{left:i,right:o,top:n,bottom:s,z:l=0}=t.world,r=this.worldToScreen(new qt(i,n,l)),a=this.worldToScreen(new qt(o,s,l)),m=Math.min(r.x,a.x),C=Math.min(r.y,a.y),M=Math.abs(a.x-r.x),x=Math.abs(a.y-r.y);return{x:m,y:C,width:M,height:x}}return null}updateRect(t){this.options={...this.options,...t},this.redrawRect(),this.options.stickToViewport&&this._cameraRef&&this.updateStickyTransform()}buildInfo(){return{...new u(this).buildDebugInfo(),type:String(e.type),width:this.options.width??0,height:this.options.height??0,sticky:this.options.stickToViewport}}};function ke(...e){return T({args:e,defaultConfig:{...I},EntityClass:V,BuilderClass:ut,entityType:V.type,cloneFactory:t=>ke(t??{})})}import{AmbientLight as Fe,DirectionalLight as Ge,Group as He,HemisphereLight as Ve,Object3D as Ae,PointLight as Ne,SpotLight as $e}from"three";var Xe=Symbol("Light"),Ye={x:0,y:0,z:0},A=16777215,We={mapSize:2048,near:.1,far:500,bias:0,radius:1,left:-100,right:100,top:100,bottom:-100},Ue={mapSize:1024,near:.1,far:500,bias:0,radius:1},dt=class extends c{static type=Xe;light=null;lightTarget=null;constructor(t){super(),this.options={...t}}create(){super.create();let t=new He,{light:i,target:o}=je(this.options);return t.add(i),o&&t.add(o),this.group=t,this.light=i,this.lightTarget=o,this}_cleanup(t){this.light?.shadow?.map?.dispose?.(),this.light=null,this.lightTarget=null,super._cleanup(t)}};function je(e){switch(e.type){case"ambient":return{light:qe(e),target:null};case"hemisphere":return{light:Je(e),target:null};case"directional":return Ke(e);case"point":return{light:Qe(e),target:null};case"spot":return ti(e)}}function qe(e){let t=new Fe(e.color??A,e.intensity??1);return e.name&&(t.name=e.name),t}function Je(e){let t=e.skyColor??e.color??A,i=e.groundColor??0,o=new Ve(t,i,e.intensity??1);return e.name&&(o.name=e.name),o}function Ke(e){let t=new Ge(e.color??A,e.intensity??1);e.name&&(t.name=e.name),ei(t,e.castShadow??!1,e.shadow);let i=Jt(e.position,e.target);return i&&(t.target=i),{light:t,target:i}}function Qe(e){let t=new Ne(e.color??A,e.intensity??1,e.distance,e.decay);return e.name&&(t.name=e.name),Kt(t,e.castShadow??!1,e.shadow),t}function ti(e){let t=new $e(e.color??A,e.intensity??1,e.distance,e.angle,e.penumbra,e.decay);e.name&&(t.name=e.name),Kt(t,e.castShadow??!1,e.shadow);let i=Jt(e.position,e.target);return i&&(t.target=i),{light:t,target:i}}function Jt(e,t){if(!t)return null;let i=e??Ye,o=new Ae;return o.position.set(t.x-i.x,t.y-i.y,t.z-i.z),o}function ei(e,t,i){if(!t){e.castShadow=!1;return}e.castShadow=!0;let o={...We,...i??{}};e.shadow.mapSize.set(o.mapSize,o.mapSize),e.shadow.camera.near=o.near,e.shadow.camera.far=o.far,e.shadow.camera.left=o.left,e.shadow.camera.right=o.right,e.shadow.camera.top=o.top,e.shadow.camera.bottom=o.bottom,e.shadow.bias=o.bias,e.shadow.radius=o.radius,e.shadow.camera.updateProjectionMatrix()}function Kt(e,t,i){if(!t){e.castShadow=!1;return}e.castShadow=!0;let o={...Ue,...i??{}};e.shadow.mapSize.set(o.mapSize,o.mapSize),e.shadow.camera.near=o.near,e.shadow.camera.far=o.far,e.shadow.bias=o.bias,e.shadow.radius=o.radius,e.shadow.camera.updateProjectionMatrix()}function jo(e){return new dt(e)}export{u as a,Et as b,_t as c,Rt as d,Dt as e,Tt as f,zt as g,ce as h,K as i,he as j,me as k,Q as l,pe as m,ue as n,tt as o,de as p,ye as q,et as r,ge as s,fe as t,it as u,be as v,xe as w,ot as x,Oe as y,ve as z,G as A,Ce as B,Ze as C,H as D,Ee as E,_e as F,pt as G,Re as H,Ie as I,V as J,ke as K,Xe as L,dt as M,jo as N};
@@ -1 +0,0 @@
1
- import{b as c,o as b}from"./chunk-2HSR5XDQ.js";import{B as y,E as g,H as f,K as x,N as z,j as s,m as p,p as d,s as h,v as u,y as m}from"./chunk-STVEILJJ.js";import{a as w}from"./chunk-VUJXR5K5.js";import{Vector3 as S}from"three";var C='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">';function t(r){return`${C}${r}</svg>`}var i={box:t('<path d="M12 2.5 21 7v10l-9 4.5L3 17V7z"/><path d="M3 7l9 4.5L21 7"/><path d="M12 11.5v10"/>'),sphere:t('<circle cx="12" cy="12" r="9"/><ellipse cx="12" cy="12" rx="9" ry="3.5"/>'),cone:t('<path d="M12 3 20 18H4z"/><ellipse cx="12" cy="18" rx="8" ry="3"/>'),pyramid:t('<path d="M12 3 21 19H3z"/><path d="M12 3v16"/><path d="M3 19l9-5 9 5"/>'),cylinder:t('<ellipse cx="12" cy="6" rx="7" ry="3"/><path d="M5 6v12"/><path d="M19 6v12"/><ellipse cx="12" cy="18" rx="7" ry="3"/>'),pill:t('<rect x="7" y="3" width="10" height="18" rx="5"/><path d="M7 12h10"/>'),disk:t('<ellipse cx="12" cy="12" rx="9" ry="4"/><ellipse cx="12" cy="12" rx="3" ry="1.3"/>'),plane:t('<path d="M2 17 12 11l10 6-10 5z"/><path d="M12 11V4"/>'),zone:t('<rect x="3.5" y="3.5" width="17" height="17" rx="2" stroke-dasharray="3 2.5"/>'),rect:t('<rect x="3.5" y="6" width="17" height="12" rx="1.5"/>'),light:t('<circle cx="12" cy="9" r="4.5"/><path d="M12 2v1.5"/><path d="M12 14.5V22"/><path d="M4.9 4.9 6 6"/><path d="M19.1 4.9 18 6"/><path d="M2 9h1.5"/><path d="M20.5 9H22"/>')};function n(r,e,v,k,M,P){return{id:r,label:e,description:v,icon:k,group:"Shapes",tags:P,defaultProps:{size:{x:1,y:1,z:1}},create:M}}function o(r){let e=r.size;return new S(e?.x??1,e?.y??1,e?.z??1)}var T=[n("box","Box","Cuboid mesh with a matching box collider.",i.box,({position:r,props:e})=>s({position:r,size:o(e),...e}),["cube","block","platform","wall"]),n("sphere","Sphere","Ball mesh with a sphere collider.",i.sphere,({position:r,props:e})=>p({position:r,size:o(e),...e}),["ball","orb","round"]),n("cone","Cone","Cone mesh with a cone collider.",i.cone,({position:r,props:e})=>d({position:r,size:o(e),...e}),["spike","point"]),n("pyramid","Pyramid","Four-sided pyramid mesh and collider.",i.pyramid,({position:r,props:e})=>h({position:r,size:o(e),...e}),["tetra","spike"]),n("cylinder","Cylinder","Cylinder mesh with a matching collider.",i.cylinder,({position:r,props:e})=>u({position:r,size:o(e),...e}),["tube","pillar","column"]),n("pill","Pill","Capsule mesh with a capsule collider.",i.pill,({position:r,props:e})=>m({position:r,size:o(e),...e}),["capsule","character"]),n("disk","Disk","Flat cylinder, useful for pucks and platforms.",i.disk,({position:r,props:e})=>y({position:r,size:o(e),...e}),["puck","coin","circle"]),{id:"plane",label:"Plane",description:"Static ground plane with a tiled surface.",icon:i.plane,group:"Scene",tags:["ground","floor","terrain"],defaultProps:{size:{x:10,y:1,z:10}},create:({position:r,props:e})=>g({position:r,size:o(e),...e})},{id:"zone",label:"Zone",description:"Invisible sensor volume that reports overlaps.",icon:i.zone,group:"Scene",tags:["trigger","sensor","area"],defaultProps:{size:{x:2,y:2,z:2}},create:({position:r,props:e})=>f({position:r,size:o(e),...e})},{id:"rect",label:"Rect",description:"Flat rectangle for 2D scenes and UI panels.",icon:i.rect,group:"Scene",tags:["quad","panel","2d"],defaultProps:{size:{x:1,y:1,z:1}},create:({position:r,props:e})=>x({position:r,size:o(e),...e})},{id:"light",label:"Point Light",description:"Point light placed at the click position.",icon:i.light,group:"Scene",tags:["lamp","illumination"],defaultProps:{intensity:1},create:({position:r,props:e})=>z({type:"point",position:r,...e})}],a=null;function Y(){return a||(a=c(T),a)}var l=null;function j(){return l||(l=b("behavior",w),l)}export{T as a,Y as b,j as c};