@woosh/meep-engine 3.60.4 → 3.60.6

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 (419) hide show
  1. package/CHANGELOG.md +2621 -0
  2. package/CONTRIBUTING.md +7 -0
  3. package/MIGRATION_2_TO_3.md +136 -0
  4. package/SECURITY.md +4 -0
  5. package/editor/EditorCameraNavigation.d.ts +2 -1
  6. package/editor/EditorCameraNavigation.d.ts.map +1 -1
  7. package/editor/EditorCameraNavigation.js +51 -57
  8. package/package.json +6 -2
  9. package/src/engine/EngineHarness.d.ts +3 -9
  10. package/src/engine/EngineHarness.d.ts.map +1 -1
  11. package/src/engine/EngineHarness.js +6 -8
  12. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
  13. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
  14. package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
  15. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
  16. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
  17. package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
  18. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
  19. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
  20. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
  21. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
  22. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  23. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
  24. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
  25. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  26. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
  27. package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
  28. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  29. package/src/engine/graphics/ecs/water/Water.js +8 -0
  30. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  31. package/src/engine/graphics3/WaterSystem.js +731 -734
  32. package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
  33. package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
  34. package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
  35. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
  36. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
  38. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
  39. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
  40. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
  41. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
  42. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
  43. package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
  44. package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
  45. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  46. package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
  47. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
  48. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
  49. package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
  50. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
  51. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
  52. package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
  53. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
  54. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
  55. package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
  56. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
  57. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
  58. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
  59. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  60. package/src/shade/playground/water_refraction/README.md +5 -6
  61. package/src/shade/playground/water_refraction/index.html +1 -1
  62. package/src/shade/renderer/Renderer.d.ts +11 -0
  63. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  64. package/src/shade/renderer/Renderer.js +50 -6
  65. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
  66. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  67. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
  68. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  69. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  70. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  71. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  72. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  73. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +28 -45
  74. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  75. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +111 -119
  76. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +22 -3
  77. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  78. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +84 -3
  79. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts +19 -0
  80. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts.map +1 -0
  81. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.js +25 -0
  82. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
  83. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
  84. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
  85. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +15 -0
  86. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -1
  87. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +38 -0
  88. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
  89. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
  90. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
  91. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
  92. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
  93. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +28 -59
  94. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -1
  95. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +84 -789
  96. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -8
  98. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +7 -6
  99. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  100. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +12 -11
  101. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -2
  102. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -2
  103. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +1 -4
  104. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1 -10
  106. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
  107. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
  108. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
  109. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  110. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
  111. package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
  112. package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
  113. package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
  114. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
  115. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
  116. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
  117. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
  118. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
  119. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
  120. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
  121. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  122. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
  123. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
  124. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
  125. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
  126. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
  127. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
  128. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
  129. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
  130. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
  131. package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
  132. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
  133. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  134. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
  135. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
  136. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
  137. package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
  138. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  139. package/src/shade/renderer/material/GPUMaterialManager.d.ts +11 -1
  140. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  141. package/src/shade/renderer/material/GPUMaterialManager.js +16 -8
  142. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
  143. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  144. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
  145. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +7 -3
  146. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  147. package/src/shade/renderer/postprocess/gtao/GTAO.js +26 -13
  148. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts +14 -0
  149. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  150. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +196 -68
  151. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  152. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +42 -28
  153. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  154. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +429 -414
  155. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts +16 -0
  156. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts.map +1 -0
  157. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js +156 -0
  158. package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -2
  159. package/src/shade/renderer/scene/GPUSceneContext.js +5 -5
  160. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  161. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
  162. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
  163. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  164. package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
  165. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
  166. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
  167. package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
  168. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  169. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  170. package/src/shade/renderer/water/shader_water.js +22 -13
  171. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  172. package/src/shade/renderer/water/shader_water_avboit.js +7 -7
  173. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
  174. package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
  175. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
  176. package/editor/REWORK_PLAN_2026_08.md +0 -692
  177. package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
  178. package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
  179. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
  180. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
  181. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
  182. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
  183. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
  184. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
  185. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
  186. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
  187. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
  188. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
  189. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
  190. package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
  191. package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
  192. package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
  193. package/src/REVIEW_2026_08_06/adv-core.md +0 -511
  194. package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
  195. package/src/REVIEW_2026_08_06/adv-view.md +0 -446
  196. package/src/REVIEW_2026_08_06/api-core.md +0 -296
  197. package/src/REVIEW_2026_08_06/api-engine.md +0 -195
  198. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
  199. package/src/REVIEW_2026_08_06/core-binary.md +0 -348
  200. package/src/REVIEW_2026_08_06/core-collection.md +0 -376
  201. package/src/REVIEW_2026_08_06/core-math.md +0 -221
  202. package/src/REVIEW_2026_08_06/core-process.md +0 -266
  203. package/src/REVIEW_2026_08_06/core-science.md +0 -223
  204. package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
  205. package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
  206. package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
  207. package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
  208. package/src/REVIEW_2026_08_06/engine-input.md +0 -197
  209. package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
  210. package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
  211. package/src/REVIEW_2026_08_06/generation.md +0 -176
  212. package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
  213. package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
  214. package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
  215. package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
  216. package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
  217. package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
  218. package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
  219. package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
  220. package/src/REVIEW_2026_08_06/view.md +0 -667
  221. package/src/REVIEW_2026_08_06.md +0 -610
  222. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
  223. package/src/core/bvh2/bvh3/NOTES.md +0 -2
  224. package/src/core/bvh8/NOTES.md +0 -63
  225. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
  226. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
  227. package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
  228. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
  229. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
  230. package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
  231. package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
  232. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
  233. package/src/core/geom/3d/gjk/NOTES.md +0 -8
  234. package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
  235. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
  236. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
  237. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
  238. package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
  239. package/src/engine/REVIEW_2026_07_03.md +0 -211
  240. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
  241. package/src/engine/control/first-person/DESIGN.md +0 -658
  242. package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
  243. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
  244. package/src/engine/control/first-person/TODO.md +0 -160
  245. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
  246. package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
  247. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
  248. package/src/engine/ecs/ik/PLAN.md +0 -179
  249. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
  250. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
  251. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
  252. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
  253. package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
  254. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
  255. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
  256. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
  257. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
  258. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
  259. package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
  260. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
  261. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
  262. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
  263. package/src/engine/network/CONGESTION_CONTROL.md +0 -87
  264. package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
  265. package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
  266. package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
  267. package/src/engine/physics/cloth/PLAN.md +0 -3056
  268. package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
  269. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
  270. package/src/engine/physics/fluid/solver/NOTES.md +0 -46
  271. package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
  272. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
  273. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
  274. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
  275. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
  276. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
  277. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
  278. package/src/format/image/avif/DECISIONS.md +0 -545
  279. package/src/format/image/jpeg/NOTES.md +0 -3
  280. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
  281. package/src/generation/COORDINATES.md +0 -54
  282. package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
  283. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
  284. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
  285. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
  286. package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
  287. package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
  288. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
  289. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
  290. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
  291. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
  292. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
  293. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
  294. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
  295. package/src/shade/RENDERER_CONTRACT.md +0 -697
  296. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
  297. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
  298. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
  299. package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
  300. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
  301. package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
  302. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
  303. package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
  304. package/src/shade/renderer/NOTES.md +0 -78
  305. package/src/shade/renderer/PLAN.md +0 -8
  306. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
  307. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
  308. package/src/shade/renderer/atmosphere/NOTES.md +0 -6
  309. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
  310. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
  311. package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
  312. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
  313. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
  314. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
  315. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
  316. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
  317. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
  318. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
  319. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
  320. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
  321. package/src/shade/renderer/camera/orbital/README.md +0 -81
  322. package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
  323. package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
  324. package/src/shade/renderer/camera/orbital/index.js +0 -9
  325. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
  326. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
  327. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
  328. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
  329. package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
  330. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
  331. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
  332. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
  333. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
  334. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -481
  335. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
  336. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
  337. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
  338. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
  339. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
  340. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
  341. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
  342. package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -529
  343. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +0 -47
  344. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +0 -1
  345. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +0 -80
  346. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +0 -16
  347. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +0 -1
  348. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +0 -67
  349. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +0 -17
  350. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +0 -1
  351. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +0 -145
  352. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +0 -12
  353. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +0 -1
  354. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +0 -105
  355. package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
  356. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4306
  357. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
  358. package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
  359. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
  360. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
  361. package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
  362. package/src/shade/renderer/hiz/NOTES.md +0 -3
  363. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
  364. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
  365. package/src/shade/renderer/light/cluster/NOTES.md +0 -11
  366. package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
  367. package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
  368. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
  369. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
  370. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
  371. package/src/shade/renderer/particles/DESIGN.md +0 -1011
  372. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -280
  373. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
  374. package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
  375. package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
  376. package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
  377. package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
  378. package/src/shade/renderer/postprocess/nss/NOTES.md +0 -332
  379. package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
  380. package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
  381. package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
  382. package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
  383. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
  384. package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
  385. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
  386. package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
  387. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
  388. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
  389. package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
  390. package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
  391. package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -391
  392. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -153
  393. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
  394. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
  395. package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
  396. package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
  397. package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
  398. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
  399. package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
  400. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
  401. package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
  402. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -927
  403. package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
  404. package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
  405. package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
  406. package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
  407. package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
  408. package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
  409. package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
  410. package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
  411. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
  412. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
  413. package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -3
  414. package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
  415. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
  416. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
  417. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
  418. package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
  419. package/src/shade/wgsl/NOTES.md +0 -4
@@ -1,347 +0,0 @@
1
- # A Framework Grown from Shoots
2
-
3
- Alex, 2026-10-26: grow the framework from the same shoot demography and light as the twigs (self-organizing), keeping
4
- the generator graph only for what shoots cannot give. Brief first.
5
-
6
- Why: `CROWN_FULLNESS_BRIEF_2026_10_26.md`. The crowns are bare because the authored framework is sparse
7
- (`BranchSpawnRule.count`). Vigour does not fill them; doubling the counts does. Every bare preset carries a third to
8
- two-thirds of the leaf a real tree of its size does.
9
-
10
- ## Today
11
-
12
- 1. **`tree_skeleton_grow`** builds the framework from the generator graph. `branches[0]` is the trunk, and each
13
- `branch_rules` edge spawns `count` branches of one generator along another. The generator graph supplies:
14
- - Hermite spines with tropisms (gravitropism, phototropism, plagiotropism, straightness, curl-noise gnarl, nodal
15
- kinks);
16
- - phyllotaxis, whorls, splits, space colonization toward an authored crown envelope, and BVH avoidance;
17
- - dead stubs and scars (`self_pruning`), surface roots, flare lobes;
18
- - pipe-model radii.
19
- 2. **`tree_skeleton_grow_shoots`** then grows the twig layer on the finished framework, season by season. The work is
20
- done by `shoot_systems_simulate`: a light field, net yield by light, shedding, dynamic girth (`ShootGirth`),
21
- collision against the framework, and engulfment. A carrier's age is backed out of its position.
22
-
23
- The framework's density, its bough count, its envelope and its age are all authored or backed out. Only the
24
- periphery is grown.
25
-
26
- ## Principle
27
-
28
- A tree is its shoots. From the seedling on, each season every living axis extends and its buds burst by the
29
- species' bud demography. Each new shoot is kept as its light pays for it, and the wood thickens with what it carries.
30
- - **The framework** is the shoots that survived.
31
- - **Bough spacing** is what self-shading leaves.
32
- - **The crown's extent** is where the leaders reached in the tree's age.
33
- - **Natural pruning** is the lower boughs starving.
34
-
35
- This is the self-organizing tree of Palubicki et al. (2009, *ACM Trans. Graph.* 28(3): 58): bud fate by local light
36
- and space, and growth year by year. LIGNUM (Perttunen et al. 1996, *Ann. Bot.* 77: 87-98) grows a whole tree from
37
- annual units the same way. The simulation already is this, for the periphery; extending it to the whole tree is the
38
- change.
39
-
40
- **What shoots cannot give**, so the generator graph keeps it:
41
- - **The root system:** surface roots and the flare lobes. These are not shoot growth.
42
- - **Monocots:** the palm and the fern grow fronds from one apical meristem, with no lateral shoot system. Their
43
- presets stay on the graph entirely.
44
- - **The seed:** the seedling's first leader, its position, and the trunk guide as an initial direction.
45
-
46
- ## Design
47
-
48
- 1. **One simulation from the seedling.**
49
- - `tree_skeleton_grow` lays the roots and a seed leader.
50
- - `shoot_systems_simulate` grows everything else for the tree's `age` seasons: the leader is an order-1 axis, the
51
- boughs are its laterals, and so on down the orders. Each preset's `shoot_rules` cover every order from the stem
52
- out, not only the periphery.
53
- - Carriers, "framework age" and `branch_unit_start_t`'s carrier back-fill go away: every axis records its own units
54
- as it grows them.
55
- 2. **The light field grows with the crown.** The voxel grid follows the crown's bounds each season, not a fixed
56
- framework box, at the same cell. Cost is still grid cells times 17 sweeps.
57
- 3. **Shoots keep out of all older wood.** Each shoot is tested against wood as thick as it is that season.
58
- - That replaces the BVH avoidance and the framework hash: one spatial hash over every living segment, updated
59
- incrementally, since each season only adds units and thickens wood.
60
- - Engulfment stays: wood that thickening wood grows into dies.
61
- 4. **Natural pruning is shade death.**
62
- - A whole bough dies when its shoots cannot pay for themselves (`Rb < 1` everywhere on it). Today that holds for
63
- twig axes only.
64
- - Its dead wood persists as a stub by the species' `self_pruning`, as the graph's stubs do now, then heals over
65
- into a scar (`TreeSkeleton.add_scar`).
66
- - The graph's stub and scar code moves to the simulation, driven by deaths rather than an authored `attach_min`.
67
- 5. **Tropisms per axis order.**
68
- - The shoot simulation already turns each new unit by its generator's gravitropism, phototropism and zigzag.
69
- Plagiotropism and straightness move over from the graph's spine to the unit's heading.
70
- - Older wood does not move once grown, except by bending (fork F3).
71
- 6. **Architecture stays sourced data.**
72
- - **Excurrent conifers:** a leader whose terminal is longest and whose whorl buds burst every year.
73
- - **Sympodial birch:** the apex aborts and the subapical buds take over, already in the rule.
74
- - **Decurrent oak:** the order lengths fall with order.
75
- - These are the rules' per-order lengths and bud zones. No apical-control constant is added unless a measurement
76
- shows the forms do not come out (fork F4).
77
- 7. **The bark mesher, the wind rig and the foliage** keep reading the skeleton as they do. Every branch is now a
78
- chain of annual units: more nodes on old boughs, one a year.
79
-
80
- ## Data per species
81
-
82
- What the rules need from the stem out, and what the presets already cite:
83
-
84
- | preset | stem and boughs | gap |
85
- | :--- | :--- | :--- |
86
- | pine | leader 47.5 cm/yr and shoot counts by branch order [Kellomäki & Kurttio 1991] | the leader rule bears no laterals today; the stem's whorl bud counts are to be found, in KK1991 or elsewhere |
87
- | spruce | Colin & Houllier 1992 (whorl and interwhorl branches); lengths by order from pine | leader growth borrowed from pine |
88
- | birch | stem long shoot 26.3 cm [Lintunen et al. 2011, Table A2]; Maillette 1982 orders | stem bud zones as the branches' |
89
- | maple | stem is Wilson's order 1, leader 30 cm/yr [Wilson 1966; Critchfield 1971] | none known |
90
- | willow | Remphrey & Pearn 2006 orders | stem rule |
91
- | oak | Buck-Sorlin & Bell 2000 cover mature crowns' peripheral branches, not the stem or boughs; leader 0.3 m/yr is chosen | a source for oak's leader and bough demography (sapling architecture studies) |
92
- | hazel | a stool: basal sprouts from the root collar [Grisafi et al. 2024 for the shoots] | the stool's sprout recruitment |
93
-
94
- **Targets (acceptance):**
95
- - whole-tree leaf area within the allometric range at the tree's DBH (`CROWN_FULLNESS_BRIEF`, Forrester et al. 2017,
96
- Martin et al. 1998, Repola 2009);
97
- - FIA crown density 45-51% with transparency near 15% [Randolph 2006];
98
- - a height-to-diameter ratio in the measured range for the species.
99
-
100
- ## Decisions (Alex, 2026-10-26)
101
-
102
- - **F1:** from the seedling, for the tree's age.
103
- - **F2:** sapwood carries the leaf: girth from the species' leaf-to-sapwood ratio, with heartwood inside.
104
- - **F3:** static sag from the beam mechanics.
105
- - **F4:** no apical control until a measurement asks for it (as recommended; not asked).
106
- - **F5:** research a *Quercus* stem and bough source; oak keeps its graph framework until then.
107
-
108
- ## Forks
109
-
110
- - **F1 Time.** Simulate from the seedling for the tree's age, or start from a sapling.
111
- - Recommended: **from the seedling**. The size then follows from the leader growth and the age, and nothing is
112
- backed out.
113
- - The preset's input becomes `age` (seasons).
114
- - **F2 Wood.** The pipe model at `pipe_model_exponent` over Table 7 shoot radii gives an 87 cm DBH oak 8.6 m tall.
115
- - Recommended: **sapwood carries the leaf** (Shinozaki et al. 1964). A cross-section's sapwood area is the leaf
116
- area it carries over the species' measured leaf-to-sapwood ratio (Norway spruce 0.45 m²/cm², Pokorný & Tomášková
117
- 2007; red maple and oaks from Martin et al. 1998), and heartwood accrues inside it.
118
- - The ratio is sourced, and the DBH then follows from the leaf. It lands in the same pass (`ShootGirth`).
119
- - **F3 Bending.** Old boughs droop under their own weight; graph spines fake it with authored curvature.
120
- - Recommended: **static sag from the existing beam mechanics.** The segment compliance and loads are already
121
- computed for the wind joints, so the deflection under self-weight comes from them, applied once per season as the
122
- wood grows.
123
- - Alternatively, defer, and tropisms alone shape the boughs.
124
- - **F4 Apical control.** Recommended: none beyond the rules' order lengths at first, then measured. Add a sourced
125
- control only if the excurrent and decurrent forms do not emerge.
126
- - **F5 Oak's stem data.** Recommended: research a sapling or young-tree architecture source for *Quercus* before oak
127
- migrates. Until then, oak keeps its graph framework and the brief says so.
128
-
129
- ## Plan
130
-
131
- 1. **S0, the gate.** A probe and spec that measure every preset against the targets: leaf area vs allometry, FIA
132
- density and transparency, H/D, crown width/height. Run on master as the baseline.
133
- 2. **S1, pine end to end.**
134
- - The seed leader plus the whole-tree simulation (light field following the crown, collision against all wood,
135
- shade death of boughs). Roots stay on the graph.
136
- - Pine first: the best data from the stem out.
137
- - Measure against S0; look at it.
138
- 3. **S2, wood from leaf** (F2): sapwood by the leaf-to-sapwood ratio, heartwood, and the H/D check.
139
- 4. **S3, stubs and scars from deaths**, moved off the graph.
140
- 5. **S4, bending** (F3), if taken.
141
- 6. **S5, the other species:** spruce, maple, birch, willow, hazel, then oak once F5 has a source. Each is measured
142
- against S0 and looked at.
143
- 7. **S6, removal.** Struck 2026-10-28: the generator graph is a front end of its own (TWO_FRONT_ENDS_BRIEF_2026_10_28.md,
144
- G-F7), so its crown machinery stays.
145
- - The graph's crown machinery goes for shoot-grown species (hard break): branch spawn rules above the roots, space
146
- colonization, the crown envelope's growth role, BVH avoidance, and the back-filled carrier ages.
147
- - Specs are restated from their principle. Tiers come from whorls; collision is "a shoot never grows into older
148
- wood".
149
- - Mutation-tested.
150
-
151
- ## Risks, to measure, not assume
152
-
153
- - **Cost.** The whole tree as shoots means more axes and seasons. Today spruce is 3.1 s with 40k twig axes. Measure at
154
- S1, then decide whether the light field or the hash needs work. There is no preset budget.
155
- - **Mesh size.** Old boughs get a node a year. Measure node and triangle counts at S1 against today's.
156
- - **Specs.** Most framework specs restate (tiers, collisions, stubs, seams); the root and monocot specs stand.
157
- - **The trunk's look.** Flare lobes and bark keep working on any trunk. The trunk guide becomes the seed leader's
158
- initial heading plus tropisms.
159
-
160
- ## S0 baseline (seed 1337, master 7d610267e)
161
-
162
- `analysis/tree_leaf_area_targets.js` holds the sourced allometries; the gate probe compares each preset to them at the
163
- tree's own DBH and height, and reports the DBH a measured tree carrying the preset's leaf would have.
164
-
165
- | preset | DBH | height | H/D | leaf | expected at its DBH | leaf implies DBH | side density | transparency |
166
- | :--- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
167
- | oak | 87 cm | 8.6 m | 10 | 89 m² | 1,347-2,297 m² (outside every sample) | 19 cm | 0.50 | 0.42 |
168
- | pine | 73 cm | 10.7 m | 15 | 16 m² | 168-245 m² (outside every sample) | 16 cm | 0.34 | 0.64 |
169
- | birch | 62 cm | 10.5 m | 17 | 70 m² | 582 m² (outside the sample) | 20 cm | 0.56 | 0.33 |
170
- | maple | 88 cm | 8.6 m | 10 | 51 m² | 899 m² (outside the sample) | 17 cm | 0.41 | 0.42 |
171
- | spruce | 69 cm | 10.8 m | 16 | 78 m² | 482-730 m² | 21 cm | 0.33 | 0.31 |
172
-
173
- Every tree fails the leaf gate by 6-16x at its own DBH, because both halves are off: the trunks are three to four
174
- times too thick (S2), and the crowns carry a third to two-thirds of the leaf of a tree as tall (S1). Willow, palm,
175
- shrub and fern have no allometry. Only oak and fern sit in the FIA density band; no preset is near 15% transparency.
176
-
177
- ## S1 status (2026-10-26, uncommitted)
178
-
179
- **Built:**
180
- - **The stem from the seed.** The graph lays a seed leader (the first year's shoot) and the roots. A carrier that
181
- stops growing before the tree's `ShootGrowthConfig.age` grows on from its tip as an axis of its own order and
182
- generator, and is written onto the carrier, so the trunk is one branch from the ground up.
183
- - **The leader by height.** The stem grows `leader_unit(height)` a year: KK1991 Eq. 6's logistic. KK1991 grow the
184
- stem this way because the stem's terminal ratio (1.196) has no bound.
185
- - **Per-order demography.** `ShootSystemRule.target` is a generator per mother order (the stem's laterals draw the
186
- bough generator, the rest twigs); `mean_unit_length` is per order; a new shoot survives at Rb over the gross yield of
187
- the unit it grew on, counted at that unit's own length.
188
- - **Light, ground, crown frame.** The light field is rebuilt round the crown as it grows; no shoot grows into the
189
- ground; the crown frame the shoots' phototropism reads follows the living crown.
190
- - **The pine preset** is one shoot rule from the stem out [KK1991 Tables 3-4, Fig. 2], 30 seasons.
191
-
192
- **Measured against the gate (seed 1337):**
193
-
194
- | | master | S1 |
195
- | :--- | ---: | ---: |
196
- | height | 10.7 m | 12.2 m |
197
- | DBH | 73 cm | 25 cm |
198
- | H/D | 15 | 48 |
199
- | crown width | 5.0 m | 10.9 m |
200
- | leaf | 16 m² | 279 m² |
201
- | side density / transparency | 0.34 / 0.64 | 0.57 / 0.33 |
202
- | nodes | 5,374 | 81,890 |
203
-
204
- - **Height and girth.** H/D 48 falls in the 40-55 the open-grown evidence suggests (stand-grown pine runs 52-89;
205
- Kellomäki 1984, Hu et al. 2020). The leader's onset in Eq. 6 is refitted to open-grown heights: KK1991's 11.16
206
- extrapolates below their 1.1 m smallest tree and takes 15 years to the first metre; 4.34 fits eleven open-grown
207
- trees of known age (Kuuluvainen et al. 1988; Sievänen et al. 1997), RMS 1.3 m, 11.1 m at 30 years against 11.4 m.
208
- - **Leaf over the forest allometry.** 279 m² against 36-63 m² for a forest pine of DBH 25 cm; but the target is
209
- forest-grown and this tree carries its crown to the ground.
210
- - **Against an open-grown checkpoint** (Kuuluvainen et al. 1988, Table 3: age 8, 2.73 m tall, crown 1.70 m wide,
211
- 1.38 kg of needles, 110.6 m of shoots, 9.4 branches a whorl), the seedling pine at about 2 m: crown 1.3-1.8 m wide;
212
- 18-23 m of shoots and 0.27-0.34 kg of needles; 7-16 living boughs.
213
- - **Other presets** moved with the shared changes: oak 89 → 80 m², maple 51 → 56, willow 233 → 249, shrub 63 → 71.
214
- - **Specs:** 12 fail, all reading pine's old structure (inter-whorl branches, graph tiers and stubs, the graph trunk's
215
- L/D bound of 26, its righting reflex). The stem leans 0.16 where the graph's trunk held 0.08.
216
-
217
- **Two measured defects remain, both forks:**
218
-
219
- - **F6, the stem's whorl.** The stem bursts KK1991's 3.99 + 0.022 L daughters, and the shedding then keeps each at
220
- Rb / yield ≈ 0.45, with Rb = 1.867 measured on a branch (Niinemets & Lukjanova 2003). So about one bough survives
221
- a year, against 9.4 living branches a whorl on open-grown trees (Kuuluvainen et al. 1988) and 5-6 in young stands
222
- (Kellomäki 1984). KK1991's counts are living shoots already.
223
- - **F7, the boughs never slow.** A bough's first shoot is 0.570 of the stem's (27 cm under a 47.5 cm leader), and each
224
- terminal 0.995 of the last, so a bough grows ~27 cm a year for its life: 5-6 m boughs at 25 years and a crown 10.9 m
225
- wide. KK1991 say so themselves and cap a branch's length by a stand-grown fit (Eq. 9, Bmax 142 ± 44 cm, Kellomäki
226
- et al. 1988). Light does not bind: bough tips see 0.8-0.96 of open sky in the young tree, median 0.81 at 30 years,
227
- so shoot length by light (Niinemets & Lukjanova 2003, Fig. 3B) would barely shorten them. Drawing KK1991's
228
- terminal ratios with their measured spread (cv 44-58%) was tried and reverted: independent ratios make a
229
- heavy-tailed random walk (crowns 2.4-4.6 m wide across three seeds at the same age), which KK1991's model is not.
230
-
231
- ## Decisions on F6 and F7 (Alex, 2026-10-26: "parametric, principled, broadly general, one code path; you choose")
232
-
233
- - **F6: full light keeps every shoot the bud demography gives.** Rb at saturation is the gross yield of the unit a
234
- shoot grows on (`shoot_expected_yield` at that unit's length), not a per-species constant; it falls to 1 at the
235
- compensation light and below it as before, so a new shoot survives at `Rb(Q) / yield`, 1 in full light. This is
236
- what maple's net counts and the shrub's gross yield already did by hand, made the rule; `ShootGrowthConfig.vigour`
237
- goes. The per-species Rb measurements become cross-checks.
238
- - **F7: Borchert-Honda apical control** (Palubicki et al. 2009, *ACM TOG* 28(3): 58, after Borchert & Honda 1984).
239
- Each season the light each axis's tip receives is summed down every subtree to the carrier; it flows back up, and
240
- at each node the continuing axis takes a share weighted `λ` and the laterals `1 − λ`. A shoot's unit is its
241
- demographic mean length times its vigour per unit of its own light. At `λ = 0.5` that ratio is 1 everywhere, so a
242
- species with no fitted `λ` grows as before on the same code path. Pine's `λ` is fitted to the open-grown crown of
243
- Kuuluvainen et al. (1988, Table 3): 1.70 m wide at 2.73 m tall. The stem keeps its height-driven leader.
244
-
245
- ## After F6 and F7 (seed 1337, uncommitted)
246
-
247
- Built as decided, plus two fixes the stem's lean exposed:
248
- - **Phototropism follows the light field.** A shoot turns towards where the field grows brighter (its gradient), not
249
- away from the crown frame's centre: that pushed a lopsided crown's leader further off, a feedback that leaned the
250
- stem 0.15. `shoot_outward3` is gone; the crown frame still follows the grown crown for the foliage and its shading.
251
- - **Zigzag kinks a unit, not the course.** An axis's heading carries its tropisms; each unit is kinked off it by the
252
- generator's zigzag. Accumulated into the heading, the zigzag was a random walk.
253
-
254
- | | master | S1 now | target |
255
- | :--- | ---: | ---: | :--- |
256
- | height | 10.7 m | 10.9 m | 11.4 m at 30 years, open-grown |
257
- | DBH, H/D | 73 cm, 15 | 15 cm, 70 | 40-55 open-grown (estimate); 52-89 stands |
258
- | crown width | 5.0 m | 7.3 m | unknown for an open-grown 11 m pine |
259
- | leaf | 16 m² | 70 m² | 15-25 m² for a forest pine of DBH 15 cm |
260
- | side density / transparency | 0.34 / 0.64 | 0.44 / 0.54 | 0.45-0.51 / 0.15 |
261
- | stem lean | | 0.004-0.020 over 7 seeds | spec: under 0.08 |
262
-
263
- At the open-grown checkpoint (Kuuluvainen et al. 1988, Table 3) the 12-year pine, 2.6-3.5 m tall, has a crown
264
- 0.59-0.64 of its height (0.62) and 56-107 m of shoots (110.6 m at 2.73 m).
265
-
266
- **Other presets** under F6 (full light keeps every shoot): oak 80 → 110 m² and density 0.47 (in band), maple 56 → 84 m²
267
- and 0.46 (in band), birch 74 → 61, willow 249 → 236, spruce 81 → 84, shrub 71 → 42 (its partial-light Rb now ramps to
268
- each unit's own yield, not to the yield at its mean length).
269
-
270
- **Specs: 15 fail.** Pine's old structure: inter-whorl branches, graph tiers and stubs, the graph trunk's L/D bound of
271
- 26 and its crookedness, the conical spire, a plagiotropic trunk's knocked-out buds, branch crossings (shoots do not yet
272
- keep out of each other's wood, design 3), bark relief on boughs, preset traits. Oak: the wind spec compares a leafy and
273
- a bare oak, which now grow different wood (no leaves, so full light everywhere, so every shoot kept), and one oak spec
274
- timed out at 60 s under load.
275
-
276
- ## S1 finished: shoots keep out of older wood, specs restated (2026-10-27, uncommitted)
277
-
278
- **Shoots keep out of all older wood** (design 3), in `ShootWoodHash` beside `ShootFrameworkHash`:
279
- - **The hash.** Every grown annual unit is added once under the cells its line crosses (0.1 m, about a twig's unit;
280
- measured against 0.25 and 0.05 m). A query reads each unit's place and radius as they are, padded by the thickest
281
- wood, so thickening needs no re-adding. Exact pre-filters: a unit nowhere as thick as the probe needs, a padded box
282
- test, and each cell's thickest living unit, refreshed once a season.
283
- - **Blocked buds.** A new unit does not grow into the ground, framework wood, or older shoot wood it does not join. A
284
- blocked bud turns by the golden angle round its node, as the plagiotropic knockout already did; a blocked terminal
285
- waits a season.
286
- - **Junctions.** One wood with: its mother either side of where it grew and over its crotch (nearer her axis than her
287
- radius); its grandmother where it grew at its mother's base; a carrier's extension and the carrier's laterals by its
288
- tip; siblings' first units within the collar they share (out of the mother's wood, at least half way, as the
289
- interpenetration spec always held siblings).
290
- - **Engulfed and buried.** A shoot whose line thicker wood (or as thick and older), compared where they meet, has
291
- grown into dies. So does a lateral whose tip the wood its mother grew since has closed over: one that grew out of
292
- wood already there, as on a carrier the graph laid at its full girth, is not buried. A carrier its parent has grown
293
- over dies with its twigs; a graph branch the thickening buries is dead, an occluded knot, not a stub.
294
- - **Leaves pay.** A lateral of a generator that bears no leaves (no foliage rule) does not grow. Under F6 a crown that
295
- casts no shade kept every bud and grew by its gross yield every year (an oak with `foliage_rules: []` took 92 s). Every
296
- preset's shoot generators bear leaves, so no preset changes.
297
- - **Plagiotropism and straightness** turn a shoot's course as they turn the graph's spines (design 5); a stem is a
298
- trunk and takes neither, nor knocks out its buds.
299
-
300
- **Measured (seed 1337):**
301
-
302
- | preset | leaf | side density | transparency | skeleton |
303
- | :--- | ---: | ---: | ---: | ---: |
304
- | pine | 62 m² | 0.43 | 0.57 | 1.4 s |
305
- | oak | 102 m² | 0.49 (in band) | 0.39 | 0.5 s |
306
- | maple | 81 m² | 0.45 (in band) | 0.37 | |
307
- | spruce | 52 m² | 0.30 | 0.31 | 2.7 s |
308
- | birch | 58 m² | 0.54 | 0.35 | |
309
-
310
- Pine: 10.8 m, DBH 15 cm, H/D 73, crown 7.3 m wide; 78k nodes, 641k triangles. The open-grown checkpoint still holds
311
- (crown 0.54-0.66 of height at 12 years, 0.62 measured). Stem lean 0.001-0.011 over seven seeds.
312
-
313
- **Specs.** Restated from their principle:
314
- - pine's traits: the graph lays only roots, one shoot rule grows the stem and all on it;
315
- - the spire is the leader's newest unit and what grows on it (the trunk's unit record);
316
- - the trunk's apex is no thicker than a current shoot of its newest unit's length;
317
- - per-unit slenderness for any branch the shoots grew on past its generator's length; sweep only for trunks the
318
- graph grew;
319
- - a split fork is the graph's: same depth and generator, not a shoot rule's;
320
- - tiers come from a whorl: the graph's whorled rules, or a shoot's buds all under its terminal bud;
321
- - spruce's twigs fan in from whorl and inter-whorl boughs; the pine's stem bears its boughs and its boughs the twigs;
322
- - stubs are dead graph wood that sticks out of the bark, grown without the twig layer; pine grows none yet (S3);
323
- - foliage collection and the wind rig read the same oak, grown in the shade of its own leaves;
324
- - interpenetration: every child has a crotch; shoots are held to "no line inside other wood", spurs aside; a twig on a
325
- carrier the graph laid at full girth is not buried;
326
- - bark relief compares every consecutive pair of trunk rings of one vertex count; the youngest bark is on any shoot;
327
- - senescence follows the crown's mean dryness, the most dried card bounding it;
328
- - the tiers spec grows twelve conifers with their foliage and has 180 s.
329
- New: `tree_skeleton_grow_seedling.spec.js` (leader by height, one stem from the ground, height at age, no shoot in the
330
- ground, carriers growing on, apical control), `ShootWoodHash.spec.js`, survival (`shoot_survival`), dead wood bears no
331
- shoots, a leafless generator grows no laterals.
332
-
333
- **Mutation testing**: 23 of 28 mutants killed. Survivors, each measured:
334
- - **Blocked buds and extensions, the sibling collar for blocking** (three): at season's end engulfment kills whatever
335
- grew through older wood, so the final trees cannot tell. The blocking is kept for what it changes: without it the
336
- pine's crown is 8.7 m wide against 7.3, and spruce carries 33 m² against 39.
337
- - **A carrier buried during the simulation**: no preset has a buried carrier that grows twigs (spruce's one starts
338
- inside its mother's wood, so its buds are blocked). "Dead wood bears no shoots" would catch it.
339
- - **The light field following the crown**: without it the pine's upper crown sees open sky and carries 71 m² against
340
- 62. No spec reads the shading.
341
-
342
- **Open, measured:**
343
- - **Pine's crown is see-through:** transparency 0.57 against FIA's 0.15. Its leaf is 4.5x a forest pine's of its DBH,
344
- so S2's girth from leaf will move DBH, not the crown.
345
- - **No open-grown target for crown width** at 11 m.
346
- - **Cost:** spruce's skeleton 2.7 s, most of it the engulfment pass; the gate's spruce 4.8 s against master's 3.8.
347
- - **Mesh size:** 5k → 78k nodes for the pine.
@@ -1,248 +0,0 @@
1
- # Shoot Systems for Every Woody Species
2
-
3
- Follows `ANNUAL_SHOOTS_BRIEF_2026_10_25.md`, which grew the oak's twigs year by year and put its leaves on them.
4
-
5
- ## Problem
6
-
7
- Only the oak grows a twig layer. The other woody presets still hang their leaves on cards of 0.7-1.3 m, drawn by the
8
- density rule along their framework branches. The oak's model cannot simply be copied: it hard-codes four oak facts.
9
-
10
- | What the oak model assumes | Where | Species where it is false |
11
- | :--- | :--- | :--- |
12
- | Leaves live one season, on the current unit only | `foliage_collect_attachments`, joint mechanics | pine (needles kept 3-4 years), spruce (7-9) |
13
- | Leaves crowd at the unit's tip: one card a unit | `MEDIAN_CURRENT_SHOOT_LENGTH`, the `rosette` arrangement | willow and birch long shoots (leaves along the shoot), conifers (needles along it) |
14
- | Every bud that grows out makes an axis that extends every year | `shoot_demography_grow` | maple and birch: most buds become short shoots, which grow millimetres a year and leaf every year |
15
- | Oak's bud zones, length distributions and wood diameter | `SUBAPICAL_U_*`, `MEDIAN_U_*`, `NEGATIVE_BINOMIAL_P`, `shoot_radius` | every other species |
16
-
17
- **Baseline**, seed 1337, master `ee5c666c3`, crown fullness from a raster fitted to the leaves (the side opacity is over
18
- pixels within 10 cm of a leaf):
19
-
20
- | preset | cards | median card | leaf area | side opacity | LAI over top silhouette |
21
- | :--- | ---: | ---: | ---: | ---: | ---: |
22
- | oak | 2,261 | 0.17 m | 93 m^2 | 0.49 | 3.2 |
23
- | pine | 693 | 0.76 m | 174 m^2 | 0.69 | 5.5 |
24
- | birch | 399 | 0.72 m | 45 m^2 | 0.44 | 3.2 |
25
- | willow | 1,455 | 1.27 m | 241 m^2 | 0.67 | 4.5 |
26
- | maple | 478 | 0.88 m | 150 m^2 | 0.66 | 3.9 |
27
- | spruce | 1,191 | 0.69 m | 161 m^2 | 0.57 | 4.7 |
28
- | shrub | 114 | 0.56 m | 10 m^2 | 0.48 | 1.5 |
29
-
30
- ## Scope
31
-
32
- - **Woody presets get shoot systems:** oak, pine, birch, willow, maple, spruce, shrub.
33
- - **Palm and fern do not.** A palm grows from one apical meristem and never branches. A fern's fronds rise from its
34
- rhizome. Neither has a twig system, and their frond cards already draw single leaves at real size (palm 1.85 m,
35
- fern 0.95 m).
36
- - **Species each preset stands for.** These are needed to pick sources.
37
- - **oak:** *Quercus robur / petraea* (unchanged).
38
- - **pine:** *Pinus sylvestris*, as its comments already say.
39
- - **spruce:** *Picea abies*.
40
- - **birch:** *Betula pendula* (white bark, pendulous twigs).
41
- - **maple:** *Acer rubrum*. Its anthocyanin potential of 0.9 is a red-autumn maple, and red maple has the best data.
42
- - **willow:** a weeping willow (*Salix babylonica*, *S. x sepulcralis*), with pendulous-willow and *S. alba* data.
43
- - **shrub:** *Corylus avellana* (hazel), which matches its multi-stemmed habit and ovate leaves. The preset names no
44
- genus today; this is my pick.
45
-
46
- ## Sources
47
-
48
- Read in the paper itself unless marked. "2nd" is second-hand (abstract or citing paper), and "summary" was read
49
- through a web summarizer and must be checked before it goes into code.
50
-
51
- **Red maple.** [W1966] Wilson, B.F. (1966). Development of the shoot system of *Acer rubrum* L. Harvard Forest Paper
52
- 14. 38 felled trees up to about 115 years old. [C1971] Critchfield, W.B. (1971). Shoot growth and heterophylly in
53
- *Acer*. J. Arnold Arboretum 52(2): 240-266. [G1980] Gregory, R.A. (1980). Can. J. For. Res. 10: 316-326 (sugar maple).
54
-
55
- | Quantity | Value | Where |
56
- | :--- | :--- | :--- |
57
- | Long vs short shoot | long elongates > 2 cm a year and bears laterals; short < 2 cm, none; either can become the other | W1966 p. 2 |
58
- | Short shoots, share of all shoots | 85-95% | W1966 abstract, p. 10 |
59
- | New laterals a long shoot yields a year | order 2 on the stem: 1.8 long + 4 short; 3rd/2nd: 1.5 + 4; 4th/3rd: 0.1 + 4; 5th/4th: 0.03 + 4 | W1966 p. 10, Table 2 |
60
- | Bud fates along a 1-year shoot | top pairs long, middle pairs short, lowest pair may abort | W1966 p. 3, Fig. 1 |
61
- | Annual length increment by order 2-6 | 8.8, 4.5, 3.6, 3.4, 2.7 cm | W1966 p. 6 |
62
- | Leaf nodes on last season's shoot | long 7.8 (4-11), short 2.0 (1-3) | C1971 Table 1 |
63
- | Leaves per shoot by order | long 16, 14, 12, 8, 6 (orders 1-5); short 6 (orders 2-5), 4, 2 | W1966 Table 4 |
64
- | Area per leaf | long shoot 14-64 cm^2; short shoot 10-44 cm^2 | W1966 Table 4 |
65
- | Leaf area from length | log A = 0.0898 + 1.81 log L | W1966 p. 6 |
66
- | Petiole | 0.6-1.14 of the blade (early leaves), 0.3-0.8 (late) | C1971 p. 256 |
67
- | Survival | 1-6 (mean 2) live 2nd-order long shoots per annual group; shaded branches die | W1966 Fig. 7, p. 19 |
68
-
69
- **Silver birch.**
70
-
71
- | Quantity | Value | Where |
72
- | :--- | :--- | :--- |
73
- | Short shoot | one bud; two or three leaves a year; grows a couple of millimetres a year; carries most of the foliage; can become a long shoot | Jones & Harper 1987, Proc. R. Soc. B 232: 19-33 (2nd); Kull et al. 2003, Ann. Bot. 91: 559-569, pp. 560-561; Lintunen 2013, Diss. For. 165, p. 27 |
74
- | Short shoots | never sylleptic; in the upper crown at the base of last year's shoot | Kull et al. 2003 p. 567 |
75
- | Long shoot | many buds on elongated internodes; long-shoot lengths 0-120 cm, order means 0-30 cm (figure only) | Jones & Harper 1987 (2nd); Lintunen 2013 Fig. 7 |
76
- | Short shoots per branch | 46-54 | Lintunen 2013 Table 3 |
77
- | Leaf blade | 3-7 x 2.5-5 cm | Flora of North America vol. 3 |
78
-
79
- **Willow.**
80
-
81
- | Quantity | Value | Where |
82
- | :--- | :--- | :--- |
83
- | Bud fates, pendulous willow ('Prairie Cascade', young trees) | 40% sylleptic, 29% proleptic shoots | Remphrey & Pearn 2006, Can. J. Bot. 84: 1531-1541 (2nd, abstract) |
84
- | Shedding, same | 7% of shoots in year 1, more than half by year 3, survivors on the parent's upper half | same |
85
- | *S. alba* annual shoots | 5-25 cm, at 30-60 degrees; no sylleptic shoots; no short shoots | Héja 2007, Tilia 13: 77-94, p. 82 |
86
- | Cladoptosis | shoots shed in autumn through an abscission zone, mostly 1-2 years old | Héja 2007 pp. 79-80 |
87
- | Leaf blade | *S. babylonica* 9-16 x 0.5-2 cm; *S. x sepulcralis* 7-14 x 0.9-1.8 cm | Flora of North America vol. 7; JANAS 29(1) |
88
-
89
- **Scots pine.**
90
-
91
- | Quantity | Value | Where |
92
- | :--- | :--- | :--- |
93
- | Net shoots per last year's shoot on a branch (Rb) | 1.35-1.42 in low light, rising with light and with shoot length; constant over a branch's life | Niinemets & Lukjanova 2003, Ann. For. Sci. 60: 195-208, pp. 198-200 |
94
- | Needle sets kept | 3.7 (S. Finland), 2.8 (Estonia); median shed at 4 years, 15% reach 5 | Pensa & Jalkanen 1999, Silva Fennica 33: 171-177, pp. 173-175 |
95
- | Needle length | 52 mm (fertile site), 25 mm (bog); unchanged with age | Niinemets & Lukjanova 2003 Table I |
96
- | Fascicles per cm (leaders) | 7.8 (6.9-8.5 stand means) | Salminen & Jalkanen 2006, Silva Fennica 40: 183-194, Table 3 |
97
- | Branching | stops at relative light 0.20-0.25; negligible below 0.6 of tree height | Ilonen et al. 1979, Silva Fennica 13, pp. 319-321 |
98
-
99
- **Norway spruce.**
100
-
101
- | Quantity | Value | Where |
102
- | :--- | :--- | :--- |
103
- | Bud fates on 1-year shoots, healthy trees | about 64% flush, 30% dormant but viable, 6% abort | Polák et al. 2006, For. Ecol. Manage. 225: 337-348, p. 344 |
104
- | Needle retention | 7-9 years; 50% of a cohort shed by 5.5 years, all by 12 | Polák et al. 2006 p. 342; Muukkonen & Lehtonen 2004 (2nd) |
105
- | New shoot, needles | mean 4.8 cm (2.2-11.3); 18-31 needles per cm | Bellan et al. 2019, Austrian J. For. Sci. 136: 1-26 |
106
- | Whorl zone | whorl branches in the top 20% of a unit; internodal branches short-lived | Colin & Houllier 1992, Ann. Sci. For. 49: 511-538 |
107
- | Shoot to mother angle | 60% between 40 and 70 degrees | Fabrika et al. 2019, BioResources 14: 908-921, Table 7 |
108
-
109
- **Hazel.** Grisafi et al. 2024, in silico Plants 6(1) diae004 (open access; read through a summarizer, to verify):
110
- 1.13 buds a node; vegetative bud burst 0.97 distal to 0.62 proximal; shoot from a vegetative bud mean 4.1 cm; 8 nodes
111
- on 10-25 cm shoots; the apical bud dies (sympodial). An orchard cultivar. Leaf area 41 cm^2 in sun (Catoni et al.
112
- 2015, Photosynthetica 53: 35-46, Table 2).
113
-
114
- ## Sources supplied 2026-10-26
115
-
116
- Alex supplied the paywalled papers. Each was read in full except where a figure is "read approximately".
117
-
118
- **[M1982]** Maillette, L. (1982). Structural dynamics of silver birch. I. The fates of buds; II. A matrix model of the
119
- bud population. *J. Appl. Ecol.* 19: 203-218, 219-238. Three mature open-grown trees, 4-10 m, North Wales; about
120
- 13,000 buds.
121
-
122
- | Quantity | Value | Where |
123
- | :--- | :--- | :--- |
124
- | Buds per long shoot | mode 4, on its late leaves only | I p. 213, Fig. 9 |
125
- | Leaves per long shoot | mode 6 | I p. 213 |
126
- | Long-shoot length | modal class 51-100 mm | I p. 210, Fig. 6a |
127
- | Long-shoot apex | always aborts; growth is sympodial | I p. 206 |
128
- | Short shoot | < 3 mm a year; two or three leaves; one bud; "a large proportion died"; few become long | I pp. 205-213 |
129
- | Leaves on short vs long shoots | B1 12,000 / 10,000; B2 5,300 / 3,100; B3 3,000 / 1,300 (figure) | I Fig. 2 |
130
- | Bud population growth a year (lambda) | whole crown 1.38; top 1.52; bottom 0.999 | II Table 1 |
131
-
132
- **[JH1987]** Jones, M. & Harper, J.L. (1987). The influence of neighbours on the growth of trees. II. The fate of buds
133
- on long and short shoots in *Betula pendula*. *Proc. R. Soc. Lond. B* 232: 19-33. Four-year-old trees in open
134
- grassland; values for the low-interference zone.
135
-
136
- | Quantity | Value | Where |
137
- | :--- | :--- | :--- |
138
- | Long-shoot buds becoming long shoots | about 50% on the youngest branches; 16-26% on older ones | pp. 21-22, Fig. 2 |
139
- | Buds surviving a year | 62% (year 2), 57% (year 3) | p. 26 |
140
- | Leaves per long shoot | commonly 4-8; internodes 15-25 mm | pp. 19-20 |
141
-
142
- **[KK1991]** Kellomäki, S. & Kurttio, O. (1991). A model for the structural development of a Scots pine crown based on
143
- modular growth. *For. Ecol. Manage.* 43: 103-123. 25 trees, 7-19 years, eastern Finland. Order 0 is the stem.
144
-
145
- | Quantity | Value | Where |
146
- | :--- | :--- | :--- |
147
- | Daughter shoots (terminal included) of a shoot L cm long | k + c L; order 0: 3.99 + 0.022 L; 1: 0.992 + 0.161 L; 2: 0.544 + 0.149 L; 3: 0.861 + 0.041 L | Eq. 1, Table 3 |
148
- | Lateral length / parent length, by parent order 0-3 | 0.570, 0.458, 0.355, 0.475 | Table 4 |
149
- | Terminal length / parent length, orders 0-4 | 1.196, 0.995, 0.913, 0.938, 0.999 | Table 4 |
150
- | Branching angle, orders 1-4 | 83, 61, 59, 65 degrees | Fig. 2 |
151
- | Needles surviving, by age 1-4 | 1, 0.90, 0.69, 0.22; a shoot without needles dies | p. 113 |
152
-
153
- **[KS1995]** Kellomäki, S. & Strandman, H. (1995). *Ecol. Model.* 80: 237-250. Needle length 0.4 L for shoots under
154
- 10 cm, 4 cm above (Eq. 17).
155
-
156
- **[L2011]** Lintunen, A., Sievänen, R., Kaitaniemi, P. & Perttunen, J. (2011). Models of 3D crown structure for Scots
157
- pine and silver birch grown in mixed forest. *Can. J. For. Res.* 41: 1779-1794. Birch long shoot in branches: 14.6 cm,
158
- 6 leaves of 11.8 cm^2; short shoots modelled with 2 leaves (Table A2, B20).
159
-
160
- **[NL2003]** Niinemets, Ü. & Lukjanova, A. (2003). *New Phytol.* 158: 75-89.
161
-
162
- | Quantity | Value | Where |
163
- | :--- | :--- | :--- |
164
- | Rb, net shoots per last year's shoot | *P. abies* 0.65-2.19 (example branch 1.516); *P. sylvestris* 0.98-4.17 | Table 1, Fig. 2 |
165
- | Rb against light | rises steeply with light; below 1 in deep shade | Fig. 5b |
166
- | Needle survival, *P. abies*, ages 2-9 | about 0.93, 0.93, 0.80, 0.76, 0.70, 0.57, 0.55, 0.19 (figure) | Fig. 4 |
167
- | Current shoot, *P. abies* | 0.6-4.6 cm, longer in light (figure) | Fig. 6 |
168
-
169
- **[H2007]** Hein, S. et al. (2007). *For. Ecol. Manage.* 242: 155-164. Norway spruce: 6.03 branches a stem whorl
170
- (4,851 over 804 whorls). Stem whorls only.
171
-
172
- **[RP2006]** Remphrey, W.R. & Pearn, M.A. (2006). Crown architecture development in *Salix* 'Prairie Cascade', a
173
- pendulous willow. *Can. J. Bot.* 84: 1531-1541. Young trees from cuttings.
174
-
175
- | Quantity | Value | Where |
176
- | :--- | :--- | :--- |
177
- | Terminal bud | aborts each year: sympodial | p. 1532 |
178
- | First-year shoot | 1,104 mm, 42 nodes | p. 1533 |
179
- | Bud fates | sylleptic 40.1%, proleptic 29.3%, aborted 24.6%, dormant 6.0% | Table 1 |
180
- | Laterals still present | 93% in year 2, 58% in year 3, 46% in year 4; the lowest quarter of the parent sheds almost all | p. 1535, Table 2 |
181
- | Current shoots in summer | hang at -80 to -88 degrees | Fig. 7 |
182
-
183
- ## Gaps that remain
184
-
185
- | Missing | Species | Treatment |
186
- | :--- | :--- | :--- |
187
- | Lateral buds per shoot, lengths by order | spruce | pine's [KK1991] counts and ratios, stated as borrowed |
188
- | Short-shoot annual survival | birch, maple | birch: [JH1987]'s bud survival (0.6); maple: fitted to [W1966]'s 85-95% short-shoot share |
189
- | Shoot diameter | all but oak | [BB2000] Table 7 for every species |
190
- | Needle length | spruce | not found; chosen |
191
- | Hazel numbers | shrub | [Grisafi 2024] read through a summarizer only; to verify |
192
-
193
- ## Design
194
-
195
- The oak's model, generalised. Every number becomes a `ShootSystemRule` field; the oak's defaults stay, and the oak's
196
- output is bit-identical after the refactor (checked against a fingerprint of three seeds).
197
-
198
- 1. **Per-order arrays.** Lengths, outgrowth and insertion angles differ by branching order in every source, so these
199
- fields hold one value per order, the last repeating.
200
- 2. **Unit length** is `intercept[order] + slope[order] x parent unit length`, drawn as the oak's (1 cm plus a negative
201
- binomial or Poisson count of centimetres, capped per order). The oak has slope 0 and intercepts from [BB2000];
202
- pine has intercept 0 and [KK1991]'s ratios. Maple uses [W1966]'s means by order.
203
- 3. **Bud zones** (`ShootBudZone`): where on the unit (u range), how many buds (`buds + buds_per_metre x length`),
204
- and per order the share growing a long shoot next year, a sylleptic shoot this year, or a short shoot. The
205
- oak's two zones are its subapical and median buds.
206
- 4. **Sylleptic shoots** (willow) grow out in the same season as their mother unit, so a fast shoot branches at once.
207
- 5. **Short shoots** (birch, maple) are a bud fate: a single-segment branch that grows `short_shoot_growth` a year, has
208
- no laterals, leafs every year, and survives a year at `short_shoot_survival`. A shed mother takes them with it.
209
- 6. **Vigour is Rb**, the net shoots a shoot leaves a year: sourced for pine and spruce [NL2003], birch (lambda,
210
- [M1982]) and maple ([W1966]'s net yields); chosen for oak and willow.
211
- 7. **Leaf cohorts.** `leaf_survival[age]` is the share of a unit's leaves alive at each age: `[1]` for the deciduous
212
- species, [KK1991] for pine, [NL2003] for spruce. The skeleton records where each recent unit of a branch starts,
213
- replacing `branch_current_growth_t`.
214
- 8. **Cards tile the leafy units.** Each card covers the stretch of shoot its tile draws (`card_length * stem_length`),
215
- scaled within 0.6-1.6 so a whole number fits, thinned by the cohort's survival. The oak keeps about one card per
216
- unit. Short shoots carry one card at their tip.
217
- 9. **Cards at real size.** The card length follows from the species' leaf length and how long its arrangement draws a
218
- leaf in a tile. The leaves a card draws follow from the leaves per metre of shoot.
219
- 10. **Two tile kinds** where a species has short shoots: the atlas draws its sprays (long-shoot stretches) and its
220
- rosettes (a short shoot's 2-4 leaves) as separate variant sets, so neither card carries the wrong leaf count.
221
-
222
- ## Crown fullness (the next question)
223
-
224
- The best measured target found: the US Forest Inventory's crown ratings, 15,011 leaf-on trees seen from the side
225
- (Randolph 2006, USDA GTR SRS-94, Tables 1-4).
226
- - **Crown density.** Branches and foliage block a mean 45% of the crown's outline (oaks, maples, birches 46-51%).
227
- - **Foliage transparency.** Within the foliated parts, only about 15% of skylight comes through, so they are 80-85%
228
- opaque.
229
-
230
- So a healthy crown is dense clumps that fill about half its outline. Our probe measures opacity within 10 cm of a leaf,
231
- which is nearer the clumps: the oak reads 0.49 there against about 0.85. This is measured after the propagation, as
232
- asked.
233
-
234
- ## Plan
235
-
236
- 1. Generalise `ShootSystemRule` and `shoot_demography_grow`: zones, per-order arrays, syllepsis, short shoots. The
237
- oak's fingerprint is unchanged.
238
- 2. The writer: short shoots, opposite phyllotaxis, per-order angles; the unit record.
239
- 3. Foliage and mechanics: leaf cohorts, tiled cards, short-shoot cards, tile kinds.
240
- 4. Presets: pine, spruce, birch, maple, willow, shrub, each with carriers, a twig generator, a sourced rule and
241
- real-size cards.
242
- 5. Specs per species against their sources, mutation-tested.
243
- 6. Measure every preset and look at each in the playground.
244
-
245
- ## Landed (2026-10-26, uncommitted)
246
-
247
- Every woody preset grows its twigs from `shoot_rules`, each with its own `ShootGrowthConfig`, and the crown fills by
248
- light. What landed, the specs restated and the measured crowns are in `CROWN_FILLING_BRIEF_2026_10_26.md`.