@doki-land/live2d-renderer 0.0.19 → 0.0.21
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/dist/index.d.ts +51 -5
- package/dist/index.js +475 -203
- package/package.json +2 -2
- package/src/backends/canvas2d.ts +6 -7
- package/src/backends/webgl2.ts +54 -33
- package/src/backends/webgpu-mesh-cache.ts +206 -0
- package/src/backends/webgpu.ts +158 -186
- package/src/index.ts +9 -0
- package/src/render/clipping-plan.ts +140 -0
- package/src/render/clipping.ts +22 -6
- package/src/render/mesh-interleave.ts +28 -0
package/src/render/clipping.ts
CHANGED
|
@@ -412,12 +412,28 @@ export function fitClippingContexts(
|
|
|
412
412
|
}));
|
|
413
413
|
}
|
|
414
414
|
|
|
415
|
-
/** Flatten layout to `[x, y, w, h]` for GPU uniforms. */
|
|
416
|
-
export function maskLayoutVec4(
|
|
417
|
-
|
|
415
|
+
/** Flatten layout to `[x, y, w, h]` for GPU uniforms. Reuses `into` when provided. */
|
|
416
|
+
export function maskLayoutVec4(
|
|
417
|
+
layout: MaskLayoutRect,
|
|
418
|
+
into?: Float32Array,
|
|
419
|
+
): Float32Array {
|
|
420
|
+
const out = into && into.length >= 4 ? into : new Float32Array(4);
|
|
421
|
+
out[0] = layout.x;
|
|
422
|
+
out[1] = layout.y;
|
|
423
|
+
out[2] = layout.width;
|
|
424
|
+
out[3] = layout.height;
|
|
425
|
+
return out;
|
|
418
426
|
}
|
|
419
427
|
|
|
420
|
-
/** Flatten channel flag to `[r, g, b, a]` for GPU uniforms. */
|
|
421
|
-
export function maskChannelVec4(
|
|
422
|
-
|
|
428
|
+
/** Flatten channel flag to `[r, g, b, a]` for GPU uniforms. Reuses `into` when provided. */
|
|
429
|
+
export function maskChannelVec4(
|
|
430
|
+
flag: MaskChannelFlag,
|
|
431
|
+
into?: Float32Array,
|
|
432
|
+
): Float32Array {
|
|
433
|
+
const out = into && into.length >= 4 ? into : new Float32Array(4);
|
|
434
|
+
out[0] = flag[0];
|
|
435
|
+
out[1] = flag[1];
|
|
436
|
+
out[2] = flag[2];
|
|
437
|
+
out[3] = flag[3];
|
|
438
|
+
return out;
|
|
423
439
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pos/UV interleave with optional resident output buffer (GPU upload scratch).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** Interleave `[x,y]` + `[u,v]` into `[x,y,u,v,…]`. Reuses `into` when large enough. */
|
|
6
|
+
export function interleavePosUv(
|
|
7
|
+
positions: Float32Array,
|
|
8
|
+
uvs: Float32Array,
|
|
9
|
+
into?: Float32Array,
|
|
10
|
+
): Float32Array {
|
|
11
|
+
const n = Math.floor(positions.length / 2);
|
|
12
|
+
const need = n * 4;
|
|
13
|
+
const out = into && into.length >= need ? into : new Float32Array(need);
|
|
14
|
+
for (let i = 0; i < n; i++) {
|
|
15
|
+
const o = i * 4;
|
|
16
|
+
const p = i * 2;
|
|
17
|
+
out[o] = positions[p]!;
|
|
18
|
+
out[o + 1] = positions[p + 1]!;
|
|
19
|
+
out[o + 2] = uvs[p] ?? 0;
|
|
20
|
+
out[o + 3] = uvs[p + 1] ?? 0;
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Byte length of the live interleaved prefix (vertexCount * 16). */
|
|
26
|
+
export function interleaveByteLength(positions: Float32Array): number {
|
|
27
|
+
return Math.floor(positions.length / 2) * 16;
|
|
28
|
+
}
|