@driftengine/core 4.5.0 → 4.6.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 +51 -0
- package/README.md +1 -1
- package/dist/geometry/boxCsg.d.ts +28 -0
- package/dist/geometry/boxCsg.js +139 -0
- package/dist/geometry/csg.d.ts +36 -0
- package/dist/geometry/csg.js +329 -0
- package/dist/geometry/meshBuilder.js +13 -0
- package/dist/geometry/meshConcat.js +1 -0
- package/dist/geometry/pixelFont.js +2 -0
- package/dist/geometry/solid.d.ts +61 -0
- package/dist/geometry/solid.js +152 -0
- package/dist/geometry/solidFlat.d.ts +35 -0
- package/dist/geometry/solidFlat.js +428 -0
- package/dist/geometry/solidHarness.d.ts +19 -0
- package/dist/geometry/solidHarness.js +66 -0
- package/dist/geometry/solidNormals.d.ts +17 -0
- package/dist/geometry/solidNormals.js +86 -0
- package/dist/geometry/solidRound.d.ts +41 -0
- package/dist/geometry/solidRound.js +323 -0
- package/dist/geometry/solidWriter.d.ts +16 -0
- package/dist/geometry/solidWriter.js +42 -0
- package/dist/index.d.ts +23 -2
- package/dist/index.js +13 -1
- package/dist/render/backend/api.d.ts +17 -3
- package/dist/render/backend/drawFog.d.ts +26 -0
- package/dist/render/backend/drawFog.js +30 -0
- package/dist/render/backend/materialChanges.d.ts +2 -1
- package/dist/render/backend/materialChanges.js +6 -1
- package/dist/render/backend/webgl2/instanced.d.ts +24 -5
- package/dist/render/backend/webgl2/instanced.js +72 -15
- package/dist/render/backend/webgl2/renderer.d.ts +122 -8
- package/dist/render/backend/webgl2/renderer.js +238 -121
- package/dist/render/backend/webgpu/buffers.d.ts +10 -0
- package/dist/render/backend/webgpu/buffers.js +34 -3
- package/dist/render/backend/webgpu/depthPass.js +5 -1
- package/dist/render/backend/webgpu/drawCommand.d.ts +5 -0
- package/dist/render/backend/webgpu/drawCommand.js +1 -0
- package/dist/render/backend/webgpu/flatPass.d.ts +4 -1
- package/dist/render/backend/webgpu/flatPass.js +38 -9
- package/dist/render/backend/webgpu/glassTintPass.js +2 -1
- package/dist/render/backend/webgpu/instanceCullPass.d.ts +34 -0
- package/dist/render/backend/webgpu/instanceCullPass.js +144 -0
- package/dist/render/backend/webgpu/instanced.d.ts +11 -1
- package/dist/render/backend/webgpu/instanced.js +21 -3
- package/dist/render/backend/webgpu/latePass.d.ts +6 -2
- package/dist/render/backend/webgpu/latePass.js +11 -4
- package/dist/render/backend/webgpu/postPass.d.ts +1 -1
- package/dist/render/backend/webgpu/renderer.d.ts +100 -10
- package/dist/render/backend/webgpu/renderer.js +462 -201
- package/dist/render/backend/webgpu/sdfTextPass.js +6 -1
- package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.d.ts +18 -0
- package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.js +59 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +17 -3
- package/dist/render/backend/webgpu/surfaceTexturePass.js +77 -38
- package/dist/render/driftLight/bake.d.ts +7 -0
- package/dist/render/driftLight/bake.js +61 -56
- package/dist/render/driftLight/denseField.d.ts +46 -0
- package/dist/render/driftLight/denseField.js +109 -0
- package/dist/render/driftLight/lightField.d.ts +10 -5
- package/dist/render/driftLight/lightField.js +25 -19
- package/dist/render/driftLight/presence.d.ts +50 -0
- package/dist/render/driftLight/presence.js +43 -0
- package/dist/render/driftLight/uniforms.d.ts +3 -3
- package/dist/render/driftLight/uniforms.js +5 -6
- package/dist/render/driftLight/worldLightField.d.ts +41 -0
- package/dist/render/driftLight/worldLightField.js +66 -0
- package/dist/render/fixtureAtlas.d.ts +20 -0
- package/dist/render/fixtureAtlas.js +49 -0
- package/dist/render/instanceCull.d.ts +63 -0
- package/dist/render/instanceCull.js +160 -0
- package/dist/render/instances.d.ts +15 -0
- package/dist/render/lightBudget.d.ts +22 -33
- package/dist/render/lightBudget.js +24 -35
- package/dist/render/lightGrid.d.ts +42 -0
- package/dist/render/lightGrid.js +87 -0
- package/dist/render/mesh.d.ts +18 -24
- package/dist/render/mesh.js +51 -68
- package/dist/render/occlusion.d.ts +10 -0
- package/dist/render/occlusion.js +36 -7
- package/dist/render/pointLightSelection.d.ts +7 -0
- package/dist/render/pointLightSelection.js +29 -4
- package/dist/render/rainField.d.ts +13 -0
- package/dist/render/rainField.js +27 -5
- package/dist/render/recon/lateDepth.d.ts +11 -0
- package/dist/render/recon/lateDepth.js +70 -0
- package/dist/render/recon/resolve.d.ts +34 -4
- package/dist/render/recon/resolve.js +161 -20
- package/dist/render/rendererHarness.js +4 -0
- package/dist/render/sceneTarget.d.ts +2 -0
- package/dist/render/sceneTarget.js +2 -0
- package/dist/render/shaders/depth.js +12 -9
- package/dist/render/shaders/flat/driftLight.d.ts +1 -1
- package/dist/render/shaders/flat/driftLight.js +32 -7
- package/dist/render/shaders/flat/index.js +5 -3
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +75 -23
- package/dist/render/shaders/flat/preamble.js +75 -20
- package/dist/render/shaders/flat/surfaceEffects.d.ts +29 -0
- package/dist/render/shaders/flat/surfaceEffects.js +152 -0
- package/dist/render/shaders/generated/depth.wgsl.d.ts +8 -8
- package/dist/render/shaders/generated/depth.wgsl.js +8 -8
- package/dist/render/shaders/generated/flat.wgsl.d.ts +1320 -1320
- package/dist/render/shaders/generated/flat.wgsl.js +1359 -1345
- package/dist/render/shaders/generated/lightVolume.wgsl.js +18 -4
- package/dist/render/shaders/generated/rush.wgsl.d.ts +21 -16
- package/dist/render/shaders/generated/rush.wgsl.js +21 -16
- package/dist/render/shaders/generated/sdfText.wgsl.d.ts +2 -2
- package/dist/render/shaders/generated/sdfText.wgsl.js +2 -2
- package/dist/render/shaders/generated/text.wgsl.d.ts +1 -1
- package/dist/render/shaders/generated/text.wgsl.js +1 -1
- package/dist/render/shaders/gi/driftLight.wgsl.d.ts +1 -1
- package/dist/render/shaders/gi/driftLight.wgsl.js +27 -4
- package/dist/render/shaders/recon/lateDepth.wgsl.js +38 -13
- package/dist/render/shaders/recon/resolve.wgsl.d.ts +8 -7
- package/dist/render/shaders/recon/resolve.wgsl.js +161 -27
- package/dist/render/shaders/rush.js +11 -1
- package/dist/render/shaders/sdfText.d.ts +1 -1
- package/dist/render/shaders/sdfText.js +3 -2
- package/dist/render/shaders/text.d.ts +1 -1
- package/dist/render/shaders/text.js +18 -9
- package/dist/render/surfaceEffects.d.ts +83 -0
- package/dist/render/surfaceEffects.js +75 -0
- package/dist/render/surfaceScene.d.ts +8 -0
- package/dist/render/surfaceScene.js +8 -0
- package/dist/render/surfaceTexture.d.ts +18 -2
- package/dist/render/surfaceTexture.js +68 -15
- package/dist/render/temporalAa.d.ts +25 -6
- package/dist/render/temporalAa.js +45 -15
- package/dist/render/textureSource.d.ts +30 -0
- package/dist/render/textureSource.js +53 -0
- package/dist/render/vertexDefaults.js +2 -0
- package/dist/world/hlod.d.ts +104 -0
- package/dist/world/hlod.js +214 -0
- package/package.json +6 -6
- package/src/geometry/boxCsg.ts +186 -0
- package/src/geometry/csg.ts +384 -0
- package/src/geometry/meshBuilder.ts +15 -0
- package/src/geometry/meshConcat.ts +1 -0
- package/src/geometry/pixelFont.ts +2 -0
- package/src/geometry/solid.ts +189 -0
- package/src/geometry/solidFlat.ts +522 -0
- package/src/geometry/solidHarness.ts +83 -0
- package/src/geometry/solidNormals.ts +103 -0
- package/src/geometry/solidRound.ts +443 -0
- package/src/geometry/solidWriter.ts +58 -0
- package/src/index.ts +51 -1
- package/src/render/backend/api.ts +21 -2
- package/src/render/backend/drawFog.ts +31 -0
- package/src/render/backend/materialChanges.ts +9 -2
- package/src/render/backend/webgl2/instanced.ts +80 -14
- package/src/render/backend/webgl2/renderer.ts +300 -143
- package/src/render/backend/webgpu/buffers.ts +42 -3
- package/src/render/backend/webgpu/depthPass.ts +5 -1
- package/src/render/backend/webgpu/drawCommand.ts +6 -0
- package/src/render/backend/webgpu/flatPass.ts +41 -11
- package/src/render/backend/webgpu/glassTintPass.ts +2 -1
- package/src/render/backend/webgpu/instanceCullPass.ts +165 -0
- package/src/render/backend/webgpu/instanced.ts +21 -3
- package/src/render/backend/webgpu/latePass.ts +12 -3
- package/src/render/backend/webgpu/renderer.ts +540 -226
- package/src/render/backend/webgpu/sdfTextPass.ts +6 -1
- package/src/render/backend/webgpu/shaders/instanceCull.wgsl.ts +61 -0
- package/src/render/backend/webgpu/surfaceTexturePass.ts +90 -50
- package/src/render/driftLight/bake.ts +85 -62
- package/src/render/driftLight/denseField.ts +149 -0
- package/src/render/driftLight/lightField.ts +33 -18
- package/src/render/driftLight/presence.ts +69 -0
- package/src/render/driftLight/uniforms.ts +8 -9
- package/src/render/driftLight/worldLightField.ts +83 -0
- package/src/render/fixtureAtlas.ts +63 -0
- package/src/render/instanceCull.ts +205 -0
- package/src/render/instances.ts +16 -0
- package/src/render/lightBudget.ts +25 -36
- package/src/render/lightGrid.ts +130 -0
- package/src/render/mesh.ts +59 -72
- package/src/render/occlusion.ts +51 -7
- package/src/render/pointLightSelection.ts +72 -4
- package/src/render/rainField.ts +39 -5
- package/src/render/recon/lateDepth.ts +83 -0
- package/src/render/recon/resolve.ts +206 -20
- package/src/render/rendererHarness.ts +4 -0
- package/src/render/sceneTarget.ts +4 -0
- package/src/render/shaders/depth.ts +12 -9
- package/src/render/shaders/flat/driftLight.ts +32 -7
- package/src/render/shaders/flat/index.ts +5 -3
- package/src/render/shaders/flat/main.ts +75 -23
- package/src/render/shaders/flat/preamble.ts +75 -20
- package/src/render/shaders/flat/surfaceEffects.ts +152 -0
- package/src/render/shaders/generated/depth.wgsl.ts +8 -8
- package/src/render/shaders/generated/flat.wgsl.ts +1361 -1345
- package/src/render/shaders/generated/lightVolume.wgsl.ts +20 -4
- package/src/render/shaders/generated/rush.wgsl.ts +21 -16
- package/src/render/shaders/generated/sdfText.wgsl.ts +2 -2
- package/src/render/shaders/generated/text.wgsl.ts +1 -1
- package/src/render/shaders/gi/driftLight.wgsl.ts +27 -4
- package/src/render/shaders/recon/lateDepth.wgsl.ts +38 -13
- package/src/render/shaders/recon/resolve.wgsl.ts +161 -27
- package/src/render/shaders/rush.ts +11 -1
- package/src/render/shaders/sdfText.ts +3 -2
- package/src/render/shaders/text.ts +18 -9
- package/src/render/surfaceEffects.ts +132 -0
- package/src/render/surfaceScene.ts +16 -0
- package/src/render/surfaceTexture.ts +110 -19
- package/src/render/temporalAa.ts +78 -14
- package/src/render/textureSource.ts +72 -0
- package/src/render/vertexDefaults.ts +2 -0
- package/src/world/hlod.ts +290 -0
|
@@ -1,38 +1,66 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cullInstances, instancesBox } from '../../instanceCull.ts';
|
|
2
|
+
import {
|
|
3
|
+
INSTANCE_FLOATS,
|
|
4
|
+
INSTANCE_STRIDE,
|
|
5
|
+
createMeshInstances,
|
|
6
|
+
packInstances,
|
|
7
|
+
} from '../../instances.ts';
|
|
2
8
|
import type { MeshInstances } from '../../instances.ts';
|
|
3
9
|
import type { Mesh } from '../../mesh.ts';
|
|
10
|
+
import type { FrustumPlanes } from '../../../math/frustum.ts';
|
|
4
11
|
|
|
5
12
|
/**
|
|
6
|
-
* One mesh
|
|
13
|
+
* One batch of a mesh: its per-instance buffer and a vertex array of its own.
|
|
7
14
|
*
|
|
8
15
|
* The twin of the WebGPU batch and deliberately the same shape, because which floats go where is
|
|
9
|
-
* a decision shared through `instances.ts` and only the binding is per-backend.
|
|
16
|
+
* a decision shared through `instances.ts` and only the binding is per-backend. The vertex array is
|
|
17
|
+
* the batch's rather than the mesh's (`Mesh.createInstanceArray`), which is what lets one mesh carry
|
|
18
|
+
* a batch per region.
|
|
10
19
|
*
|
|
11
|
-
*
|
|
20
|
+
* **A culling batch holds a second buffer and array**, for the instances `cullInstances` keeps each
|
|
21
|
+
* camera draw. The full set stays in the first, because a shadow pass, a mirror and a probe each
|
|
22
|
+
* see a different part of the batch than the camera does, and they draw from it.
|
|
23
|
+
*
|
|
24
|
+
* Staging arrays are allocated here and rewritten in place, so a frame re-uploading or re-culling a
|
|
12
25
|
* batch allocates nothing.
|
|
13
26
|
*/
|
|
14
27
|
export class InstancedBatch {
|
|
15
28
|
readonly mesh: Mesh;
|
|
16
29
|
readonly capacity: number;
|
|
30
|
+
/** Whether the camera draw culls this batch. See `InstancedOptions.cull`. */
|
|
31
|
+
readonly cull: boolean;
|
|
32
|
+
/** The world box around every live instance, fitted at upload. See `instancesBox`. */
|
|
33
|
+
readonly box = new Float32Array([1, 1, 1, -1, -1, -1]);
|
|
17
34
|
private readonly buffer: WebGLBuffer;
|
|
35
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
18
36
|
private readonly staging: Float32Array;
|
|
37
|
+
private readonly kept: {
|
|
38
|
+
readonly buffer: WebGLBuffer;
|
|
39
|
+
readonly vao: WebGLVertexArrayObject;
|
|
40
|
+
readonly instances: MeshInstances;
|
|
41
|
+
} | null;
|
|
19
42
|
|
|
20
|
-
constructor(gl: WebGL2RenderingContext, mesh: Mesh, capacity: number) {
|
|
21
|
-
const buffer = gl.createBuffer();
|
|
22
|
-
if (buffer === null) throw new Error('InstancedBatch: createBuffer failed');
|
|
43
|
+
constructor(gl: WebGL2RenderingContext, mesh: Mesh, capacity: number, cull = false) {
|
|
23
44
|
this.mesh = mesh;
|
|
24
45
|
this.capacity = capacity;
|
|
25
|
-
this.
|
|
46
|
+
this.cull = cull;
|
|
26
47
|
this.staging = new Float32Array(capacity * INSTANCE_FLOATS);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
48
|
+
this.buffer = allocate(gl, capacity);
|
|
49
|
+
this.vao = mesh.createInstanceArray(gl, this.buffer, INSTANCE_STRIDE);
|
|
50
|
+
if (cull) {
|
|
51
|
+
const buffer = allocate(gl, capacity);
|
|
52
|
+
this.kept = {
|
|
53
|
+
buffer,
|
|
54
|
+
vao: mesh.createInstanceArray(gl, buffer, INSTANCE_STRIDE),
|
|
55
|
+
instances: createMeshInstances(capacity),
|
|
56
|
+
};
|
|
57
|
+
} else {
|
|
58
|
+
this.kept = null;
|
|
59
|
+
}
|
|
32
60
|
}
|
|
33
61
|
|
|
34
|
-
/** Pack and push the live prefix, in one call. */
|
|
35
62
|
upload(gl: WebGL2RenderingContext, data: MeshInstances): void {
|
|
63
|
+
if (this.cull) instancesBox(data, this.mesh.bounds, this.box);
|
|
36
64
|
const count = Math.min(data.count, this.capacity);
|
|
37
65
|
if (count === 0) return;
|
|
38
66
|
packInstances(data, this.staging);
|
|
@@ -40,7 +68,45 @@ export class InstancedBatch {
|
|
|
40
68
|
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.staging, 0, count * INSTANCE_FLOATS);
|
|
41
69
|
}
|
|
42
70
|
|
|
71
|
+
/** Draw the first `count` uploaded instances: every draw but a culling camera draw. */
|
|
72
|
+
draw(gl: WebGL2RenderingContext, count: number): void {
|
|
73
|
+
this.mesh.drawInstancesThrough(gl, this.vao, count);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Cull `data` against `frustum`, upload what survives into the second buffer and draw it. Returns
|
|
78
|
+
* how many were drawn — 0 draws nothing. Only for a batch made with `cull`.
|
|
79
|
+
*/
|
|
80
|
+
drawCulled(gl: WebGL2RenderingContext, data: MeshInstances, frustum: FrustumPlanes): number {
|
|
81
|
+
const kept = this.kept;
|
|
82
|
+
if (kept === null) return 0;
|
|
83
|
+
const count = cullInstances(data, this.mesh.bounds, frustum, kept.instances);
|
|
84
|
+
if (count === 0) return 0;
|
|
85
|
+
packInstances(kept.instances, this.staging);
|
|
86
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, kept.buffer);
|
|
87
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.staging, 0, count * INSTANCE_FLOATS);
|
|
88
|
+
this.mesh.drawInstancesThrough(gl, kept.vao, count);
|
|
89
|
+
return count;
|
|
90
|
+
}
|
|
91
|
+
|
|
43
92
|
dispose(gl: WebGL2RenderingContext): void {
|
|
93
|
+
gl.deleteVertexArray(this.vao);
|
|
44
94
|
gl.deleteBuffer(this.buffer);
|
|
95
|
+
if (this.kept !== null) {
|
|
96
|
+
gl.deleteVertexArray(this.kept.vao);
|
|
97
|
+
gl.deleteBuffer(this.kept.buffer);
|
|
98
|
+
}
|
|
45
99
|
}
|
|
46
100
|
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* An instance buffer sized to capacity. `DYNAMIC_DRAW` because a batch of vehicles is rewritten
|
|
104
|
+
* every frame — advisory, but a driver told the truth can place the buffer where a rewrite is cheap.
|
|
105
|
+
*/
|
|
106
|
+
function allocate(gl: WebGL2RenderingContext, capacity: number): WebGLBuffer {
|
|
107
|
+
const buffer = gl.createBuffer();
|
|
108
|
+
if (buffer === null) throw new Error('InstancedBatch: createBuffer failed');
|
|
109
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
110
|
+
gl.bufferData(gl.ARRAY_BUFFER, Math.max(1, capacity) * INSTANCE_STRIDE, gl.DYNAMIC_DRAW);
|
|
111
|
+
return buffer;
|
|
112
|
+
}
|