@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.
Files changed (190) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +2 -17
  3. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
  4. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +3 -18
  5. package/package.json +1 -1
  6. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +33 -65
  7. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  8. package/src/engine/graphics/ecs/trail3d/Trail3D.js +37 -245
  9. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.d.ts +0 -4
  10. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +4 -10
  11. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts +13 -10
  12. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts.map +1 -1
  13. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +28 -37
  14. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts +10 -0
  15. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts.map +1 -0
  16. package/src/engine/graphics/ecs/trail3d/trail_knot_count.js +27 -0
  17. package/src/engine/graphics/trail/TrailKnots.d.ts +62 -0
  18. package/src/engine/graphics/trail/TrailKnots.d.ts.map +1 -0
  19. package/src/engine/graphics/trail/TrailKnots.js +137 -0
  20. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.d.ts +1 -1
  21. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +1 -1
  22. package/src/engine/graphics3/EntityRowHold.d.ts +48 -0
  23. package/src/engine/graphics3/EntityRowHold.d.ts.map +1 -0
  24. package/src/engine/graphics3/EntityRowHold.js +128 -0
  25. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -2
  26. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  27. package/src/engine/graphics3/GPUParticleEmitterSystem.js +11 -44
  28. package/src/engine/graphics3/Trail3DSystem.d.ts +69 -35
  29. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  30. package/src/engine/graphics3/Trail3DSystem.js +380 -81
  31. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts +17 -0
  32. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts.map +1 -1
  33. package/src/engine/physics/fluid/ecs/FluidObstacle.js +22 -2
  34. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +6 -5
  35. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  36. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +14 -3
  37. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts +9 -1
  38. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts.map +1 -1
  39. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js +11 -1
  40. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts +5 -0
  41. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts.map +1 -1
  42. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js +2 -0
  43. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts +4 -3
  44. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts.map +1 -1
  45. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js +11 -3
  46. package/src/shade/playground/trails/index.html +50 -0
  47. package/src/shade/playground/trails/main.d.ts +2 -0
  48. package/src/shade/playground/trails/main.d.ts.map +1 -0
  49. package/src/shade/playground/trails/main.js +258 -0
  50. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts +18 -0
  51. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts.map +1 -0
  52. package/src/shade/renderer/animation/animation_curve_write_keys.js +34 -0
  53. package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts.map +1 -1
  54. package/src/shade/renderer/deferred/tonemap/ColorGrade.js +13 -36
  55. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +2 -2
  56. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -13
  57. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
  58. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +6 -21
  59. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +17 -6
  60. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
  61. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +38 -178
  62. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +7 -9
  63. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
  64. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +17 -106
  65. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +7 -17
  66. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
  67. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +18 -118
  68. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts +14 -0
  69. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts.map +1 -1
  70. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.js +18 -0
  71. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts +3 -1
  72. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts.map +1 -1
  73. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.js +4 -1
  74. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +9 -0
  75. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
  76. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +20 -4
  77. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts +11 -2
  78. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts.map +1 -1
  79. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.js +59 -2
  80. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +4 -1
  81. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  82. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +367 -341
  83. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +6 -2
  84. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  85. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +339 -282
  86. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +3 -2
  87. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -1
  88. package/src/shade/renderer/grass/press/shader_grass_press_mark.js +5 -3
  89. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts +49 -0
  90. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts.map +1 -0
  91. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.js +144 -0
  92. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts +71 -0
  93. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts.map +1 -0
  94. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.js +152 -0
  95. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts +21 -0
  96. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts.map +1 -0
  97. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.js +30 -0
  98. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts +101 -0
  99. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts.map +1 -0
  100. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.js +306 -0
  101. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +9 -0
  102. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
  103. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +11 -4
  104. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts +69 -0
  105. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts.map +1 -0
  106. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.js +129 -0
  107. package/src/shade/renderer/trails/GPUTrailSystem.d.ts +164 -0
  108. package/src/shade/renderer/trails/GPUTrailSystem.d.ts.map +1 -0
  109. package/src/shade/renderer/trails/GPUTrailSystem.js +725 -0
  110. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts +14 -0
  111. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts.map +1 -0
  112. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.js +38 -0
  113. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts +66 -0
  114. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts.map +1 -0
  115. package/src/shade/renderer/trails/data/TRAIL_KNOT.js +154 -0
  116. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts +19 -0
  117. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts.map +1 -0
  118. package/src/shade/renderer/trails/data/TRAIL_RECORD.js +68 -0
  119. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts +18 -0
  120. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts.map +1 -0
  121. package/src/shade/renderer/trails/data/TRAIL_STATE.js +43 -0
  122. package/src/shade/renderer/trails/graph_trails.d.ts +58 -0
  123. package/src/shade/renderer/trails/graph_trails.d.ts.map +1 -0
  124. package/src/shade/renderer/trails/graph_trails.js +155 -0
  125. package/src/shade/renderer/trails/graph_trails_avboit.d.ts +126 -0
  126. package/src/shade/renderer/trails/graph_trails_avboit.d.ts.map +1 -0
  127. package/src/shade/renderer/trails/graph_trails_avboit.js +300 -0
  128. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts +56 -0
  129. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts.map +1 -0
  130. package/src/shade/renderer/trails/runtime/TrailFadeCurves.js +220 -0
  131. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts +49 -0
  132. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts.map +1 -0
  133. package/src/shade/renderer/trails/runtime/TrailKnotPool.js +162 -0
  134. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts +52 -0
  135. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts.map +1 -0
  136. package/src/shade/renderer/trails/runtime/TrailParameters.js +126 -0
  137. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts +23 -0
  138. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts.map +1 -0
  139. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.js +57 -0
  140. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts +14 -0
  141. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts.map +1 -0
  142. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.js +40 -0
  143. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts +18 -0
  144. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts.map +1 -0
  145. package/src/shade/renderer/trails/shaders/chunk_trail_seed.js +64 -0
  146. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts +14 -0
  147. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts.map +1 -0
  148. package/src/shade/renderer/trails/shaders/chunk_trail_segment.js +51 -0
  149. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts +48 -0
  150. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts.map +1 -0
  151. package/src/shade/renderer/trails/shaders/chunk_trail_update.js +197 -0
  152. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts +34 -0
  153. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts.map +1 -0
  154. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.js +111 -0
  155. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts +24 -0
  156. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts.map +1 -0
  157. package/src/shade/renderer/trails/shaders/shader_trail_avboit.js +78 -0
  158. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts +23 -0
  159. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts.map +1 -0
  160. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.js +130 -0
  161. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts +29 -0
  162. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts.map +1 -0
  163. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.js +78 -0
  164. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts +18 -0
  165. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts.map +1 -0
  166. package/src/shade/renderer/trails/shaders/shader_trail_seed.js +79 -0
  167. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts +20 -0
  168. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts.map +1 -0
  169. package/src/shade/renderer/trails/shaders/shader_trail_update.js +101 -0
  170. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts +0 -18
  171. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts.map +0 -1
  172. package/src/engine/graphics/ecs/trail3d/advance_trail.js +0 -42
  173. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts +0 -14
  174. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts.map +0 -1
  175. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +0 -75
  176. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts +0 -17
  177. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts.map +0 -1
  178. package/src/engine/graphics/ecs/trail3d/trail_head_position.js +0 -19
  179. package/src/engine/graphics/trail/tube/TubeX.d.ts +0 -186
  180. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +0 -1
  181. package/src/engine/graphics/trail/tube/TubeX.js +0 -575
  182. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +0 -16
  183. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +0 -1
  184. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +0 -34
  185. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +0 -27
  186. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +0 -1
  187. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +0 -70
  188. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +0 -38
  189. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +0 -1
  190. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +0 -119
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @typedef {Object} TrailSegmentsHandles
3
+ * @property {number} occupancy graph handle of the occupancy bits, after the trails marked theirs
4
+ * @property {number} segment_list graph handle of the visible segments, a region per draw class
5
+ * @property {number} args graph handle of the indexed indirect draws, one per draw class
6
+ * @property {(number|undefined)[]} radials the radial count of each draw class, a hole where none is used
7
+ */
8
+ /**
9
+ * The trails' AVBOIT occupancy and this view's draw lists: the segments pass, a thread per live segment
10
+ * dispatched from the frame's scan, then a pass that turns each draw class's count into its indexed
11
+ * indirect draw.
12
+ *
13
+ * Each draw class has a region of the segment list as long as the most segments its trails can show,
14
+ * the counters start at those regions, and the list is sized in powers of two so a count that climbs a
15
+ * little each frame does not make a new buffer each frame.
16
+ *
17
+ * @param {object} params
18
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
19
+ * @param {number} params.camera graph handle of the camera uniform
20
+ * @param {ArrayLike<number>} params.cluster_parameters the frame's depth curve
21
+ * @param {number} params.occupancy graph handle of the occupancy bits, to add to
22
+ * @param {import("./graph_trails.js").TrailSimulationHandles} params.simulation this frame's simulation
23
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} params.runtime
24
+ * @returns {TrailSegmentsHandles}
25
+ */
26
+ export function graph_trails_avboit_segments({ graph, camera, cluster_parameters, occupancy, simulation, runtime }: {
27
+ graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
28
+ camera: number;
29
+ cluster_parameters: ArrayLike<number>;
30
+ occupancy: number;
31
+ simulation: import("./graph_trails.js").TrailSimulationHandles;
32
+ runtime: import("./GPUTrailSystem.js").GPUTrailSystem;
33
+ }): TrailSegmentsHandles;
34
+ /**
35
+ * The trails' extinction into the AVBOIT volume, through the unlit splat.
36
+ *
37
+ * @param {object} params
38
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
39
+ * @param {number} params.camera
40
+ * @param {number} params.warp
41
+ * @param {number[]} params.voxel_resolution
42
+ * @param {{extinction: number, overflow: number, dummy: number}} params.volume
43
+ * @param {import("./graph_trails.js").TrailSimulationHandles} params.simulation
44
+ * @param {TrailSegmentsHandles} params.segments
45
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} params.runtime
46
+ * @returns {{extinction: number, overflow: number, dummy: number}}
47
+ */
48
+ export function graph_trails_avboit_splat({ graph, camera, warp, voxel_resolution, volume, simulation, segments, runtime }: {
49
+ graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
50
+ camera: number;
51
+ warp: number;
52
+ voxel_resolution: number[];
53
+ volume: {
54
+ extinction: number;
55
+ overflow: number;
56
+ dummy: number;
57
+ };
58
+ simulation: import("./graph_trails.js").TrailSimulationHandles;
59
+ segments: TrailSegmentsHandles;
60
+ runtime: import("./GPUTrailSystem.js").GPUTrailSystem;
61
+ }): {
62
+ extinction: number;
63
+ overflow: number;
64
+ dummy: number;
65
+ };
66
+ /**
67
+ * The trails into the AVBOIT accumulators, through the unlit draw.
68
+ *
69
+ * @param {object} params
70
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
71
+ * @param {import("../view/GPUViewContext.js").GPUViewContext} params.view_ctx
72
+ * @param {number} params.camera
73
+ * @param {number} params.depth_texture
74
+ * @param {number} params.warp
75
+ * @param {number} params.integral
76
+ * @param {number} params.volumetrics_lut
77
+ * @param {number} params.volumetrics_metadata
78
+ * @param {{color: number, norm: number, extinction: number, emission: number}} params.accumulators
79
+ * @param {import("./graph_trails.js").TrailSimulationHandles} params.simulation
80
+ * @param {TrailSegmentsHandles} params.segments
81
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} params.runtime
82
+ * @returns {{color: number, norm: number, extinction: number, emission: number}}
83
+ */
84
+ export function graph_trails_avboit_draw({ graph, view_ctx, camera, depth_texture, warp, integral, volumetrics_lut, volumetrics_metadata, accumulators, simulation, segments, runtime, }: {
85
+ graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
86
+ view_ctx: import("../view/GPUViewContext.js").GPUViewContext;
87
+ camera: number;
88
+ depth_texture: number;
89
+ warp: number;
90
+ integral: number;
91
+ volumetrics_lut: number;
92
+ volumetrics_metadata: number;
93
+ accumulators: {
94
+ color: number;
95
+ norm: number;
96
+ extinction: number;
97
+ emission: number;
98
+ };
99
+ simulation: import("./graph_trails.js").TrailSimulationHandles;
100
+ segments: TrailSegmentsHandles;
101
+ runtime: import("./GPUTrailSystem.js").GPUTrailSystem;
102
+ }): {
103
+ color: number;
104
+ norm: number;
105
+ extinction: number;
106
+ emission: number;
107
+ };
108
+ export type TrailSegmentsHandles = {
109
+ /**
110
+ * graph handle of the occupancy bits, after the trails marked theirs
111
+ */
112
+ occupancy: number;
113
+ /**
114
+ * graph handle of the visible segments, a region per draw class
115
+ */
116
+ segment_list: number;
117
+ /**
118
+ * graph handle of the indexed indirect draws, one per draw class
119
+ */
120
+ args: number;
121
+ /**
122
+ * the radial count of each draw class, a hole where none is used
123
+ */
124
+ radials: (number | undefined)[];
125
+ };
126
+ //# sourceMappingURL=graph_trails_avboit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph_trails_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/trails/graph_trails_avboit.js"],"names":[],"mappings":"AA6BA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH;IARkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACoB,kBAAkB,EAA5C,UAAU,MAAM,CAAC;IACF,SAAS,EAAxB,MAAM;IACqD,UAAU,EAArE,OAAO,mBAAmB,EAAE,sBAAsB;IACG,OAAO,EAA5D,OAAO,qBAAqB,EAAE,cAAc;IAC1C,oBAAoB,CA8GhC;AA2DD;;;;;;;;;;;;;GAaG;AACH;IAVkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACS,IAAI,EAAnB,MAAM;IACW,gBAAgB,EAAjC,MAAM,EAAE;IACsD,MAAM,EAApE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;IACM,UAAU,EAArE,OAAO,mBAAmB,EAAE,sBAAsB;IACrB,QAAQ,EAArC,oBAAoB;IACiC,OAAO,EAA5D,OAAO,qBAAqB,EAAE,cAAc;IAC1C;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAejE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH;IAdkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IACnB,QAAQ,EAAnE,OAAO,2BAA2B,EAAE,cAAc;IACnC,MAAM,EAArB,MAAM;IACS,aAAa,EAA5B,MAAM;IACS,IAAI,EAAnB,MAAM;IACS,QAAQ,EAAvB,MAAM;IACS,eAAe,EAA9B,MAAM;IACS,oBAAoB,EAAnC,MAAM;IACsE,YAAY,EAAxF;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;IACR,UAAU,EAArE,OAAO,mBAAmB,EAAE,sBAAsB;IACrB,QAAQ,EAArC,oBAAoB;IACiC,OAAO,EAA5D,OAAO,qBAAqB,EAAE,cAAc;IAC1C;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAgC/E;;;;;eA5Qa,MAAM;;;;kBACN,MAAM;;;;UACN,MAAM;;;;aACN,CAAC,MAAM,GAAC,SAAS,CAAC,EAAE"}
@@ -0,0 +1,300 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { BufferResourceDescriptor } from "../../device/graph/BufferResourceDescriptor.js";
3
+ import { graph_avboit_unlit_draw, graph_avboit_unlit_splat } from "../rasterize/native/avboit/graph_avboit_unlit.js";
4
+ import { graph_import_buffer } from "../shader/graph/graph_import_buffer.js";
5
+ import { TRAIL_AVBOIT_BIND_GROUP_VERTEX, TRAIL_AVBOIT_DRAW_PIPELINE, TRAIL_AVBOIT_DRAW_RESOURCES, TRAIL_AVBOIT_SPLAT_PIPELINE, TRAIL_AVBOIT_SPLAT_RESOURCES } from "./shaders/shader_trail_avboit.js";
6
+ import { shader_trail_avboit_segments } from "./shaders/shader_trail_avboit_segments.js";
7
+ import { shader_trail_draw_args, TRAIL_DRAW_ARGS_WORDS, TRAIL_DRAW_ARGS_WORKGROUP_SIZE } from "./shaders/shader_trail_draw_args.js";
8
+ import { TRAIL_VERTEX_GROUP } from "./shaders/chunk_trail_vertex.js";
9
+
10
+ /**
11
+ * The fewest segment-list entries a frame's list is sized for.
12
+ * @type {number}
13
+ */
14
+ const SEGMENT_LIST_MIN_ENTRIES = 64;
15
+
16
+ /**
17
+ * @param {number} x
18
+ * @returns {number} the smallest power of two at or above `x`
19
+ */
20
+ function power_of_two_at_least(x) {
21
+ let p = 1;
22
+
23
+ while (p < x) {
24
+ p *= 2;
25
+ }
26
+
27
+ return p;
28
+ }
29
+
30
+ /**
31
+ * @typedef {Object} TrailSegmentsHandles
32
+ * @property {number} occupancy graph handle of the occupancy bits, after the trails marked theirs
33
+ * @property {number} segment_list graph handle of the visible segments, a region per draw class
34
+ * @property {number} args graph handle of the indexed indirect draws, one per draw class
35
+ * @property {(number|undefined)[]} radials the radial count of each draw class, a hole where none is used
36
+ */
37
+
38
+ /**
39
+ * The trails' AVBOIT occupancy and this view's draw lists: the segments pass, a thread per live segment
40
+ * dispatched from the frame's scan, then a pass that turns each draw class's count into its indexed
41
+ * indirect draw.
42
+ *
43
+ * Each draw class has a region of the segment list as long as the most segments its trails can show,
44
+ * the counters start at those regions, and the list is sized in powers of two so a count that climbs a
45
+ * little each frame does not make a new buffer each frame.
46
+ *
47
+ * @param {object} params
48
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
49
+ * @param {number} params.camera graph handle of the camera uniform
50
+ * @param {ArrayLike<number>} params.cluster_parameters the frame's depth curve
51
+ * @param {number} params.occupancy graph handle of the occupancy bits, to add to
52
+ * @param {import("./graph_trails.js").TrailSimulationHandles} params.simulation this frame's simulation
53
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} params.runtime
54
+ * @returns {TrailSegmentsHandles}
55
+ */
56
+ export function graph_trails_avboit_segments({ graph, camera, cluster_parameters, occupancy, simulation, runtime }) {
57
+ assert.isNonNegativeInteger(camera, "camera");
58
+ assert.isNonNegativeInteger(occupancy, "occupancy");
59
+
60
+ const classes = runtime.draw_classes;
61
+ const class_count = classes.length;
62
+
63
+ assert.greaterThan(class_count, 0, "a frame with no draw class has no trails to draw");
64
+
65
+ const regions = new Uint32Array(class_count);
66
+ const info = new Uint32Array(class_count * 2);
67
+ const radials = new Array(class_count);
68
+
69
+ let total = 0;
70
+
71
+ for (let c = 0; c < class_count; c++) {
72
+ const draw_class = classes[c];
73
+
74
+ regions[c] = total;
75
+
76
+ info[c * 2] = draw_class === undefined ? 0 : draw_class.radial;
77
+ info[c * 2 + 1] = total;
78
+
79
+ radials[c] = draw_class === undefined ? undefined : draw_class.radial;
80
+
81
+ if (draw_class !== undefined) {
82
+ total += draw_class.segments;
83
+ }
84
+ }
85
+
86
+ const list_bytes = power_of_two_at_least(Math.max(SEGMENT_LIST_MIN_ENTRIES, total)) * 4;
87
+ const counts_bytes = power_of_two_at_least(Math.max(4, class_count)) * 4;
88
+ const args_bytes = power_of_two_at_least(Math.max(4, class_count)) * TRAIL_DRAW_ARGS_WORDS * 4;
89
+
90
+ const now = runtime.now;
91
+
92
+ function execute_segments(data, resources, context) {
93
+ const encoder = context.encoder;
94
+
95
+ // each class's counter starts at its region, so a place the append hands back is where to write
96
+ encoder.writeBuffer(resources.get(data.class_counts), 0, regions.buffer, 0, regions.byteLength);
97
+
98
+ shader_trail_avboit_segments.dispatchIndirect({
99
+ encoder,
100
+ bindings: {
101
+ camera: resources.get(data.camera),
102
+ trail_database: resources.get(data.trail_database),
103
+ knots: resources.get(data.knots),
104
+ fade_keys: resources.get(data.fade_keys),
105
+ segment_sums: resources.get(data.segment_sums),
106
+ class_counts: resources.get(data.class_counts),
107
+ segment_list: resources.get(data.segment_list),
108
+ occupancy: resources.get(data.occupancy),
109
+ settings: { cluster_parameters, now },
110
+ },
111
+ command: resources.get(data.command),
112
+ });
113
+ }
114
+
115
+ const segments_data = {};
116
+ const segments = graph.add("Trail AVBOIT Segments", segments_data, execute_segments);
117
+
118
+ segments_data.camera = segments.read(camera);
119
+ segments_data.trail_database = segments.read(simulation.trail_database);
120
+ segments_data.knots = segments.read(simulation.knots);
121
+ segments_data.fade_keys = segments.read(simulation.fade_keys);
122
+ segments_data.segment_sums = segments.read(simulation.segment_sums);
123
+ segments_data.command = segments.read(simulation.segments_command);
124
+ segments_data.class_counts = segments.create("trails/class_counts", BufferResourceDescriptor.from(
125
+ counts_bytes, GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
126
+ ));
127
+ segments_data.segment_list = segments.create("trails/segment_list", BufferResourceDescriptor.from(
128
+ list_bytes, GPUBufferUsage.STORAGE,
129
+ ));
130
+ segments.read(occupancy);
131
+ segments_data.occupancy = segments.write(occupancy);
132
+
133
+ function execute_args(data, resources, context) {
134
+ const encoder = context.encoder;
135
+
136
+ shader_trail_draw_args.dispatch({
137
+ encoder,
138
+ bindings: {
139
+ class_counts: resources.get(data.class_counts),
140
+ classes: encoder.allocateTransientBufferAndLoad(info.buffer, GPUBufferUsage.STORAGE, 0, info.byteLength),
141
+ args: resources.get(data.args),
142
+ settings: { class_count },
143
+ },
144
+ group_count_x: Math.ceil(class_count / TRAIL_DRAW_ARGS_WORKGROUP_SIZE),
145
+ group_count_y: 1,
146
+ group_count_z: 1,
147
+ });
148
+ }
149
+
150
+ const args_data = {};
151
+ const args = graph.add("Trail Draw Args", args_data, execute_args);
152
+
153
+ args_data.class_counts = args.read(segments_data.class_counts);
154
+ args_data.args = args.create("trails/draw_args", BufferResourceDescriptor.from(
155
+ args_bytes, GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT,
156
+ ));
157
+
158
+ return {
159
+ occupancy: segments_data.occupancy,
160
+ segment_list: segments_data.segment_list,
161
+ args: args_data.args,
162
+ radials,
163
+ };
164
+ }
165
+
166
+ /**
167
+ * The draws of one trail pass: the vertex group, then an indexed indirect draw per draw class, from the
168
+ * class's static index buffer.
169
+ *
170
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} runtime
171
+ * @param {(number|undefined)[]} radials
172
+ * @param {import("../../descriptor/pipeline/render/RenderPipelineDescriptor.js").RenderPipelineDescriptor} pipeline
173
+ * @returns {function(GPURenderPassEncoder, Object, Object<string, *>): void}
174
+ */
175
+ function trail_draws(runtime, radials, pipeline) {
176
+ return (pass_encoder, graphics, inputs) => {
177
+ const vertex_group = TRAIL_VERTEX_GROUP.generateBindings({
178
+ camera: inputs.camera,
179
+ trail_frame: inputs.trail_frame,
180
+ segment_list: inputs.segment_list,
181
+ knots: inputs.knots,
182
+ trail_database: inputs.trail_database,
183
+ fade_keys: inputs.fade_keys,
184
+ });
185
+
186
+ graphics.setPipelineBindGroup(pass_encoder, pipeline, TRAIL_AVBOIT_BIND_GROUP_VERTEX, vertex_group);
187
+
188
+ for (let c = 0; c < radials.length; c++) {
189
+ const radial = radials[c];
190
+
191
+ if (radial === undefined) {
192
+ continue;
193
+ }
194
+
195
+ pass_encoder.setIndexBuffer(runtime.index_buffer(radial), "uint32");
196
+ pass_encoder.drawIndexedIndirect(inputs.args, c * TRAIL_DRAW_ARGS_WORDS * 4);
197
+ }
198
+ };
199
+ }
200
+
201
+ /**
202
+ * The graph handles the trails' vertex stage reads.
203
+ *
204
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} graph
205
+ * @param {number} camera
206
+ * @param {import("./graph_trails.js").TrailSimulationHandles} simulation
207
+ * @param {TrailSegmentsHandles} segments
208
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} runtime
209
+ * @returns {Object<string, number>}
210
+ */
211
+ function vertex_inputs(graph, camera, simulation, segments, runtime) {
212
+ return {
213
+ camera,
214
+ trail_frame: graph_import_buffer(graph, runtime.frame_uniform, "trails/frame"),
215
+ segment_list: segments.segment_list,
216
+ knots: simulation.knots,
217
+ trail_database: simulation.trail_database,
218
+ fade_keys: simulation.fade_keys,
219
+ args: segments.args,
220
+ };
221
+ }
222
+
223
+ /**
224
+ * The trails' extinction into the AVBOIT volume, through the unlit splat.
225
+ *
226
+ * @param {object} params
227
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
228
+ * @param {number} params.camera
229
+ * @param {number} params.warp
230
+ * @param {number[]} params.voxel_resolution
231
+ * @param {{extinction: number, overflow: number, dummy: number}} params.volume
232
+ * @param {import("./graph_trails.js").TrailSimulationHandles} params.simulation
233
+ * @param {TrailSegmentsHandles} params.segments
234
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} params.runtime
235
+ * @returns {{extinction: number, overflow: number, dummy: number}}
236
+ */
237
+ export function graph_trails_avboit_splat({ graph, camera, warp, voxel_resolution, volume, simulation, segments, runtime }) {
238
+ return graph_avboit_unlit_splat({
239
+ graph,
240
+ label: "Trail AVBOIT Splat",
241
+ pipeline: TRAIL_AVBOIT_SPLAT_PIPELINE,
242
+ resources: TRAIL_AVBOIT_SPLAT_RESOURCES,
243
+ inputs: vertex_inputs(graph, camera, simulation, segments, runtime),
244
+ warp,
245
+ voxel_resolution,
246
+ volume,
247
+ is_empty: () => false,
248
+ record: trail_draws(runtime, segments.radials, TRAIL_AVBOIT_SPLAT_PIPELINE),
249
+ });
250
+ }
251
+
252
+ /**
253
+ * The trails into the AVBOIT accumulators, through the unlit draw.
254
+ *
255
+ * @param {object} params
256
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
257
+ * @param {import("../view/GPUViewContext.js").GPUViewContext} params.view_ctx
258
+ * @param {number} params.camera
259
+ * @param {number} params.depth_texture
260
+ * @param {number} params.warp
261
+ * @param {number} params.integral
262
+ * @param {number} params.volumetrics_lut
263
+ * @param {number} params.volumetrics_metadata
264
+ * @param {{color: number, norm: number, extinction: number, emission: number}} params.accumulators
265
+ * @param {import("./graph_trails.js").TrailSimulationHandles} params.simulation
266
+ * @param {TrailSegmentsHandles} params.segments
267
+ * @param {import("./GPUTrailSystem.js").GPUTrailSystem} params.runtime
268
+ * @returns {{color: number, norm: number, extinction: number, emission: number}}
269
+ */
270
+ export function graph_trails_avboit_draw({
271
+ graph,
272
+ view_ctx,
273
+ camera,
274
+ depth_texture,
275
+ warp,
276
+ integral,
277
+ volumetrics_lut,
278
+ volumetrics_metadata,
279
+ accumulators,
280
+ simulation,
281
+ segments,
282
+ runtime,
283
+ }) {
284
+ return graph_avboit_unlit_draw({
285
+ graph,
286
+ label: "Trail AVBOIT Draw",
287
+ pipeline: TRAIL_AVBOIT_DRAW_PIPELINE,
288
+ resources: TRAIL_AVBOIT_DRAW_RESOURCES,
289
+ inputs: vertex_inputs(graph, camera, simulation, segments, runtime),
290
+ view_ctx,
291
+ depth_texture,
292
+ warp,
293
+ integral,
294
+ volumetrics_lut,
295
+ volumetrics_metadata,
296
+ accumulators,
297
+ is_empty: () => false,
298
+ record: trail_draws(runtime, segments.radials, TRAIL_AVBOIT_DRAW_PIPELINE),
299
+ });
300
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * A curve's place in the key buffer, shared by every trail that fades by an equal curve.
3
+ */
4
+ export class TrailFadeCurve {
5
+ /** @type {number} first key in the buffer */
6
+ first: number;
7
+ /** @type {number} keys */
8
+ count: number;
9
+ /** @type {number} trails holding it */
10
+ references: number;
11
+ /** @type {import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation|null} */
12
+ allocation: import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation | null;
13
+ /** @type {import("../../../../engine/animation/curve/AnimationCurve.js").AnimationCurve|null} the store's own copy */
14
+ curve: import("../../../../engine/animation/curve/AnimationCurve.js").AnimationCurve | null;
15
+ }
16
+ /**
17
+ * The trails' fade curves on the GPU, one run of keys per distinct curve, in the layout
18
+ * `chunk_animation_curve_evaluate_keys` reads (`ANIMATION_CURVE_KEYFRAME_STRUCT`).
19
+ *
20
+ * A curve is the trails' class data, not theirs alone: every trail on the shared default fade, or on one
21
+ * curve a game hands out, reads one run. Curves are found by content — a curve that equals one held is
22
+ * that one — and kept by reference count, so the last trail to let go frees the run. The key is a copy,
23
+ * because a curve the caller holds can be edited in place.
24
+ *
25
+ * Nothing on the GPU writes the buffer, so it grows by replacement and the whole of it goes up again.
26
+ */
27
+ export class TrailFadeCurves {
28
+ /**
29
+ * @param {GPUDevice} device
30
+ */
31
+ constructor(device: GPUDevice);
32
+ /**
33
+ * @returns {number} distinct curves held
34
+ */
35
+ get count(): number;
36
+ /**
37
+ * The key buffer as the GPU should see it, uploaded first if anything changed.
38
+ *
39
+ * @returns {GPUBuffer}
40
+ */
41
+ flush(): GPUBuffer;
42
+ /**
43
+ * Hold a curve equal to `curve`, placing its keys if none is held.
44
+ *
45
+ * @param {import("../../../../engine/animation/curve/AnimationCurve.js").AnimationCurve} curve at least one key
46
+ * @returns {TrailFadeCurve}
47
+ */
48
+ acquire(curve: import("../../../../engine/animation/curve/AnimationCurve.js").AnimationCurve): TrailFadeCurve;
49
+ /**
50
+ * @param {TrailFadeCurve} held from {@link acquire}
51
+ */
52
+ release(held: TrailFadeCurve): void;
53
+ destroy(): void;
54
+ #private;
55
+ }
56
+ //# sourceMappingURL=TrailFadeCurves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrailFadeCurves.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/trails/runtime/TrailFadeCurves.js"],"names":[],"mappings":"AAcA;;GAEG;AACH;IACI,6CAA6C;IAC7C,OADW,MAAM,CACP;IAEV,0BAA0B;IAC1B,OADW,MAAM,CACP;IAEV,uCAAuC;IACvC,YADW,MAAM,CACF;IAEf,6FAA6F;IAC7F,YADW,OAAO,sDAAsD,EAAE,UAAU,GAAC,IAAI,CACvE;IAElB,sHAAsH;IACtH,OADW,OAAO,sDAAsD,EAAE,cAAc,GAAC,IAAI,CAChF;CAChB;AAED;;;;;;;;;;GAUG;AACH;IAgCI;;OAEG;IACH,+BAIC;IAED;;OAEG;IACH,oBAEC;IAED;;;;OAIG;IACH,mBAwBC;IAED;;;;;OAKG;IACH,eAHW,OAAO,sDAAsD,EAAE,cAAc,GAC3E,cAAc,CAc1B;IAED;;OAEG;IACH,cAFW,cAAc,QAgBxB;IAED,gBAIC;;CAoDJ"}