@multiplekex/shallot 0.1.0 → 0.1.2

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 -32
  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
@@ -1,288 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1,20 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,93 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1,64 +0,0 @@
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
@@ -1 +0,0 @@
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"}