@woosh/meep-engine 3.58.0 → 3.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/editor/particles/effect/ParticleEffectDocument.d.ts +162 -43
  2. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  3. package/editor/particles/effect/ParticleEffectDocument.js +450 -43
  4. package/editor/particles/effect/ParticleReferenceSimulation.d.ts +12 -3
  5. package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
  6. package/editor/particles/effect/ParticleReferenceSimulation.js +78 -23
  7. package/editor/particles/effect/make_starter_particle_effect.js +17 -17
  8. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +3 -3
  9. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  10. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +224 -67
  11. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
  12. package/editor/view/particles/effect/ParticleGraphEditorView.js +44 -11
  13. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +2 -1
  14. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  15. package/editor/view/particles/effect/ParticleNodeParametersView.js +46 -16
  16. package/editor/view/particles/effect/ParticlePreviewView.js +2 -2
  17. package/editor/view/particles/effect/particle-editor.css +77 -68
  18. package/package.json +1 -1
  19. package/src/engine/Engine.d.ts.map +1 -1
  20. package/src/engine/Engine.js +2 -2
  21. package/src/engine/ecs/EntityManager.d.ts +29 -5
  22. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  23. package/src/engine/ecs/EntityManager.js +37 -1
  24. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  25. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  26. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +74 -17
  27. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
  28. package/src/engine/graphics/ecs/particles/ParticleEffect.js +156 -25
  29. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +13 -3
  30. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
  31. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +59 -13
  32. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +3 -3
  33. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +9 -9
  34. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts +15 -0
  35. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts.map +1 -0
  36. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.js +78 -0
  37. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +2 -0
  38. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  39. package/src/engine/graphics/ecs/trail3d/Trail3D.js +2 -0
  40. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +1 -1
  41. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +1 -1
  42. package/src/engine/graphics/trail/tube/TubeX.d.ts +5 -3
  43. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
  44. package/src/engine/graphics/trail/tube/TubeX.js +5 -3
  45. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +3 -2
  46. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +1 -1
  47. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +9 -8
  48. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +65 -4
  49. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  50. package/src/engine/graphics3/GPUParticleEmitterSystem.js +1351 -904
  51. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +1 -1
  52. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -13
  53. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  54. package/src/generation/foliage/FOLIAGE_DESIGN.md +26 -5
  55. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +35 -0
  56. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +2 -1
  57. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +552 -0
  58. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -1
  59. package/src/generation/foliage/analysis/tree_crown_opacity.js +2 -1
  60. package/src/generation/foliage/analysis/tree_render_cost.d.ts +5 -3
  61. package/src/generation/foliage/analysis/tree_render_cost.d.ts.map +1 -1
  62. package/src/generation/foliage/analysis/tree_render_cost.js +8 -7
  63. package/src/generation/foliage/asset/TreeAsset.d.ts +17 -0
  64. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  65. package/src/generation/foliage/asset/TreeAsset.js +20 -0
  66. package/src/generation/foliage/asset/TreeSpeciesCache.d.ts +69 -0
  67. package/src/generation/foliage/asset/TreeSpeciesCache.d.ts.map +1 -0
  68. package/src/generation/foliage/asset/TreeSpeciesCache.js +147 -0
  69. package/src/generation/foliage/asset/generate_tree.d.ts +10 -0
  70. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  71. package/src/generation/foliage/asset/generate_tree.js +57 -29
  72. package/src/generation/foliage/asset/place_tree.d.ts +2 -1
  73. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -1
  74. package/src/generation/foliage/asset/place_tree.js +2 -1
  75. package/src/generation/foliage/asset/tree_lod_plan.d.ts +4 -2
  76. package/src/generation/foliage/asset/tree_lod_plan.d.ts.map +1 -1
  77. package/src/generation/foliage/asset/tree_lod_plan.js +12 -14
  78. package/src/generation/foliage/asset/tree_shoot_instances.d.ts +119 -0
  79. package/src/generation/foliage/asset/tree_shoot_instances.d.ts.map +1 -0
  80. package/src/generation/foliage/asset/tree_shoot_instances.js +410 -0
  81. package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts +155 -0
  82. package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts.map +1 -0
  83. package/src/generation/foliage/asset/tree_shoot_prototypes.js +251 -0
  84. package/src/generation/foliage/config/TreeGrowth.d.ts +10 -0
  85. package/src/generation/foliage/config/TreeGrowth.d.ts.map +1 -0
  86. package/src/generation/foliage/config/TreeGrowth.js +18 -0
  87. package/src/generation/foliage/config/TreeLODConfig.d.ts +6 -0
  88. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -1
  89. package/src/generation/foliage/config/TreeLODConfig.js +7 -0
  90. package/src/generation/foliage/index.d.ts +3 -0
  91. package/src/generation/foliage/index.js +3 -0
  92. package/src/generation/foliage/material/foliage_tile.d.ts +6 -6
  93. package/src/generation/foliage/material/foliage_tile.js +3 -3
  94. package/src/generation/foliage/material/tree_cluster_atlas.d.ts +44 -0
  95. package/src/generation/foliage/material/tree_cluster_atlas.d.ts.map +1 -0
  96. package/src/generation/foliage/material/tree_cluster_atlas.js +37 -0
  97. package/src/generation/foliage/mesh/foliage_collect_attachments.js +2 -2
  98. package/src/generation/foliage/mesh/foliage_scale_spread.d.ts +14 -0
  99. package/src/generation/foliage/mesh/foliage_scale_spread.d.ts.map +1 -0
  100. package/src/generation/foliage/mesh/foliage_scale_spread.js +15 -0
  101. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts +8 -7
  102. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts.map +1 -1
  103. package/src/generation/foliage/mesh/tree_cluster_representatives.js +85 -40
  104. package/src/generation/foliage/mesh/tree_clusters.d.ts +26 -5
  105. package/src/generation/foliage/mesh/tree_clusters.d.ts.map +1 -1
  106. package/src/generation/foliage/mesh/tree_clusters.js +52 -39
  107. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  108. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +32 -54
  109. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +6 -1
  110. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  111. package/src/generation/foliage/presets/make_tree_species_preset.js +157 -3
  112. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +19 -0
  113. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  114. package/src/generation/foliage/skeleton/TreeSkeleton.js +41 -0
  115. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +5 -0
  116. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -1
  117. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +8 -1
  118. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts +70 -0
  119. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts.map +1 -0
  120. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.js +171 -0
  121. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts +17 -0
  122. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts.map +1 -0
  123. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.js +79 -0
  124. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts +12 -0
  125. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts.map +1 -0
  126. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.js +56 -0
  127. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts +11 -0
  128. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts.map +1 -0
  129. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.js +38 -0
  130. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +4 -11
  131. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  132. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +8 -2034
  133. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts +22 -0
  134. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts.map +1 -0
  135. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.js +2050 -0
  136. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +10 -0
  137. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -1
  138. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +27 -56
  139. package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts +4 -0
  140. package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts.map +1 -1
  141. package/src/shade/descriptor/pipeline/render/DepthStencilState.js +170 -144
  142. package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts +4 -0
  143. package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts.map +1 -1
  144. package/src/shade/descriptor/pipeline/render/MultisampleState.js +78 -65
  145. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
  146. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +176 -172
  147. package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts +4 -0
  148. package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts.map +1 -1
  149. package/src/shade/descriptor/pipeline/render/StencilFaceState.js +107 -88
  150. package/src/shade/playground/particle_ecs/README.md +9 -8
  151. package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
  152. package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +6 -6
  153. package/src/shade/playground/particle_ecs/bonfire_effects.js +6 -6
  154. package/src/shade/playground/particle_editor/README.md +14 -11
  155. package/src/shade/playground/particle_system/particle_prototype.js +18 -18
  156. package/src/shade/playground/particle_system/particle_scene.js +13 -13
  157. package/src/shade/playground/probe_clipmap/README.md +42 -0
  158. package/src/shade/playground/probe_clipmap/index.html +178 -0
  159. package/src/shade/playground/probe_clipmap/main.d.ts +8 -0
  160. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -0
  161. package/src/shade/playground/probe_clipmap/main.js +360 -0
  162. package/src/shade/renderer/Renderer.d.ts +3 -1
  163. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  164. package/src/shade/renderer/Renderer.js +94 -38
  165. package/src/shade/renderer/extension/ViewTextures.d.ts +2 -1
  166. package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
  167. package/src/shade/renderer/extension/ViewTextures.js +2 -1
  168. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  169. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  170. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  171. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  172. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  173. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +34 -12
  174. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  175. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +56 -15
  176. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +2 -2
  177. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  178. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +13 -26
  179. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +25 -2
  180. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
  181. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +54 -32
  182. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts +14 -0
  183. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts.map +1 -0
  184. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.js +37 -0
  185. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
  186. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +16 -0
  187. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -1
  188. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +2 -6
  189. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts +131 -0
  190. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts.map +1 -0
  191. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.js +467 -0
  192. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts +24 -0
  193. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts.map +1 -0
  194. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.js +111 -0
  195. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts +42 -0
  196. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts.map +1 -0
  197. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.js +404 -0
  198. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts +16 -0
  199. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts.map +1 -0
  200. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.js +23 -0
  201. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts +17 -0
  202. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts.map +1 -0
  203. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.js +65 -0
  204. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  205. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +14 -70
  206. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  207. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +13 -773
  208. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts +55 -0
  209. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts.map +1 -0
  210. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.js +248 -0
  211. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  212. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +15 -174
  213. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.d.ts.map +1 -1
  214. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.js +8 -24
  215. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.d.ts.map +1 -1
  216. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.js +1 -25
  217. package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.d.ts.map +1 -1
  218. package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.js +5 -23
  219. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +25 -4
  220. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  221. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +126 -8
  222. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +832 -4
  223. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +7 -0
  224. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
  225. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +8 -0
  226. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +16 -0
  227. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  228. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +9 -0
  229. package/src/shade/renderer/global_illumination/probe_clipmap/brick/{mesh/chunk_mesh_brick_object.d.ts → chunk_brick_object.d.ts} +8 -8
  230. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts.map +1 -0
  231. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.js +42 -0
  232. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts +45 -0
  233. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts.map +1 -0
  234. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.js +93 -0
  235. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +0 -7
  236. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
  237. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +0 -8
  238. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -4
  239. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
  240. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +5 -8
  241. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +1 -1
  242. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +13 -22
  243. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +99 -0
  244. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +1 -0
  245. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +139 -0
  246. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +65 -0
  247. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +1 -0
  248. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +393 -0
  249. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +17 -0
  250. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +1 -0
  251. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +36 -0
  252. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +29 -0
  253. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +1 -0
  254. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +108 -0
  255. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +31 -0
  256. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +1 -0
  257. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +113 -0
  258. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +36 -0
  259. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +1 -0
  260. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +85 -0
  261. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +23 -0
  262. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +1 -0
  263. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +273 -0
  264. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +13 -0
  265. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +1 -0
  266. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +151 -0
  267. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +13 -0
  268. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +1 -0
  269. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +133 -0
  270. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +22 -0
  271. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +1 -0
  272. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +135 -0
  273. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +20 -6
  274. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  275. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +152 -10
  276. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +7 -0
  277. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  278. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +8 -0
  279. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +14 -2
  280. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  281. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +50 -5
  282. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts +19 -0
  283. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts.map +1 -0
  284. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.js +40 -0
  285. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts +72 -0
  286. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts.map +1 -0
  287. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +343 -0
  288. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +29 -0
  289. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -0
  290. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +188 -0
  291. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +26 -0
  292. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -0
  293. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +132 -0
  294. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +4 -0
  295. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  296. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +26 -3
  297. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +3 -0
  298. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
  299. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +8 -1
  300. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts +12 -0
  301. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts.map +1 -0
  302. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js +101 -0
  303. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +1 -1
  304. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +1 -1
  305. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts +15 -0
  306. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts.map +1 -0
  307. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js +175 -0
  308. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +26 -0
  309. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -0
  310. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +210 -0
  311. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +3 -3
  312. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +3 -3
  313. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +2 -1
  314. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  315. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +5 -1
  316. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  317. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +3 -10
  318. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +5 -9
  319. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -1
  320. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +9 -110
  321. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +27 -0
  322. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -0
  323. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +110 -0
  324. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +13 -0
  325. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -1
  326. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +40 -0
  327. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +11 -6
  328. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -1
  329. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +15 -8
  330. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +9 -2
  331. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -1
  332. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +25 -11
  333. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  334. package/src/shade/renderer/particles/DESIGN.md +151 -42
  335. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +283 -0
  336. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +10 -2
  337. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  338. package/src/shade/renderer/particles/GPUParticleSystem.js +46 -8
  339. package/src/shade/renderer/particles/ParticleConstants.d.ts +23 -6
  340. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  341. package/src/shade/renderer/particles/ParticleConstants.js +25 -6
  342. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +5 -5
  343. package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -187
  344. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +20 -9
  345. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
  346. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +36 -10
  347. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +8 -7
  348. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  349. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +25 -16
  350. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts +51 -0
  351. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts.map +1 -0
  352. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.js +56 -0
  353. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
  354. package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -0
  355. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +1 -1
  356. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +1 -1
  357. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +22 -11
  358. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  359. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +14 -11
  360. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +4 -4
  361. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  362. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +59 -24
  363. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +3 -3
  364. package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -287
  365. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +13 -6
  366. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  367. package/src/shade/renderer/particles/graph/compile_particle_graph.js +46 -27
  368. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +8 -2
  369. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -1
  370. package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +240 -234
  371. package/src/shade/renderer/particles/graph/make_particle_group.d.ts +1 -1
  372. package/src/shade/renderer/particles/graph/make_particle_group.js +1 -1
  373. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +3 -2
  374. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
  375. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +3 -2
  376. package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -170
  377. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +25 -16
  378. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -1
  379. package/src/shade/renderer/particles/graph/particle_graph_json.js +16 -2
  380. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +29 -15
  381. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  382. package/src/shade/renderer/particles/graph/particle_node_parameters.js +54 -22
  383. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  384. package/src/shade/renderer/particles/graph/particle_node_presentation.js +18 -8
  385. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +9 -2
  386. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  387. package/src/shade/renderer/particles/graph/validate_particle_graph.js +70 -32
  388. package/src/shade/renderer/particles/graph_particles.d.ts +9 -4
  389. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  390. package/src/shade/renderer/particles/graph_particles.js +27 -4
  391. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +7 -6
  392. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  393. package/src/shade/renderer/particles/isa/InstructionStream.js +17 -16
  394. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +17 -0
  395. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
  396. package/src/shade/renderer/particles/isa/ParticleAssembler.js +35 -0
  397. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +26 -6
  398. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  399. package/src/shade/renderer/particles/isa/ParticleProgram.js +61 -9
  400. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +55 -4
  401. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  402. package/src/shade/renderer/particles/isa/ParticleVMISA.js +79 -10
  403. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +20 -6
  404. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  405. package/src/shade/renderer/particles/isa/particle_assembly.js +136 -25
  406. package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts +20 -0
  407. package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts.map +1 -0
  408. package/src/shade/renderer/particles/isa/particle_link_global_fields.js +46 -0
  409. package/src/shade/renderer/particles/isa/validate_particle_program.js +8 -8
  410. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +62 -28
  411. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  412. package/src/shade/renderer/particles/layout/ParticleLayout.js +102 -62
  413. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +2 -0
  415. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +1 -1
  416. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +4 -3
  417. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +2 -2
  418. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +3 -3
  419. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +11 -11
  420. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +4 -4
  421. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
  422. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +5 -4
  423. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +1 -1
  424. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +1 -1
  425. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +4 -4
  426. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  427. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +13 -11
  428. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +7 -7
  429. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +3 -2
  430. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  431. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +5 -4
  432. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -1
  433. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
  434. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
  435. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -51
  436. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  437. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +5 -5
  438. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
  439. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  440. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  441. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  442. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  443. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -1
  444. package/src/shade/renderer/particles/optimizer/pass_schedule.js +2 -2
  445. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  446. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +5 -4
  447. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +93 -22
  448. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  449. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +336 -29
  450. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +43 -3
  451. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  452. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +43 -3
  453. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +56 -26
  454. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  455. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +89 -33
  456. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts +85 -0
  457. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts.map +1 -0
  458. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.js +221 -0
  459. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +143 -18
  460. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -1
  461. package/src/shade/renderer/particles/runtime/ProgramHeap.js +378 -28
  462. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +19 -7
  463. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  464. package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -9
  465. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +8 -8
  466. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
  467. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +3 -0
  468. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -1
  469. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +4 -0
  470. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts +30 -0
  471. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts.map +1 -0
  472. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.js +121 -0
  473. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -1
  474. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +3 -1
  475. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +12 -4
  476. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  477. package/src/shade/renderer/particles/vm/ParticleVMReference.js +48 -11
  478. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  479. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +36 -14
  480. package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
  481. package/src/shade/renderer/postprocess/PostProcess.js +2 -1
  482. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +31 -19
  483. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  484. package/src/shade/renderer/postprocess/gtao/GTAO.js +44 -30
  485. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  486. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +16 -2
  487. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  488. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  489. package/src/shade/renderer/postprocess/nss/NSS.js +4 -3
  490. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +7 -1
  491. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  492. package/src/shade/renderer/postprocess/ssr/SSR.js +16 -0
  493. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts +20 -2
  494. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts.map +1 -1
  495. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +53 -3
  496. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts +10 -2
  497. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts.map +1 -1
  498. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +31 -3
  499. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  500. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +17 -11
  501. package/src/shade/renderer/postprocess/taa/TAA.d.ts +4 -2
  502. package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
  503. package/src/shade/renderer/postprocess/taa/TAA.js +6 -1
  504. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
  505. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +10 -5
  506. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  507. package/src/shade/renderer/postprocess/taa/shader_taa.js +15 -12
  508. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  509. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +26 -17
  510. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts +4 -3
  511. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts.map +1 -1
  512. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +6 -4
  513. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts +12 -0
  514. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts.map +1 -0
  515. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.js +57 -0
  516. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +4 -2
  517. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  518. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +4 -2
  519. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +8 -2
  520. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  521. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +28 -15
  522. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts +2 -1
  523. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts.map +1 -1
  524. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.js +19 -3
  525. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
  526. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +4 -2
  527. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +3 -1
  528. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  529. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +27 -14
  530. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +2 -1
  531. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
  532. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +19 -3
  533. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts +2 -8
  534. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts.map +1 -1
  535. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.js +25 -52
  536. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts +15 -0
  537. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts.map +1 -0
  538. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.js +52 -0
  539. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts +7 -0
  540. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts.map +1 -0
  541. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.js +12 -0
  542. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts +22 -0
  543. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts.map +1 -0
  544. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.js +37 -0
  545. package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.d.ts.map +1 -1
  546. package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.js +26 -60
  547. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts +23 -0
  548. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts.map +1 -0
  549. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.js +54 -0
  550. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +25 -0
  551. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -0
  552. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +43 -0
  553. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts +14 -0
  554. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts.map +1 -0
  555. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.js +37 -0
  556. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts +27 -0
  557. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts.map +1 -0
  558. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.js +61 -0
  559. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts +21 -0
  560. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts.map +1 -0
  561. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.js +41 -0
  562. package/src/shade/renderer/texture/util/texture_fill_rectangle.d.ts.map +1 -1
  563. package/src/shade/renderer/texture/util/texture_fill_rectangle.js +282 -267
  564. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +8 -4
  565. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  566. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +36 -36
  567. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +6 -1
  568. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -1
  569. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +498 -484
  570. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +15 -2
  571. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -1
  572. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +57 -3
  573. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -1
  574. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +197 -191
  575. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +4 -4
  576. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +2 -1
  577. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  578. package/src/shade/renderer/water/GPUWaterRenderer.js +5 -1
  579. package/src/shade/renderer/water/chunk_water_gi.d.ts +13 -3
  580. package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -1
  581. package/src/shade/renderer/water/chunk_water_gi.js +47 -5
  582. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  583. package/src/shade/renderer/water/shader_water.d.ts +3 -2
  584. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  585. package/src/shade/renderer/water/shader_water.js +9 -3
  586. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts +0 -3
  587. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts.map +0 -1
  588. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts +0 -2
  589. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts.map +0 -1
  590. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts +0 -8
  591. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts.map +0 -1
  592. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts +0 -3
  593. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts.map +0 -1
  594. package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts +0 -3
  595. package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +0 -1
  596. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.d.ts.map +0 -1
  597. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.js +0 -42
  598. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +0 -31
  599. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +0 -1
  600. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +0 -42
  601. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +0 -1
  602. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +0 -54
  603. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +0 -1
  604. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +0 -14
  605. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +0 -1
  606. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +0 -30
  607. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +0 -1
  608. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +0 -23
  609. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +0 -1
@@ -0,0 +1,155 @@
1
+ /**
2
+ * @typedef {Object} TreeShootPrototype
3
+ * @property {number} generator its carrier's generator, a shoot rule's `source`
4
+ * @property {number} carrier the framework branch it grew on
5
+ * @property {number} length m, its carrier's in the framework: what a carrier it is drawn on is scaled against
6
+ * @property {number} first its carrier's branch in `TreeShootPrototypes.sheet`; its shoots follow it
7
+ * @property {number} branch_count its branches in the sheet, from `first`
8
+ * @property {Array<{parent: number, t: number, leaf_area: number, reach: number}>} carried each shoot system on it that
9
+ * no LOD draws as wood, hanging from drawn wood: the sheet branch and `t_norm` it hangs from, its one-sided leaf
10
+ * area (m^2) and how far it reaches from there (m), as the wind's mechanics weigh them
11
+ */
12
+ /**
13
+ * @typedef {Object} TreeShootPrototypes
14
+ * @property {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species the species as its prototypes grew,
15
+ * at {@link PROTOTYPE_SEED}
16
+ * @property {TreeSkeleton} framework the species' framework, grown by its generator graph alone
17
+ * @property {TreeShootPrototype[]} prototypes
18
+ * @property {Map<number, {lengths: Float64Array, low: number, high: number}>} carriers per carrier generator, its
19
+ * carriers' lengths (ascending), and the scale a prototype may be drawn at, its leaves' own spread
20
+ * (`foliage_scale_spread`)
21
+ * @property {TreeSkeleton} sheet every prototype where it grew on the framework, under the framework's crown frame
22
+ * @property {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet} attachments the sheet's leaves
23
+ * @property {import("../../../shade/renderer/geometry/Geometry.js").Geometry|null} leaves every leaf's card
24
+ * @property {number} side_area m^2, every prototype's grown side area together
25
+ * @property {number[]} errors m, each error the sheet was cut at: {@link TREE_LOD_ERROR_STEP} apart from
26
+ * {@link TREE_LOD_ERROR_FINEST} to the first that draws no wood, every prototype one cut
27
+ * @property {ReturnType<typeof tree_cluster_atlas>|null} atlas their cuts at every error, drawn with a few tiles, as
28
+ * large as the texture ceiling affords over {@link side_area}
29
+ * @property {Uint8Array} drawn per sheet branch, whether any LOD draws it as wood: the finest error does, and so does
30
+ * its parent; a carrier always is
31
+ * @property {Int32Array} prototype_of per sheet branch, its prototype
32
+ * @property {Int32Array[]} owners per error, each card's prototype
33
+ */
34
+ /**
35
+ * A species' shoot prototypes (TWO_FRONT_ENDS_BRIEF_2026_10_28.md, G1): the shoot systems its shoot rules grow, grown
36
+ * once, by the botanical front end, on carriers of its own framework, and cut and baked into one atlas. A tree grown by
37
+ * its generator graph draws them on its carriers (G3).
38
+ *
39
+ * - **Where.** Each grows on a carrier of the framework the species' graph grows, in place: as old as that carrier is
40
+ * in the tree, kept out of the framework's wood, in the light of its own leaves alone (`tree_skeleton_grow_shoots_on`).
41
+ * It stays there: its leaves are collected, cut and baked where they grew, under the framework's crown frame, as a
42
+ * tree's own are.
43
+ * - **Which.** For each generator the rules grow on, the carrier of median length first. Drawn on a carrier of another
44
+ * length, a prototype is scaled by their ratio, and so are its leaves; within the spread of sizes the species' leaves
45
+ * already grow to, a scaled leaf is one it grows (`foliage_scale_spread`). Prototypes are added, shortest first, until
46
+ * their scaled lengths reach without a gap from the shortest carrier to the longest, each the longest carrier that
47
+ * still reaches back to where the last one stopped.
48
+ * - **Cut.** At every error from the finest to where no wood is drawn, through the same cuts, representatives and bake
49
+ * a tree's own LODs take (`tree_cluster_atlas`).
50
+ *
51
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
52
+ * @param {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial} leaf_material
53
+ * the species' leaf material (`TreeSpeciesCache.leaves`)
54
+ * @param {import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout|null} cutout its atlas's shape, `null` for a
55
+ * caller's own material, whose cards cover whole tiles
56
+ * @returns {TreeShootPrototypes}
57
+ */
58
+ export function tree_shoot_prototypes(species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, leaf_material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial, cutout: import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout | null): TreeShootPrototypes;
59
+ export type TreeShootPrototype = {
60
+ /**
61
+ * its carrier's generator, a shoot rule's `source`
62
+ */
63
+ generator: number;
64
+ /**
65
+ * the framework branch it grew on
66
+ */
67
+ carrier: number;
68
+ /**
69
+ * m, its carrier's in the framework: what a carrier it is drawn on is scaled against
70
+ */
71
+ length: number;
72
+ /**
73
+ * its carrier's branch in `TreeShootPrototypes.sheet`; its shoots follow it
74
+ */
75
+ first: number;
76
+ /**
77
+ * its branches in the sheet, from `first`
78
+ */
79
+ branch_count: number;
80
+ /**
81
+ * each shoot system on it that
82
+ * no LOD draws as wood, hanging from drawn wood: the sheet branch and `t_norm` it hangs from, its one-sided leaf
83
+ * area (m^2) and how far it reaches from there (m), as the wind's mechanics weigh them
84
+ */
85
+ carried: Array<{
86
+ parent: number;
87
+ t: number;
88
+ leaf_area: number;
89
+ reach: number;
90
+ }>;
91
+ };
92
+ export type TreeShootPrototypes = {
93
+ /**
94
+ * the species as its prototypes grew,
95
+ * at {@link PROTOTYPE_SEED }
96
+ */
97
+ species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig;
98
+ /**
99
+ * the species' framework, grown by its generator graph alone
100
+ */
101
+ framework: TreeSkeleton;
102
+ prototypes: TreeShootPrototype[];
103
+ /**
104
+ * per carrier generator, its
105
+ * carriers' lengths (ascending), and the scale a prototype may be drawn at, its leaves' own spread
106
+ * (`foliage_scale_spread`)
107
+ */
108
+ carriers: Map<number, {
109
+ lengths: Float64Array;
110
+ low: number;
111
+ high: number;
112
+ }>;
113
+ /**
114
+ * every prototype where it grew on the framework, under the framework's crown frame
115
+ */
116
+ sheet: TreeSkeleton;
117
+ /**
118
+ * the sheet's leaves
119
+ */
120
+ attachments: import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet;
121
+ /**
122
+ * every leaf's card
123
+ */
124
+ leaves: import("../../../shade/renderer/geometry/Geometry.js").Geometry | null;
125
+ /**
126
+ * m^2, every prototype's grown side area together
127
+ */
128
+ side_area: number;
129
+ /**
130
+ * m, each error the sheet was cut at: {@link TREE_LOD_ERROR_STEP } apart from
131
+ * {@link TREE_LOD_ERROR_FINEST } to the first that draws no wood, every prototype one cut
132
+ */
133
+ errors: number[];
134
+ /**
135
+ * their cuts at every error, drawn with a few tiles, as
136
+ * large as the texture ceiling affords over {@link side_area }
137
+ */
138
+ atlas: ReturnType<typeof tree_cluster_atlas> | null;
139
+ /**
140
+ * per sheet branch, whether any LOD draws it as wood: the finest error does, and so does
141
+ * its parent; a carrier always is
142
+ */
143
+ drawn: Uint8Array;
144
+ /**
145
+ * per sheet branch, its prototype
146
+ */
147
+ prototype_of: Int32Array;
148
+ /**
149
+ * per error, each card's prototype
150
+ */
151
+ owners: Int32Array[];
152
+ };
153
+ import { TreeSkeleton } from "../skeleton/TreeSkeleton.js";
154
+ import { tree_cluster_atlas } from "../material/tree_cluster_atlas.js";
155
+ //# sourceMappingURL=tree_shoot_prototypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree_shoot_prototypes.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/tree_shoot_prototypes.js"],"names":[],"mappings":"AAmBA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,+CAPW,OAAO,gCAAgC,EAAE,iBAAiB,iBAC1D,OAAO,2DAA2D,EAAE,qBAAqB,UAEzF,OAAO,mCAAmC,EAAE,kBAAkB,GAAC,IAAI,GAEjE,mBAAmB,CAiJ/B;;;;;eAxMa,MAAM;;;;aACN,MAAM;;;;YACN,MAAM;;;;WACN,MAAM;;;;kBACN,MAAM;;;;;;aACN,MAAM;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC;;;;;;;aAOpE,OAAO,gCAAgC,EAAE,iBAAiB;;;;eAE1D,YAAY;gBACZ,kBAAkB,EAAE;;;;;;cACpB,IAAI,MAAM,EAAE;QAAC,OAAO,EAAE,YAAY,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;;;;WAG/D,YAAY;;;;iBACZ,OAAO,wCAAwC,EAAE,oBAAoB;;;;YACrE,OAAO,8CAA8C,EAAE,QAAQ,GAAC,IAAI;;;;eACpE,MAAM;;;;;YACN,MAAM,EAAE;;;;;WAER,WAAW,yBAAyB,CAAC,GAAC,IAAI;;;;;WAE1C,UAAU;;;;kBAEV,UAAU;;;;YACV,UAAU,EAAE;;6BA5CG,6BAA6B;mCALvB,mCAAmC"}
@@ -0,0 +1,251 @@
1
+ import { TREE_RENDER_COST_CEILING, tree_grown_side_area } from "../analysis/tree_render_cost.js";
2
+ import { TREE_LOD_ERROR_FINEST, TREE_LOD_ERROR_STEP } from "../config/TreeLODConfig.js";
3
+ import { tree_cluster_atlas } from "../material/tree_cluster_atlas.js";
4
+ import { foliage_collect_attachments } from "../mesh/foliage_collect_attachments.js";
5
+ import { foliage_scale_spread } from "../mesh/foliage_scale_spread.js";
6
+ import { tree_mesh_compute_branch_rings } from "../mesh/tree_mesh_build_bark.js";
7
+ import { tree_mesh_build_foliage } from "../mesh/tree_mesh_build_foliage.js";
8
+ import { TreeSkeleton } from "../skeleton/TreeSkeleton.js";
9
+ import { tree_skeleton_compute_segment_mechanics } from "../skeleton/tree_skeleton_compute_joint_mechanics.js";
10
+ import { tree_skeleton_copy_branches } from "../skeleton/tree_skeleton_copy_branches.js";
11
+ import { tree_skeleton_grow_framework } from "../skeleton/tree_skeleton_grow_framework.js";
12
+ import { tree_skeleton_grow_shoots_on } from "../skeleton/tree_skeleton_grow_shoots.js";
13
+
14
+ /**
15
+ * The seed a species' prototypes grow from: they are the species', whatever a tree's seed.
16
+ * @type {number}
17
+ */
18
+ const PROTOTYPE_SEED = 0;
19
+
20
+ /**
21
+ * @typedef {Object} TreeShootPrototype
22
+ * @property {number} generator its carrier's generator, a shoot rule's `source`
23
+ * @property {number} carrier the framework branch it grew on
24
+ * @property {number} length m, its carrier's in the framework: what a carrier it is drawn on is scaled against
25
+ * @property {number} first its carrier's branch in `TreeShootPrototypes.sheet`; its shoots follow it
26
+ * @property {number} branch_count its branches in the sheet, from `first`
27
+ * @property {Array<{parent: number, t: number, leaf_area: number, reach: number}>} carried each shoot system on it that
28
+ * no LOD draws as wood, hanging from drawn wood: the sheet branch and `t_norm` it hangs from, its one-sided leaf
29
+ * area (m^2) and how far it reaches from there (m), as the wind's mechanics weigh them
30
+ */
31
+
32
+ /**
33
+ * @typedef {Object} TreeShootPrototypes
34
+ * @property {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species the species as its prototypes grew,
35
+ * at {@link PROTOTYPE_SEED}
36
+ * @property {TreeSkeleton} framework the species' framework, grown by its generator graph alone
37
+ * @property {TreeShootPrototype[]} prototypes
38
+ * @property {Map<number, {lengths: Float64Array, low: number, high: number}>} carriers per carrier generator, its
39
+ * carriers' lengths (ascending), and the scale a prototype may be drawn at, its leaves' own spread
40
+ * (`foliage_scale_spread`)
41
+ * @property {TreeSkeleton} sheet every prototype where it grew on the framework, under the framework's crown frame
42
+ * @property {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet} attachments the sheet's leaves
43
+ * @property {import("../../../shade/renderer/geometry/Geometry.js").Geometry|null} leaves every leaf's card
44
+ * @property {number} side_area m^2, every prototype's grown side area together
45
+ * @property {number[]} errors m, each error the sheet was cut at: {@link TREE_LOD_ERROR_STEP} apart from
46
+ * {@link TREE_LOD_ERROR_FINEST} to the first that draws no wood, every prototype one cut
47
+ * @property {ReturnType<typeof tree_cluster_atlas>|null} atlas their cuts at every error, drawn with a few tiles, as
48
+ * large as the texture ceiling affords over {@link side_area}
49
+ * @property {Uint8Array} drawn per sheet branch, whether any LOD draws it as wood: the finest error does, and so does
50
+ * its parent; a carrier always is
51
+ * @property {Int32Array} prototype_of per sheet branch, its prototype
52
+ * @property {Int32Array[]} owners per error, each card's prototype
53
+ */
54
+
55
+ /**
56
+ * A species' shoot prototypes (TWO_FRONT_ENDS_BRIEF_2026_10_28.md, G1): the shoot systems its shoot rules grow, grown
57
+ * once, by the botanical front end, on carriers of its own framework, and cut and baked into one atlas. A tree grown by
58
+ * its generator graph draws them on its carriers (G3).
59
+ *
60
+ * - **Where.** Each grows on a carrier of the framework the species' graph grows, in place: as old as that carrier is
61
+ * in the tree, kept out of the framework's wood, in the light of its own leaves alone (`tree_skeleton_grow_shoots_on`).
62
+ * It stays there: its leaves are collected, cut and baked where they grew, under the framework's crown frame, as a
63
+ * tree's own are.
64
+ * - **Which.** For each generator the rules grow on, the carrier of median length first. Drawn on a carrier of another
65
+ * length, a prototype is scaled by their ratio, and so are its leaves; within the spread of sizes the species' leaves
66
+ * already grow to, a scaled leaf is one it grows (`foliage_scale_spread`). Prototypes are added, shortest first, until
67
+ * their scaled lengths reach without a gap from the shortest carrier to the longest, each the longest carrier that
68
+ * still reaches back to where the last one stopped.
69
+ * - **Cut.** At every error from the finest to where no wood is drawn, through the same cuts, representatives and bake
70
+ * a tree's own LODs take (`tree_cluster_atlas`).
71
+ *
72
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
73
+ * @param {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial} leaf_material
74
+ * the species' leaf material (`TreeSpeciesCache.leaves`)
75
+ * @param {import("../material/FoliageAtlasCutout.js").FoliageAtlasCutout|null} cutout its atlas's shape, `null` for a
76
+ * caller's own material, whose cards cover whole tiles
77
+ * @returns {TreeShootPrototypes}
78
+ */
79
+ export function tree_shoot_prototypes(species, leaf_material, cutout) {
80
+ const config = species.clone();
81
+ config.seed = PROTOTYPE_SEED;
82
+ const framework = tree_skeleton_grow_framework(config);
83
+
84
+ // each carrier's shoot systems, grown in place on a framework of its own
85
+ const grown = new Map();
86
+ const grow = (carrier) => {
87
+ let skeleton = grown.get(carrier);
88
+ if (skeleton === undefined) {
89
+ skeleton = framework.clone();
90
+ const on = new Uint8Array(framework.branch_count);
91
+ on[carrier] = 1;
92
+ tree_skeleton_grow_shoots_on(skeleton, config, on);
93
+ grown.set(carrier, skeleton);
94
+ }
95
+ return skeleton;
96
+ };
97
+
98
+ const generators = [...new Set(config.shoot_rules.map(rule => rule.source))].sort((a, b) => a - b);
99
+ /** @type {TreeShootPrototype[]} */
100
+ const prototypes = [];
101
+ const carriers = new Map();
102
+ for (const generator of generators) {
103
+ const of_generator = [];
104
+ for (let b = 0; b < framework.branch_count; b++) {
105
+ if (framework.branch_generator[b] === generator && !framework.branch_dead[b] && framework.branch_length[b] > 0) {
106
+ of_generator.push(b);
107
+ }
108
+ }
109
+ if (of_generator.length === 0) continue;
110
+ of_generator.sort((a, b) => framework.branch_length[a] - framework.branch_length[b]);
111
+ const lengths = Float64Array.from(of_generator, b => framework.branch_length[b]);
112
+ const n = lengths.length;
113
+
114
+ // the median carrier's leaves say how far a prototype may be scaled; a system without leaves, any
115
+ const median = of_generator[n >> 1];
116
+ grow(median);
117
+ const own = foliage_collect_attachments(in_place(framework, grown, [median]), config, cutout);
118
+ const { low, high } = own.count > 0 ? foliage_scale_spread(own.scales, own.count) : { low: 0, high: Infinity };
119
+ carriers.set(generator, { lengths, low, high });
120
+
121
+ // `need`: the shortest length not yet reached, or, once `reached`, the longest that is
122
+ let need = lengths[0];
123
+ let reached = false;
124
+ for (; ;) {
125
+ // the longest carrier that scales down to it
126
+ let k = 0;
127
+ while (k + 1 < n && lengths[k + 1] * low <= need) k++;
128
+ if (reached && lengths[k] * high <= need) {
129
+ // none reaches further: no carrier's length lies past it within reach, so on to the next that does
130
+ let j = 0;
131
+ while (j < n && lengths[j] <= need) j++;
132
+ if (j === n) break;
133
+ need = lengths[j];
134
+ reached = false;
135
+ continue;
136
+ }
137
+ grow(of_generator[k]);
138
+ prototypes.push({ generator, carrier: of_generator[k], length: lengths[k], first: 0, branch_count: 0, carried: [] });
139
+ need = lengths[k] * high;
140
+ reached = true;
141
+ if (need >= lengths[n - 1]) break;
142
+ }
143
+ }
144
+
145
+ // every prototype where it grew, one skeleton
146
+ const sheet = in_place(framework, grown, prototypes.map(p => p.carrier), prototypes);
147
+ const attachments = foliage_collect_attachments(sheet, config, cutout);
148
+ const leaves = attachments.count > 0 ? tree_mesh_build_foliage(sheet, attachments, config, cutout) : null;
149
+ let side_area = 0;
150
+ for (const prototype of prototypes) {
151
+ const one = in_place(framework, grown, [prototype.carrier]);
152
+ const own = foliage_collect_attachments(one, config, cutout);
153
+ side_area += tree_grown_side_area(one, own.count > 0 ? tree_mesh_build_foliage(one, own, config, cutout) : null);
154
+ }
155
+
156
+ // the error ladder, to where no wood is drawn
157
+ const errors = [];
158
+ const lods = [];
159
+ const planned = new Map();
160
+ for (let error = TREE_LOD_ERROR_FINEST; ; error *= TREE_LOD_ERROR_STEP) {
161
+ const lod = config.lods[0].clone();
162
+ lod.error = error;
163
+ const rings = tree_mesh_compute_branch_rings(sheet, config, lod);
164
+ planned.set(error, rings);
165
+ errors.push(error);
166
+ lods.push(lod);
167
+ if (rings.size === 0) break;
168
+ }
169
+ const atlas = leaves !== null
170
+ ? tree_cluster_atlas(sheet, config, attachments, leaves, lods, leaf_material, TREE_RENDER_COST_CEILING.texture_density * side_area, planned)
171
+ : null;
172
+
173
+ // what any LOD can draw as wood: what the finest error draws, from the carrier out
174
+ const prototype_of = new Int32Array(sheet.branch_count).fill(-1);
175
+ const drawn = new Uint8Array(sheet.branch_count);
176
+ const finest = planned.get(TREE_LOD_ERROR_FINEST);
177
+ for (let i = 0; i < prototypes.length; i++) {
178
+ const q = prototypes[i];
179
+ prototype_of.fill(i, q.first, q.first + q.branch_count);
180
+ drawn[q.first] = 1;
181
+ for (let b = q.first + 1; b < q.first + q.branch_count; b++) {
182
+ drawn[b] = finest.has(b) && drawn[sheet.branch_parent[b]] ? 1 : 0;
183
+ }
184
+ }
185
+ const owners = atlas === null ? [] : atlas.lods.map(({ clusters, cards }) => Int32Array.from(cards, card => {
186
+ const cluster = clusters[card.cluster];
187
+ return prototype_of[cluster.branch >= 0 ? cluster.branch : cluster.root];
188
+ }));
189
+
190
+ // what each carries without drawing it as wood: the shoot systems hanging from its drawn wood, weighed as the
191
+ // wind's mechanics weigh the wood they would hang from
192
+ const mechanics = tree_skeleton_compute_segment_mechanics(sheet, config);
193
+ const top = new Int32Array(sheet.branch_count).fill(-1);
194
+ const area = new Float64Array(sheet.branch_count);
195
+ for (const q of prototypes) {
196
+ for (let b = q.first + 1; b < q.first + q.branch_count; b++) {
197
+ if (drawn[b]) continue;
198
+ const p = sheet.branch_parent[b];
199
+ top[b] = drawn[p] ? b : top[p];
200
+ }
201
+ }
202
+ for (let e = 0; e < sheet.segment_count; e++) {
203
+ const r = top[sheet.node_branch_id(sheet.segment_v1(e))];
204
+ if (r >= 0) area[r] += mechanics.leaf_area[e];
205
+ }
206
+ const nodes = [], edges = [];
207
+ const at = new Float64Array(3);
208
+ for (const q of prototypes) {
209
+ q.carried = [];
210
+ for (let r = q.first + 1; r < q.first + q.branch_count; r++) {
211
+ if (top[r] !== r) continue;
212
+ sheet.collect_branch_chain(r, nodes, edges);
213
+ if (edges.length === 0) continue;
214
+ // from where it hangs to the middle of its first segment, and on as far as that segment carries
215
+ sheet.node_read_position(at, 0, nodes[0]);
216
+ const e0 = edges[0];
217
+ const reach = mechanics.reach[e0] + Math.hypot(mechanics.mid[e0 * 3] - at[0], mechanics.mid[e0 * 3 + 1] - at[1], mechanics.mid[e0 * 3 + 2] - at[2]);
218
+ q.carried.push({ parent: sheet.branch_parent[r], t: sheet.branch_parent_attach_t[r], leaf_area: area[r], reach });
219
+ }
220
+ }
221
+ return { species: config, framework, prototypes, carriers, sheet, attachments, leaves, side_area, errors, atlas, drawn, prototype_of, owners };
222
+ }
223
+
224
+ /**
225
+ * The shoot systems of `carriers`, each with its carrier, where they grew on the framework (`grown`), in one skeleton
226
+ * under the framework's crown frame.
227
+ *
228
+ * @param {TreeSkeleton} framework
229
+ * @param {Map<number, TreeSkeleton>} grown each carrier's framework with its shoot systems grown
230
+ * @param {number[]} carriers
231
+ * @param {TreeShootPrototype[]} [records] where each carrier's branches land in the skeleton, recorded on its prototype
232
+ * @returns {TreeSkeleton}
233
+ */
234
+ function in_place(framework, grown, carriers, records) {
235
+ const out = new TreeSkeleton();
236
+ for (let i = 0; i < carriers.length; i++) {
237
+ const carrier = carriers[i];
238
+ const skeleton = grown.get(carrier);
239
+ // the carrier, and every shoot: after the framework, mothers before their laterals
240
+ const branches = [carrier];
241
+ for (let b = framework.branch_count; b < skeleton.branch_count; b++) branches.push(b);
242
+ if (records !== undefined) {
243
+ records[i].first = out.branch_count;
244
+ records[i].branch_count = branches.length;
245
+ }
246
+ tree_skeleton_copy_branches(skeleton, branches, out);
247
+ }
248
+ out.crown_center.set(framework.crown_center);
249
+ out.crown_radii.set(framework.crown_radii);
250
+ return out;
251
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * How a tree is grown. Both front ends grow the same `TreeSkeleton` and its leaves, which the rest of the pipeline
3
+ * draws alike (`TWO_FRONT_ENDS_BRIEF_2026_10_28.md`).
4
+ */
5
+ export type TreeGrowth = string;
6
+ export namespace TreeGrowth {
7
+ let Graph: string;
8
+ let Botanical: string;
9
+ }
10
+ //# sourceMappingURL=TreeGrowth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeGrowth.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/config/TreeGrowth.js"],"names":[],"mappings":";;;;yBAKU,MAAM"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * How a tree is grown. Both front ends grow the same `TreeSkeleton` and its leaves, which the rest of the pipeline
3
+ * draws alike (`TWO_FRONT_ENDS_BRIEF_2026_10_28.md`).
4
+ *
5
+ * @readonly
6
+ * @enum {string}
7
+ */
8
+ export const TreeGrowth = {
9
+ /**
10
+ * The framework of the generator graph alone (`tree_skeleton_grow_framework`): for real-time trees.
11
+ */
12
+ Graph: "graph",
13
+ /**
14
+ * The framework, then every shoot system on it, year by year in the crown's light (`tree_skeleton_grow`): for
15
+ * trees seen up close.
16
+ */
17
+ Botanical: "botanical",
18
+ };
@@ -4,6 +4,12 @@
4
4
  * @type {number}
5
5
  */
6
6
  export const TREE_LOD_ERROR_FINEST: number;
7
+ /**
8
+ * Ratio between consecutive errors a tree is cut at (`tree_lod_plan`'s search, a species' prototypes): each a
9
+ * half-octave coarser than the last.
10
+ * @type {number}
11
+ */
12
+ export const TREE_LOD_ERROR_STEP: number;
7
13
  /**
8
14
  * A level of detail: the tree drawn to a geometric error.
9
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TreeLODConfig.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/config/TreeLODConfig.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,oCAFU,MAAM,CAE0B;AAE1C;;GAEG;AACH;IAcI;;;OAGG;IACH,sBAHW,QAAQ,aAAa,CAAC,GACpB,aAAa,CAMzB;IAED;;;;;;OAMG;IACH,sCAJW,MAAM,UACN,MAAM,GACJ,aAAa,EAAE,CAY3B;IAxCD;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,OAFU,MAAM,CAEc;IA+B9B;;;OAGG;IACH,2BAHW,QAAQ,aAAa,CAAC,GACpB,IAAI,CAYhB;IAED;;;OAGG;IACH,YAHW,aAAa,GACX,IAAI,CAOhB;IAED;;OAEG;IACH,SAFa,aAAa,CAMzB;IAED;;;OAGG;IACH,cAHW,aAAa,GACX,OAAO,CAOnB;IAED;;OAEG;IACH,QAFa,MAAM,CAKlB;IAGL;;;OAGG;IACH,0BAFU,OAAO,CAEsB;CANtC"}
1
+ {"version":3,"file":"TreeLODConfig.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/config/TreeLODConfig.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,oCAFU,MAAM,CAE0B;AAE1C;;;;GAIG;AACH,kCAFU,MAAM,CAE8B;AAE9C;;GAEG;AACH;IAcI;;;OAGG;IACH,sBAHW,QAAQ,aAAa,CAAC,GACpB,aAAa,CAMzB;IAED;;;;;;OAMG;IACH,sCAJW,MAAM,UACN,MAAM,GACJ,aAAa,EAAE,CAY3B;IAxCD;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,OAFU,MAAM,CAEc;IA+B9B;;;OAGG;IACH,2BAHW,QAAQ,aAAa,CAAC,GACpB,IAAI,CAYhB;IAED;;;OAGG;IACH,YAHW,aAAa,GACX,IAAI,CAOhB;IAED;;OAEG;IACH,SAFa,aAAa,CAMzB;IAED;;;OAGG;IACH,cAHW,aAAa,GACX,OAAO,CAOnB;IAED;;OAEG;IACH,QAFa,MAAM,CAKlB;IAGL;;;OAGG;IACH,0BAFU,OAAO,CAEsB;CANtC"}
@@ -9,6 +9,13 @@ import { computeHashFloat } from "../../../core/primitives/numbers/computeHashFl
9
9
  */
10
10
  export const TREE_LOD_ERROR_FINEST = 0.01;
11
11
 
12
+ /**
13
+ * Ratio between consecutive errors a tree is cut at (`tree_lod_plan`'s search, a species' prototypes): each a
14
+ * half-octave coarser than the last.
15
+ * @type {number}
16
+ */
17
+ export const TREE_LOD_ERROR_STEP = Math.SQRT2;
18
+
12
19
  /**
13
20
  * A level of detail: the tree drawn to a geometric error.
14
21
  */
@@ -3,6 +3,7 @@ export { PhyllotaxisMode } from "./config/PhyllotaxisMode.js";
3
3
  export { FoliageCardType } from "./config/FoliageCardType.js";
4
4
  export { FoliageBarkType } from "./config/FoliageBarkType.js";
5
5
  export { TreePreset } from "./config/TreePreset.js";
6
+ export { TreeGrowth } from "./config/TreeGrowth.js";
6
7
  export { BranchGeneratorConfig } from "./config/BranchGeneratorConfig.js";
7
8
  export { BranchSpawnRule } from "./config/BranchSpawnRule.js";
8
9
  export { FoliageSpawnRule } from "./config/FoliageSpawnRule.js";
@@ -22,6 +23,7 @@ export { make_tree_species_preset } from "./presets/make_tree_species_preset.js"
22
23
  export { TreeSkeleton } from "./skeleton/TreeSkeleton.js";
23
24
  export { spine_frame_double_reflection } from "./skeleton/spine_frame_double_reflection.js";
24
25
  export { tree_skeleton_grow } from "./skeleton/tree_skeleton_grow.js";
26
+ export { tree_skeleton_grow_framework } from "./skeleton/tree_skeleton_grow_framework.js";
25
27
  export { tree_skeleton_compute_pipe_radii } from "./skeleton/tree_skeleton_compute_pipe_radii.js";
26
28
  export { tree_skeleton_assign_skin_joints } from "./skeleton/tree_skeleton_assign_skin_joints.js";
27
29
  export { branch_collar_project } from "./mesh/branch_collar_project.js";
@@ -52,5 +54,6 @@ export { tree_mesh_build_bark, geometry_obtain_joints_attribute } from "./mesh/t
52
54
  export { FoliageAtlasCutout, CUTOUT_HULL_VERTEX_COUNT } from "./material/FoliageAtlasCutout.js";
53
55
  export { foliage_tile_layout, foliage_tile_raster } from "./material/foliage_tile.js";
54
56
  export { leaf_geometry, needle_shoot_geometry } from "./material/leaf_geometry.js";
57
+ export { TreeSpeciesCache, TREE_SPECIES_CACHE } from "./asset/TreeSpeciesCache.js";
55
58
  export { place_tree, unplace_tree } from "./asset/place_tree.js";
56
59
  //# sourceMappingURL=index.d.ts.map
@@ -3,6 +3,7 @@ export { PhyllotaxisMode } from "./config/PhyllotaxisMode.js";
3
3
  export { FoliageCardType } from "./config/FoliageCardType.js";
4
4
  export { FoliageBarkType } from "./config/FoliageBarkType.js";
5
5
  export { TreePreset } from "./config/TreePreset.js";
6
+ export { TreeGrowth } from "./config/TreeGrowth.js";
6
7
  export { BranchGeneratorConfig } from "./config/BranchGeneratorConfig.js";
7
8
  export { BranchSpawnRule } from "./config/BranchSpawnRule.js";
8
9
  export { FoliageSpawnRule } from "./config/FoliageSpawnRule.js";
@@ -25,6 +26,7 @@ export { TreeSkeleton } from "./skeleton/TreeSkeleton.js";
25
26
  export { crown_envelope_evaluate, crown_envelope_sdf } from "./skeleton/crown_envelope_evaluate.js";
26
27
  export { spine_frame_double_reflection } from "./skeleton/spine_frame_double_reflection.js";
27
28
  export { tree_skeleton_grow } from "./skeleton/tree_skeleton_grow.js";
29
+ export { tree_skeleton_grow_framework } from "./skeleton/tree_skeleton_grow_framework.js";
28
30
  export { tree_skeleton_compute_pipe_radii } from "./skeleton/tree_skeleton_compute_pipe_radii.js";
29
31
  export { tree_skeleton_assign_skin_joints } from "./skeleton/tree_skeleton_assign_skin_joints.js";
30
32
 
@@ -54,6 +56,7 @@ export { FoliageWindSystem } from "../../engine/graphics3/FoliageWindSystem.js";
54
56
 
55
57
  export { TreeLODAsset } from "./asset/TreeLODAsset.js";
56
58
  export { TreeAsset } from "./asset/TreeAsset.js";
59
+ export { TreeSpeciesCache, TREE_SPECIES_CACHE } from "./asset/TreeSpeciesCache.js";
57
60
  export { generate_tree } from "./asset/generate_tree.js";
58
61
  export { place_tree, unplace_tree } from "./asset/place_tree.js";
59
62
 
@@ -11,9 +11,9 @@
11
11
  * @property {number} shoot_length length of shoot a needle-shoot tile draws (m), 0 for a leaf
12
12
  * @property {number} outline the mature organ's finest feature of shape (m), its margin's teeth aside (`LeafGeometry`)
13
13
  * @property {number} texel the tile's texel (m): `card_size / resolution`
14
- * @property {number} legible_texel the coarsest texel (m) a cluster card may draw the organ at, as coarse as still tells
15
- * the leaf from another seen whole: its outline's finest feature `FEATURE_TEXELS` across; a needle, a line,
16
- * as a stem is, `STEM_TEXELS` across its width
14
+ * @property {number} legible_texel the coarsest texel (m) a cluster card draws the organ at while the tree's atlas holds
15
+ * its cover, as coarse as still tells the leaf from another seen whole: its outline's finest feature
16
+ * `FEATURE_TEXELS` across; a needle, a line, as a stem is, `STEM_TEXELS` across its width
17
17
  */
18
18
  /**
19
19
  * Maturity variants of a species' foliage atlas.
@@ -90,9 +90,9 @@ export type FoliageTileLayout = {
90
90
  */
91
91
  texel: number;
92
92
  /**
93
- * the coarsest texel (m) a cluster card may draw the organ at, as coarse as still tells
94
- * the leaf from another seen whole: its outline's finest feature `FEATURE_TEXELS` across; a needle, a line,
95
- * as a stem is, `STEM_TEXELS` across its width
93
+ * the coarsest texel (m) a cluster card draws the organ at while the tree's atlas holds
94
+ * its cover, as coarse as still tells the leaf from another seen whole: its outline's finest feature
95
+ * `FEATURE_TEXELS` across; a needle, a line, as a stem is, `STEM_TEXELS` across its width
96
96
  */
97
97
  legible_texel: number;
98
98
  };
@@ -60,9 +60,9 @@ const COVERAGE_ROWS = 4;
60
60
  * @property {number} shoot_length length of shoot a needle-shoot tile draws (m), 0 for a leaf
61
61
  * @property {number} outline the mature organ's finest feature of shape (m), its margin's teeth aside (`LeafGeometry`)
62
62
  * @property {number} texel the tile's texel (m): `card_size / resolution`
63
- * @property {number} legible_texel the coarsest texel (m) a cluster card may draw the organ at, as coarse as still tells
64
- * the leaf from another seen whole: its outline's finest feature `FEATURE_TEXELS` across; a needle, a line,
65
- * as a stem is, `STEM_TEXELS` across its width
63
+ * @property {number} legible_texel the coarsest texel (m) a cluster card draws the organ at while the tree's atlas holds
64
+ * its cover, as coarse as still tells the leaf from another seen whole: its outline's finest feature
65
+ * `FEATURE_TEXELS` across; a needle, a line, as a stem is, `STEM_TEXELS` across its width
66
66
  */
67
67
 
68
68
  /**
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The cluster cards of `skeleton` at each of `lods`' errors, all drawn with a few cuts' tiles in one atlas, no larger
3
+ * than `budget` (`tree_cluster_representatives`), baked from the leaves and twigs those cuts grew (`tree_cluster_bake`).
4
+ * A tree's own LODs are cut this way, and so are a species' prototypes.
5
+ *
6
+ * @param {import("../skeleton/TreeSkeleton.js").TreeSkeleton} skeleton
7
+ * @param {import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig} species
8
+ * @param {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet} attachments
9
+ * @param {import("../../../shade/renderer/geometry/Geometry.js").Geometry} leaves every leaf's card, in attachment order
10
+ * @param {import("../config/TreeLODConfig.js").TreeLODConfig[]} lods finest first
11
+ * @param {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial} leaf_material the
12
+ * leaves' material, whose textures the cuts are baked from
13
+ * @param {number} budget bytes of atlas, its maps' base levels
14
+ * @param {Map<number, ReturnType<typeof tree_mesh_compute_branch_rings>>} [planned] the bark's rings the caller has
15
+ * already planned, by error: taken rather than planned again
16
+ * @returns {{lods: Array<{clusters: import("../mesh/tree_clusters.js").TreeCluster[], cards: import("../mesh/tree_cluster_cards.js").TreeClusterCard[], error: number}>, representatives: *, bake: import("./tree_cluster_bake.js").TreeClusterBake, material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}}
17
+ */
18
+ export function tree_cluster_atlas(skeleton: import("../skeleton/TreeSkeleton.js").TreeSkeleton, species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, attachments: import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet, leaves: import("../../../shade/renderer/geometry/Geometry.js").Geometry, lods: import("../config/TreeLODConfig.js").TreeLODConfig[], leaf_material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial, budget: number, planned?: Map<number, Map<number, {
19
+ cx: number;
20
+ cy: number;
21
+ cz: number;
22
+ r: number;
23
+ m: number;
24
+ t_norm: number;
25
+ flute_amp: number;
26
+ j0: number;
27
+ j1: number;
28
+ j2: number;
29
+ j3: number;
30
+ w0: number;
31
+ w1: number;
32
+ w2: number;
33
+ w3: number;
34
+ }[]>>): {
35
+ lods: Array<{
36
+ clusters: import("../mesh/tree_clusters.js").TreeCluster[];
37
+ cards: import("../mesh/tree_cluster_cards.js").TreeClusterCard[];
38
+ error: number;
39
+ }>;
40
+ representatives: any;
41
+ bake: import("./tree_cluster_bake.js").TreeClusterBake;
42
+ material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial;
43
+ };
44
+ //# sourceMappingURL=tree_cluster_atlas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree_cluster_atlas.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/material/tree_cluster_atlas.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;GAgBG;AACH,6CAZW,OAAO,6BAA6B,EAAE,YAAY,WAClD,OAAO,gCAAgC,EAAE,iBAAiB,eAC1D,OAAO,wCAAwC,EAAE,oBAAoB,UACrE,OAAO,8CAA8C,EAAE,QAAQ,QAC/D,OAAO,4BAA4B,EAAE,aAAa,EAAE,iBACpD,OAAO,2DAA2D,EAAE,qBAAqB,UAEzF,MAAM,YACN,IAAI,MAAM;;;;;;;;;;;;;;;;KAAoD,GAE5D;IAAC,IAAI,EAAE,MAAM;QAAC,QAAQ,EAAE,OAAO,0BAA0B,EAAE,WAAW,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,+BAA+B,EAAE,eAAe,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAAC,eAAe,MAAI;IAAC,IAAI,EAAE,OAAO,wBAAwB,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,OAAO,2DAA2D,EAAE,qBAAqB,CAAA;CAAC,CAazV"}