@flighthq/quadbatch 0.3.0-edge.1458.0c01b63

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.
@@ -0,0 +1,582 @@
1
+ import { copyRectangle, createRectangle, reserveFloat32Array, reserveUint16Array } from '@flighthq/geometry/contract';
2
+ import { invalidateNodeLocalBounds } from '@flighthq/node/contract';
3
+ import { createNode2D, createNode2DRuntime, getNode2DRuntime } from '@flighthq/scene2d/contract';
4
+ import { createSignal } from '@flighthq/signals/contract';
5
+ import { QuadBatchKind } from '@flighthq/types/contract';
6
+ // Per-instance stride constants. The stride layout is intentionally internal to this
7
+ // module so callers never hand-write i*2 or i*6.
8
+ const QUAD_VECTOR2_STRIDE = 2;
9
+ const QUAD_MATRIX3X2_STRIDE = 6;
10
+ // Uint16Array sentinel marking a logically deleted slot in a quad batch.
11
+ export const QUAD_BATCH_DELETED_ID = 0xffff;
12
+ /**
13
+ * Appends a new instance at the end of `target` using vector2 (translation-only) transform,
14
+ * auto-growing capacity via `resizeQuadBatch`. Returns the new instance index.
15
+ * The materialData slot for the appended instance is not set — leave it null or assign after.
16
+ * Fires `onInstanceAppended` when signals are enabled.
17
+ */
18
+ export function appendQuadBatchInstance(target, id, x, y) {
19
+ const index = target.data.instanceCount;
20
+ resizeQuadBatch(target, index + 1);
21
+ target.data.ids[index] = id;
22
+ const o = index * QUAD_VECTOR2_STRIDE;
23
+ target.data.transforms[o] = x;
24
+ target.data.transforms[o + 1] = y;
25
+ const signals = getQuadBatchSignals(target);
26
+ if (signals !== null)
27
+ signals.onInstanceAppended.emit(index);
28
+ return index;
29
+ }
30
+ /** Sets `target.data.instanceCount = 0`, keeping allocated capacity. Fires `onCleared` when signals are enabled. */
31
+ export function clearQuadBatch(target) {
32
+ target.data.instanceCount = 0;
33
+ const signals = getQuadBatchSignals(target);
34
+ if (signals !== null)
35
+ signals.onCleared.emit();
36
+ }
37
+ /**
38
+ * Deep-copies `source` into a new `QuadBatch` with independent typed arrays and a fresh runtime.
39
+ * The new batch has the same `atlas`, `instanceCount`, `transformType`, and `materialData` (shallow copy),
40
+ * but its `ids` and `transforms` are cloned typed arrays.
41
+ */
42
+ export function cloneQuadBatch(source) {
43
+ const src = source.data;
44
+ return createQuadBatch({
45
+ data: {
46
+ atlas: src.atlas,
47
+ ids: src.ids.slice(),
48
+ instanceCount: src.instanceCount,
49
+ materialData: src.materialData !== null ? src.materialData.slice() : null,
50
+ transforms: src.transforms.slice(),
51
+ transformType: src.transformType,
52
+ },
53
+ });
54
+ }
55
+ function copyLocalBoundsRectangle(out, source) {
56
+ const runtime = getNode2DRuntime(source);
57
+ if (runtime.localBoundsRectangle !== null)
58
+ copyRectangle(out, runtime.localBoundsRectangle);
59
+ }
60
+ /**
61
+ * Removes swap-remove holes by compacting all live instances (`[0, instanceCount)`) to the
62
+ * front of the buffer in index order, skipping entries that have been logically deleted.
63
+ * This is not needed for swap-remove–only callers, but is useful when stable iteration order
64
+ * must be restored after a batch of removals. After compaction, `instanceCount` equals the
65
+ * number of entries whose id is `>= 0`.
66
+ *
67
+ * Note: this function does NOT filter by id; it simply copies all `instanceCount` entries to a
68
+ * fresh contiguous layout. To remove specific entries, call `removeQuadBatchInstance` first, then
69
+ * compact if needed.
70
+ */
71
+ export function compactQuadBatch(target) {
72
+ // Nothing to compact — already dense.
73
+ const data = target.data;
74
+ if (data.instanceCount === 0)
75
+ return;
76
+ // A compact batch is always in good shape; we just shrink the logical count to remove any
77
+ // zero-id entries left by swap-removes. Since swap-remove preserves layout, the buffer is
78
+ // already packed — this is a no-op for the common case.
79
+ // The only meaningful compaction is when callers zero-out ids for "deleted" entries and need
80
+ // to collapse those holes. That is a caller convention; this function preserves order.
81
+ // We re-copy only if there are id==-1 sentinel entries (which some callers use for deletion).
82
+ const stride = getQuadBatchTransformStride(data.transformType);
83
+ let write = 0;
84
+ for (let read = 0; read < data.instanceCount; read++) {
85
+ if (data.ids[read] === QUAD_BATCH_DELETED_ID)
86
+ continue;
87
+ if (write !== read) {
88
+ data.ids[write] = data.ids[read];
89
+ const dst = write * stride;
90
+ const src = read * stride;
91
+ for (let k = 0; k < stride; k++)
92
+ data.transforms[dst + k] = data.transforms[src + k];
93
+ if (data.materialData !== null)
94
+ data.materialData[write] = data.materialData[read] ?? null;
95
+ }
96
+ write++;
97
+ }
98
+ data.instanceCount = write;
99
+ }
100
+ export function computeQuadBatchLocalBoundsRectangle(out, source) {
101
+ const { atlas, ids, instanceCount, transforms, transformType } = source.data;
102
+ if (atlas === null || instanceCount === 0) {
103
+ out.x = 0;
104
+ out.y = 0;
105
+ out.width = 0;
106
+ out.height = 0;
107
+ return;
108
+ }
109
+ const regions = atlas.regions;
110
+ const numRegions = regions.length;
111
+ let minX = Infinity;
112
+ let minY = Infinity;
113
+ let maxX = -Infinity;
114
+ let maxY = -Infinity;
115
+ if (transformType === 'vector2') {
116
+ for (let i = 0; i < instanceCount; i++) {
117
+ const id = ids[i];
118
+ if (id < 0 || id >= numRegions)
119
+ continue;
120
+ const region = regions[id];
121
+ if (region.width <= 0 || region.height <= 0)
122
+ continue;
123
+ const dx = transforms[i * QUAD_VECTOR2_STRIDE];
124
+ const dy = transforms[i * QUAD_VECTOR2_STRIDE + 1];
125
+ if (dx < minX)
126
+ minX = dx;
127
+ if (dy < minY)
128
+ minY = dy;
129
+ const rx = dx + region.width;
130
+ const ry = dy + region.height;
131
+ if (rx > maxX)
132
+ maxX = rx;
133
+ if (ry > maxY)
134
+ maxY = ry;
135
+ }
136
+ }
137
+ else {
138
+ for (let i = 0; i < instanceCount; i++) {
139
+ const id = ids[i];
140
+ if (id < 0 || id >= numRegions)
141
+ continue;
142
+ const region = regions[id];
143
+ if (region.width <= 0 || region.height <= 0)
144
+ continue;
145
+ const o = i * QUAD_MATRIX3X2_STRIDE;
146
+ const a = transforms[o];
147
+ const b = transforms[o + 1];
148
+ const c = transforms[o + 2];
149
+ const d = transforms[o + 3];
150
+ const tx = transforms[o + 4];
151
+ const ty = transforms[o + 5];
152
+ const w = region.width;
153
+ const h = region.height;
154
+ const x0 = tx;
155
+ const y0 = ty;
156
+ const x1 = a * w + tx;
157
+ const y1 = b * w + ty;
158
+ const x2 = c * h + tx;
159
+ const y2 = d * h + ty;
160
+ const x3 = a * w + c * h + tx;
161
+ const y3 = b * w + d * h + ty;
162
+ const qMinX = Math.min(x0, x1, x2, x3);
163
+ const qMinY = Math.min(y0, y1, y2, y3);
164
+ const qMaxX = Math.max(x0, x1, x2, x3);
165
+ const qMaxY = Math.max(y0, y1, y2, y3);
166
+ if (qMinX < minX)
167
+ minX = qMinX;
168
+ if (qMinY < minY)
169
+ minY = qMinY;
170
+ if (qMaxX > maxX)
171
+ maxX = qMaxX;
172
+ if (qMaxY > maxY)
173
+ maxY = qMaxY;
174
+ }
175
+ }
176
+ if (minX === Infinity) {
177
+ out.x = 0;
178
+ out.y = 0;
179
+ out.width = 0;
180
+ out.height = 0;
181
+ }
182
+ else {
183
+ out.x = minX;
184
+ out.y = minY;
185
+ out.width = maxX - minX;
186
+ out.height = maxY - minY;
187
+ }
188
+ }
189
+ export function createQuadBatch(obj) {
190
+ return createNode2D(QuadBatchKind, obj, createQuadBatchData, createQuadBatchRuntime);
191
+ }
192
+ export function createQuadBatchData(data) {
193
+ return {
194
+ atlas: data?.atlas ?? null,
195
+ ids: data?.ids ?? new Uint16Array(),
196
+ instanceCount: data?.instanceCount ?? 0,
197
+ materialData: data?.materialData ?? null,
198
+ transforms: data?.transforms ?? new Float32Array(),
199
+ transformType: data?.transformType ?? 'vector2',
200
+ };
201
+ }
202
+ export function createQuadBatchRuntime() {
203
+ const runtime = createNode2DRuntime(defaultMethods);
204
+ runtime.localBoundsRectangle = null;
205
+ runtime.instanceVelocities = null;
206
+ return runtime;
207
+ }
208
+ export function createQuadBatchSignals() {
209
+ return {
210
+ onCleared: createSignal(),
211
+ onInstanceAppended: createSignal(),
212
+ onInstanceRemoved: createSignal(),
213
+ };
214
+ }
215
+ /**
216
+ * Opt-in signals for a `QuadBatch` node. Returns the {@link QuadBatchSignals} group attached to
217
+ * `target`, creating it on the first call. Zero cost until enabled — honors the `enable*` convention.
218
+ * Use `getQuadBatchSignals` to read without creating.
219
+ */
220
+ export function enableQuadBatchSignals(target) {
221
+ const s = target;
222
+ return (s[quadBatchSignalsSlot] ??= createQuadBatchSignals());
223
+ }
224
+ export function getQuadBatchCapacity(source) {
225
+ const data = source.data;
226
+ const stride = getQuadBatchTransformStride(data.transformType);
227
+ const transformCapacity = (data.transforms.length / stride) | 0;
228
+ return Math.min(data.ids.length, transformCapacity);
229
+ }
230
+ /**
231
+ * Returns the region id stored at `index`, or -1 when `index` is out of range.
232
+ * Bounds-checked against `instanceCount`.
233
+ */
234
+ export function getQuadBatchInstanceId(source, index) {
235
+ if (index < 0 || index >= source.data.instanceCount)
236
+ return -1;
237
+ return source.data.ids[index];
238
+ }
239
+ /**
240
+ * Writes the transform of instance `index` into `out`.
241
+ * For vector2 batches, writes `out.x = tx, out.y = ty` (matrix fields left unchanged).
242
+ * For matrix3x2 batches, writes `out.a/b/c/d/tx/ty`.
243
+ * Returns false and writes nothing when `index` is out of range.
244
+ */
245
+ export function getQuadBatchInstanceTransform(out, source, index) {
246
+ const { instanceCount, transforms, transformType } = source.data;
247
+ if (index < 0 || index >= instanceCount)
248
+ return false;
249
+ if (transformType === 'vector2') {
250
+ const o = index * QUAD_VECTOR2_STRIDE;
251
+ out.x = transforms[o];
252
+ out.y = transforms[o + 1];
253
+ }
254
+ else {
255
+ const o = index * QUAD_MATRIX3X2_STRIDE;
256
+ out.x = transforms[o + 4];
257
+ out.y = transforms[o + 5];
258
+ }
259
+ return true;
260
+ }
261
+ export function getQuadBatchRuntime(source) {
262
+ return getNode2DRuntime(source);
263
+ }
264
+ /** Returns the {@link QuadBatchSignals} attached to `source`, or `null` if not yet enabled. */
265
+ export function getQuadBatchSignals(source) {
266
+ return source[quadBatchSignalsSlot] ?? null;
267
+ }
268
+ export function getQuadBatchTransformStride(transformType) {
269
+ return quadTransformStride[transformType];
270
+ }
271
+ export function hitTestQuadBatchPoint(source, point) {
272
+ return hitTestQuadBatchPointXY(source, point.x, point.y);
273
+ }
274
+ /**
275
+ * Returns the topmost instance index whose quad polygon contains `(x, y)`, or -1 for a miss.
276
+ *
277
+ * For `vector2` batches this is equivalent to `hitTestQuadBatchPointXY` (axis-aligned quads have
278
+ * no rotation; AABB = exact polygon). For `matrix3x2` batches this performs a true point-in-quad
279
+ * test via the cross-product winding rule, while `hitTestQuadBatchPointXY` uses the AABB of the
280
+ * transformed quad (which over-reports for rotated quads). Use this variant when rotation accuracy
281
+ * matters; it is slightly more expensive than the AABB version.
282
+ */
283
+ export function hitTestQuadBatchPointExact(source, point) {
284
+ return hitTestQuadBatchPointExactXY(source, point.x, point.y);
285
+ }
286
+ /**
287
+ * XY variant of `hitTestQuadBatchPointExact`. See that function for details.
288
+ */
289
+ export function hitTestQuadBatchPointExactXY(source, x, y) {
290
+ const { atlas, ids, instanceCount, transforms, transformType } = source.data;
291
+ if (atlas === null || instanceCount === 0)
292
+ return -1;
293
+ const regions = atlas.regions;
294
+ const numRegions = regions.length;
295
+ if (transformType === 'vector2') {
296
+ // Axis-aligned — AABB is exact.
297
+ for (let i = 0; i < instanceCount; i++) {
298
+ const id = ids[i];
299
+ if (id < 0 || id >= numRegions)
300
+ continue;
301
+ const region = regions[id];
302
+ const dx = transforms[i * QUAD_VECTOR2_STRIDE];
303
+ const dy = transforms[i * QUAD_VECTOR2_STRIDE + 1];
304
+ if (x >= dx && x < dx + region.width && y >= dy && y < dy + region.height)
305
+ return i;
306
+ }
307
+ }
308
+ else {
309
+ for (let i = 0; i < instanceCount; i++) {
310
+ const id = ids[i];
311
+ if (id < 0 || id >= numRegions)
312
+ continue;
313
+ const region = regions[id];
314
+ if (region.width <= 0 || region.height <= 0)
315
+ continue;
316
+ const o = i * QUAD_MATRIX3X2_STRIDE;
317
+ const a = transforms[o];
318
+ const b = transforms[o + 1];
319
+ const c = transforms[o + 2];
320
+ const d = transforms[o + 3];
321
+ const tx = transforms[o + 4];
322
+ const ty = transforms[o + 5];
323
+ const w = region.width;
324
+ const h = region.height;
325
+ // Four corners of the quad: (0,0)→(w,0)→(w,h)→(0,h) mapped by the affine.
326
+ const x0 = tx;
327
+ const y0 = ty;
328
+ const x1 = a * w + tx;
329
+ const y1 = b * w + ty;
330
+ const x2 = a * w + c * h + tx;
331
+ const y2 = b * w + d * h + ty;
332
+ const x3 = c * h + tx;
333
+ const y3 = d * h + ty;
334
+ // Point-in-convex-polygon via signed cross products. A point P is inside a CCW quad when
335
+ // the cross product of each edge vector with (P - edge_start) is >= 0 for all four edges.
336
+ if (crossSign(x0, y0, x1, y1, x, y) &&
337
+ crossSign(x1, y1, x2, y2, x, y) &&
338
+ crossSign(x2, y2, x3, y3, x, y) &&
339
+ crossSign(x3, y3, x0, y0, x, y))
340
+ return i;
341
+ }
342
+ }
343
+ return -1;
344
+ }
345
+ export function hitTestQuadBatchPointXY(source, x, y) {
346
+ const { atlas, ids, instanceCount, transforms, transformType } = source.data;
347
+ if (atlas === null || instanceCount === 0)
348
+ return -1;
349
+ const regions = atlas.regions;
350
+ const numRegions = regions.length;
351
+ if (transformType === 'vector2') {
352
+ for (let i = 0; i < instanceCount; i++) {
353
+ const id = ids[i];
354
+ if (id < 0 || id >= numRegions)
355
+ continue;
356
+ const region = regions[id];
357
+ const dx = transforms[i * QUAD_VECTOR2_STRIDE];
358
+ const dy = transforms[i * QUAD_VECTOR2_STRIDE + 1];
359
+ if (x >= dx && x < dx + region.width && y >= dy && y < dy + region.height)
360
+ return i;
361
+ }
362
+ }
363
+ else {
364
+ for (let i = 0; i < instanceCount; i++) {
365
+ const id = ids[i];
366
+ if (id < 0 || id >= numRegions)
367
+ continue;
368
+ const region = regions[id];
369
+ if (region.width <= 0 || region.height <= 0)
370
+ continue;
371
+ const o = i * QUAD_MATRIX3X2_STRIDE;
372
+ const a = transforms[o];
373
+ const b = transforms[o + 1];
374
+ const c = transforms[o + 2];
375
+ const d = transforms[o + 3];
376
+ const tx = transforms[o + 4];
377
+ const ty = transforms[o + 5];
378
+ const w = region.width;
379
+ const h = region.height;
380
+ const x0 = tx;
381
+ const y0 = ty;
382
+ const x1 = a * w + tx;
383
+ const y1 = b * w + ty;
384
+ const x2 = c * h + tx;
385
+ const y2 = d * h + ty;
386
+ const x3 = a * w + c * h + tx;
387
+ const y3 = b * w + d * h + ty;
388
+ const minX = Math.min(x0, x1, x2, x3);
389
+ const minY = Math.min(y0, y1, y2, y3);
390
+ const maxX = Math.max(x0, x1, x2, x3);
391
+ const maxY = Math.max(y0, y1, y2, y3);
392
+ if (x >= minX && x < maxX && y >= minY && y < maxY)
393
+ return i;
394
+ }
395
+ }
396
+ return -1;
397
+ }
398
+ /**
399
+ * Calls `visitor(index, id, transforms)` for each live instance in order. The `transforms`
400
+ * argument is a `Float32Array` subarray view beginning at instance `index`'s offset with
401
+ * length equal to the transform stride. Allocation-free: no per-call object is created.
402
+ */
403
+ export function iterateQuadBatchInstances(source, visitor) {
404
+ const { ids, instanceCount, transforms, transformType } = source.data;
405
+ const stride = getQuadBatchTransformStride(transformType);
406
+ for (let i = 0; i < instanceCount; i++) {
407
+ visitor(i, ids[i], transforms.subarray(i * stride, i * stride + stride));
408
+ }
409
+ }
410
+ /**
411
+ * Swap-removes instance `index` with the last instance (O(1)), decrementing `instanceCount`.
412
+ * Does not preserve order — the instance that was at `instanceCount-1` moves to `index`.
413
+ * No-ops when `index` is out of range.
414
+ * Fires `onInstanceRemoved` when signals are enabled.
415
+ */
416
+ export function removeQuadBatchInstance(target, index) {
417
+ const data = target.data;
418
+ const last = data.instanceCount - 1;
419
+ if (index < 0 || index > last)
420
+ return;
421
+ const swapSource = index < last ? last : -1;
422
+ if (index < last) {
423
+ data.ids[index] = data.ids[last];
424
+ if (data.transformType === 'vector2') {
425
+ const dst = index * QUAD_VECTOR2_STRIDE;
426
+ const src = last * QUAD_VECTOR2_STRIDE;
427
+ data.transforms[dst] = data.transforms[src];
428
+ data.transforms[dst + 1] = data.transforms[src + 1];
429
+ }
430
+ else {
431
+ const dst = index * QUAD_MATRIX3X2_STRIDE;
432
+ const src = last * QUAD_MATRIX3X2_STRIDE;
433
+ for (let k = 0; k < QUAD_MATRIX3X2_STRIDE; k++)
434
+ data.transforms[dst + k] = data.transforms[src + k];
435
+ }
436
+ if (data.materialData !== null) {
437
+ data.materialData[index] = data.materialData[last] ?? null;
438
+ }
439
+ }
440
+ data.instanceCount = last;
441
+ const signals = getQuadBatchSignals(target);
442
+ if (signals !== null)
443
+ signals.onInstanceRemoved.emit(index, swapSource);
444
+ }
445
+ export function reserveQuadBatch(target, capacity) {
446
+ const currentCapacity = getQuadBatchCapacity(target);
447
+ if (currentCapacity >= capacity)
448
+ return;
449
+ const data = target.data;
450
+ data.ids = reserveUint16Array(data.ids, capacity);
451
+ data.transforms = reserveFloat32Array(data.transforms, capacity * getQuadBatchTransformStride(data.transformType));
452
+ }
453
+ export function resizeQuadBatch(target, instanceCount) {
454
+ const data = target.data;
455
+ const oldInstanceCount = data.instanceCount;
456
+ data.instanceCount = instanceCount;
457
+ if (oldInstanceCount >= instanceCount)
458
+ return;
459
+ const capacity = getQuadBatchCapacity(target);
460
+ if (capacity < instanceCount) {
461
+ const newCapacity = Math.max(instanceCount, capacity * 2);
462
+ reserveQuadBatch(target, newCapacity);
463
+ }
464
+ }
465
+ /**
466
+ * Writes the vector2 (translation-only) transform and id for instance `index`.
467
+ * No-ops when `index` is out of range (`[0, instanceCount)`).
468
+ * Target must use `transformType === 'vector2'`.
469
+ */
470
+ export function setQuadBatchInstance(target, index, id, x, y) {
471
+ const data = target.data;
472
+ if (index < 0 || index >= data.instanceCount)
473
+ return;
474
+ data.ids[index] = id;
475
+ const o = index * QUAD_VECTOR2_STRIDE;
476
+ data.transforms[o] = x;
477
+ data.transforms[o + 1] = y;
478
+ }
479
+ /**
480
+ * Writes a full 2D affine (matrix3x2) transform and id for instance `index`.
481
+ * No-ops when `index` is out of range (`[0, instanceCount)`).
482
+ * Target must use `transformType === 'matrix3x2'`.
483
+ * Layout: `[a, b, c, d, tx, ty]` — standard column-major 2D affine.
484
+ */
485
+ export function setQuadBatchInstanceMatrix(target, index, id, a, b, c, d, tx, ty) {
486
+ const data = target.data;
487
+ if (index < 0 || index >= data.instanceCount)
488
+ return;
489
+ data.ids[index] = id;
490
+ const o = index * QUAD_MATRIX3X2_STRIDE;
491
+ data.transforms[o] = a;
492
+ data.transforms[o + 1] = b;
493
+ data.transforms[o + 2] = c;
494
+ data.transforms[o + 3] = d;
495
+ data.transforms[o + 4] = tx;
496
+ data.transforms[o + 5] = ty;
497
+ }
498
+ /**
499
+ * Writes `count` contiguous transform entries from `source` into the batch starting at `startIndex`.
500
+ * Reads `count * stride` floats from `source` (where stride = `getQuadBatchTransformStride(target.data.transformType)`).
501
+ * No-ops when `startIndex + count` exceeds `instanceCount`.
502
+ * This is the bulk variant of `setQuadBatchInstance`/`setQuadBatchInstanceMatrix`.
503
+ */
504
+ export function setQuadBatchInstanceRange(target, startIndex, count, source) {
505
+ const data = target.data;
506
+ if (startIndex < 0 || count <= 0 || startIndex + count > data.instanceCount)
507
+ return;
508
+ const stride = getQuadBatchTransformStride(data.transformType);
509
+ const dst = startIndex * stride;
510
+ const len = count * stride;
511
+ for (let k = 0; k < len; k++)
512
+ data.transforms[dst + k] = source[k];
513
+ }
514
+ // Sets one instance's compact multiply-only tint. The material-data array is allocated on first use,
515
+ // so an untinted batch carries no per-item array or datum. Invalid indices are ignored.
516
+ export function setQuadBatchInstanceTint(target, index, rgba) {
517
+ const data = target.data;
518
+ if (index < 0 || index >= data.instanceCount)
519
+ return;
520
+ if (data.materialData === null)
521
+ data.materialData = new Array(data.instanceCount).fill(null);
522
+ data.materialData[index] = { tint: rgba >>> 0 };
523
+ }
524
+ export function setQuadBatchLocalBoundsRectangle(target, rect) {
525
+ const runtime = getNode2DRuntime(target);
526
+ if (runtime.localBoundsRectangle === null)
527
+ runtime.localBoundsRectangle = createRectangle();
528
+ copyRectangle(runtime.localBoundsRectangle, rect);
529
+ invalidateNodeLocalBounds(target);
530
+ }
531
+ /**
532
+ * Switches `target`'s `transformType`, re-striding the `transforms` buffer in place.
533
+ * - `'vector2' → 'matrix3x2'`: each existing (x, y) pair is expanded to `[1, 0, 0, 1, x, y]` (identity + translation).
534
+ * - `'matrix3x2' → 'vector2'`: each matrix is collapsed to its `(tx, ty)` translation, discarding scale/rotation.
535
+ * Does nothing when `newType` matches the current `transformType`.
536
+ */
537
+ export function setQuadBatchTransformType(target, newType) {
538
+ const data = target.data;
539
+ if (data.transformType === newType)
540
+ return;
541
+ const count = data.instanceCount;
542
+ if (newType === 'matrix3x2') {
543
+ // Expanding: allocate new buffer, fill in reverse order to avoid clobbering inputs.
544
+ const newTransforms = new Float32Array(Math.max(data.transforms.length / QUAD_VECTOR2_STRIDE, count) * QUAD_MATRIX3X2_STRIDE);
545
+ for (let i = count - 1; i >= 0; i--) {
546
+ const src = i * QUAD_VECTOR2_STRIDE;
547
+ const dst = i * QUAD_MATRIX3X2_STRIDE;
548
+ const x = data.transforms[src];
549
+ const y = data.transforms[src + 1];
550
+ newTransforms[dst] = 1; // a
551
+ newTransforms[dst + 1] = 0; // b
552
+ newTransforms[dst + 2] = 0; // c
553
+ newTransforms[dst + 3] = 1; // d
554
+ newTransforms[dst + 4] = x; // tx
555
+ newTransforms[dst + 5] = y; // ty
556
+ }
557
+ data.transforms = newTransforms;
558
+ }
559
+ else {
560
+ // Collapsing: extract tx/ty in place (safe: dst < src for all i).
561
+ for (let i = 0; i < count; i++) {
562
+ const src = i * QUAD_MATRIX3X2_STRIDE;
563
+ const dst = i * QUAD_VECTOR2_STRIDE;
564
+ data.transforms[dst] = data.transforms[src + 4]; // tx
565
+ data.transforms[dst + 1] = data.transforms[src + 5]; // ty
566
+ }
567
+ }
568
+ data.transformType = newType;
569
+ }
570
+ const defaultMethods = {
571
+ computeLocalBoundsRectangle: copyLocalBoundsRectangle,
572
+ };
573
+ const quadBatchSignalsSlot = Symbol('quadBatchSignals');
574
+ const quadTransformStride = {
575
+ vector2: 2,
576
+ matrix3x2: 6,
577
+ };
578
+ /** True when the cross product of edge (ax→bx, ay→by) and (P - A) is >= 0. */
579
+ function crossSign(ax, ay, bx, by, px, py) {
580
+ return (bx - ax) * (py - ay) - (by - ay) * (px - ax) >= 0;
581
+ }
582
+ //# sourceMappingURL=quadBatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quadBatch.js","sourceRoot":"","sources":["../src/quadBatch.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@flighthq/quadbatch",
3
+ "version": "0.3.0-edge.1458.0c01b63",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/flighthq/flight.git",
7
+ "directory": "packages/quadbatch"
8
+ },
9
+ "type": "module",
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "./contract": {
18
+ "types": "./dist/contract.d.ts",
19
+ "default": "./dist/contract.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "src/**/*.test.ts",
25
+ "!dist/**/*.test.js",
26
+ "!dist/**/*.test.d.ts",
27
+ "!dist/**/*.test.js.map",
28
+ "!dist/**/*.test.d.ts.map"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -b",
32
+ "clean": "tsc -b --clean",
33
+ "test": "vitest run --config vitest.config.ts",
34
+ "test:watch": "vitest --watch --config vitest.config.ts",
35
+ "prepack": "npm run clean && npm run clean:dist && npm run build",
36
+ "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
37
+ },
38
+ "dependencies": {
39
+ "@flighthq/scene2d": "0.3.0-edge.1458.0c01b63",
40
+ "@flighthq/geometry": "0.3.0-edge.1458.0c01b63",
41
+ "@flighthq/node": "0.3.0-edge.1458.0c01b63",
42
+ "@flighthq/signals": "0.3.0-edge.1458.0c01b63",
43
+ "@flighthq/types": "0.3.0-edge.1458.0c01b63"
44
+ },
45
+ "devDependencies": {
46
+ "typescript": "^5.3.0"
47
+ },
48
+ "description": "Atlas-based multi-quad scene node and instance-buffer operations",
49
+ "sideEffects": false
50
+ }