@multiplekex/shallot 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/package.json +8 -23
  2. package/src/standard/compute/index.ts +36 -0
  3. package/src/standard/render/camera.ts +1 -1
  4. package/dist/core/builder.d.ts +0 -25
  5. package/dist/core/builder.d.ts.map +0 -1
  6. package/dist/core/builder.js +0 -88
  7. package/dist/core/builder.js.map +0 -1
  8. package/dist/core/component.d.ts +0 -29
  9. package/dist/core/component.d.ts.map +0 -1
  10. package/dist/core/component.js +0 -36
  11. package/dist/core/component.js.map +0 -1
  12. package/dist/core/index.d.ts +0 -13
  13. package/dist/core/index.d.ts.map +0 -1
  14. package/dist/core/math.d.ts +0 -32
  15. package/dist/core/math.d.ts.map +0 -1
  16. package/dist/core/math.js +0 -39
  17. package/dist/core/math.js.map +0 -1
  18. package/dist/core/relation.d.ts +0 -16
  19. package/dist/core/relation.d.ts.map +0 -1
  20. package/dist/core/relation.js +0 -32
  21. package/dist/core/relation.js.map +0 -1
  22. package/dist/core/resource.d.ts +0 -9
  23. package/dist/core/resource.d.ts.map +0 -1
  24. package/dist/core/resource.js +0 -12
  25. package/dist/core/resource.js.map +0 -1
  26. package/dist/core/runtime.d.ts +0 -13
  27. package/dist/core/runtime.d.ts.map +0 -1
  28. package/dist/core/runtime.js +0 -118
  29. package/dist/core/runtime.js.map +0 -1
  30. package/dist/core/scheduler.d.ts +0 -47
  31. package/dist/core/scheduler.d.ts.map +0 -1
  32. package/dist/core/scheduler.js +0 -138
  33. package/dist/core/scheduler.js.map +0 -1
  34. package/dist/core/state.d.ts +0 -62
  35. package/dist/core/state.d.ts.map +0 -1
  36. package/dist/core/state.js +0 -185
  37. package/dist/core/state.js.map +0 -1
  38. package/dist/core/strings.d.ts +0 -3
  39. package/dist/core/strings.d.ts.map +0 -1
  40. package/dist/core/strings.js +0 -11
  41. package/dist/core/strings.js.map +0 -1
  42. package/dist/core/types.d.ts +0 -33
  43. package/dist/core/types.d.ts.map +0 -1
  44. package/dist/core/xml.d.ts +0 -42
  45. package/dist/core/xml.d.ts.map +0 -1
  46. package/dist/core/xml.js +0 -349
  47. package/dist/core/xml.js.map +0 -1
  48. package/dist/extras/arrows/index.d.ts +0 -33
  49. package/dist/extras/arrows/index.d.ts.map +0 -1
  50. package/dist/extras/arrows/index.js +0 -288
  51. package/dist/extras/arrows/index.js.map +0 -1
  52. package/dist/extras/index.d.ts +0 -5
  53. package/dist/extras/index.d.ts.map +0 -1
  54. package/dist/extras/index.js +0 -31
  55. package/dist/extras/index.js.map +0 -1
  56. package/dist/extras/lines/index.d.ts +0 -36
  57. package/dist/extras/lines/index.d.ts.map +0 -1
  58. package/dist/extras/lines/index.js +0 -288
  59. package/dist/extras/lines/index.js.map +0 -1
  60. package/dist/extras/orbit/index.d.ts +0 -20
  61. package/dist/extras/orbit/index.d.ts.map +0 -1
  62. package/dist/extras/orbit/index.js +0 -93
  63. package/dist/extras/orbit/index.js.map +0 -1
  64. package/dist/extras/text/index.d.ts +0 -64
  65. package/dist/extras/text/index.d.ts.map +0 -1
  66. package/dist/extras/text/index.js +0 -423
  67. package/dist/extras/text/index.js.map +0 -1
  68. package/dist/index.d.ts +0 -4
  69. package/dist/index.d.ts.map +0 -1
  70. package/dist/index.js +0 -187
  71. package/dist/index.js.map +0 -1
  72. package/dist/rust/transforms/pkg/shallot_transforms.js +0 -107
  73. package/dist/rust/transforms/pkg/shallot_transforms.js.map +0 -1
  74. package/dist/standard/compute/graph.d.ts +0 -37
  75. package/dist/standard/compute/graph.d.ts.map +0 -1
  76. package/dist/standard/compute/graph.js +0 -85
  77. package/dist/standard/compute/graph.js.map +0 -1
  78. package/dist/standard/compute/index.d.ts +0 -21
  79. package/dist/standard/compute/index.d.ts.map +0 -1
  80. package/dist/standard/compute/index.js +0 -81
  81. package/dist/standard/compute/index.js.map +0 -1
  82. package/dist/standard/defaults.d.ts +0 -3
  83. package/dist/standard/defaults.d.ts.map +0 -1
  84. package/dist/standard/defaults.js +0 -18
  85. package/dist/standard/defaults.js.map +0 -1
  86. package/dist/standard/index.d.ts +0 -8
  87. package/dist/standard/index.d.ts.map +0 -1
  88. package/dist/standard/input/index.d.ts +0 -5
  89. package/dist/standard/input/index.d.ts.map +0 -1
  90. package/dist/standard/input/index.js +0 -70
  91. package/dist/standard/input/index.js.map +0 -1
  92. package/dist/standard/loading/index.d.ts +0 -7
  93. package/dist/standard/loading/index.d.ts.map +0 -1
  94. package/dist/standard/loading/index.js +0 -91
  95. package/dist/standard/loading/index.js.map +0 -1
  96. package/dist/standard/render/camera.d.ts +0 -36
  97. package/dist/standard/render/camera.d.ts.map +0 -1
  98. package/dist/standard/render/camera.js +0 -71
  99. package/dist/standard/render/camera.js.map +0 -1
  100. package/dist/standard/render/forward.d.ts +0 -30
  101. package/dist/standard/render/forward.d.ts.map +0 -1
  102. package/dist/standard/render/forward.js +0 -158
  103. package/dist/standard/render/forward.js.map +0 -1
  104. package/dist/standard/render/index.d.ts +0 -22
  105. package/dist/standard/render/index.d.ts.map +0 -1
  106. package/dist/standard/render/index.js +0 -153
  107. package/dist/standard/render/index.js.map +0 -1
  108. package/dist/standard/render/light.d.ts +0 -25
  109. package/dist/standard/render/light.d.ts.map +0 -1
  110. package/dist/standard/render/light.js +0 -48
  111. package/dist/standard/render/light.js.map +0 -1
  112. package/dist/standard/render/mesh/box.d.ts +0 -3
  113. package/dist/standard/render/mesh/box.d.ts.map +0 -1
  114. package/dist/standard/render/mesh/box.js +0 -190
  115. package/dist/standard/render/mesh/box.js.map +0 -1
  116. package/dist/standard/render/mesh/index.d.ts +0 -52
  117. package/dist/standard/render/mesh/index.d.ts.map +0 -1
  118. package/dist/standard/render/mesh/index.js +0 -158
  119. package/dist/standard/render/mesh/index.js.map +0 -1
  120. package/dist/standard/render/mesh/plane.d.ts +0 -3
  121. package/dist/standard/render/mesh/plane.d.ts.map +0 -1
  122. package/dist/standard/render/mesh/plane.js +0 -33
  123. package/dist/standard/render/mesh/plane.js.map +0 -1
  124. package/dist/standard/render/mesh/sphere.d.ts +0 -3
  125. package/dist/standard/render/mesh/sphere.d.ts.map +0 -1
  126. package/dist/standard/render/mesh/sphere.js +0 -25
  127. package/dist/standard/render/mesh/sphere.js.map +0 -1
  128. package/dist/standard/render/postprocess.d.ts +0 -11
  129. package/dist/standard/render/postprocess.d.ts.map +0 -1
  130. package/dist/standard/render/postprocess.js +0 -190
  131. package/dist/standard/render/postprocess.js.map +0 -1
  132. package/dist/standard/render/scene.d.ts +0 -8
  133. package/dist/standard/render/scene.d.ts.map +0 -1
  134. package/dist/standard/render/scene.js +0 -67
  135. package/dist/standard/render/scene.js.map +0 -1
  136. package/dist/standard/transforms/index.d.ts +0 -27
  137. package/dist/standard/transforms/index.d.ts.map +0 -1
  138. package/dist/standard/transforms/index.js +0 -122
  139. package/dist/standard/transforms/index.js.map +0 -1
  140. package/dist/standard/transforms/wasm.d.ts +0 -17
  141. package/dist/standard/transforms/wasm.d.ts.map +0 -1
  142. package/dist/standard/transforms/wasm.js +0 -31
  143. package/dist/standard/transforms/wasm.js.map +0 -1
  144. package/dist/standard/tween/easing.d.ts +0 -5
  145. package/dist/standard/tween/easing.d.ts.map +0 -1
  146. package/dist/standard/tween/easing.js +0 -80
  147. package/dist/standard/tween/easing.js.map +0 -1
  148. package/dist/standard/tween/index.d.ts +0 -4
  149. package/dist/standard/tween/index.d.ts.map +0 -1
  150. package/dist/standard/tween/sequence.d.ts +0 -20
  151. package/dist/standard/tween/sequence.d.ts.map +0 -1
  152. package/dist/standard/tween/sequence.js +0 -95
  153. package/dist/standard/tween/sequence.js.map +0 -1
  154. package/dist/standard/tween/tween.d.ts +0 -28
  155. package/dist/standard/tween/tween.d.ts.map +0 -1
  156. package/dist/standard/tween/tween.js +0 -136
  157. package/dist/standard/tween/tween.js.map +0 -1
  158. package/src/vite-env.d.ts +0 -6
package/package.json CHANGED
@@ -1,38 +1,26 @@
1
1
  {
2
2
  "name": "@multiplekex/shallot",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
- "main": "./dist/index.js",
6
- "module": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
5
+ "main": "./src/index.ts",
6
+ "types": "./src/index.ts",
8
7
  "exports": {
9
- ".": {
10
- "@shallot/source": "./src/index.ts",
11
- "types": "./dist/index.d.ts",
12
- "default": "./dist/index.js"
13
- },
14
- "./extras": {
15
- "@shallot/source": "./src/extras/index.ts",
16
- "types": "./dist/extras/index.d.ts",
17
- "default": "./dist/extras/index.js"
18
- }
8
+ ".": "./src/index.ts",
9
+ "./extras": "./src/extras/index.ts"
19
10
  },
20
11
  "files": [
21
- "dist",
22
- "src"
12
+ "src",
13
+ "rust/transforms/pkg"
23
14
  ],
24
15
  "workspaces": [
25
16
  "examples/*"
26
17
  ],
27
18
  "scripts": {
28
- "dev": "vite build --watch",
29
- "build": "bun run build:wasm && vite build",
30
19
  "build:wasm": "./rust/transforms/build.sh",
31
20
  "check": "tsc",
32
21
  "test": "bun test",
33
22
  "format": "prettier --write .",
34
- "format:check": "prettier --check .",
35
- "prepublishOnly": "bun run build"
23
+ "format:check": "prettier --check ."
36
24
  },
37
25
  "dependencies": {
38
26
  "@mapbox/tiny-sdf": "^2.0.7",
@@ -49,9 +37,6 @@
49
37
  "prettier": "^3.7.4",
50
38
  "three": "^0.182.0",
51
39
  "troika-three-text": "^0.52.4",
52
- "vite": "^7.3.0",
53
- "vite-plugin-dts": "^4.5.4",
54
- "vite-plugin-wasm": "^3.5.0",
55
40
  "webgpu": "^0.3.8"
56
41
  },
57
42
  "peerDependencies": {
@@ -3,6 +3,24 @@ import { ComputeGraph, type ExecutionContext, type ResourceId } from "./graph";
3
3
 
4
4
  export * from "./graph";
5
5
 
6
+ const MIN_CANVAS_SIZE = 1;
7
+
8
+ function syncCanvasSize(canvas: HTMLCanvasElement): void {
9
+ const dpr = window.devicePixelRatio || 1;
10
+ const rect = canvas.getBoundingClientRect();
11
+
12
+ const width = Math.max(MIN_CANVAS_SIZE, Math.floor(rect.width * dpr));
13
+ const height = Math.max(MIN_CANVAS_SIZE, Math.floor(rect.height * dpr));
14
+
15
+ if (canvas.width !== width || canvas.height !== height) {
16
+ canvas.width = width;
17
+ canvas.height = height;
18
+ }
19
+ }
20
+
21
+ let resizeObserver: ResizeObserver | null = null;
22
+ let observedCanvas: HTMLCanvasElement | null = null;
23
+
6
24
  export function createEntityIdBuffer(device: GPUDevice, maxInstances: number): GPUBuffer {
7
25
  return device.createBuffer({
8
26
  label: "entityIds",
@@ -43,6 +61,18 @@ export const Compute = resource<ComputeState>("compute");
43
61
  export const ComputeSystem: System = {
44
62
  group: "draw",
45
63
 
64
+ setup(state: State) {
65
+ if (!state.canvas) return;
66
+
67
+ observedCanvas = state.canvas;
68
+ syncCanvasSize(observedCanvas);
69
+
70
+ resizeObserver = new ResizeObserver(() => {
71
+ if (observedCanvas) syncCanvasSize(observedCanvas);
72
+ });
73
+ resizeObserver.observe(observedCanvas);
74
+ },
75
+
46
76
  update(state: State) {
47
77
  const compute = Compute.from(state);
48
78
  if (!compute) return;
@@ -80,6 +110,12 @@ export const ComputeSystem: System = {
80
110
 
81
111
  device.queue.submit([encoder.finish()]);
82
112
  },
113
+
114
+ dispose() {
115
+ resizeObserver?.disconnect();
116
+ resizeObserver = null;
117
+ observedCanvas = null;
118
+ },
83
119
  };
84
120
 
85
121
  export const ComputePlugin: Plugin = {
@@ -83,5 +83,5 @@ export function uploadCamera(
83
83
  const viewProj = multiply(proj, view);
84
84
 
85
85
  device.queue.writeBuffer(buffer, 0, viewProj as Float32Array<ArrayBuffer>);
86
- device.queue.writeBuffer(buffer, 64, world);
86
+ device.queue.writeBuffer(buffer, 64, world as Float32Array<ArrayBuffer>);
87
87
  }
@@ -1,25 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,88 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1,29 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,36 +0,0 @@
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
@@ -1 +0,0 @@
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;"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,32 +0,0 @@
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
@@ -1 +0,0 @@
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"}
package/dist/core/math.js DELETED
@@ -1,39 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1,16 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,32 +0,0 @@
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
@@ -1 +0,0 @@
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;"}
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,12 +0,0 @@
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
@@ -1 +0,0 @@
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;"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}