@driftengine/core 4.4.2 → 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 +97 -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 +28 -3
- package/dist/index.js +20 -1
- package/dist/render/backend/api.d.ts +34 -14
- 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/glassTintPrograms.d.ts +13 -0
- package/dist/render/backend/webgl2/glassTintPrograms.js +38 -0
- 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 +201 -16
- package/dist/render/backend/webgl2/renderer.js +596 -224
- package/dist/render/backend/webgpu/buffers.d.ts +29 -1
- package/dist/render/backend/webgpu/buffers.js +61 -4
- package/dist/render/backend/webgpu/depthPass.d.ts +1 -1
- package/dist/render/backend/webgpu/depthPass.js +7 -2
- 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 +6 -1
- package/dist/render/backend/webgpu/flatPass.js +57 -9
- package/dist/render/backend/webgpu/glassTintPass.d.ts +28 -0
- package/dist/render/backend/webgpu/glassTintPass.js +206 -0
- package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +60 -1
- package/dist/render/backend/webgpu/gpuDrivenPass.js +305 -5
- 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 +23 -2
- package/dist/render/backend/webgpu/instanced.js +41 -4
- package/dist/render/backend/webgpu/latePass.d.ts +30 -0
- package/dist/render/backend/webgpu/latePass.js +140 -0
- package/dist/render/backend/webgpu/lightVolumePass.js +5 -1
- package/dist/render/backend/webgpu/motionPass.d.ts +95 -0
- package/dist/render/backend/webgpu/motionPass.js +491 -0
- package/dist/render/backend/webgpu/pipelineCache.d.ts +10 -1
- package/dist/render/backend/webgpu/pipelineCache.js +11 -1
- package/dist/render/backend/webgpu/pointGlassTintPass.d.ts +32 -0
- package/dist/render/backend/webgpu/pointGlassTintPass.js +193 -0
- package/dist/render/backend/webgpu/pointShadowPass.d.ts +35 -6
- package/dist/render/backend/webgpu/pointShadowPass.js +105 -20
- package/dist/render/backend/webgpu/postPass.d.ts +3 -13
- package/dist/render/backend/webgpu/renderer.d.ts +271 -64
- package/dist/render/backend/webgpu/renderer.js +1395 -580
- package/dist/render/backend/webgpu/scatterPass.js +2 -1
- 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/skinPaletteRing.d.ts +4 -0
- package/dist/render/backend/webgpu/skinPaletteRing.js +4 -0
- package/dist/render/backend/webgpu/snapshotMips.d.ts +29 -0
- package/dist/render/backend/webgpu/snapshotMips.js +52 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +22 -3
- package/dist/render/backend/webgpu/surfaceTexturePass.js +78 -39
- 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/glass.d.ts +45 -0
- package/dist/render/glass.js +39 -0
- package/dist/render/glassCasters.d.ts +40 -0
- package/dist/render/glassCasters.js +84 -0
- package/dist/render/glassShadow.d.ts +78 -0
- package/dist/render/glassShadow.js +125 -0
- package/dist/render/globalMediumPass.d.ts +2 -3
- package/dist/render/globalMediumPass.js +2 -8
- package/dist/render/gpudriven/lit.d.ts +12 -0
- package/dist/render/gpudriven/lit.js +23 -0
- package/dist/render/gpudriven/materialTable.d.ts +15 -5
- package/dist/render/gpudriven/materialTable.js +26 -6
- package/dist/render/gpudriven/pipeline.d.ts +1 -1
- package/dist/render/gpudriven/pipeline.js +4 -3
- package/dist/render/gpudriven/sunGlass.d.ts +35 -0
- package/dist/render/gpudriven/sunGlass.js +89 -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 +36 -35
- package/dist/render/lightBudget.js +38 -37
- 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/pointGlassTint.d.ts +59 -0
- package/dist/render/pointGlassTint.js +198 -0
- package/dist/render/pointLightSelection.d.ts +7 -0
- package/dist/render/pointLightSelection.js +29 -4
- package/dist/render/pointShadowArray.d.ts +56 -3
- package/dist/render/pointShadowArray.js +127 -16
- package/dist/render/pointShadowMap.d.ts +23 -1
- package/dist/render/pointShadowMap.js +27 -1
- package/dist/render/rainField.d.ts +13 -0
- package/dist/render/rainField.js +27 -5
- package/dist/render/recon/changeFrames.d.ts +15 -0
- package/dist/render/recon/changeFrames.js +21 -0
- package/dist/render/recon/lateDepth.d.ts +11 -0
- package/dist/render/recon/lateDepth.js +70 -0
- package/dist/render/recon/lateRouting.d.ts +14 -0
- package/dist/render/recon/lateRouting.js +18 -0
- package/dist/render/recon/mover.d.ts +57 -0
- package/dist/render/recon/mover.js +86 -0
- package/dist/render/recon/resolve.d.ts +34 -4
- package/dist/render/recon/resolve.js +161 -20
- package/dist/render/renderQuality.d.ts +35 -0
- package/dist/render/renderQuality.js +7 -0
- package/dist/render/rendererHarness.js +16 -0
- package/dist/render/sceneTarget.d.ts +9 -1
- package/dist/render/sceneTarget.js +60 -12
- package/dist/render/shaders/depth.d.ts +16 -1
- package/dist/render/shaders/depth.js +94 -15
- package/dist/render/shaders/flat/directionalShadow.js +91 -6
- package/dist/render/shaders/flat/driftLight.d.ts +1 -1
- package/dist/render/shaders/flat/driftLight.js +32 -7
- package/dist/render/shaders/flat/glassTint.d.ts +6 -0
- package/dist/render/shaders/flat/glassTint.js +25 -0
- package/dist/render/shaders/flat/index.d.ts +13 -0
- package/dist/render/shaders/flat/index.js +9 -3
- package/dist/render/shaders/flat/lampGlass.d.ts +1 -0
- package/dist/render/shaders/flat/lampGlass.js +183 -0
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +190 -38
- package/dist/render/shaders/flat/pointShadow.d.ts +1 -1
- package/dist/render/shaders/flat/pointShadow.js +2 -0
- package/dist/render/shaders/flat/preamble.js +96 -26
- 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 +230 -7
- package/dist/render/shaders/generated/depth.wgsl.js +230 -7
- package/dist/render/shaders/generated/flat.wgsl.d.ts +1644 -1596
- package/dist/render/shaders/generated/flat.wgsl.js +1683 -1621
- package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +3 -13
- package/dist/render/shaders/generated/globalMedium.wgsl.js +3 -13
- package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +3 -13
- package/dist/render/shaders/generated/lightVolume.wgsl.js +21 -17
- package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +29 -0
- package/dist/render/shaders/generated/octahedralResolve.wgsl.js +29 -0
- 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/globalMedium.js +6 -6
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +7 -0
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +86 -1
- package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +1 -1
- package/dist/render/shaders/gpudriven/cull.wgsl.js +11 -2
- package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +1 -1
- package/dist/render/shaders/gpudriven/materialTable.wgsl.js +3 -1
- package/dist/render/shaders/gpudriven/shade.wgsl.js +50 -1
- package/dist/render/shaders/gpudriven/sunGlass.wgsl.d.ts +9 -0
- package/dist/render/shaders/gpudriven/sunGlass.wgsl.js +133 -0
- package/dist/render/shaders/lightVolume.js +6 -6
- package/dist/render/shaders/octahedralResolve.d.ts +8 -0
- package/dist/render/shaders/octahedralResolve.js +48 -17
- package/dist/render/shaders/recon/lateDepth.wgsl.d.ts +1 -0
- package/dist/render/shaders/recon/lateDepth.wgsl.js +69 -0
- package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
- package/dist/render/shaders/recon/motion.wgsl.js +84 -0
- 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/shadowCasters.d.ts +20 -1
- package/dist/render/shadowCasters.js +15 -1
- package/dist/render/shadowMap.d.ts +54 -5
- package/dist/render/shadowMap.js +190 -36
- package/dist/render/sunGlassTint.d.ts +25 -0
- package/dist/render/sunGlassTint.js +79 -0
- 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/translucentQueue.d.ts +6 -0
- package/dist/render/translucentQueue.js +15 -1
- 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 +61 -1
- package/src/render/backend/api.ts +36 -11
- package/src/render/backend/drawFog.ts +31 -0
- package/src/render/backend/materialChanges.ts +9 -2
- package/src/render/backend/webgl2/glassTintPrograms.ts +58 -0
- package/src/render/backend/webgl2/instanced.ts +80 -14
- package/src/render/backend/webgl2/renderer.ts +700 -250
- package/src/render/backend/webgpu/buffers.ts +92 -5
- package/src/render/backend/webgpu/depthPass.ts +7 -2
- package/src/render/backend/webgpu/drawCommand.ts +6 -0
- package/src/render/backend/webgpu/flatPass.ts +62 -11
- package/src/render/backend/webgpu/glassTintPass.ts +245 -0
- package/src/render/backend/webgpu/gpuDrivenPass.ts +349 -5
- package/src/render/backend/webgpu/instanceCullPass.ts +165 -0
- package/src/render/backend/webgpu/instanced.ts +42 -4
- package/src/render/backend/webgpu/latePass.ts +161 -0
- package/src/render/backend/webgpu/lightVolumePass.ts +5 -1
- package/src/render/backend/webgpu/motionPass.ts +535 -0
- package/src/render/backend/webgpu/pipelineCache.ts +12 -1
- package/src/render/backend/webgpu/pointGlassTintPass.ts +233 -0
- package/src/render/backend/webgpu/pointShadowPass.ts +158 -26
- package/src/render/backend/webgpu/renderer.ts +1671 -670
- package/src/render/backend/webgpu/scatterPass.ts +2 -1
- 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/skinPaletteRing.ts +4 -0
- package/src/render/backend/webgpu/snapshotMips.ts +80 -0
- package/src/render/backend/webgpu/surfaceTexturePass.ts +91 -51
- 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/glass.ts +74 -0
- package/src/render/glassCasters.ts +164 -0
- package/src/render/glassShadow.ts +153 -0
- package/src/render/globalMediumPass.ts +4 -11
- package/src/render/gpudriven/lit.ts +31 -0
- package/src/render/gpudriven/materialTable.ts +28 -6
- package/src/render/gpudriven/pipeline.ts +4 -3
- package/src/render/gpudriven/sunGlass.ts +117 -0
- package/src/render/instanceCull.ts +205 -0
- package/src/render/instances.ts +16 -0
- package/src/render/lightBudget.ts +41 -38
- package/src/render/lightGrid.ts +130 -0
- package/src/render/mesh.ts +59 -72
- package/src/render/occlusion.ts +51 -7
- package/src/render/pointGlassTint.ts +250 -0
- package/src/render/pointLightSelection.ts +72 -4
- package/src/render/pointShadowArray.ts +188 -22
- package/src/render/pointShadowMap.ts +41 -0
- package/src/render/rainField.ts +39 -5
- package/src/render/recon/changeFrames.ts +24 -0
- package/src/render/recon/lateDepth.ts +83 -0
- package/src/render/recon/lateRouting.ts +29 -0
- package/src/render/recon/mover.ts +118 -0
- package/src/render/recon/resolve.ts +206 -20
- package/src/render/renderQuality.ts +47 -0
- package/src/render/rendererHarness.ts +16 -0
- package/src/render/sceneTarget.ts +62 -11
- package/src/render/shaders/depth.ts +118 -15
- package/src/render/shaders/flat/directionalShadow.ts +97 -6
- package/src/render/shaders/flat/driftLight.ts +32 -7
- package/src/render/shaders/flat/glassTint.ts +25 -0
- package/src/render/shaders/flat/index.ts +22 -3
- package/src/render/shaders/flat/lampGlass.ts +185 -0
- package/src/render/shaders/flat/main.ts +190 -38
- package/src/render/shaders/flat/pointShadow.ts +2 -0
- package/src/render/shaders/flat/preamble.ts +96 -26
- package/src/render/shaders/flat/surfaceEffects.ts +152 -0
- package/src/render/shaders/generated/depth.wgsl.ts +237 -7
- package/src/render/shaders/generated/flat.wgsl.ts +1685 -1621
- package/src/render/shaders/generated/globalMedium.wgsl.ts +3 -13
- package/src/render/shaders/generated/lightVolume.wgsl.ts +23 -17
- package/src/render/shaders/generated/octahedralResolve.wgsl.ts +30 -0
- 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/globalMedium.ts +6 -6
- package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +88 -1
- package/src/render/shaders/gpudriven/cull.wgsl.ts +11 -2
- package/src/render/shaders/gpudriven/materialTable.wgsl.ts +3 -1
- package/src/render/shaders/gpudriven/shade.wgsl.ts +50 -1
- package/src/render/shaders/gpudriven/sunGlass.wgsl.ts +139 -0
- package/src/render/shaders/lightVolume.ts +6 -6
- package/src/render/shaders/octahedralResolve.ts +50 -17
- package/src/render/shaders/recon/lateDepth.wgsl.ts +72 -0
- package/src/render/shaders/recon/motion.wgsl.ts +84 -0
- 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/shadowCasters.ts +28 -1
- package/src/render/shadowMap.ts +231 -37
- package/src/render/sunGlassTint.ts +86 -0
- 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/translucentQueue.ts +20 -1
- package/src/render/vertexDefaults.ts +2 -0
- package/src/world/hlod.ts +290 -0
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { instancesBox } from '../../instanceCull.ts';
|
|
1
2
|
import { INSTANCE_FLOATS, INSTANCE_STRIDE, packInstances } from '../../instances.ts';
|
|
3
|
+
import { destroySlot } from './instanceCullPass.ts';
|
|
4
|
+
import type { CullSlot } from './instanceCullPass.ts';
|
|
2
5
|
import type { MeshInstances } from '../../instances.ts';
|
|
3
6
|
import type { GpuMesh } from './buffers.ts';
|
|
4
7
|
|
|
5
8
|
/** VERTEX | COPY_DST, spelled the way every other pass here spells it. */
|
|
6
9
|
const USAGE_VERTEX = 0x0020 | 0x0008;
|
|
10
|
+
/** A culling batch's source is read by the cull as storage too. */
|
|
11
|
+
const USAGE_STORAGE = 0x0080;
|
|
7
12
|
|
|
8
13
|
/**
|
|
9
14
|
* One mesh's per-instance buffer on the device.
|
|
@@ -21,9 +26,20 @@ export class GpuInstancedBatch {
|
|
|
21
26
|
readonly capacity: number;
|
|
22
27
|
private readonly staging: Float32Array;
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
/** Whether the camera draw culls this batch. See `InstancedOptions.cull`. */
|
|
30
|
+
readonly cull: boolean;
|
|
31
|
+
/** The world box around every live instance, fitted at upload. See `instancesBox`. */
|
|
32
|
+
readonly box = new Float32Array([1, 1, 1, -1, -1, -1]);
|
|
33
|
+
/** One set of survivors per view drawn this frame. See `InstanceCullPass`. */
|
|
34
|
+
readonly slots: CullSlot[] = [];
|
|
35
|
+
/** The frame the slots were last taken in, and how many were taken. */
|
|
36
|
+
slotFrame = -1;
|
|
37
|
+
slotsTaken = 0;
|
|
38
|
+
|
|
39
|
+
constructor(device: GPUDevice, mesh: GpuMesh, capacity: number, label: string, cull = false) {
|
|
25
40
|
this.mesh = mesh;
|
|
26
41
|
this.capacity = capacity;
|
|
42
|
+
this.cull = cull;
|
|
27
43
|
this.staging = new Float32Array(capacity * INSTANCE_FLOATS);
|
|
28
44
|
this.buffer = device.createBuffer({
|
|
29
45
|
/*
|
|
@@ -31,25 +47,47 @@ export class GpuInstancedBatch {
|
|
|
31
47
|
* naming the resource it was about, and an unlabelled buffer names nothing.
|
|
32
48
|
*/
|
|
33
49
|
label,
|
|
34
|
-
size: capacity * INSTANCE_STRIDE,
|
|
35
|
-
usage: USAGE_VERTEX,
|
|
50
|
+
size: Math.max(1, capacity) * INSTANCE_STRIDE,
|
|
51
|
+
usage: USAGE_VERTEX | (cull ? USAGE_STORAGE : 0),
|
|
36
52
|
});
|
|
37
53
|
}
|
|
38
54
|
|
|
55
|
+
/** Last frame's packed slots, for a reconstruction; made on first use by the renderer. */
|
|
56
|
+
previousBuffer: GPUBuffer | null = null;
|
|
57
|
+
/** How many slots the upload before the last one held, and how many the last one holds. */
|
|
58
|
+
previousCount = 0;
|
|
59
|
+
liveCount = 0;
|
|
60
|
+
/** The frame of the last upload. See `changeFrames.ts`. */
|
|
61
|
+
changed = -1;
|
|
62
|
+
|
|
39
63
|
/**
|
|
40
64
|
* Pack and push `data.count` instances, in one write.
|
|
41
65
|
*
|
|
42
66
|
* Only the live prefix, for the reason `uploadScatter` gives: the rest is not drawn and
|
|
43
67
|
* uploading it would be per-frame waste with nothing reading it.
|
|
68
|
+
*
|
|
69
|
+
* **Given `previous`, the placement still in the staging array — the last upload, which is last
|
|
70
|
+
* frame's — is written there first**, so a reconstruction can pair each slot with where it was.
|
|
71
|
+
* `writeBuffer` copies at the call, so packing afterwards cannot reach that copy.
|
|
44
72
|
*/
|
|
45
|
-
upload(queue: GPUQueue, data: MeshInstances): void {
|
|
73
|
+
upload(queue: GPUQueue, data: MeshInstances, previous: GPUBuffer | null = null): void {
|
|
74
|
+
if (this.cull) instancesBox(data, this.mesh.bounds, this.box);
|
|
46
75
|
const count = Math.min(data.count, this.capacity);
|
|
76
|
+
if (previous !== null) {
|
|
77
|
+
if (this.liveCount > 0) {
|
|
78
|
+
queue.writeBuffer(previous, 0, this.staging, 0, this.liveCount * INSTANCE_FLOATS);
|
|
79
|
+
}
|
|
80
|
+
this.previousCount = this.liveCount;
|
|
81
|
+
}
|
|
82
|
+
this.liveCount = count;
|
|
47
83
|
if (count === 0) return;
|
|
48
84
|
packInstances(data, this.staging);
|
|
49
85
|
queue.writeBuffer(this.buffer, 0, this.staging, 0, count * INSTANCE_FLOATS);
|
|
50
86
|
}
|
|
51
87
|
|
|
52
88
|
dispose(): void {
|
|
89
|
+
this.previousBuffer?.destroy();
|
|
53
90
|
this.buffer.destroy();
|
|
91
|
+
for (const slot of this.slots) destroySlot(slot);
|
|
54
92
|
}
|
|
55
93
|
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a reconstructing frame draws after the upscale: its blended draws, at the output size.
|
|
3
|
+
*
|
|
4
|
+
* **Why late.** A blended surface writes no depth the motion pass could test against and has no
|
|
5
|
+
* single motion per pixel — a caption over a wall is two surfaces moving two ways — so a
|
|
6
|
+
* reconstruction can only smear it. Drawn after the resolve, at output resolution and unjittered,
|
|
7
|
+
* it is as sharp as a native frame and has no history to ghost.
|
|
8
|
+
*
|
|
9
|
+
* **What it holds**: a command pool of its own, because the frame graph's pool is spent at every
|
|
10
|
+
* scene flush and these must survive until the reconstruction has run; an output-size depth
|
|
11
|
+
* target; and the pass that fills it from the render's depth. Cost: translucent pixels are shaded
|
|
12
|
+
* at output resolution — 2.25x as many at ratio 1.5, only where translucency is — plus one
|
|
13
|
+
* full-screen depth pass.
|
|
14
|
+
*/
|
|
15
|
+
import { DEPTH_CLEAR, DEPTH_FORMAT } from '../../depthConvention.ts';
|
|
16
|
+
import { LATE_DEPTH_WGSL } from '../../shaders/recon/lateDepth.wgsl.ts';
|
|
17
|
+
import type { CommandPool, DrawCommand } from './drawCommand.ts';
|
|
18
|
+
import { createCommandPool, resetPool, takeCommand } from './drawCommand.ts';
|
|
19
|
+
|
|
20
|
+
export class LatePass {
|
|
21
|
+
private readonly device: GPUDevice;
|
|
22
|
+
private readonly commands: CommandPool = createCommandPool(64);
|
|
23
|
+
private depth: GPUTexture | null = null;
|
|
24
|
+
private depthTextureView: GPUTextureView | null = null;
|
|
25
|
+
private readonly layout: GPUBindGroupLayout;
|
|
26
|
+
private readonly pipeline: GPURenderPipeline;
|
|
27
|
+
private readonly sizes: GPUBuffer;
|
|
28
|
+
/** The render size and the output size, then the frame's jitter in render texels. */
|
|
29
|
+
private readonly sizeStaging = new Float32Array(8);
|
|
30
|
+
private group: GPUBindGroup | null = null;
|
|
31
|
+
private groupSource: GPUTextureView | null = null;
|
|
32
|
+
|
|
33
|
+
constructor(device: GPUDevice) {
|
|
34
|
+
this.device = device;
|
|
35
|
+
this.layout = device.createBindGroupLayout({
|
|
36
|
+
label: 'recon.lateDepth.layout',
|
|
37
|
+
entries: [
|
|
38
|
+
{ binding: 0, visibility: 0x2, texture: { sampleType: 'depth' } },
|
|
39
|
+
{ binding: 1, visibility: 0x2, buffer: { type: 'uniform' } },
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
const module = device.createShaderModule({ label: 'recon.lateDepth', code: LATE_DEPTH_WGSL });
|
|
43
|
+
this.pipeline = device.createRenderPipeline({
|
|
44
|
+
label: 'recon.lateDepth',
|
|
45
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [this.layout] }),
|
|
46
|
+
vertex: { module, entryPoint: 'lateDepthVert' },
|
|
47
|
+
fragment: { module, entryPoint: 'lateDepthFrag', targets: [] },
|
|
48
|
+
primitive: { topology: 'triangle-list' },
|
|
49
|
+
depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: true, depthCompare: 'always' },
|
|
50
|
+
});
|
|
51
|
+
this.sizes = device.createBuffer({
|
|
52
|
+
label: 'recon.lateDepth.sizes',
|
|
53
|
+
size: 32,
|
|
54
|
+
usage: 0x40 | 0x8, // UNIFORM | COPY_DST
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The output-size depth, (re)made when the output changes size. */
|
|
59
|
+
depthView(width: number, height: number): GPUTextureView {
|
|
60
|
+
if (this.depth === null || this.depth.width !== width || this.depth.height !== height) {
|
|
61
|
+
this.depth?.destroy();
|
|
62
|
+
this.depth = this.device.createTexture({
|
|
63
|
+
label: 'recon.lateDepth',
|
|
64
|
+
size: [width, height],
|
|
65
|
+
format: DEPTH_FORMAT,
|
|
66
|
+
usage: 0x10, // RENDER_ATTACHMENT
|
|
67
|
+
});
|
|
68
|
+
this.depthTextureView = this.depth.createView();
|
|
69
|
+
}
|
|
70
|
+
return this.depthTextureView as GPUTextureView;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Fill the output-size depth from `source`, the render's single-sample depth, drawn jittered by
|
|
75
|
+
* (`jitterX`, `jitterY`) render texels — which the fill takes back out (`recon/lateDepth.ts`).
|
|
76
|
+
*/
|
|
77
|
+
upscale(
|
|
78
|
+
encoder: GPUCommandEncoder,
|
|
79
|
+
source: GPUTextureView,
|
|
80
|
+
renderWidth: number,
|
|
81
|
+
renderHeight: number,
|
|
82
|
+
outputWidth: number,
|
|
83
|
+
outputHeight: number,
|
|
84
|
+
jitterX: number,
|
|
85
|
+
jitterY: number,
|
|
86
|
+
): void {
|
|
87
|
+
const target = this.depthView(outputWidth, outputHeight);
|
|
88
|
+
this.sizeStaging[0] = renderWidth;
|
|
89
|
+
this.sizeStaging[1] = renderHeight;
|
|
90
|
+
this.sizeStaging[2] = outputWidth;
|
|
91
|
+
this.sizeStaging[3] = outputHeight;
|
|
92
|
+
this.sizeStaging[4] = jitterX;
|
|
93
|
+
this.sizeStaging[5] = jitterY;
|
|
94
|
+
this.device.queue.writeBuffer(this.sizes, 0, this.sizeStaging);
|
|
95
|
+
if (this.group === null || this.groupSource !== source) {
|
|
96
|
+
this.group = this.device.createBindGroup({
|
|
97
|
+
label: 'recon.lateDepth.group',
|
|
98
|
+
layout: this.layout,
|
|
99
|
+
entries: [
|
|
100
|
+
{ binding: 0, resource: source },
|
|
101
|
+
{ binding: 1, resource: { buffer: this.sizes } },
|
|
102
|
+
],
|
|
103
|
+
});
|
|
104
|
+
this.groupSource = source;
|
|
105
|
+
}
|
|
106
|
+
const pass = encoder.beginRenderPass({
|
|
107
|
+
label: 'recon.lateDepth',
|
|
108
|
+
colorAttachments: [],
|
|
109
|
+
depthStencilAttachment: {
|
|
110
|
+
view: target,
|
|
111
|
+
depthClearValue: DEPTH_CLEAR,
|
|
112
|
+
depthLoadOp: 'clear',
|
|
113
|
+
depthStoreOp: 'store',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
pass.setPipeline(this.pipeline);
|
|
117
|
+
pass.setBindGroup(0, this.group);
|
|
118
|
+
pass.draw(3);
|
|
119
|
+
pass.end();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** A command slot for one late draw. Every field a caller uses it fills; see `takeCommand`. */
|
|
123
|
+
take(): DrawCommand {
|
|
124
|
+
const at = takeCommand(this.commands);
|
|
125
|
+
const command = this.commands.commands[at] as DrawCommand;
|
|
126
|
+
command.offsetCount = 0;
|
|
127
|
+
command.vertexCount = 0;
|
|
128
|
+
command.indexBuffer = null;
|
|
129
|
+
command.indexed = false;
|
|
130
|
+
command.instances = 1;
|
|
131
|
+
command.indirect = null;
|
|
132
|
+
return command;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Late draws recorded this frame. */
|
|
136
|
+
get pending(): number {
|
|
137
|
+
return this.commands.taken;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Every late draw, in the order it was recorded, through the renderer's own issue. */
|
|
141
|
+
replay(
|
|
142
|
+
pass: GPURenderPassEncoder,
|
|
143
|
+
issue: (pass: GPURenderPassEncoder, command: DrawCommand) => void,
|
|
144
|
+
): void {
|
|
145
|
+
for (let i = 0; i < this.commands.taken; i += 1) {
|
|
146
|
+
const command = this.commands.commands[i];
|
|
147
|
+
if (command !== undefined) issue(pass, command);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
reset(): void {
|
|
152
|
+
resetPool(this.commands);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
dispose(): void {
|
|
156
|
+
this.depth?.destroy();
|
|
157
|
+
this.depth = null;
|
|
158
|
+
this.depthTextureView = null;
|
|
159
|
+
this.sizes.destroy();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -87,7 +87,11 @@ export function createLightVolumeBindGroupLayout(
|
|
|
87
87
|
entries.push({
|
|
88
88
|
binding: texture.texture,
|
|
89
89
|
visibility: VISIBILITY_FRAGMENT,
|
|
90
|
-
texture: {
|
|
90
|
+
texture: {
|
|
91
|
+
sampleType: 'unfilterable-float',
|
|
92
|
+
/* The sun's maps are one array since 4.5.0; see `shadowMap.ts`. */
|
|
93
|
+
...(texture.type === 'sampler2DArray' ? { viewDimension: '2d-array' as const } : {}),
|
|
94
|
+
},
|
|
91
95
|
});
|
|
92
96
|
entries.push({
|
|
93
97
|
binding: texture.sampler,
|