@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,234 +1,312 @@
1
- import { VM_BUILTIN } from "../isa/ParticleVMISA.js";
2
- import { PARTICLE_COMPARE_OPCODES, particle_node_descriptions } from "./ParticleNodeRegistry.js";
3
- import { PARTICLE_VALUE_TYPES } from "./ParticleValueType.js";
4
-
5
- /**
6
- * What each particle node type's static parameters *are* — the contract between the `emit` closures
7
- * in {@link ./ParticleNodeRegistry.js}, which read `context.parameters.<name>`, and anything that
8
- * has to produce those parameters without being told: an editor building controls, a default-value
9
- * factory, a serializer checking an authored graph.
10
- *
11
- * The engine's generic {@link ../../../../core/model/node-graph/node/NodeDescription.js} parameter
12
- * mechanism is not used for these. Its parameters are keyed by a numeric id and typed as
13
- * number / string / boolean, and a particle node's are keyed by name and are vectors, layout
14
- * attribute references, ISA enum members and swizzle patterns. Rather than flatten them into three
15
- * scalar types and lose what they mean, they are described here in their own terms, and the editor
16
- * renders a control per kind.
17
- *
18
- * Living beside the node library rather than in the editor is what keeps the two honest:
19
- * {@link ./particle_node_parameters.spec.js} asserts that every registered type is described here,
20
- * and that a node built from nothing but these defaults compiles.
21
- */
22
-
23
- /**
24
- * The kinds of value a particle node parameter can hold.
25
- * @enum {string}
26
- */
27
- export const PARTICLE_PARAMETER_KIND = Object.freeze({
28
- /** one to four floats; how many there are is the value's type, a scalar or a `vec2..4` */
29
- VECTOR: "vector",
30
- /** four floats that are a colour: red, green, blue and alpha, each in `[0, 1]` */
31
- COLOR: "color",
32
- /** the name of an attribute in the effect's {@link ../layout/ParticleLayout.js} */
33
- ATTRIBUTE: "attribute",
34
- /** one member of {@link PARTICLE_NODE_PARAMETER_SCHEMA}'s `options` map */
35
- ENUM: "enum",
36
- /** one to four lane selectors in `[0, 4)`, one per output lane */
37
- SWIZZLE: "swizzle",
38
- /** a non-negative integer — a curve handle */
39
- INTEGER: "integer",
40
- });
41
-
42
- /**
43
- * One parameter of one node type.
44
- *
45
- * @typedef {object} ParticleNodeParameter
46
- * @property {string} name the key the node's `emit` reads off `context.parameters`
47
- * @property {string} kind a {@link PARTICLE_PARAMETER_KIND}
48
- * @property {*} [default] the value a freshly created node takes; absent for
49
- * {@link PARTICLE_PARAMETER_KIND.ATTRIBUTE}, whose default can only come from the effect's layout
50
- * @property {Object<string, *>} [options] for {@link PARTICLE_PARAMETER_KIND.ENUM}: label -> value
51
- * @property {string} [description] one line of help, shown by the editor
52
- */
53
-
54
- /**
55
- * The node types whose whole configuration is their wiring — every arithmetic, vector and logic
56
- * operation, plus the two sinks that take only a value.
57
- *
58
- * Listed rather than inferred so that "takes no parameters" is a claim someone made, and a node
59
- * type added to the library without a word about its parameters is caught by
60
- * {@link ./particle_node_parameters.spec.js} instead of silently reading as taking none.
61
- *
62
- * @type {string[]}
63
- */
64
- export const PARTICLE_NODES_WITHOUT_PARAMETERS = Object.freeze([
65
- "kill",
66
- "add", "sub", "mul", "div", "min", "max", "pow", "step",
67
- "mad", "mix", "clamp", "smoothstep", "scale",
68
- "neg", "abs", "floor", "fract", "sqrt", "sin", "cos", "exp", "log", "normalize", "length",
69
- "dot", "cross", "distance",
70
- "vec2", "vec3", "vec4",
71
- "select",
72
- ]);
73
-
74
- /**
75
- * A lane count offered as a type: what a `random` is asked to be, and what a literal's width picker
76
- * says. Labelled by the type's name, valued by its width.
77
- *
78
- * @type {Object<string, number>}
79
- */
80
- export const PARTICLE_WIDTH_OPTIONS = Object.freeze(
81
- Object.fromEntries(PARTICLE_VALUE_TYPES.map(type => [type.name, type.components]))
82
- );
83
-
84
- /**
85
- * Node type name -> its parameters, in the order an editor should present them. A type with no
86
- * static parameters is present with an empty array, so "missing" and "has none" are distinct.
87
- *
88
- * @type {Object<string, ParticleNodeParameter[]>}
89
- */
90
- export const PARTICLE_NODE_PARAMETER_SCHEMA = Object.freeze({
91
- ...Object.fromEntries(PARTICLE_NODES_WITHOUT_PARAMETERS.map(name => [name, Object.freeze([])])),
92
-
93
- const: [{
94
- name: "value",
95
- kind: PARTICLE_PARAMETER_KIND.VECTOR,
96
- default: [0],
97
- description: "The literal this node produces — a scalar, or a vector as wide as there are numbers. "
98
- + "Interned into the program's constant pool.",
99
- }],
100
-
101
- // Opaque white by default, which is the colour that changes nothing about whatever it is
102
- // multiplied into and is visible against any background it is written to.
103
- color: [{
104
- name: "value",
105
- kind: PARTICLE_PARAMETER_KIND.COLOR,
106
- default: [1, 1, 1, 1],
107
- description: "The colour this node produces. A vec4 of red, green, blue and alpha, "
108
- + "interned into the program's constant pool like any other literal.",
109
- }],
110
-
111
- builtin: [{
112
- name: "id",
113
- kind: PARTICLE_PARAMETER_KIND.ENUM,
114
- options: VM_BUILTIN,
115
- default: VM_BUILTIN.DELTA_TIME,
116
- description: "Which per-invocation value the host shader hands the VM.",
117
- }],
118
-
119
- attribute: [{
120
- name: "name",
121
- kind: PARTICLE_PARAMETER_KIND.ATTRIBUTE,
122
- description: "The per-particle attribute to read, by name in the effect's layout.",
123
- }],
124
-
125
- // Four is the width a draw had before it had one — as wide as anything could read it — so an
126
- // effect saved without saying is read the way it was written. A draw that is meant to be one
127
- // value says so, and reads as a scalar.
128
- random: [{
129
- name: "components",
130
- kind: PARTICLE_PARAMETER_KIND.ENUM,
131
- options: PARTICLE_WIDTH_OPTIONS,
132
- default: 4,
133
- description: "How many independent draws, one per lane: a scalar, or a vector of them.",
134
- }],
135
-
136
- setAttribute: [{
137
- name: "name",
138
- kind: PARTICLE_PARAMETER_KIND.ATTRIBUTE,
139
- description: "The per-particle attribute to write, by name in the effect's layout.",
140
- }],
141
-
142
- compare: [{
143
- name: "op",
144
- kind: PARTICLE_PARAMETER_KIND.ENUM,
145
- // the operator NAMES are the values here: `emit` looks the opcode up by name
146
- options: Object.fromEntries(Object.keys(PARTICLE_COMPARE_OPCODES).map(key => [key, key])),
147
- default: "lt",
148
- description: "Comparison to apply, component-wise. Produces 1 where it holds and 0 where it does not.",
149
- }],
150
-
151
- swizzle: [{
152
- name: "pattern",
153
- kind: PARTICLE_PARAMETER_KIND.SWIZZLE,
154
- default: [0, 1, 2, 3],
155
- description: "Which input lane each output lane reads; one to four of them, and that count is the result's width.",
156
- }],
157
-
158
- curve: [{
159
- name: "handle",
160
- kind: PARTICLE_PARAMETER_KIND.INTEGER,
161
- default: 0,
162
- description: "Row of the animation-curve table to sample.",
163
- }],
164
- });
165
-
166
- /**
167
- * The parameters of one node type.
168
- *
169
- * @param {string} type node type name
170
- * @returns {ParticleNodeParameter[]} empty when the type takes none
171
- * @throws if the type is not described — which is a missing entry above, not an unknown node
172
- */
173
- export function particle_node_parameters(type) {
174
- const parameters = PARTICLE_NODE_PARAMETER_SCHEMA[type];
175
-
176
- if (parameters === undefined) {
177
- throw new Error(
178
- `Particle node type '${type}' has no parameter description. `
179
- + `Add one to PARTICLE_NODE_PARAMETER_SCHEMA, even if it is empty.`
180
- );
181
- }
182
-
183
- return parameters;
184
- }
185
-
186
- /**
187
- * The parameter object a freshly created node of this type should start with.
188
- *
189
- * Every parameter the type declares is present, so a new node compiles without the author having to
190
- * fill anything in — which is the difference between a palette that drops working nodes into a
191
- * graph and one that drops broken ones.
192
- *
193
- * Attribute parameters have no default of their own: the only sensible one is a name from the
194
- * effect being authored, so the layout has to be supplied. With no layout (or an empty one) they
195
- * come back as the empty string, which will not compile — the caller is expected to know that and
196
- * either pass a layout or fill the name in.
197
- *
198
- * @param {string} type node type name
199
- * @param {object} [context]
200
- * @param {import("../layout/ParticleLayout.js").ParticleLayout} [context.layout] the effect's
201
- * attribute schema, used to pick a default for attribute parameters
202
- * @returns {object}
203
- */
204
- export function particle_node_default_parameters(type, { layout } = {}) {
205
- const result = {};
206
-
207
- const first_attribute = layout === undefined ? undefined : layout.attributes.keys().next().value;
208
-
209
- for (const parameter of particle_node_parameters(type)) {
210
- if (parameter.kind === PARTICLE_PARAMETER_KIND.ATTRIBUTE) {
211
- result[parameter.name] = first_attribute ?? "";
212
- } else if (Array.isArray(parameter.default)) {
213
- // arrays are mutable and a node writes through to its own; a shared one would make two
214
- // nodes of the same type the same node
215
- result[parameter.name] = parameter.default.slice();
216
- } else {
217
- result[parameter.name] = parameter.default;
218
- }
219
- }
220
-
221
- return result;
222
- }
223
-
224
- /**
225
- * Every node type in the library paired with its parameters, for a palette to list.
226
- *
227
- * @returns {Array<{description: import("./ParticleNodeDescription.js").ParticleNodeDescription, parameters: ParticleNodeParameter[]}>}
228
- */
229
- export function particle_node_catalogue() {
230
- return particle_node_descriptions().map(description => ({
231
- description,
232
- parameters: particle_node_parameters(description.name),
233
- }));
234
- }
1
+ import { VM_BUILTIN } from "../isa/ParticleVMISA.js";
2
+ import { PARTICLE_COMPARE_OPCODES } from "./particle_compare_ops.js";
3
+ import { particle_curve_default, particle_gradient_default } from "./particle_ramp.js";
4
+ import { particle_node_descriptions } from "./ParticleNodeRegistry.js";
5
+ import { PARTICLE_VALUE_TYPES } from "./ParticleValueType.js";
6
+
7
+ /**
8
+ * What each particle node type's static parameters *are* — the contract between the `emit` closures
9
+ * in {@link ./ParticleNodeRegistry.js}, which read `context.parameters.<name>`, and anything that
10
+ * has to produce those parameters without being told: an editor building controls, a default-value
11
+ * factory, a serializer checking an authored graph.
12
+ *
13
+ * The engine's generic {@link ../../../../core/model/node-graph/node/NodeDescription.js} parameter
14
+ * mechanism is not used for these. Its parameters are keyed by a numeric id and typed as
15
+ * number / string / boolean, and a particle node's are keyed by name and are vectors, layout
16
+ * attribute references, ISA enum members and swizzle patterns. Rather than flatten them into three
17
+ * scalar types and lose what they mean, they are described here in their own terms, and the editor
18
+ * renders a control per kind.
19
+ *
20
+ * Living beside the node library rather than in the editor is what keeps the two honest:
21
+ * {@link ./particle_node_parameters.spec.js} asserts that every registered type is described here,
22
+ * and that a node built from nothing but these defaults compiles.
23
+ */
24
+
25
+ /**
26
+ * The kinds of value a particle node parameter can hold.
27
+ * @enum {string}
28
+ */
29
+ export const PARTICLE_PARAMETER_KIND = Object.freeze({
30
+ /** one to four floats; how many there are is the value's type, a scalar or a `vec2..4` */
31
+ VECTOR: "vector",
32
+ /** four floats that are a colour: red, green, blue and alpha, each in `[0, 1]` */
33
+ COLOR: "color",
34
+ /** the name of an attribute in the effect's {@link ../layout/ParticleLayout.js} */
35
+ ATTRIBUTE: "attribute",
36
+ /** one member of {@link PARTICLE_NODE_PARAMETER_SCHEMA}'s `options` map */
37
+ ENUM: "enum",
38
+ /** one to four lane selectors in `[0, 4)`, one per output lane */
39
+ SWIZZLE: "swizzle",
40
+ /** a non-negative integer — a curve handle */
41
+ INTEGER: "integer",
42
+ /**
43
+ * an {@link ../../../../engine/animation/curve/AnimationCurve.js AnimationCurve}, as the
44
+ * `{keys: [...]}` record that class writes and reads
45
+ */
46
+ CURVE: "curve",
47
+ /**
48
+ * a colour gradient: a list of `{position, color}` stops, see
49
+ * {@link ./particle_ramp.js ParticleGradientStop}
50
+ */
51
+ GRADIENT: "gradient",
52
+ });
53
+
54
+ /**
55
+ * One parameter of one node type.
56
+ *
57
+ * @typedef {object} ParticleNodeParameter
58
+ * @property {string} name the key the node's `emit` reads off `context.parameters`
59
+ * @property {string} kind a {@link PARTICLE_PARAMETER_KIND}
60
+ * @property {*} [default] the value a freshly created node takes; absent for
61
+ * {@link PARTICLE_PARAMETER_KIND.ATTRIBUTE}, whose default can only come from the effect's layout
62
+ * @property {Object<string, *>} [options] for {@link PARTICLE_PARAMETER_KIND.ENUM}: label -> value
63
+ * @property {boolean} [alpha] for {@link PARTICLE_PARAMETER_KIND.GRADIENT}: whether the node reads
64
+ * the alpha channel. Both gradients *store* one — see {@link ./particle_ramp.js} — so that a
65
+ * gradient moved from the RGBA node to the RGB one and back keeps it; this says whether to offer
66
+ * it for editing.
67
+ * @property {string} [description] one line of help, shown by the editor
68
+ */
69
+
70
+ /**
71
+ * The node types whose whole configuration is their wiring — every arithmetic, vector and logic
72
+ * operation, plus the two sinks that take only a value.
73
+ *
74
+ * Listed rather than inferred so that "takes no parameters" is a claim someone made, and a node
75
+ * type added to the library without a word about its parameters is caught by
76
+ * {@link ./particle_node_parameters.spec.js} instead of silently reading as taking none.
77
+ *
78
+ * @type {string[]}
79
+ */
80
+ export const PARTICLE_NODES_WITHOUT_PARAMETERS = Object.freeze([
81
+ "kill",
82
+ "add", "sub", "mul", "div", "min", "max", "pow", "step",
83
+ "mad", "mix", "clamp", "saturate", "smoothstep", "scale",
84
+ "neg", "abs", "floor", "fract", "sqrt", "rsqrt", "sin", "cos", "tan", "asin", "acos", "atan2",
85
+ "exp", "log", "normalize", "length",
86
+ "dot", "cross", "distance",
87
+ "vec2", "vec3", "vec4",
88
+ "select",
89
+ ]);
90
+
91
+ /**
92
+ * A lane count offered as a type: what a `random` is asked to be, and what a literal's width picker
93
+ * says. Labelled by the type's name, valued by its width.
94
+ *
95
+ * @type {Object<string, number>}
96
+ */
97
+ export const PARTICLE_WIDTH_OPTIONS = Object.freeze(
98
+ Object.fromEntries(PARTICLE_VALUE_TYPES.map(type => [type.name, type.components]))
99
+ );
100
+
101
+ /**
102
+ * Node type name -> its parameters, in the order an editor should present them. A type with no
103
+ * static parameters is present with an empty array, so "missing" and "has none" are distinct.
104
+ *
105
+ * @type {Object<string, ParticleNodeParameter[]>}
106
+ */
107
+ export const PARTICLE_NODE_PARAMETER_SCHEMA = Object.freeze({
108
+ ...Object.fromEntries(PARTICLE_NODES_WITHOUT_PARAMETERS.map(name => [name, Object.freeze([])])),
109
+
110
+ const: [{
111
+ name: "value",
112
+ kind: PARTICLE_PARAMETER_KIND.VECTOR,
113
+ default: [0],
114
+ description: "The literal this node produces — a scalar, or a vector as wide as there are numbers. "
115
+ + "Interned into the program's constant pool.",
116
+ }],
117
+
118
+ // Opaque white by default, which is the colour that changes nothing about whatever it is
119
+ // multiplied into and is visible against any background it is written to.
120
+ color: [{
121
+ name: "value",
122
+ kind: PARTICLE_PARAMETER_KIND.COLOR,
123
+ default: [1, 1, 1, 1],
124
+ description: "The colour this node produces. A vec4 of red, green, blue and alpha, "
125
+ + "interned into the program's constant pool like any other literal.",
126
+ }],
127
+
128
+ builtin: [{
129
+ name: "id",
130
+ kind: PARTICLE_PARAMETER_KIND.ENUM,
131
+ options: VM_BUILTIN,
132
+ default: VM_BUILTIN.DELTA_TIME,
133
+ description: "Which per-invocation value the host shader hands the VM.",
134
+ }],
135
+
136
+ attribute: [{
137
+ name: "name",
138
+ kind: PARTICLE_PARAMETER_KIND.ATTRIBUTE,
139
+ description: "The per-particle attribute to read, by name in the effect's layout.",
140
+ }],
141
+
142
+ // Four is the width a draw had before it had one — as wide as anything could read it — so an
143
+ // effect saved without saying is read the way it was written. A draw that is meant to be one
144
+ // value says so, and reads as a scalar.
145
+ random: [{
146
+ name: "components",
147
+ kind: PARTICLE_PARAMETER_KIND.ENUM,
148
+ options: PARTICLE_WIDTH_OPTIONS,
149
+ default: 4,
150
+ description: "How many independent draws, one per lane: a scalar, or a vector of them.",
151
+ }],
152
+
153
+ setAttribute: [{
154
+ name: "name",
155
+ kind: PARTICLE_PARAMETER_KIND.ATTRIBUTE,
156
+ description: "The per-particle attribute to write, by name in the effect's layout.",
157
+ }],
158
+
159
+ compare: [{
160
+ name: "op",
161
+ kind: PARTICLE_PARAMETER_KIND.ENUM,
162
+ // the operator NAMES are the values here: `emit` looks the opcode up by name
163
+ options: Object.fromEntries(Object.keys(PARTICLE_COMPARE_OPCODES).map(key => [key, key])),
164
+ default: "lt",
165
+ description: "Comparison to apply, component-wise. Produces 1 where it holds and 0 where it does not.",
166
+ }],
167
+
168
+ swizzle: [{
169
+ name: "pattern",
170
+ kind: PARTICLE_PARAMETER_KIND.SWIZZLE,
171
+ default: [0, 1, 2, 3],
172
+ description: "Which input lane each output lane reads; one to four of them, and that count is the result's width.",
173
+ }],
174
+
175
+ curve: [{
176
+ name: "handle",
177
+ kind: PARTICLE_PARAMETER_KIND.INTEGER,
178
+ default: 0,
179
+ description: "Row of the animation-curve table to sample.",
180
+ }],
181
+
182
+ curveLiteral: [{
183
+ name: "curve",
184
+ kind: PARTICLE_PARAMETER_KIND.CURVE,
185
+ default: particle_curve_default(),
186
+ description: "The curve this node is. Written into the program as arithmetic rather than "
187
+ + "sampled from a table, so it costs no upload and no fetch.",
188
+ }],
189
+
190
+ // Both gradients hold the same thing, so that copying one to the other keeps every channel.
191
+ ...Object.fromEntries([["gradientRGBA", true], ["gradientRGB", false]].map(([name, alpha]) => [name, [{
192
+ name: "stops",
193
+ kind: PARTICLE_PARAMETER_KIND.GRADIENT,
194
+ alpha,
195
+ default: particle_gradient_default(),
196
+ description: "The gradient's stops: where each sits along t, and the colour there. "
197
+ + "Interpolated linearly, and written into the program as arithmetic.",
198
+ }]])),
199
+ });
200
+
201
+ /**
202
+ * A node's parameters, copied deeply enough that the copy and the original cannot write through to
203
+ * each other.
204
+ *
205
+ * There are four places a parameter object is copied — flattening a group, making one, taking one
206
+ * apart again, and handing a fresh node its defaults — and until the library had a parameter with a
207
+ * shape inside it they were all one level deep and all correct. A gradient's stops are a level
208
+ * further down than a literal's lanes, and a copy that stopped at the array would have left an
209
+ * ungrouped gradient sharing its stops with the group definition it came out of: edit the colour on
210
+ * one and it changes on the other, and on every other instance of that group.
211
+ *
212
+ * So there is one of these now, and it goes all the way down. Values are numbers, strings, and arrays
213
+ * and plain records of those; it is written out rather than handed to `structuredClone` because
214
+ * flattening a `curl4` runs it four thousand times and none of these values needs the machinery.
215
+ *
216
+ * @param {object} parameters
217
+ * @returns {object}
218
+ */
219
+ export function clone_particle_parameters(parameters) {
220
+ return clone_parameter(parameters);
221
+ }
222
+
223
+ /**
224
+ * @param {*} value
225
+ * @returns {*}
226
+ */
227
+ function clone_parameter(value) {
228
+ if (Array.isArray(value)) {
229
+ return value.map(clone_parameter);
230
+ }
231
+
232
+ if (value !== null && typeof value === "object") {
233
+ const copy = {};
234
+
235
+ for (const key of Object.keys(value)) {
236
+ copy[key] = clone_parameter(value[key]);
237
+ }
238
+
239
+ return copy;
240
+ }
241
+
242
+ return value;
243
+ }
244
+
245
+ /**
246
+ * The parameters of one node type.
247
+ *
248
+ * @param {string} type node type name
249
+ * @returns {ParticleNodeParameter[]} empty when the type takes none
250
+ * @throws if the type is not described — which is a missing entry above, not an unknown node
251
+ */
252
+ export function particle_node_parameters(type) {
253
+ const parameters = PARTICLE_NODE_PARAMETER_SCHEMA[type];
254
+
255
+ if (parameters === undefined) {
256
+ throw new Error(
257
+ `Particle node type '${type}' has no parameter description. `
258
+ + `Add one to PARTICLE_NODE_PARAMETER_SCHEMA, even if it is empty.`
259
+ );
260
+ }
261
+
262
+ return parameters;
263
+ }
264
+
265
+ /**
266
+ * The parameter object a freshly created node of this type should start with.
267
+ *
268
+ * Every parameter the type declares is present, so a new node compiles without the author having to
269
+ * fill anything in — which is the difference between a palette that drops working nodes into a
270
+ * graph and one that drops broken ones.
271
+ *
272
+ * Attribute parameters have no default of their own: the only sensible one is a name from the
273
+ * effect being authored, so the layout has to be supplied. With no layout (or an empty one) they
274
+ * come back as the empty string, which will not compile — the caller is expected to know that and
275
+ * either pass a layout or fill the name in.
276
+ *
277
+ * @param {string} type node type name
278
+ * @param {object} [context]
279
+ * @param {import("../layout/ParticleLayout.js").ParticleLayout} [context.layout] the effect's
280
+ * attribute schema, used to pick a default for attribute parameters
281
+ * @returns {object}
282
+ */
283
+ export function particle_node_default_parameters(type, { layout } = {}) {
284
+ const result = {};
285
+
286
+ const first_attribute = layout === undefined ? undefined : layout.attributes.keys().next().value;
287
+
288
+ for (const parameter of particle_node_parameters(type)) {
289
+ if (parameter.kind === PARTICLE_PARAMETER_KIND.ATTRIBUTE) {
290
+ result[parameter.name] = first_attribute ?? "";
291
+ } else {
292
+ // A default that is not a number is mutable, and a node writes through to its own: a
293
+ // shared one would make every node of the type the same node, and editing one gradient
294
+ // would edit the library's idea of what a gradient starts as.
295
+ result[parameter.name] = clone_parameter(parameter.default);
296
+ }
297
+ }
298
+
299
+ return result;
300
+ }
301
+
302
+ /**
303
+ * Every node type in the library paired with its parameters, for a palette to list.
304
+ *
305
+ * @returns {Array<{description: import("./ParticleNodeDescription.js").ParticleNodeDescription, parameters: ParticleNodeParameter[]}>}
306
+ */
307
+ export function particle_node_catalogue() {
308
+ return particle_node_descriptions().map(description => ({
309
+ description,
310
+ parameters: particle_node_parameters(description.name),
311
+ }));
312
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"particle_node_presentation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/graph/particle_node_presentation.js"],"names":[],"mappings":"AAmRA;;;;;;;GAOG;AACH,iDAHW,MAAM,GACJ;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAIvD;AAnPD;;;;;;;;GAQG;AACH;QAFiB,MAAM,GAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;EAgOjE"}
1
+ {"version":3,"file":"particle_node_presentation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/graph/particle_node_presentation.js"],"names":[],"mappings":"AA2UA;;;;;;;GAOG;AACH,iDAHW,MAAM,GACJ;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAIvD;AA3SD;;;;;;;;GAQG;AACH;QAFiB,MAAM,GAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;EAwRjE"}