@woosh/meep-engine 3.16.0 → 3.17.1

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 (431) hide show
  1. package/README.md +8 -72
  2. package/editor/particles/effect/ParticleEffectDocument.d.ts +21 -6
  3. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  4. package/editor/particles/effect/ParticleEffectDocument.js +38 -17
  5. package/editor/view/node-graph/NodeGraphClipboard.d.ts +186 -0
  6. package/editor/view/node-graph/NodeGraphClipboard.d.ts.map +1 -0
  7. package/editor/view/node-graph/NodeGraphClipboard.js +231 -0
  8. package/editor/view/node-graph/NodeGraphEditorView.d.ts +59 -1
  9. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  10. package/editor/view/node-graph/NodeGraphEditorView.js +248 -5
  11. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  12. package/editor/view/node-graph/NodeGraphView.js +84 -8
  13. package/editor/view/node-graph/actions/connection_bind_actions.d.ts +23 -0
  14. package/editor/view/node-graph/actions/connection_bind_actions.d.ts.map +1 -0
  15. package/editor/view/node-graph/actions/connection_bind_actions.js +39 -0
  16. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -1
  17. package/editor/view/particles/effect/ParticleCodeEditorView.js +4 -3
  18. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts +20 -0
  19. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -0
  20. package/editor/view/particles/effect/ParticleCurveEditorView.js +574 -0
  21. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  22. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +27 -1
  23. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts +24 -0
  24. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -0
  25. package/editor/view/particles/effect/ParticleGradientEditorView.js +472 -0
  26. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +5 -0
  27. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
  28. package/editor/view/particles/effect/ParticleGraphEditorView.js +61 -31
  29. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  30. package/editor/view/particles/effect/ParticleNodeParametersView.js +33 -0
  31. package/editor/view/particles/effect/particle-editor.css +123 -35
  32. package/package.json +1 -1
  33. package/src/core/binary/allocator/OffsetAllocator.d.ts +25 -16
  34. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  35. package/src/core/binary/allocator/OffsetAllocator.js +10 -1
  36. package/src/core/collection/array/typed/float32_array_hash.d.ts +21 -0
  37. package/src/core/collection/array/typed/float32_array_hash.d.ts.map +1 -0
  38. package/src/core/collection/array/typed/float32_array_hash.js +38 -0
  39. package/src/core/graph/csr/CSRGraph.d.ts +8 -1
  40. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  41. package/src/core/graph/csr/CSRGraph.js +14 -6
  42. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +24 -0
  43. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -1
  44. package/src/core/model/node-graph/visual/layout/LayoutProblem.js +27 -0
  45. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +26 -0
  46. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
  47. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +28 -0
  48. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +92 -3
  49. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -1
  50. package/src/core/model/node-graph/visual/layout/RouteGrid.js +405 -242
  51. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +50 -5
  52. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -1
  53. package/src/core/model/node-graph/visual/layout/RouteSearch.js +160 -24
  54. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +7 -0
  55. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -1
  56. package/src/core/model/node-graph/visual/layout/RouteSet.js +8 -0
  57. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +9 -3
  58. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -1
  59. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +7 -0
  60. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +9 -3
  61. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -1
  62. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +17 -3
  63. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +9 -6
  64. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -1
  65. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +49 -7
  66. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +11 -1
  67. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -1
  68. package/src/core/model/node-graph/visual/layout/layout_order_layers.js +135 -16
  69. package/src/core/model/node-graph/visual/layout/route_connections.d.ts +29 -0
  70. package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -1
  71. package/src/core/model/node-graph/visual/layout/route_connections.js +716 -309
  72. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +3 -2
  73. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -1
  74. package/src/core/model/node-graph/visual/layout/route_grid_build.js +7 -15
  75. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +6 -0
  76. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -1
  77. package/src/core/model/node-graph/visual/layout/route_nudge.js +42 -13
  78. package/src/engine/animation/AnimationUtils.js +246 -246
  79. package/src/engine/animation/Animations.js +74 -74
  80. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2078 -2078
  81. package/src/engine/ecs/EventType.d.ts +0 -1
  82. package/src/engine/ecs/EventType.js +1 -26
  83. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +1 -1
  84. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
  85. package/src/engine/ecs/ik/ik_write_local_rotation.js +3 -7
  86. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  87. package/src/engine/ecs/parent/EntityNode.js +4 -9
  88. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  89. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +360 -364
  90. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts +41 -0
  91. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts.map +1 -0
  92. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.js +40 -0
  93. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +8 -0
  94. package/src/engine/ecs/transform/t64_announce_change.d.ts +10 -7
  95. package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -1
  96. package/src/engine/ecs/transform/t64_announce_change.js +12 -12
  97. package/src/engine/ecs/transform/t64_set_rotation_axis_angle.d.ts +25 -0
  98. package/src/engine/ecs/transform/t64_set_rotation_axis_angle.d.ts.map +1 -0
  99. package/src/engine/ecs/transform/t64_set_rotation_axis_angle.js +45 -0
  100. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts +30 -0
  101. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts.map +1 -0
  102. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js +29 -0
  103. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  104. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +13 -21
  105. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  106. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +4 -8
  107. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  108. package/src/engine/graphics3/LightSystem.js +4 -8
  109. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  110. package/src/engine/graphics3/MeshSystem.js +9 -19
  111. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
  112. package/src/engine/graphics3/ParticleEmitterSystem.js +4 -8
  113. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  114. package/src/engine/graphics3/ShadedGeometrySystem.js +4 -10
  115. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +1 -1
  116. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
  117. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +4 -8
  118. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +218 -218
  119. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  120. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  121. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  122. package/src/engine/sound/ecs/SoundListenerSystem.js +6 -8
  123. package/src/engine/sound/simulation/AcousticSimulator.d.ts +11 -8
  124. package/src/engine/sound/simulation/AcousticSimulator.d.ts.map +1 -1
  125. package/src/engine/sound/simulation/AcousticSimulator.js +45 -36
  126. package/src/engine/sound/simulation/README.md +2 -2
  127. package/src/engine/sound/simulation/core/OcclusionSolver.d.ts.map +1 -1
  128. package/src/engine/sound/simulation/core/VolumeField.d.ts +9 -9
  129. package/src/engine/sound/simulation/core/VolumeField.d.ts.map +1 -1
  130. package/src/engine/sound/simulation/core/VolumeField.js +29 -13
  131. package/src/engine/sound/simulation/core/acoustic_occlusion_solve.d.ts +31 -0
  132. package/src/engine/sound/simulation/core/acoustic_occlusion_solve.d.ts.map +1 -0
  133. package/src/engine/sound/simulation/core/acoustic_occlusion_solve.js +134 -0
  134. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +0 -4
  135. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
  136. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +5 -11
  137. package/src/shade/playground/particle_editor/README.md +43 -2
  138. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  139. package/src/shade/playground/particle_system/particle_prototype.js +4 -5
  140. package/src/shade/playground/particle_system/particle_scene.js +4 -4
  141. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  142. package/src/shade/playground/volumetrics_froxel/main.js +6 -1
  143. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  144. package/src/shade/renderer/Renderer.js +13 -1
  145. package/src/shade/renderer/particles/DESIGN.md +104 -19
  146. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +64 -50
  147. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  148. package/src/shade/renderer/particles/GPUParticleSystem.js +176 -78
  149. package/src/shade/renderer/particles/ParticleConstants.d.ts +59 -23
  150. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  151. package/src/shade/renderer/particles/ParticleConstants.js +66 -23
  152. package/src/shade/renderer/particles/ParticleRenderMode.d.ts +19 -0
  153. package/src/shade/renderer/particles/ParticleRenderMode.d.ts.map +1 -0
  154. package/src/shade/renderer/particles/ParticleRenderMode.js +33 -0
  155. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +167 -166
  157. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts +37 -0
  158. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -0
  159. package/src/shade/renderer/particles/data/particle_emitter_record.js +109 -0
  160. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +3 -3
  161. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -303
  162. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +18 -0
  163. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  164. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -133
  165. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +0 -11
  166. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  167. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -621
  168. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  169. package/src/shade/renderer/particles/graph/compile_particle_graph.js +8 -3
  170. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -1
  171. package/src/shade/renderer/particles/graph/flatten_particle_graph.js +244 -213
  172. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
  173. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +6 -0
  174. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
  175. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +294 -319
  176. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -1
  177. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +524 -517
  178. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts +22 -0
  179. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts.map +1 -0
  180. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.js +517 -0
  181. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
  182. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +185 -159
  183. package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -1
  184. package/src/shade/renderer/particles/graph/make_particle_group.js +2 -20
  185. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts +17 -0
  186. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts.map +1 -0
  187. package/src/shade/renderer/particles/graph/particle_compare_ops.js +22 -0
  188. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +28 -8
  189. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -1
  190. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +49 -25
  191. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +40 -0
  192. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  193. package/src/shade/renderer/particles/graph/particle_node_parameters.js +312 -234
  194. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  195. package/src/shade/renderer/particles/graph/particle_node_presentation.js +59 -3
  196. package/src/shade/renderer/particles/graph/particle_ramp.d.ts +230 -0
  197. package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -0
  198. package/src/shade/renderer/particles/graph/particle_ramp.js +403 -0
  199. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +7 -1
  200. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  201. package/src/shade/renderer/particles/graph/validate_particle_graph.js +66 -10
  202. package/src/shade/renderer/particles/graph_particles.d.ts +23 -69
  203. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  204. package/src/shade/renderer/particles/graph_particles.js +105 -262
  205. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  206. package/src/shade/renderer/particles/graph_particles_avboit.js +3 -2
  207. package/src/shade/renderer/particles/graph_particles_billboard.d.ts +37 -0
  208. package/src/shade/renderer/particles/graph_particles_billboard.d.ts.map +1 -0
  209. package/src/shade/renderer/particles/graph_particles_billboard.js +93 -0
  210. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +51 -22
  211. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  212. package/src/shade/renderer/particles/isa/InstructionStream.js +98 -38
  213. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +49 -8
  214. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  215. package/src/shade/renderer/particles/isa/ParticleProgram.js +95 -150
  216. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +306 -64
  217. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  218. package/src/shade/renderer/particles/isa/ParticleVMISA.js +505 -136
  219. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +36 -12
  220. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  221. package/src/shade/renderer/particles/isa/particle_assembly.js +354 -139
  222. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts +9 -0
  223. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts.map +1 -0
  224. package/src/shade/renderer/particles/isa/validate_particle_program.js +128 -0
  225. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +23 -0
  226. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  227. package/src/shade/renderer/particles/layout/ParticleLayout.js +68 -0
  228. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts +77 -0
  229. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -0
  230. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +219 -0
  231. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts +83 -0
  232. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -0
  233. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +283 -0
  234. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +133 -0
  235. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts.map +1 -0
  236. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +334 -0
  237. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts +117 -0
  238. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts.map +1 -0
  239. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +70 -0
  240. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts +97 -0
  241. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts.map +1 -0
  242. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +462 -0
  243. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts +116 -0
  244. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts.map +1 -0
  245. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +687 -0
  246. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +57 -0
  247. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts.map +1 -0
  248. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +860 -0
  249. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts +115 -0
  250. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts.map +1 -0
  251. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.js +264 -0
  252. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +81 -42
  253. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
  254. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +477 -478
  255. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +100 -0
  256. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts.map +1 -0
  257. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +236 -0
  258. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +139 -59
  259. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
  260. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +764 -647
  261. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +40 -7
  262. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  263. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +376 -213
  264. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +30 -3
  265. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
  266. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +337 -223
  267. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +24 -38
  268. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  269. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +166 -206
  270. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts +99 -0
  271. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -0
  272. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +313 -0
  273. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +3 -2
  274. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
  275. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +198 -197
  276. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
  277. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +19 -0
  278. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  279. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +678 -561
  280. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts +22 -0
  281. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -0
  282. package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +221 -0
  283. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  284. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +63 -72
  285. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  286. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +87 -86
  287. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  288. package/src/shade/renderer/particles/optimizer/pass_peephole.js +392 -271
  289. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  290. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +361 -268
  291. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts +4 -0
  292. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -0
  293. package/src/shade/renderer/particles/optimizer/pass_schedule.js +244 -0
  294. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  295. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +154 -151
  296. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +20 -0
  297. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -1
  298. package/src/shade/renderer/particles/particle_test_fixtures.js +229 -203
  299. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +99 -25
  300. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  301. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +438 -286
  302. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +109 -0
  303. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -0
  304. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +127 -0
  305. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +87 -102
  306. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  307. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +184 -163
  308. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +130 -0
  309. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -0
  310. package/src/shade/renderer/particles/runtime/ProgramHeap.js +595 -0
  311. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts +91 -0
  312. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts.map +1 -0
  313. package/src/shade/renderer/particles/runtime/ProgramPlacement.js +106 -0
  314. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +5 -2
  315. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  316. package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -19
  317. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts +28 -0
  318. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts.map +1 -0
  319. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.js +136 -0
  320. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts +35 -0
  321. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts.map +1 -0
  322. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.js +133 -0
  323. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -9
  324. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  325. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +20 -80
  326. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts +33 -0
  327. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -0
  328. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +114 -0
  329. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +8 -0
  330. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  331. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +33 -101
  332. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts +45 -0
  333. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -0
  334. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +123 -0
  335. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts +51 -0
  336. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts.map +1 -0
  337. package/src/shade/renderer/particles/sort/graph_particle_sort.js +120 -0
  338. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts +6 -0
  339. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -0
  340. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +16 -0
  341. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +4 -1
  342. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  343. package/src/shade/renderer/particles/vm/ParticleVMReference.js +261 -140
  344. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  345. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +217 -255
  346. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts +43 -0
  347. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts.map +1 -0
  348. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.js +55 -0
  349. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts +62 -0
  350. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts.map +1 -0
  351. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.js +86 -0
  352. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts +22 -0
  353. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts.map +1 -0
  354. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.js +32 -0
  355. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts +9 -0
  356. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts.map +1 -0
  357. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.js +19 -0
  358. package/src/shade/renderer/shader/chunk/noise/psrdnoise/README.md +65 -0
  359. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts +24 -0
  360. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts.map +1 -0
  361. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.js +83 -0
  362. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts +25 -0
  363. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts.map +1 -0
  364. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.js +42 -0
  365. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts +31 -0
  366. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts.map +1 -0
  367. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.js +80 -0
  368. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts +26 -0
  369. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts.map +1 -0
  370. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.js +109 -0
  371. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts +38 -0
  372. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts.map +1 -0
  373. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.js +129 -0
  374. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts +21 -0
  375. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts.map +1 -0
  376. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.js +35 -0
  377. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts +19 -0
  378. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts.map +1 -0
  379. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.js +28 -0
  380. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts +13 -0
  381. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts.map +1 -0
  382. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.js +22 -0
  383. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts +22 -0
  384. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts.map +1 -0
  385. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.js +59 -0
  386. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts +23 -0
  387. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts.map +1 -0
  388. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.js +74 -0
  389. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +7 -0
  390. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  391. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +7 -0
  392. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts +34 -1
  393. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts.map +1 -1
  394. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +41 -1
  395. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -2
  396. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  397. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -10
  398. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  399. package/src/view/minimap/dom/MinimapCameraView.js +4 -9
  400. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts +0 -15
  401. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts.map +0 -1
  402. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts +0 -45
  403. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts.map +0 -1
  404. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts +0 -24
  405. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts.map +0 -1
  406. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts +0 -19
  407. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
  408. package/src/engine/ecs/transform/__probe.d.ts +0 -4
  409. package/src/engine/ecs/transform/__probe.d.ts.map +0 -1
  410. package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
  411. package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
  412. package/src/engine/sound/simulation/core/OcclusionSolver.js +0 -112
  413. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +0 -27
  414. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +0 -1
  415. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts +0 -14
  416. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +0 -1
  417. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +0 -156
  418. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +0 -1
  419. package/src/shade/renderer/particles/runtime/Emitter.d.ts +0 -219
  420. package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +0 -1
  421. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +0 -77
  422. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
  423. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +0 -89
  424. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +0 -1
  425. package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -155
  426. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +0 -15
  427. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +0 -1
  428. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts +0 -34
  429. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts.map +0 -1
  430. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +0 -32
  431. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"compile_particle_graph.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/graph/compile_particle_graph.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,2EAHW,iBAAiB,UACjB,OAAO,6BAA6B,EAAE,cAAc,QAmB9D;AA8PD;;;;;;;;GAQG;AACH;IAL8B,IAAI;IACJ,MAAM;IACoC,MAAM,EAAnE,OAAO,6BAA6B,EAAE,cAAc;IAClD,OAAO,2BAA2B,EAAE,eAAe,CAa/D;kCArUiC,6BAA6B"}
1
+ {"version":3,"file":"compile_particle_graph.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/graph/compile_particle_graph.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,2EAHW,iBAAiB,UACjB,OAAO,6BAA6B,EAAE,cAAc,QAmB9D;AAkQD;;;;;;;;GAQG;AACH;IAL8B,IAAI;IACJ,MAAM;IACoC,MAAM,EAAnE,OAAO,6BAA6B,EAAE,cAAc;IAClD,OAAO,2BAA2B,EAAE,eAAe,CAa/D;kCA1UiC,6BAA6B"}
@@ -1,6 +1,7 @@
1
1
  import { PARTICLE_VM_REGISTER_SLOTS } from "../ParticleConstants.js";
2
2
  import { ParticleAssembler } from "../isa/ParticleAssembler.js";
3
3
  import { VM_MAX_WIDTH } from "../isa/ParticleVMISA.js";
4
+ import { validate_particle_program } from "../isa/validate_particle_program.js";
4
5
  import { flatten_particle_graph } from "./flatten_particle_graph.js";
5
6
  import { infer_particle_graph_types } from "./infer_particle_graph_types.js";
6
7
 
@@ -115,9 +116,13 @@ function lower(graph, stream, asm, layout) {
115
116
  ));
116
117
 
117
118
  if (out === -1) {
119
+ // The ISA's ceiling, not a shader's. A program that needs more than the fast
120
+ // interpreter's file has already been dealt with by the time it gets here — the
121
+ // runtime picks the wide interpreter for it — so reaching this is a graph too big
122
+ // for anything an instruction can address.
118
123
  throw new Error(
119
- `Particle graph exceeds the VM register file: no run of ${span} free slots in ` +
120
- `${PARTICLE_VM_REGISTER_SLOTS}. Simplify the effect or split it.`
124
+ `Particle graph exceeds what a VM instruction can address: no run of ${span} free ` +
125
+ `register slots in ${PARTICLE_VM_REGISTER_SLOTS}. Simplify the effect or split it.`
121
126
  );
122
127
  }
123
128
 
@@ -322,7 +327,7 @@ export function compile_particle_effect({ init, update, layout }) {
322
327
  compile_particle_graph(update, asm.update, asm, layout);
323
328
  }
324
329
  const program = asm.build();
325
- program.validate();
330
+ validate_particle_program(program);
326
331
  return program;
327
332
  }
328
333
 
@@ -1 +1 @@
1
- {"version":3,"file":"flatten_particle_graph.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/graph/flatten_particle_graph.js"],"names":[],"mappings":"AA6CA;;;;;;GAMG;AACH;IAJ4B,UAAU,GAA3B,MAAM;cAgChB"}
1
+ {"version":3,"file":"flatten_particle_graph.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/graph/flatten_particle_graph.js"],"names":[],"mappings":"AA+FA;;;;;;GAMG;AACH;IAJ4B,UAAU,GAA3B,MAAM;cAgChB"}
@@ -1,213 +1,244 @@
1
- import { is_particle_group_node } from "./ParticleNodeGroup.js";
2
-
3
- /**
4
- * Replace every node group in a graph with the nodes it is made of, until none is left.
5
- *
6
- * The step that lets {@link ./ParticleNodeGroup.js groups} exist at all. Everything downstream of
7
- * here — type resolution, register allocation, lowering — works on one flat expression over the
8
- * stock library, exactly as it did before there were groups, and a group therefore costs precisely
9
- * what its contents cost. There is no call, no frame, and nothing to pay for the abstraction with.
10
- *
11
- * ## What happens to the wires
12
- *
13
- * A group node's ports are wires to nothing — the work is inside. So each is re-made against what
14
- * was on the other side of the boundary:
15
- *
16
- * - a wire *into* the group's input `p` is re-made to every node inside that read the input block's
17
- * `p`,
18
- * - a wire *out of* the group's output `q` is re-made from whatever inside wrote the output block's
19
- * `q`,
20
- * - and where the two meet — the input block wired straight to the output block, a group that passes
21
- * a value through — the outer source is joined directly to the outer targets, and nothing of the
22
- * group survives at all.
23
- *
24
- * A group input with nothing wired to it leaves its inner consumers unbound, which is the same
25
- * problem stated one level down and is what the compiler already refuses. A group output nobody
26
- * reads leaves its producer unreachable, which is what the compiler already drops.
27
- *
28
- * ## One level at a time
29
- *
30
- * Nesting is handled by repeating rather than by recursing: inlining a group can only introduce
31
- * group nodes that were in its body, and the next pass takes those. It terminates because a group's
32
- * body can only reference groups that already existed when it was built, so the reference graph is
33
- * acyclic — see {@link ParticleNodeGroup}. The pass cap is a backstop against a library assembled
34
- * some other way, not the reason this finishes.
35
- */
36
-
37
- /**
38
- * How many rounds of inlining to allow. Each round opens one level of nesting, so this is a limit on
39
- * how deeply groups may be stacked — far past anything an author would build, and low enough that a
40
- * library that somehow does contain a cycle fails with a sentence instead of a hung tab.
41
- *
42
- * @type {number}
43
- */
44
- const MAX_INLINE_PASSES = 32;
45
-
46
- /**
47
- * @param {NodeGraph} graph
48
- * @param {object} [options]
49
- * @param {number} [options.max_passes] see {@link MAX_INLINE_PASSES}
50
- * @returns {NodeGraph} a graph with no group nodes in it — `graph` itself when it had none, and a
51
- * separate graph otherwise. The input is never modified.
52
- */
53
- export function flatten_particle_graph(graph, { max_passes = MAX_INLINE_PASSES } = {}) {
54
- if (!graph.getNodes().some(is_particle_group_node)) {
55
- // Nothing to open. Returned as-is rather than copied, so that a graph without groups is
56
- // compiled under the ids the author sees — which is what every diagnostic naming a node
57
- // depends on.
58
- return graph;
59
- }
60
-
61
- const flat = graph.clone();
62
-
63
- for (let pass = 0; ; pass++) {
64
- const groups = flat.getNodes().filter(is_particle_group_node);
65
-
66
- if (groups.length === 0) {
67
- return flat;
68
- }
69
-
70
- if (pass >= max_passes) {
71
- throw new Error(
72
- `Node groups are nested more than ${max_passes} deep, or a group contains itself. `
73
- + `'${groups[0].description.name}' is still unopened after ${max_passes} passes.`
74
- );
75
- }
76
-
77
- for (const node of groups) {
78
- inline_group(flat, node);
79
- }
80
- }
81
- }
82
-
83
- /**
84
- * Splice one group instance's body into the graph around it, and remove the instance.
85
- *
86
- * @param {NodeGraph} graph the graph being flattened, modified in place
87
- * @param {NodeInstance} node the group instance
88
- */
89
- function inline_group(graph, node) {
90
- const group = node.description.group;
91
- const body = group.graph;
92
-
93
- // What the group is wired to, read before anything is taken apart.
94
-
95
- /** @type {Map<string, {node: number, port: number}>} group input port name -> the outer source */
96
- const sources = new Map();
97
-
98
- for (const connection of node.inConnections) {
99
- const name = connection.target.port.name;
100
-
101
- if (sources.has(name)) {
102
- // More than one source on an input is a graph the validator already refuses; taking the
103
- // first keeps flattening total rather than adding a second opinion about it.
104
- continue;
105
- }
106
-
107
- sources.set(name, { node: connection.source.instance.id, port: connection.source.port.id });
108
- }
109
-
110
- /** @type {Map<string, Array<{node: number, port: number}>>} group output port name -> outer targets */
111
- const targets = new Map();
112
-
113
- for (const connection of node.outConnections) {
114
- const name = connection.source.port.name;
115
-
116
- const listed = targets.get(name) ?? [];
117
-
118
- listed.push({ node: connection.target.instance.id, port: connection.target.port.id });
119
-
120
- targets.set(name, listed);
121
- }
122
-
123
- // A copy of every node in the body, boundary blocks excepted: those are the group's edge, and
124
- // the edge is what is being dissolved.
125
-
126
- /** @type {Map<number, NodeInstance>} body node id -> its copy in `graph` */
127
- const copies = new Map();
128
-
129
- for (const inner of body.getNodes()) {
130
- if (inner === group.inputNode || inner === group.outputNode) {
131
- continue;
132
- }
133
-
134
- const copy = graph.getNodeSafe(graph.createNode(inner.description));
135
-
136
- copy.setParameters(clone_parameters(inner.parameters));
137
-
138
- copies.set(inner.id, copy);
139
- }
140
-
141
- for (const connection of body.getConnections()) {
142
- const from = connection.source;
143
- const to = connection.target;
144
-
145
- const from_boundary = from.instance === group.inputNode;
146
- const to_boundary = to.instance === group.outputNode;
147
-
148
- if (from_boundary && to_boundary) {
149
- // straight through: the group contributes nothing but a rename
150
- const source = sources.get(from.port.name);
151
-
152
- for (const target of targets.get(to.port.name) ?? []) {
153
- if (source !== undefined) {
154
- graph.createConnection(source.node, source.port, target.node, target.port);
155
- }
156
- }
157
-
158
- continue;
159
- }
160
-
161
- if (from_boundary) {
162
- const source = sources.get(from.port.name);
163
-
164
- if (source !== undefined) {
165
- const target = copies.get(to.instance.id);
166
-
167
- graph.createConnection(source.node, source.port, target.id, to.port.id);
168
- }
169
-
170
- continue;
171
- }
172
-
173
- if (to_boundary) {
174
- const source = copies.get(from.instance.id);
175
-
176
- for (const target of targets.get(to.port.name) ?? []) {
177
- graph.createConnection(source.id, from.port.id, target.node, target.port);
178
- }
179
-
180
- continue;
181
- }
182
-
183
- graph.createConnection(
184
- copies.get(from.instance.id).id, from.port.id,
185
- copies.get(to.instance.id).id, to.port.id
186
- );
187
- }
188
-
189
- // takes the group's own wires with it; every one of them has been re-made above
190
- graph.deleteNode(node.id);
191
- }
192
-
193
- /**
194
- * A node's parameters, deep enough that the copy and the original cannot write through to each
195
- * other. Values are numbers, strings, and arrays of numbers.
196
- *
197
- * A body's node is the template for every instance of its group, so sharing an array between them
198
- * would make an edit to one instance an edit to all of them — including the definition itself.
199
- *
200
- * @param {object} parameters
201
- * @returns {object}
202
- */
203
- function clone_parameters(parameters) {
204
- const result = {};
205
-
206
- for (const key of Object.keys(parameters)) {
207
- const value = parameters[key];
208
-
209
- result[key] = Array.isArray(value) ? value.slice() : value;
210
- }
211
-
212
- return result;
213
- }
1
+ import { clone_particle_parameters } from "./particle_node_parameters.js";
2
+ import { is_particle_group_node } from "./ParticleNodeGroup.js";
3
+
4
+ /**
5
+ * Replace every node group in a graph with the nodes it is made of, until none is left.
6
+ *
7
+ * The step that lets {@link ./ParticleNodeGroup.js groups} exist at all. Everything downstream of
8
+ * here — type resolution, register allocation, lowering — works on one flat expression over the
9
+ * stock library, exactly as it did before there were groups, and a group therefore costs precisely
10
+ * what its contents cost. There is no call, no frame, and nothing to pay for the abstraction with.
11
+ *
12
+ * ## What happens to the wires
13
+ *
14
+ * A group node's ports are wires to nothing — the work is inside. So each is re-made against what
15
+ * was on the other side of the boundary:
16
+ *
17
+ * - a wire *into* the group's input `p` is re-made to every node inside that read the input block's
18
+ * `p`,
19
+ * - a wire *out of* the group's output `q` is re-made from whatever inside wrote the output block's
20
+ * `q`,
21
+ * - and where the two meet — the input block wired straight to the output block, a group that passes
22
+ * a value through — the outer source is joined directly to the outer targets, and nothing of the
23
+ * group survives at all.
24
+ *
25
+ * A group input with nothing wired to it leaves its inner consumers unbound, which is the same
26
+ * problem stated one level down and is what the compiler already refuses. A group output nobody
27
+ * reads leaves its producer unreachable, which is what the compiler already drops.
28
+ *
29
+ * ## Nodes that build their own body
30
+ *
31
+ * A handful of types are not groups but are made of other nodes all the same — a gradient, a curve —
32
+ * and their body depends on their own parameters, so there is no shared one for a group to hold.
33
+ * They declare {@link ./ParticleNodeDescription.js ParticleNodeDescription#expand} and are opened
34
+ * here by exactly the same splice: what `expand` returns is a group, built on the spot, and once it
35
+ * is spliced in nothing tells the two apart. They do not nest — an expansion is built out of stock
36
+ * types — but nothing here depends on that.
37
+ *
38
+ * ## One level at a time
39
+ *
40
+ * Nesting is handled by repeating rather than by recursing: inlining a group can only introduce
41
+ * group nodes that were in its body, and the next pass takes those. It terminates because a group's
42
+ * body can only reference groups that already existed when it was built, so the reference graph is
43
+ * acyclic — see {@link ParticleNodeGroup}. The pass cap is a backstop against a library assembled
44
+ * some other way, not the reason this finishes.
45
+ */
46
+
47
+ /**
48
+ * Whether a node is made of other nodes, and so is something this has to open.
49
+ *
50
+ * Two kinds are. A {@link ./ParticleNodeGroup.js group} *has* a body — one body, shared by every
51
+ * instance of it. An expanding type *builds* one from the instance's own parameters, because there
52
+ * is no single body a gradient with any number of stops could share. Asked before
53
+ * {@link body_of}, and separately from it, because answering it for an expanding node is free and
54
+ * building the body is not.
55
+ *
56
+ * @param {NodeInstance} node
57
+ * @returns {boolean}
58
+ */
59
+ function is_compound(node) {
60
+ return is_particle_group_node(node) || typeof node.description?.expand === "function";
61
+ }
62
+
63
+ /**
64
+ * The body one node stands for. Everything past this point treats the two kinds identically: what
65
+ * comes back is a group, and it is spliced in the same way.
66
+ *
67
+ * @param {NodeInstance} node one {@link is_compound} holds for
68
+ * @returns {import("./ParticleNodeGroup.js").ParticleNodeGroup}
69
+ */
70
+ function body_of(node) {
71
+ if (is_particle_group_node(node)) {
72
+ return node.description.group;
73
+ }
74
+
75
+ const group = node.description.expand(node.parameters);
76
+
77
+ if (group === null || group === undefined) {
78
+ throw new Error(
79
+ `'${node.description.name}' declares an expansion and node ${node.id} produced none; `
80
+ + "a type that expands has to expand for every parameter value it accepts."
81
+ );
82
+ }
83
+
84
+ return group;
85
+ }
86
+
87
+ /**
88
+ * How many rounds of inlining to allow. Each round opens one level of nesting, so this is a limit on
89
+ * how deeply groups may be stacked — far past anything an author would build, and low enough that a
90
+ * library that somehow does contain a cycle fails with a sentence instead of a hung tab.
91
+ *
92
+ * @type {number}
93
+ */
94
+ const MAX_INLINE_PASSES = 32;
95
+
96
+ /**
97
+ * @param {NodeGraph} graph
98
+ * @param {object} [options]
99
+ * @param {number} [options.max_passes] see {@link MAX_INLINE_PASSES}
100
+ * @returns {NodeGraph} a graph with no group nodes in it — `graph` itself when it had none, and a
101
+ * separate graph otherwise. The input is never modified.
102
+ */
103
+ export function flatten_particle_graph(graph, { max_passes = MAX_INLINE_PASSES } = {}) {
104
+ if (!graph.getNodes().some(is_compound)) {
105
+ // Nothing to open. Returned as-is rather than copied, so that a graph without groups is
106
+ // compiled under the ids the author sees — which is what every diagnostic naming a node
107
+ // depends on.
108
+ return graph;
109
+ }
110
+
111
+ const flat = graph.clone();
112
+
113
+ for (let pass = 0; ; pass++) {
114
+ const compound = flat.getNodes().filter(is_compound);
115
+
116
+ if (compound.length === 0) {
117
+ return flat;
118
+ }
119
+
120
+ if (pass >= max_passes) {
121
+ throw new Error(
122
+ `Node groups are nested more than ${max_passes} deep, or a group contains itself. `
123
+ + `'${compound[0].description.name}' is still unopened after ${max_passes} passes.`
124
+ );
125
+ }
126
+
127
+ for (const node of compound) {
128
+ inline_group(flat, node, body_of(node));
129
+ }
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Splice one group instance's body into the graph around it, and remove the instance.
135
+ *
136
+ * @param {NodeGraph} graph the graph being flattened, modified in place
137
+ * @param {NodeInstance} node the group instance
138
+ * @param {import("./ParticleNodeGroup.js").ParticleNodeGroup} group the body it stands for
139
+ */
140
+ function inline_group(graph, node, group) {
141
+ const body = group.graph;
142
+
143
+ // What the group is wired to, read before anything is taken apart.
144
+
145
+ /** @type {Map<string, {node: number, port: number}>} group input port name -> the outer source */
146
+ const sources = new Map();
147
+
148
+ for (const connection of node.inConnections) {
149
+ const name = connection.target.port.name;
150
+
151
+ if (sources.has(name)) {
152
+ // More than one source on an input is a graph the validator already refuses; taking the
153
+ // first keeps flattening total rather than adding a second opinion about it.
154
+ continue;
155
+ }
156
+
157
+ sources.set(name, { node: connection.source.instance.id, port: connection.source.port.id });
158
+ }
159
+
160
+ /** @type {Map<string, Array<{node: number, port: number}>>} group output port name -> outer targets */
161
+ const targets = new Map();
162
+
163
+ for (const connection of node.outConnections) {
164
+ const name = connection.source.port.name;
165
+
166
+ const listed = targets.get(name) ?? [];
167
+
168
+ listed.push({ node: connection.target.instance.id, port: connection.target.port.id });
169
+
170
+ targets.set(name, listed);
171
+ }
172
+
173
+ // A copy of every node in the body, boundary blocks excepted: those are the group's edge, and
174
+ // the edge is what is being dissolved.
175
+
176
+ /** @type {Map<number, NodeInstance>} body node id -> its copy in `graph` */
177
+ const copies = new Map();
178
+
179
+ for (const inner of body.getNodes()) {
180
+ if (inner === group.inputNode || inner === group.outputNode) {
181
+ continue;
182
+ }
183
+
184
+ const copy = graph.getNodeSafe(graph.createNode(inner.description));
185
+
186
+ // A body's node is the template for every instance of its group, so sharing anything mutable
187
+ // with it would make an edit to one instance an edit to all of them — the definition
188
+ // included.
189
+ copy.setParameters(clone_particle_parameters(inner.parameters));
190
+
191
+ copies.set(inner.id, copy);
192
+ }
193
+
194
+ for (const connection of body.getConnections()) {
195
+ const from = connection.source;
196
+ const to = connection.target;
197
+
198
+ const from_boundary = from.instance === group.inputNode;
199
+ const to_boundary = to.instance === group.outputNode;
200
+
201
+ if (from_boundary && to_boundary) {
202
+ // straight through: the group contributes nothing but a rename
203
+ const source = sources.get(from.port.name);
204
+
205
+ for (const target of targets.get(to.port.name) ?? []) {
206
+ if (source !== undefined) {
207
+ graph.createConnection(source.node, source.port, target.node, target.port);
208
+ }
209
+ }
210
+
211
+ continue;
212
+ }
213
+
214
+ if (from_boundary) {
215
+ const source = sources.get(from.port.name);
216
+
217
+ if (source !== undefined) {
218
+ const target = copies.get(to.instance.id);
219
+
220
+ graph.createConnection(source.node, source.port, target.id, to.port.id);
221
+ }
222
+
223
+ continue;
224
+ }
225
+
226
+ if (to_boundary) {
227
+ const source = copies.get(from.instance.id);
228
+
229
+ for (const target of targets.get(to.port.name) ?? []) {
230
+ graph.createConnection(source.id, from.port.id, target.node, target.port);
231
+ }
232
+
233
+ continue;
234
+ }
235
+
236
+ graph.createConnection(
237
+ copies.get(from.instance.id).id, from.port.id,
238
+ copies.get(to.instance.id).id, to.port.id
239
+ );
240
+ }
241
+
242
+ // takes the group's own wires with it; every one of them has been re-made above
243
+ graph.deleteNode(node.id);
244
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"particle_builtin_groups.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/particles/graph/groups/particle_builtin_groups.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;GAQG;AACH,sCAFU,OAAO,yBAAyB,EAAE,iBAAiB,EAAE,CAuB7D"}
1
+ {"version":3,"file":"particle_builtin_groups.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/particles/graph/groups/particle_builtin_groups.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;GAQG;AACH,sCAFU,OAAO,yBAAyB,EAAE,iBAAiB,EAAE,CAyB7D"}
@@ -13,6 +13,10 @@ import {
13
13
  PARTICLE_GROUP_SIMPLEX_3,
14
14
  PARTICLE_GROUP_SIMPLEX_4,
15
15
  } from "./particle_groups_noise.js";
16
+ import {
17
+ PARTICLE_GROUP_PSRDNOISE_3,
18
+ PARTICLE_GROUP_SRDNOISE_3,
19
+ } from "./particle_groups_psrdnoise.js";
16
20
  import {
17
21
  PARTICLE_GROUP_CEIL,
18
22
  PARTICLE_GROUP_DECOMPOSE,
@@ -66,6 +70,8 @@ export const PARTICLE_BUILTIN_GROUPS = [
66
70
  // the expensive ones
67
71
  PARTICLE_GROUP_SIMPLEX_3,
68
72
  PARTICLE_GROUP_SIMPLEX_4,
73
+ PARTICLE_GROUP_SRDNOISE_3,
74
+ PARTICLE_GROUP_PSRDNOISE_3,
69
75
  PARTICLE_GROUP_CURL_3,
70
76
  PARTICLE_GROUP_CURL_4,
71
77
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"particle_groups_geometry.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/particles/graph/groups/particle_groups_geometry.js"],"names":[],"mappings":"AA8DA;;;;;;;;;;;GAWG;AACH,mDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAsBxD;AAEL;;;;;;;;;GASG;AACH,kDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAmBxD;AAEL;;;;;;;;;;;;GAYG;AACH,2CAFU,OAAO,yBAAyB,EAAE,iBAAiB,EAAE,CAiB5D;AAEH;;;;;;;;GAQG;AACH,kDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAsBxD;AAEL;;;;;;;;;;;GAWG;AACH,yCAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAuBxD;AAEL;;;;;;;;;;;;;;;;;;;GAmBG;AACH,gDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CA+ExD"}
1
+ {"version":3,"file":"particle_groups_geometry.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/particles/graph/groups/particle_groups_geometry.js"],"names":[],"mappings":"AAqCA;;;;;;;;;;;GAWG;AACH,mDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAsBxD;AAEL;;;;;;;;;GASG;AACH,kDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAmBxD;AAEL;;;;;;;;;;;;GAYG;AACH,2CAFU,OAAO,yBAAyB,EAAE,iBAAiB,EAAE,CAiB5D;AAEH;;;;;;;;GAQG;AACH,kDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAsBxD;AAEL;;;;;;;;;;;GAWG;AACH,yCAFU,OAAO,yBAAyB,EAAE,iBAAiB,CAuBxD;AAEL;;;;;;;;;;;;;;;;;;;GAmBG;AACH,gDAFU,OAAO,yBAAyB,EAAE,iBAAiB,CA+ExD"}