@woosh/meep-engine 3.68.0 → 3.69.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.md +45 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +2 -17
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
- package/editor/ecs/component/editors/ecs/Trail3DEditor.js +3 -18
- package/package.json +1 -1
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +33 -65
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
- package/src/engine/graphics/ecs/trail3d/Trail3D.js +37 -245
- package/src/engine/graphics/ecs/trail3d/Trail3DFlags.d.ts +0 -4
- package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +4 -10
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts +13 -10
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts.map +1 -1
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +28 -37
- package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts +10 -0
- package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts.map +1 -0
- package/src/engine/graphics/ecs/trail3d/trail_knot_count.js +27 -0
- package/src/engine/graphics/trail/TrailKnots.d.ts +62 -0
- package/src/engine/graphics/trail/TrailKnots.d.ts.map +1 -0
- package/src/engine/graphics/trail/TrailKnots.js +137 -0
- package/src/engine/graphics/trail/tube/TubeXMaterialSpec.d.ts +1 -1
- package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +1 -1
- package/src/engine/graphics3/EntityRowHold.d.ts +48 -0
- package/src/engine/graphics3/EntityRowHold.d.ts.map +1 -0
- package/src/engine/graphics3/EntityRowHold.js +128 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -2
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +11 -44
- package/src/engine/graphics3/Trail3DSystem.d.ts +69 -35
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +380 -81
- package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts +17 -0
- package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacle.js +22 -2
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +6 -5
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +14 -3
- package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts +9 -1
- package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js +11 -1
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts +5 -0
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js +2 -0
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts +4 -3
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js +11 -3
- package/src/shade/playground/trails/index.html +50 -0
- package/src/shade/playground/trails/main.d.ts +2 -0
- package/src/shade/playground/trails/main.d.ts.map +1 -0
- package/src/shade/playground/trails/main.js +258 -0
- package/src/shade/renderer/animation/animation_curve_write_keys.d.ts +18 -0
- package/src/shade/renderer/animation/animation_curve_write_keys.d.ts.map +1 -0
- package/src/shade/renderer/animation/animation_curve_write_keys.js +34 -0
- package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts.map +1 -1
- package/src/shade/renderer/deferred/tonemap/ColorGrade.js +13 -36
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +2 -2
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -13
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +6 -21
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +17 -6
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +38 -178
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +7 -9
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +17 -106
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +7 -17
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +18 -118
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts +14 -0
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING.js +18 -0
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts +3 -1
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.js +4 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +9 -0
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +20 -4
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts +11 -2
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.js +59 -2
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +4 -1
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +367 -341
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +6 -2
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +339 -282
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +3 -2
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -1
- package/src/shade/renderer/grass/press/shader_grass_press_mark.js +5 -3
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts +49 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.js +144 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts +71 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.js +152 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.js +30 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts +101 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.js +306 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +11 -4
- package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts +69 -0
- package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts.map +1 -0
- package/src/shade/renderer/trails/GPUTrailAVBOITChannel.js +129 -0
- package/src/shade/renderer/trails/GPUTrailSystem.d.ts +164 -0
- package/src/shade/renderer/trails/GPUTrailSystem.d.ts.map +1 -0
- package/src/shade/renderer/trails/GPUTrailSystem.js +725 -0
- package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts +14 -0
- package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.js +38 -0
- package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts +66 -0
- package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_KNOT.js +154 -0
- package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts +19 -0
- package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_RECORD.js +68 -0
- package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts +18 -0
- package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_STATE.js +43 -0
- package/src/shade/renderer/trails/graph_trails.d.ts +58 -0
- package/src/shade/renderer/trails/graph_trails.d.ts.map +1 -0
- package/src/shade/renderer/trails/graph_trails.js +155 -0
- package/src/shade/renderer/trails/graph_trails_avboit.d.ts +126 -0
- package/src/shade/renderer/trails/graph_trails_avboit.d.ts.map +1 -0
- package/src/shade/renderer/trails/graph_trails_avboit.js +300 -0
- package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts +56 -0
- package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts.map +1 -0
- package/src/shade/renderer/trails/runtime/TrailFadeCurves.js +220 -0
- package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts +49 -0
- package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts.map +1 -0
- package/src/shade/renderer/trails/runtime/TrailKnotPool.js +162 -0
- package/src/shade/renderer/trails/runtime/TrailParameters.d.ts +52 -0
- package/src/shade/renderer/trails/runtime/TrailParameters.d.ts.map +1 -0
- package/src/shade/renderer/trails/runtime/TrailParameters.js +126 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts +23 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.js +57 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts +14 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.js +40 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts +18 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_seed.js +64 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts +14 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_segment.js +51 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts +48 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_update.js +197 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts +34 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_vertex.js +111 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts +24 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit.js +78 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts +23 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.js +130 -0
- package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts +29 -0
- package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_draw_args.js +78 -0
- package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts +18 -0
- package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_seed.js +79 -0
- package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts +20 -0
- package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_update.js +101 -0
- package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts +0 -18
- package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts.map +0 -1
- package/src/engine/graphics/ecs/trail3d/advance_trail.js +0 -42
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts +0 -14
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts.map +0 -1
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +0 -75
- package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts +0 -17
- package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts.map +0 -1
- package/src/engine/graphics/ecs/trail3d/trail_head_position.js +0 -19
- package/src/engine/graphics/trail/tube/TubeX.d.ts +0 -186
- package/src/engine/graphics/trail/tube/TubeX.d.ts.map +0 -1
- package/src/engine/graphics/trail/tube/TubeX.js +0 -575
- package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +0 -16
- package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +0 -1
- package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +0 -34
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +0 -27
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +0 -1
- package/src/engine/graphics/trail/tube/tube_attributes_spec.js +0 -70
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +0 -38
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +0 -1
- package/src/engine/graphics3/trail/trail_tube_write_geometry.js +0 -119
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ANIMATION_CURVE_KEYFRAME_STRUCT } from "../../animation/ANIMATION_CURVE_KEYFRAME_STRUCT.js";
|
|
2
|
+
import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
3
|
+
import { chunk_avboit_unlit_varyings } from "../../rasterize/native/avboit/chunk_avboit_unlit_varyings.js";
|
|
4
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
5
|
+
import { ShaderResourceGroupDescriptor } from "../../shader/resource/ShaderResourceGroupDescriptor.js";
|
|
6
|
+
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
7
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
8
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
9
|
+
import { TRAIL_DESCRIPTOR, TRAIL_STATE_DESCRIPTOR } from "../data/TRAIL_DATABASE_SPEC.js";
|
|
10
|
+
import { TRAIL_STRUCT } from "../data/TRAIL_RECORD.js";
|
|
11
|
+
import { chunk_trail_knot_alpha } from "./chunk_trail_knot_alpha.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The frame uniform: the clock the knots' ages are counted against.
|
|
15
|
+
*/
|
|
16
|
+
export const TRAIL_FRAME_STRUCT = WebGPUStruct.from({
|
|
17
|
+
now: u32,
|
|
18
|
+
}, "Trail3DFrame");
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* What the trails' vertex stage reads, the same group in the splat and the draw: the camera, the
|
|
22
|
+
* clock, the frame's segment list, the knots, the trail and state tables and the fade keys.
|
|
23
|
+
*
|
|
24
|
+
* @type {ShaderResourceGroupDescriptor}
|
|
25
|
+
*/
|
|
26
|
+
export const TRAIL_VERTEX_GROUP = new ShaderResourceGroupDescriptor();
|
|
27
|
+
|
|
28
|
+
TRAIL_VERTEX_GROUP
|
|
29
|
+
.addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
30
|
+
.addUniform("trail_frame", TRAIL_FRAME_STRUCT)
|
|
31
|
+
.addStorageBuffer("segment_list", WebGPUArray.u32, false)
|
|
32
|
+
.addStorageBuffer("knots", WebGPUArray.u32, false)
|
|
33
|
+
.addStorageBuffer("trail_database", WebGPUArray.u32, false)
|
|
34
|
+
.addStorageBuffer("fade_keys", WebGPUArray.from(ANIMATION_CURVE_KEYFRAME_STRUCT), false);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* `trail_vertex(vertex_index, instance_index) -> AVBOITUnlitVaryings`: one vertex of one segment of a
|
|
38
|
+
* trail's tube, extruded where the vertex shader runs instead of on the CPU.
|
|
39
|
+
*
|
|
40
|
+
* The instance is the segment: `segment_list[instance_index]` is its head-ward knot, and the knot
|
|
41
|
+
* names its trail, whose record and state it reads. `trail_ring_vertex(record, head, live, head_ward,
|
|
42
|
+
* vertex_index, now)` is the vertex itself: `vertex_index` runs over the two rings of `radial + 1`
|
|
43
|
+
* vertices, the head-ward ring first; the seam vertex closes each ring on its first.
|
|
44
|
+
*
|
|
45
|
+
* A ring vertex sits at its knot's centre displaced by `cos θ · normal + sin θ · binormal`, half the
|
|
46
|
+
* knot's thickness out, at `θ = 2π · r / radial`. Its colour is the trail's; its alpha is the knot's (`trail_knot_alpha`), clamped to 0..1 and
|
|
47
|
+
* split between the tube's two faces as `1 - √(1 - α)`, because a line of sight through the closed tube
|
|
48
|
+
* crosses two faces and the two together must cover `α`.
|
|
49
|
+
*
|
|
50
|
+
* The enclosing shader binds {@link TRAIL_VERTEX_GROUP}.
|
|
51
|
+
*
|
|
52
|
+
* @type {CodeChunk}
|
|
53
|
+
*/
|
|
54
|
+
export const chunk_trail_vertex = CodeChunk.from(
|
|
55
|
+
//language=WGSL
|
|
56
|
+
`
|
|
57
|
+
const TRAIL_TWO_PI : f32 = 6.283185307179586;
|
|
58
|
+
|
|
59
|
+
fn trail_vertex(vertex_index : u32, instance_index : u32) -> AVBOITUnlitVaryings {
|
|
60
|
+
let head_ward = segment_list[instance_index];
|
|
61
|
+
let row = trail_knot_read(head_ward).trail;
|
|
62
|
+
|
|
63
|
+
let record = ${TRAIL_DESCRIPTOR.marshalling_method_read}(&trail_database, row);
|
|
64
|
+
let state = ${TRAIL_STATE_DESCRIPTOR.marshalling_method_read}(&trail_database, row);
|
|
65
|
+
|
|
66
|
+
return trail_ring_vertex(record, state.head, state.live, head_ward, vertex_index, trail_frame.now);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
fn trail_ring_vertex(
|
|
70
|
+
record : ${TRAIL_STRUCT.wgsl_ref},
|
|
71
|
+
head : u32,
|
|
72
|
+
live : u32,
|
|
73
|
+
head_ward : u32,
|
|
74
|
+
vertex_index : u32,
|
|
75
|
+
now : u32,
|
|
76
|
+
) -> AVBOITUnlitVaryings {
|
|
77
|
+
let ring_size = record.radial + 1u;
|
|
78
|
+
let ring = vertex_index / ring_size;
|
|
79
|
+
let around = vertex_index % ring_size;
|
|
80
|
+
|
|
81
|
+
var address = head_ward;
|
|
82
|
+
|
|
83
|
+
if (ring != 0u) {
|
|
84
|
+
address = record.knot_base + (head_ward - record.knot_base + 1u) % record.knot_count;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let knot = trail_knot_read(address);
|
|
88
|
+
|
|
89
|
+
let alpha = clamp(trail_knot_alpha(record, head, live, address, now), 0.0, 1.0);
|
|
90
|
+
|
|
91
|
+
let angle = f32(around) / f32(record.radial) * TRAIL_TWO_PI;
|
|
92
|
+
let radial = cos(angle) * knot.normal + sin(angle) * knot.binormal;
|
|
93
|
+
let world = vec4<f32>(knot.position + radial * (knot.thickness * 0.5), 1.0);
|
|
94
|
+
|
|
95
|
+
var out : AVBOITUnlitVaryings;
|
|
96
|
+
|
|
97
|
+
out.clip = camera.view_projection_matrix * world;
|
|
98
|
+
// half the optical depth: the face behind this one carries the other half
|
|
99
|
+
out.color = vec4<f32>(record.color.rgb, 1.0 - sqrt(1.0 - alpha));
|
|
100
|
+
// the camera looks down -Z, so depth is -z
|
|
101
|
+
out.view_depth = -(camera.view_matrix * world).z;
|
|
102
|
+
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
`, [
|
|
106
|
+
chunk_avboit_unlit_varyings,
|
|
107
|
+
TRAIL_DESCRIPTOR.chunk_read,
|
|
108
|
+
TRAIL_STATE_DESCRIPTOR.chunk_read,
|
|
109
|
+
chunk_trail_knot_alpha,
|
|
110
|
+
]
|
|
111
|
+
);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bind group of {@link TRAIL_VERTEX_GROUP} in both trail pipelines.
|
|
3
|
+
* @type {number}
|
|
4
|
+
*/
|
|
5
|
+
export const TRAIL_AVBOIT_BIND_GROUP_VERTEX: number;
|
|
6
|
+
/**
|
|
7
|
+
* The trails' AVBOIT splat: the tube extruded in the vertex stage (`chunk_trail_vertex`), into the unlit
|
|
8
|
+
* splat's fragment stage, the one the dynamic meshes splat through.
|
|
9
|
+
*/
|
|
10
|
+
export const TRAIL_AVBOIT_SPLAT_PIPELINE: import("../../../descriptor/pipeline/render/RenderPipelineDescriptor.js").RenderPipelineDescriptor;
|
|
11
|
+
export const TRAIL_AVBOIT_SPLAT_RESOURCES: ShaderResourceSetDescriptor;
|
|
12
|
+
/** The assembled splat shader, for the validity tier. */
|
|
13
|
+
export const shader_trail_avboit_splat: ShaderDescriptor;
|
|
14
|
+
/**
|
|
15
|
+
* The trails' AVBOIT draw: the tube extruded in the vertex stage, into the unlit draw's fragment stage,
|
|
16
|
+
* the one the dynamic meshes draw through.
|
|
17
|
+
*/
|
|
18
|
+
export const TRAIL_AVBOIT_DRAW_PIPELINE: import("../../../descriptor/pipeline/render/RenderPipelineDescriptor.js").RenderPipelineDescriptor;
|
|
19
|
+
export const TRAIL_AVBOIT_DRAW_RESOURCES: ShaderResourceSetDescriptor;
|
|
20
|
+
/** The assembled draw shader, for the validity tier. */
|
|
21
|
+
export const shader_trail_avboit_draw: ShaderDescriptor;
|
|
22
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
23
|
+
import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
|
|
24
|
+
//# sourceMappingURL=shader_trail_avboit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_trail_avboit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/trails/shaders/shader_trail_avboit.js"],"names":[],"mappings":"AAQA;;;GAGG;AACH,6CAFU,MAAM,CAEgC;AA0BhD;;;GAGG;AACH,6IAIG;AAEH,uEAA4D;AAE5D,yDAAyD;AACzD,yDAA0D;AAa1D;;;GAGG;AACH,4IAIG;AAEH,sEAA0D;AAE1D,wDAAwD;AACxD,wDAAwD;4CAzEZ,sDAAsD;iCACjE,kCAAkC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { avboit_unlit_draw_pipeline, AVBOIT_UNLIT_DRAW_PASS_GROUP, chunk_avboit_unlit_draw_fragment } from "../../rasterize/native/avboit/avboit_unlit_draw.js";
|
|
2
|
+
import { avboit_unlit_splat_pipeline, AVBOIT_UNLIT_SPLAT_PASS_GROUP, chunk_avboit_unlit_splat_fragment } from "../../rasterize/native/avboit/avboit_unlit_splat.js";
|
|
3
|
+
import { AVBOIT_SPLAT_VOLUME_GROUP } from "../../rasterize/native/avboit/shader_avboit_splat.js";
|
|
4
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
5
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
6
|
+
import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
|
|
7
|
+
import { chunk_trail_vertex, TRAIL_VERTEX_GROUP } from "./chunk_trail_vertex.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Bind group of {@link TRAIL_VERTEX_GROUP} in both trail pipelines.
|
|
11
|
+
* @type {number}
|
|
12
|
+
*/
|
|
13
|
+
export const TRAIL_AVBOIT_BIND_GROUP_VERTEX = 0;
|
|
14
|
+
|
|
15
|
+
const vertex_stage = CodeChunk.from(
|
|
16
|
+
//language=WGSL
|
|
17
|
+
`
|
|
18
|
+
@vertex
|
|
19
|
+
fn vs_main(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> AVBOITUnlitVaryings {
|
|
20
|
+
return trail_vertex(vi, ii);
|
|
21
|
+
}
|
|
22
|
+
`, [
|
|
23
|
+
chunk_trail_vertex,
|
|
24
|
+
]
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const splat_resources = new ShaderResourceSetDescriptor();
|
|
28
|
+
|
|
29
|
+
splat_resources.addGroup(TRAIL_VERTEX_GROUP);
|
|
30
|
+
splat_resources.addGroup(AVBOIT_UNLIT_SPLAT_PASS_GROUP);
|
|
31
|
+
splat_resources.addGroup(AVBOIT_SPLAT_VOLUME_GROUP);
|
|
32
|
+
|
|
33
|
+
const splat_descriptor = ShaderDescriptor.from({
|
|
34
|
+
label: "Trail AVBOIT Splat",
|
|
35
|
+
body: CodeChunk.from("", [vertex_stage, chunk_avboit_unlit_splat_fragment]),
|
|
36
|
+
resources: splat_resources,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The trails' AVBOIT splat: the tube extruded in the vertex stage (`chunk_trail_vertex`), into the unlit
|
|
41
|
+
* splat's fragment stage, the one the dynamic meshes splat through.
|
|
42
|
+
*/
|
|
43
|
+
export const TRAIL_AVBOIT_SPLAT_PIPELINE = avboit_unlit_splat_pipeline({
|
|
44
|
+
label: "Trail AVBOIT Splat",
|
|
45
|
+
resources: splat_resources,
|
|
46
|
+
source: splat_descriptor.source,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export const TRAIL_AVBOIT_SPLAT_RESOURCES = splat_resources;
|
|
50
|
+
|
|
51
|
+
/** The assembled splat shader, for the validity tier. */
|
|
52
|
+
export const shader_trail_avboit_splat = splat_descriptor;
|
|
53
|
+
|
|
54
|
+
const draw_resources = new ShaderResourceSetDescriptor();
|
|
55
|
+
|
|
56
|
+
draw_resources.addGroup(TRAIL_VERTEX_GROUP);
|
|
57
|
+
draw_resources.addGroup(AVBOIT_UNLIT_DRAW_PASS_GROUP);
|
|
58
|
+
|
|
59
|
+
const draw_descriptor = ShaderDescriptor.from({
|
|
60
|
+
label: "Trail AVBOIT Draw",
|
|
61
|
+
body: CodeChunk.from("", [vertex_stage, chunk_avboit_unlit_draw_fragment]),
|
|
62
|
+
resources: draw_resources,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The trails' AVBOIT draw: the tube extruded in the vertex stage, into the unlit draw's fragment stage,
|
|
67
|
+
* the one the dynamic meshes draw through.
|
|
68
|
+
*/
|
|
69
|
+
export const TRAIL_AVBOIT_DRAW_PIPELINE = avboit_unlit_draw_pipeline({
|
|
70
|
+
label: "Trail AVBOIT Draw",
|
|
71
|
+
resources: draw_resources,
|
|
72
|
+
source: draw_descriptor.source,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
export const TRAIL_AVBOIT_DRAW_RESOURCES = draw_resources;
|
|
76
|
+
|
|
77
|
+
/** The assembled draw shader, for the validity tier. */
|
|
78
|
+
export const shader_trail_avboit_draw = draw_descriptor;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threads per workgroup: the group size `shader_prefix_sum_to_command` sizes the dispatch for.
|
|
3
|
+
* @type {number}
|
|
4
|
+
*/
|
|
5
|
+
export const TRAIL_SEGMENTS_WORKGROUP_SIZE: number;
|
|
6
|
+
export const TRAIL_SEGMENTS_SETTINGS: WebGPUStruct;
|
|
7
|
+
/**
|
|
8
|
+
* The trails' AVBOIT occupancy and their draw lists, per view: a thread per live segment of every
|
|
9
|
+
* trail, its trail found by lower bound over the frame's sums of live segments.
|
|
10
|
+
*
|
|
11
|
+
* A segment whose two knots have both faded, or whose capsule — the two centres, padded by the wider
|
|
12
|
+
* ring's radius — misses the view frustum, does nothing (`trail_segment_bounds`). A visible one marks the depth slices its box
|
|
13
|
+
* spans (`aabb3_view_depth_range`, `avboit_occupancy_mark`, the arithmetic the other channels' boxes
|
|
14
|
+
* go through), and appends its head-ward knot's address to its trail's draw class's list
|
|
15
|
+
* (`subgroup_keyed_append`, one atomic per class a subgroup holds). `class_counts` starts each class's
|
|
16
|
+
* counter at the class's region of `segment_list`, so the place handed back is where to write.
|
|
17
|
+
*
|
|
18
|
+
* @type {ComputeShader}
|
|
19
|
+
*/
|
|
20
|
+
export const shader_trail_avboit_segments: ComputeShader;
|
|
21
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
22
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
23
|
+
//# sourceMappingURL=shader_trail_avboit_segments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_trail_avboit_segments.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/trails/shaders/shader_trail_avboit_segments.js"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,4CAFU,MAAM,CAE+D;AAE/E,mDAK8B;AA6E9B;;;;;;;;;;;;GAYG;AACH,2CAFU,aAAa,CAMpB;6BA7G0B,mCAAmC;8BAJlC,+BAA+B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { ANIMATION_CURVE_KEYFRAME_STRUCT } from "../../animation/ANIMATION_CURVE_KEYFRAME_STRUCT.js";
|
|
2
|
+
import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
3
|
+
import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
|
|
4
|
+
import { AVBOIT_OCCUPANCY_WORDS } from "../../rasterize/native/avboit/AVBOIT_CONSTANTS.js";
|
|
5
|
+
import { chunk_avboit_occupancy_mark } from "../../rasterize/native/avboit/chunk_avboit_occupancy_mark.js";
|
|
6
|
+
import { AABB3_STRUCT } from "../../shader/chunk/geometry/aabb3/AABB3_STRUCT.js";
|
|
7
|
+
import { chunk_aabb3_intersects_frustum } from "../../shader/chunk/geometry/aabb3/chunk_aabb3_intersects_frustum.js";
|
|
8
|
+
import { chunk_aabb3_view_depth_range } from "../../shader/chunk/geometry/aabb3/chunk_aabb3_view_depth_range.js";
|
|
9
|
+
import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
|
|
10
|
+
import { chunk_lower_bound_branchless } from "../../shader/chunk/math/chunk_lower_bound_branchless.js";
|
|
11
|
+
import {
|
|
12
|
+
chunk_subgroup_keyed_append,
|
|
13
|
+
SUBGROUP_KEYED_APPEND_NONE
|
|
14
|
+
} from "../../shader/chunk/subgroup/chunk_subgroup_keyed_append.js";
|
|
15
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
16
|
+
import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
|
|
17
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
18
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
19
|
+
import { atomic_u32, u32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
20
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
21
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
22
|
+
import { TRAIL_DESCRIPTOR, TRAIL_STATE_DESCRIPTOR } from "../data/TRAIL_DATABASE_SPEC.js";
|
|
23
|
+
import { chunk_trail_segment } from "./chunk_trail_segment.js";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Threads per workgroup: the group size `shader_prefix_sum_to_command` sizes the dispatch for.
|
|
27
|
+
* @type {number}
|
|
28
|
+
*/
|
|
29
|
+
export const TRAIL_SEGMENTS_WORKGROUP_SIZE = COMPUTE_SHADER_DEFAULT_GROUP_SIZE;
|
|
30
|
+
|
|
31
|
+
export const TRAIL_SEGMENTS_SETTINGS = WebGPUStruct.from({
|
|
32
|
+
/** the frame's AVBOIT depth curve */
|
|
33
|
+
cluster_parameters: vec3f,
|
|
34
|
+
/** the clock, in ticks */
|
|
35
|
+
now: u32,
|
|
36
|
+
}, "Trail3DSegmentsSettings");
|
|
37
|
+
|
|
38
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
39
|
+
|
|
40
|
+
resources.setImmediate("settings", TRAIL_SEGMENTS_SETTINGS);
|
|
41
|
+
|
|
42
|
+
resources.createGroup()
|
|
43
|
+
.addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
44
|
+
.addStorageBuffer("trail_database", WebGPUArray.u32, false)
|
|
45
|
+
.addStorageBuffer("knots", WebGPUArray.u32, false)
|
|
46
|
+
.addStorageBuffer("fade_keys", WebGPUArray.from(ANIMATION_CURVE_KEYFRAME_STRUCT), false)
|
|
47
|
+
.addStorageBuffer("segment_sums", COLLECTION_U32_STRUCT_READ, false)
|
|
48
|
+
.addStorageBuffer("class_counts", WebGPUArray.from(atomic_u32), true)
|
|
49
|
+
.addStorageBuffer("segment_list", WebGPUArray.u32, true)
|
|
50
|
+
.addStorageBuffer("occupancy", WebGPUArray.from(atomic_u32, AVBOIT_OCCUPANCY_WORDS), true);
|
|
51
|
+
|
|
52
|
+
const body = CodeChunk.from(
|
|
53
|
+
//language=WGSL
|
|
54
|
+
`
|
|
55
|
+
@compute @workgroup_size(${TRAIL_SEGMENTS_WORKGROUP_SIZE}, 1, 1)
|
|
56
|
+
fn main(
|
|
57
|
+
@builtin(workgroup_id) wg_id : vec3<u32>,
|
|
58
|
+
@builtin(local_invocation_index) local_id : u32,
|
|
59
|
+
) {
|
|
60
|
+
let i = folded_workgroup_index(wg_id) * ${TRAIL_SEGMENTS_WORKGROUP_SIZE}u + local_id;
|
|
61
|
+
let rows = segment_sums.count;
|
|
62
|
+
|
|
63
|
+
// every lane reaches the append below; one with no visible segment appends nothing
|
|
64
|
+
var key = ${SUBGROUP_KEYED_APPEND_NONE}u;
|
|
65
|
+
var address = 0u;
|
|
66
|
+
|
|
67
|
+
if (rows > 0u && i < segment_sums.elements[rows - 1u]) {
|
|
68
|
+
let row = lower_bound_branchless(&segment_sums.elements, i + 1u, rows);
|
|
69
|
+
|
|
70
|
+
var first = 0u;
|
|
71
|
+
|
|
72
|
+
if (row > 0u) {
|
|
73
|
+
first = segment_sums.elements[row - 1u];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let segment = i - first;
|
|
77
|
+
|
|
78
|
+
let record = ${TRAIL_DESCRIPTOR.marshalling_method_read}(&trail_database, row);
|
|
79
|
+
let state = ${TRAIL_STATE_DESCRIPTOR.marshalling_method_read}(&trail_database, row);
|
|
80
|
+
|
|
81
|
+
var box : ${AABB3_STRUCT.wgsl_ref};
|
|
82
|
+
|
|
83
|
+
if (trail_segment_bounds(record, state.head, state.live, segment, settings.now, &box)
|
|
84
|
+
&& aabb3_intersects_frustum(box, camera.frustum)) {
|
|
85
|
+
let range = aabb3_view_depth_range(box, camera.view_matrix);
|
|
86
|
+
|
|
87
|
+
avboit_occupancy_mark(range.x, range.y, camera.clip_near_far.x, settings.cluster_parameters);
|
|
88
|
+
|
|
89
|
+
key = record.draw_class;
|
|
90
|
+
address = trail_knot_address(record, state.head, segment);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let place = subgroup_keyed_append(&class_counts, key);
|
|
95
|
+
|
|
96
|
+
if (key != ${SUBGROUP_KEYED_APPEND_NONE}u) {
|
|
97
|
+
segment_list[place] = address;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
`, [
|
|
101
|
+
TRAIL_DESCRIPTOR.chunk_read,
|
|
102
|
+
TRAIL_STATE_DESCRIPTOR.chunk_read,
|
|
103
|
+
AABB3_STRUCT.declaration_chunk,
|
|
104
|
+
chunk_aabb3_intersects_frustum,
|
|
105
|
+
chunk_aabb3_view_depth_range,
|
|
106
|
+
chunk_avboit_occupancy_mark,
|
|
107
|
+
chunk_folded_workgroup_index,
|
|
108
|
+
chunk_lower_bound_branchless,
|
|
109
|
+
chunk_subgroup_keyed_append,
|
|
110
|
+
chunk_trail_segment,
|
|
111
|
+
]);
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The trails' AVBOIT occupancy and their draw lists, per view: a thread per live segment of every
|
|
115
|
+
* trail, its trail found by lower bound over the frame's sums of live segments.
|
|
116
|
+
*
|
|
117
|
+
* A segment whose two knots have both faded, or whose capsule — the two centres, padded by the wider
|
|
118
|
+
* ring's radius — misses the view frustum, does nothing (`trail_segment_bounds`). A visible one marks the depth slices its box
|
|
119
|
+
* spans (`aabb3_view_depth_range`, `avboit_occupancy_mark`, the arithmetic the other channels' boxes
|
|
120
|
+
* go through), and appends its head-ward knot's address to its trail's draw class's list
|
|
121
|
+
* (`subgroup_keyed_append`, one atomic per class a subgroup holds). `class_counts` starts each class's
|
|
122
|
+
* counter at the class's region of `segment_list`, so the place handed back is where to write.
|
|
123
|
+
*
|
|
124
|
+
* @type {ComputeShader}
|
|
125
|
+
*/
|
|
126
|
+
export const shader_trail_avboit_segments = ComputeShader.from({
|
|
127
|
+
label: "Trail AVBOIT Segments",
|
|
128
|
+
resources,
|
|
129
|
+
body,
|
|
130
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Words of one indexed indirect draw: index count, instance count, first index, base vertex, first
|
|
3
|
+
* instance — `drawIndexedIndirect`'s layout.
|
|
4
|
+
* @type {number}
|
|
5
|
+
*/
|
|
6
|
+
export const TRAIL_DRAW_ARGS_WORDS: number;
|
|
7
|
+
/**
|
|
8
|
+
* Threads per workgroup; one draw class each.
|
|
9
|
+
* @type {number}
|
|
10
|
+
*/
|
|
11
|
+
export const TRAIL_DRAW_ARGS_WORKGROUP_SIZE: number;
|
|
12
|
+
/**
|
|
13
|
+
* One draw class as the args pass reads it: its radial count and where its region of the segment list
|
|
14
|
+
* starts.
|
|
15
|
+
*/
|
|
16
|
+
export const TRAIL_DRAW_CLASS_STRUCT: WebGPUStruct;
|
|
17
|
+
export const TRAIL_DRAW_ARGS_SETTINGS: WebGPUStruct;
|
|
18
|
+
/**
|
|
19
|
+
* The trails' indexed indirect draws, one per draw class: `6 × radial` indices from the class's static
|
|
20
|
+
* index buffer, an instance per segment the segments pass appended to the class's list, and the
|
|
21
|
+
* instances starting at the class's region of that list (`first_instance`). Written by a pass of its
|
|
22
|
+
* own, so the render passes that draw through it bind it read-only.
|
|
23
|
+
*
|
|
24
|
+
* @type {ComputeShader}
|
|
25
|
+
*/
|
|
26
|
+
export const shader_trail_draw_args: ComputeShader;
|
|
27
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
28
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
29
|
+
//# sourceMappingURL=shader_trail_draw_args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_trail_draw_args.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/trails/shaders/shader_trail_draw_args.js"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,oCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,6CAFU,MAAM,CAEiC;AAEjD;;;GAGG;AACH,mDAGuB;AAEvB,oDAE8B;AAkC9B;;;;;;;GAOG;AACH,qCAFU,aAAa,CAMpB;6BAxE0B,mCAAmC;8BAJlC,+BAA+B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
3
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
+
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
5
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
6
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Words of one indexed indirect draw: index count, instance count, first index, base vertex, first
|
|
10
|
+
* instance — `drawIndexedIndirect`'s layout.
|
|
11
|
+
* @type {number}
|
|
12
|
+
*/
|
|
13
|
+
export const TRAIL_DRAW_ARGS_WORDS = 5;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Threads per workgroup; one draw class each.
|
|
17
|
+
* @type {number}
|
|
18
|
+
*/
|
|
19
|
+
export const TRAIL_DRAW_ARGS_WORKGROUP_SIZE = 64;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* One draw class as the args pass reads it: its radial count and where its region of the segment list
|
|
23
|
+
* starts.
|
|
24
|
+
*/
|
|
25
|
+
export const TRAIL_DRAW_CLASS_STRUCT = WebGPUStruct.from({
|
|
26
|
+
radial: u32,
|
|
27
|
+
region: u32,
|
|
28
|
+
}, "Trail3DDrawClass");
|
|
29
|
+
|
|
30
|
+
export const TRAIL_DRAW_ARGS_SETTINGS = WebGPUStruct.from({
|
|
31
|
+
class_count: u32,
|
|
32
|
+
}, "Trail3DDrawArgsSettings");
|
|
33
|
+
|
|
34
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
35
|
+
|
|
36
|
+
resources.setImmediate("settings", TRAIL_DRAW_ARGS_SETTINGS);
|
|
37
|
+
|
|
38
|
+
resources.createGroup()
|
|
39
|
+
.addStorageBuffer("class_counts", WebGPUArray.u32, false)
|
|
40
|
+
.addStorageBuffer("classes", WebGPUArray.from(TRAIL_DRAW_CLASS_STRUCT), false)
|
|
41
|
+
.addStorageBuffer("args", WebGPUArray.u32, true);
|
|
42
|
+
|
|
43
|
+
const body = CodeChunk.from(
|
|
44
|
+
//language=WGSL
|
|
45
|
+
`
|
|
46
|
+
@compute @workgroup_size(${TRAIL_DRAW_ARGS_WORKGROUP_SIZE}, 1, 1)
|
|
47
|
+
fn main(@builtin(global_invocation_id) id : vec3<u32>) {
|
|
48
|
+
let c = id.x;
|
|
49
|
+
|
|
50
|
+
if (c >= settings.class_count) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let draw_class = classes[c];
|
|
55
|
+
let at = c * ${TRAIL_DRAW_ARGS_WORDS}u;
|
|
56
|
+
|
|
57
|
+
// a segment is an instance: the indices of two rings, the instances the segments pass appended
|
|
58
|
+
args[at] = 6u * draw_class.radial;
|
|
59
|
+
args[at + 1u] = class_counts[c] - draw_class.region;
|
|
60
|
+
args[at + 2u] = 0u;
|
|
61
|
+
args[at + 3u] = 0u;
|
|
62
|
+
args[at + 4u] = draw_class.region;
|
|
63
|
+
}
|
|
64
|
+
`);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The trails' indexed indirect draws, one per draw class: `6 × radial` indices from the class's static
|
|
68
|
+
* index buffer, an instance per segment the segments pass appended to the class's list, and the
|
|
69
|
+
* instances starting at the class's region of that list (`first_instance`). Written by a pass of its
|
|
70
|
+
* own, so the render passes that draw through it bind it read-only.
|
|
71
|
+
*
|
|
72
|
+
* @type {ComputeShader}
|
|
73
|
+
*/
|
|
74
|
+
export const shader_trail_draw_args = ComputeShader.from({
|
|
75
|
+
label: "Trail Draw Args",
|
|
76
|
+
resources,
|
|
77
|
+
body,
|
|
78
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threads per workgroup; a workgroup seeds one trail, each thread a stride of its knots. A ring of
|
|
3
|
+
* 1,024 knots is 16 a thread.
|
|
4
|
+
* @type {number}
|
|
5
|
+
*/
|
|
6
|
+
export const TRAIL_SEED_WORKGROUP_SIZE: number;
|
|
7
|
+
export const TRAIL_SEED_SETTINGS: WebGPUStruct;
|
|
8
|
+
/**
|
|
9
|
+
* Seed the trails asked for this frame: a workgroup per row of `seeds`, each thread a stride of the
|
|
10
|
+
* trail's knots (`trail_seed_knot`), then its state (`trail_seed_state`), every knot collapsed onto the
|
|
11
|
+
* head where the first update will put it (`trail_head_world`).
|
|
12
|
+
*
|
|
13
|
+
* @type {ComputeShader}
|
|
14
|
+
*/
|
|
15
|
+
export const shader_trail_seed: ComputeShader;
|
|
16
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
17
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
18
|
+
//# sourceMappingURL=shader_trail_seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_trail_seed.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/trails/shaders/shader_trail_seed.js"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wCAFU,MAAM,CAE4B;AAE5C,+CAG0B;AA+C1B;;;;;;GAMG;AACH,gCAFU,aAAa,CAMpB;6BAxE0B,mCAAmC;8BAJlC,+BAA+B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
|
|
2
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
3
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
4
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
5
|
+
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
6
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
7
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
8
|
+
import { TRAIL_DESCRIPTOR, TRAIL_STATE_DESCRIPTOR } from "../data/TRAIL_DATABASE_SPEC.js";
|
|
9
|
+
import { chunk_trail_seed } from "./chunk_trail_seed.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Threads per workgroup; a workgroup seeds one trail, each thread a stride of its knots. A ring of
|
|
13
|
+
* 1,024 knots is 16 a thread.
|
|
14
|
+
* @type {number}
|
|
15
|
+
*/
|
|
16
|
+
export const TRAIL_SEED_WORKGROUP_SIZE = 64;
|
|
17
|
+
|
|
18
|
+
export const TRAIL_SEED_SETTINGS = WebGPUStruct.from({
|
|
19
|
+
/** the clock, in ticks */
|
|
20
|
+
now: u32,
|
|
21
|
+
}, "Trail3DSeedSettings");
|
|
22
|
+
|
|
23
|
+
const STATE = TRAIL_STATE_DESCRIPTOR;
|
|
24
|
+
|
|
25
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
26
|
+
|
|
27
|
+
resources.setImmediate("settings", TRAIL_SEED_SETTINGS);
|
|
28
|
+
|
|
29
|
+
resources.createGroup()
|
|
30
|
+
.addStorageBuffer("trail_database", WebGPUArray.u32, true)
|
|
31
|
+
.addStorageBuffer("scene_database", WebGPUArray.u32, false)
|
|
32
|
+
.addStorageBuffer("knots", WebGPUArray.u32, true)
|
|
33
|
+
.addStorageBuffer("seeds", WebGPUArray.u32, false);
|
|
34
|
+
|
|
35
|
+
const body = CodeChunk.from(
|
|
36
|
+
//language=WGSL
|
|
37
|
+
`
|
|
38
|
+
@compute @workgroup_size(${TRAIL_SEED_WORKGROUP_SIZE}, 1, 1)
|
|
39
|
+
fn main(
|
|
40
|
+
@builtin(workgroup_id) wg_id : vec3<u32>,
|
|
41
|
+
@builtin(local_invocation_index) local_id : u32,
|
|
42
|
+
) {
|
|
43
|
+
let row = seeds[wg_id.x];
|
|
44
|
+
let record = ${TRAIL_DESCRIPTOR.marshalling_method_read_rw}(&trail_database, row);
|
|
45
|
+
|
|
46
|
+
let head = trail_head_world(scene_read_node(&scene_database, record.node).global, record.offset);
|
|
47
|
+
|
|
48
|
+
for (var i = local_id; i < record.knot_count; i = i + ${TRAIL_SEED_WORKGROUP_SIZE}u) {
|
|
49
|
+
trail_seed_knot(record, row, i, head, settings.now);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (local_id == 0u) {
|
|
53
|
+
var state = ${STATE.marshalling_method_read_rw}(&trail_database, row);
|
|
54
|
+
|
|
55
|
+
trail_seed_state(record, &state, settings.now);
|
|
56
|
+
|
|
57
|
+
${STATE.marshalling_method_write}(&trail_database, row, state);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
`, [
|
|
61
|
+
TRAIL_DESCRIPTOR.chunk_read_rw,
|
|
62
|
+
STATE.chunk_read_rw,
|
|
63
|
+
STATE.chunk_write,
|
|
64
|
+
chunk_scene_database_access,
|
|
65
|
+
chunk_trail_seed,
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Seed the trails asked for this frame: a workgroup per row of `seeds`, each thread a stride of the
|
|
70
|
+
* trail's knots (`trail_seed_knot`), then its state (`trail_seed_state`), every knot collapsed onto the
|
|
71
|
+
* head where the first update will put it (`trail_head_world`).
|
|
72
|
+
*
|
|
73
|
+
* @type {ComputeShader}
|
|
74
|
+
*/
|
|
75
|
+
export const shader_trail_seed = ComputeShader.from({
|
|
76
|
+
label: "Trail Seed",
|
|
77
|
+
resources,
|
|
78
|
+
body,
|
|
79
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threads per workgroup; one trail row each. The page iterator wants a multiple of 32.
|
|
3
|
+
* @type {number}
|
|
4
|
+
*/
|
|
5
|
+
export const TRAIL_UPDATE_WORKGROUP_SIZE: number;
|
|
6
|
+
export const TRAIL_UPDATE_SETTINGS: WebGPUStruct;
|
|
7
|
+
/**
|
|
8
|
+
* One frame of every trail: a thread per row of the trail table, through the table's page iterator.
|
|
9
|
+
* Each reads its entity's world matrix from the scene database — the hierarchy has composed this
|
|
10
|
+
* frame's — runs `trail_update`, writes its state back, and writes how many of its segments can be
|
|
11
|
+
* visible into `live_segments`, the list the scan sums.
|
|
12
|
+
*
|
|
13
|
+
* A row whose state has not been seeded for its record's epoch writes zero and waits for its seed.
|
|
14
|
+
*
|
|
15
|
+
* @type {ComputeShader}
|
|
16
|
+
*/
|
|
17
|
+
export const shader_trail_update: ComputeShader;
|
|
18
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
19
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
20
|
+
//# sourceMappingURL=shader_trail_update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_trail_update.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/trails/shaders/shader_trail_update.js"],"names":[],"mappings":"AAWA;;;GAGG;AACH,0CAFU,MAAM,CAE8B;AAK9C,iDAK4B;AA6D5B;;;;;;;;;GASG;AACH,kCAFU,aAAa,CAMpB;6BA7F0B,mCAAmC;8BAJlC,+BAA+B"}
|