@woosh/meep-engine 3.57.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 (1881) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/ecs/component/editors/ColorEditor.js +2 -2
  3. package/editor/particles/effect/ParticleEffectDocument.d.ts +162 -43
  4. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  5. package/editor/particles/effect/ParticleEffectDocument.js +452 -48
  6. package/editor/particles/effect/ParticleReferenceSimulation.d.ts +12 -3
  7. package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
  8. package/editor/particles/effect/ParticleReferenceSimulation.js +78 -23
  9. package/editor/particles/effect/make_starter_particle_effect.js +17 -17
  10. package/editor/tools/GridPaintTool.js +2 -2
  11. package/editor/view/node-graph/NodeGraphEditorView.d.ts +1 -1
  12. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  13. package/editor/view/node-graph/NodeGraphEditorView.js +2 -2
  14. package/editor/view/node-graph/NodeGraphView.d.ts +0 -1
  15. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  16. package/editor/view/node-graph/NodeGraphView.js +0 -2
  17. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +3 -3
  18. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  19. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +224 -67
  20. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
  21. package/editor/view/particles/effect/ParticleGraphEditorView.js +44 -11
  22. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +2 -1
  23. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  24. package/editor/view/particles/effect/ParticleNodeParametersView.js +46 -16
  25. package/editor/view/particles/effect/ParticlePreviewView.js +2 -2
  26. package/editor/view/particles/effect/particle-editor.css +77 -68
  27. package/package.json +1 -1
  28. package/src/core/bvh8/build/NodeProxy.js +2 -2
  29. package/src/core/bvh8/build/aabb3_compute_merge_cost.js +4 -4
  30. package/src/core/bvh8/build/bvh8_build_for_geometry.js +2 -2
  31. package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.d.ts +1 -1
  32. package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.js +1 -1
  33. package/src/core/geom/2d/triangle/tri2_intersects_aabb2.d.ts +17 -0
  34. package/src/core/geom/2d/triangle/tri2_intersects_aabb2.d.ts.map +1 -0
  35. package/src/core/geom/2d/triangle/tri2_intersects_aabb2.js +64 -0
  36. package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.d.ts +23 -0
  37. package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.d.ts.map +1 -0
  38. package/src/core/geom/2d/triangle/tri2_rasterize_barycentric.js +81 -0
  39. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.d.ts.map +1 -1
  40. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +36 -99
  41. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts +0 -11
  42. package/src/core/geom/3d/aabb/aabb3_build_frustum.d.ts.map +1 -1
  43. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +15 -20
  44. package/src/core/geom/3d/box/box3_raycast.d.ts +1 -1
  45. package/src/core/geom/3d/box/box3_raycast.js +1 -1
  46. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.d.ts +1 -1
  47. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +1 -1
  48. package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts +3 -3
  49. package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +3 -3
  50. package/src/core/geom/3d/shape/HeightMapShape3D.js +2 -2
  51. package/src/core/geom/3d/shape/MeshShape3D.d.ts +2 -2
  52. package/src/core/geom/3d/shape/MeshShape3D.js +2 -2
  53. package/src/core/geom/3d/shape/PosedShape3D.js +2 -2
  54. package/src/core/geom/3d/sphere/sphere_matrix4_transform.d.ts +0 -7
  55. package/src/core/geom/3d/sphere/sphere_matrix4_transform.d.ts.map +1 -1
  56. package/src/core/geom/3d/sphere/sphere_matrix4_transform.js +0 -4
  57. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.d.ts +1 -1
  58. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.js +1 -1
  59. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +1 -1
  60. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +1 -1
  61. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts +1 -1
  62. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +1 -1
  63. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.d.ts +1 -1
  64. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js +1 -1
  65. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +2 -2
  66. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +2 -2
  67. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.d.ts +0 -14
  68. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.d.ts.map +1 -1
  69. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.js +0 -5
  70. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +151 -151
  71. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +1 -1
  72. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.d.ts +1 -1
  73. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.js +1 -1
  74. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
  75. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +1 -2
  76. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +0 -8
  77. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -1
  78. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +25 -36
  79. package/src/core/geom/clipmap/ClipmapCascadePlacement.d.ts +137 -0
  80. package/src/core/geom/clipmap/ClipmapCascadePlacement.d.ts.map +1 -0
  81. package/src/core/geom/clipmap/ClipmapCascadePlacement.js +350 -0
  82. package/src/core/geom/polyline/polyline_simplify_by_error.d.ts +16 -0
  83. package/src/core/geom/polyline/polyline_simplify_by_error.d.ts.map +1 -0
  84. package/src/core/geom/polyline/polyline_simplify_by_error.js +52 -0
  85. package/src/core/geom/vec3/v3_quaternion_apply.d.ts +1 -1
  86. package/src/core/geom/vec3/v3_quaternion_apply.js +1 -1
  87. package/src/core/geom/vec3/v3_quaternion_apply_inverse.d.ts +2 -2
  88. package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +2 -2
  89. package/src/core/geom/vec3/v3_triple_cross.d.ts +1 -1
  90. package/src/core/geom/vec3/v3_triple_cross.js +1 -1
  91. package/src/engine/Engine.d.ts.map +1 -1
  92. package/src/engine/Engine.js +2 -2
  93. package/src/engine/asset/preloader/AssetPreloader.d.ts +0 -5
  94. package/src/engine/asset/preloader/AssetPreloader.d.ts.map +1 -1
  95. package/src/engine/asset/preloader/AssetPreloader.js +0 -6
  96. package/src/engine/ecs/EntityManager.d.ts +29 -5
  97. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  98. package/src/engine/ecs/EntityManager.js +37 -1
  99. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  100. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  101. package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
  102. package/src/engine/ecs/terrain/tiles/TerrainTile.js +25 -12
  103. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +2 -2
  104. package/src/engine/graphics/ecs/decal/v2/Decal.js +2 -2
  105. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
  106. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +420 -418
  107. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
  108. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +10 -0
  109. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +74 -17
  110. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
  111. package/src/engine/graphics/ecs/particles/ParticleEffect.js +159 -28
  112. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +13 -3
  113. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
  114. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +59 -13
  115. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +3 -3
  116. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +9 -9
  117. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts +15 -0
  118. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts.map +1 -0
  119. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.js +78 -0
  120. package/src/engine/graphics/ecs/path/tube/build/makeTubeStream.js +2 -2
  121. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +2 -0
  122. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  123. package/src/engine/graphics/ecs/trail3d/Trail3D.js +2 -0
  124. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +1 -1
  125. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +1 -1
  126. package/src/engine/graphics/geometry/buffered/build_height_field_geometry.d.ts +12 -0
  127. package/src/engine/graphics/geometry/buffered/build_height_field_geometry.d.ts.map +1 -1
  128. package/src/engine/graphics/geometry/buffered/build_height_field_geometry.js +29 -2
  129. package/src/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +1 -1
  130. package/src/engine/graphics/trail/tube/TubeX.d.ts +5 -3
  131. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
  132. package/src/engine/graphics/trail/tube/TubeX.js +5 -3
  133. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +3 -2
  134. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +1 -1
  135. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +9 -8
  136. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +65 -4
  137. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  138. package/src/engine/graphics3/GPUParticleEmitterSystem.js +1351 -904
  139. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +2 -1
  140. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  141. package/src/engine/graphics3/ShadedGeometrySystem.js +7 -5
  142. package/src/engine/graphics3/Trail3DSystem.d.ts +1 -1
  143. package/src/engine/graphics3/Trail3DSystem.js +1 -1
  144. package/src/engine/graphics3/WaterSystem.d.ts +60 -0
  145. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  146. package/src/engine/graphics3/WaterSystem.js +733 -300
  147. package/src/engine/graphics3/make_default_environment.d.ts.map +1 -1
  148. package/src/engine/graphics3/make_default_environment.js +2 -4
  149. package/src/engine/graphics3/prefab/prefab_place.js +1 -1
  150. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +1 -1
  151. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -13
  152. package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.js +628 -628
  153. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  154. package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
  155. package/src/engine/physics/narrowphase/narrowphase_step.js +1 -1
  156. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts +0 -1
  157. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  158. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +0 -6
  159. package/src/engine/sound/simulation/render/reverb_band_tails.d.ts +1 -1
  160. package/src/engine/sound/simulation/render/reverb_band_tails.js +1 -1
  161. package/src/engine/sound/sopra/runtime/EventInstance.js +1 -1
  162. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +86 -0
  163. package/src/generation/foliage/FOLIAGE_DESIGN.md +110 -32
  164. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +521 -0
  165. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +86 -0
  166. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +347 -0
  167. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +552 -0
  168. package/src/generation/foliage/analysis/crown_opacity_measure.d.ts.map +1 -1
  169. package/src/generation/foliage/analysis/crown_opacity_measure.js +80 -102
  170. package/src/generation/foliage/analysis/foliage_measure_leaf_area.d.ts.map +1 -1
  171. package/src/generation/foliage/analysis/foliage_measure_leaf_area.js +1 -7
  172. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -1
  173. package/src/generation/foliage/analysis/tree_crown_opacity.js +3 -2
  174. package/src/generation/foliage/analysis/tree_leaf_area_targets.d.ts +66 -0
  175. package/src/generation/foliage/analysis/tree_leaf_area_targets.d.ts.map +1 -0
  176. package/src/generation/foliage/analysis/tree_leaf_area_targets.js +95 -0
  177. package/src/generation/foliage/analysis/tree_render_cost.d.ts +90 -0
  178. package/src/generation/foliage/analysis/tree_render_cost.d.ts.map +1 -0
  179. package/src/generation/foliage/analysis/tree_render_cost.js +158 -0
  180. package/src/generation/foliage/asset/TreeAsset.d.ts +24 -6
  181. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  182. package/src/generation/foliage/asset/TreeAsset.js +29 -6
  183. package/src/generation/foliage/asset/TreeLODAsset.d.ts +24 -11
  184. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -1
  185. package/src/generation/foliage/asset/TreeLODAsset.js +49 -20
  186. package/src/generation/foliage/asset/TreeSpeciesCache.d.ts +69 -0
  187. package/src/generation/foliage/asset/TreeSpeciesCache.d.ts.map +1 -0
  188. package/src/generation/foliage/asset/TreeSpeciesCache.js +147 -0
  189. package/src/generation/foliage/asset/generate_tree.d.ts +21 -0
  190. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  191. package/src/generation/foliage/asset/generate_tree.js +123 -21
  192. package/src/generation/foliage/asset/place_tree.d.ts +2 -1
  193. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -1
  194. package/src/generation/foliage/asset/place_tree.js +2 -1
  195. package/src/generation/foliage/asset/tree_lod_plan.d.ts +73 -0
  196. package/src/generation/foliage/asset/tree_lod_plan.d.ts.map +1 -0
  197. package/src/generation/foliage/asset/tree_lod_plan.js +117 -0
  198. package/src/generation/foliage/asset/tree_shoot_instances.d.ts +119 -0
  199. package/src/generation/foliage/asset/tree_shoot_instances.d.ts.map +1 -0
  200. package/src/generation/foliage/asset/tree_shoot_instances.js +410 -0
  201. package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts +155 -0
  202. package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts.map +1 -0
  203. package/src/generation/foliage/asset/tree_shoot_prototypes.js +251 -0
  204. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts +0 -10
  205. package/src/generation/foliage/config/BranchGeneratorConfig.d.ts.map +1 -1
  206. package/src/generation/foliage/config/BranchGeneratorConfig.js +1 -23
  207. package/src/generation/foliage/config/ShootGrowthConfig.d.ts +45 -10
  208. package/src/generation/foliage/config/ShootGrowthConfig.d.ts.map +1 -1
  209. package/src/generation/foliage/config/ShootGrowthConfig.js +70 -16
  210. package/src/generation/foliage/config/ShootSystemRule.d.ts +12 -12
  211. package/src/generation/foliage/config/ShootSystemRule.d.ts.map +1 -1
  212. package/src/generation/foliage/config/ShootSystemRule.js +24 -20
  213. package/src/generation/foliage/config/TreeGrowth.d.ts +10 -0
  214. package/src/generation/foliage/config/TreeGrowth.d.ts.map +1 -0
  215. package/src/generation/foliage/config/TreeGrowth.js +18 -0
  216. package/src/generation/foliage/config/TreeLODConfig.d.ts +20 -37
  217. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -1
  218. package/src/generation/foliage/config/TreeLODConfig.js +30 -116
  219. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +2 -1
  220. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -1
  221. package/src/generation/foliage/config/TreeSpeciesConfig.js +2 -7
  222. package/src/generation/foliage/index.d.ts +3 -0
  223. package/src/generation/foliage/index.js +3 -0
  224. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts +6 -4
  225. package/src/generation/foliage/material/foliage_atlas_cutout.d.ts.map +1 -1
  226. package/src/generation/foliage/material/foliage_atlas_cutout.js +32 -27
  227. package/src/generation/foliage/material/foliage_material_from_samplers.d.ts +13 -0
  228. package/src/generation/foliage/material/foliage_material_from_samplers.d.ts.map +1 -0
  229. package/src/generation/foliage/material/foliage_material_from_samplers.js +69 -0
  230. package/src/generation/foliage/material/foliage_tile.d.ts +19 -0
  231. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -1
  232. package/src/generation/foliage/material/foliage_tile.js +9 -1
  233. package/src/generation/foliage/material/leaf_geometry.d.ts +7 -0
  234. package/src/generation/foliage/material/leaf_geometry.d.ts.map +1 -1
  235. package/src/generation/foliage/material/leaf_geometry.js +21 -9
  236. package/src/generation/foliage/material/make_foliage_material.d.ts +2 -3
  237. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  238. package/src/generation/foliage/material/make_foliage_material.js +3 -57
  239. package/src/generation/foliage/material/tree_cluster_atlas.d.ts +44 -0
  240. package/src/generation/foliage/material/tree_cluster_atlas.d.ts.map +1 -0
  241. package/src/generation/foliage/material/tree_cluster_atlas.js +37 -0
  242. package/src/generation/foliage/material/tree_cluster_atlas_pack.d.ts +14 -0
  243. package/src/generation/foliage/material/tree_cluster_atlas_pack.d.ts.map +1 -0
  244. package/src/generation/foliage/material/tree_cluster_atlas_pack.js +28 -0
  245. package/src/generation/foliage/material/tree_cluster_bake.d.ts +74 -0
  246. package/src/generation/foliage/material/tree_cluster_bake.d.ts.map +1 -0
  247. package/src/generation/foliage/material/tree_cluster_bake.js +415 -0
  248. package/src/generation/foliage/material/tree_cluster_press.d.ts +18 -0
  249. package/src/generation/foliage/material/tree_cluster_press.d.ts.map +1 -0
  250. package/src/generation/foliage/material/tree_cluster_press.js +83 -0
  251. package/src/generation/foliage/material/tree_cluster_tiles.d.ts +46 -0
  252. package/src/generation/foliage/material/tree_cluster_tiles.d.ts.map +1 -0
  253. package/src/generation/foliage/material/tree_cluster_tiles.js +75 -0
  254. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +22 -4
  255. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  256. package/src/generation/foliage/mesh/foliage_collect_attachments.js +28 -16
  257. package/src/generation/foliage/mesh/foliage_scale_spread.d.ts +14 -0
  258. package/src/generation/foliage/mesh/foliage_scale_spread.d.ts.map +1 -0
  259. package/src/generation/foliage/mesh/foliage_scale_spread.js +15 -0
  260. package/src/generation/foliage/mesh/tree_cluster_cards.d.ts +61 -0
  261. package/src/generation/foliage/mesh/tree_cluster_cards.d.ts.map +1 -0
  262. package/src/generation/foliage/mesh/tree_cluster_cards.js +114 -0
  263. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts +122 -0
  264. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts.map +1 -0
  265. package/src/generation/foliage/mesh/tree_cluster_representatives.js +354 -0
  266. package/src/generation/foliage/mesh/tree_clusters.d.ts +92 -0
  267. package/src/generation/foliage/mesh/tree_clusters.d.ts.map +1 -0
  268. package/src/generation/foliage/mesh/tree_clusters.js +187 -0
  269. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  270. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +609 -226
  271. package/src/generation/foliage/mesh/tree_mesh_build_clusters.d.ts +25 -0
  272. package/src/generation/foliage/mesh/tree_mesh_build_clusters.d.ts.map +1 -0
  273. package/src/generation/foliage/mesh/tree_mesh_build_clusters.js +144 -0
  274. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +7 -10
  275. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  276. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +13 -39
  277. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +6 -1
  278. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  279. package/src/generation/foliage/presets/make_tree_species_preset.js +235 -209
  280. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts +5 -2
  281. package/src/generation/foliage/skeleton/ShootFrameworkHash.d.ts.map +1 -1
  282. package/src/generation/foliage/skeleton/ShootFrameworkHash.js +13 -8
  283. package/src/generation/foliage/skeleton/ShootGirth.d.ts.map +1 -1
  284. package/src/generation/foliage/skeleton/ShootGirth.js +6 -5
  285. package/src/generation/foliage/skeleton/ShootLightField.d.ts +9 -0
  286. package/src/generation/foliage/skeleton/ShootLightField.d.ts.map +1 -1
  287. package/src/generation/foliage/skeleton/ShootLightField.js +25 -0
  288. package/src/generation/foliage/skeleton/ShootWoodHash.d.ts +89 -0
  289. package/src/generation/foliage/skeleton/ShootWoodHash.d.ts.map +1 -0
  290. package/src/generation/foliage/skeleton/ShootWoodHash.js +195 -0
  291. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +25 -0
  292. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  293. package/src/generation/foliage/skeleton/TreeSkeleton.js +50 -0
  294. package/src/generation/foliage/skeleton/shoot_demography.d.ts +17 -4
  295. package/src/generation/foliage/skeleton/shoot_demography.d.ts.map +1 -1
  296. package/src/generation/foliage/skeleton/shoot_demography.js +22 -6
  297. package/src/generation/foliage/skeleton/shoot_geometry.d.ts +5 -6
  298. package/src/generation/foliage/skeleton/shoot_geometry.d.ts.map +1 -1
  299. package/src/generation/foliage/skeleton/shoot_geometry.js +29 -12
  300. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts +43 -4
  301. package/src/generation/foliage/skeleton/shoot_systems_simulate.d.ts.map +1 -1
  302. package/src/generation/foliage/skeleton/shoot_systems_simulate.js +537 -70
  303. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +30 -5
  304. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -1
  305. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +46 -10
  306. package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.d.ts +10 -0
  307. package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.d.ts.map +1 -0
  308. package/src/generation/foliage/skeleton/tree_skeleton_bind_skin_joints.js +12 -0
  309. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +5 -0
  310. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -1
  311. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +8 -1
  312. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts +70 -0
  313. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts.map +1 -0
  314. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.js +171 -0
  315. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts +17 -0
  316. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts.map +1 -0
  317. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.js +79 -0
  318. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts +12 -0
  319. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts.map +1 -0
  320. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.js +56 -0
  321. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts +11 -0
  322. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts.map +1 -0
  323. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.js +38 -0
  324. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +4 -11
  325. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  326. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +8 -2033
  327. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts +22 -0
  328. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts.map +1 -0
  329. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.js +2050 -0
  330. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +14 -0
  331. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -1
  332. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +74 -7
  333. package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +6 -6
  334. package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
  335. package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts +4 -0
  336. package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts.map +1 -1
  337. package/src/shade/descriptor/pipeline/render/DepthStencilState.js +170 -144
  338. package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts +4 -0
  339. package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts.map +1 -1
  340. package/src/shade/descriptor/pipeline/render/MultisampleState.js +78 -65
  341. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
  342. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +176 -172
  343. package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts +4 -0
  344. package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts.map +1 -1
  345. package/src/shade/descriptor/pipeline/render/StencilFaceState.js +107 -88
  346. package/src/shade/playground/additive_blending/main.js +529 -529
  347. package/src/shade/playground/avboit/main.js +1 -1
  348. package/src/shade/playground/basis_textures/main.js +365 -365
  349. package/src/shade/playground/caldera/main.js +1 -1
  350. package/src/shade/playground/contact_shadows/main.js +1 -1
  351. package/src/shade/playground/foliage_wind/main.js +289 -289
  352. package/src/shade/playground/mesh_row_ceiling/main.js +1 -1
  353. package/src/shade/playground/particle_ecs/README.md +9 -8
  354. package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
  355. package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +6 -6
  356. package/src/shade/playground/particle_ecs/bonfire_effects.js +6 -6
  357. package/src/shade/playground/particle_ecs/main.js +1 -1
  358. package/src/shade/playground/particle_editor/README.md +14 -11
  359. package/src/shade/playground/particle_system/main.js +1 -1
  360. package/src/shade/playground/particle_system/particle_prototype.js +18 -18
  361. package/src/shade/playground/particle_system/particle_scene.js +13 -13
  362. package/src/shade/playground/probe_clipmap/README.md +42 -0
  363. package/src/shade/playground/probe_clipmap/index.html +178 -0
  364. package/src/shade/playground/probe_clipmap/main.d.ts +8 -0
  365. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -0
  366. package/src/shade/playground/probe_clipmap/main.js +360 -0
  367. package/src/shade/playground/sh_exponential/main.js +1 -1
  368. package/src/shade/playground/skinned_blas_refit/main.js +1 -1
  369. package/src/shade/playground/skinned_mesh_soup/main.js +1 -1
  370. package/src/shade/playground/sponza_path_trace/main.js +1 -1
  371. package/src/shade/playground/ssr_motion/main.js +1 -1
  372. package/src/shade/playground/ssr_reprojection/main.js +1 -1
  373. package/src/shade/playground/tonemap_sdr/main.js +1 -1
  374. package/src/shade/playground/vgeo_runtime/main.js +1 -1
  375. package/src/shade/playground/vgeo_scene/main.js +1 -1
  376. package/src/shade/playground/volumetrics_froxel/main.js +1 -1
  377. package/src/shade/playground/vsm/index.html +4 -1
  378. package/src/shade/playground/vsm/main.d.ts.map +1 -1
  379. package/src/shade/playground/vsm/main.js +8 -5
  380. package/src/shade/playground/water_refraction/main.js +1 -1
  381. package/src/shade/playground/water_surface/main.js +1 -1
  382. package/src/shade/renderer/Renderer.d.ts +16 -1
  383. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  384. package/src/shade/renderer/Renderer.js +225 -40
  385. package/src/shade/renderer/ShadeIndirectLightingMode.d.ts +1 -0
  386. package/src/shade/renderer/ShadeIndirectLightingMode.js +6 -0
  387. package/src/shade/renderer/camera/orbital/README.md +3 -6
  388. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.d.ts +1 -1
  389. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.js +1 -1
  390. package/src/shade/renderer/extension/ViewTextures.d.ts +2 -1
  391. package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
  392. package/src/shade/renderer/extension/ViewTextures.js +2 -1
  393. package/src/shade/renderer/fluid/FluidCascadePlacement.d.ts +8 -105
  394. package/src/shade/renderer/fluid/FluidCascadePlacement.d.ts.map +1 -1
  395. package/src/shade/renderer/fluid/FluidCascadePlacement.js +13 -306
  396. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  397. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  398. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  399. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_command.d.ts.map +1 -1
  400. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_command.js +8 -14
  401. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  402. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  403. package/src/shade/renderer/geometry/BoxGeometry.d.ts +0 -1
  404. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  405. package/src/shade/renderer/geometry/BoxGeometry.js +0 -9
  406. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts +4 -2
  407. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  408. package/src/shade/renderer/geometry/GPUGeometryManager.js +13 -2
  409. package/src/shade/renderer/geometry/Geometry.js +2 -2
  410. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
  411. package/src/shade/renderer/geometry/blas_from_meshlets.js +12 -2
  412. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  413. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -0
  414. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +1 -1
  415. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +5 -0
  416. package/src/shade/renderer/geometry/mesh_compute_surface_area.js +4 -4
  417. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +5 -0
  418. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  419. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +15 -0
  420. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +1 -1
  421. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +35 -26
  422. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  423. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +2 -1
  424. package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.d.ts +13 -0
  425. package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.d.ts.map +1 -0
  426. package/src/shade/renderer/geometry/normals/decode_octahedral_u32_to_normal.js +33 -0
  427. package/src/shade/renderer/geometry/normals/geometry_build_tangents.js +7 -7
  428. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +189 -45
  429. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  430. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1853 -144
  431. package/src/shade/renderer/geometry/sdf/MESH_SDF.d.ts +60 -0
  432. package/src/shade/renderer/geometry/sdf/MESH_SDF.d.ts.map +1 -0
  433. package/src/shade/renderer/geometry/sdf/MESH_SDF.js +62 -0
  434. package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.d.ts +29 -0
  435. package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.d.ts.map +1 -0
  436. package/src/shade/renderer/geometry/sdf/MESH_SDF_RESOURCES.js +41 -0
  437. package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.d.ts +12 -0
  438. package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.d.ts.map +1 -0
  439. package/src/shade/renderer/geometry/sdf/MESH_SDF_STRUCT.js +53 -0
  440. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.d.ts +79 -0
  441. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.d.ts.map +1 -0
  442. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.js +168 -0
  443. package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.d.ts +75 -0
  444. package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.d.ts.map +1 -0
  445. package/src/shade/renderer/geometry/sdf/bake/MESH_SDF_BAKE.js +110 -0
  446. package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.d.ts +48 -0
  447. package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.d.ts.map +1 -0
  448. package/src/shade/renderer/geometry/sdf/bake/chunk_mesh_sdf_bake.js +146 -0
  449. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts +31 -0
  450. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -0
  451. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +136 -0
  452. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts +29 -0
  453. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -0
  454. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +146 -0
  455. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.d.ts +19 -0
  456. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.d.ts.map +1 -0
  457. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_free.js +77 -0
  458. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.d.ts +18 -0
  459. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.d.ts.map +1 -0
  460. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_store.js +84 -0
  461. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.d.ts +19 -0
  462. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.d.ts.map +1 -0
  463. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_take.js +72 -0
  464. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +171 -0
  465. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -0
  466. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +884 -0
  467. package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.d.ts +82 -0
  468. package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.d.ts.map +1 -0
  469. package/src/shade/renderer/geometry/sdf/cards/MESH_CARDS.js +127 -0
  470. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.d.ts +24 -0
  471. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.d.ts.map +1 -0
  472. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_RESOURCES.js +29 -0
  473. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.d.ts +12 -0
  474. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.d.ts.map +1 -0
  475. package/src/shade/renderer/geometry/sdf/cards/MESH_CARD_SET_STRUCT.js +31 -0
  476. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.d.ts +29 -0
  477. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.d.ts.map +1 -0
  478. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_card_surface.js +179 -0
  479. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.d.ts +17 -0
  480. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.d.ts.map +1 -0
  481. package/src/shade/renderer/geometry/sdf/cards/chunk_mesh_cards.js +107 -0
  482. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +36 -0
  483. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -0
  484. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +237 -0
  485. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.d.ts +19 -0
  486. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.d.ts.map +1 -0
  487. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_compact.js +61 -0
  488. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts +18 -0
  489. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts.map +1 -0
  490. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.js +102 -0
  491. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.d.ts +15 -0
  492. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.d.ts.map +1 -0
  493. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_log.js +65 -0
  494. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.d.ts +22 -0
  495. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.d.ts.map +1 -0
  496. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_merge.js +136 -0
  497. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.d.ts +20 -0
  498. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.d.ts.map +1 -0
  499. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_pages.js +104 -0
  500. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.d.ts +30 -0
  501. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.d.ts.map +1 -0
  502. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_split.js +146 -0
  503. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts +35 -0
  504. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -0
  505. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +161 -0
  506. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.d.ts +21 -0
  507. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.d.ts.map +1 -0
  508. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf.js +112 -0
  509. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.d.ts +15 -0
  510. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.d.ts.map +1 -0
  511. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_normal.js +34 -0
  512. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.d.ts +17 -0
  513. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.d.ts.map +1 -0
  514. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_raymarch.js +64 -0
  515. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.d.ts +32 -0
  516. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.d.ts.map +1 -0
  517. package/src/shade/renderer/geometry/sdf/chunk_mesh_sdf_sample.js +104 -0
  518. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts +2 -0
  519. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  520. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +13 -23
  521. package/src/shade/renderer/geometry/util/geometry_compute_surface_area.js +2 -2
  522. package/src/shade/renderer/geometry/util/geometry_estimate_uv_aspect.js +2 -2
  523. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  524. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +34 -12
  525. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  526. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +56 -15
  527. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +2 -2
  528. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  529. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +13 -26
  530. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +25 -2
  531. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
  532. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +54 -32
  533. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts +14 -0
  534. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts.map +1 -0
  535. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.js +37 -0
  536. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
  537. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +16 -0
  538. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -1
  539. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +2 -6
  540. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts +131 -0
  541. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts.map +1 -0
  542. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.js +467 -0
  543. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts +24 -0
  544. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts.map +1 -0
  545. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.js +111 -0
  546. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts +42 -0
  547. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts.map +1 -0
  548. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.js +404 -0
  549. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts +16 -0
  550. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts.map +1 -0
  551. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.js +23 -0
  552. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts +17 -0
  553. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts.map +1 -0
  554. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.js +65 -0
  555. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  556. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +14 -70
  557. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  558. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +13 -773
  559. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts +55 -0
  560. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts.map +1 -0
  561. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.js +248 -0
  562. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  563. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +15 -174
  564. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_ao.js +2 -2
  565. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.d.ts.map +1 -1
  566. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.js +8 -24
  567. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.d.ts.map +1 -1
  568. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.js +1 -25
  569. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +2 -2
  570. package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.d.ts.map +1 -1
  571. package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.js +5 -23
  572. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +0 -2
  573. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  574. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +3 -13
  575. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts +10 -16
  576. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  577. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +39 -82
  578. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +136 -0
  579. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -0
  580. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +487 -0
  581. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +3505 -0
  582. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +83 -0
  583. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -0
  584. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +626 -0
  585. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +265 -0
  586. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -0
  587. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +475 -0
  588. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +138 -0
  589. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -0
  590. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +189 -0
  591. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.d.ts +37 -0
  592. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.d.ts.map +1 -0
  593. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_MOVERS.js +48 -0
  594. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +239 -0
  595. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -0
  596. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +993 -0
  597. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +69 -0
  598. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -0
  599. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +169 -0
  600. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +191 -0
  601. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -0
  602. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +590 -0
  603. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts +21 -0
  604. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts.map +1 -0
  605. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.js +42 -0
  606. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts +45 -0
  607. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts.map +1 -0
  608. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.js +93 -0
  609. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +23 -0
  610. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -0
  611. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +35 -0
  612. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +35 -0
  613. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -0
  614. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +124 -0
  615. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +27 -0
  616. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -0
  617. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +94 -0
  618. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +26 -0
  619. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -0
  620. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +73 -0
  621. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +35 -0
  622. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +1 -0
  623. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +238 -0
  624. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.d.ts +10 -0
  625. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.d.ts.map +1 -0
  626. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_clear.js +44 -0
  627. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.d.ts +24 -0
  628. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.d.ts.map +1 -0
  629. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_coarse.js +92 -0
  630. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +26 -0
  631. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -0
  632. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +133 -0
  633. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.d.ts +21 -0
  634. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.d.ts.map +1 -0
  635. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers.js +146 -0
  636. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.d.ts +18 -0
  637. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.d.ts.map +1 -0
  638. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.js +84 -0
  639. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.d.ts +16 -0
  640. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.d.ts.map +1 -0
  641. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_requeue.js +67 -0
  642. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.d.ts +20 -0
  643. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.d.ts.map +1 -0
  644. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.js +128 -0
  645. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.d.ts +20 -0
  646. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.d.ts.map +1 -0
  647. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.js +127 -0
  648. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.d.ts +20 -0
  649. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.d.ts.map +1 -0
  650. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.js +79 -0
  651. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +99 -0
  652. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +1 -0
  653. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +139 -0
  654. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +65 -0
  655. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +1 -0
  656. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +393 -0
  657. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +17 -0
  658. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +1 -0
  659. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +36 -0
  660. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +29 -0
  661. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +1 -0
  662. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +108 -0
  663. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +31 -0
  664. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +1 -0
  665. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +113 -0
  666. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +36 -0
  667. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +1 -0
  668. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +85 -0
  669. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +23 -0
  670. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +1 -0
  671. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +273 -0
  672. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +13 -0
  673. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +1 -0
  674. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +151 -0
  675. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +13 -0
  676. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +1 -0
  677. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +133 -0
  678. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +22 -0
  679. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +1 -0
  680. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +135 -0
  681. package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.d.ts +11 -0
  682. package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.d.ts.map +1 -0
  683. package/src/shade/renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.js +16 -0
  684. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts +29 -0
  685. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts.map +1 -0
  686. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.js +160 -0
  687. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.d.ts +34 -0
  688. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.d.ts.map +1 -0
  689. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.js +189 -0
  690. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.d.ts +25 -0
  691. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.d.ts.map +1 -0
  692. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +138 -0
  693. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +184 -0
  694. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -0
  695. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1124 -0
  696. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +223 -0
  697. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -0
  698. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +297 -0
  699. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +244 -0
  700. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -0
  701. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +493 -0
  702. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts +19 -0
  703. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts.map +1 -0
  704. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.js +40 -0
  705. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +41 -0
  706. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -0
  707. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +110 -0
  708. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts +72 -0
  709. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts.map +1 -0
  710. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +343 -0
  711. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +29 -0
  712. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -0
  713. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +188 -0
  714. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +26 -0
  715. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -0
  716. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +132 -0
  717. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +34 -0
  718. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -0
  719. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +284 -0
  720. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +37 -0
  721. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -0
  722. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +176 -0
  723. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts +12 -0
  724. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts.map +1 -0
  725. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js +101 -0
  726. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +22 -0
  727. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -0
  728. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +110 -0
  729. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.d.ts +10 -0
  730. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.d.ts.map +1 -0
  731. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_fill.js +39 -0
  732. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts +15 -0
  733. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts.map +1 -0
  734. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js +175 -0
  735. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +26 -0
  736. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -0
  737. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +210 -0
  738. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +26 -0
  739. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -0
  740. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +177 -0
  741. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts +18 -0
  742. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts.map +1 -0
  743. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.js +105 -0
  744. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts +25 -0
  745. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts.map +1 -0
  746. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +124 -0
  747. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +21 -0
  748. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -0
  749. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +118 -0
  750. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -0
  751. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -0
  752. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +72 -0
  753. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +25 -0
  754. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -0
  755. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +145 -0
  756. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +33 -0
  757. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -0
  758. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +196 -0
  759. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +19 -0
  760. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -0
  761. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +88 -0
  762. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +23 -0
  763. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -0
  764. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +98 -0
  765. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +27 -0
  766. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -0
  767. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +110 -0
  768. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.d.ts +19 -0
  769. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.d.ts.map +1 -0
  770. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.js +31 -0
  771. package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.d.ts +33 -0
  772. package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.d.ts.map +1 -0
  773. package/src/shade/renderer/gpu_primitive/slot_stack/chunk_slot_stack.js +58 -0
  774. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.d.ts +31 -0
  775. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.d.ts.map +1 -0
  776. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_fill.js +62 -0
  777. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.d.ts +21 -0
  778. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.d.ts.map +1 -0
  779. package/src/shade/renderer/gpu_primitive/slot_stack/shader_slot_stack_push_range.js +61 -0
  780. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  781. package/src/shade/renderer/light/GPULightCollection.js +12 -11
  782. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -1
  783. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  784. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +117 -120
  785. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts +1 -2
  786. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts.map +1 -1
  787. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.js +44 -45
  788. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +13 -0
  789. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -1
  790. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +40 -0
  791. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +11 -6
  792. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -1
  793. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +15 -8
  794. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +9 -2
  795. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -1
  796. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +25 -11
  797. package/src/shade/renderer/lightmap/atlas/rescale_uvs.js +2 -2
  798. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  799. package/src/shade/renderer/material/StandardShadeMaterial.js +5 -5
  800. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +10 -4
  801. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  802. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +112 -8
  803. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +21 -0
  804. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -0
  805. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +30 -0
  806. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +24 -0
  807. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +1 -0
  808. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +120 -0
  809. package/src/shade/renderer/particles/DESIGN.md +151 -42
  810. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +283 -0
  811. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +10 -2
  812. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  813. package/src/shade/renderer/particles/GPUParticleSystem.js +53 -15
  814. package/src/shade/renderer/particles/ParticleConstants.d.ts +23 -6
  815. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  816. package/src/shade/renderer/particles/ParticleConstants.js +25 -6
  817. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +5 -5
  818. package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -187
  819. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +20 -9
  820. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
  821. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +36 -10
  822. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +8 -7
  823. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  824. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +25 -16
  825. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts +51 -0
  826. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts.map +1 -0
  827. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.js +56 -0
  828. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
  829. package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -0
  830. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +1 -1
  831. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +1 -1
  832. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +22 -11
  833. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  834. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +14 -11
  835. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +4 -4
  836. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  837. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +59 -24
  838. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +3 -3
  839. package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -287
  840. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +13 -6
  841. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  842. package/src/shade/renderer/particles/graph/compile_particle_graph.js +46 -27
  843. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +8 -2
  844. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -1
  845. package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +240 -234
  846. package/src/shade/renderer/particles/graph/make_particle_group.d.ts +1 -1
  847. package/src/shade/renderer/particles/graph/make_particle_group.js +1 -1
  848. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +3 -2
  849. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
  850. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +3 -2
  851. package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -170
  852. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +25 -16
  853. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -1
  854. package/src/shade/renderer/particles/graph/particle_graph_json.js +16 -2
  855. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +29 -15
  856. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  857. package/src/shade/renderer/particles/graph/particle_node_parameters.js +54 -22
  858. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  859. package/src/shade/renderer/particles/graph/particle_node_presentation.js +18 -8
  860. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +9 -3
  861. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  862. package/src/shade/renderer/particles/graph/validate_particle_graph.js +70 -38
  863. package/src/shade/renderer/particles/graph_particles.d.ts +9 -4
  864. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  865. package/src/shade/renderer/particles/graph_particles.js +27 -4
  866. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +7 -6
  867. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  868. package/src/shade/renderer/particles/isa/InstructionStream.js +17 -16
  869. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +17 -0
  870. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
  871. package/src/shade/renderer/particles/isa/ParticleAssembler.js +35 -0
  872. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +26 -6
  873. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  874. package/src/shade/renderer/particles/isa/ParticleProgram.js +61 -9
  875. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +55 -4
  876. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  877. package/src/shade/renderer/particles/isa/ParticleVMISA.js +79 -10
  878. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +20 -6
  879. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  880. package/src/shade/renderer/particles/isa/particle_assembly.js +136 -25
  881. package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts +20 -0
  882. package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts.map +1 -0
  883. package/src/shade/renderer/particles/isa/particle_link_global_fields.js +46 -0
  884. package/src/shade/renderer/particles/isa/validate_particle_program.js +8 -8
  885. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +62 -28
  886. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  887. package/src/shade/renderer/particles/layout/ParticleLayout.js +102 -62
  888. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -1
  889. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +2 -0
  890. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +1 -1
  891. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +4 -3
  892. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +2 -2
  893. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +3 -3
  894. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +11 -11
  895. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +4 -4
  896. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
  897. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +5 -4
  898. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +1 -1
  899. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +1 -1
  900. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +4 -4
  901. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  902. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +13 -11
  903. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +7 -7
  904. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +3 -2
  905. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  906. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +5 -4
  907. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -1
  908. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
  909. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
  910. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -51
  911. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  912. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +5 -5
  913. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
  914. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  915. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  916. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  917. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  918. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -1
  919. package/src/shade/renderer/particles/optimizer/pass_schedule.js +2 -2
  920. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  921. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +5 -4
  922. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +93 -22
  923. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  924. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +336 -29
  925. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +43 -3
  926. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  927. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +43 -3
  928. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +56 -26
  929. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  930. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +89 -33
  931. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts +85 -0
  932. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts.map +1 -0
  933. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.js +221 -0
  934. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +143 -18
  935. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -1
  936. package/src/shade/renderer/particles/runtime/ProgramHeap.js +378 -28
  937. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +19 -7
  938. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  939. package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -9
  940. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +8 -8
  941. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
  942. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +3 -0
  943. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -1
  944. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +4 -0
  945. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  946. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +5 -6
  947. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -1
  948. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +5 -7
  949. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts +30 -0
  950. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts.map +1 -0
  951. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.js +121 -0
  952. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  953. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -2
  954. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -1
  955. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +3 -2
  956. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -1
  957. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +3 -1
  958. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +12 -4
  959. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  960. package/src/shade/renderer/particles/vm/ParticleVMReference.js +48 -11
  961. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  962. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +36 -14
  963. package/src/shade/renderer/particles/warmup/shader_particle_warmup.d.ts.map +1 -1
  964. package/src/shade/renderer/particles/warmup/shader_particle_warmup.js +316 -318
  965. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts.map +1 -1
  966. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.js +3 -2
  967. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts.map +1 -1
  968. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.js +2 -0
  969. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +1 -1
  970. package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
  971. package/src/shade/renderer/postprocess/PostProcess.js +2 -1
  972. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +31 -19
  973. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  974. package/src/shade/renderer/postprocess/gtao/GTAO.js +44 -30
  975. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts.map +1 -1
  976. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js +75 -78
  977. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  978. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +16 -2
  979. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts +0 -5
  980. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  981. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +377 -382
  982. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  983. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  984. package/src/shade/renderer/postprocess/nss/NSS.js +4 -3
  985. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +7 -1
  986. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  987. package/src/shade/renderer/postprocess/ssr/SSR.js +16 -0
  988. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts +20 -2
  989. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts.map +1 -1
  990. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +53 -2
  991. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts +10 -1
  992. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts.map +1 -1
  993. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +31 -1
  994. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  995. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +17 -11
  996. package/src/shade/renderer/postprocess/taa/TAA.d.ts +4 -2
  997. package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
  998. package/src/shade/renderer/postprocess/taa/TAA.js +6 -1
  999. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
  1000. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +10 -5
  1001. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  1002. package/src/shade/renderer/postprocess/taa/shader_taa.js +15 -12
  1003. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  1004. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +26 -17
  1005. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts +4 -2
  1006. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts.map +1 -1
  1007. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +6 -2
  1008. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts +12 -0
  1009. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts.map +1 -0
  1010. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.js +57 -0
  1011. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +4 -2
  1012. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  1013. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +4 -2
  1014. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +8 -2
  1015. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  1016. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +28 -15
  1017. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts +2 -1
  1018. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts.map +1 -1
  1019. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.js +19 -3
  1020. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
  1021. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +4 -2
  1022. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +3 -1
  1023. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  1024. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +27 -14
  1025. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +2 -1
  1026. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
  1027. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +19 -3
  1028. package/src/shade/renderer/scene/GPUSceneContext.d.ts +17 -2
  1029. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  1030. package/src/shade/renderer/scene/GPUSceneContext.js +38 -2
  1031. package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.d.ts +17 -0
  1032. package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.d.ts.map +1 -1
  1033. package/src/shade/renderer/scene/MESH_INSTANCE_METADATA_STRUCT.js +27 -0
  1034. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
  1035. package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +4 -6
  1036. package/src/shade/renderer/scene/chunk_mesh_flags.d.ts +9 -0
  1037. package/src/shade/renderer/scene/chunk_mesh_flags.d.ts.map +1 -0
  1038. package/src/shade/renderer/scene/chunk_mesh_flags.js +22 -0
  1039. package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.d.ts +65 -0
  1040. package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.d.ts.map +1 -0
  1041. package/src/shade/renderer/scene/movers/SCENE_MOVER_LAYOUT.js +87 -0
  1042. package/src/shade/renderer/scene/movers/SceneMoverTracker.d.ts +42 -0
  1043. package/src/shade/renderer/scene/movers/SceneMoverTracker.d.ts.map +1 -0
  1044. package/src/shade/renderer/scene/movers/SceneMoverTracker.js +153 -0
  1045. package/src/shade/renderer/scene/movers/chunk_scene_append_mover.d.ts +14 -0
  1046. package/src/shade/renderer/scene/movers/chunk_scene_append_mover.d.ts.map +1 -0
  1047. package/src/shade/renderer/scene/movers/chunk_scene_append_mover.js +33 -0
  1048. package/src/shade/renderer/scene/movers/graph_scene_movers.d.ts +33 -0
  1049. package/src/shade/renderer/scene/movers/graph_scene_movers.d.ts.map +1 -0
  1050. package/src/shade/renderer/scene/movers/graph_scene_movers.js +114 -0
  1051. package/src/shade/renderer/scene/movers/shader_scene_movers.d.ts +33 -0
  1052. package/src/shade/renderer/scene/movers/shader_scene_movers.d.ts.map +1 -0
  1053. package/src/shade/renderer/scene/movers/shader_scene_movers.js +197 -0
  1054. package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.d.ts +24 -0
  1055. package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.d.ts.map +1 -0
  1056. package/src/shade/renderer/scene/movers/shader_scene_skinned_movers.js +112 -0
  1057. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +26 -4
  1058. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  1059. package/src/shade/renderer/scene/rows/GPUSceneRows.js +64 -6
  1060. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_nearest_point_on_surface.js +1 -1
  1061. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_decompose_transform.d.ts +1 -1
  1062. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_decompose_transform.js +2 -2
  1063. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts +2 -8
  1064. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts.map +1 -1
  1065. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.js +25 -52
  1066. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts +15 -0
  1067. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts.map +1 -0
  1068. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.js +52 -0
  1069. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_decode_u32.d.ts +1 -1
  1070. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_decode_u32.js +1 -1
  1071. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.d.ts +1 -1
  1072. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.js +1 -1
  1073. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts +7 -0
  1074. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts.map +1 -0
  1075. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.js +12 -0
  1076. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts +22 -0
  1077. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts.map +1 -0
  1078. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.js +37 -0
  1079. package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.d.ts.map +1 -1
  1080. package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.js +26 -60
  1081. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts +23 -0
  1082. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts.map +1 -0
  1083. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.js +54 -0
  1084. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +25 -0
  1085. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -0
  1086. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +43 -0
  1087. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts +14 -0
  1088. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts.map +1 -0
  1089. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.js +37 -0
  1090. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts +27 -0
  1091. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts.map +1 -0
  1092. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.js +61 -0
  1093. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_mat2x4.d.ts.map +1 -1
  1094. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_mat2x4.js +10 -7
  1095. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_vec4.d.ts.map +1 -1
  1096. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_sample_discrete_wrs_vec4.js +6 -3
  1097. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +22 -0
  1098. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
  1099. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +62 -34
  1100. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts +21 -0
  1101. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts.map +1 -0
  1102. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.js +41 -0
  1103. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +1 -1
  1104. package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts +1 -1
  1105. package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts +1 -1
  1106. package/src/shade/renderer/shader/resource/ShaderResourceDescriptor.d.ts +1 -1
  1107. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -4
  1108. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +50 -11
  1109. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  1110. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +188 -51
  1111. package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.d.ts +8 -0
  1112. package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.d.ts.map +1 -0
  1113. package/src/shade/renderer/shadow/map/SHADOWMAP_PATCH_MIN_SIDE.js +7 -0
  1114. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +7 -7
  1115. package/src/shade/renderer/shadow/map/Shadowmap.js +7 -7
  1116. package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.d.ts +17 -0
  1117. package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.d.ts.map +1 -1
  1118. package/src/shade/renderer/shadow/map/ShadowmapResolutionPolicy.js +29 -8
  1119. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.d.ts +0 -1
  1120. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.d.ts.map +1 -1
  1121. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_get_light_visibility.js +0 -3
  1122. package/src/shade/renderer/shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.d.ts.map +1 -1
  1123. package/src/shade/renderer/shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.js +2 -5
  1124. package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.d.ts +8 -0
  1125. package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.d.ts.map +1 -1
  1126. package/src/shade/renderer/shadow/sdf/chunk_geometry_sdf_query_distance.js +13 -41
  1127. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +6 -5
  1128. package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.d.ts +8 -0
  1129. package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.d.ts.map +1 -1
  1130. package/src/shade/renderer/shadow/sdf/chunk_sdf_geometry_raymarch.js +20 -73
  1131. package/src/shade/renderer/shadow/sdf/chunk_sdf_mesh_raymarch.d.ts.map +1 -1
  1132. package/src/shade/renderer/shadow/sdf/chunk_sdf_mesh_raymarch.js +4 -0
  1133. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts +2 -0
  1134. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  1135. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +14 -8
  1136. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.d.ts +12 -0
  1137. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.d.ts.map +1 -0
  1138. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_LOW_LOAD_FACTOR.js +11 -0
  1139. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts +9 -0
  1140. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts.map +1 -0
  1141. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.js +8 -0
  1142. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts +13 -0
  1143. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts.map +1 -0
  1144. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.js +12 -0
  1145. package/src/shade/renderer/shadow/vsm/PLAN.md +3 -1
  1146. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +80 -1
  1147. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -1
  1148. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +303 -3
  1149. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +54 -3
  1150. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  1151. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +418 -338
  1152. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +8 -9
  1153. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -1
  1154. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +9 -92
  1155. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +6 -6
  1156. package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.d.ts +90 -0
  1157. package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.d.ts.map +1 -0
  1158. package/src/shade/renderer/texture/atlas/GPUTileAtlas2D.js +208 -0
  1159. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +23 -4
  1160. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
  1161. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +56 -5
  1162. package/src/shade/renderer/texture/util/texture_fill_rectangle.d.ts.map +1 -1
  1163. package/src/shade/renderer/texture/util/texture_fill_rectangle.js +282 -267
  1164. package/src/shade/renderer/view/GPUViewContext.js +2 -2
  1165. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +8 -4
  1166. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  1167. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +36 -36
  1168. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.d.ts +59 -0
  1169. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.d.ts.map +1 -0
  1170. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.js +152 -0
  1171. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  1172. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +145 -46
  1173. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +6 -1
  1174. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -1
  1175. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +498 -484
  1176. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +14 -0
  1177. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -1
  1178. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +56 -0
  1179. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -1
  1180. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +197 -191
  1181. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.d.ts +21 -0
  1182. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.d.ts.map +1 -0
  1183. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_sun_shadow_media.js +125 -0
  1184. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +4 -44
  1185. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  1186. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +558 -311
  1187. package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.d.ts +18 -0
  1188. package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.d.ts.map +1 -0
  1189. package/src/shade/renderer/volumetrics/shader_volumetrics_cull_sun_shadow_media.js +84 -0
  1190. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts +4 -0
  1191. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts.map +1 -1
  1192. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.js +1 -1
  1193. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +4 -4
  1194. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +2 -1
  1195. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  1196. package/src/shade/renderer/water/GPUWaterRenderer.js +5 -1
  1197. package/src/shade/renderer/water/chunk_water_gi.d.ts +12 -2
  1198. package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -1
  1199. package/src/shade/renderer/water/chunk_water_gi.js +46 -2
  1200. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +127 -0
  1201. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts.map +1 -0
  1202. package/src/shade/renderer/water/query/GPUWaterQueries.js +741 -0
  1203. package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.d.ts +58 -0
  1204. package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.d.ts.map +1 -0
  1205. package/src/shade/renderer/water/query/WATER_QUERY_DATABASE_SPEC.js +79 -0
  1206. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts +32 -0
  1207. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -0
  1208. package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -0
  1209. package/src/shade/renderer/water/shader_water.d.ts +3 -2
  1210. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  1211. package/src/shade/renderer/water/shader_water.js +9 -3
  1212. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  1213. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +12 -6
  1214. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  1215. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +20 -1
  1216. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  1217. package/src/shade/wgsl/validate_wgsl_source.js +26 -0
  1218. package/src/view/common/LabelView.js +1 -1
  1219. package/src/view/common/VirtualListView.js +1 -1
  1220. package/src/view/elements/progress/SmoothProgressBar.js +1 -1
  1221. package/src/view/tooltip/TooltipManager.js +1 -1
  1222. package/editor/view/ecs/components/DatGuiController.d.ts +0 -2
  1223. package/editor/view/ecs/components/DatGuiController.d.ts.map +0 -1
  1224. package/editor/view/ecs/components/DatGuiController.js +0 -2
  1225. package/editor/view/v2/SplitView.d.ts +0 -2
  1226. package/editor/view/v2/SplitView.d.ts.map +0 -1
  1227. package/editor/view/v2/SplitView.js +0 -2
  1228. package/src/core/binary/hash/XXH128Hash.d.ts +0 -2
  1229. package/src/core/binary/hash/XXH128Hash.d.ts.map +0 -1
  1230. package/src/core/binary/hash/XXH128Hash.js +0 -4
  1231. package/src/core/binary/hash/XXH3_SECRET.d.ts +0 -2
  1232. package/src/core/binary/hash/XXH3_SECRET.d.ts.map +0 -1
  1233. package/src/core/binary/hash/XXH3_SECRET.js +0 -4
  1234. package/src/core/binary/hash/crc32.d.ts +0 -2
  1235. package/src/core/binary/hash/crc32.d.ts.map +0 -1
  1236. package/src/core/binary/hash/crc32.js +0 -4
  1237. package/src/core/binary/hash/xxh3_128.d.ts +0 -2
  1238. package/src/core/binary/hash/xxh3_128.d.ts.map +0 -1
  1239. package/src/core/binary/hash/xxh3_128.js +0 -4
  1240. package/src/core/binary/hash/xxh3_64.d.ts +0 -2
  1241. package/src/core/binary/hash/xxh3_64.d.ts.map +0 -1
  1242. package/src/core/binary/hash/xxh3_64.js +0 -4
  1243. package/src/core/binary/hash/xxh3_common.d.ts +0 -2
  1244. package/src/core/binary/hash/xxh3_common.d.ts.map +0 -1
  1245. package/src/core/binary/hash/xxh3_common.js +0 -90
  1246. package/src/core/binary/lsb_32.d.ts +0 -17
  1247. package/src/core/binary/lsb_32.d.ts.map +0 -1
  1248. package/src/core/binary/lsb_32.js +0 -17
  1249. package/src/core/color/hex/hex2rgb.d.ts +0 -2
  1250. package/src/core/color/hex/hex2rgb.d.ts.map +0 -1
  1251. package/src/core/color/hex/hex2rgb.js +0 -7
  1252. package/src/core/color/hex/rgb2hex.d.ts +0 -2
  1253. package/src/core/color/hex/rgb2hex.d.ts.map +0 -1
  1254. package/src/core/color/hex/rgb2hex.js +0 -7
  1255. package/src/core/color/hsv/hsv2rgb.d.ts +0 -2
  1256. package/src/core/color/hsv/hsv2rgb.d.ts.map +0 -1
  1257. package/src/core/color/hsv/hsv2rgb.js +0 -8
  1258. package/src/core/color/hsv/rgb2hsv.d.ts +0 -2
  1259. package/src/core/color/hsv/rgb2hsv.d.ts.map +0 -1
  1260. package/src/core/color/hsv/rgb2hsv.js +0 -7
  1261. package/src/core/color/hunt/hpe_to_xyz.d.ts +0 -2
  1262. package/src/core/color/hunt/hpe_to_xyz.d.ts.map +0 -1
  1263. package/src/core/color/hunt/hpe_to_xyz.js +0 -4
  1264. package/src/core/color/hunt/xyz_to_hpe.d.ts +0 -2
  1265. package/src/core/color/hunt/xyz_to_hpe.d.ts.map +0 -1
  1266. package/src/core/color/hunt/xyz_to_hpe.js +0 -12
  1267. package/src/core/color/int2rgb.d.ts +0 -2
  1268. package/src/core/color/int2rgb.d.ts.map +0 -1
  1269. package/src/core/color/int2rgb.js +0 -7
  1270. package/src/core/color/rgb2uint24.d.ts +0 -2
  1271. package/src/core/color/rgb2uint24.d.ts.map +0 -1
  1272. package/src/core/color/rgb2uint24.js +0 -7
  1273. package/src/core/color/rgb2uint32.d.ts +0 -2
  1274. package/src/core/color/rgb2uint32.d.ts.map +0 -1
  1275. package/src/core/color/rgb2uint32.js +0 -7
  1276. package/src/core/geom/2d/aabb/aabb2_array_combine.d.ts +0 -7
  1277. package/src/core/geom/2d/aabb/aabb2_array_combine.d.ts.map +0 -1
  1278. package/src/core/geom/2d/aabb/aabb2_array_combine.js +0 -7
  1279. package/src/core/geom/2d/aabb/aabb2_compute_area.d.ts +0 -7
  1280. package/src/core/geom/2d/aabb/aabb2_compute_area.d.ts.map +0 -1
  1281. package/src/core/geom/2d/aabb/aabb2_compute_area.js +0 -7
  1282. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.d.ts +0 -7
  1283. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.d.ts.map +0 -1
  1284. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.js +0 -7
  1285. package/src/core/geom/2d/aabb/aabb2_compute_overlap.d.ts +0 -7
  1286. package/src/core/geom/2d/aabb/aabb2_compute_overlap.d.ts.map +0 -1
  1287. package/src/core/geom/2d/aabb/aabb2_compute_overlap.js +0 -7
  1288. package/src/core/geom/2d/aabb/aabb2_from_v2_array.d.ts +0 -7
  1289. package/src/core/geom/2d/aabb/aabb2_from_v2_array.d.ts.map +0 -1
  1290. package/src/core/geom/2d/aabb/aabb2_from_v2_array.js +0 -7
  1291. package/src/core/geom/2d/aabb/aabb2_intersects_point.d.ts +0 -7
  1292. package/src/core/geom/2d/aabb/aabb2_intersects_point.d.ts.map +0 -1
  1293. package/src/core/geom/2d/aabb/aabb2_intersects_point.js +0 -7
  1294. package/src/core/geom/2d/aabb/aabb2_overlap_exists.d.ts +0 -7
  1295. package/src/core/geom/2d/aabb/aabb2_overlap_exists.d.ts.map +0 -1
  1296. package/src/core/geom/2d/aabb/aabb2_overlap_exists.js +0 -7
  1297. package/src/core/geom/2d/circle/circle_compute_circle_intersection.d.ts +0 -7
  1298. package/src/core/geom/2d/circle/circle_compute_circle_intersection.d.ts.map +0 -1
  1299. package/src/core/geom/2d/circle/circle_compute_circle_intersection.js +0 -7
  1300. package/src/core/geom/2d/circle/circle_compute_circle_penetration.d.ts +0 -7
  1301. package/src/core/geom/2d/circle/circle_compute_circle_penetration.d.ts.map +0 -1
  1302. package/src/core/geom/2d/circle/circle_compute_circle_penetration.js +0 -7
  1303. package/src/core/geom/2d/circle/circle_intersects_point.d.ts +0 -7
  1304. package/src/core/geom/2d/circle/circle_intersects_point.d.ts.map +0 -1
  1305. package/src/core/geom/2d/circle/circle_intersects_point.js +0 -7
  1306. package/src/core/geom/2d/compute_polygon_area_2d.d.ts +0 -7
  1307. package/src/core/geom/2d/compute_polygon_area_2d.d.ts.map +0 -1
  1308. package/src/core/geom/2d/compute_polygon_area_2d.js +0 -7
  1309. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.d.ts +0 -7
  1310. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.d.ts.map +0 -1
  1311. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +0 -7
  1312. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts +0 -7
  1313. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts.map +0 -1
  1314. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +0 -7
  1315. package/src/core/geom/2d/convex-hull/orientation3_array.d.ts +0 -7
  1316. package/src/core/geom/2d/convex-hull/orientation3_array.d.ts.map +0 -1
  1317. package/src/core/geom/2d/convex-hull/orientation3_array.js +0 -7
  1318. package/src/core/geom/2d/intersect_ray_2d.d.ts +0 -7
  1319. package/src/core/geom/2d/intersect_ray_2d.d.ts.map +0 -1
  1320. package/src/core/geom/2d/intersect_ray_2d.js +0 -7
  1321. package/src/core/geom/2d/line/line2_distance_to_point_sqr.d.ts +0 -7
  1322. package/src/core/geom/2d/line/line2_distance_to_point_sqr.d.ts.map +0 -1
  1323. package/src/core/geom/2d/line/line2_distance_to_point_sqr.js +0 -7
  1324. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.d.ts +0 -7
  1325. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.d.ts.map +0 -1
  1326. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.js +0 -7
  1327. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.d.ts +0 -7
  1328. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.d.ts.map +0 -1
  1329. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.js +0 -7
  1330. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.d.ts +0 -7
  1331. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.d.ts.map +0 -1
  1332. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js +0 -7
  1333. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.d.ts +0 -7
  1334. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.d.ts.map +0 -1
  1335. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js +0 -7
  1336. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.d.ts +0 -7
  1337. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.d.ts.map +0 -1
  1338. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.js +0 -7
  1339. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.d.ts +0 -7
  1340. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.d.ts.map +0 -1
  1341. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.js +0 -7
  1342. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts +0 -7
  1343. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts.map +0 -1
  1344. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +0 -7
  1345. package/src/core/geom/2d/rectangle_to_aabb.d.ts +0 -7
  1346. package/src/core/geom/2d/rectangle_to_aabb.d.ts.map +0 -1
  1347. package/src/core/geom/2d/rectangle_to_aabb.js +0 -7
  1348. package/src/core/geom/2d/spline_bezier2_2d.d.ts +0 -7
  1349. package/src/core/geom/2d/spline_bezier2_2d.d.ts.map +0 -1
  1350. package/src/core/geom/2d/spline_bezier2_2d.js +0 -7
  1351. package/src/core/geom/2d/triangle2d_compute_area.d.ts +0 -7
  1352. package/src/core/geom/2d/triangle2d_compute_area.d.ts.map +0 -1
  1353. package/src/core/geom/2d/triangle2d_compute_area.js +0 -7
  1354. package/src/core/geom/2d/triangle2d_contains_point.d.ts +0 -7
  1355. package/src/core/geom/2d/triangle2d_contains_point.d.ts.map +0 -1
  1356. package/src/core/geom/2d/triangle2d_contains_point.js +0 -7
  1357. package/src/core/geom/2d/triangle2d_get_barycentric.d.ts +0 -7
  1358. package/src/core/geom/2d/triangle2d_get_barycentric.d.ts.map +0 -1
  1359. package/src/core/geom/2d/triangle2d_get_barycentric.js +0 -7
  1360. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.d.ts +0 -7
  1361. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.d.ts.map +0 -1
  1362. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.js +0 -7
  1363. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.d.ts +0 -7
  1364. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.d.ts.map +0 -1
  1365. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.js +0 -7
  1366. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.d.ts +0 -7
  1367. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.d.ts.map +0 -1
  1368. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.js +0 -7
  1369. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.d.ts +0 -7
  1370. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.d.ts.map +0 -1
  1371. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.js +0 -7
  1372. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.d.ts +0 -7
  1373. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.d.ts.map +0 -1
  1374. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.js +0 -7
  1375. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.d.ts +0 -7
  1376. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.d.ts.map +0 -1
  1377. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.js +0 -7
  1378. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts +0 -7
  1379. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts.map +0 -1
  1380. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +0 -7
  1381. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.d.ts +0 -7
  1382. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.d.ts.map +0 -1
  1383. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.js +0 -7
  1384. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.d.ts +0 -7
  1385. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.d.ts.map +0 -1
  1386. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.js +0 -7
  1387. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.d.ts +0 -7
  1388. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.d.ts.map +0 -1
  1389. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.js +0 -7
  1390. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts +0 -7
  1391. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts.map +0 -1
  1392. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +0 -7
  1393. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.d.ts +0 -7
  1394. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.d.ts.map +0 -1
  1395. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.js +0 -7
  1396. package/src/core/geom/3d/aabb/aabb3_raycast.d.ts +0 -7
  1397. package/src/core/geom/3d/aabb/aabb3_raycast.d.ts.map +0 -1
  1398. package/src/core/geom/3d/aabb/aabb3_raycast.js +0 -7
  1399. package/src/core/geom/3d/aabb/compute_aabb_from_points.d.ts +0 -7
  1400. package/src/core/geom/3d/aabb/compute_aabb_from_points.d.ts.map +0 -1
  1401. package/src/core/geom/3d/aabb/compute_aabb_from_points.js +0 -7
  1402. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts +0 -7
  1403. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts.map +0 -1
  1404. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +0 -7
  1405. package/src/core/geom/3d/compute_circle_bounding_box.d.ts +0 -7
  1406. package/src/core/geom/3d/compute_circle_bounding_box.d.ts.map +0 -1
  1407. package/src/core/geom/3d/compute_circle_bounding_box.js +0 -7
  1408. package/src/core/geom/3d/cone/computeConeBoundingBox.d.ts +0 -7
  1409. package/src/core/geom/3d/cone/computeConeBoundingBox.d.ts.map +0 -1
  1410. package/src/core/geom/3d/cone/computeConeBoundingBox.js +0 -7
  1411. package/src/core/geom/3d/cone/computeConePlaneSide.d.ts +0 -7
  1412. package/src/core/geom/3d/cone/computeConePlaneSide.d.ts.map +0 -1
  1413. package/src/core/geom/3d/cone/computeConePlaneSide.js +0 -7
  1414. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts +0 -7
  1415. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts.map +0 -1
  1416. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +0 -7
  1417. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.d.ts +0 -7
  1418. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.d.ts.map +0 -1
  1419. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.js +0 -7
  1420. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.d.ts +0 -7
  1421. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.d.ts.map +0 -1
  1422. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +0 -7
  1423. package/src/core/geom/3d/frustum/frustum_matrix4_project.d.ts +0 -7
  1424. package/src/core/geom/3d/frustum/frustum_matrix4_project.d.ts.map +0 -1
  1425. package/src/core/geom/3d/frustum/frustum_matrix4_project.js +0 -7
  1426. package/src/core/geom/3d/frustum/hexahedron_from_aabb.d.ts +0 -7
  1427. package/src/core/geom/3d/frustum/hexahedron_from_aabb.d.ts.map +0 -1
  1428. package/src/core/geom/3d/frustum/hexahedron_from_aabb.js +0 -7
  1429. package/src/core/geom/3d/frustum/read_three_planes_to_array.d.ts +0 -7
  1430. package/src/core/geom/3d/frustum/read_three_planes_to_array.d.ts.map +0 -1
  1431. package/src/core/geom/3d/frustum/read_three_planes_to_array.js +0 -7
  1432. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.d.ts +0 -7
  1433. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.d.ts.map +0 -1
  1434. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.js +0 -7
  1435. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +0 -7
  1436. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +0 -1
  1437. package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +0 -7
  1438. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.d.ts +0 -7
  1439. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.d.ts.map +0 -1
  1440. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +0 -7
  1441. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.d.ts +0 -7
  1442. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.d.ts.map +0 -1
  1443. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js +0 -7
  1444. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.d.ts +0 -7
  1445. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.d.ts.map +0 -1
  1446. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.js +0 -7
  1447. package/src/core/geom/3d/mat4/allocate_m4.d.ts +0 -7
  1448. package/src/core/geom/3d/mat4/allocate_m4.d.ts.map +0 -1
  1449. package/src/core/geom/3d/mat4/allocate_m4.js +0 -7
  1450. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.d.ts +0 -7
  1451. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.d.ts.map +0 -1
  1452. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.js +0 -7
  1453. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.d.ts +0 -7
  1454. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.d.ts.map +0 -1
  1455. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.js +0 -7
  1456. package/src/core/geom/3d/mat4/compose_matrix4_array.d.ts +0 -7
  1457. package/src/core/geom/3d/mat4/compose_matrix4_array.d.ts.map +0 -1
  1458. package/src/core/geom/3d/mat4/compose_matrix4_array.js +0 -7
  1459. package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts +0 -7
  1460. package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts.map +0 -1
  1461. package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +0 -7
  1462. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.d.ts +0 -7
  1463. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.d.ts.map +0 -1
  1464. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +0 -7
  1465. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.d.ts +0 -7
  1466. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.d.ts.map +0 -1
  1467. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.js +0 -7
  1468. package/src/core/geom/3d/morton/mortonEncode_LUT.d.ts +0 -7
  1469. package/src/core/geom/3d/morton/mortonEncode_LUT.d.ts.map +0 -1
  1470. package/src/core/geom/3d/morton/mortonEncode_LUT.js +0 -7
  1471. package/src/core/geom/3d/morton/mortonEncode_magicbits.d.ts +0 -7
  1472. package/src/core/geom/3d/morton/mortonEncode_magicbits.d.ts.map +0 -1
  1473. package/src/core/geom/3d/morton/mortonEncode_magicbits.js +0 -7
  1474. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.d.ts +0 -2
  1475. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.d.ts.map +0 -1
  1476. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.js +0 -5
  1477. package/src/core/geom/3d/plane/is_point_within_planes.d.ts +0 -7
  1478. package/src/core/geom/3d/plane/is_point_within_planes.d.ts.map +0 -1
  1479. package/src/core/geom/3d/plane/is_point_within_planes.js +0 -7
  1480. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.d.ts +0 -7
  1481. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.d.ts.map +0 -1
  1482. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +0 -7
  1483. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.d.ts +0 -7
  1484. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.d.ts.map +0 -1
  1485. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +0 -7
  1486. package/src/core/geom/3d/plane/plane3_intersect_plane.d.ts +0 -7
  1487. package/src/core/geom/3d/plane/plane3_intersect_plane.d.ts.map +0 -1
  1488. package/src/core/geom/3d/plane/plane3_intersect_plane.js +0 -7
  1489. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.d.ts +0 -7
  1490. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.d.ts.map +0 -1
  1491. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.js +0 -7
  1492. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.d.ts +0 -7
  1493. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.d.ts.map +0 -1
  1494. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.js +0 -7
  1495. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.d.ts +0 -7
  1496. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.d.ts.map +0 -1
  1497. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.js +0 -7
  1498. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.d.ts +0 -7
  1499. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.d.ts.map +0 -1
  1500. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.js +0 -7
  1501. package/src/core/geom/3d/ray/ray3_array_compose.d.ts +0 -7
  1502. package/src/core/geom/3d/ray/ray3_array_compose.d.ts.map +0 -1
  1503. package/src/core/geom/3d/ray/ray3_array_compose.js +0 -7
  1504. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.d.ts +0 -7
  1505. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.d.ts.map +0 -1
  1506. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.js +0 -7
  1507. package/src/core/geom/3d/ray/ray3_distance_to_point.d.ts +0 -7
  1508. package/src/core/geom/3d/ray/ray3_distance_to_point.d.ts.map +0 -1
  1509. package/src/core/geom/3d/ray/ray3_distance_to_point.js +0 -7
  1510. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.d.ts +0 -7
  1511. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.d.ts.map +0 -1
  1512. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.js +0 -7
  1513. package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts +0 -7
  1514. package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts.map +0 -1
  1515. package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +0 -7
  1516. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +0 -7
  1517. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +0 -1
  1518. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +0 -7
  1519. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.d.ts +0 -7
  1520. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.d.ts.map +0 -1
  1521. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.js +0 -7
  1522. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.d.ts +0 -7
  1523. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.d.ts.map +0 -1
  1524. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.js +0 -7
  1525. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.d.ts +0 -7
  1526. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.d.ts.map +0 -1
  1527. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.js +0 -7
  1528. package/src/core/geom/3d/sphere/sphere_array_intersects_point.d.ts +0 -7
  1529. package/src/core/geom/3d/sphere/sphere_array_intersects_point.d.ts.map +0 -1
  1530. package/src/core/geom/3d/sphere/sphere_array_intersects_point.js +0 -7
  1531. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.d.ts +0 -7
  1532. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.d.ts.map +0 -1
  1533. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.js +0 -7
  1534. package/src/core/geom/3d/sphere/sphere_intersects_point.d.ts +0 -7
  1535. package/src/core/geom/3d/sphere/sphere_intersects_point.d.ts.map +0 -1
  1536. package/src/core/geom/3d/sphere/sphere_intersects_point.js +0 -7
  1537. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +0 -7
  1538. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts.map +0 -1
  1539. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +0 -7
  1540. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.d.ts +0 -7
  1541. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.d.ts.map +0 -1
  1542. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js +0 -7
  1543. package/src/core/geom/3d/sphere/spherical_from_cartesian.d.ts +0 -7
  1544. package/src/core/geom/3d/sphere/spherical_from_cartesian.d.ts.map +0 -1
  1545. package/src/core/geom/3d/sphere/spherical_from_cartesian.js +0 -7
  1546. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +0 -7
  1547. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +0 -1
  1548. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +0 -7
  1549. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.d.ts +0 -7
  1550. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.d.ts.map +0 -1
  1551. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.js +0 -7
  1552. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.d.ts +0 -7
  1553. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.d.ts.map +0 -1
  1554. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.js +0 -7
  1555. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts +0 -7
  1556. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts.map +0 -1
  1557. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +0 -7
  1558. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.d.ts +0 -7
  1559. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.d.ts.map +0 -1
  1560. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js +0 -7
  1561. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.d.ts +0 -7
  1562. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.d.ts.map +0 -1
  1563. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.js +0 -7
  1564. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.d.ts +0 -7
  1565. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.d.ts.map +0 -1
  1566. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.js +0 -7
  1567. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.d.ts +0 -7
  1568. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.d.ts.map +0 -1
  1569. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.js +0 -7
  1570. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.d.ts +0 -7
  1571. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.d.ts.map +0 -1
  1572. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.js +0 -7
  1573. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.d.ts +0 -7
  1574. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.d.ts.map +0 -1
  1575. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.js +0 -7
  1576. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.d.ts +0 -7
  1577. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.d.ts.map +0 -1
  1578. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.js +0 -7
  1579. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.d.ts +0 -7
  1580. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.d.ts.map +0 -1
  1581. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.js +0 -7
  1582. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts +0 -8
  1583. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts.map +0 -1
  1584. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.js +0 -8
  1585. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +0 -7
  1586. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +0 -1
  1587. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +0 -7
  1588. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.d.ts +0 -7
  1589. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.d.ts.map +0 -1
  1590. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js +0 -7
  1591. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.d.ts +0 -7
  1592. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.d.ts.map +0 -1
  1593. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +0 -7
  1594. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.d.ts +0 -7
  1595. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.d.ts.map +0 -1
  1596. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.js +0 -7
  1597. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.d.ts +0 -7
  1598. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.d.ts.map +0 -1
  1599. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +0 -7
  1600. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.d.ts +0 -7
  1601. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.d.ts.map +0 -1
  1602. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js +0 -7
  1603. package/src/core/geom/3d/triangle/compute_triangle_area_3d.d.ts +0 -7
  1604. package/src/core/geom/3d/triangle/compute_triangle_area_3d.d.ts.map +0 -1
  1605. package/src/core/geom/3d/triangle/compute_triangle_area_3d.js +0 -7
  1606. package/src/core/geom/3d/triangle/compute_triangle_normal.d.ts +0 -7
  1607. package/src/core/geom/3d/triangle/compute_triangle_normal.d.ts.map +0 -1
  1608. package/src/core/geom/3d/triangle/compute_triangle_normal.js +0 -7
  1609. package/src/core/geom/3d/triangle/rayTriangleIntersection.d.ts +0 -7
  1610. package/src/core/geom/3d/triangle/rayTriangleIntersection.d.ts.map +0 -1
  1611. package/src/core/geom/3d/triangle/rayTriangleIntersection.js +0 -7
  1612. package/src/core/geom/3d/triangle/triangle3_incenter.d.ts +0 -7
  1613. package/src/core/geom/3d/triangle/triangle3_incenter.d.ts.map +0 -1
  1614. package/src/core/geom/3d/triangle/triangle3_incenter.js +0 -7
  1615. package/src/core/geom/3d/triangle/triangle_compute_plane_side.d.ts +0 -7
  1616. package/src/core/geom/3d/triangle/triangle_compute_plane_side.d.ts.map +0 -1
  1617. package/src/core/geom/3d/triangle/triangle_compute_plane_side.js +0 -7
  1618. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.d.ts +0 -7
  1619. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.d.ts.map +0 -1
  1620. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.js +0 -7
  1621. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.d.ts +0 -7
  1622. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.d.ts.map +0 -1
  1623. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.js +0 -7
  1624. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +0 -7
  1625. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +0 -1
  1626. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +0 -7
  1627. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts +0 -7
  1628. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts.map +0 -1
  1629. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +0 -7
  1630. package/src/core/geom/3d/util/make_justified_point_grid.d.ts +0 -7
  1631. package/src/core/geom/3d/util/make_justified_point_grid.d.ts.map +0 -1
  1632. package/src/core/geom/3d/util/make_justified_point_grid.js +0 -7
  1633. package/src/core/geom/mat3/m3_cm_from_translation.d.ts +0 -7
  1634. package/src/core/geom/mat3/m3_cm_from_translation.d.ts.map +0 -1
  1635. package/src/core/geom/mat3/m3_cm_from_translation.js +0 -7
  1636. package/src/core/geom/mat3/m3_cm_invert.d.ts +0 -7
  1637. package/src/core/geom/mat3/m3_cm_invert.d.ts.map +0 -1
  1638. package/src/core/geom/mat3/m3_cm_invert.js +0 -7
  1639. package/src/core/geom/mat3/m3_make_rotation.d.ts +0 -2
  1640. package/src/core/geom/mat3/m3_make_rotation.d.ts.map +0 -1
  1641. package/src/core/geom/mat3/m3_make_rotation.js +0 -5
  1642. package/src/core/geom/mat3/m3_multiply_vec3.d.ts +0 -7
  1643. package/src/core/geom/mat3/m3_multiply_vec3.d.ts.map +0 -1
  1644. package/src/core/geom/mat3/m3_multiply_vec3.js +0 -7
  1645. package/src/core/geom/packing/computeBoundingSphereOfSpheres.d.ts +0 -7
  1646. package/src/core/geom/packing/computeBoundingSphereOfSpheres.d.ts.map +0 -1
  1647. package/src/core/geom/packing/computeBoundingSphereOfSpheres.js +0 -7
  1648. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.d.ts +0 -7
  1649. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.d.ts.map +0 -1
  1650. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.js +0 -7
  1651. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.d.ts +0 -7
  1652. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.d.ts.map +0 -1
  1653. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.js +0 -7
  1654. package/src/core/geom/packing/max-rect/cutArea.d.ts +0 -7
  1655. package/src/core/geom/packing/max-rect/cutArea.d.ts.map +0 -1
  1656. package/src/core/geom/packing/max-rect/cutArea.js +0 -7
  1657. package/src/core/geom/packing/max-rect/findBestContainer.d.ts +0 -7
  1658. package/src/core/geom/packing/max-rect/findBestContainer.d.ts.map +0 -1
  1659. package/src/core/geom/packing/max-rect/findBestContainer.js +0 -7
  1660. package/src/core/geom/packing/max-rect/packMaxRectangles.d.ts +0 -7
  1661. package/src/core/geom/packing/max-rect/packMaxRectangles.d.ts.map +0 -1
  1662. package/src/core/geom/packing/max-rect/packMaxRectangles.js +0 -7
  1663. package/src/core/geom/packing/max-rect/packOneBox.d.ts +0 -7
  1664. package/src/core/geom/packing/max-rect/packOneBox.d.ts.map +0 -1
  1665. package/src/core/geom/packing/max-rect/packOneBox.js +0 -7
  1666. package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts +0 -7
  1667. package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts.map +0 -1
  1668. package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +0 -7
  1669. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.d.ts +0 -7
  1670. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.d.ts.map +0 -1
  1671. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.js +0 -7
  1672. package/src/core/geom/random/randomPointInBox.d.ts +0 -7
  1673. package/src/core/geom/random/randomPointInBox.d.ts.map +0 -1
  1674. package/src/core/geom/random/randomPointInBox.js +0 -7
  1675. package/src/core/geom/random/randomPointInCircle.d.ts +0 -7
  1676. package/src/core/geom/random/randomPointInCircle.d.ts.map +0 -1
  1677. package/src/core/geom/random/randomPointInCircle.js +0 -7
  1678. package/src/core/geom/random/randomPointInPoint.d.ts +0 -7
  1679. package/src/core/geom/random/randomPointInPoint.d.ts.map +0 -1
  1680. package/src/core/geom/random/randomPointInPoint.js +0 -7
  1681. package/src/core/geom/random/randomPointInSphere.d.ts +0 -7
  1682. package/src/core/geom/random/randomPointInSphere.d.ts.map +0 -1
  1683. package/src/core/geom/random/randomPointInSphere.js +0 -7
  1684. package/src/core/geom/random/randomPointOnBox.d.ts +0 -7
  1685. package/src/core/geom/random/randomPointOnBox.d.ts.map +0 -1
  1686. package/src/core/geom/random/randomPointOnBox.js +0 -7
  1687. package/src/core/geom/random/randomPointOnSphere.d.ts +0 -7
  1688. package/src/core/geom/random/randomPointOnSphere.d.ts.map +0 -1
  1689. package/src/core/geom/random/randomPointOnSphere.js +0 -7
  1690. package/src/core/geom/vec/vector_copy.d.ts +0 -7
  1691. package/src/core/geom/vec/vector_copy.d.ts.map +0 -1
  1692. package/src/core/geom/vec/vector_copy.js +0 -7
  1693. package/src/core/geom/vec/vector_scale_array.d.ts +0 -7
  1694. package/src/core/geom/vec/vector_scale_array.d.ts.map +0 -1
  1695. package/src/core/geom/vec/vector_scale_array.js +0 -7
  1696. package/src/core/geom/vec3/v3_angle_atan2_between.d.ts +0 -7
  1697. package/src/core/geom/vec3/v3_angle_atan2_between.d.ts.map +0 -1
  1698. package/src/core/geom/vec3/v3_angle_atan2_between.js +0 -7
  1699. package/src/core/geom/vec3/v3_angle_between.d.ts +0 -7
  1700. package/src/core/geom/vec3/v3_angle_between.d.ts.map +0 -1
  1701. package/src/core/geom/vec3/v3_angle_between.js +0 -7
  1702. package/src/core/geom/vec3/v3_angle_cos_between.d.ts +0 -7
  1703. package/src/core/geom/vec3/v3_angle_cos_between.d.ts.map +0 -1
  1704. package/src/core/geom/vec3/v3_angle_cos_between.js +0 -7
  1705. package/src/core/geom/vec3/v3_array_add_in_place.d.ts +0 -7
  1706. package/src/core/geom/vec3/v3_array_add_in_place.d.ts.map +0 -1
  1707. package/src/core/geom/vec3/v3_array_add_in_place.js +0 -7
  1708. package/src/core/geom/vec3/v3_array_centroid.d.ts +0 -7
  1709. package/src/core/geom/vec3/v3_array_centroid.d.ts.map +0 -1
  1710. package/src/core/geom/vec3/v3_array_centroid.js +0 -7
  1711. package/src/core/geom/vec3/v3_array_copy.d.ts +0 -7
  1712. package/src/core/geom/vec3/v3_array_copy.d.ts.map +0 -1
  1713. package/src/core/geom/vec3/v3_array_copy.js +0 -7
  1714. package/src/core/geom/vec3/v3_array_displace_in_direction.d.ts +0 -7
  1715. package/src/core/geom/vec3/v3_array_displace_in_direction.d.ts.map +0 -1
  1716. package/src/core/geom/vec3/v3_array_displace_in_direction.js +0 -7
  1717. package/src/core/geom/vec3/v3_array_equals.d.ts +0 -7
  1718. package/src/core/geom/vec3/v3_array_equals.d.ts.map +0 -1
  1719. package/src/core/geom/vec3/v3_array_equals.js +0 -7
  1720. package/src/core/geom/vec3/v3_array_immediate_add.d.ts +0 -7
  1721. package/src/core/geom/vec3/v3_array_immediate_add.d.ts.map +0 -1
  1722. package/src/core/geom/vec3/v3_array_immediate_add.js +0 -7
  1723. package/src/core/geom/vec3/v3_array_matrix4_rotate.d.ts +0 -7
  1724. package/src/core/geom/vec3/v3_array_matrix4_rotate.d.ts.map +0 -1
  1725. package/src/core/geom/vec3/v3_array_matrix4_rotate.js +0 -7
  1726. package/src/core/geom/vec3/v3_array_normalize.d.ts +0 -7
  1727. package/src/core/geom/vec3/v3_array_normalize.d.ts.map +0 -1
  1728. package/src/core/geom/vec3/v3_array_normalize.js +0 -7
  1729. package/src/core/geom/vec3/v3_array_scale.d.ts +0 -7
  1730. package/src/core/geom/vec3/v3_array_scale.d.ts.map +0 -1
  1731. package/src/core/geom/vec3/v3_array_scale.js +0 -7
  1732. package/src/core/geom/vec3/v3_compute_interior_angle.d.ts +0 -7
  1733. package/src/core/geom/vec3/v3_compute_interior_angle.d.ts.map +0 -1
  1734. package/src/core/geom/vec3/v3_compute_interior_angle.js +0 -7
  1735. package/src/core/geom/vec3/v3_dot_array_array.d.ts +0 -7
  1736. package/src/core/geom/vec3/v3_dot_array_array.d.ts.map +0 -1
  1737. package/src/core/geom/vec3/v3_dot_array_array.js +0 -7
  1738. package/src/core/geom/vec3/v3_matrix4_rotate.d.ts +0 -7
  1739. package/src/core/geom/vec3/v3_matrix4_rotate.d.ts.map +0 -1
  1740. package/src/core/geom/vec3/v3_matrix4_rotate.js +0 -7
  1741. package/src/core/geom/vec3/v3_multiply_scalar.d.ts +0 -7
  1742. package/src/core/geom/vec3/v3_multiply_scalar.d.ts.map +0 -1
  1743. package/src/core/geom/vec3/v3_multiply_scalar.js +0 -7
  1744. package/src/core/geom/vec3/v3_quat3_apply.d.ts +0 -7
  1745. package/src/core/geom/vec3/v3_quat3_apply.d.ts.map +0 -1
  1746. package/src/core/geom/vec3/v3_quat3_apply.js +0 -7
  1747. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +0 -7
  1748. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts.map +0 -1
  1749. package/src/core/geom/vec3/v3_quat3_apply_inverse.js +0 -7
  1750. package/src/core/geom/vec3/v3_triple_cross_product.d.ts +0 -7
  1751. package/src/core/geom/vec3/v3_triple_cross_product.d.ts.map +0 -1
  1752. package/src/core/geom/vec3/v3_triple_cross_product.js +0 -7
  1753. package/src/core/geom/vec4/v4_multiply_mat4.d.ts +0 -7
  1754. package/src/core/geom/vec4/v4_multiply_mat4.d.ts.map +0 -1
  1755. package/src/core/geom/vec4/v4_multiply_mat4.js +0 -7
  1756. package/src/core/math/fabsf.d.ts +0 -6
  1757. package/src/core/math/fabsf.d.ts.map +0 -1
  1758. package/src/core/math/fabsf.js +0 -6
  1759. package/src/core/model/object/optional_equality.d.ts +0 -10
  1760. package/src/core/model/object/optional_equality.d.ts.map +0 -1
  1761. package/src/core/model/object/optional_equality.js +0 -10
  1762. package/src/core/primitives/strings/string_compute_byte_size.d.ts +0 -7
  1763. package/src/core/primitives/strings/string_compute_byte_size.d.ts.map +0 -1
  1764. package/src/core/primitives/strings/string_compute_byte_size.js +0 -8
  1765. package/src/engine/graphics/FrameThrottle.d.ts +0 -2
  1766. package/src/engine/graphics/FrameThrottle.d.ts.map +0 -1
  1767. package/src/engine/graphics/FrameThrottle.js +0 -2
  1768. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts +0 -2
  1769. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts.map +0 -1
  1770. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +0 -2
  1771. package/src/engine/graphics/texture/isImageBitmap.d.ts +0 -2
  1772. package/src/engine/graphics/texture/isImageBitmap.d.ts.map +0 -1
  1773. package/src/engine/graphics/texture/isImageBitmap.js +0 -2
  1774. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +0 -10
  1775. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +0 -1
  1776. package/src/engine/graphics3/AnimationGraphSystem3.js +0 -10
  1777. package/src/engine/graphics3/AnimationSystem3.d.ts +0 -10
  1778. package/src/engine/graphics3/AnimationSystem3.d.ts.map +0 -1
  1779. package/src/engine/graphics3/AnimationSystem3.js +0 -10
  1780. package/src/engine/graphics3/CameraSystem3.d.ts +0 -10
  1781. package/src/engine/graphics3/CameraSystem3.d.ts.map +0 -1
  1782. package/src/engine/graphics3/CameraSystem3.js +0 -10
  1783. package/src/engine/graphics3/DebugDrawSystem3.d.ts +0 -10
  1784. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +0 -1
  1785. package/src/engine/graphics3/DebugDrawSystem3.js +0 -10
  1786. package/src/engine/graphics3/DecalSystem3.d.ts +0 -10
  1787. package/src/engine/graphics3/DecalSystem3.d.ts.map +0 -1
  1788. package/src/engine/graphics3/DecalSystem3.js +0 -10
  1789. package/src/engine/graphics3/FogOfWarSystem3.d.ts +0 -10
  1790. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +0 -1
  1791. package/src/engine/graphics3/FogOfWarSystem3.js +0 -10
  1792. package/src/engine/graphics3/GraphicsEngine3.d.ts +0 -10
  1793. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +0 -1
  1794. package/src/engine/graphics3/GraphicsEngine3.js +0 -10
  1795. package/src/engine/graphics3/HighlightSystem.d.ts +0 -19
  1796. package/src/engine/graphics3/HighlightSystem.d.ts.map +0 -1
  1797. package/src/engine/graphics3/HighlightSystem.js +0 -27
  1798. package/src/engine/graphics3/HighlightSystem3.d.ts +0 -13
  1799. package/src/engine/graphics3/HighlightSystem3.d.ts.map +0 -1
  1800. package/src/engine/graphics3/HighlightSystem3.js +0 -15
  1801. package/src/engine/graphics3/LightSystem3.d.ts +0 -10
  1802. package/src/engine/graphics3/LightSystem3.d.ts.map +0 -1
  1803. package/src/engine/graphics3/LightSystem3.js +0 -10
  1804. package/src/engine/graphics3/MeshSystem3.d.ts +0 -10
  1805. package/src/engine/graphics3/MeshSystem3.d.ts.map +0 -1
  1806. package/src/engine/graphics3/MeshSystem3.js +0 -10
  1807. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +0 -10
  1808. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +0 -1
  1809. package/src/engine/graphics3/ParticipatingMediaSystem3.js +0 -10
  1810. package/src/engine/graphics3/PathDisplaySystem3.d.ts +0 -10
  1811. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +0 -1
  1812. package/src/engine/graphics3/PathDisplaySystem3.js +0 -10
  1813. package/src/engine/graphics3/PickingSystem3.d.ts +0 -10
  1814. package/src/engine/graphics3/PickingSystem3.d.ts.map +0 -1
  1815. package/src/engine/graphics3/PickingSystem3.js +0 -10
  1816. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +0 -10
  1817. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +0 -1
  1818. package/src/engine/graphics3/ShadedGeometrySystem3.js +0 -10
  1819. package/src/engine/graphics3/TerrainSystem3.d.ts +0 -10
  1820. package/src/engine/graphics3/TerrainSystem3.d.ts.map +0 -1
  1821. package/src/engine/graphics3/TerrainSystem3.js +0 -10
  1822. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +0 -10
  1823. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +0 -1
  1824. package/src/engine/graphics3/TooltipComponentSystem3.js +0 -10
  1825. package/src/engine/graphics3/Trail3DSystem3.d.ts +0 -10
  1826. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +0 -1
  1827. package/src/engine/graphics3/Trail3DSystem3.js +0 -10
  1828. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +0 -10
  1829. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +0 -1
  1830. package/src/engine/graphics3/VolumetricLightMapSystem3.js +0 -10
  1831. package/src/engine/graphics3/WaterSystem3.d.ts +0 -10
  1832. package/src/engine/graphics3/WaterSystem3.d.ts.map +0 -1
  1833. package/src/engine/graphics3/WaterSystem3.js +0 -10
  1834. package/src/engine/network/convertPathToURL.d.ts +0 -2
  1835. package/src/engine/network/convertPathToURL.d.ts.map +0 -1
  1836. package/src/engine/network/convertPathToURL.js +0 -2
  1837. package/src/format/image/png/crc32.d.ts +0 -2
  1838. package/src/format/image/png/crc32.d.ts.map +0 -1
  1839. package/src/format/image/png/crc32.js +0 -7
  1840. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +0 -2
  1841. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +0 -1
  1842. package/src/shade/renderer/camera/OrbitalCameraController.js +0 -1
  1843. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts +0 -16
  1844. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts.map +0 -1
  1845. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.js +0 -17
  1846. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts +0 -3
  1847. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts.map +0 -1
  1848. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.js +0 -8
  1849. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts +0 -2
  1850. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts.map +0 -1
  1851. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.js +0 -1
  1852. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts +0 -8
  1853. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts.map +0 -1
  1854. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.js +0 -49
  1855. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts +0 -3
  1856. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts.map +0 -1
  1857. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.js +0 -90
  1858. package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts +0 -3
  1859. package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +0 -1
  1860. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +0 -126
  1861. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts +0 -8
  1862. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts.map +0 -1
  1863. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +0 -10
  1864. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +0 -31
  1865. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +0 -1
  1866. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +0 -62
  1867. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +0 -42
  1868. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +0 -1
  1869. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +0 -153
  1870. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +0 -54
  1871. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +0 -1
  1872. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +0 -75
  1873. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +0 -14
  1874. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +0 -1
  1875. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +0 -32
  1876. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +0 -30
  1877. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +0 -1
  1878. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +0 -184
  1879. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +0 -23
  1880. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +0 -1
  1881. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +0 -109
@@ -0,0 +1,2050 @@
1
+ import { BVH } from "../../../core/bvh2/bvh3/BVH.js";
2
+ import { bvh_query_user_data_intersects_capsule } from "../../../core/bvh2/bvh3/query/bvh_query_user_data_intersects_capsule.js";
3
+ import { PointHashGrid3 } from "../../../core/geom/3d/hash-grid/PointHashGrid3.js";
4
+ import { line3_compute_segment_segment_closest_points } from "../../../core/geom/3d/line/line3_compute_segment_segment_closest_points.js";
5
+ import { GOLDEN_RATIO } from "../../../core/math/GOLDEN_RATIO.js";
6
+ import { PI2 } from "../../../core/math/PI2.js";
7
+ import { clamp } from "../../../core/math/clamp.js";
8
+ import { lerp } from "../../../core/math/lerp.js";
9
+ import { curl_noise_3d } from "../../../core/math/noise/curl_noise_3d.js";
10
+ import { seededRandom } from "../../../core/math/random/seededRandom.js";
11
+ import { PhyllotaxisMode, phyllotaxis_sample_angle } from "../config/PhyllotaxisMode.js";
12
+ import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
13
+ import { TreeSkeleton } from "./TreeSkeleton.js";
14
+ import { tree_skeleton_fit_crown_frame } from "./tree_skeleton_fit_crown_frame.js";
15
+ import { assert } from "../../../core/assert.js";
16
+ import { flare_lobe_phase_offset } from "./flare_lobe_phase_offset.js";
17
+ import { crown_envelope_evaluate, crown_envelope_sdf } from "./crown_envelope_evaluate.js";
18
+ import { spine_frame_double_reflection } from "./spine_frame_double_reflection.js";
19
+ import { tree_skeleton_compute_pipe_radii } from "./tree_skeleton_compute_pipe_radii.js";
20
+
21
+ const GOLDEN_ANGLE = PI2 / (GOLDEN_RATIO * GOLDEN_RATIO); // ~2.399963229728653 rad (137.50776 deg)
22
+
23
+ /**
24
+ * Canonical order of a generator's outgoing rules: by target, then by content, so the order rules are listed in
25
+ * never changes the tree.
26
+ * @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} a
27
+ * @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} b
28
+ * @returns {number}
29
+ */
30
+ function compare_rule_target(a, b) {
31
+ return (a.target - b.target) || (a.hash() - b.hash());
32
+ }
33
+
34
+ /**
35
+ * Node position `u` of child `c` of a rule laying out `planned` children over its attachment interval, `u` in
36
+ * [0, 1) for `c` in [0, planned). The same layout continued to `c < 0` gives `u < 0`: where the rule's earlier
37
+ * children grew, below its interval.
38
+ *
39
+ * @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} rule
40
+ * @param {number} c
41
+ * @param {number} planned
42
+ * @param {boolean} on_trunk whorls compress toward the apex of a trunk (self-similar conical internodes)
43
+ * @returns {number}
44
+ */
45
+ function rule_node_u(rule, c, planned, on_trunk) {
46
+ switch (rule.phyllotaxis_mode) {
47
+ case PhyllotaxisMode.Opposite:
48
+ case PhyllotaxisMode.OppositeDecussate: {
49
+ const pair_count = Math.max(1, Math.ceil(planned / 2));
50
+ return pair_count > 1 ? ((c >> 1) + 0.35) / (pair_count - 0.55) : 0.5;
51
+ }
52
+ case PhyllotaxisMode.Whorled: {
53
+ const w_size = Math.max(1, rule.whorl_count | 0);
54
+ const whorl_total = Math.max(1, Math.ceil(planned / w_size));
55
+ const u_lin = whorl_total > 1 ? (Math.floor(c / w_size) + 0.35) / (whorl_total - 0.55) : 0.5;
56
+ // p > 1 => du/dt decreases as u -> 1; u_lin < 1 for every c < planned
57
+ return on_trunk ? 1.0 - Math.pow(1.0 - u_lin, 1.42) : u_lin;
58
+ }
59
+ default:
60
+ return planned > 1 ? (c + 0.35) / (planned - 0.55) : 0.5;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Azimuth of child `c` of a rule relative to its family's base azimuth, for any integer `c` (also `c < 0`).
66
+ * `FlareLobes` is placed by the caller.
67
+ *
68
+ * @param {import("../config/BranchSpawnRule.js").BranchSpawnRule} rule
69
+ * @param {number} c
70
+ * @returns {number}
71
+ */
72
+ function rule_node_phi(rule, c) {
73
+ return phyllotaxis_sample_angle(rule.phyllotaxis_mode, c, rule.whorl_count);
74
+ }
75
+
76
+ const SCRATCH_CURL = [0, 0, 0];
77
+ const SCRATCH_RMF = new Float64Array(6);
78
+ const SCRATCH_POS = new Float32Array(3);
79
+ const SCRATCH_TAN = new Float32Array(3);
80
+ const SCRATCH_P0 = new Float32Array(3);
81
+ const SCRATCH_T0 = new Float32Array(3);
82
+ const SCRATCH_R0 = new Float32Array(3);
83
+ const SCRATCH_M_PREV = new Float32Array(3);
84
+ const SCRATCH_M_NEXT = new Float32Array(3);
85
+ const SCRATCH_GUIDE_P0 = new Float32Array(3);
86
+ const SCRATCH_GUIDE_P1 = new Float32Array(3);
87
+ const SCRATCH_GUIDE_T = new Float32Array(3);
88
+
89
+ /**
90
+ * Evaluates the trunk guide curve position `out_pos` and unit tangent `out_tan` at normalized
91
+ * parameter `t_norm` in [0, 1]. Defaults to the vertical upward plumb line `(0, t_norm * trunk_len, 0)`
92
+ * when `trunk_guide` is null or omitted.
93
+ *
94
+ * @param {Float32Array|number[]} out_pos
95
+ * @param {Float32Array|number[]} out_tan
96
+ * @param {Array<ArrayLike<number>>|Function|null|undefined} trunk_guide
97
+ * @param {number} t_norm
98
+ * @param {number} trunk_len
99
+ */
100
+ function evaluate_trunk_guide(out_pos, out_tan, trunk_guide, t_norm, trunk_len) {
101
+ const t = clamp(t_norm, 0.0, 1.0);
102
+ if (!trunk_guide) {
103
+ out_pos[0] = 0.0;
104
+ out_pos[1] = t * trunk_len;
105
+ out_pos[2] = 0.0;
106
+ out_tan[0] = 0.0;
107
+ out_tan[1] = 1.0;
108
+ out_tan[2] = 0.0;
109
+ return;
110
+ }
111
+
112
+ const sample_pt = (u, dst) => {
113
+ if (typeof trunk_guide === "function") {
114
+ trunk_guide(u, dst);
115
+ return;
116
+ }
117
+ if (Array.isArray(trunk_guide) && trunk_guide.length >= 2) {
118
+ const n = trunk_guide.length - 1;
119
+ const su = clamp(u, 0.0, 1.0) * n;
120
+ const idx = Math.min(n - 1, Math.floor(su));
121
+ const frac = su - idx;
122
+ const a = trunk_guide[idx];
123
+ const b = trunk_guide[idx + 1];
124
+ dst[0] = lerp(a[0] ?? 0.0, b[0] ?? 0.0, frac);
125
+ dst[1] = lerp(a[1] ?? 0.0, b[1] ?? 0.0, frac);
126
+ dst[2] = lerp(a[2] ?? 0.0, b[2] ?? 0.0, frac);
127
+ return;
128
+ }
129
+ dst[0] = 0.0;
130
+ dst[1] = u * trunk_len;
131
+ dst[2] = 0.0;
132
+ };
133
+
134
+ sample_pt(t, out_pos);
135
+ const eps = 0.01;
136
+ const t_a = Math.max(0.0, t - eps);
137
+ const t_b = Math.min(1.0, t + eps);
138
+ const pa = [0, 0, 0];
139
+ const pb = [0, 0, 0];
140
+ sample_pt(t_a, pa);
141
+ sample_pt(t_b, pb);
142
+ let tx = pb[0] - pa[0];
143
+ let ty = pb[1] - pa[1];
144
+ let tz = pb[2] - pa[2];
145
+ const tl = Math.hypot(tx, ty, tz);
146
+ if (tl > 1e-8) {
147
+ out_tan[0] = tx / tl;
148
+ out_tan[1] = ty / tl;
149
+ out_tan[2] = tz / tl;
150
+ } else {
151
+ out_tan[0] = 0.0;
152
+ out_tan[1] = 1.0;
153
+ out_tan[2] = 0.0;
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Rotates unit vector `(vx, vy, vz)` around unit axis `(ax, ay, az)` by `angle` radians (Rodrigues' formula).
159
+ * @param {number[]|Float64Array} out
160
+ * @param {number} vx
161
+ * @param {number} vy
162
+ * @param {number} vz
163
+ * @param {number} ax
164
+ * @param {number} ay
165
+ * @param {number} az
166
+ * @param {number} angle
167
+ */
168
+ function rotate_around_axis(out, vx, vy, vz, ax, ay, az, angle) {
169
+ const c = Math.cos(angle);
170
+ const s = Math.sin(angle);
171
+ const dot = vx * ax + vy * ay + vz * az;
172
+ const omc = 1.0 - c;
173
+
174
+ const cx = ay * vz - az * vy;
175
+ const cy = az * vx - ax * vz;
176
+ const cz = ax * vy - ay * vx;
177
+
178
+ let rx = vx * c + cx * s + ax * dot * omc;
179
+ let ry = vy * c + cy * s + ay * dot * omc;
180
+ let rz = vz * c + cz * s + az * dot * omc;
181
+
182
+ const len = Math.sqrt(rx * rx + ry * ry + rz * rz);
183
+ if (len > 1e-12) {
184
+ const inv = 1.0 / len;
185
+ rx *= inv;
186
+ ry *= inv;
187
+ rz *= inv;
188
+ }
189
+ out[0] = rx;
190
+ out[1] = ry;
191
+ out[2] = rz;
192
+ }
193
+
194
+ /**
195
+ * Determines the non-exempt sub-segment parameter intervals `[s_min, 1]` on candidate segment A
196
+ * and `[t_min, 1]` on existing segment B for branch-branch capsule collision testing.
197
+ * Returns `false` if the segment pair is topologically exempt (e.g. direct parent-child base collar).
198
+ *
199
+ * @param {number} bA
200
+ * @param {number} parent_bA
201
+ * @param {number} attach_seg_A
202
+ * @param {boolean} is_split_A
203
+ * @param {number} local_idx_A
204
+ * @param {number} bB
205
+ * @param {number} parent_bB
206
+ * @param {number} attach_seg_B
207
+ * @param {boolean} is_split_B
208
+ * @param {number} local_idx_B
209
+ * @param {Float64Array|number[]} out_bounds `[s_min, t_min]`
210
+ * @returns {boolean}
211
+ */
212
+ function resolve_subsegment_bounds(
213
+ bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
214
+ bB, parent_bB, attach_seg_B, is_split_B, local_idx_B,
215
+ out_bounds
216
+ ) {
217
+ if (bA === bB) return false;
218
+
219
+ // 1. A is a direct child of B
220
+ if (parent_bA === bB) {
221
+ if (is_split_A) {
222
+ if (local_idx_A === 0 && local_idx_B === attach_seg_A) return false;
223
+ if (local_idx_A === 0 && local_idx_B === attach_seg_A + 1) {
224
+ out_bounds[0] = 0.55;
225
+ out_bounds[1] = 0.55;
226
+ return true;
227
+ }
228
+ if (local_idx_A === 1 && (local_idx_B === attach_seg_A || local_idx_B === attach_seg_A + 1)) {
229
+ out_bounds[0] = 0.45;
230
+ out_bounds[1] = 0.45;
231
+ return true;
232
+ }
233
+ } else {
234
+ if (local_idx_A === 0 && Math.abs(local_idx_B - attach_seg_A) <= 1) return false;
235
+ if (local_idx_A === 1 && Math.abs(local_idx_B - attach_seg_A) <= 1) {
236
+ if (bA < 0 || local_idx_B === attach_seg_A) return false;
237
+ out_bounds[0] = 0.35;
238
+ out_bounds[1] = 0.0;
239
+ return true;
240
+ }
241
+ }
242
+ }
243
+
244
+ // 2. B is a direct child of A
245
+ if (parent_bB === bA) {
246
+ if (is_split_B) {
247
+ if (local_idx_B === 0 && local_idx_A === attach_seg_B) return false;
248
+ if (local_idx_B === 0 && local_idx_A === attach_seg_B + 1) {
249
+ out_bounds[0] = 0.55;
250
+ out_bounds[1] = 0.55;
251
+ return true;
252
+ }
253
+ if (local_idx_B === 1 && (local_idx_A === attach_seg_B || local_idx_A === attach_seg_B + 1)) {
254
+ out_bounds[0] = 0.45;
255
+ out_bounds[1] = 0.45;
256
+ return true;
257
+ }
258
+ } else {
259
+ if (local_idx_B <= 1 && Math.abs(local_idx_A - attach_seg_B) <= 1) return false;
260
+ }
261
+ }
262
+
263
+ // 3. A and B are siblings sharing the same parent branch
264
+ if (parent_bA >= 0 && parent_bA === parent_bB) {
265
+ if (local_idx_A === 0 && local_idx_B === 0) {
266
+ out_bounds[0] = 0.50;
267
+ out_bounds[1] = 0.50;
268
+ return true;
269
+ }
270
+ if (local_idx_A === 0 && local_idx_B === 1 && Math.abs(attach_seg_A - attach_seg_B) <= 1) {
271
+ out_bounds[0] = 0.25;
272
+ out_bounds[1] = 0.0;
273
+ return true;
274
+ }
275
+ if (local_idx_A === 1 && local_idx_B === 0 && Math.abs(attach_seg_A - attach_seg_B) <= 1) {
276
+ out_bounds[0] = 0.0;
277
+ out_bounds[1] = 0.25;
278
+ return true;
279
+ }
280
+ }
281
+
282
+ out_bounds[0] = 0.0;
283
+ out_bounds[1] = 0.0;
284
+ return true;
285
+ }
286
+
287
+ /**
288
+ * Grows a tree's framework from its generator graph (`TreeGrowth.Graph`): a directed `TreeSkeleton` from a
289
+ * `TreeSpeciesConfig`, without the shoot systems of its `shoot_rules` (`tree_skeleton_grow` grows those on it), combining:
290
+ * - A branch generator graph: `species.branches[0]` grows the trunk, and every `species.branch_rules` edge
291
+ * spawns branches of its `target` generator along each branch of its `source` generator
292
+ * - Parametric Cubic Hermite spine generation (`BranchGeneratorConfig`, `AnimationCurve` profiles)
293
+ * - Botanical phyllotaxis (`SpiralGolden`, `AlternateDistichous`, `Tristichous`, `Opposite`, `OppositeDecussate`, `Whorled`, `FlareLobes`)
294
+ * - Structural surface roots (`BranchGeneratorConfig.root`) that creep along the ground plane `y = 0`
295
+ * - Gravitropism (toward `-Y`), phototropism (toward `+Y` and outward crown exterior), and 3D `curl_noise_3d` gnarl
296
+ * - Dichotomous / sympodial trunk & bough splitting
297
+ * - Space colonization crown competition via `PointHashGrid3`
298
+ * - Rotation-Minimizing Frames (`spine_frame_double_reflection`)
299
+ * - Pipe Model cross-section radius accumulation (`tree_skeleton_compute_pipe_radii`)
300
+ *
301
+ * @param {TreeSpeciesConfig|Object} [config]
302
+ * @param {TreeSkeleton} [out]
303
+ * @returns {TreeSkeleton}
304
+ */
305
+ export function tree_skeleton_grow_framework(config = new TreeSpeciesConfig(), out = new TreeSkeleton()) {
306
+ const species = config && config.isTreeSpeciesConfig ? config : TreeSpeciesConfig.from(config);
307
+ out.clear();
308
+
309
+ const rng = seededRandom(species.seed | 0);
310
+ // Seed-derived 3D noise offset so unseeded Simplex/Curl fields are unique and deterministic per seed
311
+ const noise_ox = (rng() - 0.5) * 1000.0;
312
+ const noise_oy = (rng() - 0.5) * 1000.0;
313
+ const noise_oz = (rng() - 0.5) * 1000.0;
314
+
315
+ const crown = species.crown;
316
+ const crown_cy = crown.base_height + crown.height * 0.5;
317
+ out.crown_center[0] = 0.0;
318
+ out.crown_center[1] = crown_cy;
319
+ out.crown_center[2] = 0.0;
320
+
321
+ out.crown_radii[0] = Math.max(0.25, crown.radius);
322
+ out.crown_radii[1] = Math.max(0.25, crown.height * 0.5);
323
+ out.crown_radii[2] = Math.max(0.25, crown.radius);
324
+
325
+ // Build Space Colonization attraction point cloud + PointHashGrid3 once
326
+ const use_space_col = crown.space_colonization_weight > 0.0 && crown.attraction_point_count > 0;
327
+ const attr_count = use_space_col ? (crown.attraction_point_count | 0) : 0;
328
+ const attr_positions = new Float32Array(attr_count * 3);
329
+ const attr_alive = new Uint8Array(attr_count);
330
+ let attr_grid = null;
331
+
332
+ if (use_space_col) {
333
+ let placed = 0;
334
+ let attempts = 0;
335
+ const max_attempts = attr_count * 12;
336
+ while (placed < attr_count && attempts < max_attempts) {
337
+ attempts++;
338
+ const u_h = rng();
339
+ const env_r = crown.radius * crown_envelope_evaluate(crown.envelope_type, u_h);
340
+ const rx = (rng() * 2.0 - 1.0) * env_r;
341
+ const rz = (rng() * 2.0 - 1.0) * env_r;
342
+ if (rx * rx + rz * rz <= env_r * env_r) {
343
+ const ry = crown.base_height + u_h * crown.height;
344
+ attr_positions[placed * 3] = rx;
345
+ attr_positions[placed * 3 + 1] = ry;
346
+ attr_positions[placed * 3 + 2] = rz;
347
+ attr_alive[placed] = 1;
348
+ placed++;
349
+ }
350
+ }
351
+ while (placed < attr_count) {
352
+ const theta = rng() * PI2;
353
+ const u_h = rng();
354
+ const r = Math.sqrt(rng()) * crown.radius * crown_envelope_evaluate(crown.envelope_type, u_h);
355
+ attr_positions[placed * 3] = Math.cos(theta) * r;
356
+ attr_positions[placed * 3 + 1] = crown.base_height + u_h * crown.height;
357
+ attr_positions[placed * 3 + 2] = Math.sin(theta) * r;
358
+ attr_alive[placed] = 1;
359
+ placed++;
360
+ }
361
+
362
+ attr_grid = new PointHashGrid3();
363
+ attr_grid.build(attr_positions, attr_count, Math.max(0.25, crown.attraction_radius));
364
+ }
365
+
366
+ const r_influence_sq = crown.attraction_radius * crown.attraction_radius;
367
+ const r_kill_sq = crown.kill_radius * crown.kill_radius;
368
+
369
+ // Queue of branches to grow in level-order (guarantees parent branches & vertices precede children)
370
+ const queue = [];
371
+
372
+ const lvl0 = species.branches[0];
373
+ if (!lvl0) {
374
+ return out;
375
+ }
376
+
377
+ // Outgoing rules of every generator in canonical order, so the order rules are listed in does not change the tree
378
+ const outgoing_rules = species.branches.map(() => []);
379
+ for (let r = 0; r < species.branch_rules.length; r++) {
380
+ const rule = species.branch_rules[r];
381
+ assert.ok(rule.source >= 0 && rule.source < rule.target && rule.target < species.branches.length,
382
+ 'branch rule must satisfy 0 <= source < target < branches.length');
383
+ outgoing_rules[rule.source].push(rule);
384
+ }
385
+ for (let g = 0; g < outgoing_rules.length; g++) {
386
+ outgoing_rules[g].sort(compare_rule_target);
387
+ }
388
+
389
+ // a seed leader is a shoot a few centimetres long
390
+ const trunk_len = Math.max(1e-3, lvl0.length * (1.0 + (rng() * 2.0 - 1.0) * lvl0.length_variance));
391
+ const trunk_base_r = Math.max(0.01, trunk_len * lvl0.radius_ratio);
392
+
393
+ evaluate_trunk_guide(SCRATCH_GUIDE_P0, SCRATCH_GUIDE_T, species.trunk_guide, 0.0, trunk_len);
394
+
395
+ // Apply subtle initial basal trunk lean around the guide tangent
396
+ const max_lean = lvl0.excurrent ? 0.025 : 0.06;
397
+ const lean_ang = clamp((lvl0.basal_lean ?? 0.02) * (0.75 + 0.5 * rng()), 0.0, max_lean);
398
+ const lean_az = rng() * PI2;
399
+ const init_tx = clamp(SCRATCH_GUIDE_T[0] + Math.sin(lean_ang) * Math.cos(lean_az), -0.95, 0.95);
400
+ const init_ty = Math.max(0.2, SCRATCH_GUIDE_T[1] * Math.cos(lean_ang));
401
+ const init_tz = clamp(SCRATCH_GUIDE_T[2] + Math.sin(lean_ang) * Math.sin(lean_az), -0.95, 0.95);
402
+ const init_t_len = Math.hypot(init_tx, init_ty, init_tz) || 1.0;
403
+ const norm_tx = init_tx / init_t_len;
404
+ const norm_ty = init_ty / init_t_len;
405
+ const norm_tz = init_tz / init_t_len;
406
+
407
+ // Orthonormal initial R perpendicular to norm_T
408
+ let init_rx = 1.0 - norm_tx * norm_tx;
409
+ let init_ry = -norm_ty * norm_tx;
410
+ let init_rz = -norm_tz * norm_tx;
411
+ const init_r_len = Math.hypot(init_rx, init_ry, init_rz) || 1.0;
412
+ init_rx /= init_r_len;
413
+ init_ry /= init_r_len;
414
+ init_rz /= init_r_len;
415
+
416
+ queue.push({
417
+ level: 0,
418
+ generator: 0,
419
+ in_crown: true,
420
+ parent_branch_id: -1,
421
+ parent_edge_id: -1,
422
+ parent_attach_seg_idx: -1,
423
+ parent_attach_t: 0.0,
424
+ start_vertex: -1,
425
+ px: SCRATCH_GUIDE_P0[0],
426
+ py: SCRATCH_GUIDE_P0[1],
427
+ pz: SCRATCH_GUIDE_P0[2],
428
+ tx: norm_tx,
429
+ ty: norm_ty,
430
+ tz: norm_tz,
431
+ rx: init_rx,
432
+ ry: init_ry,
433
+ rz: init_rz,
434
+ emerge_drx: init_rx,
435
+ emerge_dry: init_ry,
436
+ emerge_drz: init_rz,
437
+ length: trunk_len,
438
+ full_branch_length: trunk_len,
439
+ base_radius: trunk_base_r,
440
+ start_seg: 0,
441
+ total_segs: Math.max(1, lvl0.segments),
442
+ shape_segs: Math.max(1, lvl0.segments),
443
+ initial_arc_s: 0.0,
444
+ has_split: false,
445
+ is_split_fork: false,
446
+ cum_t0: 0.0,
447
+ cum_t1: 1.0
448
+ });
449
+
450
+ const rot_scratch = [0, 0, 0];
451
+
452
+ // Scope-local BVH and per-segment metadata for branch-branch spatial avoidance & collision prevention
453
+ const bvh = new BVH();
454
+ const bvh_hits = new Uint32Array(256);
455
+ const query_capsule = new Float32Array(7);
456
+ const sub_bounds = new Float64Array(2);
457
+ const closest_st = new Float64Array(2);
458
+
459
+ const seg_branch_id = [];
460
+ const seg_local_idx = [];
461
+ const seg_p0x = [], seg_p0y = [], seg_p0z = [], seg_r0 = [];
462
+ const seg_p1x = [], seg_p1y = [], seg_p1z = [], seg_r1 = [];
463
+ const seg_bvh_leaf = [];
464
+
465
+ const branch_parent_seg_idx = [];
466
+ const branch_is_split_fork = [];
467
+
468
+ /**
469
+ * Evaluates the minimum signed surface-to-surface clearance between a candidate segment A
470
+ * and all non-exempt existing segments in `bvh`.
471
+ */
472
+ const evaluate_candidate_clearance = (
473
+ bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
474
+ a0x, a0y, a0z, rA0,
475
+ a1x, a1y, a1z, rA1,
476
+ extra_margin
477
+ ) => {
478
+ if (bvh.size === 0) return 10.0;
479
+ const max_rA = Math.max(rA0, rA1);
480
+ query_capsule[0] = a0x;
481
+ query_capsule[1] = a0y;
482
+ query_capsule[2] = a0z;
483
+ query_capsule[3] = a1x;
484
+ query_capsule[4] = a1y;
485
+ query_capsule[5] = a1z;
486
+ query_capsule[6] = max_rA * 1.15 + extra_margin + 0.04;
487
+
488
+ const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
489
+ let min_clear = 10.0;
490
+
491
+ for (let h = 0; h < hit_count; h++) {
492
+ const eB = bvh_hits[h];
493
+ const bB = seg_branch_id[eB];
494
+ const local_idx_B = seg_local_idx[eB];
495
+ const parent_bB = out.branch_parent[bB];
496
+ const attach_seg_B = branch_parent_seg_idx[bB];
497
+ const is_split_B = branch_is_split_fork[bB];
498
+
499
+ if (!resolve_subsegment_bounds(
500
+ bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
501
+ bB, parent_bB, attach_seg_B, is_split_B, local_idx_B,
502
+ sub_bounds
503
+ )) {
504
+ continue;
505
+ }
506
+
507
+ const s_min = sub_bounds[0];
508
+ const t_min = sub_bounds[1];
509
+ const sa0x = a0x + (a1x - a0x) * s_min;
510
+ const sa0y = a0y + (a1y - a0y) * s_min;
511
+ const sa0z = a0z + (a1z - a0z) * s_min;
512
+
513
+ const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
514
+ const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
515
+ const sb0x = b0x + (b1x - b0x) * t_min;
516
+ const sb0y = b0y + (b1y - b0y) * t_min;
517
+ const sb0z = b0z + (b1z - b0z) * t_min;
518
+
519
+ line3_compute_segment_segment_closest_points(
520
+ closest_st,
521
+ sa0x, sa0y, sa0z, a1x, a1y, a1z,
522
+ sb0x, sb0y, sb0z, b1x, b1y, b1z
523
+ );
524
+
525
+ const s_f = s_min + (1.0 - s_min) * closest_st[0];
526
+ const t_f = t_min + (1.0 - t_min) * closest_st[1];
527
+
528
+ const qAx = a0x + (a1x - a0x) * s_f;
529
+ const qAy = a0y + (a1y - a0y) * s_f;
530
+ const qAz = a0z + (a1z - a0z) * s_f;
531
+ const qBx = b0x + (b1x - b0x) * t_f;
532
+ const qBy = b0y + (b1y - b0y) * t_f;
533
+ const qBz = b0z + (b1z - b0z) * t_f;
534
+
535
+ const dist = Math.hypot(qAx - qBx, qAy - qBy, qAz - qBz);
536
+ const rA = rA0 + (rA1 - rA0) * s_f;
537
+ const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
538
+ const r_req = (rA + rB) * 1.08 + extra_margin;
539
+ const clear = dist - r_req;
540
+ if (clear < min_clear) {
541
+ min_clear = clear;
542
+ }
543
+ }
544
+ return min_clear;
545
+ };
546
+
547
+ for (let q_idx = 0; q_idx < queue.length; q_idx++) {
548
+ const job = queue[q_idx];
549
+ const level = job.level;
550
+ const generator = job.generator;
551
+ const lvl_cfg = species.branches[generator];
552
+
553
+ const phase_hash = rng();
554
+ const N_seg = job.total_segs;
555
+ // Shape is a function of position along the whole branch: envelopes take the genealogical t (cum_t0..cum_t1)
556
+ // and per-step amounts the whole branch's segmentation, so a dead stub bends as the base of its branch did
557
+ const N_shape = job.shape_segs;
558
+ const remaining_segs = N_seg - job.start_seg;
559
+ if (remaining_segs <= 0) continue;
560
+
561
+ const step_len = job.length / N_seg;
562
+ const prof_p0 = lvl_cfg.radius_profile.evaluate(0.0);
563
+ const prof_p1 = lvl_cfg.radius_profile.evaluate(1.0);
564
+ const prof_span = prof_p0 - prof_p1;
565
+
566
+ let cur_px = job.px;
567
+ let cur_py = job.py;
568
+ let cur_pz = job.pz;
569
+ let cur_tx = job.tx;
570
+ let cur_ty = job.ty;
571
+ let cur_tz = job.tz;
572
+ let cur_rx = job.rx;
573
+ let cur_ry = job.ry;
574
+ let cur_rz = job.rz;
575
+ let cur_arc_s = job.initial_arc_s;
576
+
577
+ // Compute binormal S = T x R
578
+ let cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
579
+ let cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
580
+ let cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
581
+
582
+ let prev_v = job.start_vertex;
583
+ let branch_id = -1;
584
+
585
+ if (prev_v < 0) {
586
+ const t0 = job.start_seg / N_seg;
587
+ const u_prof0 = prof_span > 1e-4
588
+ ? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(t0)) / prof_span, 0.0, 1.0)
589
+ : t0;
590
+ const min_r0_frac = level === 0 ? 0.08 : 0.15;
591
+ const r0 = Math.max(0.002, job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_prof0, min_r0_frac));
592
+
593
+ branch_id = out.add_branch(
594
+ 0,
595
+ level,
596
+ generator,
597
+ job.parent_branch_id,
598
+ job.parent_edge_id,
599
+ job.parent_attach_t,
600
+ job.length,
601
+ r0,
602
+ phase_hash
603
+ );
604
+ prev_v = out.add_node(
605
+ cur_px, cur_py, cur_pz,
606
+ cur_tx, cur_ty, cur_tz,
607
+ cur_rx, cur_ry, cur_rz,
608
+ r0,
609
+ branch_id,
610
+ level,
611
+ job.parent_branch_id,
612
+ t0,
613
+ cur_arc_s,
614
+ phase_hash
615
+ );
616
+ if (job.attach_parent_vertex !== undefined && job.attach_parent_vertex >= 0) {
617
+ out.connect_nodes(job.attach_parent_vertex, prev_v);
618
+ }
619
+ out.branch_root_vertex[branch_id] = prev_v;
620
+ out.branch_tip_vertex[branch_id] = prev_v;
621
+ } else {
622
+ const prev_r = out.node_read_radius(prev_v);
623
+ branch_id = out.add_branch(
624
+ prev_v,
625
+ level,
626
+ generator,
627
+ job.parent_branch_id,
628
+ job.parent_edge_id,
629
+ job.parent_attach_t,
630
+ job.length,
631
+ prev_r,
632
+ phase_hash
633
+ );
634
+ }
635
+
636
+ branch_parent_seg_idx[branch_id] = job.parent_attach_seg_idx ?? -1;
637
+ branch_is_split_fork[branch_id] = Boolean(job.is_split_fork);
638
+ out.branch_dead[branch_id] = job.dead ? 1 : 0;
639
+
640
+ const branch_edges = [];
641
+ const branch_edge_t0 = [];
642
+ const branch_edge_t1 = [];
643
+ const branch_vertices = [prev_v];
644
+
645
+ // Pre-schedule the phyllotactic child attachments of every outgoing rule so the parent spine kinks
646
+ // sympodially at lateral emissions
647
+ const len_fraction_est = level >= 1
648
+ ? clamp(Math.pow(job.length / Math.max(0.2, lvl_cfg.length), 0.85), 0.0, 1.0)
649
+ : 1.0;
650
+ const can_bear_children = !job.dead && job.base_radius >= 0.006 && (level === 0 || job.length >= 0.55);
651
+ const span_fraction_est = job.child_span_fraction ?? Math.max(0.25, (N_seg - job.start_seg) / Math.max(1, N_seg));
652
+ const effective_span = span_fraction_est * len_fraction_est;
653
+ const t_start_est = job.start_seg / N_seg;
654
+ const raw_base_phi = rng() * PI2;
655
+ const scheduled_children = [];
656
+ let has_children = false;
657
+
658
+ const rules = outgoing_rules[generator];
659
+ for (let r = 0; r < rules.length; r++) {
660
+ const rule = rules[r];
661
+ if (rule.count <= 0 || !can_bear_children) continue;
662
+ has_children = true;
663
+
664
+ const planned_child_count = effective_span < 0.99
665
+ ? Math.max(1, Math.round(rule.count * effective_span))
666
+ : rule.count;
667
+ const t_lo = Math.max(clamp(rule.attach_min, 0.0, 0.92), t_start_est);
668
+ const t_hi = Math.min(0.968, rule.attach_max);
669
+ const t_cap = Math.min(0.98, rule.attach_max);
670
+ if (t_hi <= t_lo + 1e-3) continue;
671
+
672
+ // Each rule turns its family by the golden angle, so families sharing a stretch of the parent interleave
673
+ let base_phi = raw_base_phi + r * GOLDEN_ANGLE;
674
+ if (
675
+ level >= 1
676
+ && (rule.phyllotaxis_mode === PhyllotaxisMode.AlternateDistichous
677
+ || rule.phyllotaxis_mode === PhyllotaxisMode.Opposite)
678
+ ) {
679
+ // Align distichous / opposite lateral branching plane with the horizontal plane perpendicular to T
680
+ const horiz_phi = Math.atan2(-cur_ry, cur_sy);
681
+ base_phi = horiz_phi + (raw_base_phi < Math.PI ? 0.0 : Math.PI) + ((raw_base_phi % Math.PI) / Math.PI - 0.5) * 0.28;
682
+ }
683
+
684
+ for (let c = 0; c < planned_child_count; c++) {
685
+ const u_c = rule_node_u(rule, c, planned_child_count, level === 0);
686
+ const t_att = clamp(
687
+ lerp(t_lo, t_hi, clamp(u_c, 0.0, 1.0)) + (rng() - 0.5) * ((t_hi - t_lo) * 0.25 / planned_child_count),
688
+ t_lo,
689
+ t_cap
690
+ );
691
+
692
+ let phi_c = base_phi + rule_node_phi(rule, c);
693
+ if (rule.phyllotaxis_mode === PhyllotaxisMode.FlareLobes) {
694
+ // On a crest of this branch's basal flare lobes, in the same frame the bark mesher shapes them in
695
+ const lobes = Math.max(1, lvl_cfg.flare_lobes | 0);
696
+ const arc_est = job.initial_arc_s + t_att * job.length;
697
+ phi_c = ((c % lobes) * PI2) / lobes - flare_lobe_phase_offset(arc_est, phase_hash);
698
+ }
699
+ phi_c += (rng() * 2.0 - 1.0) * rule.azimuth_jitter;
700
+ scheduled_children.push({ t_attach: t_att, phi: phi_c, rule, age: 0.0, retained: 1.0 });
701
+ }
702
+
703
+ // Self-pruning: below t_lo this crown rule once bore children too, at the same nodes, which died as the
704
+ // crown rose above them and were shed. Age runs from 0 just below the living children to 1 at the stem's
705
+ // base; a branch that died earlier died smaller, (1 - age) of its size today. It keeps
706
+ // (1 - self_pruning) - age of its length as a dead stub, and once that no longer clears the bark it has
707
+ // been grown over, leaving a scar.
708
+ if (rule.crown_envelope && !job.is_split_fork && planned_child_count > 1) {
709
+ const persistence = 1.0 - species.branches[rule.target].self_pruning;
710
+ let t_node = t_lo;
711
+ for (let c = -1; ; c--) {
712
+ const t_dead = lerp(t_lo, t_hi, rule_node_u(rule, c, planned_child_count, level === 0));
713
+ // past the stem's base, or a layout of a single node (one pair, one whorl) that has no 'below'
714
+ if (t_dead <= 0.0 || t_dead > t_node) break;
715
+ t_node = t_dead;
716
+ const age = (t_lo - t_dead) / t_lo;
717
+ const phi_c = base_phi + rule_node_phi(rule, c) + (rng() * 2.0 - 1.0) * rule.azimuth_jitter;
718
+ scheduled_children.push({ t_attach: t_dead, phi: phi_c, rule, age, retained: persistence - age });
719
+ }
720
+ }
721
+ }
722
+
723
+ const k_symp = lvl_cfg.nodal_kink_strength ?? 0.45;
724
+ const zig_base = lvl_cfg.internode_zigzag ?? 0.06;
725
+ const tip_up = lvl_cfg.tip_upcurl ?? 0.18;
726
+
727
+ // Horizontal emergence direction of this branch for outward radial consistency near the trunk centerline
728
+ const emerge_horiz_len = Math.hypot(job.tx, job.tz);
729
+ const emerge_hx = emerge_horiz_len > 1e-4 ? job.tx / emerge_horiz_len : cur_rx;
730
+ const emerge_hz = emerge_horiz_len > 1e-4 ? job.tz / emerge_horiz_len : cur_rz;
731
+
732
+ // heading that straightness pulls back towards: the bud's, re-aimed by a split for the fork that continues
733
+ let aim_x = job.tx;
734
+ let aim_y = job.ty;
735
+ let aim_z = job.tz;
736
+
737
+ for (let s = job.start_seg + 1; s <= N_seg; s++) {
738
+ const t_prev = (s - 1) / N_seg;
739
+ const t_curr = s / N_seg;
740
+ const t_shape = lerp(job.cum_t0, job.cum_t1, t_curr);
741
+
742
+ // 1. Intrinsic S-curve pitch curvature (zero-mean higher harmonic on trunk so trunk weaves rather than leaning)
743
+ let s_wave = level === 0
744
+ ? (lvl_cfg.curvature * Math.sin(PI2 * 1.5 * t_shape + phase_hash * PI2))
745
+ : (lvl_cfg.curve_back !== 0.0
746
+ ? (lvl_cfg.curvature * Math.cos(Math.PI * t_shape) + lvl_cfg.curve_back * Math.sin(PI2 * t_shape))
747
+ : lvl_cfg.curvature);
748
+ // Attenuate negative (inward-toward-parent) pitch curvature on steep upper-crown insertions
749
+ // so upper lateral branches never curve backward across the parent stem axis.
750
+ if (level >= 1 && s_wave < 0.0 && job.parent_attach_t > 0.60) {
751
+ s_wave *= clamp(1.0 - (job.parent_attach_t - 0.60) * 2.2, 0.15, 1.0);
752
+ }
753
+ const d_pitch = s_wave / Math.max(2, N_shape * 0.65);
754
+
755
+ if (Math.abs(d_pitch) > 1e-6) {
756
+ rotate_around_axis(rot_scratch, cur_tx, cur_ty, cur_tz, cur_sx, cur_sy, cur_sz, d_pitch);
757
+ cur_tx = rot_scratch[0];
758
+ cur_ty = rot_scratch[1];
759
+ cur_tz = rot_scratch[2];
760
+ rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, cur_sx, cur_sy, cur_sz, d_pitch);
761
+ cur_rx = rot_scratch[0];
762
+ cur_ry = rot_scratch[1];
763
+ cur_rz = rot_scratch[2];
764
+ }
765
+
766
+ // 2. Helical spiral twist around T
767
+ if (Math.abs(lvl_cfg.spiral_twist) > 1e-6) {
768
+ const d_twist = lvl_cfg.spiral_twist / N_shape;
769
+ rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, cur_tx, cur_ty, cur_tz, d_twist);
770
+ cur_rx = rot_scratch[0];
771
+ cur_ry = rot_scratch[1];
772
+ cur_rz = rot_scratch[2];
773
+ cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
774
+ cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
775
+ cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
776
+ }
777
+
778
+ // 2b. Sympodial Nodal Kinking at scheduled lateral child emissions + Internodal Zig-Zag
779
+ let kink_rx = 0.0;
780
+ let kink_ry = 0.0;
781
+ let kink_rz = 0.0;
782
+
783
+ if (k_symp > 0.0) {
784
+ for (let c = 0; c < scheduled_children.length; c++) {
785
+ const sc = scheduled_children[c];
786
+ if (sc.rule.parent_kink > 0.0 && sc.t_attach >= t_prev && sc.t_attach <= t_curr) {
787
+ // Recoil away from child branch emission azimuth phi
788
+ const c_phi = Math.cos(sc.phi);
789
+ const s_phi = Math.sin(sc.phi);
790
+ const em_x = c_phi * cur_rx + s_phi * cur_sx;
791
+ const em_y = c_phi * cur_ry + s_phi * cur_sy;
792
+ const em_z = c_phi * cur_rz + s_phi * cur_sz;
793
+ const apical_boost = sc.t_attach > 0.85 ? 1.35 : 1.0;
794
+ const recoil = k_symp * sc.rule.parent_kink * (level === 0 ? 0.34 : 0.48) * apical_boost * (0.75 + 0.5 * rng());
795
+ kink_rx -= em_x * recoil;
796
+ kink_ry -= em_y * recoil;
797
+ kink_rz -= em_z * recoil;
798
+ }
799
+ }
800
+ }
801
+
802
+ if (zig_base > 0.0) {
803
+ const z_sign = (s & 1) === 0 ? 1.0 : -1.0;
804
+ const z_phi = phase_hash * PI2 + s * 0.85;
805
+ const zx = Math.cos(z_phi) * cur_rx + Math.sin(z_phi) * cur_sx;
806
+ const zy = Math.cos(z_phi) * cur_ry + Math.sin(z_phi) * cur_sy;
807
+ const zz = Math.cos(z_phi) * cur_rz + Math.sin(z_phi) * cur_sz;
808
+ const z_amp = zig_base * z_sign * (0.7 + 0.6 * rng());
809
+ kink_rx += zx * z_amp;
810
+ kink_ry += zy * z_amp;
811
+ kink_rz += zz * z_amp;
812
+ }
813
+
814
+ const kink_mag = Math.hypot(kink_rx, kink_ry, kink_rz);
815
+ if (kink_mag > 1e-5) {
816
+ const kx = kink_rx / kink_mag;
817
+ const ky = kink_ry / kink_mag;
818
+ const kz = kink_rz / kink_mag;
819
+ // Bend axis = T x K
820
+ let bx = cur_ty * kz - cur_tz * ky;
821
+ let by = cur_tz * kx - cur_tx * kz;
822
+ let bz = cur_tx * ky - cur_ty * kx;
823
+ const b_len = Math.hypot(bx, by, bz);
824
+ if (b_len > 1e-6) {
825
+ bx /= b_len;
826
+ by /= b_len;
827
+ bz /= b_len;
828
+ const clamped_kink = Math.min(0.42, kink_mag);
829
+ rotate_around_axis(rot_scratch, cur_tx, cur_ty, cur_tz, bx, by, bz, clamped_kink);
830
+ cur_tx = rot_scratch[0];
831
+ cur_ty = rot_scratch[1];
832
+ cur_tz = rot_scratch[2];
833
+ rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, bx, by, bz, clamped_kink);
834
+ cur_rx = rot_scratch[0];
835
+ cur_ry = rot_scratch[1];
836
+ cur_rz = rot_scratch[2];
837
+ cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
838
+ cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
839
+ cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
840
+ }
841
+ }
842
+
843
+ // 3. Biomechanical Tropism steering (Gravitropic sag + Terminal Phototropic Up-Curl + Outward spread)
844
+ let steer_x = 0.0;
845
+ let steer_y = 0.0;
846
+ let steer_z = 0.0;
847
+
848
+ if (level === 0 && branch_id === 0) {
849
+ // Orthotropic upward striving & plumb-line righting reflex along guide curve (default vertical +Y)
850
+ evaluate_trunk_guide(SCRATCH_GUIDE_P0, SCRATCH_GUIDE_T, species.trunk_guide, t_prev, job.length);
851
+ evaluate_trunk_guide(SCRATCH_GUIDE_P1, SCRATCH_GUIDE_T, species.trunk_guide, t_curr, job.length);
852
+ const gtx = SCRATCH_GUIDE_T[0];
853
+ const gty = SCRATCH_GUIDE_T[1];
854
+ const gtz = SCRATCH_GUIDE_T[2];
855
+
856
+ const is_conifer = lvl_cfg.excurrent;
857
+ const apical_relax = (!is_conifer && (t_shape > 0.80 || job.has_split)) ? 0.55 : 1.0;
858
+ const righting = (1.65 + Math.max(0.0, -lvl_cfg.gravitropism) * 2.5 + Math.max(0.0, lvl_cfg.phototropism)) * apical_relax;
859
+ steer_x += gtx * righting;
860
+ steer_y += gty * righting;
861
+ steer_z += gtz * righting;
862
+
863
+ // Plumb-line centering force pulling lateral drift back toward the guide curve
864
+ const dx_g = cur_px - SCRATCH_GUIDE_P0[0];
865
+ const dy_g = cur_py - SCRATCH_GUIDE_P0[1];
866
+ const dz_g = cur_pz - SCRATCH_GUIDE_P0[2];
867
+ const dot_g = dx_g * gtx + dy_g * gty + dz_g * gtz;
868
+ const lat_x = dx_g - dot_g * gtx;
869
+ const lat_y = dy_g - dot_g * gty;
870
+ const lat_z = dz_g - dot_g * gtz;
871
+ const plumb_k = ((is_conifer ? 5.2 : 3.4) * apical_relax) / Math.max(1.0, job.length);
872
+ steer_x -= lat_x * plumb_k * N_seg * 0.5;
873
+ steer_y -= lat_y * plumb_k * N_seg * 0.5;
874
+ steer_z -= lat_z * plumb_k * N_seg * 0.5;
875
+ } else if (level === 0 && branch_id > 0) {
876
+ // Secondary bifurcated trunk leader (fork): ascend skyward while preserving fork divergence
877
+ steer_x += emerge_hx * 0.35;
878
+ steer_y += 1.25 + Math.max(0.0, lvl_cfg.phototropism);
879
+ steer_z += emerge_hz * 0.35;
880
+ } else {
881
+ if (lvl_cfg.gravitropism !== 0.0 || tip_up !== 0.0) {
882
+ // Continuous blend from cantilever mid-branch sag arch (sin(pi * t^0.75)) to
883
+ // pendulous weeping cascade (0.65 + 0.95 * t) based on gravitropism vs. tip_upcurl
884
+ const w_pendulous = level >= 2
885
+ ? clamp((lvl_cfg.gravitropism - 0.35 - 0.5 * Math.max(0.0, tip_up)) / 0.45, 0.0, 1.0)
886
+ : 0.0;
887
+ const arch_grav_env = Math.sin(Math.PI * Math.pow(t_shape, 0.75));
888
+ const weep_grav_env = 0.65 + 0.95 * t_shape;
889
+ const grav_env = lerp(arch_grav_env, weep_grav_env, w_pendulous);
890
+ const apical_grav_atten = level === 1 && job.parent_attach_t > 0.75 && w_pendulous < 0.1
891
+ ? clamp(1.0 - (job.parent_attach_t - 0.75) * 3.2, 0.15, 1.0)
892
+ : 1.0;
893
+ const up_env = t_shape * t_shape * (1.0 + 0.5 * Math.max(0.0, -cur_ty));
894
+ steer_y += -lvl_cfg.gravitropism * grav_env * apical_grav_atten + tip_up * up_env;
895
+ }
896
+
897
+ if (lvl_cfg.phototropism !== 0.0) {
898
+ const sky_mix = crown.sky_phototropism_mix;
899
+ const horiz_r = Math.sqrt(cur_px * cur_px + cur_pz * cur_pz);
900
+ let out_x = 0.0;
901
+ let out_z = 0.0;
902
+ if (horiz_r > 0.52) {
903
+ out_x = cur_px / horiz_r;
904
+ out_z = cur_pz / horiz_r;
905
+ } else if (horiz_r > 1e-4) {
906
+ const w_rad = horiz_r / 0.52;
907
+ const bx = lerp(emerge_hx, cur_px / horiz_r, w_rad);
908
+ const bz = lerp(emerge_hz, cur_pz / horiz_r, w_rad);
909
+ const bl = Math.hypot(bx, bz) || 1.0;
910
+ out_x = bx / bl;
911
+ out_z = bz / bl;
912
+ } else {
913
+ out_x = emerge_hx;
914
+ out_z = emerge_hz;
915
+ }
916
+
917
+ steer_x += lvl_cfg.phototropism * (1.0 - sky_mix) * out_x;
918
+ steer_y += lvl_cfg.phototropism * sky_mix;
919
+ steer_z += lvl_cfg.phototropism * (1.0 - sky_mix) * out_z;
920
+ }
921
+ }
922
+
923
+ // 4. 2-Octave 3D Curl Noise gnarl scaled properly by sqrt(6 / N_seg)
924
+ if (lvl_cfg.gnarl_strength > 0.0) {
925
+ const freq = lvl_cfg.gnarl_frequency;
926
+ curl_noise_3d(
927
+ SCRATCH_CURL,
928
+ cur_px * freq + noise_ox + level * 17.3,
929
+ cur_py * freq + noise_oy + level * 31.7,
930
+ cur_pz * freq + noise_oz + level * 47.1
931
+ );
932
+ const c1x = SCRATCH_CURL[0], c1y = SCRATCH_CURL[1], c1z = SCRATCH_CURL[2];
933
+ curl_noise_3d(
934
+ SCRATCH_CURL,
935
+ cur_px * freq * 2.15 + noise_ox + 53.1 + phase_hash * 29.3,
936
+ cur_py * freq * 2.15 + noise_oy + 79.3,
937
+ cur_pz * freq * 2.15 + noise_oz + 113.7
938
+ );
939
+ const cx_tot = 0.68 * c1x + 0.32 * SCRATCH_CURL[0];
940
+ const cy_tot = 0.68 * c1y + 0.32 * SCRATCH_CURL[1];
941
+ const cz_tot = 0.68 * c1z + 0.32 * SCRATCH_CURL[2];
942
+
943
+ const gnarl_scale = lvl_cfg.gnarl_strength * Math.sqrt(6.0 / Math.max(2, N_shape));
944
+ // Project curl vector perpendicular to T so it steers direction cleanly
945
+ const dot_ct = cx_tot * cur_tx + cy_tot * cur_ty + cz_tot * cur_tz;
946
+ steer_x += (cx_tot - dot_ct * cur_tx) * gnarl_scale * 2.2;
947
+ steer_y += (cy_tot - dot_ct * cur_ty) * gnarl_scale * 1.6;
948
+ steer_z += (cz_tot - dot_ct * cur_tz) * gnarl_scale * 2.2;
949
+ }
950
+
951
+ // 4b. A plagiotropic shoot is pulled towards the horizontal; straightness pulls back towards the bud's heading
952
+ if (level >= 1 && lvl_cfg.plagiotropism > 0.0) {
953
+ steer_y -= lvl_cfg.plagiotropism * cur_ty;
954
+ }
955
+ if (lvl_cfg.straightness > 0.0 && !(level === 0 && branch_id === 0)) {
956
+ steer_x += lvl_cfg.straightness * (aim_x - cur_tx);
957
+ steer_y += lvl_cfg.straightness * (aim_y - cur_ty);
958
+ steer_z += lvl_cfg.straightness * (aim_z - cur_tz);
959
+ }
960
+
961
+ // 5. Space colonization attraction steering (for branches in crown, level >= 1)
962
+ if (use_space_col && level >= 1 && job.in_crown && attr_grid !== null) {
963
+ let attr_vx = 0.0;
964
+ let attr_vy = 0.0;
965
+ let attr_vz = 0.0;
966
+ let attr_hits = 0;
967
+
968
+ attr_grid.forEachNear(cur_px, cur_py, cur_pz, (idx) => {
969
+ if (attr_alive[idx] === 0) return;
970
+ const ax = attr_positions[idx * 3] - cur_px;
971
+ const ay = attr_positions[idx * 3 + 1] - cur_py;
972
+ const az = attr_positions[idx * 3 + 2] - cur_pz;
973
+ const d2 = ax * ax + ay * ay + az * az;
974
+ if (d2 <= r_kill_sq) {
975
+ attr_alive[idx] = 0;
976
+ } else if (d2 <= r_influence_sq && d2 > 1e-8) {
977
+ const inv_d = 1.0 / Math.sqrt(d2);
978
+ attr_vx += ax * inv_d;
979
+ attr_vy += ay * inv_d;
980
+ attr_vz += az * inv_d;
981
+ attr_hits++;
982
+ }
983
+ });
984
+
985
+ if (attr_hits > 0) {
986
+ const attr_len = Math.sqrt(attr_vx * attr_vx + attr_vy * attr_vy + attr_vz * attr_vz);
987
+ if (attr_len > 1e-6) {
988
+ const w_sc = crown.space_colonization_weight / attr_len;
989
+ steer_x += attr_vx * w_sc;
990
+ steer_y += attr_vy * w_sc;
991
+ steer_z += attr_vz * w_sc;
992
+ }
993
+ }
994
+ }
995
+
996
+ // 6. Crown envelope soft containment for lateral branches (level >= 1)
997
+ let seg_len = step_len;
998
+ if (level >= 1 && job.in_crown && crown.prune_ratio > 0.0) {
999
+ const probe_x = cur_px + cur_tx * step_len;
1000
+ const probe_y = cur_py + cur_ty * step_len;
1001
+ const probe_z = cur_pz + cur_tz * step_len;
1002
+ const sdf = crown_envelope_sdf(probe_x, probe_y, probe_z, crown);
1003
+ if (sdf > 0.0) {
1004
+ // Steer radially inward toward trunk axis (only pulling vertically if outside vertical crown span)
1005
+ const crown_top_y = crown.base_height + crown.height;
1006
+ const to_cx = -probe_x;
1007
+ const to_cy = probe_y > crown_top_y
1008
+ ? crown_top_y - probe_y
1009
+ : (probe_y < crown.base_height ? crown.base_height - probe_y : 0.0);
1010
+ const to_cz = -probe_z;
1011
+ const to_c_len = Math.sqrt(to_cx * to_cx + to_cy * to_cy + to_cz * to_cz);
1012
+ if (to_c_len > 1e-5) {
1013
+ const pull = crown.prune_ratio * 0.45 / to_c_len;
1014
+ steer_x += to_cx * pull;
1015
+ steer_y += to_cy * pull;
1016
+ steer_z += to_cz * pull;
1017
+ }
1018
+ seg_len *= Math.max(0.35, 1.0 - crown.prune_ratio * 0.5);
1019
+ }
1020
+ }
1021
+
1022
+ // Compute target radius r_curr for this segment before BVH collision checks
1023
+ const t_spine = t_shape;
1024
+ const u_prof = prof_span > 1e-4
1025
+ ? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(t_spine)) / prof_span, 0.0, 1.0)
1026
+ : t_spine;
1027
+ const min_tip_frac = level === 0 ? 0.12 : (has_children ? 0.14 : 0.24);
1028
+ const apical_shoot_taper = level === 0
1029
+ ? (t_spine > 0.65 ? lerp(1.0, 0.11, Math.pow((t_spine - 0.65) / 0.35, 1.45)) : 1.0)
1030
+ : (has_children && t_curr > 0.80 ? lerp(1.0, 0.62, Math.pow((t_curr - 0.80) / 0.20, 1.35)) : 1.0);
1031
+ const r_curr = Math.max(
1032
+ level === 0 ? 0.0015 : 0.002,
1033
+ job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_prof, min_tip_frac) * apical_shoot_taper
1034
+ );
1035
+ const r_prev = out.node_read_radius(prev_v);
1036
+ const local_seg_idx = branch_edges.length;
1037
+ const parent_bA = job.parent_branch_id;
1038
+ const attach_seg_A = job.parent_attach_seg_idx ?? -1;
1039
+ const is_split_A = Boolean(job.is_split_fork);
1040
+
1041
+ // 6b. Soft BVH Repulsion Field (steers growing shoot smoothly around nearby existing branches)
1042
+ if ((level >= 1 || branch_id > 0) && bvh.size > 0) {
1043
+ const look_len = seg_len * 1.55;
1044
+ const look_x = cur_px + cur_tx * look_len;
1045
+ const look_y = cur_py + cur_ty * look_len;
1046
+ const look_z = cur_pz + cur_tz * look_len;
1047
+ const soft_margin = Math.max(0.08, Math.min(0.24, seg_len * 0.65));
1048
+
1049
+ query_capsule[0] = cur_px;
1050
+ query_capsule[1] = cur_py;
1051
+ query_capsule[2] = cur_pz;
1052
+ query_capsule[3] = look_x;
1053
+ query_capsule[4] = look_y;
1054
+ query_capsule[5] = look_z;
1055
+ query_capsule[6] = Math.max(r_prev, r_curr) * 1.15 + soft_margin;
1056
+
1057
+ const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
1058
+ for (let h = 0; h < hit_count; h++) {
1059
+ const eB = bvh_hits[h];
1060
+ const bB = seg_branch_id[eB];
1061
+ const local_idx_B = seg_local_idx[eB];
1062
+ if (!resolve_subsegment_bounds(
1063
+ branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
1064
+ bB, out.branch_parent[bB], branch_parent_seg_idx[bB], branch_is_split_fork[bB], local_idx_B,
1065
+ sub_bounds
1066
+ )) {
1067
+ continue;
1068
+ }
1069
+
1070
+ const s_min = sub_bounds[0];
1071
+ const t_min = sub_bounds[1];
1072
+ const sa0x = cur_px + (look_x - cur_px) * s_min;
1073
+ const sa0y = cur_py + (look_y - cur_py) * s_min;
1074
+ const sa0z = cur_pz + (look_z - cur_pz) * s_min;
1075
+
1076
+ const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
1077
+ const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
1078
+ const sb0x = b0x + (b1x - b0x) * t_min;
1079
+ const sb0y = b0y + (b1y - b0y) * t_min;
1080
+ const sb0z = b0z + (b1z - b0z) * t_min;
1081
+
1082
+ line3_compute_segment_segment_closest_points(
1083
+ closest_st,
1084
+ sa0x, sa0y, sa0z, look_x, look_y, look_z,
1085
+ sb0x, sb0y, sb0z, b1x, b1y, b1z
1086
+ );
1087
+
1088
+ const s_f = s_min + (1.0 - s_min) * closest_st[0];
1089
+ const t_f = t_min + (1.0 - t_min) * closest_st[1];
1090
+
1091
+ const qAx = cur_px + (look_x - cur_px) * s_f;
1092
+ const qAy = cur_py + (look_y - cur_py) * s_f;
1093
+ const qAz = cur_pz + (look_z - cur_pz) * s_f;
1094
+ const qBx = b0x + (b1x - b0x) * t_f;
1095
+ const qBy = b0y + (b1y - b0y) * t_f;
1096
+ const qBz = b0z + (b1z - b0z) * t_f;
1097
+
1098
+ const dx = qAx - qBx;
1099
+ const dy = qAy - qBy;
1100
+ const dz = qAz - qBz;
1101
+ const dist = Math.hypot(dx, dy, dz);
1102
+ const rA = r_prev + (r_curr - r_prev) * Math.min(1.0, s_f);
1103
+ const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
1104
+ const r_req = (rA + rB) * 1.12 + 0.005;
1105
+
1106
+ if (dist < r_req + soft_margin) {
1107
+ let nx = dist > 1e-5 ? dx / dist : cur_rx;
1108
+ let ny = dist > 1e-5 ? dy / dist : cur_ry;
1109
+ let nz = dist > 1e-5 ? dz / dist : cur_rz;
1110
+ // Project repulsion normal perpendicular to cur_T so it steers smoothly around the obstacle
1111
+ const dot_nt = nx * cur_tx + ny * cur_ty + nz * cur_tz;
1112
+ nx -= dot_nt * cur_tx;
1113
+ ny -= dot_nt * cur_ty;
1114
+ nz -= dot_nt * cur_tz;
1115
+ const n_len = Math.hypot(nx, ny, nz);
1116
+ if (n_len > 1e-5) {
1117
+ nx /= n_len;
1118
+ ny /= n_len;
1119
+ nz /= n_len;
1120
+ const u_prox = clamp(1.0 - Math.max(0.0, dist - r_req) / soft_margin, 0.0, 1.0);
1121
+ const rep_w = u_prox * u_prox * 2.8;
1122
+ steer_x += nx * rep_w;
1123
+ steer_y += ny * rep_w;
1124
+ steer_z += nz * rep_w;
1125
+ }
1126
+ }
1127
+ }
1128
+ }
1129
+
1130
+ // Apply steering to tangent and normalize
1131
+ const steer_div = Math.max(2.0, Math.sqrt(N_shape) * 1.35);
1132
+ let next_tx = cur_tx + steer_x / steer_div;
1133
+ let next_ty = cur_ty + steer_y / steer_div;
1134
+ let next_tz = cur_tz + steer_z / steer_div;
1135
+ const t_len = Math.sqrt(next_tx * next_tx + next_ty * next_ty + next_tz * next_tz);
1136
+ if (t_len > 1e-12) {
1137
+ next_tx /= t_len;
1138
+ next_ty /= t_len;
1139
+ next_tz /= t_len;
1140
+ } else {
1141
+ next_tx = cur_tx;
1142
+ next_ty = cur_ty;
1143
+ next_tz = cur_tz;
1144
+ }
1145
+
1146
+ let next_px = cur_px + 0.5 * (cur_tx + next_tx) * seg_len;
1147
+ let next_py = cur_py + 0.5 * (cur_ty + next_ty) * seg_len;
1148
+ let next_pz = cur_pz + 0.5 * (cur_tz + next_tz) * seg_len;
1149
+
1150
+ // Orthotropic plumb-tube containment on trunk (level === 0):
1151
+ // Preserves local 3D nodal kinks and serpentine sweep while guaranteeing the trunk never drifts sideways
1152
+ if (level === 0 && branch_id === 0) {
1153
+ const gx = SCRATCH_GUIDE_P1[0];
1154
+ const gy = SCRATCH_GUIDE_P1[1];
1155
+ const gz = SCRATCH_GUIDE_P1[2];
1156
+ const gtx = SCRATCH_GUIDE_T[0];
1157
+ const gty = SCRATCH_GUIDE_T[1];
1158
+ const gtz = SCRATCH_GUIDE_T[2];
1159
+
1160
+ const dx = next_px - gx;
1161
+ const dy = next_py - gy;
1162
+ const dz = next_pz - gz;
1163
+ const dot_g = dx * gtx + dy * gty + dz * gtz;
1164
+ const off_x = dx - dot_g * gtx;
1165
+ const off_y = dy - dot_g * gty;
1166
+ const off_z = dz - dot_g * gtz;
1167
+ const off_r = Math.hypot(off_x, off_y, off_z);
1168
+
1169
+ const is_conifer = lvl_cfg.excurrent;
1170
+ const max_drift_frac = is_conifer ? 0.032 : (job.has_split ? 0.078 : 0.058);
1171
+ // Envelope rises from 0 at root, peaks in mid-trunk (allowing 3D sweep/crookedness), and tapers near tip
1172
+ const env = Math.sin(Math.PI * Math.min(0.92, t_curr * 0.88)) * (1.0 - 0.38 * t_curr * t_curr);
1173
+ const max_r = job.length * max_drift_frac * Math.max(job.has_split ? 0.42 : 0.18, env);
1174
+
1175
+ if (off_r > max_r && off_r > 1e-6) {
1176
+ const scale_r = max_r / off_r;
1177
+ next_px = gx + dot_g * gtx + off_x * scale_r;
1178
+ next_py = gy + dot_g * gty + off_y * scale_r;
1179
+ next_pz = gz + dot_g * gtz + off_z * scale_r;
1180
+
1181
+ let ch_x = next_px - cur_px;
1182
+ let ch_y = next_py - cur_py;
1183
+ let ch_z = next_pz - cur_pz;
1184
+ const ch_l = Math.hypot(ch_x, ch_y, ch_z);
1185
+ if (ch_l > 1e-6) {
1186
+ next_tx = ch_x / ch_l;
1187
+ next_ty = ch_y / ch_l;
1188
+ next_tz = ch_z / ch_l;
1189
+ }
1190
+ }
1191
+ }
1192
+
1193
+ // 6c. Monotonic Parent Collar Escape + Hard BVH Capsule Contact Projection & Self-Pruning
1194
+ if ((level >= 1 || branch_id > 0) && bvh.size > 0) {
1195
+ let was_projected = false;
1196
+
1197
+ // Ensure lateral child branch exits its parent attachment segment cleanly on local_seg_idx <= 1
1198
+ if (job.parent_edge_id >= 0 && !is_split_A && local_seg_idx <= 1) {
1199
+ const eP = job.parent_edge_id;
1200
+ const p0x = seg_p0x[eP], p0y = seg_p0y[eP], p0z = seg_p0z[eP];
1201
+ const p1x = seg_p1x[eP], p1y = seg_p1y[eP], p1z = seg_p1z[eP];
1202
+
1203
+ line3_compute_segment_segment_closest_points(
1204
+ closest_st,
1205
+ next_px, next_py, next_pz, next_px, next_py, next_pz,
1206
+ p0x, p0y, p0z, p1x, p1y, p1z
1207
+ );
1208
+ const t_p = closest_st[1];
1209
+ const qPx = p0x + (p1x - p0x) * t_p;
1210
+ const qPy = p0y + (p1y - p0y) * t_p;
1211
+ const qPz = p0z + (p1z - p0z) * t_p;
1212
+ const r_p = seg_r0[eP] + (seg_r1[eP] - seg_r0[eP]) * t_p;
1213
+
1214
+ let rx_p = next_px - qPx;
1215
+ let ry_p = next_py - qPy;
1216
+ let rz_p = next_pz - qPz;
1217
+ const d_p = Math.hypot(rx_p, ry_p, rz_p);
1218
+ if (local_seg_idx === 0 && (r_p + r_curr) * 1.18 > seg_len) {
1219
+ seg_len = (r_p + r_curr) * 1.18;
1220
+ }
1221
+ const min_d_p = local_seg_idx === 0
1222
+ ? Math.min(seg_len * 0.88, (r_p + r_curr) * 1.05)
1223
+ : (r_p + r_curr) * 1.10 + 0.004;
1224
+
1225
+ const em_drx = job.emerge_drx ?? cur_rx;
1226
+ const em_dry = job.emerge_dry ?? cur_ry;
1227
+ const em_drz = job.emerge_drz ?? cur_rz;
1228
+ const dot_em = rx_p * em_drx + ry_p * em_dry + rz_p * em_drz;
1229
+
1230
+ if (d_p < min_d_p || dot_em < 0.0) {
1231
+ const ux_p = (d_p > 1e-5 && dot_em > 0.0) ? rx_p / d_p : em_drx;
1232
+ const uy_p = (d_p > 1e-5 && dot_em > 0.0) ? ry_p / d_p : em_dry;
1233
+ const uz_p = (d_p > 1e-5 && dot_em > 0.0) ? rz_p / d_p : em_drz;
1234
+ const push_d = Math.max(0.0, min_d_p - (dot_em > 0.0 ? d_p : -d_p));
1235
+ next_px += ux_p * push_d;
1236
+ next_py += uy_p * push_d;
1237
+ next_pz += uz_p * push_d;
1238
+
1239
+ let ch_x = next_px - cur_px;
1240
+ let ch_y = next_py - cur_py;
1241
+ let ch_z = next_pz - cur_pz;
1242
+ const ch_l = Math.hypot(ch_x, ch_y, ch_z);
1243
+ if (ch_l > 1e-6) {
1244
+ next_tx = ch_x / ch_l;
1245
+ next_ty = ch_y / ch_l;
1246
+ next_tz = ch_z / ch_l;
1247
+ next_px = cur_px + next_tx * seg_len;
1248
+ next_py = cur_py + next_ty * seg_len;
1249
+ next_pz = cur_pz + next_tz * seg_len;
1250
+ was_projected = true;
1251
+ }
1252
+ }
1253
+ }
1254
+
1255
+ // Iterative BVH capsule contact projection
1256
+ for (let iter = 0; iter < 4; iter++) {
1257
+ query_capsule[0] = cur_px;
1258
+ query_capsule[1] = cur_py;
1259
+ query_capsule[2] = cur_pz;
1260
+ query_capsule[3] = next_px;
1261
+ query_capsule[4] = next_py;
1262
+ query_capsule[5] = next_pz;
1263
+ query_capsule[6] = Math.max(r_prev, r_curr) * 1.15 + 0.025;
1264
+
1265
+ const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
1266
+ let moved = false;
1267
+
1268
+ for (let h = 0; h < hit_count; h++) {
1269
+ const eB = bvh_hits[h];
1270
+ const bB = seg_branch_id[eB];
1271
+ const local_idx_B = seg_local_idx[eB];
1272
+ if (!resolve_subsegment_bounds(
1273
+ branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
1274
+ bB, out.branch_parent[bB], branch_parent_seg_idx[bB], branch_is_split_fork[bB], local_idx_B,
1275
+ sub_bounds
1276
+ )) {
1277
+ continue;
1278
+ }
1279
+
1280
+ const s_min = sub_bounds[0];
1281
+ const t_min = sub_bounds[1];
1282
+ const sa0x = cur_px + (next_px - cur_px) * s_min;
1283
+ const sa0y = cur_py + (next_py - cur_py) * s_min;
1284
+ const sa0z = cur_pz + (next_pz - cur_pz) * s_min;
1285
+
1286
+ const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
1287
+ const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
1288
+ const sb0x = b0x + (b1x - b0x) * t_min;
1289
+ const sb0y = b0y + (b1y - b0y) * t_min;
1290
+ const sb0z = b0z + (b1z - b0z) * t_min;
1291
+
1292
+ line3_compute_segment_segment_closest_points(
1293
+ closest_st,
1294
+ sa0x, sa0y, sa0z, next_px, next_py, next_pz,
1295
+ sb0x, sb0y, sb0z, b1x, b1y, b1z
1296
+ );
1297
+
1298
+ const s_f = s_min + (1.0 - s_min) * closest_st[0];
1299
+ const t_f = t_min + (1.0 - t_min) * closest_st[1];
1300
+ if (local_seg_idx === 0 && s_f <= 0.05) continue;
1301
+
1302
+ const qAx = cur_px + (next_px - cur_px) * s_f;
1303
+ const qAy = cur_py + (next_py - cur_py) * s_f;
1304
+ const qAz = cur_pz + (next_pz - cur_pz) * s_f;
1305
+ const qBx = b0x + (b1x - b0x) * t_f;
1306
+ const qBy = b0y + (b1y - b0y) * t_f;
1307
+ const qBz = b0z + (b1z - b0z) * t_f;
1308
+
1309
+ const dx = qAx - qBx;
1310
+ const dy = qAy - qBy;
1311
+ const dz = qAz - qBz;
1312
+ const dist = Math.hypot(dx, dy, dz);
1313
+ const rA = r_prev + (r_curr - r_prev) * s_f;
1314
+ const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
1315
+ const r_req = (rA + rB) * 1.08 + 0.004;
1316
+
1317
+ if (dist < r_req) {
1318
+ let nx = dist > 1e-5 ? dx / dist : cur_rx;
1319
+ let ny = dist > 1e-5 ? dy / dist : cur_ry;
1320
+ let nz = dist > 1e-5 ? dz / dist : cur_rz;
1321
+ const push = (r_req - dist + 0.004) / Math.max(0.35, s_f);
1322
+ next_px += nx * push;
1323
+ next_py += ny * push;
1324
+ next_pz += nz * push;
1325
+
1326
+ let ch_x = next_px - cur_px;
1327
+ let ch_y = next_py - cur_py;
1328
+ let ch_z = next_pz - cur_pz;
1329
+ const ch_l = Math.hypot(ch_x, ch_y, ch_z);
1330
+ if (ch_l > 1e-6) {
1331
+ next_tx = ch_x / ch_l;
1332
+ next_ty = ch_y / ch_l;
1333
+ next_tz = ch_z / ch_l;
1334
+ next_px = cur_px + next_tx * seg_len;
1335
+ next_py = cur_py + next_ty * seg_len;
1336
+ next_pz = cur_pz + next_tz * seg_len;
1337
+ moved = true;
1338
+ was_projected = true;
1339
+ }
1340
+ }
1341
+ }
1342
+ if (!moved) break;
1343
+ }
1344
+
1345
+ // If segment >= 1 still penetrates an existing branch or was forced into an unnatural sharp reversal,
1346
+ // self-prune / arrest the branch at prev_v so it never spears through another bough.
1347
+ if (local_seg_idx >= 1) {
1348
+ const final_clear = evaluate_candidate_clearance(
1349
+ branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
1350
+ cur_px, cur_py, cur_pz, r_prev,
1351
+ next_px, next_py, next_pz, r_curr,
1352
+ -0.004
1353
+ );
1354
+ const turn_cos = cur_tx * next_tx + cur_ty * next_ty + cur_tz * next_tz;
1355
+ if (final_clear < 0.0 || (was_projected && turn_cos < 0.25)) {
1356
+ break;
1357
+ }
1358
+ } else if (was_projected) {
1359
+ // Keep root node tangent aligned with projected first segment so base collar has zero S-hook
1360
+ cur_tx = next_tx;
1361
+ cur_ty = next_ty;
1362
+ cur_tz = next_tz;
1363
+ out.node_write_tangent(prev_v, cur_tx, cur_ty, cur_tz);
1364
+ }
1365
+ }
1366
+
1367
+ // Structural surface root: creep along the ground plane y = 0 while sinking into it, its centreline at
1368
+ // r(t) - 2 r_base t: it leaves the stem fully exposed and its top drops by twice its base radius over
1369
+ // its length, so it dissolves into the soil about halfway out and its tip is never seen. Applied after all
1370
+ // steering and contact handling so nothing lifts it off or pushes it under; the first segment keeps
1371
+ // the bud's heading so the root leaves the stem where it was planted (e.g. on a flare lobe crest).
1372
+ if (lvl_cfg.root) {
1373
+ let hx = local_seg_idx === 0 ? emerge_hx : next_px - cur_px;
1374
+ let hz = local_seg_idx === 0 ? emerge_hz : next_pz - cur_pz;
1375
+ let h_len = Math.hypot(hx, hz);
1376
+ if (h_len < 1e-6) {
1377
+ hx = emerge_hx;
1378
+ hz = emerge_hz;
1379
+ h_len = Math.hypot(hx, hz) || 1.0;
1380
+ }
1381
+ hx /= h_len;
1382
+ hz /= h_len;
1383
+ const dy = clamp(r_curr - 2.0 * job.base_radius * t_curr - cur_py, -0.7 * seg_len, 0.7 * seg_len);
1384
+ const h_step = Math.sqrt(seg_len * seg_len - dy * dy);
1385
+ next_px = cur_px + hx * h_step;
1386
+ next_py = cur_py + dy;
1387
+ next_pz = cur_pz + hz * h_step;
1388
+ // arrive following the sinking profile, whose slope along the root is -(2 + taper) r_base / length
1389
+ const sink_slope = -(2.0 + lvl_cfg.taper) * job.base_radius / Math.max(1e-3, job.length);
1390
+ const t_norm_len = Math.hypot(1.0, sink_slope);
1391
+ next_tx = hx / t_norm_len;
1392
+ next_ty = sink_slope / t_norm_len;
1393
+ next_tz = hz / t_norm_len;
1394
+ if (local_seg_idx === 0) {
1395
+ // the root node leaves along its first chord, as a projected collar escape would
1396
+ cur_tx = (next_px - cur_px) / seg_len;
1397
+ cur_ty = (next_py - cur_py) / seg_len;
1398
+ cur_tz = (next_pz - cur_pz) / seg_len;
1399
+ out.node_write_tangent(prev_v, cur_tx, cur_ty, cur_tz);
1400
+ }
1401
+ }
1402
+
1403
+ // Transport RMF via Wang et al. Double Reflection
1404
+ spine_frame_double_reflection(
1405
+ SCRATCH_RMF, 0,
1406
+ cur_px, cur_py, cur_pz,
1407
+ cur_tx, cur_ty, cur_tz,
1408
+ cur_rx, cur_ry, cur_rz,
1409
+ next_px, next_py, next_pz,
1410
+ next_tx, next_ty, next_tz
1411
+ );
1412
+ let next_rx = SCRATCH_RMF[0];
1413
+ let next_ry = SCRATCH_RMF[1];
1414
+ let next_rz = SCRATCH_RMF[2];
1415
+ cur_sx = SCRATCH_RMF[3];
1416
+ cur_sy = SCRATCH_RMF[4];
1417
+ cur_sz = SCRATCH_RMF[5];
1418
+
1419
+ cur_arc_s += seg_len;
1420
+
1421
+ const curr_v = out.add_node(
1422
+ next_px, next_py, next_pz,
1423
+ next_tx, next_ty, next_tz,
1424
+ next_rx, next_ry, next_rz,
1425
+ r_curr,
1426
+ branch_id,
1427
+ level,
1428
+ job.parent_branch_id,
1429
+ t_curr,
1430
+ cur_arc_s,
1431
+ phase_hash
1432
+ );
1433
+
1434
+ const edge_id = out.add_segment(
1435
+ prev_v,
1436
+ curr_v,
1437
+ cur_tx * seg_len,
1438
+ cur_ty * seg_len,
1439
+ cur_tz * seg_len,
1440
+ next_tx * seg_len,
1441
+ next_ty * seg_len,
1442
+ next_tz * seg_len,
1443
+ seg_len,
1444
+ t_prev === 0.0 ? job.parent_attach_t : t_prev
1445
+ );
1446
+
1447
+ // Register segment in scope-local BVH
1448
+ const bvh_pad = Math.max(r_prev, r_curr) * 1.25 + 0.008;
1449
+ const bvh_leaf = bvh.allocate_node();
1450
+ bvh.node_set_user_data(bvh_leaf, edge_id);
1451
+ bvh.node_set_aabb_primitive(
1452
+ bvh_leaf,
1453
+ Math.min(cur_px, next_px) - bvh_pad,
1454
+ Math.min(cur_py, next_py) - bvh_pad,
1455
+ Math.min(cur_pz, next_pz) - bvh_pad,
1456
+ Math.max(cur_px, next_px) + bvh_pad,
1457
+ Math.max(cur_py, next_py) + bvh_pad,
1458
+ Math.max(cur_pz, next_pz) + bvh_pad
1459
+ );
1460
+ bvh.insert_leaf(bvh_leaf);
1461
+
1462
+ seg_branch_id[edge_id] = branch_id;
1463
+ seg_local_idx[edge_id] = local_seg_idx;
1464
+ seg_p0x[edge_id] = cur_px;
1465
+ seg_p0y[edge_id] = cur_py;
1466
+ seg_p0z[edge_id] = cur_pz;
1467
+ seg_r0[edge_id] = r_prev;
1468
+ seg_p1x[edge_id] = next_px;
1469
+ seg_p1y[edge_id] = next_py;
1470
+ seg_p1z[edge_id] = next_pz;
1471
+ seg_r1[edge_id] = r_curr;
1472
+ seg_bvh_leaf[edge_id] = bvh_leaf;
1473
+
1474
+ branch_edges.push(edge_id);
1475
+ branch_edge_t0.push(t_prev);
1476
+ branch_edge_t1.push(t_curr);
1477
+ branch_vertices.push(curr_v);
1478
+
1479
+ out.branch_tip_vertex[branch_id] = curr_v;
1480
+ out.branch_length[branch_id] = cur_arc_s - job.initial_arc_s;
1481
+
1482
+ // Check for dichotomous / sympodial splitting at interior segments (only when stem is structurally thick enough)
1483
+ const min_split_seg = level === 0
1484
+ ? Math.max(2, Math.floor(N_seg * 0.5))
1485
+ : Math.max(1, Math.floor(N_seg * 0.25));
1486
+ if (
1487
+ !job.has_split
1488
+ && !job.dead
1489
+ && lvl_cfg.split_probability > 0.0
1490
+ && r_curr >= 0.012
1491
+ && s >= min_split_seg
1492
+ && s <= Math.floor(N_seg * 0.75)
1493
+ && rng() < lvl_cfg.split_probability
1494
+ ) {
1495
+ job.has_split = true;
1496
+ const fork_count = Math.max(2, lvl_cfg.split_count | 0);
1497
+ const split_ang = lvl_cfg.split_angle;
1498
+ let base_az = rng() * PI2;
1499
+
1500
+ // Preserve pre-split orthonormal triad (T, R, S) before deflecting fork 0
1501
+ const pre_tx = next_tx, pre_ty = next_ty, pre_tz = next_tz;
1502
+ const pre_rx = next_rx, pre_ry = next_ry, pre_rz = next_rz;
1503
+ const pre_sx = cur_sx, pre_sy = cur_sy, pre_sz = cur_sz;
1504
+
1505
+ // On lateral branches (level >= 1), align the split bend axis toward local vertical (+Y)
1506
+ // so the two daughter forks spread horizontally in the canopy rather than pitching into neighbor boughs.
1507
+ if (level >= 1) {
1508
+ const up_az = Math.atan2(pre_sy, pre_ry);
1509
+ const side_sign = base_az < Math.PI ? 1.0 : -1.0;
1510
+ base_az = up_az + (side_sign < 0.0 ? Math.PI : 0.0) + ((base_az % Math.PI) / Math.PI - 0.5) * 0.45;
1511
+ }
1512
+
1513
+ // Current branch deflects as fork 0: rotate both T and R around bend_axis so R remains orthogonal to T
1514
+ const fork0_deflect = level === 0 ? split_ang * 0.22 : split_ang * 0.5;
1515
+ const bend_axis_x = Math.cos(base_az) * pre_rx + Math.sin(base_az) * pre_sx;
1516
+ const bend_axis_y = Math.cos(base_az) * pre_ry + Math.sin(base_az) * pre_sy;
1517
+ const bend_axis_z = Math.cos(base_az) * pre_rz + Math.sin(base_az) * pre_sz;
1518
+ rotate_around_axis(
1519
+ rot_scratch,
1520
+ pre_tx, pre_ty, pre_tz,
1521
+ bend_axis_x, bend_axis_y, bend_axis_z,
1522
+ fork0_deflect
1523
+ );
1524
+ next_tx = rot_scratch[0];
1525
+ next_ty = rot_scratch[1];
1526
+ next_tz = rot_scratch[2];
1527
+ // fork 0 is aimed where it was deflected to, as the other forks are aimed along their own headings
1528
+ aim_x = next_tx;
1529
+ aim_y = next_ty;
1530
+ aim_z = next_tz;
1531
+
1532
+ rotate_around_axis(
1533
+ rot_scratch,
1534
+ pre_rx, pre_ry, pre_rz,
1535
+ bend_axis_x, bend_axis_y, bend_axis_z,
1536
+ fork0_deflect
1537
+ );
1538
+ next_rx = rot_scratch[0];
1539
+ next_ry = rot_scratch[1];
1540
+ next_rz = rot_scratch[2];
1541
+
1542
+ cur_sx = next_ty * next_rz - next_tz * next_ry;
1543
+ cur_sy = next_tz * next_rx - next_tx * next_rz;
1544
+ cur_sz = next_tx * next_ry - next_ty * next_rx;
1545
+
1546
+ // Spawn fork 1..fork_count-1 as continuation branches with their own root vertex connected to curr_v
1547
+ const rem_segs = Math.max(1, N_seg - s);
1548
+ const rem_fraction = Math.max(0.15, rem_segs / Math.max(1, N_seg));
1549
+ const fork_cum_t0 = lerp(job.cum_t0 ?? 0.0, job.cum_t1 ?? 1.0, t_curr);
1550
+ const fork_cum_t1 = job.cum_t1 ?? 1.0;
1551
+ const fork_len = Math.max(0.15, job.length * rem_fraction);
1552
+ const fork_r0 = r_curr * 0.78;
1553
+ const fork_step = fork_len / rem_segs;
1554
+
1555
+ for (let f = 1; f < fork_count; f++) {
1556
+ const f_az = base_az + (f * PI2) / fork_count;
1557
+ const fax = Math.cos(f_az) * pre_rx + Math.sin(f_az) * pre_sx;
1558
+ const fay = Math.cos(f_az) * pre_ry + Math.sin(f_az) * pre_sy;
1559
+ const faz = Math.cos(f_az) * pre_rz + Math.sin(f_az) * pre_sz;
1560
+
1561
+ const f_tan = [0, 0, 0];
1562
+ rotate_around_axis(f_tan, pre_tx, pre_ty, pre_tz, fax, fay, faz, split_ang * 0.65);
1563
+
1564
+ // Verify fork emergence clearance against BVH (and prevent inward-toward-trunk forks on lateral boughs)
1565
+ if (level >= 1) {
1566
+ const r_horiz_here = Math.hypot(next_px, next_pz);
1567
+ if (r_horiz_here > 0.35 && (next_px * f_tan[0] + next_pz * f_tan[2]) < -0.10 * r_horiz_here) {
1568
+ continue;
1569
+ }
1570
+ const f_clear = evaluate_candidate_clearance(
1571
+ -1, branch_id, local_seg_idx, true, 0,
1572
+ next_px, next_py, next_pz, fork_r0,
1573
+ next_px + f_tan[0] * fork_step,
1574
+ next_py + f_tan[1] * fork_step,
1575
+ next_pz + f_tan[2] * fork_step,
1576
+ fork_r0 * 0.85,
1577
+ 0.002
1578
+ );
1579
+ if (f_clear < -0.002) {
1580
+ continue;
1581
+ }
1582
+ }
1583
+
1584
+ const f_r = [0, 0, 0];
1585
+ rotate_around_axis(f_r, pre_rx, pre_ry, pre_rz, fax, fay, faz, split_ang * 0.65);
1586
+
1587
+ queue.push({
1588
+ level,
1589
+ generator,
1590
+ in_crown: job.in_crown,
1591
+ parent_branch_id: branch_id,
1592
+ parent_edge_id: edge_id,
1593
+ parent_attach_seg_idx: local_seg_idx,
1594
+ parent_attach_t: t_curr,
1595
+ attach_parent_vertex: curr_v,
1596
+ start_vertex: -1,
1597
+ px: next_px,
1598
+ py: next_py,
1599
+ pz: next_pz,
1600
+ tx: f_tan[0],
1601
+ ty: f_tan[1],
1602
+ tz: f_tan[2],
1603
+ rx: f_r[0],
1604
+ ry: f_r[1],
1605
+ rz: f_r[2],
1606
+ emerge_drx: fax,
1607
+ emerge_dry: fay,
1608
+ emerge_drz: faz,
1609
+ length: fork_len,
1610
+ full_branch_length: job.full_branch_length ?? job.length,
1611
+ base_radius: fork_r0,
1612
+ start_seg: 0,
1613
+ total_segs: rem_segs,
1614
+ shape_segs: rem_segs,
1615
+ initial_arc_s: cur_arc_s,
1616
+ has_split: true,
1617
+ is_split_fork: true,
1618
+ child_span_fraction: rem_fraction,
1619
+ cum_t0: fork_cum_t0,
1620
+ cum_t1: fork_cum_t1
1621
+ });
1622
+ }
1623
+ }
1624
+
1625
+ cur_px = next_px;
1626
+ cur_py = next_py;
1627
+ cur_pz = next_pz;
1628
+ cur_tx = next_tx;
1629
+ cur_ty = next_ty;
1630
+ cur_tz = next_tz;
1631
+ cur_rx = next_rx;
1632
+ cur_ry = next_ry;
1633
+ cur_rz = next_rz;
1634
+ prev_v = curr_v;
1635
+ }
1636
+
1637
+ // If the branch was self-pruned early on contact (actual_segs < remaining_segs), renormalize
1638
+ // t_norm and taper radii across the surviving vertices [0..actual_segs] so its tip terminates cleanly at t_norm = 1.0
1639
+ const actual_segs = branch_edges.length;
1640
+ if (actual_segs > 0 && actual_segs < remaining_segs) {
1641
+ const s_param = /** @type {Float32Array} */ (out.attr_node_spine_param.data);
1642
+ for (let i = 0; i < actual_segs; i++) {
1643
+ const tn0 = i / actual_segs;
1644
+ const tn1 = (i + 1) / actual_segs;
1645
+ branch_edge_t0[i] = tn0;
1646
+ branch_edge_t1[i] = tn1;
1647
+
1648
+ const v_curr = branch_vertices[i + 1];
1649
+ s_param[v_curr * 3] = tn1;
1650
+
1651
+ const u_p = prof_span > 1e-4
1652
+ ? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(lerp(job.cum_t0, job.cum_t1, tn1))) / prof_span, 0.0, 1.0)
1653
+ : tn1;
1654
+ const min_tf = has_children ? 0.14 : 0.24;
1655
+ const ap_taper = has_children && tn1 > 0.80
1656
+ ? lerp(1.0, 0.62, Math.pow((tn1 - 0.80) / 0.20, 1.35))
1657
+ : 1.0;
1658
+ const r_new = Math.max(
1659
+ 0.002,
1660
+ job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_p, min_tf) * ap_taper
1661
+ );
1662
+ out.node_write_radius(v_curr, r_new);
1663
+
1664
+ const e_curr = branch_edges[i];
1665
+ seg_r1[e_curr] = r_new;
1666
+ if (i + 1 < actual_segs) {
1667
+ seg_r0[branch_edges[i + 1]] = r_new;
1668
+ }
1669
+ }
1670
+ }
1671
+
1672
+ // Smooth or preserve crisp interior Hermite tangents across consecutive edges of this branch
1673
+ // (preserving branch_edges[0]'s m0 so continuation forks keep their exact fork departure tangent)
1674
+ if (branch_edges.length >= 2) {
1675
+ const kink_sharp = clamp(lvl_cfg.kink_sharpness ?? 0.5, 0.0, 0.92);
1676
+ for (let k = 1; k < branch_edges.length; k++) {
1677
+ const e_prev = branch_edges[k - 1];
1678
+ const e_next = branch_edges[k];
1679
+ const v_mid = branch_vertices[k];
1680
+ const l_prev = Math.max(1e-5, out.segment_length(e_prev));
1681
+ const l_next = Math.max(1e-5, out.segment_length(e_next));
1682
+
1683
+ out.segment_read_m1(SCRATCH_M_PREV, 0, e_prev);
1684
+ out.segment_read_m0(SCRATCH_M_NEXT, 0, e_next);
1685
+
1686
+ const t_in_x = SCRATCH_M_PREV[0] / l_prev;
1687
+ const t_in_y = SCRATCH_M_PREV[1] / l_prev;
1688
+ const t_in_z = SCRATCH_M_PREV[2] / l_prev;
1689
+ const t_out_x = SCRATCH_M_NEXT[0] / l_next;
1690
+ const t_out_y = SCRATCH_M_NEXT[1] / l_next;
1691
+ const t_out_z = SCRATCH_M_NEXT[2] / l_next;
1692
+
1693
+ let tx = t_in_x + t_out_x;
1694
+ let ty = t_in_y + t_out_y;
1695
+ let tz = t_in_z + t_out_z;
1696
+ const t_len = Math.sqrt(tx * tx + ty * ty + tz * tz);
1697
+ if (t_len > 1e-12) {
1698
+ tx /= t_len;
1699
+ ty /= t_len;
1700
+ tz /= t_len;
1701
+
1702
+ out.node_write_tangent(v_mid, tx, ty, tz);
1703
+
1704
+ // Blend between smooth C1 average tangent and crisp sympodial kink tangents
1705
+ let m1x = lerp(tx, t_in_x, kink_sharp);
1706
+ let m1y = lerp(ty, t_in_y, kink_sharp);
1707
+ let m1z = lerp(tz, t_in_z, kink_sharp);
1708
+ const m1_l = Math.sqrt(m1x * m1x + m1y * m1y + m1z * m1z);
1709
+ if (m1_l > 1e-12) { m1x /= m1_l; m1y /= m1_l; m1z /= m1_l; }
1710
+
1711
+ let m0x = lerp(tx, t_out_x, kink_sharp);
1712
+ let m0y = lerp(ty, t_out_y, kink_sharp);
1713
+ let m0z = lerp(tz, t_out_z, kink_sharp);
1714
+ const m0_l = Math.sqrt(m0x * m0x + m0y * m0y + m0z * m0z);
1715
+ if (m0_l > 1e-12) { m0x /= m0_l; m0y /= m0_l; m0z /= m0_l; }
1716
+
1717
+ out.segment_write_m1(e_prev, m1x * l_prev, m1y * l_prev, m1z * l_prev);
1718
+ out.segment_write_m0(e_next, m0x * l_next, m0y * l_next, m0z * l_next);
1719
+ }
1720
+ }
1721
+ }
1722
+
1723
+ // Spawn lateral child branches at level + 1 using pre-scheduled attachments
1724
+ const next_level = level + 1;
1725
+ if (scheduled_children.length > 0 && branch_edges.length > 0) {
1726
+ const t_max = branch_edge_t1[branch_edge_t1.length - 1];
1727
+ const PHI_CANDIDATES = [0.0, 0.36, -0.36, 0.72, -0.72, 1.08, -1.08, 1.48, -1.48];
1728
+
1729
+ for (let c = 0; c < scheduled_children.length; c++) {
1730
+ const sc = scheduled_children[c];
1731
+ const rule = sc.rule;
1732
+ const next_cfg = species.branches[rule.target];
1733
+ if (sc.t_attach > t_max * 1.02) continue;
1734
+ const t_attach = clamp(sc.t_attach, branch_edge_t0[0], t_max * 0.985);
1735
+ const base_phi_c = sc.phi;
1736
+
1737
+ // Find parent edge containing t_attach
1738
+ let seg_idx = 0;
1739
+ for (let i = 0; i < branch_edges.length; i++) {
1740
+ if (t_attach >= branch_edge_t0[i] && t_attach <= branch_edge_t1[i]) {
1741
+ seg_idx = i;
1742
+ break;
1743
+ }
1744
+ }
1745
+
1746
+ const parent_e = branch_edges[seg_idx];
1747
+ const t0_e = branch_edge_t0[seg_idx];
1748
+ const t1_e = branch_edge_t1[seg_idx];
1749
+ const local_u = clamp((t_attach - t0_e) / Math.max(1e-5, t1_e - t0_e), 0.0, 1.0);
1750
+
1751
+ out.evaluate_segment_position(SCRATCH_POS, 0, parent_e, local_u);
1752
+ out.evaluate_segment_tangent(SCRATCH_TAN, 0, parent_e, local_u);
1753
+
1754
+ const p_v0 = branch_vertices[seg_idx];
1755
+ const p_v1 = branch_vertices[seg_idx + 1];
1756
+ const r_p0 = out.node_read_radius(p_v0);
1757
+ const r_p1 = out.node_read_radius(p_v1);
1758
+ const parent_r_at_attach = lerp(r_p0, r_p1, local_u);
1759
+ if (parent_r_at_attach < 0.004) continue;
1760
+
1761
+ // Transport parent RMF R vector from p_v0 along parent_e to SCRATCH_POS at local_u
1762
+ out.node_read_position(SCRATCH_P0, 0, p_v0);
1763
+ out.node_read_tangent(SCRATCH_T0, 0, p_v0);
1764
+ out.node_read_frame_r(SCRATCH_R0, 0, p_v0);
1765
+ const p_rx = SCRATCH_R0[0];
1766
+ const p_ry = SCRATCH_R0[1];
1767
+ const p_rz = SCRATCH_R0[2];
1768
+
1769
+ spine_frame_double_reflection(
1770
+ SCRATCH_RMF, 0,
1771
+ SCRATCH_P0[0], SCRATCH_P0[1], SCRATCH_P0[2],
1772
+ SCRATCH_T0[0], SCRATCH_T0[1], SCRATCH_T0[2],
1773
+ p_rx, p_ry, p_rz,
1774
+ SCRATCH_POS[0], SCRATCH_POS[1], SCRATCH_POS[2],
1775
+ SCRATCH_TAN[0], SCRATCH_TAN[1], SCRATCH_TAN[2]
1776
+ );
1777
+ const prx = SCRATCH_RMF[0], pry = SCRATCH_RMF[1], prz = SCRATCH_RMF[2];
1778
+ const psx = SCRATCH_RMF[3], psy = SCRATCH_RMF[4], psz = SCRATCH_RMF[5];
1779
+
1780
+ // Genealogical position along the full parent axis (accounts for continuation forks)
1781
+ const t_genealogical = lerp(job.cum_t0 ?? 0.0, job.cum_t1 ?? 1.0, t_attach);
1782
+
1783
+ // Insertion polar angle alpha from parent tangent T_p toward D_rad
1784
+ const alpha_scale = rule.insertion_angle_profile.evaluate(t_genealogical);
1785
+ const alpha = clamp(
1786
+ rule.insertion_angle * alpha_scale + (rng() * 2.0 - 1.0) * rule.insertion_angle_variation,
1787
+ 0.1,
1788
+ Math.PI * 0.85
1789
+ );
1790
+ const cos_a = Math.cos(alpha);
1791
+ const sin_a = Math.sin(alpha);
1792
+ const var_scale = 1.0 + (rng() * 2.0 - 1.0) * next_cfg.length_variance;
1793
+
1794
+ // A plagiotropic parent is dorsiventral: its buds lie in the plane of its tangent T_p and the horizontal
1795
+ // H = T_p x Y across it, whose normal N = H x T_p points up. A vertical parent has no such plane.
1796
+ const tpx = SCRATCH_TAN[0], tpy = SCRATCH_TAN[1], tpz = SCRATCH_TAN[2];
1797
+ const horizontality = Math.hypot(tpx, tpz);
1798
+ const plagio = level >= 1 ? lvl_cfg.plagiotropism : 0.0;
1799
+ const w_plagio = horizontality > 1e-3 ? plagio * horizontality : 0.0;
1800
+ const dv_nx = horizontality > 1e-3 ? (-tpx * tpy) / horizontality : 0.0;
1801
+ const dv_ny = horizontality;
1802
+ const dv_nz = horizontality > 1e-3 ? (-tpy * tpz) / horizontality : 0.0;
1803
+
1804
+ // Helper to compute radial normal D_rad and child tangent T_c for a given azimuth phi_cand
1805
+ const compute_child_basis = (phi_cand, out_dr, out_ct) => {
1806
+ const cp = Math.cos(phi_cand);
1807
+ const sp = Math.sin(phi_cand);
1808
+ let dx_r = cp * prx + sp * psx;
1809
+ let dy_r = cp * pry + sp * psy;
1810
+ let dz_r = cp * prz + sp * psz;
1811
+
1812
+ if (w_plagio > 1e-3) {
1813
+ // fan into the dorsiventral plane: take off w of the radial's component along N
1814
+ const along_n = (dx_r * dv_nx + dy_r * dv_ny + dz_r * dv_nz) * w_plagio;
1815
+ dx_r -= along_n * dv_nx;
1816
+ dy_r -= along_n * dv_ny;
1817
+ dz_r -= along_n * dv_nz;
1818
+ const d_len = Math.sqrt(dx_r * dx_r + dy_r * dy_r + dz_r * dz_r);
1819
+ if (d_len > 1e-6) {
1820
+ dx_r /= d_len;
1821
+ dy_r /= d_len;
1822
+ dz_r /= d_len;
1823
+ } else {
1824
+ // a bud straight above (below) a fully dorsiventral shoot: to the side, along H
1825
+ dx_r = -tpz / horizontality;
1826
+ dy_r = 0.0;
1827
+ dz_r = tpx / horizontality;
1828
+ }
1829
+ }
1830
+ out_dr[0] = dx_r;
1831
+ out_dr[1] = dy_r;
1832
+ out_dr[2] = dz_r;
1833
+
1834
+ let tx_c = cos_a * SCRATCH_TAN[0] + sin_a * dx_r;
1835
+ let ty_c = cos_a * SCRATCH_TAN[1] + sin_a * dy_r;
1836
+ let tz_c = cos_a * SCRATCH_TAN[2] + sin_a * dz_r;
1837
+ const ct_l = Math.sqrt(tx_c * tx_c + ty_c * ty_c + tz_c * tz_c) || 1.0;
1838
+ out_ct[0] = tx_c / ct_l;
1839
+ out_ct[1] = ty_c / ct_l;
1840
+ out_ct[2] = tz_c / ct_l;
1841
+ };
1842
+
1843
+ // Ventral knockout: on a dorsiventral parent a bud whose own heading points into the downward cone of
1844
+ // half-angle plagiotropism * pi / 2 does not break
1845
+ const ventral_cos = Math.cos(plagio * Math.PI * 0.5);
1846
+ if (plagio > 0.0) {
1847
+ const bud_y = cos_a * tpy + sin_a * (Math.cos(base_phi_c) * pry + Math.sin(base_phi_c) * psy);
1848
+ if (-bud_y > ventral_cos) {
1849
+ continue;
1850
+ }
1851
+ }
1852
+
1853
+ const cand_dr = [0, 0, 0];
1854
+ const cand_ct = [0, 0, 0];
1855
+ compute_child_basis(base_phi_c, cand_dr, cand_ct);
1856
+
1857
+ // 1. Raw configured child branch length modulated by length_profile at t_genealogical and crown envelope
1858
+ const prof_scale = Math.max(0.12, rule.length_profile.evaluate(t_genealogical));
1859
+ const est_mid_y = SCRATCH_POS[1] + Math.max(0.0, cand_ct[1]) * next_cfg.length * prof_scale * 0.35;
1860
+ const h_norm = clamp((est_mid_y - crown.base_height) / Math.max(0.1, crown.height), 0.0, 1.0);
1861
+ // a dead branch grew before today's crown took its shape
1862
+ const dead = sc.age > 0.0;
1863
+ const env_scale = !rule.crown_envelope || dead
1864
+ ? 1.0
1865
+ : (level === 0
1866
+ ? crown_envelope_evaluate(crown.envelope_type, h_norm)
1867
+ : lerp(1.0, crown_envelope_evaluate(crown.envelope_type, h_norm), 0.5));
1868
+ const raw_child_len = Math.max(0.12, next_cfg.length * prof_scale * env_scale * var_scale);
1869
+
1870
+ // 2. Continuous Gravity-Orientation & Allometric Slenderness Coupling (Cantilever vs. Pendulous Tension)
1871
+ const rho_design = Math.max(0.012, next_cfg.radius_ratio);
1872
+ const s_design = 1.0 / (2.0 * rho_design);
1873
+ const g_trop = next_cfg.gravitropism ?? 0.0;
1874
+ const u_curl = next_cfg.tip_upcurl ?? 0.0;
1875
+ const t_eff_y = clamp(cand_ct[1] - 0.85 * g_trop + 0.35 * u_curl, -1.0, 1.0);
1876
+
1877
+ // Cantilever load (horizontal bending / upward compression) vs. pendulous tensile compliance
1878
+ const k_cantilever = Math.sqrt(Math.max(0.0, 1.0 - t_eff_y * t_eff_y)) + 0.65 * Math.max(0.0, t_eff_y);
1879
+ const tau_tension = clamp(g_trop, 0.0, 1.0) * Math.max(0.0, -t_eff_y);
1880
+
1881
+ // 3. Parent-relative distal conical envelope (prevents distal shoots or split forks from outgrowing their parent)
1882
+ const actual_parent_len = Math.max(0.15, out.branch_length[branch_id]);
1883
+ const parent_full_len = Math.max(actual_parent_len, job.full_branch_length ?? actual_parent_len);
1884
+ const distal_tip_ratio = lerp(0.32, 0.55, tau_tension);
1885
+ const cone_max_len = level === 0
1886
+ ? parent_full_len * lerp(0.85, 0.32, Math.pow(t_genealogical, 1.6))
1887
+ : Math.min(
1888
+ actual_parent_len * lerp(0.90, 1.05, tau_tension),
1889
+ parent_full_len * lerp(0.85, distal_tip_ratio, Math.pow(t_genealogical, 1.25))
1890
+ );
1891
+ const desired_len = Math.max(0.12, Math.min(raw_child_len, cone_max_len));
1892
+
1893
+ const nom_len = Math.max(0.15, next_cfg.length);
1894
+ const r_design = (nom_len * rho_design * Math.pow(desired_len / nom_len, 0.75)) / (1.0 + 0.65 * tau_tension);
1895
+ // children on the flare crests sit side by side around the stem: N of them fit at most R sin(pi / N) thick
1896
+ const side_by_side_r = rule.phyllotaxis_mode === PhyllotaxisMode.FlareLobes
1897
+ ? parent_r_at_attach * Math.sin(Math.PI / Math.max(2, lvl_cfg.flare_lobes | 0))
1898
+ : Infinity;
1899
+ const child_base_r = Math.min(
1900
+ parent_r_at_attach * 0.78,
1901
+ side_by_side_r,
1902
+ Math.max(0.0035, r_design)
1903
+ );
1904
+
1905
+ const gamma = lerp(0.82, 0.65, tau_tension);
1906
+ const allometric_len = child_base_r < r_design
1907
+ ? desired_len * Math.pow(child_base_r / Math.max(1e-5, r_design), gamma)
1908
+ : desired_len;
1909
+ const s_max = s_design * (1.35 + 0.65 * tau_tension) / (0.65 + 0.35 * k_cantilever);
1910
+ const full_len = clamp(Math.min(allometric_len, 2.0 * child_base_r * s_max), 0.12, desired_len);
1911
+ // a dead branch is what is left of it: its base part, if that still clears the bark; otherwise it has
1912
+ // been grown over and the stem carries its scar
1913
+ const child_len = full_len * sc.retained;
1914
+ if (dead && child_len <= parent_r_at_attach) {
1915
+ out.add_scar(branch_id, t_attach, cand_ct[0], cand_ct[1], cand_ct[2], child_base_r * (1.0 - sc.age));
1916
+ continue;
1917
+ }
1918
+ const child_segs = Math.max(1, Math.ceil(next_cfg.segments * sc.retained));
1919
+ const child_step = child_len / child_segs;
1920
+
1921
+ // 4. Pre-Spawn BVH Bud Clearance Probing (selects open canopy azimuth or inhibits blocked bud)
1922
+ let best_drx = cand_dr[0], best_dry = cand_dr[1], best_drz = cand_dr[2];
1923
+ let best_ctx = cand_ct[0], best_cty = cand_ct[1], best_ctz = cand_ct[2];
1924
+ let best_clear = -Infinity;
1925
+ const r_horiz_attach = Math.hypot(SCRATCH_POS[0], SCRATCH_POS[2]);
1926
+
1927
+ for (let k = 0; k < PHI_CANDIDATES.length; k++) {
1928
+ if (k > 0) {
1929
+ compute_child_basis(base_phi_c + PHI_CANDIDATES[k], cand_dr, cand_ct);
1930
+ }
1931
+ // nor may fanning or a turn for clearance carry it into the cone: a bud with no heading left
1932
+ // outside it does not break
1933
+ if (plagio > 0.0 && -cand_ct[1] > ventral_cos) continue;
1934
+ // Prevent lateral shoots on boughs from pointing backward into the trunk core
1935
+ if (level >= 1 && r_horiz_attach > 0.30) {
1936
+ const radial_dot = (SCRATCH_POS[0] * cand_ct[0] + SCRATCH_POS[2] * cand_ct[2]) / r_horiz_attach;
1937
+ if (radial_dot < -0.15) continue;
1938
+ }
1939
+
1940
+ const p1_x = SCRATCH_POS[0] + cand_ct[0] * child_step;
1941
+ const p1_y = SCRATCH_POS[1] + cand_ct[1] * child_step;
1942
+ const p1_z = SCRATCH_POS[2] + cand_ct[2] * child_step;
1943
+
1944
+ const clear0 = evaluate_candidate_clearance(
1945
+ -1, branch_id, seg_idx, false, 0,
1946
+ SCRATCH_POS[0], SCRATCH_POS[1], SCRATCH_POS[2], child_base_r,
1947
+ p1_x, p1_y, p1_z, child_base_r * 0.88,
1948
+ 0.002
1949
+ );
1950
+
1951
+ const p2_x = p1_x + cand_ct[0] * child_step;
1952
+ const p2_y = p1_y + cand_ct[1] * child_step;
1953
+ const p2_z = p1_z + cand_ct[2] * child_step;
1954
+ const clear1 = child_segs >= 2
1955
+ ? evaluate_candidate_clearance(
1956
+ -1, branch_id, seg_idx, false, 1,
1957
+ p1_x, p1_y, p1_z, child_base_r * 0.88,
1958
+ p2_x, p2_y, p2_z, child_base_r * 0.75,
1959
+ 0.002
1960
+ )
1961
+ : clear0;
1962
+
1963
+ const min_c = Math.min(clear0, clear1);
1964
+ if (min_c > best_clear) {
1965
+ best_clear = min_c;
1966
+ best_drx = cand_dr[0];
1967
+ best_dry = cand_dr[1];
1968
+ best_drz = cand_dr[2];
1969
+ best_ctx = cand_ct[0];
1970
+ best_cty = cand_ct[1];
1971
+ best_ctz = cand_ct[2];
1972
+ }
1973
+ if (min_c >= 0.004) {
1974
+ break;
1975
+ }
1976
+ }
1977
+
1978
+ // Botanical bud inhibition: if all candidate directions are blocked by existing branches, suppress bud
1979
+ if (best_clear < -0.004) {
1980
+ continue;
1981
+ }
1982
+
1983
+ const drx = best_drx, dry = best_dry, drz = best_drz;
1984
+ const ctx = best_ctx, cty = best_cty, ctz = best_ctz;
1985
+
1986
+ // Initial RMF radial vector for child branch:
1987
+ // R_c = cos(alpha) * D_rad - sin(alpha) * T_p is exact unit length and orthogonal
1988
+ // to T_c = cos(alpha) * T_p + sin(alpha) * D_rad for all alpha in [0, pi],
1989
+ // avoiding any singularity at alpha = pi/2.
1990
+ let crx = cos_a * drx - sin_a * SCRATCH_TAN[0];
1991
+ let cry = cos_a * dry - sin_a * SCRATCH_TAN[1];
1992
+ let crz = cos_a * drz - sin_a * SCRATCH_TAN[2];
1993
+ const cr_dot = crx * ctx + cry * cty + crz * ctz;
1994
+ crx -= cr_dot * ctx;
1995
+ cry -= cr_dot * cty;
1996
+ crz -= cr_dot * ctz;
1997
+ const cr_len = Math.sqrt(crx * crx + cry * cry + crz * crz);
1998
+ if (cr_len > 1e-12) {
1999
+ crx /= cr_len;
2000
+ cry /= cr_len;
2001
+ crz /= cr_len;
2002
+ }
2003
+
2004
+ queue.push({
2005
+ level: next_level,
2006
+ generator: rule.target,
2007
+ in_crown: rule.crown_envelope && !dead,
2008
+ dead,
2009
+ parent_branch_id: branch_id,
2010
+ parent_edge_id: parent_e,
2011
+ parent_attach_seg_idx: seg_idx,
2012
+ parent_attach_t: t_attach,
2013
+ attach_parent_vertex: p_v0,
2014
+ start_vertex: -1,
2015
+ px: SCRATCH_POS[0],
2016
+ py: SCRATCH_POS[1],
2017
+ pz: SCRATCH_POS[2],
2018
+ tx: ctx,
2019
+ ty: cty,
2020
+ tz: ctz,
2021
+ rx: crx,
2022
+ ry: cry,
2023
+ rz: crz,
2024
+ emerge_drx: drx,
2025
+ emerge_dry: dry,
2026
+ emerge_drz: drz,
2027
+ length: child_len,
2028
+ full_branch_length: child_len,
2029
+ base_radius: child_base_r * (1.0 - sc.age),
2030
+ start_seg: 0,
2031
+ total_segs: child_segs,
2032
+ shape_segs: Math.max(1, next_cfg.segments),
2033
+ initial_arc_s: 0.0,
2034
+ has_split: false,
2035
+ is_split_fork: false,
2036
+ cum_t0: 0.0,
2037
+ cum_t1: sc.retained
2038
+ });
2039
+ }
2040
+ }
2041
+ }
2042
+
2043
+ // Bottom-up Pipe Model radius calculation & blending
2044
+ tree_skeleton_compute_pipe_radii(out, species);
2045
+
2046
+ // the crown is where the shoot systems grow
2047
+ tree_skeleton_fit_crown_frame(out, species);
2048
+
2049
+ return out;
2050
+ }