@driftengine/core 4.9.0 → 4.10.0
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/CHANGELOG.json +62 -11
- package/README.md +43 -38
- package/dist/index.d.ts +3 -1
- package/dist/index.js +4 -3
- package/dist/render/ambientHarmonics.d.ts +1 -1
- package/dist/render/ambientHarmonics.js +1 -1
- package/dist/render/areaLights.d.ts +4 -4
- package/dist/render/areaLights.js +1 -1
- package/dist/render/backend/api.d.ts +10 -3
- package/dist/render/backend/select.js +11 -5
- package/dist/render/backend/webgl2/boneAnimations.d.ts +29 -0
- package/dist/render/backend/webgl2/boneAnimations.js +80 -0
- package/dist/render/backend/webgl2/instanced.d.ts +5 -1
- package/dist/render/backend/webgl2/instanced.js +13 -1
- package/dist/render/backend/webgl2/renderer.d.ts +90 -2
- package/dist/render/backend/webgl2/renderer.js +253 -24
- package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +5 -3
- package/dist/render/backend/webgl2/skinPaletteTexture.js +6 -4
- package/dist/render/backend/webgpu/boneAnimations.d.ts +34 -0
- package/dist/render/backend/webgpu/boneAnimations.js +76 -0
- package/dist/render/backend/webgpu/buffers.d.ts +19 -4
- package/dist/render/backend/webgpu/buffers.js +18 -11
- package/dist/render/backend/webgpu/compressedUpload.d.ts +0 -1
- package/dist/render/backend/webgpu/compressedUpload.js +53 -8
- package/dist/render/backend/webgpu/depthPass.d.ts +59 -3
- package/dist/render/backend/webgpu/depthPass.js +49 -14
- package/dist/render/backend/webgpu/drawCommand.d.ts +18 -4
- package/dist/render/backend/webgpu/drawCommand.js +10 -3
- package/dist/render/backend/webgpu/flatPass.d.ts +85 -42
- package/dist/render/backend/webgpu/flatPass.js +136 -20
- package/dist/render/backend/webgpu/instanced.d.ts +14 -1
- package/dist/render/backend/webgpu/instanced.js +24 -1
- package/dist/render/backend/webgpu/materialStore.d.ts +101 -0
- package/dist/render/backend/webgpu/materialStore.js +265 -0
- package/dist/render/backend/webgpu/pipelineCache.d.ts +6 -0
- package/dist/render/backend/webgpu/pipelineCache.js +7 -0
- package/dist/render/backend/webgpu/renderer.d.ts +152 -35
- package/dist/render/backend/webgpu/renderer.js +787 -142
- package/dist/render/backend/webgpu/skinPaletteRing.d.ts +7 -3
- package/dist/render/backend/webgpu/skinPaletteRing.js +13 -7
- package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +6 -0
- package/dist/render/backend/webgpu/skinPaletteTexture.js +7 -1
- package/dist/render/backend/webgpu/staticBundles.d.ts +125 -0
- package/dist/render/backend/webgpu/staticBundles.js +241 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +10 -3
- package/dist/render/backend/webgpu/surfaceTexturePass.js +20 -2
- package/dist/render/backend/webgpu/uniformRing.d.ts +21 -0
- package/dist/render/backend/webgpu/uniformRing.js +9 -1
- package/dist/render/bloomChain.d.ts +3 -3
- package/dist/render/boneAnimation.d.ts +92 -0
- package/dist/render/boneAnimation.js +133 -0
- package/dist/render/compressedSource.d.ts +33 -13
- package/dist/render/compressedSource.js +70 -25
- package/dist/render/glCompressed.js +83 -0
- package/dist/render/instances.d.ts +26 -0
- package/dist/render/lightBudget.d.ts +10 -0
- package/dist/render/lightBudget.js +10 -0
- package/dist/render/lightmap.d.ts +1 -1
- package/dist/render/mesh.d.ts +5 -0
- package/dist/render/mesh.js +6 -0
- package/dist/render/pointLightSelection.d.ts +4 -4
- package/dist/render/screenSpaceReflection.d.ts +2 -1
- package/dist/render/shaders/boneAnimation.d.ts +19 -0
- package/dist/render/shaders/boneAnimation.js +63 -0
- package/dist/render/shaders/depth.d.ts +7 -0
- package/dist/render/shaders/depth.js +35 -10
- package/dist/render/shaders/flat/index.d.ts +6 -0
- package/dist/render/shaders/flat/index.js +27 -5
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +15 -5
- package/dist/render/shaders/flat/models.js +1 -1
- package/dist/render/shaders/flat/overlay.js +1 -1
- package/dist/render/shaders/flat/pointShadow.js +2 -2
- package/dist/render/shaders/flat/preamble.js +38 -24
- package/dist/render/shaders/generated/depth.wgsl.d.ts +93 -0
- package/dist/render/shaders/generated/depth.wgsl.js +93 -0
- package/dist/render/shaders/generated/flat.wgsl.d.ts +3077 -2903
- package/dist/render/shaders/generated/flat.wgsl.js +3100 -2925
- package/dist/render/shaders/outputTransform.d.ts +7 -0
- package/dist/render/shaders/outputTransform.js +28 -14
- package/dist/render/shaders/vertexChannel.d.ts +7 -0
- package/dist/render/shaders/vertexChannel.js +26 -0
- package/dist/render/staticDraws.d.ts +47 -0
- package/dist/render/staticDraws.js +43 -0
- package/dist/render/surfaceTexture.d.ts +38 -7
- package/dist/render/surfaceTexture.js +56 -17
- package/package.json +6 -6
- package/src/index.ts +8 -2
- package/src/render/ambientHarmonics.ts +1 -1
- package/src/render/areaLights.ts +4 -4
- package/src/render/backend/api.ts +13 -3
- package/src/render/backend/select.ts +10 -5
- package/src/render/backend/webgl2/boneAnimations.ts +105 -0
- package/src/render/backend/webgl2/instanced.ts +20 -1
- package/src/render/backend/webgl2/renderer.ts +315 -24
- package/src/render/backend/webgl2/skinPaletteTexture.ts +6 -4
- package/src/render/backend/webgpu/boneAnimations.ts +97 -0
- package/src/render/backend/webgpu/buffers.ts +42 -16
- package/src/render/backend/webgpu/compressedUpload.ts +59 -9
- package/src/render/backend/webgpu/depthPass.ts +51 -10
- package/src/render/backend/webgpu/drawCommand.ts +22 -4
- package/src/render/backend/webgpu/flatPass.ts +187 -14
- package/src/render/backend/webgpu/instanced.ts +32 -1
- package/src/render/backend/webgpu/materialStore.ts +276 -0
- package/src/render/backend/webgpu/pipelineCache.ts +7 -0
- package/src/render/backend/webgpu/renderer.ts +928 -155
- package/src/render/backend/webgpu/skinPaletteRing.ts +13 -7
- package/src/render/backend/webgpu/skinPaletteTexture.ts +7 -1
- package/src/render/backend/webgpu/staticBundles.ts +363 -0
- package/src/render/backend/webgpu/surfaceTexturePass.ts +29 -3
- package/src/render/backend/webgpu/uniformRing.ts +10 -1
- package/src/render/bloomChain.ts +3 -3
- package/src/render/boneAnimation.ts +223 -0
- package/src/render/compressedSource.ts +121 -29
- package/src/render/glCompressed.ts +83 -0
- package/src/render/instances.ts +27 -0
- package/src/render/lightBudget.ts +11 -0
- package/src/render/lightmap.ts +1 -1
- package/src/render/mesh.ts +6 -0
- package/src/render/pointLightSelection.ts +4 -4
- package/src/render/screenSpaceReflection.ts +2 -1
- package/src/render/shaders/boneAnimation.ts +63 -0
- package/src/render/shaders/depth.ts +45 -10
- package/src/render/shaders/flat/index.ts +33 -5
- package/src/render/shaders/flat/main.ts +15 -5
- package/src/render/shaders/flat/models.ts +1 -1
- package/src/render/shaders/flat/overlay.ts +1 -1
- package/src/render/shaders/flat/pointShadow.ts +2 -2
- package/src/render/shaders/flat/preamble.ts +38 -24
- package/src/render/shaders/generated/depth.wgsl.ts +95 -0
- package/src/render/shaders/generated/flat.wgsl.ts +3100 -2925
- package/src/render/shaders/outputTransform.ts +30 -14
- package/src/render/shaders/vertexChannel.ts +27 -0
- package/src/render/staticDraws.ts +95 -0
- package/src/render/surfaceTexture.ts +94 -27
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bone animation's textures on this backend, and a batch's clocks: what
|
|
3
|
+
* `shaders/boneAnimation.ts` reads with `texelFetch`, made once and never filtered. The twin of
|
|
4
|
+
* `webgpu/boneAnimations.ts`, at the same formats for the same reason: a turn in half floats jitters
|
|
5
|
+
* a crowd's hands at the frame's rate.
|
|
6
|
+
*/
|
|
7
|
+
import {
|
|
8
|
+
CLOCK_TEXTURE_WIDTH,
|
|
9
|
+
type BoneAnimationHandle,
|
|
10
|
+
type BoneAnimationTexels,
|
|
11
|
+
} from '../../boneAnimation.ts';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A float texture read by index: one level, nearest, clamped. Bound on unit 0, chosen rather than
|
|
15
|
+
* inherited, for the reason `oitPass.ts` gives: `bindTexture` binds to whatever unit is active, and
|
|
16
|
+
* a frame leaves that wherever its last pass finished.
|
|
17
|
+
*/
|
|
18
|
+
function floatTexture(
|
|
19
|
+
gl: WebGL2RenderingContext,
|
|
20
|
+
internal: number,
|
|
21
|
+
width: number,
|
|
22
|
+
height: number,
|
|
23
|
+
): WebGLTexture {
|
|
24
|
+
const texture = gl.createTexture();
|
|
25
|
+
if (texture === null) throw new Error('boneAnimations: createTexture failed');
|
|
26
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
27
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
28
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, internal, width, height);
|
|
29
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
30
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
31
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
32
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
33
|
+
return texture;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** A clip on the device, from `createBoneAnimation`. */
|
|
37
|
+
export class GlBoneAnimation implements BoneAnimationHandle {
|
|
38
|
+
readonly bones: number;
|
|
39
|
+
readonly frames: number;
|
|
40
|
+
readonly framesPerSecond: number;
|
|
41
|
+
readonly boneScale: number;
|
|
42
|
+
readonly places: WebGLTexture;
|
|
43
|
+
readonly turns: WebGLTexture;
|
|
44
|
+
disposed = false;
|
|
45
|
+
|
|
46
|
+
constructor(gl: WebGL2RenderingContext, texels: BoneAnimationTexels) {
|
|
47
|
+
this.bones = texels.bones;
|
|
48
|
+
this.frames = texels.frames;
|
|
49
|
+
this.framesPerSecond = texels.framesPerSecond;
|
|
50
|
+
this.boneScale = texels.boneScale;
|
|
51
|
+
const make = (data: Float32Array): WebGLTexture => {
|
|
52
|
+
const texture = floatTexture(gl, gl.RGBA32F, texels.bones, texels.frames);
|
|
53
|
+
gl.texSubImage2D(
|
|
54
|
+
gl.TEXTURE_2D,
|
|
55
|
+
0,
|
|
56
|
+
0,
|
|
57
|
+
0,
|
|
58
|
+
texels.bones,
|
|
59
|
+
texels.frames,
|
|
60
|
+
gl.RGBA,
|
|
61
|
+
gl.FLOAT,
|
|
62
|
+
data,
|
|
63
|
+
);
|
|
64
|
+
return texture;
|
|
65
|
+
};
|
|
66
|
+
this.places = make(texels.places);
|
|
67
|
+
this.turns = make(texels.turns);
|
|
68
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
72
|
+
this.disposed = true;
|
|
73
|
+
gl.deleteTexture(this.places);
|
|
74
|
+
gl.deleteTexture(this.turns);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** A batch's clocks: two floats an instance, wrapped onto rows `CLOCK_TEXTURE_WIDTH` wide. */
|
|
79
|
+
export class GlInstanceClocks {
|
|
80
|
+
readonly texture: WebGLTexture;
|
|
81
|
+
readonly staging: Float32Array;
|
|
82
|
+
private readonly width: number;
|
|
83
|
+
|
|
84
|
+
constructor(gl: WebGL2RenderingContext, capacity: number) {
|
|
85
|
+
this.width = Math.max(1, Math.min(capacity, CLOCK_TEXTURE_WIDTH));
|
|
86
|
+
const rows = Math.max(1, Math.ceil(capacity / this.width));
|
|
87
|
+
this.staging = new Float32Array(this.width * rows * 2);
|
|
88
|
+
this.texture = floatTexture(gl, gl.RG32F, this.width, rows);
|
|
89
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** The rows that hold the first `count` instances, from `staging`. */
|
|
93
|
+
upload(gl: WebGL2RenderingContext, count: number): void {
|
|
94
|
+
if (count <= 0) return;
|
|
95
|
+
const rows = Math.ceil(count / this.width);
|
|
96
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
97
|
+
gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
|
98
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, rows, gl.RG, gl.FLOAT, this.staging);
|
|
99
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
103
|
+
gl.deleteTexture(this.texture);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
import type { MeshInstances } from '../../instances.ts';
|
|
9
9
|
import type { Mesh } from '../../mesh.ts';
|
|
10
10
|
import type { FrustumPlanes } from '../../../math/frustum.ts';
|
|
11
|
+
import { packInstanceClocks } from '../../boneAnimation.ts';
|
|
12
|
+
import { GlInstanceClocks, type GlBoneAnimation } from './boneAnimations.ts';
|
|
11
13
|
|
|
12
14
|
/**
|
|
13
15
|
* One batch of a mesh: its per-instance buffer and a vertex array of its own.
|
|
@@ -42,10 +44,22 @@ export class InstancedBatch {
|
|
|
42
44
|
readonly instances: MeshInstances;
|
|
43
45
|
} | null;
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
/** The bone animation every instance plays, and its clocks; null for a batch that plays none. */
|
|
48
|
+
readonly animation: GlBoneAnimation | null;
|
|
49
|
+
readonly clocks: GlInstanceClocks | null;
|
|
50
|
+
|
|
51
|
+
constructor(
|
|
52
|
+
gl: WebGL2RenderingContext,
|
|
53
|
+
mesh: Mesh,
|
|
54
|
+
capacity: number,
|
|
55
|
+
cull = false,
|
|
56
|
+
animation: GlBoneAnimation | null = null,
|
|
57
|
+
) {
|
|
46
58
|
this.mesh = mesh;
|
|
47
59
|
this.capacity = capacity;
|
|
48
60
|
this.cull = cull;
|
|
61
|
+
this.animation = animation;
|
|
62
|
+
this.clocks = animation === null ? null : new GlInstanceClocks(gl, capacity);
|
|
49
63
|
this.staging = new Float32Array(capacity * INSTANCE_FLOATS);
|
|
50
64
|
this.buffer = allocate(gl, capacity);
|
|
51
65
|
this.vao = mesh.createInstanceArray(gl, this.buffer, INSTANCE_STRIDE);
|
|
@@ -68,6 +82,10 @@ export class InstancedBatch {
|
|
|
68
82
|
packInstances(data, this.staging);
|
|
69
83
|
gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
|
|
70
84
|
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.staging, 0, count * INSTANCE_FLOATS);
|
|
85
|
+
if (this.clocks !== null) {
|
|
86
|
+
packInstanceClocks(data, this.clocks.staging);
|
|
87
|
+
this.clocks.upload(gl, count);
|
|
88
|
+
}
|
|
71
89
|
}
|
|
72
90
|
|
|
73
91
|
/** Draw the first `count` uploaded instances: every draw but a culling camera draw. */
|
|
@@ -102,6 +120,7 @@ export class InstancedBatch {
|
|
|
102
120
|
dispose(gl: WebGL2RenderingContext): void {
|
|
103
121
|
gl.deleteVertexArray(this.vao);
|
|
104
122
|
gl.deleteBuffer(this.buffer);
|
|
123
|
+
this.clocks?.dispose(gl);
|
|
105
124
|
if (this.kept !== null) {
|
|
106
125
|
gl.deleteVertexArray(this.kept.vao);
|
|
107
126
|
gl.deleteBuffer(this.kept.buffer);
|