@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.
- package/package.json +8 -32
- package/src/standard/compute/index.ts +36 -0
- package/src/standard/render/camera.ts +1 -1
- package/dist/core/builder.d.ts +0 -25
- package/dist/core/builder.d.ts.map +0 -1
- package/dist/core/builder.js +0 -88
- package/dist/core/builder.js.map +0 -1
- package/dist/core/component.d.ts +0 -29
- package/dist/core/component.d.ts.map +0 -1
- package/dist/core/component.js +0 -36
- package/dist/core/component.js.map +0 -1
- package/dist/core/index.d.ts +0 -13
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/math.d.ts +0 -32
- package/dist/core/math.d.ts.map +0 -1
- package/dist/core/math.js +0 -39
- package/dist/core/math.js.map +0 -1
- package/dist/core/relation.d.ts +0 -16
- package/dist/core/relation.d.ts.map +0 -1
- package/dist/core/relation.js +0 -32
- package/dist/core/relation.js.map +0 -1
- package/dist/core/resource.d.ts +0 -9
- package/dist/core/resource.d.ts.map +0 -1
- package/dist/core/resource.js +0 -12
- package/dist/core/resource.js.map +0 -1
- package/dist/core/runtime.d.ts +0 -13
- package/dist/core/runtime.d.ts.map +0 -1
- package/dist/core/runtime.js +0 -118
- package/dist/core/runtime.js.map +0 -1
- package/dist/core/scheduler.d.ts +0 -47
- package/dist/core/scheduler.d.ts.map +0 -1
- package/dist/core/scheduler.js +0 -138
- package/dist/core/scheduler.js.map +0 -1
- package/dist/core/state.d.ts +0 -62
- package/dist/core/state.d.ts.map +0 -1
- package/dist/core/state.js +0 -185
- package/dist/core/state.js.map +0 -1
- package/dist/core/strings.d.ts +0 -3
- package/dist/core/strings.d.ts.map +0 -1
- package/dist/core/strings.js +0 -11
- package/dist/core/strings.js.map +0 -1
- package/dist/core/types.d.ts +0 -33
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/xml.d.ts +0 -42
- package/dist/core/xml.d.ts.map +0 -1
- package/dist/core/xml.js +0 -349
- package/dist/core/xml.js.map +0 -1
- package/dist/extras/arrows/index.d.ts +0 -33
- package/dist/extras/arrows/index.d.ts.map +0 -1
- package/dist/extras/arrows/index.js +0 -288
- package/dist/extras/arrows/index.js.map +0 -1
- package/dist/extras/index.d.ts +0 -5
- package/dist/extras/index.d.ts.map +0 -1
- package/dist/extras/index.js +0 -31
- package/dist/extras/index.js.map +0 -1
- package/dist/extras/lines/index.d.ts +0 -36
- package/dist/extras/lines/index.d.ts.map +0 -1
- package/dist/extras/lines/index.js +0 -288
- package/dist/extras/lines/index.js.map +0 -1
- package/dist/extras/orbit/index.d.ts +0 -20
- package/dist/extras/orbit/index.d.ts.map +0 -1
- package/dist/extras/orbit/index.js +0 -93
- package/dist/extras/orbit/index.js.map +0 -1
- package/dist/extras/text/index.d.ts +0 -64
- package/dist/extras/text/index.d.ts.map +0 -1
- package/dist/extras/text/index.js +0 -423
- package/dist/extras/text/index.js.map +0 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -187
- package/dist/index.js.map +0 -1
- package/dist/rust/transforms/pkg/shallot_transforms.js +0 -107
- package/dist/rust/transforms/pkg/shallot_transforms.js.map +0 -1
- package/dist/standard/compute/graph.d.ts +0 -37
- package/dist/standard/compute/graph.d.ts.map +0 -1
- package/dist/standard/compute/graph.js +0 -85
- package/dist/standard/compute/graph.js.map +0 -1
- package/dist/standard/compute/index.d.ts +0 -21
- package/dist/standard/compute/index.d.ts.map +0 -1
- package/dist/standard/compute/index.js +0 -81
- package/dist/standard/compute/index.js.map +0 -1
- package/dist/standard/defaults.d.ts +0 -3
- package/dist/standard/defaults.d.ts.map +0 -1
- package/dist/standard/defaults.js +0 -18
- package/dist/standard/defaults.js.map +0 -1
- package/dist/standard/index.d.ts +0 -8
- package/dist/standard/index.d.ts.map +0 -1
- package/dist/standard/input/index.d.ts +0 -5
- package/dist/standard/input/index.d.ts.map +0 -1
- package/dist/standard/input/index.js +0 -70
- package/dist/standard/input/index.js.map +0 -1
- package/dist/standard/loading/index.d.ts +0 -7
- package/dist/standard/loading/index.d.ts.map +0 -1
- package/dist/standard/loading/index.js +0 -91
- package/dist/standard/loading/index.js.map +0 -1
- package/dist/standard/render/camera.d.ts +0 -36
- package/dist/standard/render/camera.d.ts.map +0 -1
- package/dist/standard/render/camera.js +0 -71
- package/dist/standard/render/camera.js.map +0 -1
- package/dist/standard/render/forward.d.ts +0 -30
- package/dist/standard/render/forward.d.ts.map +0 -1
- package/dist/standard/render/forward.js +0 -158
- package/dist/standard/render/forward.js.map +0 -1
- package/dist/standard/render/index.d.ts +0 -22
- package/dist/standard/render/index.d.ts.map +0 -1
- package/dist/standard/render/index.js +0 -153
- package/dist/standard/render/index.js.map +0 -1
- package/dist/standard/render/light.d.ts +0 -25
- package/dist/standard/render/light.d.ts.map +0 -1
- package/dist/standard/render/light.js +0 -48
- package/dist/standard/render/light.js.map +0 -1
- package/dist/standard/render/mesh/box.d.ts +0 -3
- package/dist/standard/render/mesh/box.d.ts.map +0 -1
- package/dist/standard/render/mesh/box.js +0 -190
- package/dist/standard/render/mesh/box.js.map +0 -1
- package/dist/standard/render/mesh/index.d.ts +0 -52
- package/dist/standard/render/mesh/index.d.ts.map +0 -1
- package/dist/standard/render/mesh/index.js +0 -158
- package/dist/standard/render/mesh/index.js.map +0 -1
- package/dist/standard/render/mesh/plane.d.ts +0 -3
- package/dist/standard/render/mesh/plane.d.ts.map +0 -1
- package/dist/standard/render/mesh/plane.js +0 -33
- package/dist/standard/render/mesh/plane.js.map +0 -1
- package/dist/standard/render/mesh/sphere.d.ts +0 -3
- package/dist/standard/render/mesh/sphere.d.ts.map +0 -1
- package/dist/standard/render/mesh/sphere.js +0 -25
- package/dist/standard/render/mesh/sphere.js.map +0 -1
- package/dist/standard/render/postprocess.d.ts +0 -11
- package/dist/standard/render/postprocess.d.ts.map +0 -1
- package/dist/standard/render/postprocess.js +0 -190
- package/dist/standard/render/postprocess.js.map +0 -1
- package/dist/standard/render/scene.d.ts +0 -8
- package/dist/standard/render/scene.d.ts.map +0 -1
- package/dist/standard/render/scene.js +0 -67
- package/dist/standard/render/scene.js.map +0 -1
- package/dist/standard/transforms/index.d.ts +0 -27
- package/dist/standard/transforms/index.d.ts.map +0 -1
- package/dist/standard/transforms/index.js +0 -122
- package/dist/standard/transforms/index.js.map +0 -1
- package/dist/standard/transforms/wasm.d.ts +0 -17
- package/dist/standard/transforms/wasm.d.ts.map +0 -1
- package/dist/standard/transforms/wasm.js +0 -31
- package/dist/standard/transforms/wasm.js.map +0 -1
- package/dist/standard/tween/easing.d.ts +0 -5
- package/dist/standard/tween/easing.d.ts.map +0 -1
- package/dist/standard/tween/easing.js +0 -80
- package/dist/standard/tween/easing.js.map +0 -1
- package/dist/standard/tween/index.d.ts +0 -4
- package/dist/standard/tween/index.d.ts.map +0 -1
- package/dist/standard/tween/sequence.d.ts +0 -20
- package/dist/standard/tween/sequence.d.ts.map +0 -1
- package/dist/standard/tween/sequence.js +0 -95
- package/dist/standard/tween/sequence.js.map +0 -1
- package/dist/standard/tween/tween.d.ts +0 -28
- package/dist/standard/tween/tween.d.ts.map +0 -1
- package/dist/standard/tween/tween.js +0 -136
- package/dist/standard/tween/tween.js.map +0 -1
- 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"}
|