@multiplekex/shallot 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/core/builder.d.ts +25 -0
  2. package/dist/core/builder.d.ts.map +1 -0
  3. package/dist/core/builder.js +88 -0
  4. package/dist/core/builder.js.map +1 -0
  5. package/dist/core/component.d.ts +29 -0
  6. package/dist/core/component.d.ts.map +1 -0
  7. package/dist/core/component.js +36 -0
  8. package/dist/core/component.js.map +1 -0
  9. package/dist/core/index.d.ts +13 -0
  10. package/dist/core/index.d.ts.map +1 -0
  11. package/dist/core/math.d.ts +32 -0
  12. package/dist/core/math.d.ts.map +1 -0
  13. package/dist/core/math.js +39 -0
  14. package/dist/core/math.js.map +1 -0
  15. package/dist/core/relation.d.ts +16 -0
  16. package/dist/core/relation.d.ts.map +1 -0
  17. package/dist/core/relation.js +32 -0
  18. package/dist/core/relation.js.map +1 -0
  19. package/dist/core/resource.d.ts +9 -0
  20. package/dist/core/resource.d.ts.map +1 -0
  21. package/dist/core/resource.js +12 -0
  22. package/dist/core/resource.js.map +1 -0
  23. package/dist/core/runtime.d.ts +13 -0
  24. package/dist/core/runtime.d.ts.map +1 -0
  25. package/dist/core/runtime.js +118 -0
  26. package/dist/core/runtime.js.map +1 -0
  27. package/dist/core/scheduler.d.ts +47 -0
  28. package/dist/core/scheduler.d.ts.map +1 -0
  29. package/dist/core/scheduler.js +138 -0
  30. package/dist/core/scheduler.js.map +1 -0
  31. package/dist/core/state.d.ts +62 -0
  32. package/dist/core/state.d.ts.map +1 -0
  33. package/dist/core/state.js +185 -0
  34. package/dist/core/state.js.map +1 -0
  35. package/dist/core/strings.d.ts +3 -0
  36. package/dist/core/strings.d.ts.map +1 -0
  37. package/dist/core/strings.js +11 -0
  38. package/dist/core/strings.js.map +1 -0
  39. package/dist/core/types.d.ts +33 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/xml.d.ts +42 -0
  42. package/dist/core/xml.d.ts.map +1 -0
  43. package/dist/core/xml.js +349 -0
  44. package/dist/core/xml.js.map +1 -0
  45. package/dist/extras/arrows/index.d.ts +33 -0
  46. package/dist/extras/arrows/index.d.ts.map +1 -0
  47. package/dist/extras/arrows/index.js +288 -0
  48. package/dist/extras/arrows/index.js.map +1 -0
  49. package/dist/extras/index.d.ts +5 -0
  50. package/dist/extras/index.d.ts.map +1 -0
  51. package/dist/extras/index.js +31 -0
  52. package/dist/extras/index.js.map +1 -0
  53. package/dist/extras/lines/index.d.ts +36 -0
  54. package/dist/extras/lines/index.d.ts.map +1 -0
  55. package/dist/extras/lines/index.js +288 -0
  56. package/dist/extras/lines/index.js.map +1 -0
  57. package/dist/extras/orbit/index.d.ts +20 -0
  58. package/dist/extras/orbit/index.d.ts.map +1 -0
  59. package/dist/extras/orbit/index.js +93 -0
  60. package/dist/extras/orbit/index.js.map +1 -0
  61. package/dist/extras/text/index.d.ts +64 -0
  62. package/dist/extras/text/index.d.ts.map +1 -0
  63. package/dist/extras/text/index.js +423 -0
  64. package/dist/extras/text/index.js.map +1 -0
  65. package/dist/index.d.ts +4 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +187 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/rust/transforms/pkg/shallot_transforms.js +107 -0
  70. package/dist/rust/transforms/pkg/shallot_transforms.js.map +1 -0
  71. package/dist/standard/compute/graph.d.ts +37 -0
  72. package/dist/standard/compute/graph.d.ts.map +1 -0
  73. package/dist/standard/compute/graph.js +85 -0
  74. package/dist/standard/compute/graph.js.map +1 -0
  75. package/dist/standard/compute/index.d.ts +21 -0
  76. package/dist/standard/compute/index.d.ts.map +1 -0
  77. package/dist/standard/compute/index.js +81 -0
  78. package/dist/standard/compute/index.js.map +1 -0
  79. package/dist/standard/defaults.d.ts +3 -0
  80. package/dist/standard/defaults.d.ts.map +1 -0
  81. package/dist/standard/defaults.js +18 -0
  82. package/dist/standard/defaults.js.map +1 -0
  83. package/dist/standard/index.d.ts +8 -0
  84. package/dist/standard/index.d.ts.map +1 -0
  85. package/dist/standard/input/index.d.ts +5 -0
  86. package/dist/standard/input/index.d.ts.map +1 -0
  87. package/dist/standard/input/index.js +70 -0
  88. package/dist/standard/input/index.js.map +1 -0
  89. package/dist/standard/loading/index.d.ts +7 -0
  90. package/dist/standard/loading/index.d.ts.map +1 -0
  91. package/dist/standard/loading/index.js +91 -0
  92. package/dist/standard/loading/index.js.map +1 -0
  93. package/dist/standard/render/camera.d.ts +36 -0
  94. package/dist/standard/render/camera.d.ts.map +1 -0
  95. package/dist/standard/render/camera.js +71 -0
  96. package/dist/standard/render/camera.js.map +1 -0
  97. package/dist/standard/render/forward.d.ts +30 -0
  98. package/dist/standard/render/forward.d.ts.map +1 -0
  99. package/dist/standard/render/forward.js +158 -0
  100. package/dist/standard/render/forward.js.map +1 -0
  101. package/dist/standard/render/index.d.ts +22 -0
  102. package/dist/standard/render/index.d.ts.map +1 -0
  103. package/dist/standard/render/index.js +153 -0
  104. package/dist/standard/render/index.js.map +1 -0
  105. package/dist/standard/render/light.d.ts +25 -0
  106. package/dist/standard/render/light.d.ts.map +1 -0
  107. package/dist/standard/render/light.js +48 -0
  108. package/dist/standard/render/light.js.map +1 -0
  109. package/dist/standard/render/mesh/box.d.ts +3 -0
  110. package/dist/standard/render/mesh/box.d.ts.map +1 -0
  111. package/dist/standard/render/mesh/box.js +190 -0
  112. package/dist/standard/render/mesh/box.js.map +1 -0
  113. package/dist/standard/render/mesh/index.d.ts +52 -0
  114. package/dist/standard/render/mesh/index.d.ts.map +1 -0
  115. package/dist/standard/render/mesh/index.js +158 -0
  116. package/dist/standard/render/mesh/index.js.map +1 -0
  117. package/dist/standard/render/mesh/plane.d.ts +3 -0
  118. package/dist/standard/render/mesh/plane.d.ts.map +1 -0
  119. package/dist/standard/render/mesh/plane.js +33 -0
  120. package/dist/standard/render/mesh/plane.js.map +1 -0
  121. package/dist/standard/render/mesh/sphere.d.ts +3 -0
  122. package/dist/standard/render/mesh/sphere.d.ts.map +1 -0
  123. package/dist/standard/render/mesh/sphere.js +25 -0
  124. package/dist/standard/render/mesh/sphere.js.map +1 -0
  125. package/dist/standard/render/postprocess.d.ts +11 -0
  126. package/dist/standard/render/postprocess.d.ts.map +1 -0
  127. package/dist/standard/render/postprocess.js +190 -0
  128. package/dist/standard/render/postprocess.js.map +1 -0
  129. package/dist/standard/render/scene.d.ts +8 -0
  130. package/dist/standard/render/scene.d.ts.map +1 -0
  131. package/dist/standard/render/scene.js +67 -0
  132. package/dist/standard/render/scene.js.map +1 -0
  133. package/dist/standard/transforms/index.d.ts +27 -0
  134. package/dist/standard/transforms/index.d.ts.map +1 -0
  135. package/dist/standard/transforms/index.js +122 -0
  136. package/dist/standard/transforms/index.js.map +1 -0
  137. package/dist/standard/transforms/wasm.d.ts +17 -0
  138. package/dist/standard/transforms/wasm.d.ts.map +1 -0
  139. package/dist/standard/transforms/wasm.js +31 -0
  140. package/dist/standard/transforms/wasm.js.map +1 -0
  141. package/dist/standard/tween/easing.d.ts +5 -0
  142. package/dist/standard/tween/easing.d.ts.map +1 -0
  143. package/dist/standard/tween/easing.js +80 -0
  144. package/dist/standard/tween/easing.js.map +1 -0
  145. package/dist/standard/tween/index.d.ts +4 -0
  146. package/dist/standard/tween/index.d.ts.map +1 -0
  147. package/dist/standard/tween/sequence.d.ts +20 -0
  148. package/dist/standard/tween/sequence.d.ts.map +1 -0
  149. package/dist/standard/tween/sequence.js +95 -0
  150. package/dist/standard/tween/sequence.js.map +1 -0
  151. package/dist/standard/tween/tween.d.ts +28 -0
  152. package/dist/standard/tween/tween.d.ts.map +1 -0
  153. package/dist/standard/tween/tween.js +136 -0
  154. package/dist/standard/tween/tween.js.map +1 -0
  155. package/package.json +63 -0
  156. package/src/core/builder.ts +148 -0
  157. package/src/core/component.ts +71 -0
  158. package/src/core/index.ts +92 -0
  159. package/src/core/math.ts +128 -0
  160. package/src/core/relation.ts +46 -0
  161. package/src/core/resource.ts +18 -0
  162. package/src/core/runtime.ts +185 -0
  163. package/src/core/scheduler.ts +238 -0
  164. package/src/core/state.ts +295 -0
  165. package/src/core/strings.ts +10 -0
  166. package/src/core/types.ts +37 -0
  167. package/src/core/xml.ts +676 -0
  168. package/src/extras/arrows/index.ts +363 -0
  169. package/src/extras/index.ts +4 -0
  170. package/src/extras/lines/index.ts +368 -0
  171. package/src/extras/orbit/index.ts +133 -0
  172. package/src/extras/text/index.ts +641 -0
  173. package/src/index.ts +3 -0
  174. package/src/standard/compute/graph.ts +165 -0
  175. package/src/standard/compute/index.ts +116 -0
  176. package/src/standard/defaults.ts +17 -0
  177. package/src/standard/index.ts +7 -0
  178. package/src/standard/input/index.ts +142 -0
  179. package/src/standard/loading/index.ts +136 -0
  180. package/src/standard/render/camera.ts +87 -0
  181. package/src/standard/render/forward.ts +212 -0
  182. package/src/standard/render/index.ts +175 -0
  183. package/src/standard/render/light.ts +81 -0
  184. package/src/standard/render/mesh/box.ts +20 -0
  185. package/src/standard/render/mesh/index.ts +227 -0
  186. package/src/standard/render/mesh/plane.ts +11 -0
  187. package/src/standard/render/mesh/sphere.ts +40 -0
  188. package/src/standard/render/postprocess.ts +235 -0
  189. package/src/standard/render/scene.ts +116 -0
  190. package/src/standard/transforms/index.ts +184 -0
  191. package/src/standard/transforms/wasm.ts +61 -0
  192. package/src/standard/tween/easing.ts +169 -0
  193. package/src/standard/tween/index.ts +13 -0
  194. package/src/standard/tween/sequence.ts +142 -0
  195. package/src/standard/tween/tween.ts +265 -0
  196. package/src/vite-env.d.ts +6 -0
@@ -0,0 +1,25 @@
1
+ import { State } from './state';
2
+ import { Plugin, Loading } from './types';
3
+ import { System } from './scheduler';
4
+ export declare class StateBuilder {
5
+ static defaultPlugins: readonly Plugin[];
6
+ static loading: ((canvas: HTMLCanvasElement) => Loading) | null;
7
+ private readonly _plugins;
8
+ private readonly _systems;
9
+ private readonly _scenes;
10
+ private readonly _excludedPlugins;
11
+ private _useDefaultPlugins;
12
+ private _canvas;
13
+ private _loading;
14
+ withCanvas(canvas: HTMLCanvasElement): this;
15
+ withPlugins(...plugins: Plugin[]): this;
16
+ withoutPlugin(plugin: Plugin): this;
17
+ withoutPlugins(...plugins: Plugin[]): this;
18
+ withoutDefaultPlugins(): this;
19
+ withSystems(...systems: System[]): this;
20
+ withScene(path: string): this;
21
+ withLoading(loading: Loading | null): this;
22
+ build(): Promise<State>;
23
+ run(): Promise<State>;
24
+ }
25
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/core/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAGpD,qBAAa,YAAY;IACrB,MAAM,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAM;IAC9C,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,GAAG,IAAI,CAAQ;IAEvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAAyC;IAEzD,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAK3C,WAAW,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKnC,cAAc,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAK1C,qBAAqB,IAAI,IAAI;IAK7B,WAAW,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK7B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAKpC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAmFvB,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;CAK9B"}
@@ -0,0 +1,88 @@
1
+ import { State as g } from "./state.js";
2
+ import { toposort as m } from "./scheduler.js";
3
+ import { registerComponent as _ } from "./component.js";
4
+ class l {
5
+ static defaultPlugins = [];
6
+ static loading = null;
7
+ _plugins = [];
8
+ _systems = [];
9
+ _scenes = [];
10
+ _excludedPlugins = /* @__PURE__ */ new Set();
11
+ _useDefaultPlugins = !0;
12
+ _canvas = null;
13
+ _loading = void 0;
14
+ withCanvas(s) {
15
+ return this._canvas = s, this;
16
+ }
17
+ withPlugins(...s) {
18
+ return this._plugins.push(...s), this;
19
+ }
20
+ withoutPlugin(s) {
21
+ return this._excludedPlugins.add(s), this;
22
+ }
23
+ withoutPlugins(...s) {
24
+ for (const u of s) this._excludedPlugins.add(u);
25
+ return this;
26
+ }
27
+ withoutDefaultPlugins() {
28
+ return this._useDefaultPlugins = !1, this;
29
+ }
30
+ withSystems(...s) {
31
+ return this._systems.push(...s), this;
32
+ }
33
+ withScene(s) {
34
+ return this._scenes.push(s), this;
35
+ }
36
+ withLoading(s) {
37
+ return this._loading = s, this;
38
+ }
39
+ async build() {
40
+ const s = this._loading === void 0 && this._canvas ? l.loading?.(this._canvas) ?? null : this._loading, u = s?.show(), i = new g(this._canvas), r = /* @__PURE__ */ new Set();
41
+ if (this._useDefaultPlugins)
42
+ for (const t of l.defaultPlugins)
43
+ this._excludedPlugins.has(t) || r.add(t);
44
+ for (const t of this._plugins)
45
+ r.add(t);
46
+ const e = [...r];
47
+ for (const t of e) {
48
+ if (t.components)
49
+ for (const [n, o] of Object.entries(t.components))
50
+ _(n, o);
51
+ if (t.systems)
52
+ for (const n of t.systems)
53
+ i.scheduler.register(n);
54
+ }
55
+ const a = [];
56
+ for (const t of e)
57
+ for (const n of t.dependencies ?? [])
58
+ e.includes(n) && a.push([n, t]);
59
+ const c = m(e, a);
60
+ let h = 0;
61
+ const p = c.length;
62
+ for (const t of c)
63
+ await t.initialize?.(i), h++, s?.update(h / p);
64
+ for (const t of this._systems)
65
+ i.scheduler.register(t);
66
+ if (this._scenes.length > 0) {
67
+ const { initRuntime: t } = await import("./runtime.js"), { loadSceneFile: n } = await import("./xml.js"), o = await t();
68
+ for (const d of this._scenes) {
69
+ const f = await n(
70
+ i,
71
+ d,
72
+ o.readFile.bind(o)
73
+ );
74
+ f.errors.length > 0 && console.warn(`Scene "${d}" loaded with errors:`, f.errors);
75
+ }
76
+ }
77
+ return u?.(), i;
78
+ }
79
+ async run() {
80
+ const s = await this.build();
81
+ return await s.start(), s;
82
+ }
83
+ }
84
+ g.Builder = l;
85
+ export {
86
+ l as StateBuilder
87
+ };
88
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sources":["../../src/core/builder.ts"],"sourcesContent":["import { State } from \"./state\";\nimport type { Plugin, Loading } from \"./types\";\nimport { toposort, type System } from \"./scheduler\";\nimport { registerComponent } from \"./component\";\n\nexport class StateBuilder {\n static defaultPlugins: readonly Plugin[] = [];\n static loading: ((canvas: HTMLCanvasElement) => Loading) | null = null;\n\n private readonly _plugins: Plugin[] = [];\n private readonly _systems: System[] = [];\n private readonly _scenes: string[] = [];\n private readonly _excludedPlugins = new Set<Plugin>();\n private _useDefaultPlugins = true;\n private _canvas: HTMLCanvasElement | null = null;\n private _loading: Loading | null | undefined = undefined;\n\n withCanvas(canvas: HTMLCanvasElement): this {\n this._canvas = canvas;\n return this;\n }\n\n withPlugins(...plugins: Plugin[]): this {\n this._plugins.push(...plugins);\n return this;\n }\n\n withoutPlugin(plugin: Plugin): this {\n this._excludedPlugins.add(plugin);\n return this;\n }\n\n withoutPlugins(...plugins: Plugin[]): this {\n for (const p of plugins) this._excludedPlugins.add(p);\n return this;\n }\n\n withoutDefaultPlugins(): this {\n this._useDefaultPlugins = false;\n return this;\n }\n\n withSystems(...systems: System[]): this {\n this._systems.push(...systems);\n return this;\n }\n\n withScene(path: string): this {\n this._scenes.push(path);\n return this;\n }\n\n withLoading(loading: Loading | null): this {\n this._loading = loading;\n return this;\n }\n\n async build(): Promise<State> {\n const loading =\n this._loading === undefined && this._canvas\n ? (StateBuilder.loading?.(this._canvas) ?? null)\n : this._loading;\n\n const cleanup = loading?.show();\n\n const state = new State(this._canvas);\n\n const pluginSet = new Set<Plugin>();\n\n if (this._useDefaultPlugins) {\n for (const plugin of StateBuilder.defaultPlugins) {\n if (!this._excludedPlugins.has(plugin)) {\n pluginSet.add(plugin);\n }\n }\n }\n\n for (const plugin of this._plugins) {\n pluginSet.add(plugin);\n }\n\n const allPlugins = [...pluginSet];\n\n for (const plugin of allPlugins) {\n if (plugin.components) {\n for (const [name, component] of Object.entries(plugin.components)) {\n registerComponent(name, component);\n }\n }\n if (plugin.systems) {\n for (const system of plugin.systems) {\n state.scheduler.register(system);\n }\n }\n }\n\n const edges: [Plugin, Plugin][] = [];\n for (const plugin of allPlugins) {\n for (const dep of plugin.dependencies ?? []) {\n if (allPlugins.includes(dep)) {\n edges.push([dep, plugin]);\n }\n }\n }\n const sorted = toposort(allPlugins, edges);\n\n let completed = 0;\n const total = sorted.length;\n\n for (const plugin of sorted) {\n await plugin.initialize?.(state);\n completed++;\n loading?.update(completed / total);\n }\n\n for (const system of this._systems) {\n state.scheduler.register(system);\n }\n\n if (this._scenes.length > 0) {\n const { initRuntime } = await import(\"./runtime\");\n const { loadSceneFile } = await import(\"./xml\");\n const runtime = await initRuntime();\n for (const scenePath of this._scenes) {\n const result = await loadSceneFile(\n state,\n scenePath,\n runtime.readFile.bind(runtime)\n );\n if (result.errors.length > 0) {\n console.warn(`Scene \"${scenePath}\" loaded with errors:`, result.errors);\n }\n }\n }\n\n cleanup?.();\n\n return state;\n }\n\n async run(): Promise<State> {\n const state = await this.build();\n await state.start();\n return state;\n }\n}\n\nState.Builder = StateBuilder;\n"],"names":["StateBuilder","canvas","plugins","plugin","p","systems","path","loading","cleanup","state","State","pluginSet","allPlugins","name","component","registerComponent","system","edges","dep","sorted","toposort","completed","total","initRuntime","loadSceneFile","runtime","scenePath","result"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { State } from './state';
2
+ export type ComponentArray = number[] | Float32Array | Uint32Array;
3
+ export type ComponentData = Record<string, ComponentArray>;
4
+ export interface ParseContext {
5
+ readonly currentEid: number;
6
+ getEntityByName(name: string): number | null;
7
+ setName(name: string, eid: number): void;
8
+ }
9
+ export interface FieldAccessor {
10
+ get(eid: number): number;
11
+ set(eid: number, value: number): void;
12
+ }
13
+ export interface ComponentTraits {
14
+ defaults?: () => Record<string, number>;
15
+ adapter?: (attrs: Record<string, string>, state: State, context: ParseContext) => Record<string, number>;
16
+ accessors?: Record<string, FieldAccessor>;
17
+ }
18
+ export declare function setTraits(component: ComponentData, traits: ComponentTraits): void;
19
+ export declare function getTraits(component: ComponentData): ComponentTraits | undefined;
20
+ export interface RegisteredComponent {
21
+ readonly component: ComponentData;
22
+ readonly name: string;
23
+ readonly traits?: ComponentTraits;
24
+ }
25
+ export declare function registerComponent(name: string, component: ComponentData): void;
26
+ export declare function getRegisteredComponent(name: string): RegisteredComponent | undefined;
27
+ export declare function clearRegistry(): void;
28
+ export declare function directAccessor(data: ComponentArray, stride: number, offset: number): FieldAccessor;
29
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/core/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,YAAY,GAAG,WAAW,CAAC;AACnE,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE3D,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,CACN,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,YAAY,KACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC7C;AAID,wBAAgB,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAEjF;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,aAAa,GAAG,eAAe,GAAG,SAAS,CAE/E;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACrC;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAI9E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAEpF;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,cAAc,CAC1B,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACf,aAAa,CAOf"}
@@ -0,0 +1,36 @@
1
+ import { toKebabCase as i } from "./strings.js";
2
+ const s = /* @__PURE__ */ new WeakMap();
3
+ function g(t, e) {
4
+ s.set(t, e);
5
+ }
6
+ function u(t) {
7
+ return s.get(t);
8
+ }
9
+ const o = /* @__PURE__ */ new Map();
10
+ function p(t, e) {
11
+ const n = i(t), r = s.get(e);
12
+ o.set(n, { component: e, name: n, traits: r });
13
+ }
14
+ function f(t) {
15
+ return o.get(i(t));
16
+ }
17
+ function m() {
18
+ o.clear();
19
+ }
20
+ function b(t, e, n) {
21
+ return {
22
+ get: (r) => t[r * e + n],
23
+ set: (r, c) => {
24
+ t[r * e + n] = c;
25
+ }
26
+ };
27
+ }
28
+ export {
29
+ m as clearRegistry,
30
+ b as directAccessor,
31
+ f as getRegisteredComponent,
32
+ u as getTraits,
33
+ p as registerComponent,
34
+ g as setTraits
35
+ };
36
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sources":["../../src/core/component.ts"],"sourcesContent":["import type { State } from \"./state\";\nimport { toKebabCase } from \"./strings\";\n\nexport type ComponentArray = number[] | Float32Array | Uint32Array;\nexport type ComponentData = Record<string, ComponentArray>;\n\nexport interface ParseContext {\n readonly currentEid: number;\n getEntityByName(name: string): number | null;\n setName(name: string, eid: number): void;\n}\n\nexport interface FieldAccessor {\n get(eid: number): number;\n set(eid: number, value: number): void;\n}\n\nexport interface ComponentTraits {\n defaults?: () => Record<string, number>;\n adapter?: (\n attrs: Record<string, string>,\n state: State,\n context: ParseContext\n ) => Record<string, number>;\n accessors?: Record<string, FieldAccessor>;\n}\n\nconst traitsMap = new WeakMap<ComponentData, ComponentTraits>();\n\nexport function setTraits(component: ComponentData, traits: ComponentTraits): void {\n traitsMap.set(component, traits);\n}\n\nexport function getTraits(component: ComponentData): ComponentTraits | undefined {\n return traitsMap.get(component);\n}\n\nexport interface RegisteredComponent {\n readonly component: ComponentData;\n readonly name: string;\n readonly traits?: ComponentTraits;\n}\n\nconst registry = new Map<string, RegisteredComponent>();\n\nexport function registerComponent(name: string, component: ComponentData): void {\n const kebabName = toKebabCase(name);\n const traits = traitsMap.get(component);\n registry.set(kebabName, { component, name: kebabName, traits });\n}\n\nexport function getRegisteredComponent(name: string): RegisteredComponent | undefined {\n return registry.get(toKebabCase(name));\n}\n\nexport function clearRegistry(): void {\n registry.clear();\n}\n\nexport function directAccessor(\n data: ComponentArray,\n stride: number,\n offset: number\n): FieldAccessor {\n return {\n get: (eid) => data[eid * stride + offset],\n set: (eid, v) => {\n data[eid * stride + offset] = v;\n },\n };\n}\n"],"names":["traitsMap","setTraits","component","traits","getTraits","registry","registerComponent","name","kebabName","toKebabCase","getRegisteredComponent","clearRegistry","directAccessor","data","stride","offset","eid","v"],"mappings":";AA2BA,MAAMA,wBAAgB,QAAA;AAEf,SAASC,EAAUC,GAA0BC,GAA+B;AAC/E,EAAAH,EAAU,IAAIE,GAAWC,CAAM;AACnC;AAEO,SAASC,EAAUF,GAAuD;AAC7E,SAAOF,EAAU,IAAIE,CAAS;AAClC;AAQA,MAAMG,wBAAe,IAAA;AAEd,SAASC,EAAkBC,GAAcL,GAAgC;AAC5E,QAAMM,IAAYC,EAAYF,CAAI,GAC5BJ,IAASH,EAAU,IAAIE,CAAS;AACtC,EAAAG,EAAS,IAAIG,GAAW,EAAE,WAAAN,GAAW,MAAMM,GAAW,QAAAL,GAAQ;AAClE;AAEO,SAASO,EAAuBH,GAA+C;AAClF,SAAOF,EAAS,IAAII,EAAYF,CAAI,CAAC;AACzC;AAEO,SAASI,IAAsB;AAClC,EAAAN,EAAS,MAAA;AACb;AAEO,SAASO,EACZC,GACAC,GACAC,GACa;AACb,SAAO;AAAA,IACH,KAAK,CAACC,MAAQH,EAAKG,IAAMF,IAASC,CAAM;AAAA,IACxC,KAAK,CAACC,GAAKC,MAAM;AACb,MAAAJ,EAAKG,IAAMF,IAASC,CAAM,IAAIE;AAAA,IAClC;AAAA,EAAA;AAER;"}
@@ -0,0 +1,13 @@
1
+ export { observe, onAdd, onRemove, onGet, onSet, And, Or, Not, Any, All, None, Hierarchy, Cascade, createRelation, getRelationTargets, Wildcard, IsA, Pair, type World, type EntityId, type ComponentRef, type Relation, } from 'bitecs';
2
+ export { State, MAX_ENTITIES } from './state';
3
+ export { StateBuilder } from './builder';
4
+ export { resource, type ResourceKey } from './resource';
5
+ export { Scheduler, Time, CycleError, OrderingError, type System, type SystemGroup, type GameTime, } from './scheduler';
6
+ export { registerComponent, getRegisteredComponent, clearRegistry, getTraits, setTraits, directAccessor, type ParseContext, type ComponentTraits, type ComponentData, type RegisteredComponent, type FieldAccessor, } from './component';
7
+ export { defineRelation, getRelationDef, clearRelationDefs, ChildOf, type RelationDef, type RelationOptions, } from './relation';
8
+ export type { Plugin, Loading, InputState, MouseState, RenderContext } from './types';
9
+ export { clamp, lerp, slerp, rotateQuaternion, eulerToQuaternion, quaternionToEuler, lookAt, } from './math';
10
+ export { toKebabCase, toCamelCase } from './strings';
11
+ export { initRuntime, getRuntime, resetRuntime, type Runtime, type RuntimeTarget } from './runtime';
12
+ export { parseXml, loadScene, loadSceneFile, registerPostLoadHook, unregisterPostLoadHook, type ParsedElement, type EntityDef, type EntityRef, type ComponentDef, type ParseResult, type ParseError, type LoadResult, type PostLoadHook, } from './xml';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,KAAK,EACL,GAAG,EACH,EAAE,EACF,GAAG,EACH,GAAG,EACH,GAAG,EACH,IAAI,EACJ,SAAS,EACT,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,QAAQ,GAChB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACH,SAAS,EACT,IAAI,EACJ,UAAU,EACV,aAAa,EACb,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,QAAQ,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,SAAS,EACT,SAAS,EACT,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,eAAe,GACvB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtF,OAAO,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,GACT,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEpG,OAAO,EACH,QAAQ,EACR,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,GACpB,MAAM,OAAO,CAAC"}
@@ -0,0 +1,32 @@
1
+ export declare function clamp(value: number, min: number, max: number): number;
2
+ export declare function lerp(a: number, b: number, t: number): number;
3
+ export declare function slerp(fromX: number, fromY: number, fromZ: number, fromW: number, toX: number, toY: number, toZ: number, toW: number, t: number): {
4
+ x: number;
5
+ y: number;
6
+ z: number;
7
+ w: number;
8
+ };
9
+ export declare function rotateQuaternion(quatX: number, quatY: number, quatZ: number, quatW: number, dx: number, dy: number, dz: number): {
10
+ x: number;
11
+ y: number;
12
+ z: number;
13
+ w: number;
14
+ };
15
+ export declare function eulerToQuaternion(x: number, y: number, z: number): {
16
+ x: number;
17
+ y: number;
18
+ z: number;
19
+ w: number;
20
+ };
21
+ export declare function quaternionToEuler(x: number, y: number, z: number, w: number): {
22
+ x: number;
23
+ y: number;
24
+ z: number;
25
+ };
26
+ export declare function lookAt(eyeX: number, eyeY: number, eyeZ: number, targetX: number, targetY: number, targetZ: number, upX?: number, upY?: number, upZ?: number): {
27
+ x: number;
28
+ y: number;
29
+ z: number;
30
+ w: number;
31
+ };
32
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/core/math.ts"],"names":[],"mappings":"AAUA,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,KAAK,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,MAAM,GACV;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAKhD;AAED,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAKhD;AAED,wBAAgB,iBAAiB,CAC7B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACV;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAGhD;AAED,wBAAgB,iBAAiB,CAC7B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACV;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAsCrC;AAED,wBAAgB,MAAM,CAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,GAAG,SAAI,EACP,GAAG,SAAI,EACP,GAAG,SAAI,GACR;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAahD"}
@@ -0,0 +1,39 @@
1
+ import { quat as a, mat4 as Q, utils as s } from "wgpu-matrix";
2
+ const x = a.create(), f = a.create(), t = a.create(), R = Q.create(), d = new Float32Array(3), y = new Float32Array(3), p = new Float32Array(3);
3
+ function v(e, n, o) {
4
+ return Math.max(n, Math.min(o, e));
5
+ }
6
+ function G(e, n, o) {
7
+ return e + (n - e) * o;
8
+ }
9
+ function H(e, n, o, c, u, m, r, i, l) {
10
+ return a.set(e, n, o, c, x), a.set(u, m, r, i, f), a.slerp(x, f, l, t), { x: t[0], y: t[1], z: t[2], w: t[3] };
11
+ }
12
+ function I(e, n, o, c, u, m, r) {
13
+ return a.fromEuler(s.degToRad(u), s.degToRad(m), s.degToRad(r), "xyz", x), a.set(e, n, o, c, f), a.multiply(f, x, t), { x: t[0], y: t[1], z: t[2], w: t[3] };
14
+ }
15
+ function J(e, n, o) {
16
+ return a.fromEuler(s.degToRad(e), s.degToRad(n), s.degToRad(o), "xyz", t), { x: t[0], y: t[1], z: t[2], w: t[3] };
17
+ }
18
+ function K(e, n, o, c) {
19
+ const u = e + e, m = n + n, r = o + o, i = e * u, l = e * m, D = e * r, T = n * m, g = n * r, h = o * r, w = c * u, E = c * m, F = c * r, V = 1 - (T + h), q = l - F, A = D + E, B = 1 - (i + h), b = g - w, k = g + w, C = 1 - (i + T), O = Math.asin(Math.max(-1, Math.min(1, A)));
20
+ let z, M;
21
+ return Math.abs(A) < 0.9999999 ? (z = Math.atan2(-b, C), M = Math.atan2(-q, V)) : (z = Math.atan2(k, B), M = 0), {
22
+ x: s.radToDeg(z),
23
+ y: s.radToDeg(O),
24
+ z: s.radToDeg(M)
25
+ };
26
+ }
27
+ function L(e, n, o, c, u, m, r = 0, i = 1, l = 0) {
28
+ return d[0] = e, d[1] = n, d[2] = o, y[0] = c, y[1] = u, y[2] = m, p[0] = r, p[1] = i, p[2] = l, Q.cameraAim(d, y, p, R), a.fromMat(R, t), { x: t[0], y: t[1], z: t[2], w: t[3] };
29
+ }
30
+ export {
31
+ v as clamp,
32
+ J as eulerToQuaternion,
33
+ G as lerp,
34
+ L as lookAt,
35
+ K as quaternionToEuler,
36
+ I as rotateQuaternion,
37
+ H as slerp
38
+ };
39
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sources":["../../src/core/math.ts"],"sourcesContent":["import { quat, utils, mat4 } from \"wgpu-matrix\";\n\nconst tempQuatA = quat.create();\nconst tempQuatB = quat.create();\nconst tempQuatOut = quat.create();\nconst tempMat4 = mat4.create();\nconst tempVec3A = new Float32Array(3);\nconst tempVec3B = new Float32Array(3);\nconst tempVec3C = new Float32Array(3);\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nexport function slerp(\n fromX: number,\n fromY: number,\n fromZ: number,\n fromW: number,\n toX: number,\n toY: number,\n toZ: number,\n toW: number,\n t: number\n): { x: number; y: number; z: number; w: number } {\n quat.set(fromX, fromY, fromZ, fromW, tempQuatA);\n quat.set(toX, toY, toZ, toW, tempQuatB);\n quat.slerp(tempQuatA, tempQuatB, t, tempQuatOut);\n return { x: tempQuatOut[0], y: tempQuatOut[1], z: tempQuatOut[2], w: tempQuatOut[3] };\n}\n\nexport function rotateQuaternion(\n quatX: number,\n quatY: number,\n quatZ: number,\n quatW: number,\n dx: number,\n dy: number,\n dz: number\n): { x: number; y: number; z: number; w: number } {\n quat.fromEuler(utils.degToRad(dx), utils.degToRad(dy), utils.degToRad(dz), \"xyz\", tempQuatA);\n quat.set(quatX, quatY, quatZ, quatW, tempQuatB);\n quat.multiply(tempQuatB, tempQuatA, tempQuatOut);\n return { x: tempQuatOut[0], y: tempQuatOut[1], z: tempQuatOut[2], w: tempQuatOut[3] };\n}\n\nexport function eulerToQuaternion(\n x: number,\n y: number,\n z: number\n): { x: number; y: number; z: number; w: number } {\n quat.fromEuler(utils.degToRad(x), utils.degToRad(y), utils.degToRad(z), \"xyz\", tempQuatOut);\n return { x: tempQuatOut[0], y: tempQuatOut[1], z: tempQuatOut[2], w: tempQuatOut[3] };\n}\n\nexport function quaternionToEuler(\n x: number,\n y: number,\n z: number,\n w: number\n): { x: number; y: number; z: number } {\n const x2 = x + x,\n y2 = y + y,\n z2 = z + z;\n const xx = x * x2,\n xy = x * y2,\n xz = x * z2;\n const yy = y * y2,\n yz = y * z2,\n zz = z * z2;\n const wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n const m11 = 1 - (yy + zz);\n const m12 = xy - wz;\n const m13 = xz + wy;\n const m22 = 1 - (xx + zz);\n const m23 = yz - wx;\n const m32 = yz + wx;\n const m33 = 1 - (xx + yy);\n\n const ey = Math.asin(Math.max(-1, Math.min(1, m13)));\n let ex: number, ez: number;\n\n if (Math.abs(m13) < 0.9999999) {\n ex = Math.atan2(-m23, m33);\n ez = Math.atan2(-m12, m11);\n } else {\n ex = Math.atan2(m32, m22);\n ez = 0;\n }\n\n return {\n x: utils.radToDeg(ex),\n y: utils.radToDeg(ey),\n z: utils.radToDeg(ez),\n };\n}\n\nexport function lookAt(\n eyeX: number,\n eyeY: number,\n eyeZ: number,\n targetX: number,\n targetY: number,\n targetZ: number,\n upX = 0,\n upY = 1,\n upZ = 0\n): { x: number; y: number; z: number; w: number } {\n tempVec3A[0] = eyeX;\n tempVec3A[1] = eyeY;\n tempVec3A[2] = eyeZ;\n tempVec3B[0] = targetX;\n tempVec3B[1] = targetY;\n tempVec3B[2] = targetZ;\n tempVec3C[0] = upX;\n tempVec3C[1] = upY;\n tempVec3C[2] = upZ;\n mat4.cameraAim(tempVec3A, tempVec3B, tempVec3C, tempMat4);\n quat.fromMat(tempMat4, tempQuatOut);\n return { x: tempQuatOut[0], y: tempQuatOut[1], z: tempQuatOut[2], w: tempQuatOut[3] };\n}\n"],"names":["tempQuatA","quat","tempQuatB","tempQuatOut","tempMat4","mat4","tempVec3A","tempVec3B","tempVec3C","clamp","value","min","max","lerp","a","b","t","slerp","fromX","fromY","fromZ","fromW","toX","toY","toZ","toW","rotateQuaternion","quatX","quatY","quatZ","quatW","dx","dy","dz","utils","eulerToQuaternion","x","y","z","quaternionToEuler","w","x2","y2","z2","xx","xy","xz","yy","yz","zz","wx","wy","wz","m11","m12","m13","m22","m23","m32","m33","ey","ex","ez","lookAt","eyeX","eyeY","eyeZ","targetX","targetY","targetZ","upX","upY","upZ"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Relation } from 'bitecs';
2
+ export interface RelationOptions {
3
+ readonly exclusive?: boolean;
4
+ readonly autoRemoveSubject?: boolean;
5
+ }
6
+ export interface RelationDef {
7
+ readonly name: string;
8
+ readonly relation: Relation<unknown>;
9
+ readonly exclusive?: boolean;
10
+ readonly autoRemoveSubject?: boolean;
11
+ }
12
+ export declare function defineRelation(name: string, options?: RelationOptions): RelationDef;
13
+ export declare function getRelationDef(name: string): RelationDef | undefined;
14
+ export declare function clearRelationDefs(): void;
15
+ export declare const ChildOf: RelationDef;
16
+ //# sourceMappingURL=relation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/core/relation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAG/E,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxC;AAID,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,WAAW,CAenF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,eAAO,MAAM,OAAO,aAGlB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { createRelation as n } from "bitecs";
2
+ import { toKebabCase as c } from "./strings.js";
3
+ const u = /* @__PURE__ */ new Map();
4
+ function r(t, e) {
5
+ const a = n({
6
+ exclusive: e?.exclusive,
7
+ autoRemoveSubject: e?.autoRemoveSubject
8
+ }), o = {
9
+ name: c(t),
10
+ relation: a,
11
+ exclusive: e?.exclusive,
12
+ autoRemoveSubject: e?.autoRemoveSubject
13
+ };
14
+ return u.set(o.name, o), o;
15
+ }
16
+ function f(t) {
17
+ return u.get(c(t));
18
+ }
19
+ function m() {
20
+ u.clear();
21
+ }
22
+ const s = r("child-of", {
23
+ exclusive: !0,
24
+ autoRemoveSubject: !0
25
+ });
26
+ export {
27
+ s as ChildOf,
28
+ m as clearRelationDefs,
29
+ r as defineRelation,
30
+ f as getRelationDef
31
+ };
32
+ //# sourceMappingURL=relation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.js","sources":["../../src/core/relation.ts"],"sourcesContent":["import { createRelation as bitecsCreateRelation, type Relation } from \"bitecs\";\nimport { toKebabCase } from \"./strings\";\n\nexport interface RelationOptions {\n readonly exclusive?: boolean;\n readonly autoRemoveSubject?: boolean;\n}\n\nexport interface RelationDef {\n readonly name: string;\n readonly relation: Relation<unknown>;\n readonly exclusive?: boolean;\n readonly autoRemoveSubject?: boolean;\n}\n\nconst registry = new Map<string, RelationDef>();\n\nexport function defineRelation(name: string, options?: RelationOptions): RelationDef {\n const relation = bitecsCreateRelation({\n exclusive: options?.exclusive,\n autoRemoveSubject: options?.autoRemoveSubject,\n });\n\n const def: RelationDef = {\n name: toKebabCase(name),\n relation,\n exclusive: options?.exclusive,\n autoRemoveSubject: options?.autoRemoveSubject,\n };\n\n registry.set(def.name, def);\n return def;\n}\n\nexport function getRelationDef(name: string): RelationDef | undefined {\n return registry.get(toKebabCase(name));\n}\n\nexport function clearRelationDefs(): void {\n registry.clear();\n}\n\nexport const ChildOf = defineRelation(\"child-of\", {\n exclusive: true,\n autoRemoveSubject: true,\n});\n"],"names":["registry","defineRelation","name","options","relation","bitecsCreateRelation","def","toKebabCase","getRelationDef","clearRelationDefs","ChildOf"],"mappings":";;AAeA,MAAMA,wBAAe,IAAA;AAEd,SAASC,EAAeC,GAAcC,GAAwC;AACjF,QAAMC,IAAWC,EAAqB;AAAA,IAClC,WAAWF,GAAS;AAAA,IACpB,mBAAmBA,GAAS;AAAA,EAAA,CAC/B,GAEKG,IAAmB;AAAA,IACrB,MAAMC,EAAYL,CAAI;AAAA,IACtB,UAAAE;AAAA,IACA,WAAWD,GAAS;AAAA,IACpB,mBAAmBA,GAAS;AAAA,EAAA;AAGhC,SAAAH,EAAS,IAAIM,EAAI,MAAMA,CAAG,GACnBA;AACX;AAEO,SAASE,EAAeN,GAAuC;AAClE,SAAOF,EAAS,IAAIO,EAAYL,CAAI,CAAC;AACzC;AAEO,SAASO,IAA0B;AACtC,EAAAT,EAAS,MAAA;AACb;AAEO,MAAMU,IAAUT,EAAe,YAAY;AAAA,EAC9C,WAAW;AAAA,EACX,mBAAmB;AACvB,CAAC;"}
@@ -0,0 +1,9 @@
1
+ export interface ResourceContainer {
2
+ getResource<T>(key: ResourceKey<T>): T | undefined;
3
+ }
4
+ export type ResourceKey<T> = symbol & {
5
+ __type?: T;
6
+ from(state: ResourceContainer): T | undefined;
7
+ };
8
+ export declare function resource<T>(name: string): ResourceKey<T>;
9
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../src/core/resource.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAC9B,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,GAAG;IAClC,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,CAAC,GAAG,SAAS,CAAC;CACjD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAQxD"}
@@ -0,0 +1,12 @@
1
+ function c(r) {
2
+ const o = Symbol(r), e = Object.assign(o, {
3
+ from(t) {
4
+ return t.getResource(e);
5
+ }
6
+ });
7
+ return e;
8
+ }
9
+ export {
10
+ c as resource
11
+ };
12
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sources":["../../src/core/resource.ts"],"sourcesContent":["export interface ResourceContainer {\n getResource<T>(key: ResourceKey<T>): T | undefined;\n}\n\nexport type ResourceKey<T> = symbol & {\n __type?: T;\n from(state: ResourceContainer): T | undefined;\n};\n\nexport function resource<T>(name: string): ResourceKey<T> {\n const key = Symbol(name) as symbol;\n const resourceKey = Object.assign(key, {\n from(state: ResourceContainer): T | undefined {\n return state.getResource(resourceKey);\n },\n });\n return resourceKey as ResourceKey<T>;\n}\n"],"names":["resource","name","key","resourceKey","state"],"mappings":"AASO,SAASA,EAAYC,GAA8B;AACtD,QAAMC,IAAM,OAAOD,CAAI,GACjBE,IAAc,OAAO,OAAOD,GAAK;AAAA,IACnC,KAAKE,GAAyC;AAC1C,aAAOA,EAAM,YAAYD,CAAW;AAAA,IACxC;AAAA,EAAA,CACH;AACD,SAAOA;AACX;"}
@@ -0,0 +1,13 @@
1
+ export type RuntimeTarget = "headless" | "standalone" | "web";
2
+ export interface Runtime {
3
+ readonly target: RuntimeTarget;
4
+ readFile(path: string): Promise<string>;
5
+ readBinary(path: string): Promise<ArrayBuffer>;
6
+ requestFrame(callback: () => void): void;
7
+ now(): number;
8
+ }
9
+ export declare function detectTarget(): RuntimeTarget;
10
+ export declare function getRuntime(): Runtime;
11
+ export declare function initRuntime(): Promise<Runtime>;
12
+ export declare function resetRuntime(): void;
13
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,OAAO;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACzC,GAAG,IAAI,MAAM,CAAC;CACjB;AAKD,wBAAgB,YAAY,IAAI,aAAa,CAc5C;AAkID,wBAAgB,UAAU,IAAI,OAAO,CAWpC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CASpD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAGnC"}
@@ -0,0 +1,118 @@
1
+ function u() {
2
+ if (typeof __TAURI_INTERNALS__ < "u")
3
+ return "standalone";
4
+ if (typeof Bun < "u")
5
+ return "headless";
6
+ if (typeof window < "u" && typeof fetch == "function")
7
+ return "web";
8
+ throw new Error("Unknown runtime environment");
9
+ }
10
+ function f() {
11
+ return {
12
+ target: "web",
13
+ async readFile(e) {
14
+ const t = await fetch(e);
15
+ if (!t.ok)
16
+ throw new Error(`Failed to load ${e}: ${t.status}`);
17
+ return t.text();
18
+ },
19
+ async readBinary(e) {
20
+ const t = await fetch(e);
21
+ if (!t.ok)
22
+ throw new Error(`Failed to load ${e}: ${t.status}`);
23
+ return t.arrayBuffer();
24
+ },
25
+ requestFrame(e) {
26
+ requestAnimationFrame(e);
27
+ },
28
+ now() {
29
+ return performance.now();
30
+ }
31
+ };
32
+ }
33
+ function c() {
34
+ return {
35
+ target: "headless",
36
+ async readFile(e) {
37
+ return Bun.file(e).text();
38
+ },
39
+ async readBinary(e) {
40
+ return Bun.file(e).arrayBuffer();
41
+ },
42
+ requestFrame(e) {
43
+ setTimeout(e, 0);
44
+ },
45
+ now() {
46
+ return performance.now();
47
+ }
48
+ };
49
+ }
50
+ function o(e) {
51
+ return e.startsWith("/") || e.startsWith("./") || e.startsWith("../");
52
+ }
53
+ function d() {
54
+ return {
55
+ target: "standalone",
56
+ async readFile(e) {
57
+ if (o(e)) {
58
+ const i = await fetch(e);
59
+ if (!i.ok)
60
+ throw new Error(`Failed to load ${e}: ${i.status}`);
61
+ return i.text();
62
+ }
63
+ const { readTextFile: t } = await import(
64
+ /* @vite-ignore */
65
+ "@tauri-apps/plugin-fs"
66
+ );
67
+ return t(e);
68
+ },
69
+ async readBinary(e) {
70
+ if (o(e)) {
71
+ const a = await fetch(e);
72
+ if (!a.ok)
73
+ throw new Error(`Failed to load ${e}: ${a.status}`);
74
+ return a.arrayBuffer();
75
+ }
76
+ const { readFile: t } = await import(
77
+ /* @vite-ignore */
78
+ "@tauri-apps/plugin-fs"
79
+ );
80
+ return (await t(e)).buffer;
81
+ },
82
+ requestFrame(e) {
83
+ requestAnimationFrame(e);
84
+ },
85
+ now() {
86
+ return performance.now();
87
+ }
88
+ };
89
+ }
90
+ let r;
91
+ async function s() {
92
+ switch (u()) {
93
+ case "headless":
94
+ return c();
95
+ case "standalone":
96
+ return d();
97
+ case "web":
98
+ return f();
99
+ }
100
+ }
101
+ let n;
102
+ function w() {
103
+ if (r) return r;
104
+ throw n || (n = s().then((e) => (r = e, e))), new Error("Runtime not initialized. Call initRuntime() first.");
105
+ }
106
+ async function l() {
107
+ return r || (n || (n = s()), r = await n, r);
108
+ }
109
+ function m() {
110
+ r = void 0, n = void 0;
111
+ }
112
+ export {
113
+ u as detectTarget,
114
+ w as getRuntime,
115
+ l as initRuntime,
116
+ m as resetRuntime
117
+ };
118
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sources":["../../src/core/runtime.ts"],"sourcesContent":["export type RuntimeTarget = \"headless\" | \"standalone\" | \"web\";\n\nexport interface Runtime {\n readonly target: RuntimeTarget;\n readFile(path: string): Promise<string>;\n readBinary(path: string): Promise<ArrayBuffer>;\n requestFrame(callback: () => void): void;\n now(): number;\n}\n\ndeclare const __TAURI_INTERNALS__: unknown;\ndeclare const Bun: unknown;\n\nexport function detectTarget(): RuntimeTarget {\n if (typeof __TAURI_INTERNALS__ !== \"undefined\") {\n return \"standalone\";\n }\n\n if (typeof Bun !== \"undefined\") {\n return \"headless\";\n }\n\n if (typeof window !== \"undefined\" && typeof fetch === \"function\") {\n return \"web\";\n }\n\n throw new Error(\"Unknown runtime environment\");\n}\n\nfunction createWebRuntime(): Runtime {\n return {\n target: \"web\",\n\n async readFile(path: string): Promise<string> {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`Failed to load ${path}: ${response.status}`);\n }\n return response.text();\n },\n\n async readBinary(path: string): Promise<ArrayBuffer> {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`Failed to load ${path}: ${response.status}`);\n }\n return response.arrayBuffer();\n },\n\n requestFrame(callback: () => void): void {\n requestAnimationFrame(callback);\n },\n\n now(): number {\n return performance.now();\n },\n };\n}\n\nfunction createHeadlessRuntime(): Runtime {\n return {\n target: \"headless\",\n\n async readFile(path: string): Promise<string> {\n const file = (\n Bun as {\n file: (path: string) => {\n text: () => Promise<string>;\n arrayBuffer: () => Promise<ArrayBuffer>;\n };\n }\n ).file(path);\n return file.text();\n },\n\n async readBinary(path: string): Promise<ArrayBuffer> {\n const file = (\n Bun as {\n file: (path: string) => {\n text: () => Promise<string>;\n arrayBuffer: () => Promise<ArrayBuffer>;\n };\n }\n ).file(path);\n return file.arrayBuffer();\n },\n\n requestFrame(callback: () => void): void {\n setTimeout(callback, 0);\n },\n\n now(): number {\n return performance.now();\n },\n };\n}\n\nfunction isWebviewResource(path: string): boolean {\n return path.startsWith(\"/\") || path.startsWith(\"./\") || path.startsWith(\"../\");\n}\n\nfunction createStandaloneRuntime(): Runtime {\n return {\n target: \"standalone\",\n\n async readFile(path: string): Promise<string> {\n if (isWebviewResource(path)) {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`Failed to load ${path}: ${response.status}`);\n }\n return response.text();\n }\n const { readTextFile } = await import(/* @vite-ignore */ \"@tauri-apps/plugin-fs\");\n return readTextFile(path);\n },\n\n async readBinary(path: string): Promise<ArrayBuffer> {\n if (isWebviewResource(path)) {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`Failed to load ${path}: ${response.status}`);\n }\n return response.arrayBuffer();\n }\n const { readFile } = await import(/* @vite-ignore */ \"@tauri-apps/plugin-fs\");\n const bytes = await readFile(path);\n return bytes.buffer;\n },\n\n requestFrame(callback: () => void): void {\n requestAnimationFrame(callback);\n },\n\n now(): number {\n return performance.now();\n },\n };\n}\n\nlet _runtime: Runtime | undefined;\n\nasync function createRuntime(): Promise<Runtime> {\n const target = detectTarget();\n\n switch (target) {\n case \"headless\":\n return createHeadlessRuntime();\n case \"standalone\":\n return createStandaloneRuntime();\n case \"web\":\n return createWebRuntime();\n }\n}\n\nlet _initPromise: Promise<Runtime> | undefined;\n\nexport function getRuntime(): Runtime {\n if (_runtime) return _runtime;\n\n if (!_initPromise) {\n _initPromise = createRuntime().then((r) => {\n _runtime = r;\n return r;\n });\n }\n\n throw new Error(\"Runtime not initialized. Call initRuntime() first.\");\n}\n\nexport async function initRuntime(): Promise<Runtime> {\n if (_runtime) return _runtime;\n\n if (!_initPromise) {\n _initPromise = createRuntime();\n }\n\n _runtime = await _initPromise;\n return _runtime;\n}\n\nexport function resetRuntime(): void {\n _runtime = undefined;\n _initPromise = undefined;\n}\n"],"names":["detectTarget","createWebRuntime","path","response","callback","createHeadlessRuntime","isWebviewResource","createStandaloneRuntime","readTextFile","readFile","_runtime","createRuntime","_initPromise","getRuntime","r","initRuntime","resetRuntime"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { State } from './state';
2
+ export declare class CycleError extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ export declare function toposort<T>(nodes: T[], edges: [T, T][]): T[];
6
+ export declare const Time: {
7
+ readonly FIXED_DT: number;
8
+ readonly DEFAULT_DT: number;
9
+ };
10
+ export interface GameTime {
11
+ deltaTime: number;
12
+ fixedDeltaTime: number;
13
+ elapsed: number;
14
+ }
15
+ export type SystemGroup = "setup" | "fixed" | "simulation" | "draw";
16
+ export interface System {
17
+ readonly update?: (state: State) => void;
18
+ readonly setup?: (state: State) => void;
19
+ readonly dispose?: (state: State) => void;
20
+ readonly group?: SystemGroup;
21
+ readonly first?: boolean;
22
+ readonly last?: boolean;
23
+ readonly before?: readonly System[];
24
+ readonly after?: readonly System[];
25
+ }
26
+ export declare class OrderingError extends Error {
27
+ constructor(message: string);
28
+ }
29
+ export declare class Scheduler {
30
+ private readonly _systems;
31
+ private _systemsVersion;
32
+ private _accumulator;
33
+ private readonly _initialized;
34
+ private _cache;
35
+ private _cacheVersion;
36
+ private _time;
37
+ get systems(): ReadonlySet<System>;
38
+ get systemsVersion(): number;
39
+ get accumulator(): number;
40
+ get time(): Readonly<GameTime>;
41
+ register(system: System): void;
42
+ unregister(system: System): void;
43
+ step(state: State, deltaTime?: number): void;
44
+ private runGroup;
45
+ private getSorted;
46
+ }
47
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/core/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,qBAAa,UAAW,SAAQ,KAAK;gBACrB,OAAO,SAAiC;CAIvD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAsC5D;AA0BD,eAAO,MAAM,IAAI;;;CAGP,CAAC;AAEX,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,MAAM;IACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,qBAAa,aAAc,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,SAAS;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,KAAK,CAIX;IAEF,IAAI,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAEjC;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAE7B;IAED,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK9B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMhC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,SAAkB,GAAG,IAAI;IAoBrD,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,SAAS;CAepB"}