@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 u } from "../../core/state.js";
3
- import "../../core/builder.js";
4
- import { resource as D } 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 y, Compute as m, createEntityIdBuffer as C } from "../../standard/compute/index.js";
10
- import { RenderPlugin as x, Render as N } from "../../standard/render/index.js";
11
- import { Transform as P } from "../../standard/transforms/index.js";
12
- import { LinesPlugin as z, Lines as w, Line as p } from "../lines/index.js";
13
- const h = {
14
- data: new Float32Array(u * 4)
15
- };
16
- function d(e) {
17
- const n = h.data;
18
- function t(o) {
19
- return n[o * 4 + e];
20
- }
21
- function i(o, r) {
22
- n[o * 4 + e] = r;
23
- }
24
- return new Proxy([], {
25
- get(o, r) {
26
- if (r === "get") return t;
27
- if (r === "set") return i;
28
- const a = Number(r);
29
- if (!Number.isNaN(a))
30
- return t(a);
31
- },
32
- set(o, r, a) {
33
- const c = Number(r);
34
- return Number.isNaN(c) ? !1 : (i(c, a), !0);
35
- }
36
- });
37
- }
38
- const s = {
39
- start: d(0),
40
- end: d(1),
41
- size: d(2)
42
- };
43
- b(s, {
44
- defaults: () => ({
45
- start: 0,
46
- end: 1,
47
- size: 1
48
- }),
49
- accessors: {
50
- start: s.start,
51
- end: s.end,
52
- size: s.size
53
- }
54
- });
55
- const A = 2147483648, S = (
56
- /* wgsl */
57
- `
58
- struct VertexOutput {
59
- @builtin(position) position: vec4<f32>,
60
- @location(0) color: vec4<f32>,
61
- }
62
-
63
- struct Scene {
64
- viewProj: mat4x4<f32>,
65
- cameraWorld: mat4x4<f32>,
66
- }
67
-
68
- struct ArrowData {
69
- start: f32,
70
- end: f32,
71
- size: f32,
72
- _pad: f32,
73
- }
74
-
75
- struct LineData {
76
- offset: vec3<f32>,
77
- thickness: f32,
78
- visible: f32,
79
- _pad1: f32,
80
- _pad2: f32,
81
- opacity: f32,
82
- color: vec4<f32>,
83
- }
84
-
85
- const END_FLAG: u32 = 0x80000000u;
86
-
87
- @group(0) @binding(0) var<uniform> scene: Scene;
88
- @group(0) @binding(1) var<storage, read> entityIds: array<u32>;
89
- @group(0) @binding(2) var<storage, read> arrows: array<ArrowData>;
90
- @group(0) @binding(3) var<storage, read> lines: array<LineData>;
91
- @group(0) @binding(4) var<storage, read> matrices: array<mat4x4<f32>>;
92
-
93
- @vertex
94
- fn vs(@builtin(vertex_index) vid: u32, @builtin(instance_index) iid: u32) -> VertexOutput {
95
- let packed = entityIds[iid];
96
- let isEnd = (packed & END_FLAG) != 0u;
97
- let eid = packed & ~END_FLAG;
98
-
99
- let arrow = arrows[eid];
100
- let line = lines[eid];
101
- let transform = matrices[eid];
102
-
103
- let start = transform[3].xyz;
104
- let rotation = mat3x3<f32>(transform[0].xyz, transform[1].xyz, transform[2].xyz);
105
- let end = start + rotation * line.offset;
106
-
107
- // Project both points to clip space
108
- let startClip = scene.viewProj * vec4(start, 1.0);
109
- let endClip = scene.viewProj * vec4(end, 1.0);
110
-
111
- // Convert to NDC
112
- let startNDC = startClip.xy / startClip.w;
113
- let endNDC = endClip.xy / endClip.w;
114
-
115
- // Direction in screen space
116
- let dir = endNDC - startNDC;
117
- let len = length(dir);
118
- let normDir = select(vec2(1.0, 0.0), dir / len, len > 0.0001);
119
-
120
- // Perpendicular in screen space (this naturally faces camera)
121
- let perp = vec2(-normDir.y, normDir.x);
122
-
123
- // Arrow size scales with sqrt of line thickness and world-space distance to camera
124
- let cameraPos = scene.cameraWorld[3].xyz;
125
- let midpoint = (start + end) * 0.5;
126
- let distToCamera = length(cameraPos - midpoint);
127
- let refDist = 15.0;
128
- let rawScale = distToCamera / refDist;
129
- let maxScale = 3.0;
130
- let zoomScale = max(1.0, rawScale / (1.0 + rawScale / maxScale));
131
- let baseSize = sqrt(line.thickness) * 0.008 * zoomScale;
132
- let arrowLength = arrow.size * baseSize * 3.0;
133
- let arrowWidth = arrow.size * baseSize * 1.5;
134
-
135
- // Pick anchor position and direction based on which end
136
- var anchorNDC: vec2<f32>;
137
- var anchorDepth: f32;
138
- var arrowDir: vec2<f32>;
139
-
140
- if isEnd {
141
- anchorNDC = endNDC;
142
- anchorDepth = endClip.z / endClip.w;
143
- arrowDir = normDir;
144
- } else {
145
- anchorNDC = startNDC;
146
- anchorDepth = startClip.z / startClip.w;
147
- arrowDir = -normDir;
148
- }
149
-
150
- // Build triangle centered on anchor (tip extends forward, base extends back)
151
- let halfLen = arrowLength * 0.5;
152
- var pos: vec2<f32>;
153
- switch vid {
154
- case 0u: { pos = anchorNDC + arrowDir * halfLen; }
155
- case 1u: { pos = anchorNDC - arrowDir * halfLen + perp * arrowWidth; }
156
- case 2u: { pos = anchorNDC - arrowDir * halfLen - perp * arrowWidth; }
157
- default: { pos = anchorNDC; }
158
- }
159
-
160
- var out: VertexOutput;
161
- out.position = vec4(pos, anchorDepth, 1.0);
162
- out.color = vec4(line.color.rgb, line.color.a * line.opacity);
163
- return out;
164
- }
165
-
166
- @fragment
167
- fn fs(input: VertexOutput) -> @location(0) vec4<f32> {
168
- return input.color;
169
- }
170
- `
171
- );
172
- function L(e, n) {
173
- const t = e.createShaderModule({ code: S });
174
- return e.createRenderPipeline({
175
- layout: "auto",
176
- vertex: {
177
- module: t,
178
- entryPoint: "vs"
179
- },
180
- fragment: {
181
- module: t,
182
- entryPoint: "fs",
183
- targets: [
184
- {
185
- format: n,
186
- blend: {
187
- color: {
188
- srcFactor: "src-alpha",
189
- dstFactor: "one-minus-src-alpha",
190
- operation: "add"
191
- },
192
- alpha: {
193
- srcFactor: "one",
194
- dstFactor: "one-minus-src-alpha",
195
- operation: "add"
196
- }
197
- }
198
- }
199
- ]
200
- },
201
- primitive: {
202
- topology: "triangle-list"
203
- }
204
- });
205
- }
206
- function _(e) {
207
- let n = null, t = null;
208
- return {
209
- id: "arrows",
210
- phase: "overlay",
211
- inputs: [],
212
- outputs: [],
213
- execute(i) {
214
- const o = e.getCount();
215
- if (o === 0) return;
216
- const { device: r, encoder: a, format: c } = i, g = i.getTextureView("scene") ?? i.canvasView;
217
- n || (n = L(r, c)), t || (t = r.createBindGroup({
218
- layout: n.getBindGroupLayout(0),
219
- entries: [
220
- { binding: 0, resource: { buffer: e.scene } },
221
- { binding: 1, resource: { buffer: e.entityIds } },
222
- { binding: 2, resource: { buffer: e.arrows } },
223
- { binding: 3, resource: { buffer: e.lines } },
224
- { binding: 4, resource: { buffer: e.matrices } }
225
- ]
226
- }));
227
- const l = a.beginRenderPass({
228
- colorAttachments: [
229
- {
230
- view: g,
231
- loadOp: "load",
232
- storeOp: "store"
233
- }
234
- ]
235
- });
236
- l.setPipeline(n), l.setBindGroup(0, t), l.draw(3, o), l.end();
237
- }
238
- };
239
- }
240
- const v = D("arrows"), f = new Uint32Array(u * 2), E = {
241
- group: "draw",
242
- update(e) {
243
- const n = m.from(e), t = v.from(e), i = w.from(e);
244
- if (!n || !t || !i) return;
245
- const { device: o } = n;
246
- let r = 0;
247
- for (const a of e.query([s, p, P]))
248
- p.visible[a] && (s.start[a] && (f[r++] = a), s.end[a] && (f[r++] = a | A));
249
- o.queue.writeBuffer(t.buffer, 0, h.data), o.queue.writeBuffer(t.entityIds, 0, f, 0, r), t.count = r;
250
- }
251
- }, j = {
252
- systems: [E],
253
- components: { Arrow: s },
254
- dependencies: [y, x, z],
255
- initialize(e) {
256
- const n = m.from(e), t = N.from(e), i = w.from(e);
257
- if (!n || !t || !i) return;
258
- const { device: o } = n, r = {
259
- buffer: o.createBuffer({
260
- label: "arrows",
261
- size: u * 4 * 4,
262
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
263
- }),
264
- entityIds: C(o, u * 2),
265
- count: 0
266
- };
267
- e.setResource(v, r), n.graph.add(
268
- _({
269
- scene: t.scene,
270
- arrows: r.buffer,
271
- lines: i.buffer,
272
- matrices: t.matrices,
273
- entityIds: r.entityIds,
274
- getCount: () => r.count
275
- })
276
- );
277
- }
278
- };
279
- export {
280
- s as Arrow,
281
- h as ArrowData,
282
- v as Arrows,
283
- j as ArrowsPlugin,
284
- S as arrowShader,
285
- _ as createArrowsNode,
286
- L as createArrowsPipeline
287
- };
288
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/extras/arrows/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\";\nimport { Line, Lines, LinesPlugin } from \"../lines\";\n\nexport const ArrowData = {\n data: new Float32Array(MAX_ENTITIES * 4),\n};\n\ninterface ArrowProxy extends Array<number>, FieldAccessor {}\n\nfunction arrowProxy(offset: number): ArrowProxy {\n const data = ArrowData.data;\n\n function getValue(eid: number): number {\n return data[eid * 4 + offset];\n }\n\n function setValue(eid: number, value: number): void {\n data[eid * 4 + offset] = value;\n }\n\n return new Proxy([] as unknown as ArrowProxy, {\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 Arrow: {\n start: ArrowProxy;\n end: ArrowProxy;\n size: ArrowProxy;\n} = {\n start: arrowProxy(0),\n end: arrowProxy(1),\n size: arrowProxy(2),\n};\n\nsetTraits(Arrow, {\n defaults: () => ({\n start: 0,\n end: 1,\n size: 1,\n }),\n accessors: {\n start: Arrow.start,\n end: Arrow.end,\n size: Arrow.size,\n },\n});\n\nexport interface ArrowsConfig {\n scene: GPUBuffer;\n arrows: GPUBuffer;\n lines: GPUBuffer;\n matrices: GPUBuffer;\n entityIds: GPUBuffer;\n getCount: () => number;\n}\n\nconst END_FLAG = 0x80000000;\n\nexport const arrowShader = /* 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 ArrowData {\n start: f32,\n end: f32,\n size: f32,\n _pad: 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\nconst END_FLAG: u32 = 0x80000000u;\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> arrows: array<ArrowData>;\n@group(0) @binding(3) var<storage, read> lines: array<LineData>;\n@group(0) @binding(4) 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 packed = entityIds[iid];\n let isEnd = (packed & END_FLAG) != 0u;\n let eid = packed & ~END_FLAG;\n\n let arrow = arrows[eid];\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 // Project both points to clip space\n let startClip = scene.viewProj * vec4(start, 1.0);\n let endClip = scene.viewProj * vec4(end, 1.0);\n\n // Convert to NDC\n let startNDC = startClip.xy / startClip.w;\n let endNDC = endClip.xy / endClip.w;\n\n // Direction in screen space\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 // Perpendicular in screen space (this naturally faces camera)\n let perp = vec2(-normDir.y, normDir.x);\n\n // Arrow size scales with sqrt of line thickness and world-space distance to camera\n let cameraPos = scene.cameraWorld[3].xyz;\n let midpoint = (start + end) * 0.5;\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 baseSize = sqrt(line.thickness) * 0.008 * zoomScale;\n let arrowLength = arrow.size * baseSize * 3.0;\n let arrowWidth = arrow.size * baseSize * 1.5;\n\n // Pick anchor position and direction based on which end\n var anchorNDC: vec2<f32>;\n var anchorDepth: f32;\n var arrowDir: vec2<f32>;\n\n if isEnd {\n anchorNDC = endNDC;\n anchorDepth = endClip.z / endClip.w;\n arrowDir = normDir;\n } else {\n anchorNDC = startNDC;\n anchorDepth = startClip.z / startClip.w;\n arrowDir = -normDir;\n }\n\n // Build triangle centered on anchor (tip extends forward, base extends back)\n let halfLen = arrowLength * 0.5;\n var pos: vec2<f32>;\n switch vid {\n case 0u: { pos = anchorNDC + arrowDir * halfLen; }\n case 1u: { pos = anchorNDC - arrowDir * halfLen + perp * arrowWidth; }\n case 2u: { pos = anchorNDC - arrowDir * halfLen - perp * arrowWidth; }\n default: { pos = anchorNDC; }\n }\n\n var out: VertexOutput;\n out.position = vec4(pos, anchorDepth, 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 createArrowsPipeline(\n device: GPUDevice,\n format: GPUTextureFormat\n): GPURenderPipeline {\n const module = device.createShaderModule({ code: arrowShader });\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 createArrowsNode(config: ArrowsConfig): ComputeNode {\n let pipeline: GPURenderPipeline | null = null;\n let bindGroup: GPUBindGroup | null = null;\n\n return {\n id: \"arrows\",\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 = createArrowsPipeline(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.arrows } },\n { binding: 3, resource: { buffer: config.lines } },\n { binding: 4, 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(3, count);\n pass.end();\n },\n };\n}\n\nexport interface ArrowsState {\n buffer: GPUBuffer;\n entityIds: GPUBuffer;\n count: number;\n}\n\nexport const Arrows = resource<ArrowsState>(\"arrows\");\n\nconst arrowEntityIdArray = new Uint32Array(MAX_ENTITIES * 2);\n\nconst ArrowsSystem: System = {\n group: \"draw\",\n\n update(state: State) {\n const compute = Compute.from(state);\n const arrows = Arrows.from(state);\n const lines = Lines.from(state);\n if (!compute || !arrows || !lines) return;\n\n const { device } = compute;\n\n let count = 0;\n for (const eid of state.query([Arrow, Line, Transform])) {\n if (!Line.visible[eid]) continue;\n\n if (Arrow.start[eid]) {\n arrowEntityIdArray[count++] = eid;\n }\n if (Arrow.end[eid]) {\n arrowEntityIdArray[count++] = eid | END_FLAG;\n }\n }\n\n device.queue.writeBuffer(arrows.buffer, 0, ArrowData.data);\n device.queue.writeBuffer(arrows.entityIds, 0, arrowEntityIdArray, 0, count);\n arrows.count = count;\n },\n};\n\nexport const ArrowsPlugin: Plugin = {\n systems: [ArrowsSystem],\n components: { Arrow },\n dependencies: [ComputePlugin, RenderPlugin, LinesPlugin],\n\n initialize(state: State) {\n const compute = Compute.from(state);\n const render = Render.from(state);\n const lines = Lines.from(state);\n if (!compute || !render || !lines) return;\n\n const { device } = compute;\n\n const arrowsState: ArrowsState = {\n buffer: device.createBuffer({\n label: \"arrows\",\n size: MAX_ENTITIES * 4 * 4,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n }),\n entityIds: createEntityIdBuffer(device, MAX_ENTITIES * 2),\n count: 0,\n };\n\n state.setResource(Arrows, arrowsState);\n\n compute.graph.add(\n createArrowsNode({\n scene: render.scene,\n arrows: arrowsState.buffer,\n lines: lines.buffer,\n matrices: render.matrices,\n entityIds: arrowsState.entityIds,\n getCount: () => arrowsState.count,\n })\n );\n },\n};\n"],"names":["ArrowData","MAX_ENTITIES","arrowProxy","offset","data","getValue","eid","setValue","value","_","prop","Arrow","setTraits","END_FLAG","arrowShader","createArrowsPipeline","device","format","module","createArrowsNode","config","pipeline","bindGroup","ctx","count","encoder","targetView","pass","Arrows","resource","arrowEntityIdArray","ArrowsSystem","state","compute","Compute","arrows","lines","Lines","Line","Transform","ArrowsPlugin","ComputePlugin","RenderPlugin","LinesPlugin","render","Render","arrowsState","createEntityIdBuffer"],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export * from './orbit';
2
- export * from './lines';
3
- export * from './arrows';
4
- export * from './text';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extras/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC"}
@@ -1,31 +0,0 @@
1
- import { Orbit as t, OrbitPlugin as o, OrbitSystem as i } from "./orbit/index.js";
2
- import { Line as a, LineData as s, Lines as x, LinesPlugin as l, createLinesNode as w, createLinesPipeline as T, lineShader as c } from "./lines/index.js";
3
- import { Arrow as A, ArrowData as L, Arrows as P, ArrowsPlugin as d, arrowShader as g, createArrowsNode as m, createArrowsPipeline as u } from "./arrows/index.js";
4
- import { Text as b, TextData as D, TextPlugin as N, TextResource as O, createTextNode as S, getTextContent as h, setTextContent as C } from "./text/index.js";
5
- export {
6
- A as Arrow,
7
- L as ArrowData,
8
- P as Arrows,
9
- d as ArrowsPlugin,
10
- a as Line,
11
- s as LineData,
12
- x as Lines,
13
- l as LinesPlugin,
14
- t as Orbit,
15
- o as OrbitPlugin,
16
- i as OrbitSystem,
17
- b as Text,
18
- D as TextData,
19
- N as TextPlugin,
20
- O as TextResource,
21
- g as arrowShader,
22
- m as createArrowsNode,
23
- u as createArrowsPipeline,
24
- w as createLinesNode,
25
- T as createLinesPipeline,
26
- S as createTextNode,
27
- h as getTextContent,
28
- c as lineShader,
29
- C as setTextContent
30
- };
31
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,36 +0,0 @@
1
- import { Plugin } from '../../core';
2
- import { FieldAccessor } from '../../core/component';
3
- import { ComputeNode } from '../../standard/compute';
4
- export declare const LineData: {
5
- data: Float32Array<ArrayBuffer>;
6
- };
7
- interface LineProxy extends Array<number>, FieldAccessor {
8
- }
9
- export declare const Line: {
10
- offsetX: LineProxy;
11
- offsetY: LineProxy;
12
- offsetZ: LineProxy;
13
- thickness: LineProxy;
14
- visible: LineProxy;
15
- opacity: LineProxy;
16
- color: LineProxy;
17
- };
18
- export interface LinesConfig {
19
- scene: GPUBuffer;
20
- lines: GPUBuffer;
21
- entityIds: GPUBuffer;
22
- matrices: GPUBuffer;
23
- getCount: () => number;
24
- }
25
- export declare const lineShader = "\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";
26
- export declare function createLinesPipeline(device: GPUDevice, format: GPUTextureFormat): GPURenderPipeline;
27
- export declare function createLinesNode(config: LinesConfig): ComputeNode;
28
- export interface LinesState {
29
- buffer: GPUBuffer;
30
- entityIds: GPUBuffer;
31
- count: number;
32
- }
33
- export declare const Lines: import('../..').ResourceKey<LinesState>;
34
- export declare const LinesPlugin: Plugin;
35
- export {};
36
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extras/lines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,MAAM,EAA2B,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAIH,KAAK,WAAW,EAEnB,MAAM,wBAAwB,CAAC;AAIhC,eAAO,MAAM,QAAQ;;CAEpB,CAAC;AAEF,UAAU,SAAU,SAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa;CAAG;AAkE3D,eAAO,MAAM,IAAI,EAAE;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CASpB,CAAC;AAuBF,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,MAAM,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,UAAU,ugFAgFtB,CAAC;AAEF,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACzB,iBAAiB,CAkCnB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAiDhE;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,KAAK,yCAAgC,CAAC;AA0BnD,eAAO,MAAM,WAAW,EAAE,MAkCzB,CAAC"}