@woosh/meep-engine 3.68.0 → 3.70.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 (584) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +2 -17
  4. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
  5. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +3 -18
  6. package/package.json +1 -1
  7. package/src/core/bvh8/build/BVH8Converter.d.ts +16 -0
  8. package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -1
  9. package/src/core/bvh8/build/BVH8Converter.js +64 -37
  10. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts +25 -0
  11. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts.map +1 -0
  12. package/src/core/bvh8/build/bvh8_assign_slots_greedy.js +68 -0
  13. package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -1
  14. package/src/core/bvh8/build/bvh8_from_proxy.js +2 -33
  15. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts +22 -0
  16. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts.map +1 -0
  17. package/src/core/bvh8/build/bvh8_node_fit_slots.js +115 -0
  18. package/src/core/bvh8/bvh8_depth.d.ts +8 -0
  19. package/src/core/bvh8/bvh8_depth.d.ts.map +1 -0
  20. package/src/core/bvh8/bvh8_depth.js +39 -0
  21. package/src/core/math/complex/complex_fft_radix2.d.ts +19 -0
  22. package/src/core/math/complex/complex_fft_radix2.d.ts.map +1 -0
  23. package/src/core/math/complex/complex_fft_radix2.js +71 -0
  24. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +33 -65
  25. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  26. package/src/engine/graphics/ecs/trail3d/Trail3D.js +37 -245
  27. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.d.ts +0 -4
  28. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +4 -10
  29. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts +13 -10
  30. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts.map +1 -1
  31. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +28 -37
  32. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts +10 -0
  33. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts.map +1 -0
  34. package/src/engine/graphics/ecs/trail3d/trail_knot_count.js +27 -0
  35. package/src/engine/graphics/trail/TrailKnots.d.ts +62 -0
  36. package/src/engine/graphics/trail/TrailKnots.d.ts.map +1 -0
  37. package/src/engine/graphics/trail/TrailKnots.js +137 -0
  38. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.d.ts +1 -1
  39. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +1 -1
  40. package/src/engine/graphics3/EntityRowHold.d.ts +48 -0
  41. package/src/engine/graphics3/EntityRowHold.d.ts.map +1 -0
  42. package/src/engine/graphics3/EntityRowHold.js +128 -0
  43. package/src/engine/graphics3/GPUFluidSystem.d.ts +17 -4
  44. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  45. package/src/engine/graphics3/GPUFluidSystem.js +113 -16
  46. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -2
  47. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  48. package/src/engine/graphics3/GPUParticleEmitterSystem.js +11 -44
  49. package/src/engine/graphics3/Trail3DSystem.d.ts +69 -35
  50. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  51. package/src/engine/graphics3/Trail3DSystem.js +380 -81
  52. package/src/engine/physics/cloth/playground/wind_main.js +7 -6
  53. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +2 -2
  54. package/src/engine/physics/cloth/wind/AbstractClothWind.js +2 -2
  55. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +3 -3
  56. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  57. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -9
  58. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts +10 -10
  59. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts.map +1 -1
  60. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.js +14 -22
  61. package/src/engine/physics/fluid/FluidAtmosphere.d.ts +16 -2
  62. package/src/engine/physics/fluid/FluidAtmosphere.d.ts.map +1 -1
  63. package/src/engine/physics/fluid/FluidAtmosphere.js +17 -3
  64. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts +1 -2
  65. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts.map +1 -1
  66. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.js +1 -2
  67. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts +8 -5
  68. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts.map +1 -1
  69. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.js +60 -17
  70. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts +17 -0
  71. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts.map +1 -1
  72. package/src/engine/physics/fluid/ecs/FluidObstacle.js +22 -2
  73. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +6 -5
  74. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  75. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +14 -3
  76. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +1 -1
  77. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +1 -1
  78. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +33 -47
  79. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  80. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +38 -176
  81. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts +8 -11
  82. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts.map +1 -1
  83. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.js +13 -24
  84. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts +16 -0
  85. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts.map +1 -0
  86. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.js +35 -0
  87. package/src/engine/physics/fluid/fluid_apply_atmosphere.d.ts +1 -1
  88. package/src/engine/physics/fluid/fluid_apply_atmosphere.js +1 -1
  89. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts +9 -1
  90. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts.map +1 -1
  91. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js +11 -1
  92. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts +5 -0
  93. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts.map +1 -1
  94. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js +2 -0
  95. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts +4 -3
  96. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts.map +1 -1
  97. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js +11 -3
  98. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts +28 -0
  99. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts.map +1 -0
  100. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.js +29 -0
  101. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts +16 -0
  102. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts.map +1 -0
  103. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.js +49 -0
  104. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts +11 -0
  105. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts.map +1 -0
  106. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.js +18 -0
  107. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts +25 -0
  108. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts.map +1 -0
  109. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.js +65 -0
  110. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts +56 -0
  111. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts.map +1 -0
  112. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.js +313 -0
  113. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts +16 -0
  114. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts.map +1 -0
  115. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.js +69 -0
  116. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +1 -1
  117. package/src/generation/foliage/mesh/branch_ring_triangulate.js +1 -1
  118. package/src/shade/playground/bvh_repro/README.md +8 -6
  119. package/src/shade/playground/bvh_repro/index.html +125 -124
  120. package/src/shade/playground/bvh_repro/main.js +259 -254
  121. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  122. package/src/shade/playground/foliage_wind/foliage_world.js +7 -4
  123. package/src/shade/playground/grass_surfaces/main.js +3 -2
  124. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts +23 -13
  125. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts.map +1 -1
  126. package/src/shade/playground/particle_ecs/bonfire_wind.js +30 -33
  127. package/src/shade/playground/skinned_blas_refit/README.md +26 -14
  128. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts +14 -9
  129. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  130. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +126 -127
  131. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +95 -95
  132. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts +9 -1
  133. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  134. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +146 -135
  135. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +6 -6
  136. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  137. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +148 -134
  138. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts +11 -8
  139. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts.map +1 -1
  140. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +342 -202
  141. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +12 -13
  142. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  143. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +136 -116
  144. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +4 -4
  145. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  146. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +255 -249
  147. package/src/shade/playground/trails/index.html +50 -0
  148. package/src/shade/playground/trails/main.d.ts +2 -0
  149. package/src/shade/playground/trails/main.d.ts.map +1 -0
  150. package/src/shade/playground/trails/main.js +258 -0
  151. package/src/shade/playground/water_surface/main.js +6 -3
  152. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -2
  153. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts +18 -0
  154. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts.map +1 -0
  155. package/src/shade/renderer/animation/animation_curve_write_keys.js +34 -0
  156. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  157. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +7 -8
  158. package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts.map +1 -1
  159. package/src/shade/renderer/deferred/tonemap/ColorGrade.js +13 -36
  160. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +2 -2
  161. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -13
  162. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
  163. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +6 -21
  164. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +17 -6
  165. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
  166. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +38 -178
  167. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +7 -9
  168. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
  169. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +17 -106
  170. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +7 -17
  171. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
  172. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +18 -118
  173. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts +111 -0
  174. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts.map +1 -0
  175. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.js +162 -0
  176. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +37 -8
  177. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  178. package/src/shade/renderer/fluid/GPUFluidCascade.js +149 -47
  179. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +10 -3
  180. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  181. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +69 -10
  182. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts +19 -0
  183. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts.map +1 -0
  184. package/src/shade/renderer/fluid/chunk_fluid_far_field.js +43 -0
  185. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts +10 -9
  186. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts.map +1 -1
  187. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.js +14 -12
  188. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts +3 -2
  189. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts.map +1 -1
  190. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.js +7 -5
  191. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts +17 -9
  192. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts.map +1 -1
  193. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.js +58 -18
  194. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts +23 -11
  195. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  196. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +371 -335
  197. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.d.ts.map +1 -1
  198. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.js +2 -1
  199. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  200. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +109 -108
  201. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts +5 -3
  202. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts.map +1 -1
  203. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.js +24 -12
  204. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts +14 -0
  205. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts.map +1 -1
  206. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.js +18 -0
  207. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts +3 -1
  208. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts.map +1 -1
  209. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.js +4 -1
  210. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +9 -0
  211. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
  212. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +20 -4
  213. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts +11 -2
  214. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts.map +1 -1
  215. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.js +59 -2
  216. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +4 -1
  217. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  218. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +367 -341
  219. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts +6 -2
  220. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts.map +1 -1
  221. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.js +10 -5
  222. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +20 -21
  223. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  224. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +453 -427
  225. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +6 -2
  226. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  227. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +340 -282
  228. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +13 -5
  229. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  230. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +20 -10
  231. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.d.ts +2 -2
  232. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.js +2 -2
  233. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts +5 -3
  234. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  235. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +147 -142
  236. package/src/shade/renderer/fluid/query/GPUFluidQueries.js +2 -2
  237. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  238. package/src/shade/renderer/geometry/GPUGeometryManager.js +5 -7
  239. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +4 -1
  240. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  241. package/src/shade/renderer/geometry/MeshletGeometry.js +4 -1
  242. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +20 -0
  243. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  244. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +35 -3
  245. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts +9 -3
  246. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
  247. package/src/shade/renderer/geometry/blas_from_meshlets.js +16 -30
  248. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts +14 -0
  249. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts.map +1 -0
  250. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.js +33 -0
  251. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts +18 -21
  252. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts.map +1 -1
  253. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +78 -158
  254. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +18 -39
  255. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  256. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +39 -398
  257. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +6 -7
  258. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  259. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +5 -7
  260. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts +36 -0
  261. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts.map +1 -0
  262. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.js +179 -0
  263. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts +30 -0
  264. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts.map +1 -0
  265. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.js +207 -0
  266. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts +52 -0
  267. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts.map +1 -0
  268. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.js +464 -0
  269. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +12 -0
  270. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  271. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +37 -0
  272. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -1
  273. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +4 -4
  274. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -1
  275. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +2 -2
  276. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
  277. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +2 -2
  278. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  279. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +4 -4
  280. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.d.ts.map +1 -1
  281. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.js +2 -2
  282. package/src/shade/renderer/geometry/sr_create_group_RTX.d.ts.map +1 -1
  283. package/src/shade/renderer/geometry/sr_create_group_RTX.js +4 -4
  284. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
  285. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -0
  286. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  287. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -0
  288. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  289. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +372 -376
  290. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +9 -10
  291. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -1
  292. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +10 -11
  293. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +2 -2
  294. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +2 -2
  295. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +12 -8
  296. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -1
  297. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +109 -60
  298. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +2 -2
  299. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_surfaces.js +2 -2
  300. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.d.ts +2 -2
  301. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.js +70 -70
  302. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts +6 -7
  303. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts.map +1 -1
  304. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js +6 -7
  305. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +3 -3
  306. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +3 -3
  307. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +1 -1
  308. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
  309. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +3 -3
  310. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts +69 -0
  311. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts.map +1 -0
  312. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.js +89 -0
  313. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts +41 -0
  314. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts.map +1 -0
  315. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.js +348 -0
  316. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts +34 -0
  317. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts.map +1 -0
  318. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.js +291 -0
  319. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts +31 -0
  320. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts.map +1 -0
  321. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.js +175 -0
  322. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts +27 -0
  323. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts.map +1 -0
  324. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.js +48 -0
  325. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts +26 -0
  326. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts.map +1 -0
  327. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.js +118 -0
  328. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts +22 -0
  329. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts.map +1 -0
  330. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.js +143 -0
  331. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts +36 -0
  332. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts.map +1 -0
  333. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.js +97 -0
  334. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts +49 -0
  335. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts.map +1 -0
  336. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.js +265 -0
  337. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts +37 -0
  338. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts.map +1 -0
  339. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.js +109 -0
  340. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts +15 -0
  341. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts.map +1 -0
  342. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.js +85 -0
  343. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts +26 -0
  344. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts.map +1 -0
  345. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.js +200 -0
  346. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts +19 -0
  347. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts.map +1 -0
  348. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.js +81 -0
  349. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts +14 -0
  350. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts.map +1 -0
  351. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.js +101 -0
  352. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts +19 -0
  353. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts.map +1 -0
  354. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.js +361 -0
  355. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +3 -2
  356. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -1
  357. package/src/shade/renderer/grass/press/shader_grass_press_mark.js +5 -3
  358. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -1
  359. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +5 -6
  360. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  361. package/src/shade/renderer/lightmap/GPULightMap.js +1 -0
  362. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  363. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -0
  364. package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
  365. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -0
  366. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts +49 -0
  367. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts.map +1 -0
  368. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.js +144 -0
  369. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts +71 -0
  370. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts.map +1 -0
  371. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.js +152 -0
  372. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts +21 -0
  373. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts.map +1 -0
  374. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.js +30 -0
  375. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts +101 -0
  376. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts.map +1 -0
  377. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.js +306 -0
  378. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +9 -0
  379. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
  380. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +11 -4
  381. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +8 -4
  382. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  383. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +60 -33
  384. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts +6 -6
  385. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts.map +1 -1
  386. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +23 -53
  387. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts +3 -1
  388. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts.map +1 -1
  389. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js +5 -3
  390. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts +28 -0
  391. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts.map +1 -0
  392. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js +29 -0
  393. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts +25 -0
  394. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts.map +1 -0
  395. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.js +97 -0
  396. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts +8 -0
  397. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts.map +1 -1
  398. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js +23 -14
  399. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts +36 -0
  400. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts.map +1 -0
  401. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.js +222 -0
  402. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts +20 -0
  403. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts.map +1 -0
  404. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js +30 -0
  405. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts +30 -0
  406. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts.map +1 -0
  407. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js +91 -0
  408. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts +23 -0
  409. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts.map +1 -0
  410. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.js +40 -0
  411. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts +22 -0
  412. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts.map +1 -1
  413. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js +121 -70
  414. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts +13 -1
  415. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts.map +1 -1
  416. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.js +117 -61
  417. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts +21 -0
  418. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts.map +1 -1
  419. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.js +111 -72
  420. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +1 -2
  421. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -1
  422. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +83 -54
  423. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts +14 -0
  424. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts.map +1 -1
  425. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.js +92 -60
  426. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts +22 -0
  427. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts.map +1 -1
  428. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.js +153 -106
  429. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts +21 -0
  430. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts.map +1 -1
  431. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.js +115 -74
  432. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +5 -2
  433. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
  434. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +89 -63
  435. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts +15 -0
  436. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts.map +1 -1
  437. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.js +108 -63
  438. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts +14 -0
  439. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts.map +1 -1
  440. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.js +94 -60
  441. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  442. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +4 -4
  443. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts +69 -0
  444. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts.map +1 -0
  445. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.js +129 -0
  446. package/src/shade/renderer/trails/GPUTrailSystem.d.ts +164 -0
  447. package/src/shade/renderer/trails/GPUTrailSystem.d.ts.map +1 -0
  448. package/src/shade/renderer/trails/GPUTrailSystem.js +725 -0
  449. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts +14 -0
  450. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts.map +1 -0
  451. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.js +38 -0
  452. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts +66 -0
  453. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts.map +1 -0
  454. package/src/shade/renderer/trails/data/TRAIL_KNOT.js +154 -0
  455. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts +19 -0
  456. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts.map +1 -0
  457. package/src/shade/renderer/trails/data/TRAIL_RECORD.js +68 -0
  458. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts +18 -0
  459. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts.map +1 -0
  460. package/src/shade/renderer/trails/data/TRAIL_STATE.js +43 -0
  461. package/src/shade/renderer/trails/graph_trails.d.ts +58 -0
  462. package/src/shade/renderer/trails/graph_trails.d.ts.map +1 -0
  463. package/src/shade/renderer/trails/graph_trails.js +155 -0
  464. package/src/shade/renderer/trails/graph_trails_avboit.d.ts +126 -0
  465. package/src/shade/renderer/trails/graph_trails_avboit.d.ts.map +1 -0
  466. package/src/shade/renderer/trails/graph_trails_avboit.js +300 -0
  467. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts +56 -0
  468. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts.map +1 -0
  469. package/src/shade/renderer/trails/runtime/TrailFadeCurves.js +220 -0
  470. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts +49 -0
  471. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts.map +1 -0
  472. package/src/shade/renderer/trails/runtime/TrailKnotPool.js +162 -0
  473. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts +52 -0
  474. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts.map +1 -0
  475. package/src/shade/renderer/trails/runtime/TrailParameters.js +126 -0
  476. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts +23 -0
  477. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts.map +1 -0
  478. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.js +57 -0
  479. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts +14 -0
  480. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts.map +1 -0
  481. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.js +40 -0
  482. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts +18 -0
  483. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts.map +1 -0
  484. package/src/shade/renderer/trails/shaders/chunk_trail_seed.js +64 -0
  485. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts +14 -0
  486. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts.map +1 -0
  487. package/src/shade/renderer/trails/shaders/chunk_trail_segment.js +51 -0
  488. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts +48 -0
  489. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts.map +1 -0
  490. package/src/shade/renderer/trails/shaders/chunk_trail_update.js +197 -0
  491. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts +34 -0
  492. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts.map +1 -0
  493. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.js +111 -0
  494. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts +24 -0
  495. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts.map +1 -0
  496. package/src/shade/renderer/trails/shaders/shader_trail_avboit.js +78 -0
  497. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts +23 -0
  498. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts.map +1 -0
  499. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.js +130 -0
  500. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts +29 -0
  501. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts.map +1 -0
  502. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.js +78 -0
  503. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts +18 -0
  504. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts.map +1 -0
  505. package/src/shade/renderer/trails/shaders/shader_trail_seed.js +79 -0
  506. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts +20 -0
  507. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts.map +1 -0
  508. package/src/shade/renderer/trails/shaders/shader_trail_update.js +101 -0
  509. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -2
  510. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -1
  511. package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -227
  512. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  513. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +7 -4
  514. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +2 -2
  515. package/src/shade/renderer/wind/GPUSceneWind.d.ts +36 -4
  516. package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
  517. package/src/shade/renderer/wind/GPUSceneWind.js +150 -4
  518. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts +9 -3
  519. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts.map +1 -1
  520. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.js +13 -3
  521. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +6 -6
  522. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +6 -6
  523. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts +39 -0
  524. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts.map +1 -0
  525. package/src/shade/renderer/wind/chunk_fluid_turbulence.js +63 -0
  526. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +10 -7
  527. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
  528. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +34 -11
  529. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +2 -2
  530. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +2 -2
  531. package/src/shade/renderer/wind/wind_field_add_resources.d.ts +6 -4
  532. package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
  533. package/src/shade/renderer/wind/wind_field_add_resources.js +9 -6
  534. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts +0 -18
  535. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts.map +0 -1
  536. package/src/engine/graphics/ecs/trail3d/advance_trail.js +0 -42
  537. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts +0 -14
  538. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts.map +0 -1
  539. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +0 -75
  540. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts +0 -17
  541. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts.map +0 -1
  542. package/src/engine/graphics/ecs/trail3d/trail_head_position.js +0 -19
  543. package/src/engine/graphics/trail/tube/TubeX.d.ts +0 -186
  544. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +0 -1
  545. package/src/engine/graphics/trail/tube/TubeX.js +0 -575
  546. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +0 -16
  547. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +0 -1
  548. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +0 -34
  549. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +0 -27
  550. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +0 -1
  551. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +0 -70
  552. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +0 -38
  553. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +0 -1
  554. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +0 -119
  555. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts +0 -18
  556. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts.map +0 -1
  557. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.js +0 -50
  558. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts +0 -23
  559. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +0 -1
  560. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +0 -87
  561. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts +0 -42
  562. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts.map +0 -1
  563. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.js +0 -141
  564. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts +0 -21
  565. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts.map +0 -1
  566. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.js +0 -75
  567. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts +0 -17
  568. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +0 -1
  569. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +0 -247
  570. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts +0 -7
  571. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts.map +0 -1
  572. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.js +0 -226
  573. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts +0 -8
  574. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts.map +0 -1
  575. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.js +0 -45
  576. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts +0 -3
  577. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts.map +0 -1
  578. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.js +0 -105
  579. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts +0 -6
  580. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts.map +0 -1
  581. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.js +0 -86
  582. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts +0 -2
  583. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts.map +0 -1
  584. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +0 -136
@@ -1,118 +1,250 @@
1
1
  import { assert } from "../../core/assert.js";
2
- import { DynamicMeshAVBOITChannel } from "../../shade/renderer/dynamic/DynamicMeshAVBOITChannel.js";
3
2
  import { FramePhase } from "../../shade/renderer/extension/FramePhase.js";
4
3
  import { RenderExtension } from "../../shade/renderer/extension/RenderExtension.js";
5
- import { Geometry } from "../../shade/renderer/geometry/Geometry.js";
6
- import { DynamicMesh } from "../../shade/renderer/scene/DynamicMesh.js";
7
- import { DynamicMeshBatch } from "../../shade/renderer/scene/DynamicMeshBatch.js";
4
+ import { row_of_entity } from "../../shade/renderer/scene/rows/GPUSceneRows.js";
5
+ import { graph_import_buffer } from "../../shade/renderer/shader/graph/graph_import_buffer.js";
6
+ import { GPUTrailAVBOITChannel } from "../../shade/renderer/trails/GPUTrailAVBOITChannel.js";
7
+ import { GPUTrailSystem } from "../../shade/renderer/trails/GPUTrailSystem.js";
8
+ import { TrailParameters } from "../../shade/renderer/trails/runtime/TrailParameters.js";
8
9
  import { System } from "../ecs/System.js";
9
10
  import { Transform64 } from "../ecs/transform/Transform64.js";
10
- import { advance_trail } from "../graphics/ecs/trail3d/advance_trail.js";
11
- import { seed_trail_tube } from "../graphics/ecs/trail3d/seed_trail_tube.js";
11
+ import { trail_knot_count } from "../graphics/ecs/trail3d/trail_knot_count.js";
12
12
  import Trail3D from "../graphics/ecs/trail3d/Trail3D.js";
13
13
  import { Trail3DFlags } from "../graphics/ecs/trail3d/Trail3DFlags.js";
14
- import {
15
- TubeXFixedPhysicsSimulator
16
- } from "../graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js";
17
- import { trail_tube_write_geometry } from "./trail/trail_tube_write_geometry.js";
14
+ import { TrailSpawnMode } from "../graphics/trail/TrailSpawnMode.js";
15
+ import { EntityRowHold } from "./EntityRowHold.js";
18
16
 
19
17
  /**
20
- * Draws {@link Trail3D}'s tubes under Shade, as dynamic geometry inside the transparency pipeline.
18
+ * @typedef {Object} Trail3DEntry
19
+ * @property {number} entity
20
+ * @property {Trail3D} trail
21
+ * @property {EntityRowHold} hold the entity's row, kept current as it moves
22
+ * @property {import("../../shade/renderer/trails/GPUTrailSystem.js").GPUTrailContext|null} context the
23
+ * trail in the runtime, or null while it is not registered
24
+ * @property {number} knot_count knots of the trail's ring, fixed when it is built
25
+ * @property {number} radial radial segments, fixed when it is built
26
+ * @property {number} clears the component's `clearCount` as last seen
27
+ */
28
+
29
+ /**
30
+ * Knots a trail is built with: its authored layout's, or as many as its maxAge lays down.
21
31
  *
22
- * **A trail is dynamic content by definition** — every knot of it is rewritten as the entity moves
23
- * and every knot's opacity as it ages — so its geometry is a {@link DynamicMesh} (D5/I-10), not a
24
- * meshlet build, the same as paths and debug shapes.
32
+ * @param {Trail3D} trail
33
+ * @returns {number}
34
+ */
35
+ function knot_count_of(trail) {
36
+ return trail.knots !== null ? trail.knots.count : trail_knot_count(trail.maxAge);
37
+ }
38
+
39
+ /**
40
+ * Copy a component onto runtime parameters.
25
41
  *
26
- * **It is drawn through AVBOIT, not over it.** The batch is a transparency channel
27
- * ({@link DynamicMeshAVBOITChannel}, registered with the facade): its fragments go into the same
28
- * extinction volume and accumulators as the transparent meshes and the GPU particles, so a trail
29
- * behind glass is seen through the glass, a trail inside smoke is hidden by the smoke in front of it
30
- * and hides the smoke behind it, and two trails crossing composite by depth, not by the order they
31
- * were linked in. Everything drawn at `AfterTransparency` runs after the transparency resolve they
32
- * are part of, so path display and the selection highlight land over a trail rather than under it.
33
- * Under MBOIT, the legacy transparency mode, trails are not drawn — as the particles are not.
42
+ * @param {TrailParameters} parameters
43
+ * @param {Trail3D} trail
44
+ * @param {Trail3DEntry} entry
45
+ */
46
+ export function apply_trail3d(parameters, trail, entry) {
47
+ const knots = trail.knots;
48
+
49
+ parameters.knot_count = entry.knot_count;
50
+ parameters.radial = entry.radial;
51
+ parameters.max_age = trail.maxAge;
52
+ parameters.width = trail.width;
53
+ parameters.distance_mode = trail.spawnMode === TrailSpawnMode.Distance;
54
+ parameters.spawn_distance = trail.spawnDistance;
55
+ parameters.spawning = trail.getFlag(Trail3DFlags.Spawning);
56
+ parameters.warmup = trail.warmup;
57
+
58
+ const color = trail.color;
59
+
60
+ parameters.color[0] = color.x;
61
+ parameters.color[1] = color.y;
62
+ parameters.color[2] = color.z;
63
+ parameters.color[3] = color.w;
64
+
65
+ const offset = trail.offset;
66
+
67
+ parameters.offset[0] = offset.x;
68
+ parameters.offset[1] = offset.y;
69
+ parameters.offset[2] = offset.z;
70
+
71
+ parameters.fade = trail.fade;
72
+ parameters.authored = knots;
73
+ parameters.authored_version = knots === null ? -1 : knots.version;
74
+ }
75
+
76
+ /**
77
+ * Records the trails' simulation into the frame, once the hierarchy has composed this frame's matrices
78
+ * and before the transparency pipeline draws.
79
+ */
80
+ class Trail3DFrameExtension extends RenderExtension {
81
+ name = "trails";
82
+
83
+ phase = FramePhase.AfterLighting;
84
+
85
+ /**
86
+ * @type {Trail3DSystem}
87
+ */
88
+ #system;
89
+
90
+ /**
91
+ * @param {Trail3DSystem} system
92
+ */
93
+ constructor(system) {
94
+ super();
95
+
96
+ this.#system = system;
97
+ }
98
+
99
+ record(frame) {
100
+ this.#system.record(frame);
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Draws every {@link Trail3D}: simulated on the GPU, its head following the entity's `transforms` row,
106
+ * its knots seeded and committed in compute and its tube extruded in the vertex stage, drawn inside the
107
+ * transparency pipeline (AVBOIT), so a trail behind glass or smoke composites with them by depth.
108
+ * Nothing per knot happens on the CPU.
34
109
  *
35
- * **The simulation is not this system's, and that is deliberate.** {@link seed_trail_tube} and
36
- * {@link advance_trail} are what the legacy `Trail3DSystem` runs too: the knots a trail lays down
37
- * are a property of the trail, not of the renderer drawing it, and two implementations of them
38
- * would be two trails that age differently. What is this system's is turning those knots into
39
- * vertices, once a frame, per trail.
110
+ * **What is the CPU's:** registering a trail with the scene context's {@link GPUTrailSystem} — a row, a
111
+ * knot run, the entity's transform row held through {@link EntityRowHold} — comparing each component's
112
+ * fields once a tick with what was staged and restaging what differs, and moving the clock by the
113
+ * simulation time it is given. A game writes `trail.color` or `trail.maxAge` from code that never heard
114
+ * of this system; there is no change signal to send.
40
115
  *
41
- * **Every trail is rewritten every frame it exists**, moving or not, because the simulator ages
42
- * every knot on every tick and the age is what the vertex opacity carries. There is no quiet trail
43
- * — a trail that has stopped is a trail fading out.
116
+ * **The head follows announced transforms.** A trail reads where its entity is from the GPU row, which a
117
+ * transform write reaches when it is announced (`TRANSFORM64_EVENT_CHANGE`), as meshes and particle
118
+ * emitters do.
44
119
  *
45
- * **What the tube material had and this does not**: a texture, lighting, and per-trail depth
46
- * writing. The dynamic path has one vertex layout — position and colour — and a trail is drawn as
47
- * unlit straight alpha, depth tested against the opaque scene and never written, which is what a
48
- * trail wants and what the game's trails are authored as. `Trail3D.textureURL` therefore draws
49
- * untinted here; nothing in the game's own effects sets it to anything a flat colour does not
50
- * carry.
120
+ * A trail's knot count (from its `maxAge`, or its authored layout's) and its `radialSegments` are fixed
121
+ * when it registers; a replaced authored layout brings its own count.
51
122
  */
52
123
  export class Trail3DSystem extends System {
53
124
  dependencies = [Trail3D, Transform64];
54
125
 
55
126
  /**
56
- * @type {GraphicsEngine}
127
+ * @type {import("./GraphicsEngine.js").GraphicsEngine}
57
128
  */
58
129
  #graphics;
59
130
 
60
131
  /**
61
- * @type {DynamicMeshBatch}
132
+ * @type {import("../../shade/renderer/scene/Scene.js").Scene}
62
133
  */
63
- #batch = new DynamicMeshBatch();
134
+ #scene;
64
135
 
65
136
  /**
66
- * The batch as the transparency pipeline sees it, and the owner of its GPU buffers.
67
- *
68
- * @type {DynamicMeshAVBOITChannel}
137
+ * @type {import("../ecs/EntityComponentDataset.js").EntityComponentDataset|null}
69
138
  */
70
- #channel = new DynamicMeshAVBOITChannel(this.#batch);
139
+ #dataset = null;
71
140
 
72
141
  /**
73
- * @type {Map<number, {trail: Trail3D, transform: Transform, mesh: DynamicMesh}>}
142
+ * @type {Map<number, Trail3DEntry>}
74
143
  */
75
144
  #entries = new Map();
76
145
 
77
146
  /**
78
- * @type {TubeXFixedPhysicsSimulator}
147
+ * @type {GPUTrailSystem|null}
79
148
  */
80
- #simulator = new TubeXFixedPhysicsSimulator();
149
+ #runtime = null;
81
150
 
82
151
  /**
83
- * What the transparency channel draws. Read-only — the meshes follow the entities.
84
- *
85
- * @returns {DynamicMeshBatch}
152
+ * The scene context {@link #runtime} was made for.
153
+ * @type {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext|null}
86
154
  */
87
- get batch() {
88
- return this.#batch;
89
- }
155
+ #runtime_context = null;
156
+
157
+ /**
158
+ * @type {Trail3DFrameExtension|null}
159
+ */
160
+ #extension = null;
161
+
162
+ /**
163
+ * @type {TrailParameters}
164
+ */
165
+ #scratch = new TrailParameters();
90
166
 
91
167
  /**
92
- * @param {GraphicsEngine} graphics
168
+ * What draws the trails, inside the transparency pipeline.
169
+ * @type {GPUTrailAVBOITChannel}
93
170
  */
94
- constructor(graphics) {
171
+ #channel = new GPUTrailAVBOITChannel();
172
+
173
+ /**
174
+ * @type {function(): (import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext|null)}
175
+ */
176
+ #current_context = () => this.#graphics.scene_context(this.#scene);
177
+
178
+ /**
179
+ * @param {import("./GraphicsEngine.js").GraphicsEngine} graphics
180
+ * @param {import("../../shade/renderer/scene/Scene.js").Scene} scene the scene the trails' entities are in
181
+ */
182
+ constructor(graphics, scene) {
95
183
  super();
96
184
 
97
185
  assert.defined(graphics, 'graphics');
186
+ assert.defined(scene, 'scene');
187
+ assert.equal(scene.isScene, true, 'scene.isScene !== true');
98
188
 
99
189
  this.#graphics = graphics;
190
+ this.#scene = scene;
191
+ }
192
+
193
+ /**
194
+ * The runtime the scene's trails are registered with, or null while there is no scene context.
195
+ *
196
+ * @returns {GPUTrailSystem|null}
197
+ */
198
+ get runtime() {
199
+ return this.#runtime;
100
200
  }
101
201
 
102
202
  async startup(entityManager) {
103
203
  this.entityManager = entityManager;
104
204
 
205
+ this.#extension = new Trail3DFrameExtension(this);
206
+
207
+ this.#graphics.add_extension(this.#extension);
105
208
  this.#graphics.add_transparency_channel(this.#channel);
106
209
  }
107
210
 
108
211
  async shutdown(entityManager) {
109
- // says whether it was there, so a shutdown after a startup that never ran is harmless
212
+ if (this.#extension !== null) {
213
+ this.#graphics.remove_extension(this.#extension);
214
+ this.#extension = null;
215
+ }
216
+
110
217
  this.#graphics.remove_transparency_channel(this.#channel);
218
+ this.#channel.end_frame();
219
+
220
+ this.#detach_dataset();
221
+ this.#destroy_runtime();
222
+ }
223
+
224
+ /**
225
+ * @param {import("../ecs/EntityComponentDataset.js").EntityComponentDataset} dataset
226
+ */
227
+ handleDatasetAttached(dataset) {
228
+ this.#detach_dataset();
111
229
 
112
- this.#channel.destroy();
230
+ // the scene's rows are this dataset's entities; the first system to place one says so
231
+ const scene = this.#scene;
113
232
 
114
- this.#batch.clear();
115
- this.#entries.clear();
233
+ assert.ok(
234
+ scene.dataset === null || scene.dataset === undefined || scene.dataset === dataset,
235
+ 'the scene is bound to another dataset'
236
+ );
237
+
238
+ scene.dataset = dataset;
239
+
240
+ this.#dataset = dataset;
241
+ }
242
+
243
+ /**
244
+ * @param {import("../ecs/EntityComponentDataset.js").EntityComponentDataset} dataset
245
+ */
246
+ handleDatasetDetached(dataset) {
247
+ this.#detach_dataset();
116
248
  }
117
249
 
118
250
  /**
@@ -121,56 +253,223 @@ export class Trail3DSystem extends System {
121
253
  * @param {number} entity
122
254
  */
123
255
  link(trail, transform, entity) {
124
- if (!trail.getFlag(Trail3DFlags.Built)) {
125
- seed_trail_tube(trail, transform);
256
+ /** @type {Trail3DEntry} */
257
+ const entry = {
258
+ entity,
259
+ trail,
260
+ hold: new EntityRowHold(this.#dataset, entity, this.#current_context),
261
+ context: null,
262
+ knot_count: 0,
263
+ radial: 0,
264
+ clears: trail.clearCount,
265
+ };
266
+
267
+ this.#entries.set(entity, entry);
268
+
269
+ // registered now when there is a context, so a trail added mid-level is seeded where its entity
270
+ // stands from its first frame
271
+ if (this.#ensure_runtime() !== null) {
272
+ this.#register(entry);
273
+ }
274
+ }
275
+
276
+ /**
277
+ * @param {Trail3D} trail
278
+ * @param {Transform64} transform
279
+ * @param {number} entity
280
+ */
281
+ unlink(trail, transform, entity) {
282
+ this.#drop(entity);
283
+ }
284
+
285
+ /**
286
+ * Move the clock by the simulation time given, register what is waiting, and restage every trail
287
+ * whose component changed.
288
+ *
289
+ * @param {number} [time_delta_seconds]
290
+ */
291
+ update(time_delta_seconds = 0) {
292
+ const runtime = this.#ensure_runtime();
293
+
294
+ if (runtime === null) {
295
+ return;
296
+ }
297
+
298
+ runtime.advance(time_delta_seconds);
299
+
300
+ for (const entry of this.#entries.values()) {
301
+ this.#sync(runtime, entry);
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Record the frame's trail work — called by the frame extension.
307
+ *
308
+ * @param {import("../../shade/renderer/extension/FrameContext.js").FrameContext} frame
309
+ */
310
+ record(frame) {
311
+ // whatever the last frame left is not this frame's: a frame that records nothing draws nothing
312
+ this.#channel.end_frame();
313
+
314
+ if (frame.view.scene.scene !== this.#scene) {
315
+ return;
316
+ }
317
+
318
+ const runtime = this.#ensure_runtime();
319
+
320
+ if (runtime === null) {
321
+ return;
126
322
  }
127
323
 
128
- // the extrusion produces world-space vertices, and what the draw applies is the mesh's own
129
- // transform, identity until moved
130
- const mesh = DynamicMesh.from(new Geometry());
324
+ for (const entry of this.#entries.values()) {
325
+ this.#sync(runtime, entry);
326
+ }
131
327
 
132
- trail_tube_write_geometry(mesh.geometry, trail.tube);
328
+ // Read the way the velocity pass and the particles read it: the hierarchy is encoded ahead of
329
+ // the frame's graph, so the matrices in it are this frame's.
330
+ const scene_database = graph_import_buffer(frame.graph, frame.view.scene.scene_database_buffer, "scene_database/trails");
133
331
 
134
- this.#batch.add(mesh);
332
+ const simulation = runtime.record_simulation(frame.graph, scene_database);
135
333
 
136
- this.#entries.set(entity, { trail, transform, mesh });
334
+ this.#channel.begin_frame(frame.graph, frame.view, runtime, simulation);
335
+ }
336
+
337
+ /**
338
+ * @param {GPUTrailSystem} runtime
339
+ * @param {Trail3DEntry} entry
340
+ */
341
+ #sync(runtime, entry) {
342
+ const context = entry.context;
343
+
344
+ if (context === null) {
345
+ this.#register(entry);
346
+ return;
347
+ }
348
+
349
+ const trail = entry.trail;
350
+
351
+ // a build-time change: an authored layout replaced, or one added or taken away
352
+ const knots = trail.knots;
353
+
354
+ if (knots !== context.staged.authored
355
+ || (knots !== null && knots.version !== context.staged.authored_version)) {
356
+ entry.knot_count = knot_count_of(trail);
357
+ }
358
+
359
+ const scratch = this.#scratch;
360
+
361
+ apply_trail3d(scratch, trail, entry);
362
+
363
+ if (!scratch.equals(context.staged)) {
364
+ runtime.stage(context, scratch);
365
+ }
366
+
367
+ if (entry.clears !== trail.clearCount) {
368
+ entry.clears = trail.clearCount;
369
+ runtime.clear(context);
370
+ }
371
+ }
372
+
373
+ /**
374
+ * @param {Trail3DEntry} entry
375
+ */
376
+ #register(entry) {
377
+ const runtime = this.#runtime;
378
+ const trail = entry.trail;
379
+
380
+ entry.knot_count = knot_count_of(trail);
381
+ entry.radial = trail.radialSegments;
382
+ entry.clears = trail.clearCount;
383
+
384
+ entry.hold.acquire(this.#runtime_context);
385
+
386
+ const scratch = this.#scratch;
387
+
388
+ apply_trail3d(scratch, trail, entry);
389
+
390
+ const context = runtime.add(scratch, row_of_entity(entry.entity));
391
+
392
+ if (context === null) {
393
+ // the knot pool cannot grow to house it on this device
394
+ entry.hold.release();
395
+ return;
396
+ }
397
+
398
+ entry.context = context;
137
399
  }
138
400
 
139
401
  /**
140
- * @param {Trail3D} trail
141
- * @param {Transform64} transform
142
402
  * @param {number} entity
143
403
  */
144
- unlink(trail, transform, entity) {
404
+ #drop(entity) {
145
405
  const entry = this.#entries.get(entity);
146
406
 
147
407
  if (entry === undefined) {
148
408
  return;
149
409
  }
150
410
 
151
- this.#batch.remove(entry.mesh);
411
+ if (entry.context !== null && this.#runtime !== null) {
412
+ this.#runtime.remove(entry.context);
413
+ }
152
414
 
153
- // residency deliberately survives leaving the batch, so nothing else would free it
154
- this.#channel.release(entry.mesh.geometry);
415
+ entry.context = null;
416
+ entry.hold.dispose();
155
417
 
156
418
  this.#entries.delete(entity);
419
+ }
420
+
421
+ /**
422
+ * The runtime for the scene context the scene renders through now, made fresh when that context is
423
+ * new: a device restart builds a new one, and every trail registers again and is seeded anew.
424
+ *
425
+ * @returns {GPUTrailSystem|null}
426
+ */
427
+ #ensure_runtime() {
428
+ const context = this.#current_context();
429
+
430
+ if (context === this.#runtime_context) {
431
+ return this.#runtime;
432
+ }
433
+
434
+ this.#destroy_runtime();
435
+
436
+ if (context === null) {
437
+ return null;
438
+ }
439
+
440
+ this.#runtime = new GPUTrailSystem(context.graphics);
441
+ this.#runtime_context = context;
157
442
 
158
- trail.dispose();
443
+ return this.#runtime;
159
444
  }
160
445
 
161
- update(timeDelta) {
446
+ #destroy_runtime() {
162
447
  for (const entry of this.#entries.values()) {
163
- const trail = entry.trail;
448
+ // the trails and rows went with the context that held them
449
+ entry.context = null;
450
+ entry.hold.release();
451
+ }
164
452
 
165
- advance_trail(trail, entry.transform, timeDelta, this.#simulator);
453
+ if (this.#runtime !== null) {
454
+ this.#runtime.destroy();
455
+ }
166
456
 
167
- // The component's own bounds serve CPU culling, which this path does not do (§4.5), and
168
- // the depth range the transparency pipeline needs the channel reads off the written
169
- // geometry — so the flag the head raises has nobody else to answer it.
170
- trail.clearFlag(Trail3DFlags.BoundsNeedUpdate);
457
+ this.#runtime = null;
458
+ this.#runtime_context = null;
459
+ }
171
460
 
172
- trail_tube_write_geometry(entry.mesh.geometry, trail.tube);
461
+ #detach_dataset() {
462
+ for (const entity of Array.from(this.#entries.keys())) {
463
+ this.#drop(entity);
173
464
  }
465
+
466
+ const dataset = this.#dataset;
467
+
468
+ if (dataset !== null && this.#scene.dataset === dataset) {
469
+ this.#scene.dataset = null;
470
+ }
471
+
472
+ this.#dataset = null;
174
473
  }
175
474
  }
176
475
 
@@ -34,7 +34,7 @@ import { build_wind_tunnel, place_wind_post } from "./wind_build.js";
34
34
  * scene would use. The global acts as a scene's do: `FluidEffectorsSystem` folds
35
35
  * it into the far field once a step, the field is brought to that far field
36
36
  * (`fluid_apply_atmosphere`), and the cloth reads the same far field outside the
37
- * volume — one wind, gust included (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md G2).
37
+ * volume — one wind, turbulence included (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md G2).
38
38
  * That is §10's whole argument — this engine already has something better than a
39
39
  * wind zone — put where it can be watched instead of read.
40
40
  *
@@ -56,7 +56,7 @@ import { build_wind_tunnel, place_wind_post } from "./wind_build.js";
56
56
  * shedding street — it is a steady deficit, and the free corner moves twelve
57
57
  * times as far per step with the post as without rather than fluttering.
58
58
  *
59
- * And **"far field only"** is §10's fallback: the global's wind and its gust,
59
+ * And **"far field only"** is §10's fallback: the global's wind and its turbulence,
60
60
  * uniform over the whole banner, read through the same interface. It costs one
61
61
  * sample for the whole cloth instead of one per particle, which the readout
62
62
  * shows as the sample time dropping by a factor of twenty-five.
@@ -245,10 +245,11 @@ function step_once() {
245
245
  tunnel.effector.wind[1] = 0;
246
246
  tunnel.effector.wind[2] = Math.cos(angle) * control.speed;
247
247
 
248
- // The gust is the global's, so the far field carries it inside the volume
249
- // and outside alike.
250
- tunnel.effector.gust = control.gust;
251
- tunnel.effector.gust_period = 1.6;
248
+ // The turbulence is the global's, read where the cloth hangs outside the
249
+ // volume; the CPU fluid inside takes the mean. The slider is its rms, and its
250
+ // strongest eddies (4.05·L) go by every 1.6 s.
251
+ tunnel.effector.turbulence_intensity = control.speed > 0 ? control.gust / control.speed : 0;
252
+ tunnel.effector.turbulence_length = control.speed > 0 ? control.speed * 1.6 / 4.05 : tunnel.effector.turbulence_length;
252
253
 
253
254
  // 1. The air. The far field folded, then a real fluid step brought to it,
254
255
  // with the post's wake in it — what `FluidSystem` does for a scene.
@@ -30,12 +30,12 @@
30
30
  * they read the same bytes of it.
31
31
  *
32
32
  * **The clock is the scene's** (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §12,
33
- * G2). The far field's gust is integrated once a tick by `FluidEffectorsSystem`,
33
+ * G2). The far field is integrated once a tick by `FluidEffectorsSystem`,
34
34
  * so a cloth steps in the weather of the tick it is advanced on — and a worker
35
35
  * cloth is advanced from the tick its registration is acknowledged, not the tick
36
36
  * it was linked (`MEASUREMENTS.md` §39, §57). So the gate holds for cloths
37
37
  * registered on the same tick under both systems, and for any registration
38
- * under a time-invariant wind; under a gust, a cloth the worker registers later
38
+ * under a time-invariant wind; under a varying one, a cloth the worker registers later
39
39
  * steps in later weather. And the GPU wind arrives when the GPU answers, so two
40
40
  * runs of a scene need not read the same air at all: run-to-run repeatability
41
41
  * under the GPU wind is given up (F4). `MEASUREMENTS.md` §69.
@@ -30,12 +30,12 @@
30
30
  * they read the same bytes of it.
31
31
  *
32
32
  * **The clock is the scene's** (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §12,
33
- * G2). The far field's gust is integrated once a tick by `FluidEffectorsSystem`,
33
+ * G2). The far field is integrated once a tick by `FluidEffectorsSystem`,
34
34
  * so a cloth steps in the weather of the tick it is advanced on — and a worker
35
35
  * cloth is advanced from the tick its registration is acknowledged, not the tick
36
36
  * it was linked (`MEASUREMENTS.md` §39, §57). So the gate holds for cloths
37
37
  * registered on the same tick under both systems, and for any registration
38
- * under a time-invariant wind; under a gust, a cloth the worker registers later
38
+ * under a time-invariant wind; under a varying one, a cloth the worker registers later
39
39
  * steps in later weather. And the GPU wind arrives when the GPU answers, so two
40
40
  * runs of a scene need not read the same air at all: run-to-run repeatability
41
41
  * under the GPU wind is given up (F4). `MEASUREMENTS.md` §69.
@@ -15,9 +15,9 @@
15
15
  * (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §6). So this is the one source a
16
16
  * CPU-fluid scene needs rather than a thing to switch between: a banner inside
17
17
  * a wind tunnel volume reads the tunnel, the same banner carried outside reads
18
- * the prevailing weather and its gust, and the cloth never learns which
19
- * happened. The gust runs on the scene's clock (G2), so `sample`'s `time` is not
20
- * read.
18
+ * the prevailing weather and its turbulence where it hangs, and the cloth never
19
+ * learns which happened. The far field runs on the scene's clock (G2), so
20
+ * `sample`'s `time` is not read.
21
21
  *
22
22
  * ## Two units problems, and they are the reason this class exists at all
23
23
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ClothFluidWind.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/wind/ClothFluidWind.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH;IAmCI;;;;OAIG;IACH,uBAJW,OAAO,yCAAyC,EAAE,oBAAoB,EAWhF;IA7CD;;;;OAIG;IACH,oBAAY;IAEZ;;;;OAIG;IACH,qBAAwD;IAExD;;;;OAIG;IACH,qBAAkB;IAElB;;;OAGG;IACH,iBAAc;IAEd;;;OAGG;IACH,gBAAY;IAgBZ;;;OAGG;IACH,wFAEC;CAkHJ;kCArOiC,wBAAwB"}
1
+ {"version":3,"file":"ClothFluidWind.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/wind/ClothFluidWind.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH;IAmCI;;;;OAIG;IACH,uBAJW,OAAO,yCAAyC,EAAE,oBAAoB,EAWhF;IA7CD;;;;OAIG;IACH,oBAAY;IAEZ;;;;OAIG;IACH,qBAAwD;IAExD;;;;OAIG;IACH,qBAAkB;IAElB;;;OAGG;IACH,iBAAc;IAEd;;;OAGG;IACH,gBAAY;IAgBZ;;;OAGG;IACH,wFAEC;CA+GJ;kCAnOiC,wBAAwB"}