@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,288 @@
1
+ import "bitecs";
2
+ import { MAX_ENTITIES as f } from "../../core/state.js";
3
+ import "../../core/builder.js";
4
+ import { resource as g } from "../../core/resource.js";
5
+ import { setTraits as b } from "../../core/component.js";
6
+ import "../../core/relation.js";
7
+ import "../../core/math.js";
8
+ import "fast-xml-parser";
9
+ import { ComputePlugin as x, Compute as m, createEntityIdBuffer as N } from "../../standard/compute/index.js";
10
+ import { RenderPlugin as C, Render as h } from "../../standard/render/index.js";
11
+ import { Transform as w } from "../../standard/transforms/index.js";
12
+ const d = {
13
+ data: new Float32Array(f * 12)
14
+ };
15
+ function u(t) {
16
+ const o = d.data;
17
+ function n(e) {
18
+ return o[e * 12 + t];
19
+ }
20
+ function i(e, r) {
21
+ o[e * 12 + t] = r;
22
+ }
23
+ return new Proxy([], {
24
+ get(e, r) {
25
+ if (r === "get") return n;
26
+ if (r === "set") return i;
27
+ const s = Number(r);
28
+ if (!Number.isNaN(s))
29
+ return n(s);
30
+ },
31
+ set(e, r, s) {
32
+ const c = Number(r);
33
+ return Number.isNaN(c) ? !1 : (i(c, s), !0);
34
+ }
35
+ });
36
+ }
37
+ function P() {
38
+ const t = d.data;
39
+ function o(i) {
40
+ const e = i * 12 + 8, r = Math.round(t[e] * 255), s = Math.round(t[e + 1] * 255), c = Math.round(t[e + 2] * 255);
41
+ return r << 16 | s << 8 | c;
42
+ }
43
+ function n(i, e) {
44
+ const r = i * 12 + 8;
45
+ t[r] = (e >> 16 & 255) / 255, t[r + 1] = (e >> 8 & 255) / 255, t[r + 2] = (e & 255) / 255, t[r + 3] = 1;
46
+ }
47
+ return new Proxy([], {
48
+ get(i, e) {
49
+ if (e === "get") return o;
50
+ if (e === "set") return n;
51
+ const r = Number(e);
52
+ if (!Number.isNaN(r))
53
+ return o(r);
54
+ },
55
+ set(i, e, r) {
56
+ const s = Number(e);
57
+ return Number.isNaN(s) ? !1 : (n(s, r), !0);
58
+ }
59
+ });
60
+ }
61
+ const a = {
62
+ offsetX: u(0),
63
+ offsetY: u(1),
64
+ offsetZ: u(2),
65
+ thickness: u(3),
66
+ visible: u(4),
67
+ opacity: u(7),
68
+ color: P()
69
+ };
70
+ b(a, {
71
+ defaults: () => ({
72
+ offsetX: 1,
73
+ offsetY: 0,
74
+ offsetZ: 0,
75
+ thickness: 2,
76
+ visible: 1,
77
+ opacity: 1,
78
+ color: 16777215
79
+ }),
80
+ accessors: {
81
+ offsetX: a.offsetX,
82
+ offsetY: a.offsetY,
83
+ offsetZ: a.offsetZ,
84
+ thickness: a.thickness,
85
+ visible: a.visible,
86
+ opacity: a.opacity,
87
+ color: a.color
88
+ }
89
+ });
90
+ const D = (
91
+ /* wgsl */
92
+ `
93
+ struct VertexOutput {
94
+ @builtin(position) position: vec4<f32>,
95
+ @location(0) color: vec4<f32>,
96
+ }
97
+
98
+ struct Scene {
99
+ viewProj: mat4x4<f32>,
100
+ cameraWorld: mat4x4<f32>,
101
+ }
102
+
103
+ struct LineData {
104
+ offset: vec3<f32>,
105
+ thickness: f32,
106
+ visible: f32,
107
+ _pad1: f32,
108
+ _pad2: f32,
109
+ opacity: f32,
110
+ color: vec4<f32>,
111
+ }
112
+
113
+ @group(0) @binding(0) var<uniform> scene: Scene;
114
+ @group(0) @binding(1) var<storage, read> entityIds: array<u32>;
115
+ @group(0) @binding(2) var<storage, read> lines: array<LineData>;
116
+ @group(0) @binding(3) var<storage, read> matrices: array<mat4x4<f32>>;
117
+
118
+ @vertex
119
+ fn vs(@builtin(vertex_index) vid: u32, @builtin(instance_index) iid: u32) -> VertexOutput {
120
+ let eid = entityIds[iid];
121
+ let line = lines[eid];
122
+ let transform = matrices[eid];
123
+
124
+ let start = transform[3].xyz;
125
+ let rotation = mat3x3<f32>(transform[0].xyz, transform[1].xyz, transform[2].xyz);
126
+ let end = start + rotation * line.offset;
127
+
128
+ let startClip = scene.viewProj * vec4(start, 1.0);
129
+ let endClip = scene.viewProj * vec4(end, 1.0);
130
+
131
+ let startNDC = startClip.xy / startClip.w;
132
+ let endNDC = endClip.xy / endClip.w;
133
+
134
+ let dir = endNDC - startNDC;
135
+ let len = length(dir);
136
+ let normDir = select(vec2(1.0, 0.0), dir / len, len > 0.0001);
137
+
138
+ // Scale with world-space distance to camera (soft clamp prevents extreme thickness)
139
+ let midpoint = (start + end) * 0.5;
140
+ let cameraPos = scene.cameraWorld[3].xyz;
141
+ let distToCamera = length(cameraPos - midpoint);
142
+ let refDist = 15.0;
143
+ let rawScale = distToCamera / refDist;
144
+ let maxScale = 3.0;
145
+ let zoomScale = max(1.0, rawScale / (1.0 + rawScale / maxScale));
146
+ let perp = vec2(-normDir.y, normDir.x) * line.thickness * 0.002 * zoomScale;
147
+
148
+ var pos: vec2<f32>;
149
+ var t: f32;
150
+ switch vid {
151
+ case 0u: { pos = startNDC - perp; t = 0.0; }
152
+ case 1u: { pos = startNDC + perp; t = 0.0; }
153
+ case 2u: { pos = endNDC + perp; t = 1.0; }
154
+ case 3u: { pos = startNDC - perp; t = 0.0; }
155
+ case 4u: { pos = endNDC + perp; t = 1.0; }
156
+ case 5u: { pos = endNDC - perp; t = 1.0; }
157
+ default: { pos = startNDC; t = 0.0; }
158
+ }
159
+
160
+ let depth = mix(startClip.z / startClip.w, endClip.z / endClip.w, t);
161
+
162
+ var out: VertexOutput;
163
+ out.position = vec4(pos, depth, 1.0);
164
+ out.color = vec4(line.color.rgb, line.color.a * line.opacity);
165
+ return out;
166
+ }
167
+
168
+ @fragment
169
+ fn fs(input: VertexOutput) -> @location(0) vec4<f32> {
170
+ return input.color;
171
+ }
172
+ `
173
+ );
174
+ function S(t, o) {
175
+ const n = t.createShaderModule({ code: D });
176
+ return t.createRenderPipeline({
177
+ layout: "auto",
178
+ vertex: {
179
+ module: n,
180
+ entryPoint: "vs"
181
+ },
182
+ fragment: {
183
+ module: n,
184
+ entryPoint: "fs",
185
+ targets: [
186
+ {
187
+ format: o,
188
+ blend: {
189
+ color: {
190
+ srcFactor: "src-alpha",
191
+ dstFactor: "one-minus-src-alpha",
192
+ operation: "add"
193
+ },
194
+ alpha: {
195
+ srcFactor: "one",
196
+ dstFactor: "one-minus-src-alpha",
197
+ operation: "add"
198
+ }
199
+ }
200
+ }
201
+ ]
202
+ },
203
+ primitive: {
204
+ topology: "triangle-list"
205
+ }
206
+ });
207
+ }
208
+ function z(t) {
209
+ let o = null, n = null;
210
+ return {
211
+ id: "lines",
212
+ phase: "overlay",
213
+ inputs: [],
214
+ outputs: [],
215
+ execute(i) {
216
+ const e = t.getCount();
217
+ if (e === 0) return;
218
+ const { device: r, encoder: s, format: c } = i, v = i.getTextureView("scene") ?? i.canvasView;
219
+ o || (o = S(r, c)), n || (n = r.createBindGroup({
220
+ layout: o.getBindGroupLayout(0),
221
+ entries: [
222
+ { binding: 0, resource: { buffer: t.scene } },
223
+ { binding: 1, resource: { buffer: t.entityIds } },
224
+ { binding: 2, resource: { buffer: t.lines } },
225
+ { binding: 3, resource: { buffer: t.matrices } }
226
+ ]
227
+ }));
228
+ const l = s.beginRenderPass({
229
+ colorAttachments: [
230
+ {
231
+ view: v,
232
+ loadOp: "load",
233
+ storeOp: "store"
234
+ }
235
+ ]
236
+ });
237
+ l.setPipeline(o), l.setBindGroup(0, n), l.draw(6, e), l.end();
238
+ }
239
+ };
240
+ }
241
+ const y = g("lines"), p = new Uint32Array(f), I = {
242
+ group: "draw",
243
+ update(t) {
244
+ const o = m.from(t), n = y.from(t);
245
+ if (!o || !n) return;
246
+ const { device: i } = o;
247
+ let e = 0;
248
+ for (const r of t.query([a, w]))
249
+ a.visible[r] && (p[e++] = r);
250
+ i.queue.writeBuffer(n.buffer, 0, d.data), i.queue.writeBuffer(n.entityIds, 0, p, 0, e), n.count = e;
251
+ }
252
+ }, M = {
253
+ systems: [I],
254
+ components: { Line: a },
255
+ dependencies: [x, C],
256
+ initialize(t) {
257
+ const o = m.from(t), n = h.from(t);
258
+ if (!o || !n) return;
259
+ const { device: i } = o, e = {
260
+ buffer: i.createBuffer({
261
+ label: "lines",
262
+ size: f * 12 * 4,
263
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
264
+ }),
265
+ entityIds: N(i, f),
266
+ count: 0
267
+ };
268
+ t.setResource(y, e), o.graph.add(
269
+ z({
270
+ scene: n.scene,
271
+ lines: e.buffer,
272
+ entityIds: e.entityIds,
273
+ matrices: n.matrices,
274
+ getCount: () => e.count
275
+ })
276
+ );
277
+ }
278
+ };
279
+ export {
280
+ a as Line,
281
+ d as LineData,
282
+ y as Lines,
283
+ M as LinesPlugin,
284
+ z as createLinesNode,
285
+ S as createLinesPipeline,
286
+ D as lineShader
287
+ };
288
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/extras/lines/index.ts"],"sourcesContent":["import { MAX_ENTITIES, resource, type Plugin, type State, type System } from \"../../core\";\nimport { setTraits, type FieldAccessor } from \"../../core/component\";\nimport {\n Compute,\n ComputePlugin,\n createEntityIdBuffer,\n type ComputeNode,\n type ExecutionContext,\n} from \"../../standard/compute\";\nimport { Render, RenderPlugin } from \"../../standard/render\";\nimport { Transform } from \"../../standard/transforms\";\n\nexport const LineData = {\n data: new Float32Array(MAX_ENTITIES * 12),\n};\n\ninterface LineProxy extends Array<number>, FieldAccessor {}\n\nfunction lineProxy(offset: number): LineProxy {\n const data = LineData.data;\n\n function getValue(eid: number): number {\n return data[eid * 12 + offset];\n }\n\n function setValue(eid: number, value: number): void {\n data[eid * 12 + offset] = value;\n }\n\n return new Proxy([] as unknown as LineProxy, {\n get(_, prop) {\n if (prop === \"get\") return getValue;\n if (prop === \"set\") return setValue;\n const eid = Number(prop);\n if (Number.isNaN(eid)) return undefined;\n return getValue(eid);\n },\n set(_, prop, value) {\n const eid = Number(prop);\n if (Number.isNaN(eid)) return false;\n setValue(eid, value);\n return true;\n },\n });\n}\n\nfunction colorProxy(): LineProxy {\n const data = LineData.data;\n\n function getValue(eid: number): number {\n const offset = eid * 12 + 8;\n const r = Math.round(data[offset] * 255);\n const g = Math.round(data[offset + 1] * 255);\n const b = Math.round(data[offset + 2] * 255);\n return (r << 16) | (g << 8) | b;\n }\n\n function setValue(eid: number, value: number): void {\n const offset = eid * 12 + 8;\n data[offset] = ((value >> 16) & 0xff) / 255;\n data[offset + 1] = ((value >> 8) & 0xff) / 255;\n data[offset + 2] = (value & 0xff) / 255;\n data[offset + 3] = 1;\n }\n\n return new Proxy([] as unknown as LineProxy, {\n get(_, prop) {\n if (prop === \"get\") return getValue;\n if (prop === \"set\") return setValue;\n const eid = Number(prop);\n if (Number.isNaN(eid)) return undefined;\n return getValue(eid);\n },\n set(_, prop, value) {\n const eid = Number(prop);\n if (Number.isNaN(eid)) return false;\n setValue(eid, value);\n return true;\n },\n });\n}\n\nexport const Line: {\n offsetX: LineProxy;\n offsetY: LineProxy;\n offsetZ: LineProxy;\n thickness: LineProxy;\n visible: LineProxy;\n opacity: LineProxy;\n color: LineProxy;\n} = {\n offsetX: lineProxy(0),\n offsetY: lineProxy(1),\n offsetZ: lineProxy(2),\n thickness: lineProxy(3),\n visible: lineProxy(4),\n opacity: lineProxy(7),\n color: colorProxy(),\n};\n\nsetTraits(Line, {\n defaults: () => ({\n offsetX: 1,\n offsetY: 0,\n offsetZ: 0,\n thickness: 2,\n visible: 1,\n opacity: 1,\n color: 0xffffff,\n }),\n accessors: {\n offsetX: Line.offsetX,\n offsetY: Line.offsetY,\n offsetZ: Line.offsetZ,\n thickness: Line.thickness,\n visible: Line.visible,\n opacity: Line.opacity,\n color: Line.color,\n },\n});\n\nexport interface LinesConfig {\n scene: GPUBuffer;\n lines: GPUBuffer;\n entityIds: GPUBuffer;\n matrices: GPUBuffer;\n getCount: () => number;\n}\n\nexport const lineShader = /* wgsl */ `\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec4<f32>,\n}\n\nstruct Scene {\n viewProj: mat4x4<f32>,\n cameraWorld: mat4x4<f32>,\n}\n\nstruct LineData {\n offset: vec3<f32>,\n thickness: f32,\n visible: f32,\n _pad1: f32,\n _pad2: f32,\n opacity: f32,\n color: vec4<f32>,\n}\n\n@group(0) @binding(0) var<uniform> scene: Scene;\n@group(0) @binding(1) var<storage, read> entityIds: array<u32>;\n@group(0) @binding(2) var<storage, read> lines: array<LineData>;\n@group(0) @binding(3) var<storage, read> matrices: array<mat4x4<f32>>;\n\n@vertex\nfn vs(@builtin(vertex_index) vid: u32, @builtin(instance_index) iid: u32) -> VertexOutput {\n let eid = entityIds[iid];\n let line = lines[eid];\n let transform = matrices[eid];\n\n let start = transform[3].xyz;\n let rotation = mat3x3<f32>(transform[0].xyz, transform[1].xyz, transform[2].xyz);\n let end = start + rotation * line.offset;\n\n let startClip = scene.viewProj * vec4(start, 1.0);\n let endClip = scene.viewProj * vec4(end, 1.0);\n\n let startNDC = startClip.xy / startClip.w;\n let endNDC = endClip.xy / endClip.w;\n\n let dir = endNDC - startNDC;\n let len = length(dir);\n let normDir = select(vec2(1.0, 0.0), dir / len, len > 0.0001);\n\n // Scale with world-space distance to camera (soft clamp prevents extreme thickness)\n let midpoint = (start + end) * 0.5;\n let cameraPos = scene.cameraWorld[3].xyz;\n let distToCamera = length(cameraPos - midpoint);\n let refDist = 15.0;\n let rawScale = distToCamera / refDist;\n let maxScale = 3.0;\n let zoomScale = max(1.0, rawScale / (1.0 + rawScale / maxScale));\n let perp = vec2(-normDir.y, normDir.x) * line.thickness * 0.002 * zoomScale;\n\n var pos: vec2<f32>;\n var t: f32;\n switch vid {\n case 0u: { pos = startNDC - perp; t = 0.0; }\n case 1u: { pos = startNDC + perp; t = 0.0; }\n case 2u: { pos = endNDC + perp; t = 1.0; }\n case 3u: { pos = startNDC - perp; t = 0.0; }\n case 4u: { pos = endNDC + perp; t = 1.0; }\n case 5u: { pos = endNDC - perp; t = 1.0; }\n default: { pos = startNDC; t = 0.0; }\n }\n\n let depth = mix(startClip.z / startClip.w, endClip.z / endClip.w, t);\n\n var out: VertexOutput;\n out.position = vec4(pos, depth, 1.0);\n out.color = vec4(line.color.rgb, line.color.a * line.opacity);\n return out;\n}\n\n@fragment\nfn fs(input: VertexOutput) -> @location(0) vec4<f32> {\n return input.color;\n}\n`;\n\nexport function createLinesPipeline(\n device: GPUDevice,\n format: GPUTextureFormat\n): GPURenderPipeline {\n const module = device.createShaderModule({ code: lineShader });\n\n return device.createRenderPipeline({\n layout: \"auto\",\n vertex: {\n module,\n entryPoint: \"vs\",\n },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-list\",\n },\n });\n}\n\nexport function createLinesNode(config: LinesConfig): ComputeNode {\n let pipeline: GPURenderPipeline | null = null;\n let bindGroup: GPUBindGroup | null = null;\n\n return {\n id: \"lines\",\n phase: \"overlay\",\n inputs: [],\n outputs: [],\n\n execute(ctx: ExecutionContext) {\n const count = config.getCount();\n if (count === 0) return;\n\n const { device, encoder, format } = ctx;\n const targetView = ctx.getTextureView(\"scene\") ?? ctx.canvasView;\n\n if (!pipeline) {\n pipeline = createLinesPipeline(device, format);\n }\n\n if (!bindGroup) {\n bindGroup = device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: config.scene } },\n { binding: 1, resource: { buffer: config.entityIds } },\n { binding: 2, resource: { buffer: config.lines } },\n { binding: 3, resource: { buffer: config.matrices } },\n ],\n });\n }\n\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: targetView,\n loadOp: \"load\" as const,\n storeOp: \"store\" as const,\n },\n ],\n });\n\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(6, count);\n pass.end();\n },\n };\n}\n\nexport interface LinesState {\n buffer: GPUBuffer;\n entityIds: GPUBuffer;\n count: number;\n}\n\nexport const Lines = resource<LinesState>(\"lines\");\n\nconst entityIdArray = new Uint32Array(MAX_ENTITIES);\n\nconst LinesSystem: System = {\n group: \"draw\",\n\n update(state: State) {\n const compute = Compute.from(state);\n const lines = Lines.from(state);\n if (!compute || !lines) return;\n\n const { device } = compute;\n\n let count = 0;\n for (const eid of state.query([Line, Transform])) {\n if (!Line.visible[eid]) continue;\n entityIdArray[count++] = eid;\n }\n\n device.queue.writeBuffer(lines.buffer, 0, LineData.data);\n device.queue.writeBuffer(lines.entityIds, 0, entityIdArray, 0, count);\n lines.count = count;\n },\n};\n\nexport const LinesPlugin: Plugin = {\n systems: [LinesSystem],\n components: { Line },\n dependencies: [ComputePlugin, RenderPlugin],\n\n initialize(state: State) {\n const compute = Compute.from(state);\n const render = Render.from(state);\n if (!compute || !render) return;\n\n const { device } = compute;\n\n const linesState: LinesState = {\n buffer: device.createBuffer({\n label: \"lines\",\n size: MAX_ENTITIES * 12 * 4,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n }),\n entityIds: createEntityIdBuffer(device, MAX_ENTITIES),\n count: 0,\n };\n\n state.setResource(Lines, linesState);\n\n compute.graph.add(\n createLinesNode({\n scene: render.scene,\n lines: linesState.buffer,\n entityIds: linesState.entityIds,\n matrices: render.matrices,\n getCount: () => linesState.count,\n })\n );\n },\n};\n"],"names":["LineData","MAX_ENTITIES","lineProxy","offset","data","getValue","eid","setValue","value","_","prop","colorProxy","g","b","Line","setTraits","lineShader","createLinesPipeline","device","format","module","createLinesNode","config","pipeline","bindGroup","ctx","count","encoder","targetView","pass","Lines","resource","entityIdArray","LinesSystem","state","compute","Compute","lines","Transform","LinesPlugin","ComputePlugin","RenderPlugin","render","Render","linesState","createEntityIdBuffer"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { System, Plugin } from '../../core';
2
+ export declare const Orbit: {
3
+ target: number[];
4
+ yaw: number[];
5
+ pitch: number[];
6
+ distance: number[];
7
+ targetYaw: number[];
8
+ targetPitch: number[];
9
+ targetDistance: number[];
10
+ minPitch: number[];
11
+ maxPitch: number[];
12
+ minDistance: number[];
13
+ maxDistance: number[];
14
+ smoothness: number[];
15
+ sensitivity: number[];
16
+ zoomSpeed: number[];
17
+ };
18
+ export declare const OrbitSystem: System;
19
+ export declare const OrbitPlugin: Plugin;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extras/orbit/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAMjF,eAAO,MAAM,KAAK;YACA,MAAM,EAAE;SACX,MAAM,EAAE;WACN,MAAM,EAAE;cACL,MAAM,EAAE;eACP,MAAM,EAAE;iBACN,MAAM,EAAE;oBACL,MAAM,EAAE;cACd,MAAM,EAAE;cACR,MAAM,EAAE;iBACL,MAAM,EAAE;iBACR,MAAM,EAAE;gBACT,MAAM,EAAE;iBACP,MAAM,EAAE;eACV,MAAM,EAAE;CAC5B,CAAC;AAkCF,eAAO,MAAM,WAAW,EAAE,MAsEzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAIzB,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { setTraits as v } from "../../core/component.js";
2
+ import "bitecs";
3
+ import "../../core/builder.js";
4
+ import "../../core/relation.js";
5
+ import { clamp as w, lookAt as T } from "../../core/math.js";
6
+ import "fast-xml-parser";
7
+ import { Transform as s } from "../../standard/transforms/index.js";
8
+ import { InputPlugin as b, Input as O } from "../../standard/input/index.js";
9
+ const m = Math.PI * 2, a = {
10
+ target: [],
11
+ yaw: [],
12
+ pitch: [],
13
+ distance: [],
14
+ targetYaw: [],
15
+ targetPitch: [],
16
+ targetDistance: [],
17
+ minPitch: [],
18
+ maxPitch: [],
19
+ minDistance: [],
20
+ maxDistance: [],
21
+ smoothness: [],
22
+ sensitivity: [],
23
+ zoomSpeed: []
24
+ };
25
+ v(a, {
26
+ defaults: () => ({
27
+ target: 0,
28
+ yaw: 0,
29
+ pitch: Math.PI / 6,
30
+ distance: 8,
31
+ targetYaw: 0,
32
+ targetPitch: Math.PI / 6,
33
+ targetDistance: 10,
34
+ minPitch: -Math.PI / 2 + 0.01,
35
+ maxPitch: Math.PI / 2 - 0.01,
36
+ minDistance: 1,
37
+ maxDistance: 25,
38
+ smoothness: 0.3,
39
+ sensitivity: 5e-3,
40
+ zoomSpeed: 0.025
41
+ })
42
+ });
43
+ function A(i, o) {
44
+ return 1 - Math.pow(1 - i, o * 60);
45
+ }
46
+ function k(i) {
47
+ return (i % m + m) % m;
48
+ }
49
+ function C(i, o) {
50
+ const e = k(o - i);
51
+ return e > Math.PI ? e - m : e;
52
+ }
53
+ const E = {
54
+ group: "simulation",
55
+ update(i) {
56
+ const o = O.from(i), e = i.time.deltaTime;
57
+ for (const t of i.query([a, s])) {
58
+ const l = a.sensitivity[t], x = a.zoomSpeed[t], Y = a.minPitch[t], I = a.maxPitch[t], z = a.minDistance[t], S = a.maxDistance[t], X = a.smoothness[t];
59
+ if (o?.mouse.right && (a.targetYaw[t] -= o.mouse.deltaX * l, a.targetPitch[t] = w(
60
+ a.targetPitch[t] + o.mouse.deltaY * l,
61
+ Y,
62
+ I
63
+ )), o && o.mouse.scrollDelta !== 0) {
64
+ const M = a.targetDistance[t], q = Math.max(0.3, M * 0.08), Z = o.mouse.scrollDelta * x * q;
65
+ a.targetDistance[t] = w(
66
+ M + Z,
67
+ z,
68
+ S
69
+ );
70
+ }
71
+ const r = A(X, e);
72
+ a.yaw[t] += C(a.yaw[t], a.targetYaw[t]) * r, a.pitch[t] += (a.targetPitch[t] - a.pitch[t]) * r, a.distance[t] += (a.targetDistance[t] - a.distance[t]) * r;
73
+ const P = a.yaw[t], h = a.pitch[t], p = a.distance[t];
74
+ let g = 0, u = 0, d = 0;
75
+ const n = a.target[t];
76
+ n && i.hasComponent(n, s) && (g = s.posX[n], u = s.posY[n], d = s.posZ[n]);
77
+ const f = g + p * Math.cos(h) * Math.sin(P), D = u + p * Math.sin(h), y = d + p * Math.cos(h) * Math.cos(P);
78
+ s.posX[t] = f, s.posY[t] = D, s.posZ[t] = y;
79
+ const c = T(f, D, y, g, u, d);
80
+ s.quatX[t] = c.x, s.quatY[t] = c.y, s.quatZ[t] = c.z, s.quatW[t] = c.w;
81
+ }
82
+ }
83
+ }, K = {
84
+ systems: [E],
85
+ components: { Orbit: a },
86
+ dependencies: [b]
87
+ };
88
+ export {
89
+ a as Orbit,
90
+ K as OrbitPlugin,
91
+ E as OrbitSystem
92
+ };
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/extras/orbit/index.ts"],"sourcesContent":["import { setTraits } from \"../../core/component\";\nimport { clamp, lookAt, type State, type System, type Plugin } from \"../../core\";\nimport { Transform } from \"../../standard/transforms\";\nimport { Input, InputPlugin } from \"../../standard/input\";\n\nconst Tau = Math.PI * 2;\n\nexport const Orbit = {\n target: [] as number[],\n yaw: [] as number[],\n pitch: [] as number[],\n distance: [] as number[],\n targetYaw: [] as number[],\n targetPitch: [] as number[],\n targetDistance: [] as number[],\n minPitch: [] as number[],\n maxPitch: [] as number[],\n minDistance: [] as number[],\n maxDistance: [] as number[],\n smoothness: [] as number[],\n sensitivity: [] as number[],\n zoomSpeed: [] as number[],\n};\n\nsetTraits(Orbit, {\n defaults: () => ({\n target: 0,\n yaw: 0,\n pitch: Math.PI / 6,\n distance: 8,\n targetYaw: 0,\n targetPitch: Math.PI / 6,\n targetDistance: 10,\n minPitch: -Math.PI / 2 + 0.01,\n maxPitch: Math.PI / 2 - 0.01,\n minDistance: 1,\n maxDistance: 25,\n smoothness: 0.3,\n sensitivity: 0.005,\n zoomSpeed: 0.025,\n }),\n});\n\nfunction smoothLerp(smoothness: number, dt: number): number {\n return 1 - Math.pow(1 - smoothness, dt * 60);\n}\n\nfunction normalizeAngle(a: number): number {\n return ((a % Tau) + Tau) % Tau;\n}\n\nfunction angleDiff(from: number, to: number): number {\n const diff = normalizeAngle(to - from);\n return diff > Math.PI ? diff - Tau : diff;\n}\n\nexport const OrbitSystem: System = {\n group: \"simulation\",\n\n update(state: State) {\n const input = Input.from(state);\n const dt = state.time.deltaTime;\n\n for (const eid of state.query([Orbit, Transform])) {\n const sensitivity = Orbit.sensitivity[eid];\n const zoomSpeed = Orbit.zoomSpeed[eid];\n const minPitch = Orbit.minPitch[eid];\n const maxPitch = Orbit.maxPitch[eid];\n const minDistance = Orbit.minDistance[eid];\n const maxDistance = Orbit.maxDistance[eid];\n const smoothness = Orbit.smoothness[eid];\n\n if (input?.mouse.right) {\n Orbit.targetYaw[eid] -= input.mouse.deltaX * sensitivity;\n Orbit.targetPitch[eid] = clamp(\n Orbit.targetPitch[eid] + input.mouse.deltaY * sensitivity,\n minPitch,\n maxPitch\n );\n }\n\n if (input && input.mouse.scrollDelta !== 0) {\n const currentDistance = Orbit.targetDistance[eid];\n const distanceScale = Math.max(0.3, currentDistance * 0.08);\n const zoomDelta = input.mouse.scrollDelta * zoomSpeed * distanceScale;\n Orbit.targetDistance[eid] = clamp(\n currentDistance + zoomDelta,\n minDistance,\n maxDistance\n );\n }\n\n const t = smoothLerp(smoothness, dt);\n Orbit.yaw[eid] += angleDiff(Orbit.yaw[eid], Orbit.targetYaw[eid]) * t;\n Orbit.pitch[eid] += (Orbit.targetPitch[eid] - Orbit.pitch[eid]) * t;\n Orbit.distance[eid] += (Orbit.targetDistance[eid] - Orbit.distance[eid]) * t;\n\n const yaw = Orbit.yaw[eid];\n const pitch = Orbit.pitch[eid];\n const distance = Orbit.distance[eid];\n\n let targetX = 0,\n targetY = 0,\n targetZ = 0;\n const targetEid = Orbit.target[eid];\n if (targetEid && state.hasComponent(targetEid, Transform)) {\n targetX = Transform.posX[targetEid];\n targetY = Transform.posY[targetEid];\n targetZ = Transform.posZ[targetEid];\n }\n\n const camX = targetX + distance * Math.cos(pitch) * Math.sin(yaw);\n const camY = targetY + distance * Math.sin(pitch);\n const camZ = targetZ + distance * Math.cos(pitch) * Math.cos(yaw);\n\n Transform.posX[eid] = camX;\n Transform.posY[eid] = camY;\n Transform.posZ[eid] = camZ;\n\n const rotation = lookAt(camX, camY, camZ, targetX, targetY, targetZ);\n Transform.quatX[eid] = rotation.x;\n Transform.quatY[eid] = rotation.y;\n Transform.quatZ[eid] = rotation.z;\n Transform.quatW[eid] = rotation.w;\n }\n },\n};\n\nexport const OrbitPlugin: Plugin = {\n systems: [OrbitSystem],\n components: { Orbit },\n dependencies: [InputPlugin],\n};\n"],"names":["Tau","Orbit","setTraits","smoothLerp","smoothness","dt","normalizeAngle","a","angleDiff","from","to","diff","OrbitSystem","state","input","Input","eid","Transform","sensitivity","zoomSpeed","minPitch","maxPitch","minDistance","maxDistance","clamp","currentDistance","distanceScale","zoomDelta","t","yaw","pitch","distance","targetX","targetY","targetZ","targetEid","camX","camY","camZ","rotation","lookAt","OrbitPlugin","InputPlugin"],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { default as TinySDF } from '@mapbox/tiny-sdf';
2
+ import { Plugin, State } from '../../core';
3
+ import { FieldAccessor } from '../../core/component';
4
+ import { ComputeNode } from '../../standard/compute';
5
+ export declare const TextData: {
6
+ data: Float32Array<ArrayBuffer>;
7
+ };
8
+ interface TextProxy extends Array<number>, FieldAccessor {
9
+ }
10
+ export declare const Text: {
11
+ fontSize: TextProxy;
12
+ opacity: TextProxy;
13
+ visible: TextProxy;
14
+ anchorX: TextProxy;
15
+ anchorY: TextProxy;
16
+ color: TextProxy;
17
+ };
18
+ interface GlyphMetrics {
19
+ width: number;
20
+ height: number;
21
+ glyphWidth: number;
22
+ glyphHeight: number;
23
+ glyphTop: number;
24
+ glyphLeft: number;
25
+ advance: number;
26
+ u0: number;
27
+ v0: number;
28
+ u1: number;
29
+ v1: number;
30
+ }
31
+ interface GlyphAtlas {
32
+ texture: GPUTexture;
33
+ textureView: GPUTextureView;
34
+ width: number;
35
+ height: number;
36
+ glyphs: Map<string, GlyphMetrics>;
37
+ rowHeight: number;
38
+ cursorX: number;
39
+ cursorY: number;
40
+ sdf: TinySDF;
41
+ sdfFontSize: number;
42
+ }
43
+ export interface TextConfig {
44
+ scene: GPUBuffer;
45
+ glyphs: GPUBuffer;
46
+ atlas: GPUTextureView;
47
+ sampler: GPUSampler;
48
+ getCount: () => number;
49
+ }
50
+ export declare function createTextNode(config: TextConfig): ComputeNode;
51
+ export interface TextState {
52
+ content: Map<number, string>;
53
+ atlas: GlyphAtlas;
54
+ sampler: GPUSampler;
55
+ buffer: GPUBuffer;
56
+ staging: Float32Array;
57
+ count: number;
58
+ }
59
+ export declare const TextResource: import('../..').ResourceKey<TextState>;
60
+ export declare function setTextContent(state: State, eid: number, content: string): void;
61
+ export declare function getTextContent(state: State, eid: number): string | undefined;
62
+ export declare const TextPlugin: Plugin;
63
+ export {};
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extras/text/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAA0B,KAAK,MAAM,EAAE,KAAK,KAAK,EAAe,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAGH,KAAK,WAAW,EAEnB,MAAM,wBAAwB,CAAC;AAOhC,eAAO,MAAM,QAAQ;;CAEpB,CAAC;AAEF,UAAU,SAAU,SAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa;CAAG;AAkE3D,eAAO,MAAM,IAAI,EAAE;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CAQpB,CAAC;AAqBF,UAAU,YAAY;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACd;AAED,UAAU,UAAU;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,WAAW,EAAE,cAAc,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB;AAiSD,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,MAAM,MAAM,CAAC;CAC1B;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAiD9D;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,wCAA8B,CAAC;AAExD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5E;AAoFD,eAAO,MAAM,UAAU,EAAE,MA2CxB,CAAC"}