@zylem/game-lib 0.9.7 → 0.9.8

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 (56) hide show
  1. package/dist/api/game-lib.api.json +179 -219
  2. package/dist/api/game-lib.api.md +11 -22
  3. package/dist/api/game-lib.d.ts +63 -114
  4. package/dist/api/game-lib.typedoc.json +70212 -61079
  5. package/dist/audio.js +1 -1
  6. package/dist/bridge.d.ts +14 -2
  7. package/dist/bridge.js +1 -1
  8. package/dist/catalog.js +1 -1
  9. package/dist/chunk-26EJFYDX.js +1 -0
  10. package/dist/chunk-2NO4YCLR.js +1 -0
  11. package/dist/{chunk-63T3K5EQ.js → chunk-3LXDHDJB.js} +1 -1
  12. package/dist/{chunk-CVKEWWIH.js → chunk-5NQGXW75.js} +1 -1
  13. package/dist/chunk-5WRFDAZN.js +1 -0
  14. package/dist/{chunk-OCQ7A5IK.js → chunk-B6GDESCB.js} +1 -1
  15. package/dist/chunk-BIZOIGCZ.js +1 -0
  16. package/dist/chunk-BJYXY2FB.js +1 -0
  17. package/dist/{chunk-AJSIVGDX.js → chunk-CI7A5N6G.js} +1 -1
  18. package/dist/chunk-GQXYD2JG.js +1 -0
  19. package/dist/{chunk-SD7EHS4W.js → chunk-ICJ2E2OV.js} +1 -1
  20. package/dist/chunk-NPA6GUGE.js +24 -0
  21. package/dist/chunk-SIRFF4DY.js +1 -0
  22. package/dist/chunk-T6O2SGH5.js +1 -0
  23. package/dist/{chunk-IHGRFR4H.js → chunk-UNCP6V7I.js} +1 -1
  24. package/dist/{chunk-MJ7RGE47.js → chunk-YFXNZ2RS.js} +1 -1
  25. package/dist/chunk-YW2GTHCV.js +19 -0
  26. package/dist/{chunk-DYD7MDWO.js → chunk-YWH5HQDT.js} +1 -1
  27. package/dist/cinematics.d.ts +1 -2
  28. package/dist/core.d.ts +13 -12
  29. package/dist/core.js +1 -1
  30. package/dist/{debug-state-BgX5Q0Ff.d.ts → debug-state-JRneI6c2.d.ts} +1 -1
  31. package/dist/debug.d.ts +23 -2
  32. package/dist/debug.js +1 -1
  33. package/dist/entity.js +1 -1
  34. package/dist/fbx-loader-SDI6QYTS.js +1 -0
  35. package/dist/game-default-AF5QFXSD.js +1 -0
  36. package/dist/{game-CmkhPP-9.d.ts → game-uQd7k6-m.d.ts} +1 -1
  37. package/dist/gaussian-splat-loader-ACFJKCCL.js +1 -0
  38. package/dist/geometry-mesh-loader-XDJV77TU.js +1 -0
  39. package/dist/graphics.js +1 -1
  40. package/dist/obj-loader-SI5RVY24.js +1 -0
  41. package/dist/placement.js +1 -1
  42. package/dist/public.d.ts +4 -5
  43. package/dist/public.js +1 -1
  44. package/dist/sog-loader-BZFMQ3ZB.js +1 -0
  45. package/dist/{stage-CCGJh9TD.d.ts → stage-Dez16Gxm.d.ts} +10 -9
  46. package/dist/usd-loader-PCBATNPM.js +1 -0
  47. package/dist/web-components.d.ts +3 -4
  48. package/package.json +5 -2
  49. package/dist/chunk-47HAZZWF.js +0 -1
  50. package/dist/chunk-JJEYLGD2.js +0 -24
  51. package/dist/chunk-KL7NGD76.js +0 -1
  52. package/dist/chunk-M2FZ224T.js +0 -1
  53. package/dist/chunk-Q22Z4PBD.js +0 -19
  54. package/dist/chunk-UKNMIHAP.js +0 -1
  55. package/dist/game-default-LAGMEHNQ.js +0 -1
  56. package/dist/level-types-D10LiOcn.d.ts +0 -91
package/dist/audio.js CHANGED
@@ -1 +1 @@
1
- import{a as s,b as t,c as F,d as G,e as H,f as I}from"./chunk-ZZO4CKRU.js";import{a as u,b as v,c as w,d as x,e as y,f as z,g as A,h as B,i as C,j as D,k as E}from"./chunk-NVVLLWIM.js";import{a as m,c as n,d as o,e as p,f as q,g as r}from"./chunk-2PFNNGTV.js";import{a,b,c,d,e,f,g,h,i,j,k,l}from"./chunk-QGIYILYI.js";import"./chunk-WOT6VMZA.js";export{A as AudioClipSchema,I as Howl,w as InstrumentDefinitionSchema,v as InstrumentEffectSchema,u as InstrumentPresetSchema,z as NoteClipSchema,B as SongClipSchema,E as SongDefinitionSchema,D as SongLoopSchema,x as SongNoteSchema,y as SongTrackSchema,C as TimeSignatureSchema,j as audibleTrackIds,a as beatsPerBar,c as beatsToSeconds,l as clipsAt,m as createInstrument,q as createSongPlayer,h as dbToGain,G as encodeWav,H as encodeWavBlob,o as ensureAudio,i as gainToDb,r as getActiveSongPlayer,p as isAudioReady,n as loadTone,f as midiToFrequency,g as midiToNoteName,t as pingPongBeep,F as renderSong,s as ricochetSound,k as scheduleSong,d as secondsToBeats,b as songLengthBeats,e as songLengthSeconds};
1
+ import{a as s,b as t,c as F,d as G,e as H,f as I}from"./chunk-ZZO4CKRU.js";import{a as m,c as n,d as o,e as p,f as q,g as r}from"./chunk-2PFNNGTV.js";import{a as u,b as v,c as w,d as x,e as y,f as z,g as A,h as B,i as C,j as D,k as E}from"./chunk-NVVLLWIM.js";import{a,b,c,d,e,f,g,h,i,j,k,l}from"./chunk-QGIYILYI.js";import"./chunk-WOT6VMZA.js";export{A as AudioClipSchema,I as Howl,w as InstrumentDefinitionSchema,v as InstrumentEffectSchema,u as InstrumentPresetSchema,z as NoteClipSchema,B as SongClipSchema,E as SongDefinitionSchema,D as SongLoopSchema,x as SongNoteSchema,y as SongTrackSchema,C as TimeSignatureSchema,j as audibleTrackIds,a as beatsPerBar,c as beatsToSeconds,l as clipsAt,m as createInstrument,q as createSongPlayer,h as dbToGain,G as encodeWav,H as encodeWavBlob,o as ensureAudio,i as gainToDb,r as getActiveSongPlayer,p as isAudioReady,n as loadTone,f as midiToFrequency,g as midiToNoteName,t as pingPongBeep,F as renderSong,s as ricochetSound,k as scheduleSong,d as secondsToBeats,b as songLengthBeats,e as songLengthSeconds};
package/dist/bridge.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import { BridgePose, SceneOperationPayload, BridgeNdc, EntitySummaryPayload, EntityApplySwatchPayload, SwatchApplyResult, SceneOperationEntry, CutsceneLoadPayload, CameraPosePayload, CutsceneStatusPayload, CutsceneViewPayload, GameConfigPayload, GameLoadingPayload, GameVariablePayload, GameNoticePayload, StageSnapshotPayload, EntityThumbnailPayload, EntityTypeDescriptor } from '@zylem/bridge';
1
+ import { BridgePose, SceneOperationPayload, BridgeNdc, EntitySummaryPayload, EntityApplySwatchPayload, SwatchApplyResult, SceneOperationEntry, CutsceneLoadPayload, CameraPosePayload, LevelSyncPayload, LevelDocument, CutsceneStatusPayload, CutsceneViewPayload, GameConfigPayload, GameLoadingPayload, GameVariablePayload, GameNoticePayload, StageSnapshotPayload, EntityThumbnailPayload, EntityTypeDescriptor } from '@zylem/bridge';
2
2
  export { BRIDGE_READY_EVENT, BridgeChannel, BridgeDebugTool, BridgeHandler, GameLoadingPayload as BridgeLoadingPayload, BridgeMessageType, BridgeMessages, BridgeNdc, BridgeVec3, CameraPosePayload, CutsceneLoadPayload, CutscenePlaybackState, CutsceneStatusPayload, CutsceneViewPayload, EditorToGameMessages, EntityApplySwatchPayload, EntityPickPayload, EntityPickResultPayload, EntitySummaryPayload, EntitySwatchAppliedPayload, EntityThumbnailPayload, GameConfigPayload, GameToEditorMessages, GameVariablePayload, StageConfigPayload, StageSnapshotPayload, SwatchApplyFailureReason, SwatchApplyResult, SwatchKind, SwatchSpec, ZylemBridge, announceBridgeReady, applySwatchesToSelection, getZylemBridge } from '@zylem/bridge';
3
- import { a as LevelSyncPayload, L as LevelDocument } from './level-types-D10LiOcn.js';
4
3
  import { G as GameEntity } from './entity-CY75JJSw.js';
5
4
  import 'three';
6
5
  import '@zylem/behaviors/core';
@@ -92,6 +91,8 @@ declare class GameBridge {
92
91
  private applyingSceneOperation;
93
92
  /** Frame watch used when the channel cannot report subscriber removal. */
94
93
  private editorCameraFrame;
94
+ /** Last pose published for each selected entity, so one at rest sends nothing. */
95
+ private publishedPoses;
95
96
  constructor();
96
97
  /**
97
98
  * Subscribe to editor commands and announce the game side as ready.
@@ -104,6 +105,17 @@ declare class GameBridge {
104
105
  /** The previewing camera's projection, for Director mode's viewport overlays. */
105
106
  publishCutsceneView(view: CutsceneViewPayload): void;
106
107
  disconnect(): void;
108
+ /**
109
+ * Echo the live pose of each selected entity that moved since its pose was
110
+ * last published. The game loop calls this every frame.
111
+ *
112
+ * One watcher covers every mover — gizmo drags, undo/redo, physics, scripts —
113
+ * so the editor's transform fields follow the selection without each of them
114
+ * publishing for itself. Only the selection is watched: it is all the
115
+ * inspector shows, and watching the whole stage would cost a pose read per
116
+ * entity per frame.
117
+ */
118
+ publishSelectedPoses(): void;
107
119
  /**
108
120
  * Run a swatch batch and report back.
109
121
  *
package/dist/bridge.js CHANGED
@@ -1 +1 @@
1
- import{a as b,b as c,c as d,d as e}from"./chunk-FZNEWOC5.js";import{n as a}from"./chunk-KL7NGD76.js";import"./chunk-273CUPEO.js";import"./chunk-UM5VNQPY.js";import"./chunk-WOT6VMZA.js";export{e as BRIDGE_READY_EVENT,a as GameBridge,c as announceBridgeReady,d as applySwatchesToSelection,b as getZylemBridge};
1
+ import{a as b,b as c,c as d,d as e}from"./chunk-FZNEWOC5.js";import{n as a}from"./chunk-26EJFYDX.js";import"./chunk-273CUPEO.js";import"./chunk-UM5VNQPY.js";import"./chunk-WOT6VMZA.js";export{e as BRIDGE_READY_EVENT,a as GameBridge,c as announceBridgeReady,d as applySwatchesToSelection,b as getZylemBridge};
package/dist/catalog.js CHANGED
@@ -1 +1 @@
1
- import{a,b as S,c as T}from"./chunk-SD7EHS4W.js";import{a as t,b as e,c as r,d as i,e as o,f as y,g as c,h as s,i as p,j as h,k as n,l as g,m as w,n as u,o as E}from"./chunk-2HSR5XDQ.js";import"./chunk-DYD7MDWO.js";import"./chunk-IHGRFR4H.js";import"./chunk-AJSIVGDX.js";import"./chunk-EVYHPR3J.js";import"./chunk-XRP4JJXL.js";import"./chunk-Q22Z4PBD.js";import"./chunk-AIQ6IVT5.js";import"./chunk-QXVH6POE.js";import"./chunk-UUOPT2N4.js";import"./chunk-4QLJUQSJ.js";import"./chunk-7WRQ2UAN.js";import"./chunk-VUJXR5K5.js";import"./chunk-WOT6VMZA.js";export{a as BUILT_IN_ENTITY_TYPES,o as buildCatalogDescriptors,c as clearEntityRegistry,w as clearSwatchRegistry,r as getEntityType,h as getSwatchSource,u as isBehaviorDescriptor,i as listEntityTypes,n as listSwatchSources,y as onEntityRegistryChanged,g as onSwatchRegistryChanged,T as registerBuiltInBehaviorSwatchSources,S as registerBuiltInEntityTypes,t as registerEntityType,e as registerEntityTypes,s as registerSwatchSource,p as registerSwatchSources,E as registerSwatchSourcesFromModule};
1
+ import{a,b as S,c as T}from"./chunk-ICJ2E2OV.js";import{a as t,b as e,c as r,d as i,e as o,f as y,g as c,h as s,i as p,j as h,k as n,l as g,m as w,n as u,o as E}from"./chunk-2HSR5XDQ.js";import"./chunk-YWH5HQDT.js";import"./chunk-UNCP6V7I.js";import"./chunk-CI7A5N6G.js";import"./chunk-EVYHPR3J.js";import"./chunk-XRP4JJXL.js";import"./chunk-YW2GTHCV.js";import"./chunk-5WRFDAZN.js";import"./chunk-2NO4YCLR.js";import"./chunk-T6O2SGH5.js";import"./chunk-AIQ6IVT5.js";import"./chunk-QXVH6POE.js";import"./chunk-UUOPT2N4.js";import"./chunk-4QLJUQSJ.js";import"./chunk-7WRQ2UAN.js";import"./chunk-VUJXR5K5.js";import"./chunk-WOT6VMZA.js";export{a as BUILT_IN_ENTITY_TYPES,o as buildCatalogDescriptors,c as clearEntityRegistry,w as clearSwatchRegistry,r as getEntityType,h as getSwatchSource,u as isBehaviorDescriptor,i as listEntityTypes,n as listSwatchSources,y as onEntityRegistryChanged,g as onSwatchRegistryChanged,T as registerBuiltInBehaviorSwatchSources,S as registerBuiltInEntityTypes,t as registerEntityType,e as registerEntityTypes,s as registerSwatchSource,p as registerSwatchSources,E as registerSwatchSourcesFromModule};
@@ -0,0 +1 @@
1
+ import{b as k,c as I,d as L}from"./chunk-273CUPEO.js";import{d as a,h as g,j as S,l as E,o as P,q as y,r as C,s as w,t as x,v as B,w as D,x as A}from"./chunk-UM5VNQPY.js";function q(){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 s of t.entries)await e(s),o+=1,o%n===0&&await q();return o%n!==0&&await q(),{spawned:o}}import{subscribe as W}from"valtio/vanilla";import{announceBridgeReady as j,getZylemBridge as p}from"@zylem/bridge";var re="game",le={side:"editor:side",left:"editor:left",top:"editor:top",bottom:"editor:bottom",isometric:"editor:isometric",isoLeftTop:"editor:iso-left-top",isoRightBottom:"editor:iso-right-bottom",isoLeftBottom:"editor:iso-left-bottom",perspective:"editor:perspective",free:"editor:free"},d=!1,c=new Set;function ce(){return d}function de(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 R(){for(let t of c)t.syncFreeCameraToGame()}function V(t){let e=!1;for(let i of c)i.activateCameraById(t)&&(e=!0);return e}function m(t,e){return[t[0]*e.x,t[1]*e.y,t[2]*e.z]}function z(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 $(t,e){let{shape:i}=t,n=t.offset?m(t.offset,e):t.offset,o;switch(i.type){case"box":o={type:"box",halfExtents:m(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:z(i.vertices,e)};break;case"trimesh":o={type:"trimesh",vertices:z(i.vertices,e),indices:i.indices};break;case"heightfield":o={...i,scale:m(i.scale,e)};break;default:o=i;break}return{...t,shape:o,offset:n}}function _(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 T(t){if(!t.colliderScaleDirty)return!1;t.colliderScaleDirty=!1;let e=_(t);if(!e.length)return!1;let i=t.getScale(),n=e.map(r=>$(r,i));t.colliderDescs=n,t.colliderDesc=n[0];let o=t.physicsWorldRef;if(!o)return!0;let s=t.getPose();return o.destroyEntity(t),s&&t.bodyDesc&&(t.bodyDesc.position=[s.position.x,s.position.y,s.position.z],t.bodyDesc.rotation=[s.rotation.x,s.rotation.y,s.rotation.z,s.rotation.w]),o.addEntity(t),!0}function F(t){return(t?.group??t?.mesh)?.scale}function Q(t){let i=(typeof t?.getScale=="function"?t.getScale():void 0)??t?.scale??F(t)??{};return{x:i.x??1,y:i.y??1,z:i.z??1}}var Z={position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0,w:1}};function b(t){return M(t)??K(t,Z)}function M(t){let e=typeof t?.getPose=="function"?t.getPose():null;return e?K(t,e):null}function K(t,e){let{position:i,rotation:n}=e;return{position:{x:i.x,y:i.y,z:i.z},rotation:L(n),quaternion:{x:n.x,y:n.y,z:n.z,w:n.w},scale:Q(t)}}function J(t,e){if(typeof t?.setScale=="function"){t.setScale(e.x,e.y,e.z);return}F(t)?.set?.(e.x,e.y,e.z)}function X(t){!t||typeof t.getScale!="function"||T(t)}function Y(t,e){if(!t)return!1;let i=e.quaternion??(e.rotation?I(e.rotation):void 0),n=!1;return(e.position||i)&&typeof t.setPose=="function"&&(n=t.setPose({position:e.position,rotation:i})),e.scale&&(J(t,e.scale),n=!0),n}function ee(t){let e=t?.constructor?.type;return e?String(e).replace("Symbol(","").replace(")",""):"Unknown"}function G(t,e){let i=t;if(!i?.uuid)return;let n=p().channel;if(!n.hasSubscribers("entity:upsert"))return;let o=e??b(t);n.queue("entity:upsert",[{uuid:i.uuid,name:i.name||"Unnamed",type:ee(t),position:o.position,rotation:o.rotation,scale:o.scale,quaternion:o.quaternion}])}function Ee(t,e){p().channel.send("game:notice",{level:t,message:e})}function te(t,e,i){let n=[...new Set(t.swatches.map(r=>r.source))],o=[...new Set(e.map(r=>r.uuid))],s=o.length===1?i(o[0])||"entity":`${o.length} entities`;return`Apply ${n.join(", ")} to ${s}`}var h=1e-5;function f(t,e){return Math.abs(t.x-e.x)<=h&&Math.abs(t.y-e.y)<=h&&Math.abs(t.z-e.z)<=h}function ne(t,e){return f(t.position,e.position)&&f(t.scale,e.scale)&&f(t.quaternion,e.quaternion)&&Math.abs(t.quaternion.w-e.quaternion.w)<=h}function ie(t,e){return!e||t.length!==e.length?!1:t.every((i,n)=>i===e[n])}function oe(t,e){switch(e){case"add":C(t);break;case"subtract":w(t);break;case"toggle":for(let i of t)x(i);break;default:y(t);break}}function se(t,e){return t.on.bind(t)("camera:activate",({id:n})=>e(n))}var U=class{channel;unsubscribes=[];host=null;editorKnown={};applyingSceneOperation=!1;editorCameraFrame=0;publishedPoses=new Map;constructor(){this.channel=p().channel}connect(e,i){this.disconnect(),this.host=e,this.unsubscribes.push(this.channel.on("debug:set",({enabled:n})=>{this.editorKnown.debug=n,a.enabled=n,n&&R()}),this.channel.on("tool:set",({tool:n})=>{S(n)}),this.channel.on("playback:set",({paused:n})=>{this.editorKnown.paused=n,g(n)}),this.channel.on("entity:select",({uuid:n,uuids:o,mode:s})=>{o?oe(o,s??"replace"):P(n),this.editorKnown.selectedUuid=a.selectedEntityId,this.editorKnown.selectedUuids=[...a.selectedEntityIds]}),this.channel.on("entity:focus",({uuid:n})=>{k(n)}),this.channel.on("entity:transform",({uuid:n,position:o,rotation:s,quaternion:r,scale:v})=>{let l=this.host?.resolveEntity(n);if(!l)return;let H=b(l);if(Y(l,{position:o,rotation:s,quaternion:r,scale:v}),v&&X(l),G(l),this.applyingSceneOperation)return;let N=b(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:H,after:N}]})}),this.channel.on("entity:create",({typeId:n,props:o,pose:s})=>{this.host?.createEntity?.(n,o,s)}),this.channel.on("level:load",({buffer:n})=>{this.loadLevel(n)}),this.channel.on("level:sync",n=>{this.host?.levelSync?.(n)}),this.channel.on("level:play",({document:n})=>{this.host?.levelPlay?.(n)}),this.channel.on("level:close",()=>{this.host?.levelClose?.()}),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})=>{A(n,o??null)}),this.channel.on("snap:set",n=>{B(n)}),this.channel.on("grid:set",({visible:n})=>{D(n)}),this.channel.on("stage:variable:set",({key:n,value:o})=>{this.host?.setStageVariable?.(n,o)}),this.channel.on("pick:mode:set",({enabled:n})=>{E(n)}),this.channel.on("entity:pick",({requestId:n,ndc:o})=>{let s=this.host?.pickEntity?.(o)??null;this.channel.send("entity:pick:result",{requestId:n,hit:s})}),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})}),se(this.channel,V),this.onEditorAttached(()=>{this.attachEditorCameras()}),this.onEditorDetached(()=>{this.detachEditorCameras()}),W(a,()=>this.publishDebugStateChanges())),this.publishDebugStateChanges(),this.editorIsAttached()&&this.attachEditorCameras(),j(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.publishedPoses.clear(),this.detachEditorCameras()}publishSelectedPoses(){if(!this.host||!this.channel.hasSubscribers("entity:upsert")){this.publishedPoses.clear();return}let e=a.selectedEntityIds;for(let i of this.publishedPoses.keys())e.includes(i)||this.publishedPoses.delete(i);for(let i of e){let n=this.host.resolveEntity(i),o=M(n);if(!o)continue;let s=this.publishedPoses.get(i);s&&ne(s,o)||(this.publishedPoses.set(i,o),G(n,o))}}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(s=>e.swatches.map(r=>({uuid:s,kind:r.kind,source:r.source,ok:!1,reason:"entity-not-found"}))),entries:[]},o=[...new Set(n.entries.map(s=>s.uuid))];e.select&&o.length>0&&y(o),n.entries.length>0&&!this.applyingSceneOperation&&this.channel.send("scene:operation",{opId:i,kind:"swatch",label:te(e,n.entries,s=>this.host?.resolveEntity(s)?.name),entries:n.entries}),this.channel.send("entity:swatch-applied",{opId:i,results:n.results})}publishDebugStateChanges(){let e={};a.paused!==this.editorKnown.paused&&(this.editorKnown.paused=a.paused,e.paused=a.paused),a.enabled!==this.editorKnown.debug&&(this.editorKnown.debug=a.enabled,e.debug=a.enabled),(e.paused!==void 0||e.debug!==void 0)&&this.publishStatus(e),(a.selectedEntityId!==this.editorKnown.selectedUuid||a.hoveredEntityId!==this.editorKnown.hoveredUuid||!ie(a.selectedEntityIds,this.editorKnown.selectedUuids))&&(this.editorKnown.selectedUuid=a.selectedEntityId,this.editorKnown.selectedUuids=[...a.selectedEntityIds],this.editorKnown.hoveredUuid=a.hoveredEntityId,this.channel.queue("entity:selection",{selectedUuid:a.selectedEntityId,hoveredUuid:a.hoveredEntityId,selectedUuids:[...a.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 Pe(t){p().channel.send("scene:operation",t)}export{re as a,le as b,ce as c,de as d,O as e,T as f,Q as g,b as h,M as i,X as j,Y as k,ee as l,Ee as m,U as n,Pe as o};
@@ -0,0 +1 @@
1
+ async function y(e,r){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch ${e}: ${t.status} ${t.statusText}`);let n=Number(t.headers.get("content-length"));if(!t.body||!Number.isFinite(n)||n<=0){let s=new Uint8Array(await t.arrayBuffer());return r?.onProgress?.(1),s}let u=t.body.getReader(),i=[],o=0;for(;;){let{done:s,value:a}=await u.read();if(s)break;a&&(i.push(a),o+=a.byteLength,r?.onProgress?.(Math.min(1,o/n)))}let f=new Uint8Array(o),c=0;for(let s of i)f.set(s,c),c+=s.byteLength;return f}async function d(e,r){let t=await y(e,r);return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}async function h(e,r){let t=await y(e,r);return new TextDecoder().decode(t)}export{y as a,d as b,h as c};
@@ -1 +1 @@
1
- import{F as U,G as B,H as X,I as N,a as f}from"./chunk-DYD7MDWO.js";import{a as D,c as v,d as b}from"./chunk-IHGRFR4H.js";import{D as d,F as G,b as u,r as C,s as k}from"./chunk-AJSIVGDX.js";import{e as V}from"./chunk-Q22Z4PBD.js";import{c as h,d as y,h as m,i as T,j as x}from"./chunk-7WRQ2UAN.js";import{Color as W,Group as ot,Sprite as at,SpriteMaterial as pt,CanvasTexture as H,LinearFilter as w,Vector2 as lt,ClampToEdgeWrapping as Y}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 lt(24,24),zDistance:1},E=class extends v{createEntity(t){return new _(t)}},ct=Symbol("Text"),_=class i extends d{static type=ct;_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=T(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 ot,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 pt({map:this._texture,transparent:!0,depthTest:!1,depthWrite:!1,alphaTest:.5});this._sprite=new at(t),this.group?.add(this._sprite),this.redrawText(this.options.text??"")}measureAndResizeCanvas(t,e,n,r){if(!this._canvas||!this._ctx)return{sizeChanged:!1};this._ctx.font=`${e}px ${n}`;let s=this._ctx.measureText(t),o=Math.ceil(s.width),a=Math.ceil(e*1.4),p=Math.max(2,o+r*2),l=Math.max(2,a+r*2),st=p!==this._lastCanvasW||l!==this._lastCanvasH;return this._canvas.width=p,this._canvas.height=l,this._lastCanvasW=p,this._lastCanvasH=l,{sizeChanged:st}}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=Y,this._texture.wrapT=Y),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,r=this.options.padding??4,{sizeChanged:s}=this.measureAndResizeCanvas(t,e,n,r);this.drawCenteredText(t,e,n),this.updateTexture(!!s),this.options.stickToViewport&&this._cameraRef?this.updateStickyTransform():this.updateWorldSpriteScale()}toCssColor(t){return typeof t=="string"?t:`#${(t instanceof W?t:new W(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()}screenPoint(t){let e=T(this.options.screenPosition,g.screenPosition);if(this.options.screenAnchor)return B(this.options.screenAnchor,e,t);let n=e.x>=0&&e.x<=1,r=e.y>=0&&e.y<=1;return{x:n?e.x*t.width:e.x,y:r?e.y*t.height:e.y}}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),r=n*t;this._sprite.scale.set(r,n,1)}updateStickyTransform(){if(!this._sprite||!this._cameraRef||!this._canvas)return;let t=X(this._cameraRef),e=N({camera:this._cameraRef.camera,viewport:t,point:this.screenPoint(t),pivot:this.options.screenAnchor?U(this.options.screenAnchor):{x:.5,y:.5},size:{width:this._canvas.width,height:this._canvas.height},zDistance:this.options.zDistance??1});this._sprite.scale.set(e.scale.x,e.scale.y,1),this.group?.position.set(e.position.x,e.position.y,e.position.z)}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 O(...i){return b({args:i,defaultConfig:{...g},EntityClass:_,BuilderClass:E,entityType:_.type,cloneFactory:t=>O(t??{})})}import{Euler as ht,Group as $,Quaternion as mt,Vector3 as ut}from"three";import{TextureLoader as j,SpriteMaterial as Q,Sprite as q,SRGBColorSpace as J}from"three";import{ClampToEdgeWrapping as K,LinearFilter as dt,NearestFilter as ft}from"three";var tt={...C,size:new ut(1,1,1),images:[],animations:[]},F=class extends D{collider(t){let e=x(t.collisionSize,t.size??y);return{shape:{type:"box",halfExtents:[e.x/2,e.y/2,e.z/2]}}}},z=class extends v{createEntity(t){return new S(t)}},yt=Symbol("Sprite"),S=class i extends d{static type=yt;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(tt,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 j,n=x(this.options.size,y);t.forEach((r,s)=>{let o=e.load(r.file);o.colorSpace=J,o.anisotropy=V;let a=new Q({map:o,transparent:!0}),p=new q(a);p.position.normalize(),p.scale.set(n.x,n.y,n.z),p.visible=s===0,this.sprites.push(p),this.spriteMap.set(r.name,s)}),this.group=new $,this.group.add(...this.sprites)}createSpriteFromSheet(t){let e=x(this.options.size,y),n=new j().load(t.file);n.colorSpace=J,n.wrapS=K,n.wrapT=K;let r=t.filter==="linear"?dt:ft;n.magFilter=r,n.minFilter=r,n.generateMipmaps=!1,n.repeat.set(1/t.columns,1/t.rows);let s=new Q({map:n,transparent:!0}),o=new q(s);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 $,this.group.add(o);let a=t.frames.find(p=>!!p);a&&this.setSprite(a)}createAnimations(t){t.forEach(e=>{let{name:n,frames:r,loop:s=!1,speed:o=1}=e,a={frames:r.map((p,l)=>({key:p,index:l,duration:typeof o=="number"?o:o[l]})),loop:s};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((r,s)=>{r.visible=this.currentSpriteIndex===s})}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 r=t%e.columns,s=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?(r+1)*o:r*o,n.offset.y=1-(s+1)*a}setAnimation(t,e){let n=this.animations.get(t);if(!n)return;let{loop:r,frames:s}=n;if(s.length!==0){for(t!==this.currentAnimation?(this.currentAnimation=t,this.currentAnimationIndex=0,this.currentAnimationTime=0):this.currentAnimationTime+=e;;){let o=s[this.currentAnimationIndex].duration;if(!(o>0)||this.currentAnimationTime<o)break;if(this.currentAnimationTime-=o,this.currentAnimationIndex+1<s.length)this.currentAnimationIndex++;else if(r)this.currentAnimationIndex=0;else{this.currentAnimationTime=0;break}}this.currentAnimationFrame=s[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 r=new mt(t.x,t.y,t.z,t.w),s=new ht().setFromQuaternion(r,"XYZ");e.material.rotation=s.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 L(...i){return b({args:i,defaultConfig:tt,EntityClass:S,BuilderClass:z,CollisionBuilderClass:F,entityType:S.type,cloneFactory:t=>L(t??{})})}import{Color as nt,Group as gt}from"three";import{Line2NodeMaterial as _t}from"three/webgpu";import{Line2 as St}from"three/addons/lines/webgpu/Line2.js";import{Color as et}from"three";import{LineGeometry as xt}from"three/addons/lines/LineGeometry.js";function I(i){let t=[];for(let e of i){let{x:n,y:r,z:s}=m(e,h);t.push(n,r,s)}return t}function A(i,t,e){if(!i||i.length===0)return;let n=[],r=new et(e);for(let s=0;s<t;s++){let o=i[s]??i[i.length-1]??e,a=new et(o??r);n.push(a.r,a.g,a.b)}return n}function it(i){let t=new xt,e=I(i.points);t.setPositions(e);let n=A(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},Ct=Symbol("Line");function R(i,t){if(!i||i.length<2)throw new Error(`${t}: at least two points are required`);return i}function rt(i){return i instanceof nt?i.clone():new nt(i??"#ffffff")}function vt(i){let t=!!i.colors?.length,e=new _t({color:rt(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 bt(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 wt(i,t,e={}){let n=t.getLineObject();if(!n)return null;let r=e.threshold??t.options.pickThreshold??0,s=i.params.Line2??{threshold:0};s.threshold=r,i.params.Line2=s;let a=i.intersectObject(n,!1)[0];return a?bt(a):null}var P=class i extends d{static type=Ct;_line=null;_geometry=null;_material=null;constructor(t){super();let e=u(c,t);e.points=R(e.points,"ZylemLine").map(n=>m(n,h)),this.options=e}create(){return this.disposeLineResources(),this.group=new gt,this.rebuildLine(),this.applyGroupPosition(),super.create()}setPoints(t,e){if(R(t,"setPoints"),this.options.points=t.map(r=>m(r,h)),e&&(this.options.colors=e),!this._line||!this._geometry||!this._material)return this;this._geometry.setPositions(I(this.options.points));let n=A(this.options.colors,this.options.points.length,rt(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 wt(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=it({points:this.options.points,colors:this.options.colors}),this._material=vt(this.options),this._line=new St(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 Z(...i){let t=k(i,c);R(t.points,"createLine");let e=new P(t);return G(e,n=>Z(n??{}))}var M={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)}};M.register("text",i=>O(i));M.register("sprite",i=>L(i));M.register("line",i=>Z(i));function Se(i){return{template:i,generate(t){let e=[];for(let n=0;n<t;n++)e.push(i.clone());return e}}}export{ct as a,_ as b,O as c,yt as d,S as e,L as f,Ct as g,wt as h,P as i,Z as j,M as k,Se as l};
1
+ import{F as U,G as B,H as X,I as N,a as f}from"./chunk-YWH5HQDT.js";import{a as D,c as v,d as b}from"./chunk-UNCP6V7I.js";import{D as d,F as G,b as u,r as C,s as k}from"./chunk-CI7A5N6G.js";import{e as V}from"./chunk-YW2GTHCV.js";import{c as h,d as y,h as m,i as T,j as x}from"./chunk-7WRQ2UAN.js";import{Color as W,Group as ot,Sprite as at,SpriteMaterial as pt,CanvasTexture as H,LinearFilter as w,Vector2 as lt,ClampToEdgeWrapping as Y}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 lt(24,24),zDistance:1},E=class extends v{createEntity(t){return new _(t)}},ct=Symbol("Text"),_=class i extends d{static type=ct;_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=T(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 ot,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 pt({map:this._texture,transparent:!0,depthTest:!1,depthWrite:!1,alphaTest:.5});this._sprite=new at(t),this.group?.add(this._sprite),this.redrawText(this.options.text??"")}measureAndResizeCanvas(t,e,n,r){if(!this._canvas||!this._ctx)return{sizeChanged:!1};this._ctx.font=`${e}px ${n}`;let s=this._ctx.measureText(t),o=Math.ceil(s.width),a=Math.ceil(e*1.4),p=Math.max(2,o+r*2),l=Math.max(2,a+r*2),st=p!==this._lastCanvasW||l!==this._lastCanvasH;return this._canvas.width=p,this._canvas.height=l,this._lastCanvasW=p,this._lastCanvasH=l,{sizeChanged:st}}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=Y,this._texture.wrapT=Y),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,r=this.options.padding??4,{sizeChanged:s}=this.measureAndResizeCanvas(t,e,n,r);this.drawCenteredText(t,e,n),this.updateTexture(!!s),this.options.stickToViewport&&this._cameraRef?this.updateStickyTransform():this.updateWorldSpriteScale()}toCssColor(t){return typeof t=="string"?t:`#${(t instanceof W?t:new W(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()}screenPoint(t){let e=T(this.options.screenPosition,g.screenPosition);if(this.options.screenAnchor)return B(this.options.screenAnchor,e,t);let n=e.x>=0&&e.x<=1,r=e.y>=0&&e.y<=1;return{x:n?e.x*t.width:e.x,y:r?e.y*t.height:e.y}}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),r=n*t;this._sprite.scale.set(r,n,1)}updateStickyTransform(){if(!this._sprite||!this._cameraRef||!this._canvas)return;let t=X(this._cameraRef),e=N({camera:this._cameraRef.camera,viewport:t,point:this.screenPoint(t),pivot:this.options.screenAnchor?U(this.options.screenAnchor):{x:.5,y:.5},size:{width:this._canvas.width,height:this._canvas.height},zDistance:this.options.zDistance??1});this._sprite.scale.set(e.scale.x,e.scale.y,1),this.group?.position.set(e.position.x,e.position.y,e.position.z)}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 O(...i){return b({args:i,defaultConfig:{...g},EntityClass:_,BuilderClass:E,entityType:_.type,cloneFactory:t=>O(t??{})})}import{Euler as ht,Group as $,Quaternion as mt,Vector3 as ut}from"three";import{TextureLoader as j,SpriteMaterial as Q,Sprite as q,SRGBColorSpace as J}from"three";import{ClampToEdgeWrapping as K,LinearFilter as dt,NearestFilter as ft}from"three";var tt={...C,size:new ut(1,1,1),images:[],animations:[]},F=class extends D{collider(t){let e=x(t.collisionSize,t.size??y);return{shape:{type:"box",halfExtents:[e.x/2,e.y/2,e.z/2]}}}},z=class extends v{createEntity(t){return new S(t)}},yt=Symbol("Sprite"),S=class i extends d{static type=yt;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(tt,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 j,n=x(this.options.size,y);t.forEach((r,s)=>{let o=e.load(r.file);o.colorSpace=J,o.anisotropy=V;let a=new Q({map:o,transparent:!0}),p=new q(a);p.position.normalize(),p.scale.set(n.x,n.y,n.z),p.visible=s===0,this.sprites.push(p),this.spriteMap.set(r.name,s)}),this.group=new $,this.group.add(...this.sprites)}createSpriteFromSheet(t){let e=x(this.options.size,y),n=new j().load(t.file);n.colorSpace=J,n.wrapS=K,n.wrapT=K;let r=t.filter==="linear"?dt:ft;n.magFilter=r,n.minFilter=r,n.generateMipmaps=!1,n.repeat.set(1/t.columns,1/t.rows);let s=new Q({map:n,transparent:!0}),o=new q(s);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 $,this.group.add(o);let a=t.frames.find(p=>!!p);a&&this.setSprite(a)}createAnimations(t){t.forEach(e=>{let{name:n,frames:r,loop:s=!1,speed:o=1}=e,a={frames:r.map((p,l)=>({key:p,index:l,duration:typeof o=="number"?o:o[l]})),loop:s};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((r,s)=>{r.visible=this.currentSpriteIndex===s})}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 r=t%e.columns,s=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?(r+1)*o:r*o,n.offset.y=1-(s+1)*a}setAnimation(t,e){let n=this.animations.get(t);if(!n)return;let{loop:r,frames:s}=n;if(s.length!==0){for(t!==this.currentAnimation?(this.currentAnimation=t,this.currentAnimationIndex=0,this.currentAnimationTime=0):this.currentAnimationTime+=e;;){let o=s[this.currentAnimationIndex].duration;if(!(o>0)||this.currentAnimationTime<o)break;if(this.currentAnimationTime-=o,this.currentAnimationIndex+1<s.length)this.currentAnimationIndex++;else if(r)this.currentAnimationIndex=0;else{this.currentAnimationTime=0;break}}this.currentAnimationFrame=s[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 r=new mt(t.x,t.y,t.z,t.w),s=new ht().setFromQuaternion(r,"XYZ");e.material.rotation=s.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 L(...i){return b({args:i,defaultConfig:tt,EntityClass:S,BuilderClass:z,CollisionBuilderClass:F,entityType:S.type,cloneFactory:t=>L(t??{})})}import{Color as nt,Group as gt}from"three";import{Line2NodeMaterial as _t}from"three/webgpu";import{Line2 as St}from"three/addons/lines/webgpu/Line2.js";import{Color as et}from"three";import{LineGeometry as xt}from"three/addons/lines/LineGeometry.js";function I(i){let t=[];for(let e of i){let{x:n,y:r,z:s}=m(e,h);t.push(n,r,s)}return t}function A(i,t,e){if(!i||i.length===0)return;let n=[],r=new et(e);for(let s=0;s<t;s++){let o=i[s]??i[i.length-1]??e,a=new et(o??r);n.push(a.r,a.g,a.b)}return n}function it(i){let t=new xt,e=I(i.points);t.setPositions(e);let n=A(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},Ct=Symbol("Line");function R(i,t){if(!i||i.length<2)throw new Error(`${t}: at least two points are required`);return i}function rt(i){return i instanceof nt?i.clone():new nt(i??"#ffffff")}function vt(i){let t=!!i.colors?.length,e=new _t({color:rt(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 bt(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 wt(i,t,e={}){let n=t.getLineObject();if(!n)return null;let r=e.threshold??t.options.pickThreshold??0,s=i.params.Line2??{threshold:0};s.threshold=r,i.params.Line2=s;let a=i.intersectObject(n,!1)[0];return a?bt(a):null}var P=class i extends d{static type=Ct;_line=null;_geometry=null;_material=null;constructor(t){super();let e=u(c,t);e.points=R(e.points,"ZylemLine").map(n=>m(n,h)),this.options=e}create(){return this.disposeLineResources(),this.group=new gt,this.rebuildLine(),this.applyGroupPosition(),super.create()}setPoints(t,e){if(R(t,"setPoints"),this.options.points=t.map(r=>m(r,h)),e&&(this.options.colors=e),!this._line||!this._geometry||!this._material)return this;this._geometry.setPositions(I(this.options.points));let n=A(this.options.colors,this.options.points.length,rt(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 wt(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=it({points:this.options.points,colors:this.options.colors}),this._material=vt(this.options),this._line=new St(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 Z(...i){let t=k(i,c);R(t.points,"createLine");let e=new P(t);return G(e,n=>Z(n??{}))}var M={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)}};M.register("text",i=>O(i));M.register("sprite",i=>L(i));M.register("line",i=>Z(i));function Se(i){return{template:i,generate(t){let e=[];for(let n=0;n<t;n++)e.push(i.clone());return e}}}export{ct as a,_ as b,O as c,yt as d,S as e,L as f,Ct as g,wt as h,P as i,Z as j,M as k,Se as l};
@@ -1 +1 @@
1
- import{G as b,H as I,I as Z}from"./chunk-DYD7MDWO.js";import{D as l,F as p,a as O,b as a,r as T}from"./chunk-AJSIVGDX.js";import{e as w}from"./chunk-UUOPT2N4.js";import{j as C}from"./chunk-4QLJUQSJ.js";import{a as S,g as _,i as v,j as E}from"./chunk-7WRQ2UAN.js";import{Group as N,Quaternion as U,Vector3 as d}from"three";import{ParticleEmitterBehavior as u}from"@zylem/behaviors/particle-emitter";var X={...T,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"),y=1,W=new d(y,y,y),R=new d;function Q(i){return{effect:i.preset??i.effect,autoplay:i.autoplay,localOffset:i.localOffset,followPosition:i.followPosition,followRotation:i.followRotation,autoDestroy:i.autoDestroy}}var c=class i extends l{static type=M;particleHandle=null;getSelectionBounds(o){return this.group?(this.group.getWorldPosition(R),o.setFromCenterAndSize(R,W),w(o)):null}constructor(o,e=!0){super(),this.options=a(X,o),this.group=new N;let t=this.options.position;t&&this.group.position.copy(E(t)),this.__zylemParticleSystemEntity=!0,this.bindStandaloneTransforms(),e&&(this.particleHandle=this.use(u,Q(this.options)))}bindStandaloneTransforms(){let o=()=>{this.options.position=new d(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,r,n)=>{this.group?.position.set(t,r,n),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,r,n)=>{this.group?.rotation.set(t,r,n),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,r,n)=>{this.group?.rotation.set(t*Math.PI/180,r*Math.PI/180,n*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 U;return this.group.getWorldQuaternion(t),t}}resolveParticleHandle(){if(this.particleHandle)return this.particleHandle;let o=this.getBehaviorRefs().find(r=>r.descriptor.key===u.key);if(!o)return null;let e={getFSM:()=>o.fsm??null,getOptions:()=>o.options,ref:o},t=u.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(i.type)}}};function H(i,o=!0){let e=new c(i,o);return p(e,t=>H(t,!1))}function $(i){return H(i,!0)}import{Group as q,Sprite as K,SpriteMaterial as j,CanvasTexture as J,LinearFilter as z,Color as D,ClampToEdgeWrapping as B}from"three";import{getCooldown as Y}from"@zylem/behaviors/cooldown";var L=192,tt={xs:8,sm:16,md:32,lg:48,xl:64},f={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)"},et=Symbol("CooldownIcon"),P=class extends l{static type=et;_sprite=null;_texture=null;_canvas=null;_ctx=null;_cameraRef=null;_iconTexture=null;_iconImage=null;_lastRenderedProgress=-1;constructor(o){super(),this.options=a(f,o),this.options.screenPosition=v(this.options.screenPosition,f.screenPosition),this.group=new q,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 J(this._canvas),this._texture.minFilter=z,this._texture.magFilter=z,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 K(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,r=this._canvas.height,n=t/2,s=r/2,A=Math.min(n,s);if(e.clearRect(0,0,t,r),this._iconImage?e.drawImage(this._iconImage,0,0,t,r):(e.fillStyle=this.toCssColor(this.options.fillColor??"#333333"),e.fillRect(0,0,t,r)),o<1){let k=(1-o)*Math.PI*2,g=-Math.PI/2,V=g+k;if(e.save(),e.fillStyle=this.options.overlayColor??"rgba(0, 0, 0, 0.65)",e.beginPath(),e.moveTo(n,s),e.arc(n,s,A+1,g,V,!1),e.closePath(),e.fill(),e.restore(),this.options.showTimer){let m=Y(this.options.cooldown);if(m){let h=Math.max(0,m.duration-m.elapsed),x=h>=10?Math.ceil(h).toString():h.toFixed(1),G=Math.floor(t*.3);e.font=`bold ${G}px sans-serif`,e.textAlign="center",e.textBaseline="middle",e.fillStyle="#FFFFFF",e.strokeStyle="#000000",e.lineWidth=2,e.strokeText(x,n,s),e.fillText(x,n,s)}}}this._texture&&(this._texture.needsUpdate=!0),this._lastRenderedProgress=o}toCssColor(o){return typeof o=="string"?o:`#${(o instanceof D?o:new D(o)).getHexString()}`}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=Y(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()}resolveIconSize(o){let e=this.options.iconSize??"md",t,r;typeof e=="string"?t=r=tt[e]:typeof e=="number"?t=r=e:(t=e.width,r=e.height);let n=o/L;return{widthPx:t*n,heightPx:r*n}}updateStickyTransform(){if(!this._sprite||!this._cameraRef)return;let o=I(this._cameraRef),e=o.height/L,t=_(this.options.screenPosition,S),{widthPx:r,heightPx:n}=this.resolveIconSize(o.height),s=Z({camera:this._cameraRef.camera,viewport:o,point:b(this.options.screenAnchor??"top-left",{x:t.x*e,y:t.y*e},o),pivot:{x:.5,y:.5},size:{width:r,height:n},zDistance:this.options.zDistance??1});this._sprite.scale.set(s.scale.x,s.scale.y,1),this.group?.position.set(s.position.x,s.position.y,s.position.z)}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(...i){let o=i.filter(t=>!(t instanceof O)),e={...f};for(let t of o)e={...e,...t};return p(new P(e),t=>F(t??{}))}function ot(i,o,e){e({me:i,globals:o})}function it(i,o){let e=o??C();ot(i,e,i.nodeDestroy.bind(i))}export{M as a,c as b,$ as c,F as d,it as e};
1
+ import{G as b,H as I,I as Z}from"./chunk-YWH5HQDT.js";import{D as l,F as p,a as O,b as a,r as T}from"./chunk-CI7A5N6G.js";import{e as w}from"./chunk-UUOPT2N4.js";import{j as C}from"./chunk-4QLJUQSJ.js";import{a as S,g as _,i as v,j as E}from"./chunk-7WRQ2UAN.js";import{Group as N,Quaternion as U,Vector3 as d}from"three";import{ParticleEmitterBehavior as u}from"@zylem/behaviors/particle-emitter";var X={...T,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"),y=1,W=new d(y,y,y),R=new d;function Q(i){return{effect:i.preset??i.effect,autoplay:i.autoplay,localOffset:i.localOffset,followPosition:i.followPosition,followRotation:i.followRotation,autoDestroy:i.autoDestroy}}var c=class i extends l{static type=M;particleHandle=null;getSelectionBounds(o){return this.group?(this.group.getWorldPosition(R),o.setFromCenterAndSize(R,W),w(o)):null}constructor(o,e=!0){super(),this.options=a(X,o),this.group=new N;let t=this.options.position;t&&this.group.position.copy(E(t)),this.__zylemParticleSystemEntity=!0,this.bindStandaloneTransforms(),e&&(this.particleHandle=this.use(u,Q(this.options)))}bindStandaloneTransforms(){let o=()=>{this.options.position=new d(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,r,n)=>{this.group?.position.set(t,r,n),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,r,n)=>{this.group?.rotation.set(t,r,n),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,r,n)=>{this.group?.rotation.set(t*Math.PI/180,r*Math.PI/180,n*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 U;return this.group.getWorldQuaternion(t),t}}resolveParticleHandle(){if(this.particleHandle)return this.particleHandle;let o=this.getBehaviorRefs().find(r=>r.descriptor.key===u.key);if(!o)return null;let e={getFSM:()=>o.fsm??null,getOptions:()=>o.options,ref:o},t=u.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(i.type)}}};function H(i,o=!0){let e=new c(i,o);return p(e,t=>H(t,!1))}function $(i){return H(i,!0)}import{Group as q,Sprite as K,SpriteMaterial as j,CanvasTexture as J,LinearFilter as z,Color as D,ClampToEdgeWrapping as B}from"three";import{getCooldown as Y}from"@zylem/behaviors/cooldown";var L=192,tt={xs:8,sm:16,md:32,lg:48,xl:64},f={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)"},et=Symbol("CooldownIcon"),P=class extends l{static type=et;_sprite=null;_texture=null;_canvas=null;_ctx=null;_cameraRef=null;_iconTexture=null;_iconImage=null;_lastRenderedProgress=-1;constructor(o){super(),this.options=a(f,o),this.options.screenPosition=v(this.options.screenPosition,f.screenPosition),this.group=new q,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 J(this._canvas),this._texture.minFilter=z,this._texture.magFilter=z,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 K(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,r=this._canvas.height,n=t/2,s=r/2,A=Math.min(n,s);if(e.clearRect(0,0,t,r),this._iconImage?e.drawImage(this._iconImage,0,0,t,r):(e.fillStyle=this.toCssColor(this.options.fillColor??"#333333"),e.fillRect(0,0,t,r)),o<1){let k=(1-o)*Math.PI*2,g=-Math.PI/2,V=g+k;if(e.save(),e.fillStyle=this.options.overlayColor??"rgba(0, 0, 0, 0.65)",e.beginPath(),e.moveTo(n,s),e.arc(n,s,A+1,g,V,!1),e.closePath(),e.fill(),e.restore(),this.options.showTimer){let m=Y(this.options.cooldown);if(m){let h=Math.max(0,m.duration-m.elapsed),x=h>=10?Math.ceil(h).toString():h.toFixed(1),G=Math.floor(t*.3);e.font=`bold ${G}px sans-serif`,e.textAlign="center",e.textBaseline="middle",e.fillStyle="#FFFFFF",e.strokeStyle="#000000",e.lineWidth=2,e.strokeText(x,n,s),e.fillText(x,n,s)}}}this._texture&&(this._texture.needsUpdate=!0),this._lastRenderedProgress=o}toCssColor(o){return typeof o=="string"?o:`#${(o instanceof D?o:new D(o)).getHexString()}`}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=Y(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()}resolveIconSize(o){let e=this.options.iconSize??"md",t,r;typeof e=="string"?t=r=tt[e]:typeof e=="number"?t=r=e:(t=e.width,r=e.height);let n=o/L;return{widthPx:t*n,heightPx:r*n}}updateStickyTransform(){if(!this._sprite||!this._cameraRef)return;let o=I(this._cameraRef),e=o.height/L,t=_(this.options.screenPosition,S),{widthPx:r,heightPx:n}=this.resolveIconSize(o.height),s=Z({camera:this._cameraRef.camera,viewport:o,point:b(this.options.screenAnchor??"top-left",{x:t.x*e,y:t.y*e},o),pivot:{x:.5,y:.5},size:{width:r,height:n},zDistance:this.options.zDistance??1});this._sprite.scale.set(s.scale.x,s.scale.y,1),this.group?.position.set(s.position.x,s.position.y,s.position.z)}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(...i){let o=i.filter(t=>!(t instanceof O)),e={...f};for(let t of o)e={...e,...t};return p(new P(e),t=>F(t??{}))}function ot(i,o,e){e({me:i,globals:o})}function it(i,o){let e=o??C();ot(i,e,i.nodeDestroy.bind(i))}export{M as a,c as b,$ as c,F as d,it as e};
@@ -0,0 +1 @@
1
+ var r="KHR_gaussian_splatting",c="KHR_spz_gaussian_splats_compression";var S="Alembic (.abc) is not a runtime format. Export glTF for skinned or morphed meshes, or MDD for a constant-topology point cache.",_="Streamed SOG (lod-meta.json) is not supported. Export a bundled .sog file.",f="SOG support is not installed. Install the optional dependency @playcanvas/splat-transform.";var d=["scale_0","rot_0","f_dc_0","opacity"];function p(e){let t=Math.min(e.byteLength,1048576),n=new TextDecoder("utf-8").decode(new Uint8Array(e,0,t));if(!n.startsWith("ply"))return null;let s=n.indexOf("end_header");return s<0?null:n.slice(0,s)}function l(e){let t=new Set;for(let n of e.split(/\r\n|\r|\n/)){let s=/^property\s+\S+\s+(\S+)\s*$/.exec(n.trim());s&&t.add(s[1])}return d.every(n=>t.has(n))}function E(e,t){if(t==="mesh"||t==="splat")return t;let n=p(e);if(!n)throw new Error("PLY file is missing an ASCII header.");return l(n)?"splat":"mesh"}function i(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function a(e){let t=e&&typeof e=="object"?e:{};return{extensionsUsed:i(t.extensionsUsed),extensionsRequired:i(t.extensionsRequired)}}function A(e){if(e.byteLength>=20){let s=new DataView(e);if(s.getUint32(0,!0)===1179937895){let o=s.getUint32(12,!0);if(s.getUint32(16,!0)!==1313821514||20+o>e.byteLength)return{extensionsUsed:[],extensionsRequired:[]};let u=new TextDecoder().decode(new Uint8Array(e,20,o)).replace(/\0/g,"");try{return a(JSON.parse(u))}catch{return{extensionsUsed:[],extensionsRequired:[]}}}}let n=new TextDecoder().decode(e).trimStart();if(!n.startsWith("{"))return{extensionsUsed:[],extensionsRequired:[]};try{return a(JSON.parse(n))}catch{return{extensionsUsed:[],extensionsRequired:[]}}}function g(e){return e.extensionsUsed.includes(r)||e.extensionsRequired.includes(r)}function y(e){return e.extensionsRequired.includes(c)}function G(){return new Error(`${c} is not a supported glTF extension. Export uncompressed ${r}, or a standalone .spz file.`)}export{S as a,_ as b,f as c,E as d,A as e,g as f,y as g,G as h};
@@ -1,4 +1,4 @@
1
- import{a as g}from"./chunk-47HAZZWF.js";import{AmbientLight as k,Object3D as R,PerspectiveCamera as U,RenderTarget as T,Scene as C,Color as O,LinearFilter as w,SpotLight as P,Vector3 as v}from"three";function d(a,e,t,i={}){let s=e*4,r=new Uint8ClampedArray(t*s),n=null;if(i.srgb){n=new Uint8Array(256);for(let o=0;o<256;o+=1){let c=o/255,u=c<=.0031308?c*12.92:1.055*Math.pow(c,1/2.4)-.055;n[o]=Math.round(Math.max(0,Math.min(1,u))*255)}}for(let o=0;o<t;o+=1){let c=(i.flipY?t-1-o:o)*s,u=o*s;if(n===null){r.set(a.subarray(c,c+s),u);continue}for(let l=0;l<s;l+=4)r[u+l]=n[a[c+l]],r[u+l+1]=n[a[c+l+1]],r[u+l+2]=n[a[c+l+2]],r[u+l+3]=a[c+l+3]}return r}var x=`
1
+ import{a as g}from"./chunk-SIRFF4DY.js";import{AmbientLight as k,Object3D as R,PerspectiveCamera as U,RenderTarget as T,Scene as C,Color as O,LinearFilter as w,SpotLight as P,Vector3 as v}from"three";function d(a,e,t,i={}){let s=e*4,r=new Uint8ClampedArray(t*s),n=null;if(i.srgb){n=new Uint8Array(256);for(let o=0;o<256;o+=1){let c=o/255,u=c<=.0031308?c*12.92:1.055*Math.pow(c,1/2.4)-.055;n[o]=Math.round(Math.max(0,Math.min(1,u))*255)}}for(let o=0;o<t;o+=1){let c=(i.flipY?t-1-o:o)*s,u=o*s;if(n===null){r.set(a.subarray(c,c+s),u);continue}for(let l=0;l<s;l+=4)r[u+l]=n[a[c+l]],r[u+l+1]=n[a[c+l+1]],r[u+l+2]=n[a[c+l+2]],r[u+l+3]=a[c+l+3]}return r}var x=`
2
2
  const encodeReadbackPixels = ${d.toString()};
3
3
 
4
4
  self.onmessage = async (event) => {