@woosh/meep-engine 3.52.0 → 3.53.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 (370) hide show
  1. package/package.json +1 -1
  2. package/src/engine/ecs/animation/Animation.d.ts +4 -25
  3. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  4. package/src/engine/ecs/animation/Animation.js +9 -41
  5. package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
  6. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  7. package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
  8. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
  9. package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
  10. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  11. package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
  12. package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
  13. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  14. package/src/engine/graphics3/AnimationSystem.js +62 -243
  15. package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
  16. package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
  17. package/src/engine/graphics3/FoliageWindSystem.js +257 -0
  18. package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
  19. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  20. package/src/engine/graphics3/GPUFluidSystem.js +39 -1
  21. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +0 -1
  22. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/GPUParticleEmitterSystem.js +19 -5
  24. package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
  25. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  26. package/src/engine/graphics3/animation/AnimationClips.js +207 -10
  27. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
  28. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
  29. package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
  30. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
  31. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
  32. package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
  33. package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
  34. package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
  35. package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
  36. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
  38. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  39. package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
  40. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
  41. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
  42. package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
  43. package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
  44. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
  45. package/src/engine/graphics3/prefab/Prefab.js +169 -162
  46. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
  47. package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
  48. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  49. package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
  50. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
  51. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
  52. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  53. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
  54. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  55. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
  56. package/src/engine/sound/simulation/README.md +1 -1
  57. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
  58. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
  59. package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
  60. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  61. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
  62. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
  63. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
  64. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
  65. package/src/generation/foliage/FOLIAGE_DESIGN.md +318 -0
  66. package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
  67. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
  68. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
  69. package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
  70. package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
  71. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
  72. package/src/generation/foliage/asset/TreeAsset.js +111 -0
  73. package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
  74. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
  75. package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
  76. package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
  77. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
  78. package/src/generation/foliage/asset/generate_tree.js +93 -0
  79. package/src/generation/foliage/asset/place_tree.d.ts +82 -0
  80. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
  81. package/src/generation/foliage/asset/place_tree.js +194 -0
  82. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +120 -0
  83. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
  84. package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
  85. package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
  86. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
  87. package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
  88. package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
  89. package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
  90. package/src/generation/foliage/config/CrownConfig.js +186 -0
  91. package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
  92. package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
  93. package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
  94. package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
  95. package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
  96. package/src/generation/foliage/config/FoliageCardType.js +18 -0
  97. package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
  98. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
  99. package/src/generation/foliage/config/FoliageConfig.js +283 -0
  100. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +90 -0
  101. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
  102. package/src/generation/foliage/config/FoliageMaterialConfig.js +181 -0
  103. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
  104. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
  105. package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
  106. package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
  107. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
  108. package/src/generation/foliage/config/TreeLODConfig.js +211 -0
  109. package/src/generation/foliage/config/TreePreset.d.ts +16 -0
  110. package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
  111. package/src/generation/foliage/config/TreePreset.js +17 -0
  112. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
  113. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
  114. package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
  115. package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
  116. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
  117. package/src/generation/foliage/config/TreeWindConfig.js +157 -0
  118. package/src/generation/foliage/index.d.ts +38 -0
  119. package/src/generation/foliage/index.d.ts.map +1 -0
  120. package/src/generation/foliage/index.js +43 -0
  121. package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
  122. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
  123. package/src/generation/foliage/material/make_bark_material.js +802 -0
  124. package/src/generation/foliage/material/make_foliage_material.d.ts +14 -0
  125. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
  126. package/src/generation/foliage/material/make_foliage_material.js +359 -0
  127. package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
  128. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
  129. package/src/generation/foliage/mesh/branch_collar_project.js +203 -0
  130. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
  131. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
  132. package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
  133. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +80 -0
  134. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
  135. package/src/generation/foliage/mesh/foliage_collect_attachments.js +502 -0
  136. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
  137. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
  138. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
  139. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
  140. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
  141. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1047 -0
  142. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +21 -0
  143. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
  144. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +415 -0
  145. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
  146. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
  147. package/src/generation/foliage/presets/make_tree_species_preset.js +837 -0
  148. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
  149. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
  150. package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
  151. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
  152. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
  153. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
  154. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
  155. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
  156. package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
  157. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
  158. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
  159. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
  160. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +14 -0
  161. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
  162. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +179 -0
  163. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
  164. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
  165. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1104 -0
  166. package/src/shade/playground/additive_blending/index.html +197 -0
  167. package/src/shade/playground/additive_blending/main.d.ts +2 -0
  168. package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
  169. package/src/shade/playground/additive_blending/main.js +529 -0
  170. package/src/shade/playground/foliage_wind/README.md +18 -0
  171. package/src/shade/playground/foliage_wind/foliage_world.d.ts +127 -0
  172. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
  173. package/src/shade/playground/foliage_wind/foliage_world.js +593 -0
  174. package/src/shade/playground/foliage_wind/index.html +254 -0
  175. package/src/shade/playground/foliage_wind/main.d.ts +2 -0
  176. package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
  177. package/src/shade/playground/foliage_wind/main.js +263 -0
  178. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  179. package/src/shade/renderer/Renderer.js +45 -16
  180. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
  181. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
  182. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
  183. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
  184. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
  185. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
  186. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
  187. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
  188. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
  189. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
  190. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
  191. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  192. package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
  193. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
  194. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  195. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
  196. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
  197. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
  199. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
  201. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
  202. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
  203. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
  204. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
  205. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
  206. package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
  207. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
  208. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
  209. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
  210. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
  211. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
  212. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
  213. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
  215. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
  216. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
  217. package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
  218. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  219. package/src/shade/renderer/extension/RenderExtension.js +9 -0
  220. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
  221. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  222. package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
  223. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +7 -0
  224. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  225. package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
  226. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +7 -0
  227. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  228. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
  229. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  230. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
  231. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
  232. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  233. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
  234. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  235. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
  236. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  237. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
  238. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
  239. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
  240. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +7 -0
  241. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  242. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
  243. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
  244. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  245. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
  246. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
  247. package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
  248. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  249. package/src/shade/renderer/loader/SceneBundle.js +119 -111
  250. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
  251. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  252. package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
  253. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
  254. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  255. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
  256. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  257. package/src/shade/renderer/particles/GPUParticleSystem.js +3 -1
  258. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  259. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +9 -4
  260. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  261. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
  262. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
  263. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
  264. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  265. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
  266. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
  267. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
  268. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
  269. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  270. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
  271. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
  272. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
  273. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
  274. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
  275. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
  276. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
  277. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
  278. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
  279. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
  280. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
  281. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
  282. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
  283. package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
  284. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
  285. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  286. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
  287. package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
  288. package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
  289. package/src/engine/graphics/composit/CompositingStages.js +0 -8
  290. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
  291. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
  292. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
  293. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
  294. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
  295. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
  296. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
  297. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
  298. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
  299. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
  300. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
  301. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
  302. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
  303. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
  304. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
  305. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
  306. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
  307. package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
  308. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
  309. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
  310. package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
  311. package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
  312. package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
  313. package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
  314. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
  315. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
  316. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
  317. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
  318. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
  319. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
  320. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
  321. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
  322. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
  323. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
  324. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
  325. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
  326. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
  327. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
  328. package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
  329. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
  330. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
  331. package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
  332. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
  333. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
  334. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
  335. package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
  336. package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
  337. package/src/engine/graphics/render/RenderPassType.js +0 -8
  338. package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
  339. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
  340. package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
  341. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
  342. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
  343. package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
  344. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
  345. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
  346. package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
  347. package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
  348. package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
  349. package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
  350. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
  351. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
  352. package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
  353. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
  354. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
  355. package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
  356. package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
  357. package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
  358. package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
  359. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
  360. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
  361. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
  362. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
  363. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
  364. package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
  365. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
  366. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
  367. package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
  368. package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
  369. package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
  370. package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
@@ -0,0 +1,143 @@
1
+ import { chunk_mat4_extract_scale } from "../../shader/chunk/geometry/mat4/chunk_mat4_extract_scale.js";
2
+ import { chunk_build_orthonormal_matrix_n } from "../../shader/chunk/geometry/normal/chunk_build_orthonormal_matrix_n.js";
3
+ import { chunk_quat_from_axis_angle } from "../../shader/chunk/geometry/quaternion/chunk_quat_from_axis_angle.js";
4
+ import { chunk_quat_multiply } from "../../shader/chunk/geometry/quaternion/chunk_quat_multiply.js";
5
+ import { QUAT_IDENTITY_DEFINITION } from "../../shader/chunk/geometry/quaternion/QUAT_IDENTITY_DEFINITION.js";
6
+ import { chunk_pow2 } from "../../shader/chunk/math/chunk_pow2.js";
7
+ import { chunk_v3_safe_rcp } from "../../shader/chunk/math/chunk_safe_rcp.js";
8
+ import { EPSILON_DECLARATION } from "../../shader/chunk/math/EPSILON_DECLARATION.js";
9
+ import { GOLDEN_ANGLE_DECLARATION } from "../../shader/chunk/math/GOLDEN_ANGLE_DECLARATION.js";
10
+ import { PI_DECLARATION } from "../../shader/chunk/math/PI_DECLARATION.js";
11
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
12
+ import { ANIMATION_FOLIAGE_JOINT_STRUCT } from "../ANIMATION_FOLIAGE_JOINT_STRUCT.js";
13
+
14
+ /**
15
+ * Aeroelastic foliage bone step and local pose composition.
16
+ *
17
+ * - `foliage_wind_to_model(wind_ws, root_global)`: projects a world-space fluid velocity (m/s)
18
+ * onto the unit local axes of the tree root's world matrix (`mat4_extract_scale` + `v3_safe_rcp`),
19
+ * preserving metric wind speed regardless of node scale.
20
+ * - `foliage_wind_step(joint, wind_model, dt)`: evaluates cross-flow aerodynamic drag torque and
21
+ * Strouhal vortex-shedding oscillation around the bone's rest `branch_axis` (using
22
+ * `build_orthonormal_matrix_n` when flow is axial), soft-saturates the target deflection to
23
+ * `joint.max_angle`, and advances the bone's 2nd-order damped spring-damper state with an
24
+ * unconditionally stable implicit Euler step.
25
+ * - `foliage_wind_local_rotation(rest_rotation, angular_displacement)`: composes the bone's
26
+ * rest quaternion with the axis-angle deflection (`quat_from_axis_angle` + `quat_multiply`).
27
+ *
28
+ * @type {CodeChunk}
29
+ */
30
+ export const chunk_foliage_wind_step = CodeChunk.from(
31
+ //language=WGSL
32
+ `
33
+ struct FoliageWindStepResult {
34
+ angular_displacement: vec3<f32>,
35
+ angular_velocity: vec3<f32>,
36
+ flutter_phase: f32,
37
+ }
38
+
39
+ fn foliage_wind_to_model(wind_ws: vec3<f32>, root_global: mat4x4<f32>) -> vec3<f32> {
40
+ let inv_scale = v3_safe_rcp(mat4_extract_scale(root_global));
41
+ return vec3<f32>(
42
+ dot(wind_ws, root_global[0].xyz),
43
+ dot(wind_ws, root_global[1].xyz),
44
+ dot(wind_ws, root_global[2].xyz),
45
+ ) * inv_scale;
46
+ }
47
+
48
+ fn foliage_wind_step(
49
+ joint: ${ANIMATION_FOLIAGE_JOINT_STRUCT.wgsl_ref},
50
+ wind_model: vec3<f32>,
51
+ dt: f32,
52
+ ) -> FoliageWindStepResult {
53
+ var theta_new = joint.angular_displacement;
54
+ var vel_new = joint.angular_velocity;
55
+ var phase_new = joint.flutter_phase;
56
+
57
+ if (joint.compliance > 0.0 && dt > 0.0) {
58
+ let axis = joint.branch_axis;
59
+ let wind_speed = length(wind_model);
60
+ let omega = max(joint.natural_frequency, 0.1);
61
+
62
+ // Strouhal vortex-shedding phase advance, wrapped to [0, 2π)
63
+ let tau = 2.0 * PI;
64
+ phase_new = phase_new + omega * (1.0 + 0.22 * wind_speed) * dt;
65
+ phase_new = phase_new - floor(phase_new / tau) * tau;
66
+
67
+ // Cross-flow aerodynamic drag torque: bends branch toward local fluid flow
68
+ let cross_drag = cross(axis, wind_model);
69
+ let drag_torque = cross_drag * (joint.compliance * (0.5 + 0.5 * wind_speed));
70
+
71
+ // Turbulent vortex-shedding oscillation (streamwise buffeting + cross-wind lift)
72
+ var vortex_torque = vec3<f32>(0.0);
73
+ if (wind_speed > EPSILON && joint.turbulence > 0.0) {
74
+ let drag_len = length(cross_drag);
75
+ var e1: vec3<f32>;
76
+ var e2: vec3<f32>;
77
+ if (drag_len > EPSILON) {
78
+ e1 = cross_drag / drag_len;
79
+ e2 = cross(axis, e1);
80
+ } else {
81
+ let basis = build_orthonormal_matrix_n(axis);
82
+ e1 = basis[0];
83
+ e2 = basis[1];
84
+ }
85
+ let vortex_amp = joint.turbulence * min(
86
+ wind_speed * joint.compliance * (0.6 + 0.25 * wind_speed),
87
+ 0.45 * joint.max_angle,
88
+ );
89
+ vortex_torque = vortex_amp * (
90
+ sin(phase_new) * e1 +
91
+ 0.65 * cos(GOLDEN_ANGLE * phase_new + 1.1) * e2
92
+ );
93
+ }
94
+
95
+ let theta_raw = drag_torque + vortex_torque;
96
+ let raw_len = length(theta_raw);
97
+ let max_ang = max(joint.max_angle, 1e-3);
98
+ var theta_target = theta_raw;
99
+ if (raw_len > EPSILON) {
100
+ // Asymptotic soft saturation so extreme fluid impulses bend smoothly up to max_angle
101
+ theta_target = theta_raw * (max_ang / (max_ang + raw_len));
102
+ }
103
+
104
+ // Unconditionally stable implicit 2nd-order damped spring-damper step
105
+ let zeta = max(joint.damping_ratio, 0.05);
106
+ let k = pow2(omega);
107
+ let c = 2.0 * zeta * omega;
108
+ let denom = 1.0 + c * dt + k * pow2(dt);
109
+
110
+ vel_new = (vel_new + k * dt * (theta_target - theta_new)) / denom;
111
+ theta_new = theta_new + vel_new * dt;
112
+
113
+ let new_len = length(theta_new);
114
+ if (new_len > max_ang) {
115
+ theta_new = theta_new * (max_ang / new_len);
116
+ }
117
+ }
118
+
119
+ return FoliageWindStepResult(theta_new, vel_new, phase_new);
120
+ }
121
+
122
+ fn foliage_wind_local_rotation(rest_rotation: vec4<f32>, angular_displacement: vec3<f32>) -> vec4<f32> {
123
+ let angle = length(angular_displacement);
124
+ var q_delta = QUAT_IDENTITY;
125
+ if (angle > EPSILON) {
126
+ q_delta = quat_from_axis_angle(angular_displacement / angle, angle);
127
+ }
128
+ return quat_multiply(rest_rotation, q_delta);
129
+ }
130
+ `, [
131
+ ANIMATION_FOLIAGE_JOINT_STRUCT.declaration_chunk,
132
+ PI_DECLARATION,
133
+ GOLDEN_ANGLE_DECLARATION,
134
+ EPSILON_DECLARATION,
135
+ QUAT_IDENTITY_DEFINITION,
136
+ chunk_pow2,
137
+ chunk_v3_safe_rcp,
138
+ chunk_mat4_extract_scale,
139
+ chunk_build_orthonormal_matrix_n,
140
+ chunk_quat_from_axis_angle,
141
+ chunk_quat_multiply,
142
+ ]
143
+ );
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Workgroup size for the GPU foliage fluid wind bone pass.
3
+ * Paired with `animation_foliage_joints.dispatch_group_count(WORKGROUP_SIZE)`.
4
+ */
5
+ export const WORKGROUP_SIZE: 64;
6
+ /**
7
+ * Compute shader that evaluates aeroelastic foliage bones (`animation_foliage_joints`) against
8
+ * the scene's 3D fluid dynamics wind field (`GPUSceneWind` / `wind_field_sample`), steps each
9
+ * bone's 2nd-order damped spring-damper state (`chunk_foliage_wind_step`), and atomic-adds
10
+ * weighted local rotations into `pose_accumulator` ahead of `shader_animation_pose_resolve`.
11
+ */
12
+ export const shader_foliage_wind_apply: ComputeShader;
13
+ import { ComputeShader } from "../../shader/ComputeShader.js";
14
+ //# sourceMappingURL=shader_foliage_wind_apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_foliage_wind_apply.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,gCAAiC;AAoFjC;;;;;GAKG;AACH,sDAIG;8BA/G2B,+BAA+B"}
@@ -0,0 +1,116 @@
1
+ import { GPU_DATABASE_NULL } from "../../buffer/table/GPU_DATABASE_NULL.js";
2
+ import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
3
+ import { chunk_mat4_extract_position } from "../../shader/chunk/geometry/mat4/chunk_mat4_extract_position.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ComputeShader } from "../../shader/ComputeShader.js";
6
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { atomic_u32, f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
8
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
9
+ import { chunk_wind_field_sample } from "../../wind/chunk_wind_field_sample.js";
10
+ import { wind_field_add_resources } from "../../wind/wind_field_add_resources.js";
11
+ import { ANIMATION_DATABASE_SPEC } from "../ANIMATION_DATABASE_SPEC.js";
12
+ import { chunk_pose_accumulator } from "../chunk_pose_accumulator.js";
13
+ import { chunk_foliage_wind_step } from "./chunk_foliage_wind_step.js";
14
+
15
+ const JOINT_TABLE = ANIMATION_DATABASE_SPEC.get('animation_foliage_joints');
16
+ const RIG_TABLE = ANIMATION_DATABASE_SPEC.get('animation_foliage_rigs');
17
+
18
+ /**
19
+ * Workgroup size for the GPU foliage fluid wind bone pass.
20
+ * Paired with `animation_foliage_joints.dispatch_group_count(WORKGROUP_SIZE)`.
21
+ */
22
+ export const WORKGROUP_SIZE = 64;
23
+
24
+ const PG_PREFIX = JOINT_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE, true);
25
+
26
+ const resources = new ShaderResourceSetDescriptor();
27
+
28
+ resources.setImmediate("dt", f32);
29
+
30
+ wind_field_add_resources(
31
+ resources.createGroup()
32
+ .addStorageBuffer('scene_database', WebGPUArray.from(u32), false)
33
+ .addStorageBuffer('animation_database', WebGPUArray.from(u32), true)
34
+ .addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true)
35
+ );
36
+
37
+ const body = CodeChunk.from(
38
+ //language=WGSL
39
+ `
40
+ @compute @workgroup_size(${WORKGROUP_SIZE}, 1, 1)
41
+ fn main(
42
+ @builtin(workgroup_id) wg_id: vec3<u32>,
43
+ @builtin(local_invocation_index) local_id: u32,
44
+ ) {
45
+ if !${PG_PREFIX}_setup(&animation_database, wg_id.x, local_id) {
46
+ return;
47
+ }
48
+
49
+ let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
50
+
51
+ if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
52
+ return;
53
+ }
54
+ if !${PG_PREFIX}_is_occupied(slot_in_page) {
55
+ return;
56
+ }
57
+
58
+ let joint = ${PG_PREFIX}_read(&animation_database, slot_in_page);
59
+
60
+ if joint.node == ${GPU_DATABASE_NULL}u {
61
+ return;
62
+ }
63
+
64
+ let rig = ${RIG_TABLE.marshalling_method_read_rw}(&animation_database, joint.rig);
65
+
66
+ if rig.root_node == ${GPU_DATABASE_NULL}u || rig.weight <= 0.0 {
67
+ return;
68
+ }
69
+
70
+ let joint_node = scene_read_node(&scene_database, joint.node);
71
+ let root_node = scene_read_node(&scene_database, rig.root_node);
72
+
73
+ // Sample 3D fluid velocity (m/s) at the bone's world position and project into the tree root's model frame
74
+ let pos_ws = mat4_extract_position(joint_node.global);
75
+ let wind_ws = wind_field_sample(pos_ws);
76
+ let wind_model = foliage_wind_to_model(wind_ws, root_node.global);
77
+
78
+ let stepped = foliage_wind_step(joint, wind_model, dt);
79
+
80
+ if joint.compliance > 0.0 && dt > 0.0 {
81
+ let joint_row = ${PG_PREFIX}_slot_to_index(slot_in_page);
82
+ ${JOINT_TABLE.marshalling_method_write_field('angular_displacement')}(&animation_database, joint_row, stepped.angular_displacement);
83
+ ${JOINT_TABLE.marshalling_method_write_field('angular_velocity')}(&animation_database, joint_row, stepped.angular_velocity);
84
+ ${JOINT_TABLE.marshalling_method_write_field('flutter_phase')}(&animation_database, joint_row, stepped.flutter_phase);
85
+ }
86
+
87
+ let q_local = foliage_wind_local_rotation(joint.rest_rotation, stepped.angular_displacement);
88
+ let w = rig.weight;
89
+
90
+ pose_accumulator_add_rotation(joint.node, q_local * w, 0xFu, w, joint.rest_rotation);
91
+ }
92
+ `, [
93
+ JOINT_TABLE.chunk_iterate(WORKGROUP_SIZE, true),
94
+ JOINT_TABLE.wgsl_gen_write_field_code('angular_displacement'),
95
+ JOINT_TABLE.wgsl_gen_write_field_code('angular_velocity'),
96
+ JOINT_TABLE.wgsl_gen_write_field_code('flutter_phase'),
97
+ RIG_TABLE.chunk_read_rw,
98
+ chunk_scene_database_access,
99
+ chunk_mat4_extract_position,
100
+ chunk_wind_field_sample,
101
+ chunk_foliage_wind_step,
102
+ chunk_pose_accumulator,
103
+ ]
104
+ );
105
+
106
+ /**
107
+ * Compute shader that evaluates aeroelastic foliage bones (`animation_foliage_joints`) against
108
+ * the scene's 3D fluid dynamics wind field (`GPUSceneWind` / `wind_field_sample`), steps each
109
+ * bone's 2nd-order damped spring-damper state (`chunk_foliage_wind_step`), and atomic-adds
110
+ * weighted local rotations into `pose_accumulator` ahead of `shader_animation_pose_resolve`.
111
+ */
112
+ export const shader_foliage_wind_apply = ComputeShader.from({
113
+ label: "Animation/FoliageWindApply",
114
+ body,
115
+ resources,
116
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"pose_evaluate_local.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/pose/pose_evaluate_local.js"],"names":[],"mappings":"AAqDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,iEALW,MAAM,gCAEN,cAAc,eAsJxB;oCAjPY,OAAO,6BAA6B,EAAE,qBAAqB"}
1
+ {"version":3,"file":"pose_evaluate_local.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/pose/pose_evaluate_local.js"],"names":[],"mappings":"AAqDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,iEALW,MAAM,gCAEN,cAAc,eAgKxB;oCA3PY,OAAO,6BAA6B,EAAE,qBAAqB"}
@@ -118,6 +118,19 @@ export function pose_evaluate_local(result, target, rest, playbacks) {
118
118
 
119
119
  let dirty = 0;
120
120
 
121
+ const rest_tx = rest.translation_x;
122
+ const rest_ty = rest.translation_y;
123
+ const rest_tz = rest.translation_z;
124
+
125
+ const rest_rx = rest.rotation_x;
126
+ const rest_ry = rest.rotation_y;
127
+ const rest_rz = rest.rotation_z;
128
+ const rest_rw = rest.rotation_w;
129
+
130
+ const rest_sx = rest.scale_x;
131
+ const rest_sy = rest.scale_y;
132
+ const rest_sz = rest.scale_z;
133
+
121
134
  for (let p = 0; p < playbacks.length; p++) {
122
135
  const playback = playbacks[p];
123
136
  const index = playback.channel_index;
@@ -152,15 +165,15 @@ export function pose_evaluate_local(result, target, rest, playbacks) {
152
165
  switch (channel.property) {
153
166
  case Node3DProperty.Translation: {
154
167
  if (curves.x !== undefined) {
155
- SUM_TRANSLATION[0] += curves.x.evaluate(time) * weight;
168
+ SUM_TRANSLATION[0] += (curves.x.evaluate(time) - rest_tx) * weight;
156
169
  dirty |= DIRTY_TX;
157
170
  }
158
171
  if (curves.y !== undefined) {
159
- SUM_TRANSLATION[1] += curves.y.evaluate(time) * weight;
172
+ SUM_TRANSLATION[1] += (curves.y.evaluate(time) - rest_ty) * weight;
160
173
  dirty |= DIRTY_TY;
161
174
  }
162
175
  if (curves.z !== undefined) {
163
- SUM_TRANSLATION[2] += curves.z.evaluate(time) * weight;
176
+ SUM_TRANSLATION[2] += (curves.z.evaluate(time) - rest_tz) * weight;
164
177
  dirty |= DIRTY_TZ;
165
178
  }
166
179
  break;
@@ -175,10 +188,10 @@ export function pose_evaluate_local(result, target, rest, playbacks) {
175
188
  const qz = curves.z !== undefined ? curves.z.evaluate(time) : 0;
176
189
  const qw = curves.w !== undefined ? curves.w.evaluate(time) : 1;
177
190
 
178
- SUM_ROTATION[0] += qx * weight;
179
- SUM_ROTATION[1] += qy * weight;
180
- SUM_ROTATION[2] += qz * weight;
181
- SUM_ROTATION[3] += qw * weight;
191
+ SUM_ROTATION[0] += (qx - rest_rx) * weight;
192
+ SUM_ROTATION[1] += (qy - rest_ry) * weight;
193
+ SUM_ROTATION[2] += (qz - rest_rz) * weight;
194
+ SUM_ROTATION[3] += (qw - rest_rw) * weight;
182
195
 
183
196
  dirty |= DIRTY_R;
184
197
  break;
@@ -186,15 +199,15 @@ export function pose_evaluate_local(result, target, rest, playbacks) {
186
199
 
187
200
  case Node3DProperty.Scale: {
188
201
  if (curves.x !== undefined) {
189
- SUM_SCALE[0] += curves.x.evaluate(time) * weight;
202
+ SUM_SCALE[0] += (curves.x.evaluate(time) - rest_sx) * weight;
190
203
  dirty |= DIRTY_SX;
191
204
  }
192
205
  if (curves.y !== undefined) {
193
- SUM_SCALE[1] += curves.y.evaluate(time) * weight;
206
+ SUM_SCALE[1] += (curves.y.evaluate(time) - rest_sy) * weight;
194
207
  dirty |= DIRTY_SY;
195
208
  }
196
209
  if (curves.z !== undefined) {
197
- SUM_SCALE[2] += curves.z.evaluate(time) * weight;
210
+ SUM_SCALE[2] += (curves.z.evaluate(time) - rest_sz) * weight;
198
211
  dirty |= DIRTY_SZ;
199
212
  }
200
213
  break;
@@ -207,29 +220,26 @@ export function pose_evaluate_local(result, target, rest, playbacks) {
207
220
  }
208
221
 
209
222
  result.setTranslation(
210
- (dirty & DIRTY_TX) !== 0 ? SUM_TRANSLATION[0] : rest.translation_x,
211
- (dirty & DIRTY_TY) !== 0 ? SUM_TRANSLATION[1] : rest.translation_y,
212
- (dirty & DIRTY_TZ) !== 0 ? SUM_TRANSLATION[2] : rest.translation_z,
223
+ (dirty & DIRTY_TX) !== 0 ? rest_tx + SUM_TRANSLATION[0] : rest_tx,
224
+ (dirty & DIRTY_TY) !== 0 ? rest_ty + SUM_TRANSLATION[1] : rest_ty,
225
+ (dirty & DIRTY_TZ) !== 0 ? rest_tz + SUM_TRANSLATION[2] : rest_tz,
213
226
  );
214
227
 
215
228
  result.setScale(
216
- (dirty & DIRTY_SX) !== 0 ? SUM_SCALE[0] : rest.scale_x,
217
- (dirty & DIRTY_SY) !== 0 ? SUM_SCALE[1] : rest.scale_y,
218
- (dirty & DIRTY_SZ) !== 0 ? SUM_SCALE[2] : rest.scale_z,
229
+ (dirty & DIRTY_SX) !== 0 ? rest_sx + SUM_SCALE[0] : rest_sx,
230
+ (dirty & DIRTY_SY) !== 0 ? rest_sy + SUM_SCALE[1] : rest_sy,
231
+ (dirty & DIRTY_SZ) !== 0 ? rest_sz + SUM_SCALE[2] : rest_sz,
219
232
  );
220
233
 
221
234
  if ((dirty & DIRTY_R) !== 0) {
222
- const x = SUM_ROTATION[0];
223
- const y = SUM_ROTATION[1];
224
- const z = SUM_ROTATION[2];
225
- const w = SUM_ROTATION[3];
226
-
227
- // A quaternion sum of length zero has no orientation in it to recover. The ordinary way in
228
- // is a joint whose rotation only clips at weight zero write — the accumulator takes a bound
229
- // clip's contribution whatever its weight — and the other is contributions that cancelled
230
- // exactly. The answer is the rest pose: the GPU writes the rest rotation every
231
- // contribution carried from its binding, which was taken from this same rest when the clip
232
- // bound the target.
235
+ const x = rest_rx + SUM_ROTATION[0];
236
+ const y = rest_ry + SUM_ROTATION[1];
237
+ const z = rest_rz + SUM_ROTATION[2];
238
+ const w = rest_rw + SUM_ROTATION[3];
239
+
240
+ // Reconstruct `rest_r + sum(w_i * (q_i - rest_r))` and normalise. If the
241
+ // reconstructed vector cancels to zero length (e.g. an antipodal contribution
242
+ // at weight 1), fall back to `rest_r` to match the GPU resolve shader.
233
243
  const length = Math.sqrt(x * x + y * y + z * z + w * w);
234
244
 
235
245
  if (length > 0) {
@@ -237,10 +247,10 @@ export function pose_evaluate_local(result, target, rest, playbacks) {
237
247
 
238
248
  result.setRotation(x * scale, y * scale, z * scale, w * scale);
239
249
  } else {
240
- result.setRotation(rest.rotation_x, rest.rotation_y, rest.rotation_z, rest.rotation_w);
250
+ result.setRotation(rest_rx, rest_ry, rest_rz, rest_rw);
241
251
  }
242
252
  } else {
243
- result.setRotation(rest.rotation_x, rest.rotation_y, rest.rotation_z, rest.rotation_w);
253
+ result.setRotation(rest_rx, rest_ry, rest_rz, rest_rw);
244
254
  }
245
255
 
246
256
  return result;
@@ -63,24 +63,27 @@ fn main(
63
63
  // ── Translation ───────────────────────────────────────────────
64
64
  if (dirty & POSE_DIRTY_T_MASK) != 0u {
65
65
  let t_base = slot_base + POSE_OFFSET_TRANSLATION;
66
+ let rest_t_base = slot_base + POSE_OFFSET_REST_TRANSLATION;
66
67
  // Per-axis: only overwrite the channels that actually had a
67
- // contribution. Read the current local_translation through
68
- // the rw helper and patch the dirty channels in-place — the
69
- // sibling-axis race that the old direct writer already
70
- // tolerated still applies (two threads writing different
71
- // axes of the same node), but we now have at most one resolve
72
- // thread per row, so it never triggers here.
68
+ // contribution. Reconstruct rest_t + delta_t on each dirty
69
+ // axis and leave undirty axes untouched.
73
70
  var t = scene_read_node_rw(&scene_database, row).local_translation;
74
71
  if (dirty & POSE_DIRTY_TX) != 0u {
75
- t.x = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 0u]));
72
+ let delta_x = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 0u]));
73
+ let rest_x = bitcast<f32>(atomicLoad(&pose_accumulator[rest_t_base + 0u]));
74
+ t.x = rest_x + delta_x;
76
75
  atomicStore(&pose_accumulator[t_base + 0u], 0u);
77
76
  }
78
77
  if (dirty & POSE_DIRTY_TY) != 0u {
79
- t.y = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 1u]));
78
+ let delta_y = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 1u]));
79
+ let rest_y = bitcast<f32>(atomicLoad(&pose_accumulator[rest_t_base + 1u]));
80
+ t.y = rest_y + delta_y;
80
81
  atomicStore(&pose_accumulator[t_base + 1u], 0u);
81
82
  }
82
83
  if (dirty & POSE_DIRTY_TZ) != 0u {
83
- t.z = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 2u]));
84
+ let delta_z = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 2u]));
85
+ let rest_z = bitcast<f32>(atomicLoad(&pose_accumulator[rest_t_base + 2u]));
86
+ t.z = rest_z + delta_z;
84
87
  atomicStore(&pose_accumulator[t_base + 2u], 0u);
85
88
  }
86
89
  scene_write_node_local_translation(&scene_database, row, t);
@@ -89,7 +92,7 @@ fn main(
89
92
  // ── Rotation ──────────────────────────────────────────────────
90
93
  if (dirty & POSE_DIRTY_R) != 0u {
91
94
  let r_base = slot_base + POSE_OFFSET_ROTATION;
92
- let r = vec4<f32>(
95
+ let delta = vec4<f32>(
93
96
  bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 0u])),
94
97
  bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 1u])),
95
98
  bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 2u])),
@@ -99,33 +102,23 @@ fn main(
99
102
  atomicStore(&pose_accumulator[r_base + 1u], 0u);
100
103
  atomicStore(&pose_accumulator[r_base + 2u], 0u);
101
104
  atomicStore(&pose_accumulator[r_base + 3u], 0u);
102
- // The weighted-quaternion sum (\`w_i * q_i\`) is the standard
103
- // nlerp blend numerator; normalise here, once, after every
104
- // contributor has been folded in. The apply pass canonicalised
105
- // signs at GLTF load so we don't hit the antipode case for
106
- // imported clips.
107
- //
108
- // A sum of length zero carries no orientation to recover: every
109
- // clip that writes this rotation is playing at weight zero — a
110
- // faded-out clip keeps its binding, and the apply pass
111
- // contributes to a bound clip whatever its weight — or the
112
- // contributions cancelled exactly. \`normalize\` answers NaN there,
113
- // and one NaN local rotation reaches every skin matrix naming the
114
- // joint, so the meshes it drives stop rasterising altogether. Nor
115
- // can the row be left alone: once a clip has written it, it holds
116
- // that clip's last pose, not the rest. The answer is the rest
117
- // rotation, which every contribution carried into the slot from
118
- // its binding — what the CPU twin (\`pose_evaluate_local\`) gives.
105
+
106
+ let rest_base = slot_base + POSE_OFFSET_REST_ROTATION;
107
+ let rest = vec4<f32>(
108
+ bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 0u])),
109
+ bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 1u])),
110
+ bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 2u])),
111
+ bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 3u])),
112
+ );
113
+
114
+ // Reconstruct rest + sum(w_i * (q_i - rest)) and normalise once
115
+ // after every contributor has been folded in. If the reconstructed
116
+ // vector cancels to zero length (e.g. an antipodal contribution at
117
+ // weight 1), fall back to rest to avoid NaN propagation.
118
+ let r = rest + delta;
119
119
  if length(r) > 0.0 {
120
120
  scene_write_node_local_rotation(&scene_database, row, normalize(r));
121
121
  } else {
122
- let rest_base = slot_base + POSE_OFFSET_REST_ROTATION;
123
- let rest = vec4<f32>(
124
- bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 0u])),
125
- bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 1u])),
126
- bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 2u])),
127
- bitcast<f32>(atomicLoad(&pose_accumulator[rest_base + 3u])),
128
- );
129
122
  scene_write_node_local_rotation(&scene_database, row, rest);
130
123
  }
131
124
  }
@@ -133,17 +126,24 @@ fn main(
133
126
  // ── Scale ─────────────────────────────────────────────────────
134
127
  if (dirty & POSE_DIRTY_S_MASK) != 0u {
135
128
  let s_base = slot_base + POSE_OFFSET_SCALE;
129
+ let rest_s_base = slot_base + POSE_OFFSET_REST_SCALE;
136
130
  var s = scene_read_node_rw(&scene_database, row).local_scale;
137
131
  if (dirty & POSE_DIRTY_SX) != 0u {
138
- s.x = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 0u]));
132
+ let delta_x = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 0u]));
133
+ let rest_x = bitcast<f32>(atomicLoad(&pose_accumulator[rest_s_base + 0u]));
134
+ s.x = rest_x + delta_x;
139
135
  atomicStore(&pose_accumulator[s_base + 0u], 0u);
140
136
  }
141
137
  if (dirty & POSE_DIRTY_SY) != 0u {
142
- s.y = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 1u]));
138
+ let delta_y = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 1u]));
139
+ let rest_y = bitcast<f32>(atomicLoad(&pose_accumulator[rest_s_base + 1u]));
140
+ s.y = rest_y + delta_y;
143
141
  atomicStore(&pose_accumulator[s_base + 1u], 0u);
144
142
  }
145
143
  if (dirty & POSE_DIRTY_SZ) != 0u {
146
- s.z = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 2u]));
144
+ let delta_z = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 2u]));
145
+ let rest_z = bitcast<f32>(atomicLoad(&pose_accumulator[rest_s_base + 2u]));
146
+ s.z = rest_z + delta_z;
147
147
  atomicStore(&pose_accumulator[s_base + 2u], 0u);
148
148
  }
149
149
  scene_write_node_local_scale(&scene_database, row, s);
@@ -108,8 +108,8 @@ const MESHLET_STRIDE_BYTES = MESHLET_METADATA_STRUCT.aligned_size;
108
108
  * manager. Resolution happens at upload time via
109
109
  * `animation_manager.get_skin_matrix_offset(skin_id)`.
110
110
  */
111
- export class GPUMeshSkinningContext {
112
-
111
+ export class GPUMeshSkinningContext {
112
+
113
113
  /** @type {GPUDevice} */
114
114
  #device;
115
115
 
@@ -59,6 +59,13 @@ export class RenderExtension {
59
59
  * @param {FrameContext} frame
60
60
  */
61
61
  record(frame: FrameContext): void;
62
+ /**
63
+ * Offer the pipelines this extension's passes dispatch or draw with — see
64
+ * {@link PipelineEnquiry}.
65
+ *
66
+ * @param {import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
67
+ */
68
+ enquirePipelines(enquiry: import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry): void;
62
69
  }
63
70
  export type FrameContext = import("./FrameContext.js").FrameContext;
64
71
  import { FramePhase } from "./FramePhase.js";
@@ -1 +1 @@
1
- {"version":3,"file":"RenderExtension.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/extension/RenderExtension.js"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;;;;;;;;;;;;;;GAeG;AACH;IACI;;;;;;;;;;OAUG;IACH,MAFU,MAAM,CAEN;IAEV;;OAEG;IACH,OAFU,UAAU,CAEiB;IAErC;;;;;;;;;;;;OAYG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;;;;;;;OASG;IACH,cAFW,YAAY,QAGtB;CACJ;2BAjEY,OAAO,mBAAmB,EAAE,YAAY;2BAH1B,iBAAiB"}
1
+ {"version":3,"file":"RenderExtension.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/extension/RenderExtension.js"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;;;;;;;;;;;;;;GAeG;AACH;IACI;;;;;;;;;;OAUG;IACH,MAFU,MAAM,CAEN;IAEV;;OAEG;IACH,OAFU,UAAU,CAEiB;IAErC;;;;;;;;;;;;OAYG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;;;;;;;OASG;IACH,cAFW,YAAY,QAGtB;IAED;;;;;OAKG;IACH,0BAFW,OAAO,0CAA0C,EAAE,eAAe,QAG5E;CACJ;2BA1EY,OAAO,mBAAmB,EAAE,YAAY;2BAH1B,iBAAiB"}
@@ -66,4 +66,13 @@ export class RenderExtension {
66
66
  */
67
67
  record(frame) {
68
68
  }
69
+
70
+ /**
71
+ * Offer the pipelines this extension's passes dispatch or draw with — see
72
+ * {@link PipelineEnquiry}.
73
+ *
74
+ * @param {import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
75
+ */
76
+ enquirePipelines(enquiry) {
77
+ }
69
78
  }
@@ -36,6 +36,12 @@ export class RenderExtensionRegistry {
36
36
  * @returns {number} how many extensions are registered on `phase`
37
37
  */
38
38
  count(phase: FramePhase): number;
39
+ /**
40
+ * Offer the pipelines of every registered extension, in phase and resolved order.
41
+ *
42
+ * @param {import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
43
+ */
44
+ enquirePipelines(enquiry: import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry): void;
39
45
  /**
40
46
  * Record every extension registered on `frame.phase`, in resolved order, each inside a graph
41
47
  * scope named after it.
@@ -1 +1 @@
1
- {"version":3,"file":"RenderExtensionRegistry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/extension/RenderExtensionRegistry.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;GAYG;AACH;IAqBI;;;;;;;;;OASG;IACH,iDAcC;IAED;;;;;;OAMG;IACH,oCAFa,OAAO,CAsBnB;IAED;;;OAGG;IACH,aAHW,UAAU,GACR,MAAM,CAOlB;IAED;;;;;;;;;OASG;IACH,+BA0CC;;CACJ;2BAhK4C,iBAAiB"}
1
+ {"version":3,"file":"RenderExtensionRegistry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/extension/RenderExtensionRegistry.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;GAYG;AACH;IAqBI;;;;;;;;;OASG;IACH,iDAcC;IAED;;;;;;OAMG;IACH,oCAFa,OAAO,CAsBnB;IAED;;;OAGG;IACH,aAHW,UAAU,GACR,MAAM,CAOlB;IAED;;;;OAIG;IACH,0BAFW,OAAO,0CAA0C,EAAE,eAAe,QAU5E;IAED;;;;;;;;;OASG;IACH,+BA0CC;;CACJ;2BA/K4C,iBAAiB"}
@@ -106,6 +106,21 @@ export class RenderExtensionRegistry {
106
106
  return this.#resolved[phase].length;
107
107
  }
108
108
 
109
+ /**
110
+ * Offer the pipelines of every registered extension, in phase and resolved order.
111
+ *
112
+ * @param {import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
113
+ */
114
+ enquirePipelines(enquiry) {
115
+ for (let phase = 0; phase < PHASE_COUNT; phase++) {
116
+ const extensions = this.#resolved[phase];
117
+
118
+ for (let i = 0; i < extensions.length; i++) {
119
+ extensions[i].enquirePipelines?.(enquiry);
120
+ }
121
+ }
122
+ }
123
+
109
124
  /**
110
125
  * Record every extension registered on `frame.phase`, in resolved order, each inside a graph
111
126
  * scope named after it.
@@ -131,6 +131,13 @@ export const GPU_FLUID_CASCADE_GROWTH_EXPONENT_LIMIT: number;
131
131
  * solve's inputs live in retained records, and several steps may be recorded into one graph.
132
132
  */
133
133
  export class GPUFluidCascade {
134
+ /**
135
+ * Offer the compute pipelines a cascade's step, scroll fill, and child restriction dispatch —
136
+ * see {@link PipelineEnquiry}.
137
+ *
138
+ * @param {import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
139
+ */
140
+ static enquirePipelines(enquiry: import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry): void;
134
141
  /**
135
142
  * @param {object} record
136
143
  * @param {*} _resources