@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
@@ -1,7 +1,6 @@
1
1
  import { assert } from "../../../core/assert.js";
2
2
  import { convex_hull_monotone_2d } from "../../../core/geom/2d/convex-hull/convex_hull_monotone_2d.js";
3
3
  import { StandardAttributes } from "../../../shade/renderer/geometry/StandardAttributes.js";
4
- import { tree_mesh_build_foliage } from "../mesh/tree_mesh_build_foliage.js";
5
4
 
6
5
  /**
7
6
  * Mean area (m^2) a tree's drawn envelope shows from the side, over every azimuth: the envelope is the convex hull of
@@ -81,9 +80,11 @@ export const TREE_RENDER_COST_CEILING = { triangle_density: [761.2, 412.3, 96.2]
81
80
  * @param {import("../skeleton/TreeSkeleton.js").TreeSkeleton} skeleton
82
81
  * @param {import("../../../shade/renderer/geometry/Geometry.js").Geometry|null} leaves every leaf's card
83
82
  * (`tree_mesh_build_foliage`), `null` for a leafless tree
83
+ * @param {Float32Array|null} [carried] the cards of the leaves it draws but does not hold, its shoot prototypes'
84
+ * (`tree_shoot_instance_leaves`): positions
84
85
  * @returns {number}
85
86
  */
86
- export function tree_grown_side_area(skeleton, leaves) {
87
+ export function tree_grown_side_area(skeleton, leaves, carried = null) {
87
88
  const nodes = new Float32Array(skeleton.node_count * 3);
88
89
  for (let v = 0; v < skeleton.node_count; v++) {
89
90
  skeleton.node_read_position(nodes, v * 3, v);
@@ -92,6 +93,9 @@ export function tree_grown_side_area(skeleton, leaves) {
92
93
  if (leaves !== null) {
93
94
  shown.push(leaves.getAttribute(StandardAttributes.Position).data);
94
95
  }
96
+ if (carried !== null && carried.length > 0) {
97
+ shown.push(carried);
98
+ }
95
99
  return tree_envelope_side_area(shown);
96
100
  }
97
101
 
@@ -108,7 +112,7 @@ function triangle_count(geometry) {
108
112
 
109
113
  /**
110
114
  * @typedef {Object} TreeRenderCost
111
- * @property {number} side_area m^2, `tree_grown_side_area`: what the tree grew shows from the side
115
+ * @property {number} side_area m^2, `tree_grown_side_area`: what the tree grew shows from the side (`TreeAsset.side_area`)
112
116
  * @property {number[]} triangles bark and foliage triangles of each LOD
113
117
  * @property {number[]} triangle_density each LOD's triangles per m^2 of `side_area`
114
118
  * @property {number[]} joints each LOD's wind joints
@@ -127,10 +131,7 @@ function triangle_count(geometry) {
127
131
  export function tree_render_cost(asset) {
128
132
  assert.greaterThan(asset.lods.length, 0, 'asset.lods.length');
129
133
 
130
- const leaves = asset.attachments.count > 0
131
- ? tree_mesh_build_foliage(asset.skeleton, asset.attachments, asset.config, asset.foliage_cutout)
132
- : null;
133
- const side_area = tree_grown_side_area(asset.skeleton, leaves);
134
+ const side_area = asset.side_area;
134
135
  assert.greaterThan(side_area, 0, 'side_area');
135
136
 
136
137
  const triangles = asset.lods.map(lod => triangle_count(lod.bark_geometry) + triangle_count(lod.foliage_geometry));
@@ -22,6 +22,23 @@ export class TreeAsset {
22
22
  * @type {import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet}
23
23
  */
24
24
  attachments: import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet;
25
+ /**
26
+ * What the tree grew shows from the side, m^2 (`tree_grown_side_area`): its wood and every leaf it draws, its
27
+ * shoot prototypes' included. Its LODs spend against it (`tree_lod_plan`, `tree_render_cost`).
28
+ * @type {number}
29
+ */
30
+ side_area: number;
31
+ /**
32
+ * The species' shoot prototypes it draws, when grown by its generator graph (`tree_shoot_prototypes`), else `null`:
33
+ * every leaf it draws is theirs, and `attachments` holds none.
34
+ * @type {import("./tree_shoot_prototypes.js").TreeShootPrototypes|null}
35
+ */
36
+ shoot_prototypes: import("./tree_shoot_prototypes.js").TreeShootPrototypes | null;
37
+ /**
38
+ * Where it draws them: one on each of its carriers (`tree_shoot_instances`), else `null`.
39
+ * @type {import("./tree_shoot_instances.js").TreeShootInstance[]|null}
40
+ */
41
+ shoot_instances: import("./tree_shoot_instances.js").TreeShootInstance[] | null;
25
42
  /**
26
43
  * The wind joints of all the wood as grown, which `attachments` are bound to; no LOD draws it, each has its own
27
44
  * (`TreeLODAsset.skin_info`).
@@ -1 +1 @@
1
- {"version":3,"file":"TreeAsset.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/TreeAsset.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH;IACI;;;OAGG;IACH,QAFU,OAAO,gCAAgC,EAAE,iBAAiB,CAEtD;IAEd;;;OAGG;IACH,UAFU,OAAO,6BAA6B,EAAE,YAAY,CAE5C;IAEhB;;;OAGG;IACH,aAFU,OAAO,wCAAwC,EAAE,oBAAoB,CAE5D;IAEnB;;;;OAIG;IACH,WAFU,6GAAsG,CAE/F;IAEjB;;;OAGG;IACH,eAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE9E;IAErB;;;OAGG;IACH,kBAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE3E;IAExB;;;OAGG;IACH,gBAFU,OAAO,mCAAmC,EAAE,kBAAkB,GAAC,IAAI,CAEvD;IAEtB;;;OAGG;IACH,MAFU,OAAO,mBAAmB,EAAE,YAAY,EAAE,CAE1C;IAEV;;;OAGG;IACH,qFAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,2GAEC;IAED;;;OAGG;IACH,8GAEC;IAED;;;OAGG;IACH,qGAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,0EAEC;IAGL;;;OAGG;IACH,sBAFU,OAAO,CAEc;CAN9B"}
1
+ {"version":3,"file":"TreeAsset.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/TreeAsset.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH;IACI;;;OAGG;IACH,QAFU,OAAO,gCAAgC,EAAE,iBAAiB,CAEtD;IAEd;;;OAGG;IACH,UAFU,OAAO,6BAA6B,EAAE,YAAY,CAE5C;IAEhB;;;OAGG;IACH,aAFU,OAAO,wCAAwC,EAAE,oBAAoB,CAE5D;IAEnB;;;;OAIG;IACH,WAFU,MAAM,CAEF;IAEd;;;;OAIG;IACH,kBAFU,OAAO,4BAA4B,EAAE,mBAAmB,GAAC,IAAI,CAE/C;IAExB;;;OAGG;IACH,iBAFU,OAAO,2BAA2B,EAAE,iBAAiB,EAAE,GAAC,IAAI,CAE/C;IAEvB;;;;OAIG;IACH,WAFU,6GAAsG,CAE/F;IAEjB;;;OAGG;IACH,eAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE9E;IAErB;;;OAGG;IACH,kBAFU,OAAO,2DAA2D,EAAE,qBAAqB,CAE3E;IAExB;;;OAGG;IACH,gBAFU,OAAO,mCAAmC,EAAE,kBAAkB,GAAC,IAAI,CAEvD;IAEtB;;;OAGG;IACH,MAFU,OAAO,mBAAmB,EAAE,YAAY,EAAE,CAE1C;IAEV;;;OAGG;IACH,qFAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,2GAEC;IAED;;;OAGG;IACH,8GAEC;IAED;;;OAGG;IACH,qGAEC;IAED;;;OAGG;IACH,wFAEC;IAED;;;OAGG;IACH,0EAEC;IAGL;;;OAGG;IACH,sBAFU,OAAO,CAEc;CAN9B"}
@@ -25,6 +25,26 @@ export class TreeAsset {
25
25
  */
26
26
  attachments = null;
27
27
 
28
+ /**
29
+ * What the tree grew shows from the side, m^2 (`tree_grown_side_area`): its wood and every leaf it draws, its
30
+ * shoot prototypes' included. Its LODs spend against it (`tree_lod_plan`, `tree_render_cost`).
31
+ * @type {number}
32
+ */
33
+ side_area = 0;
34
+
35
+ /**
36
+ * The species' shoot prototypes it draws, when grown by its generator graph (`tree_shoot_prototypes`), else `null`:
37
+ * every leaf it draws is theirs, and `attachments` holds none.
38
+ * @type {import("./tree_shoot_prototypes.js").TreeShootPrototypes|null}
39
+ */
40
+ shoot_prototypes = null;
41
+
42
+ /**
43
+ * Where it draws them: one on each of its carriers (`tree_shoot_instances`), else `null`.
44
+ * @type {import("./tree_shoot_instances.js").TreeShootInstance[]|null}
45
+ */
46
+ shoot_instances = null;
47
+
28
48
  /**
29
49
  * The wind joints of all the wood as grown, which `attachments` are bound to; no LOD draws it, each has its own
30
50
  * (`TreeLODAsset.skin_info`).
@@ -0,0 +1,69 @@
1
+ /**
2
+ * What every tree of a species shares, whatever its seed or how it grew: its bark material, its leaf atlas and its
3
+ * shoot prototypes, each made once, when a tree first asks for it (`generate_tree`'s `cache`). The caller owns it,
4
+ * and what it holds lives as long as it does.
5
+ *
6
+ * Each is keyed on exactly what it is made from: the bark material on the species' `bark_material`, the leaf atlas on
7
+ * its `foliage` and `foliage_material`, made from a species holding those alone, and the prototypes on the whole
8
+ * species but its seed, as they grow on its own framework. Trees that differ in nothing one is made from share it.
9
+ */
10
+ export class TreeSpeciesCache {
11
+ /**
12
+ * Lets go of everything held: the trees already made keep what they drew with.
13
+ */
14
+ clear(): void;
15
+ /**
16
+ * Number of bark materials held.
17
+ * @returns {number}
18
+ */
19
+ get bark_count(): number;
20
+ /**
21
+ * Number of leaf atlases held.
22
+ * @returns {number}
23
+ */
24
+ get leaf_count(): number;
25
+ /**
26
+ * Number of species whose shoot prototypes are held.
27
+ * @returns {number}
28
+ */
29
+ get prototype_count(): number;
30
+ /**
31
+ * The bark material of `species`, the same noise for every bark (`make_bark_material`'s own seed).
32
+ *
33
+ * @param {TreeSpeciesConfig} species
34
+ * @returns {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}
35
+ */
36
+ bark_material(species: TreeSpeciesConfig): import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial;
37
+ /**
38
+ * The leaf atlas of `species`, in the species' leaf material, which a tree clones to tint its own, and the atlas's
39
+ * shape.
40
+ *
41
+ * @param {TreeSpeciesConfig} species
42
+ * @returns {{material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial, cutout: FoliageAtlasCutout}}
43
+ */
44
+ leaves(species: TreeSpeciesConfig): {
45
+ material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial;
46
+ cutout: FoliageAtlasCutout;
47
+ };
48
+ /**
49
+ * The shoot prototypes of `species` (`tree_shoot_prototypes`), whatever its seed, their cuts baked from the leaves
50
+ * of `material`: its own leaf atlas (`leaves`) by default, or a caller's own material, whose atlas has no fitted
51
+ * shape (`cutout` null).
52
+ *
53
+ * @param {TreeSpeciesConfig} species
54
+ * @param {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial|null} [material]
55
+ * @param {FoliageAtlasCutout|null} [cutout] the shape of `material`'s atlas
56
+ * @returns {import("./tree_shoot_prototypes.js").TreeShootPrototypes}
57
+ */
58
+ prototypes(species: TreeSpeciesConfig, material?: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial | null, cutout?: FoliageAtlasCutout | null): import("./tree_shoot_prototypes.js").TreeShootPrototypes;
59
+ #private;
60
+ }
61
+ /**
62
+ * The cache `generate_tree` shares between the trees it is asked for without one of their own: each species' materials and
63
+ * shoot prototypes are made once, the first time a tree asks, and held until `clear`ed.
64
+ * @type {TreeSpeciesCache}
65
+ */
66
+ export const TREE_SPECIES_CACHE: TreeSpeciesCache;
67
+ import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
68
+ import { FoliageAtlasCutout } from "../material/FoliageAtlasCutout.js";
69
+ //# sourceMappingURL=TreeSpeciesCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeSpeciesCache.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/TreeSpeciesCache.js"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH;IAoBI;;OAEG;IACH,cAKC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,8BAEC;IAED;;;;;OAKG;IACH,uBAHW,iBAAiB,GACf,OAAO,2DAA2D,EAAE,qBAAqB,CAUrG;IAED;;;;;;OAMG;IACH,gBAHW,iBAAiB,GACf;QAAC,QAAQ,EAAE,OAAO,2DAA2D,EAAE,qBAAqB,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAC,CAe7I;IAED;;;;;;;;;OASG;IACH,oBALW,iBAAiB,aACjB,OAAO,2DAA2D,EAAE,qBAAqB,GAAC,IAAI,WAC9F,kBAAkB,GAAC,IAAI,GACrB,OAAO,4BAA4B,EAAE,mBAAmB,CAsBpE;;CACJ;AAED;;;;GAIG;AACH,iCAFU,gBAAgB,CAE+B;kCAjJvB,gCAAgC;mCAC/B,mCAAmC"}
@@ -0,0 +1,147 @@
1
+ import { HashMap } from "../../../core/collection/map/HashMap.js";
2
+ import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
3
+ import { FoliageAtlasCutout } from "../material/FoliageAtlasCutout.js";
4
+ import { make_bark_material } from "../material/make_bark_material.js";
5
+ import { make_foliage_material } from "../material/make_foliage_material.js";
6
+ import { tree_shoot_prototypes } from "./tree_shoot_prototypes.js";
7
+
8
+ /**
9
+ * What every tree of a species shares, whatever its seed or how it grew: its bark material, its leaf atlas and its
10
+ * shoot prototypes, each made once, when a tree first asks for it (`generate_tree`'s `cache`). The caller owns it,
11
+ * and what it holds lives as long as it does.
12
+ *
13
+ * Each is keyed on exactly what it is made from: the bark material on the species' `bark_material`, the leaf atlas on
14
+ * its `foliage` and `foliage_material`, made from a species holding those alone, and the prototypes on the whole
15
+ * species but its seed, as they grow on its own framework. Trees that differ in nothing one is made from share it.
16
+ */
17
+ export class TreeSpeciesCache {
18
+ /**
19
+ * Each bark material, by the `bark_material` it is made from.
20
+ * @type {HashMap<import("../config/BarkMaterialConfig.js").BarkMaterialConfig, import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial>}
21
+ */
22
+ #barks = new HashMap();
23
+
24
+ /**
25
+ * Each leaf atlas, by the species it is made from: one holding its `foliage` and `foliage_material` alone.
26
+ * @type {HashMap<TreeSpeciesConfig, {material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial, cutout: FoliageAtlasCutout}>}
27
+ */
28
+ #leaves = new HashMap();
29
+
30
+ /**
31
+ * Each species' shoot prototypes, by the species at their seed, then by the leaf material they are drawn with.
32
+ * @type {HashMap<TreeSpeciesConfig, Map<import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial, import("./tree_shoot_prototypes.js").TreeShootPrototypes>>}
33
+ */
34
+ #prototypes = new HashMap();
35
+ #prototype_count = 0;
36
+
37
+ /**
38
+ * Lets go of everything held: the trees already made keep what they drew with.
39
+ */
40
+ clear() {
41
+ this.#barks.clear();
42
+ this.#leaves.clear();
43
+ this.#prototypes.clear();
44
+ this.#prototype_count = 0;
45
+ }
46
+
47
+ /**
48
+ * Number of bark materials held.
49
+ * @returns {number}
50
+ */
51
+ get bark_count() {
52
+ return this.#barks.size;
53
+ }
54
+
55
+ /**
56
+ * Number of leaf atlases held.
57
+ * @returns {number}
58
+ */
59
+ get leaf_count() {
60
+ return this.#leaves.size;
61
+ }
62
+
63
+ /**
64
+ * Number of species whose shoot prototypes are held.
65
+ * @returns {number}
66
+ */
67
+ get prototype_count() {
68
+ return this.#prototype_count;
69
+ }
70
+
71
+ /**
72
+ * The bark material of `species`, the same noise for every bark (`make_bark_material`'s own seed).
73
+ *
74
+ * @param {TreeSpeciesConfig} species
75
+ * @returns {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial}
76
+ */
77
+ bark_material(species) {
78
+ let material = this.#barks.get(species.bark_material);
79
+ if (material === undefined) {
80
+ const held = species.bark_material.clone();
81
+ material = make_bark_material(held);
82
+ this.#barks.set(held, material);
83
+ }
84
+ return material;
85
+ }
86
+
87
+ /**
88
+ * The leaf atlas of `species`, in the species' leaf material, which a tree clones to tint its own, and the atlas's
89
+ * shape.
90
+ *
91
+ * @param {TreeSpeciesConfig} species
92
+ * @returns {{material: import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial, cutout: FoliageAtlasCutout}}
93
+ */
94
+ leaves(species) {
95
+ // the species as far as its leaves go, and no further: whatever the atlas reads, it reads from the key
96
+ const key = new TreeSpeciesConfig();
97
+ key.seed = 0;
98
+ key.foliage.copy(species.foliage);
99
+ key.foliage_material.copy(species.foliage_material);
100
+ let entry = this.#leaves.get(key);
101
+ if (entry === undefined) {
102
+ const cutout = new FoliageAtlasCutout();
103
+ entry = { material: make_foliage_material(key, cutout), cutout };
104
+ this.#leaves.set(key, entry);
105
+ }
106
+ return entry;
107
+ }
108
+
109
+ /**
110
+ * The shoot prototypes of `species` (`tree_shoot_prototypes`), whatever its seed, their cuts baked from the leaves
111
+ * of `material`: its own leaf atlas (`leaves`) by default, or a caller's own material, whose atlas has no fitted
112
+ * shape (`cutout` null).
113
+ *
114
+ * @param {TreeSpeciesConfig} species
115
+ * @param {import("../../../shade/renderer/material/StandardShadeMaterial.js").StandardShadeMaterial|null} [material]
116
+ * @param {FoliageAtlasCutout|null} [cutout] the shape of `material`'s atlas
117
+ * @returns {import("./tree_shoot_prototypes.js").TreeShootPrototypes}
118
+ */
119
+ prototypes(species, material = null, cutout = null) {
120
+ if (material === null) {
121
+ const leaves = this.leaves(species);
122
+ material = leaves.material;
123
+ cutout = leaves.cutout;
124
+ }
125
+ const key = species.clone();
126
+ key.seed = 0;
127
+ let by_material = this.#prototypes.get(key);
128
+ if (by_material === undefined) {
129
+ by_material = new Map();
130
+ this.#prototypes.set(key, by_material);
131
+ }
132
+ let prototypes = by_material.get(material);
133
+ if (prototypes === undefined) {
134
+ prototypes = tree_shoot_prototypes(key, material, cutout);
135
+ by_material.set(material, prototypes);
136
+ this.#prototype_count++;
137
+ }
138
+ return prototypes;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * The cache `generate_tree` shares between the trees it is asked for without one of their own: each species' materials and
144
+ * shoot prototypes are made once, the first time a tree asks, and held until `clear`ed.
145
+ * @type {TreeSpeciesCache}
146
+ */
147
+ export const TREE_SPECIES_CACHE = new TreeSpeciesCache();
@@ -7,6 +7,16 @@
7
7
  * - A `TreeSpeciesConfig` instance (`generate_tree(species_config)`).
8
8
  * - An options object (`generate_tree({ preset: "birch", seed: 42, crown: { height: 14 }, lod_count: 3 })`).
9
9
  *
10
+ * The options object also picks how the tree is grown, `growth` (`TreeGrowth`, by its generator graph unless given):
11
+ * its generator graph's framework with its species' shoot prototypes drawn on it, for most trees; or that framework
12
+ * with every shoot system grown on it, for trees seen up close. Both are drawn by one pipeline. A species is described
13
+ * for the front end that grows it (`make_tree_species_preset`'s `growth`): a preset's name is described for `growth`;
14
+ * a caller's own `TreeSpeciesConfig` is grown as it is, by the generator graph when passed alone, or by `growth` when
15
+ * passed as the options object's `species`. Its `cache`, a
16
+ * `TreeSpeciesCache`, shares each species' bark material, leaf atlas and shoot prototypes between the trees it grows;
17
+ * without one, every call shares `TREE_SPECIES_CACHE`. A caller's own materials (`custom_bark_material`,
18
+ * `custom_foliage_material`) are drawn with instead.
19
+ *
10
20
  * Each LOD is the tree drawn to a geometric error (`TreeLODConfig.error`): the finest at which its bark and its
11
21
  * foliage, and its wind joints, fit that LOD's `TREE_RENDER_COST_CEILING` over the side area of the leaves and wood
12
22
  * the tree grew (`tree_lod_plan`, `tree_grown_side_area`). Its foliage is one card per cluster (`tree_clusters`), each
@@ -1 +1 @@
1
- {"version":3,"file":"generate_tree.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/generate_tree.js"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wCAHW,MAAM,GAAC,OAAO,gCAAgC,EAAE,iBAAiB,MAAO,GACtE,SAAS,CAyIrB;0BAlKyB,gBAAgB"}
1
+ {"version":3,"file":"generate_tree.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/generate_tree.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wCAHW,MAAM,GAAC,OAAO,gCAAgC,EAAE,iBAAiB,MAAO,GACtE,SAAS,CA6JrB;0BAlMyB,gBAAgB"}
@@ -1,16 +1,11 @@
1
+ import { assert } from "../../../core/assert.js";
1
2
  import { TREE_RENDER_COST_CEILING, tree_grown_side_area } from "../analysis/tree_render_cost.js";
2
3
  import { build_tree_wind_rig } from "../animation/build_tree_wind_rig.js";
3
4
  import { TREE_LOD_ERROR_FINEST } from "../config/TreeLODConfig.js";
5
+ import { TreeGrowth } from "../config/TreeGrowth.js";
4
6
  import { TreePreset } from "../config/TreePreset.js";
5
- import { FoliageAtlasCutout } from "../material/FoliageAtlasCutout.js";
6
- import { make_bark_material } from "../material/make_bark_material.js";
7
- import { foliage_material_from_samplers } from "../material/foliage_material_from_samplers.js";
8
- import { make_foliage_material } from "../material/make_foliage_material.js";
9
- import { tree_cluster_bake } from "../material/tree_cluster_bake.js";
7
+ import { tree_cluster_atlas } from "../material/tree_cluster_atlas.js";
10
8
  import { foliage_collect_attachments } from "../mesh/foliage_collect_attachments.js";
11
- import { foliage_tile_layout } from "../material/foliage_tile.js";
12
- import { tree_cluster_cards } from "../mesh/tree_cluster_cards.js";
13
- import { tree_cluster_representatives } from "../mesh/tree_cluster_representatives.js";
14
9
  import { tree_clusters } from "../mesh/tree_clusters.js";
15
10
  import { tree_mesh_build_bark, tree_mesh_compute_branch_rings } from "../mesh/tree_mesh_build_bark.js";
16
11
  import { tree_mesh_build_clusters } from "../mesh/tree_mesh_build_clusters.js";
@@ -19,8 +14,11 @@ import { make_tree_species_preset } from "../presets/make_tree_species_preset.js
19
14
  import { tree_skeleton_assign_skin_joints } from "../skeleton/tree_skeleton_assign_skin_joints.js";
20
15
  import { tree_skeleton_bind_skin_joints } from "../skeleton/tree_skeleton_bind_skin_joints.js";
21
16
  import { tree_skeleton_grow } from "../skeleton/tree_skeleton_grow.js";
17
+ import { tree_skeleton_grow_framework } from "../skeleton/tree_skeleton_grow_framework.js";
22
18
  import { TreeAsset } from "./TreeAsset.js";
23
19
  import { TreeLODAsset } from "./TreeLODAsset.js";
20
+ import { TREE_SPECIES_CACHE } from "./TreeSpeciesCache.js";
21
+ import { tree_shoot_instance_card_count, tree_shoot_instance_cards, tree_shoot_instance_leaves, tree_shoot_instances } from "./tree_shoot_instances.js";
24
22
  import { tree_lod_plan } from "./tree_lod_plan.js";
25
23
 
26
24
  /**
@@ -32,6 +30,16 @@ import { tree_lod_plan } from "./tree_lod_plan.js";
32
30
  * - A `TreeSpeciesConfig` instance (`generate_tree(species_config)`).
33
31
  * - An options object (`generate_tree({ preset: "birch", seed: 42, crown: { height: 14 }, lod_count: 3 })`).
34
32
  *
33
+ * The options object also picks how the tree is grown, `growth` (`TreeGrowth`, by its generator graph unless given):
34
+ * its generator graph's framework with its species' shoot prototypes drawn on it, for most trees; or that framework
35
+ * with every shoot system grown on it, for trees seen up close. Both are drawn by one pipeline. A species is described
36
+ * for the front end that grows it (`make_tree_species_preset`'s `growth`): a preset's name is described for `growth`;
37
+ * a caller's own `TreeSpeciesConfig` is grown as it is, by the generator graph when passed alone, or by `growth` when
38
+ * passed as the options object's `species`. Its `cache`, a
39
+ * `TreeSpeciesCache`, shares each species' bark material, leaf atlas and shoot prototypes between the trees it grows;
40
+ * without one, every call shares `TREE_SPECIES_CACHE`. A caller's own materials (`custom_bark_material`,
41
+ * `custom_foliage_material`) are drawn with instead.
42
+ *
35
43
  * Each LOD is the tree drawn to a geometric error (`TreeLODConfig.error`): the finest at which its bark and its
36
44
  * foliage, and its wind joints, fit that LOD's `TREE_RENDER_COST_CEILING` over the side area of the leaves and wood
37
45
  * the tree grew (`tree_lod_plan`, `tree_grown_side_area`). Its foliage is one card per cluster (`tree_clusters`), each
@@ -51,15 +59,21 @@ export function generate_tree(options = {}) {
51
59
  let eager_meshlets = false;
52
60
  let custom_bark_material = null;
53
61
  let custom_foliage_material = null;
62
+ // the generator graph unless an options object asks for another
63
+ let growth = TreeGrowth.Graph;
64
+ let cache = null;
54
65
 
55
66
  if (typeof options === "string") {
56
- config = make_tree_species_preset(options);
67
+ config = make_tree_species_preset(options, {}, growth);
57
68
  } else if (options && options.isTreeSpeciesConfig) {
58
69
  config = options.clone();
59
70
  } else {
60
71
  const opts = options || {};
61
72
  const preset = opts.preset ?? TreePreset.Oak;
62
- config = make_tree_species_preset(preset, opts);
73
+ growth = opts.growth ?? growth;
74
+ cache = opts.cache ?? null;
75
+ assert.enum(growth, TreeGrowth, "growth");
76
+ config = opts.species?.isTreeSpeciesConfig ? opts.species.clone() : make_tree_species_preset(preset, opts, growth);
63
77
  eager_meshlets = Boolean(opts.eager_meshlets);
64
78
  if (opts.custom_bark_material && opts.custom_bark_material.isShadeMaterial) {
65
79
  custom_bark_material = opts.custom_bark_material;
@@ -69,13 +83,18 @@ export function generate_tree(options = {}) {
69
83
  }
70
84
  }
71
85
 
72
- const skeleton = tree_skeleton_grow(config);
86
+ const skeleton = growth === TreeGrowth.Graph ? tree_skeleton_grow_framework(config) : tree_skeleton_grow(config);
87
+ // what every tree of its species shares, made only where the caller gave none of its own
88
+ const species_cache = cache ?? TREE_SPECIES_CACHE;
89
+ // a tree grown by its generator graph draws its species' shoot prototypes on its carriers
90
+ const prototypes = growth === TreeGrowth.Graph && config.shoot_rules.length > 0
91
+ ? species_cache.prototypes(config, custom_foliage_material)
92
+ : null;
93
+ const instances = prototypes !== null ? tree_shoot_instances(skeleton, prototypes) : null;
73
94
  // the rig of all the wood as grown, which the leaves as grown are bound to
74
95
  const skin_info = tree_skeleton_assign_skin_joints(skeleton, config);
75
96
 
76
- const bark_material = custom_bark_material !== null
77
- ? custom_bark_material
78
- : make_bark_material(config.bark_material, config.seed);
97
+ const bark_material = custom_bark_material !== null ? custom_bark_material : species_cache.bark_material(config);
79
98
 
80
99
  // The atlas's shape sets how many cards a shoot carries and, for hull cards, their outline. A caller's own
81
100
  // material has no fitted outline, so its cards cover whole tiles, at the density our atlas would need.
@@ -84,8 +103,10 @@ export function generate_tree(options = {}) {
84
103
  if (custom_foliage_material !== null) {
85
104
  foliage_material = custom_foliage_material;
86
105
  } else if (config.foliage_rules.length > 0) {
87
- foliage_cutout = new FoliageAtlasCutout();
88
- foliage_material = make_foliage_material(config, foliage_cutout);
106
+ // the species' atlas, in a material of the tree's own, which its leaves' tints scale
107
+ const leaves = species_cache.leaves(config);
108
+ foliage_cutout = leaves.cutout;
109
+ foliage_material = leaves.material.clone();
89
110
  }
90
111
  // The cards anchor on the bark's rings at the finest LOD's error. The LOD search's first step plans the rings at
91
112
  // TREE_LOD_ERROR_FINEST with the skeleton still bound to the rig as grown, as here: where the two errors are one,
@@ -117,8 +138,14 @@ export function generate_tree(options = {}) {
117
138
  // otherwise be held for as long as any LOD is not
118
139
  const has_leaves = attachments.count > 0 && foliage_material !== null;
119
140
  const grow_leaves = () => tree_mesh_build_foliage(skeleton, attachments, config, foliage_cutout);
120
- const side_area = tree_grown_side_area(skeleton, has_leaves ? grow_leaves() : null);
121
- const plan = tree_lod_plan(skeleton, config, attachments, side_area, config.lods.length, planned);
141
+ const draws_prototypes = prototypes !== null && prototypes.atlas !== null;
142
+ const side_area = tree_grown_side_area(skeleton, has_leaves ? grow_leaves() : null,
143
+ instances !== null ? tree_shoot_instance_leaves(skeleton, instances, prototypes) : null);
144
+ asset.side_area = side_area;
145
+ asset.shoot_prototypes = prototypes;
146
+ asset.shoot_instances = instances;
147
+ const plan = tree_lod_plan(skeleton, config, attachments, side_area, config.lods.length, planned,
148
+ instances !== null ? (error) => tree_shoot_instance_card_count(instances, prototypes, error) : null);
122
149
  const lod_configs = plan.map((p, i) => {
123
150
  const lod_cfg = config.lods[i].clone();
124
151
  lod_cfg.error = p.error;
@@ -130,17 +157,8 @@ export function generate_tree(options = {}) {
130
157
  let shared = null;
131
158
  const cluster_atlas = () => {
132
159
  if (shared === null) {
133
- const leaves = grow_leaves();
134
- const lods = lod_configs.map((lod_cfg) => {
135
- const clusters = tree_clusters(skeleton, attachments, tree_mesh_compute_branch_rings(skeleton, config, lod_cfg));
136
- return { clusters, cards: tree_cluster_cards(skeleton, attachments, leaves, clusters), error: lod_cfg.error };
137
- });
138
- const tiles = foliage_tile_layout(config);
139
- const representatives = tree_cluster_representatives(skeleton, attachments, leaves, lods, tiles.texel,
140
- tiles.legible_texel, TREE_RENDER_COST_CEILING.texture_density * side_area);
141
- const bake = tree_cluster_bake(skeleton, config, representatives.cards, attachments, leaves, foliage_material, representatives.texels);
142
- const material = foliage_material_from_samplers(bake.albedo, bake.normal, bake.orm, "foliage_clusters");
143
- shared = { lods, representatives, bake, material };
160
+ shared = tree_cluster_atlas(skeleton, config, attachments, grow_leaves(), lod_configs, foliage_material,
161
+ TREE_RENDER_COST_CEILING.texture_density * side_area);
144
162
  }
145
163
  return shared;
146
164
  };
@@ -157,6 +175,16 @@ export function generate_tree(options = {}) {
157
175
  return tree_mesh_build_bark(skeleton, config, lod_cfg);
158
176
  },
159
177
  () => {
178
+ if (instances !== null) {
179
+ if (!draws_prototypes) return null;
180
+ // its prototypes' cuts at its error, on its own rig
181
+ tree_skeleton_bind_skin_joints(skeleton, lod_skin);
182
+ const rings = tree_mesh_compute_branch_rings(skeleton, config, lod_cfg);
183
+ const { clusters, cards, placement } = tree_shoot_instance_cards(skeleton, rings, instances, prototypes, lod_cfg.error);
184
+ const geometry = tree_mesh_build_clusters(skeleton, config, clusters, cards, placement, prototypes.atlas.bake);
185
+ if (geometry === null) return null;
186
+ return { geometry, material: prototypes.atlas.material };
187
+ }
160
188
  if (!has_leaves) return null;
161
189
  tree_skeleton_bind_skin_joints(skeleton, lod_skin);
162
190
  const clusters = tree_clusters(skeleton, attachments, tree_mesh_compute_branch_rings(skeleton, config, lod_cfg));
@@ -10,7 +10,8 @@
10
10
  *
11
11
  * @param {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} scene_context
12
12
  * @param {import("../../../engine/ecs/EntityComponentDataset.js").EntityComponentDataset} dataset
13
- * @param {Object} [options={}]
13
+ * @param {Object} [options={}] without a `tree` or a `prefab`, the tree is grown from these by `generate_tree` (its
14
+ * `preset`, `seed`, `growth`, `cache` and the rest)
14
15
  * @param {import("./TreeAsset.js").TreeAsset} [options.tree] pre-generated `TreeAsset`
15
16
  * @param {import("../../../engine/graphics3/prefab/Prefab.js").Prefab} [options.prefab] pre-compiled `Prefab`
16
17
  * @param {number} [options.lod=0] LOD index when placing from `TreeAsset`
@@ -1 +1 @@
1
- {"version":3,"file":"place_tree.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/place_tree.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,0CAxBW,OAAO,kDAAkD,EAAE,eAAe,WAC1E,OAAO,+CAA+C,EAAE,sBAAsB;IAEjC,IAAI,GAAjD,OAAO,gBAAgB,EAAE,SAAS;IACoC,MAAM,GAA5E,OAAO,4CAA4C,EAAE,MAAM;IAC1C,GAAG,GAApB,MAAM;IACgB,SAAS,GAA/B,WAAW;IACqC,QAAQ,GAAxD,MAAM,EAAE,GAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC;IACoB,QAAQ,GAAjE,MAAM,EAAE,GAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC;IAC7B,UAAU,GAA3B,MAAM;IACiD,KAAK,GAA5D,MAAM,GAAC,MAAM,EAAE,GAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC;IAC1B,IAAI,GAAtB,OAAO;IACU,WAAW,GAA5B,MAAM;IACW,iBAAiB,GAAlC,MAAM;IACJ;IACZ,IAAQ,EAAE,MAAM,CAAC;IACjB,QAAY,EAAE,OAAO,oDAAoD,EAAE,cAAc,CAAC;IAC1F,KAAS,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,GAAC,IAAI,CAAC;IACpD,eAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAS,EAAE,MAAM,CAAC;IAClB,IAAQ,EAAE,OAAO,gBAAgB,EAAE,SAAS,GAAC,IAAI,CAAC;IAClD,MAAU,EAAE,OAAO,4CAA4C,EAAE,MAAM,CAAA;CACpE,CA+HH;AAED;;;;;;;GAOG;AACH,4CAJW,OAAO,kDAAkD,EAAE,eAAe,WAC1E,OAAO,+CAA+C,EAAE,sBAAsB,UAC9E,WAAW,iBAAiB,CAAC,QAiBvC;4BA/L2B,8CAA8C"}
1
+ {"version":3,"file":"place_tree.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/place_tree.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,0CAzBW,OAAO,kDAAkD,EAAE,eAAe,WAC1E,OAAO,+CAA+C,EAAE,sBAAsB;IAGjC,IAAI,GAAjD,OAAO,gBAAgB,EAAE,SAAS;IACoC,MAAM,GAA5E,OAAO,4CAA4C,EAAE,MAAM;IAC1C,GAAG,GAApB,MAAM;IACgB,SAAS,GAA/B,WAAW;IACqC,QAAQ,GAAxD,MAAM,EAAE,GAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC;IACoB,QAAQ,GAAjE,MAAM,EAAE,GAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC;IAC7B,UAAU,GAA3B,MAAM;IACiD,KAAK,GAA5D,MAAM,GAAC,MAAM,EAAE,GAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC;IAC1B,IAAI,GAAtB,OAAO;IACU,WAAW,GAA5B,MAAM;IACW,iBAAiB,GAAlC,MAAM;IACJ;IACZ,IAAQ,EAAE,MAAM,CAAC;IACjB,QAAY,EAAE,OAAO,oDAAoD,EAAE,cAAc,CAAC;IAC1F,KAAS,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,GAAC,IAAI,CAAC;IACpD,eAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAS,EAAE,MAAM,CAAC;IAClB,IAAQ,EAAE,OAAO,gBAAgB,EAAE,SAAS,GAAC,IAAI,CAAC;IAClD,MAAU,EAAE,OAAO,4CAA4C,EAAE,MAAM,CAAA;CACpE,CA+HH;AAED;;;;;;;GAOG;AACH,4CAJW,OAAO,kDAAkD,EAAE,eAAe,WAC1E,OAAO,+CAA+C,EAAE,sBAAsB,UAC9E,WAAW,iBAAiB,CAAC,QAiBvC;4BAhM2B,8CAA8C"}
@@ -19,7 +19,8 @@ import { generate_tree } from "./generate_tree.js";
19
19
  *
20
20
  * @param {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} scene_context
21
21
  * @param {import("../../../engine/ecs/EntityComponentDataset.js").EntityComponentDataset} dataset
22
- * @param {Object} [options={}]
22
+ * @param {Object} [options={}] without a `tree` or a `prefab`, the tree is grown from these by `generate_tree` (its
23
+ * `preset`, `seed`, `growth`, `cache` and the rest)
23
24
  * @param {import("./TreeAsset.js").TreeAsset} [options.tree] pre-generated `TreeAsset`
24
25
  * @param {import("../../../engine/graphics3/prefab/Prefab.js").Prefab} [options.prefab] pre-compiled `Prefab`
25
26
  * @param {number} [options.lod=0] LOD index when placing from `TreeAsset`
@@ -21,7 +21,7 @@ export function tree_triangles_at_error(skeleton: import("../skeleton/TreeSkelet
21
21
  * `TREE_RENDER_COST_CEILING` over `side_area` (`tree_grown_side_area`), its bark and cluster cards in triangles and,
22
22
  * when it is rigged for wind, its joints, no finer than the LOD before it and no finer than `TREE_LOD_ERROR_FINEST`:
23
23
  * each halving of the error quadruples the cluster cards' texels, which no ceiling yet bounds. Errors are tried a
24
- * half-octave apart ({@link ERROR_STEP}), up from the finest until the tree fits, or until it draws no wood at all.
24
+ * half-octave apart ({@link TREE_LOD_ERROR_STEP}), up from the finest until the tree fits, or until it draws no wood at all.
25
25
  *
26
26
  * An LOD's rig (`tree_skeleton_assign_skin_joints`) is on the wood it draws, at a tolerance no finer than its error
27
27
  * (a sway smaller than the shape's error cannot be seen), and its joints are a subset of the finer LOD's. The
@@ -35,6 +35,8 @@ export function tree_triangles_at_error(skeleton: import("../skeleton/TreeSkelet
35
35
  * @param {Map<number, ReturnType<typeof tree_mesh_compute_branch_rings>>} [planned] the bark's rings the caller has
36
36
  * already planned (`tree_mesh_compute_branch_rings`), by error: the search takes them rather than planning them
37
37
  * again
38
+ * @param {((error: number) => number)|null} [cards] how many cards the tree draws at an error, where they are not its
39
+ * own cuts (`tree_shoot_instance_card_count`); its own clusters (`tree_clusters`) by default
38
40
  * @returns {TreeLODPlan[]}
39
41
  */
40
42
  export function tree_lod_plan(skeleton: import("../skeleton/TreeSkeleton.js").TreeSkeleton, species: import("../config/TreeSpeciesConfig.js").TreeSpeciesConfig, attachments: import("../mesh/foliage_collect_attachments.js").FoliageAttachmentSet, side_area: number, lod_count: number, planned?: Map<number, Map<number, {
@@ -53,7 +55,7 @@ export function tree_lod_plan(skeleton: import("../skeleton/TreeSkeleton.js").Tr
53
55
  w1: number;
54
56
  w2: number;
55
57
  w3: number;
56
- }[]>>): TreeLODPlan[];
58
+ }[]>>, cards?: ((error: number) => number) | null): TreeLODPlan[];
57
59
  /**
58
60
  * One LOD of a tree: the error it is drawn to and the rig on the wood it draws.
59
61
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tree_lod_plan.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/tree_lod_plan.js"],"names":[],"mappings":"AAqCA;;;;;;;;;GASG;AACH,kDANW,OAAO,6BAA6B,EAAE,YAAY,WAClD,OAAO,gCAAgC,EAAE,iBAAiB,eAC1D,OAAO,wCAAwC,EAAE,oBAAoB,SACrE,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wCAVW,OAAO,6BAA6B,EAAE,YAAY,WAClD,OAAO,gCAAgC,EAAE,iBAAiB,eAC1D,OAAO,wCAAwC,EAAE,oBAAoB,aACrE,MAAM,aACN,MAAM,YACN,IAAI,MAAM;;;;;;;;;;;;;;;;KAAoD,GAG5D,WAAW,EAAE,CAwCzB;;;;;;;;WA/Da,MAAM;;;;eACN,WAAW,uCAAuC,CAAC;;iDAnDhB,iDAAiD"}
1
+ {"version":3,"file":"tree_lod_plan.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/asset/tree_lod_plan.js"],"names":[],"mappings":"AAiCA;;;;;;;;;GASG;AACH,kDANW,OAAO,6BAA6B,EAAE,YAAY,WAClD,OAAO,gCAAgC,EAAE,iBAAiB,eAC1D,OAAO,wCAAwC,EAAE,oBAAoB,SACrE,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wCAZW,OAAO,6BAA6B,EAAE,YAAY,WAClD,OAAO,gCAAgC,EAAE,iBAAiB,eAC1D,OAAO,wCAAwC,EAAE,oBAAoB,aACrE,MAAM,aACN,MAAM,YACN,IAAI,MAAM;;;;;;;;;;;;;;;;KAAoD,UAG9D,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAC,IAAI,GAE9B,WAAW,EAAE,CAwCzB;;;;;;;;WAjEa,MAAM;;;;eACN,WAAW,uCAAuC,CAAC;;iDA/ChB,iDAAiD"}