@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
@@ -1,301 +1,14 @@
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
1
  import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
13
2
  import { TreeSkeleton } from "./TreeSkeleton.js";
14
- import { assert } from "../../../core/assert.js";
15
- import { flare_lobe_phase_offset } from "./flare_lobe_phase_offset.js";
16
- import { crown_envelope_evaluate, crown_envelope_sdf } from "./crown_envelope_evaluate.js";
17
- import { spine_frame_double_reflection } from "./spine_frame_double_reflection.js";
18
- import { tree_skeleton_compute_pipe_radii } from "./tree_skeleton_compute_pipe_radii.js";
3
+ import { tree_skeleton_fit_crown_frame } from "./tree_skeleton_fit_crown_frame.js";
4
+ import { tree_skeleton_grow_framework } from "./tree_skeleton_grow_framework.js";
19
5
  import { tree_skeleton_grow_shoots } from "./tree_skeleton_grow_shoots.js";
20
6
 
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
7
  /**
288
- * Generates a directed botanical `TreeSkeleton` from a `TreeSpeciesConfig`, combining:
289
- * - A branch generator graph: `species.branches[0]` grows the trunk, and every `species.branch_rules` edge
290
- * spawns branches of its `target` generator along each branch of its `source` generator
291
- * - Parametric Cubic Hermite spine generation (`BranchGeneratorConfig`, `AnimationCurve` profiles)
292
- * - Botanical phyllotaxis (`SpiralGolden`, `AlternateDistichous`, `Tristichous`, `Opposite`, `OppositeDecussate`, `Whorled`, `FlareLobes`)
293
- * - Structural surface roots (`BranchGeneratorConfig.root`) that creep along the ground plane `y = 0`
294
- * - Gravitropism (toward `-Y`), phototropism (toward `+Y` and outward crown exterior), and 3D `curl_noise_3d` gnarl
295
- * - Dichotomous / sympodial trunk & bough splitting
296
- * - Space colonization crown competition via `PointHashGrid3`
297
- * - Rotation-Minimizing Frames (`spine_frame_double_reflection`)
298
- * - Pipe Model cross-section radius accumulation (`tree_skeleton_compute_pipe_radii`)
8
+ * Grows a whole tree botanically (`TreeGrowth.Botanical`): its framework from the generator graph
9
+ * (`tree_skeleton_grow_framework`), then the shoot systems of its `shoot_rules`, year by year on that framework, its
10
+ * girth final (`tree_skeleton_grow_shoots`), and fits the crown frame to them as the framework did to its carriers
11
+ * (`tree_skeleton_fit_crown_frame`).
299
12
  *
300
13
  * @param {TreeSpeciesConfig|Object} [config]
301
14
  * @param {TreeSkeleton} [out]
@@ -303,1746 +16,8 @@ function resolve_subsegment_bounds(
303
16
  */
304
17
  export function tree_skeleton_grow(config = new TreeSpeciesConfig(), out = new TreeSkeleton()) {
305
18
  const species = config && config.isTreeSpeciesConfig ? config : TreeSpeciesConfig.from(config);
306
- out.clear();
307
-
308
- const rng = seededRandom(species.seed | 0);
309
- // Seed-derived 3D noise offset so unseeded Simplex/Curl fields are unique and deterministic per seed
310
- const noise_ox = (rng() - 0.5) * 1000.0;
311
- const noise_oy = (rng() - 0.5) * 1000.0;
312
- const noise_oz = (rng() - 0.5) * 1000.0;
313
-
314
- const crown = species.crown;
315
- const crown_cy = crown.base_height + crown.height * 0.5;
316
- out.crown_center[0] = 0.0;
317
- out.crown_center[1] = crown_cy;
318
- out.crown_center[2] = 0.0;
319
-
320
- out.crown_radii[0] = Math.max(0.25, crown.radius);
321
- out.crown_radii[1] = Math.max(0.25, crown.height * 0.5);
322
- out.crown_radii[2] = Math.max(0.25, crown.radius);
323
-
324
- // Build Space Colonization attraction point cloud + PointHashGrid3 once
325
- const use_space_col = crown.space_colonization_weight > 0.0 && crown.attraction_point_count > 0;
326
- const attr_count = use_space_col ? (crown.attraction_point_count | 0) : 0;
327
- const attr_positions = new Float32Array(attr_count * 3);
328
- const attr_alive = new Uint8Array(attr_count);
329
- let attr_grid = null;
330
-
331
- if (use_space_col) {
332
- let placed = 0;
333
- let attempts = 0;
334
- const max_attempts = attr_count * 12;
335
- while (placed < attr_count && attempts < max_attempts) {
336
- attempts++;
337
- const u_h = rng();
338
- const env_r = crown.radius * crown_envelope_evaluate(crown.envelope_type, u_h);
339
- const rx = (rng() * 2.0 - 1.0) * env_r;
340
- const rz = (rng() * 2.0 - 1.0) * env_r;
341
- if (rx * rx + rz * rz <= env_r * env_r) {
342
- const ry = crown.base_height + u_h * crown.height;
343
- attr_positions[placed * 3] = rx;
344
- attr_positions[placed * 3 + 1] = ry;
345
- attr_positions[placed * 3 + 2] = rz;
346
- attr_alive[placed] = 1;
347
- placed++;
348
- }
349
- }
350
- while (placed < attr_count) {
351
- const theta = rng() * PI2;
352
- const u_h = rng();
353
- const r = Math.sqrt(rng()) * crown.radius * crown_envelope_evaluate(crown.envelope_type, u_h);
354
- attr_positions[placed * 3] = Math.cos(theta) * r;
355
- attr_positions[placed * 3 + 1] = crown.base_height + u_h * crown.height;
356
- attr_positions[placed * 3 + 2] = Math.sin(theta) * r;
357
- attr_alive[placed] = 1;
358
- placed++;
359
- }
360
-
361
- attr_grid = new PointHashGrid3();
362
- attr_grid.build(attr_positions, attr_count, Math.max(0.25, crown.attraction_radius));
363
- }
364
-
365
- const r_influence_sq = crown.attraction_radius * crown.attraction_radius;
366
- const r_kill_sq = crown.kill_radius * crown.kill_radius;
367
-
368
- // Queue of branches to grow in level-order (guarantees parent branches & vertices precede children)
369
- const queue = [];
370
-
371
- const lvl0 = species.branches[0];
372
- if (!lvl0) {
373
- return out;
374
- }
375
-
376
- // Outgoing rules of every generator in canonical order, so the order rules are listed in does not change the tree
377
- const outgoing_rules = species.branches.map(() => []);
378
- for (let r = 0; r < species.branch_rules.length; r++) {
379
- const rule = species.branch_rules[r];
380
- assert.ok(rule.source >= 0 && rule.source < rule.target && rule.target < species.branches.length,
381
- 'branch rule must satisfy 0 <= source < target < branches.length');
382
- outgoing_rules[rule.source].push(rule);
383
- }
384
- for (let g = 0; g < outgoing_rules.length; g++) {
385
- outgoing_rules[g].sort(compare_rule_target);
386
- }
387
-
388
- const trunk_len = Math.max(0.2, lvl0.length * (1.0 + (rng() * 2.0 - 1.0) * lvl0.length_variance));
389
- const trunk_base_r = Math.max(0.01, trunk_len * lvl0.radius_ratio);
390
-
391
- evaluate_trunk_guide(SCRATCH_GUIDE_P0, SCRATCH_GUIDE_T, species.trunk_guide, 0.0, trunk_len);
392
-
393
- // Apply subtle initial basal trunk lean around the guide tangent
394
- const max_lean = lvl0.excurrent ? 0.025 : 0.06;
395
- const lean_ang = clamp((lvl0.basal_lean ?? 0.02) * (0.75 + 0.5 * rng()), 0.0, max_lean);
396
- const lean_az = rng() * PI2;
397
- const init_tx = clamp(SCRATCH_GUIDE_T[0] + Math.sin(lean_ang) * Math.cos(lean_az), -0.95, 0.95);
398
- const init_ty = Math.max(0.2, SCRATCH_GUIDE_T[1] * Math.cos(lean_ang));
399
- const init_tz = clamp(SCRATCH_GUIDE_T[2] + Math.sin(lean_ang) * Math.sin(lean_az), -0.95, 0.95);
400
- const init_t_len = Math.hypot(init_tx, init_ty, init_tz) || 1.0;
401
- const norm_tx = init_tx / init_t_len;
402
- const norm_ty = init_ty / init_t_len;
403
- const norm_tz = init_tz / init_t_len;
404
-
405
- // Orthonormal initial R perpendicular to norm_T
406
- let init_rx = 1.0 - norm_tx * norm_tx;
407
- let init_ry = -norm_ty * norm_tx;
408
- let init_rz = -norm_tz * norm_tx;
409
- const init_r_len = Math.hypot(init_rx, init_ry, init_rz) || 1.0;
410
- init_rx /= init_r_len;
411
- init_ry /= init_r_len;
412
- init_rz /= init_r_len;
413
-
414
- queue.push({
415
- level: 0,
416
- generator: 0,
417
- in_crown: true,
418
- parent_branch_id: -1,
419
- parent_edge_id: -1,
420
- parent_attach_seg_idx: -1,
421
- parent_attach_t: 0.0,
422
- start_vertex: -1,
423
- px: SCRATCH_GUIDE_P0[0],
424
- py: SCRATCH_GUIDE_P0[1],
425
- pz: SCRATCH_GUIDE_P0[2],
426
- tx: norm_tx,
427
- ty: norm_ty,
428
- tz: norm_tz,
429
- rx: init_rx,
430
- ry: init_ry,
431
- rz: init_rz,
432
- emerge_drx: init_rx,
433
- emerge_dry: init_ry,
434
- emerge_drz: init_rz,
435
- length: trunk_len,
436
- full_branch_length: trunk_len,
437
- base_radius: trunk_base_r,
438
- start_seg: 0,
439
- total_segs: Math.max(1, lvl0.segments),
440
- shape_segs: Math.max(1, lvl0.segments),
441
- initial_arc_s: 0.0,
442
- has_split: false,
443
- is_split_fork: false,
444
- cum_t0: 0.0,
445
- cum_t1: 1.0
446
- });
447
-
448
- const rot_scratch = [0, 0, 0];
449
-
450
- // Scope-local BVH and per-segment metadata for branch-branch spatial avoidance & collision prevention
451
- const bvh = new BVH();
452
- const bvh_hits = new Uint32Array(256);
453
- const query_capsule = new Float32Array(7);
454
- const sub_bounds = new Float64Array(2);
455
- const closest_st = new Float64Array(2);
456
-
457
- const seg_branch_id = [];
458
- const seg_local_idx = [];
459
- const seg_p0x = [], seg_p0y = [], seg_p0z = [], seg_r0 = [];
460
- const seg_p1x = [], seg_p1y = [], seg_p1z = [], seg_r1 = [];
461
- const seg_bvh_leaf = [];
462
-
463
- const branch_parent_seg_idx = [];
464
- const branch_is_split_fork = [];
465
-
466
- /**
467
- * Evaluates the minimum signed surface-to-surface clearance between a candidate segment A
468
- * and all non-exempt existing segments in `bvh`.
469
- */
470
- const evaluate_candidate_clearance = (
471
- bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
472
- a0x, a0y, a0z, rA0,
473
- a1x, a1y, a1z, rA1,
474
- extra_margin
475
- ) => {
476
- if (bvh.size === 0) return 10.0;
477
- const max_rA = Math.max(rA0, rA1);
478
- query_capsule[0] = a0x;
479
- query_capsule[1] = a0y;
480
- query_capsule[2] = a0z;
481
- query_capsule[3] = a1x;
482
- query_capsule[4] = a1y;
483
- query_capsule[5] = a1z;
484
- query_capsule[6] = max_rA * 1.15 + extra_margin + 0.04;
485
-
486
- const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
487
- let min_clear = 10.0;
488
-
489
- for (let h = 0; h < hit_count; h++) {
490
- const eB = bvh_hits[h];
491
- const bB = seg_branch_id[eB];
492
- const local_idx_B = seg_local_idx[eB];
493
- const parent_bB = out.branch_parent[bB];
494
- const attach_seg_B = branch_parent_seg_idx[bB];
495
- const is_split_B = branch_is_split_fork[bB];
496
-
497
- if (!resolve_subsegment_bounds(
498
- bA, parent_bA, attach_seg_A, is_split_A, local_idx_A,
499
- bB, parent_bB, attach_seg_B, is_split_B, local_idx_B,
500
- sub_bounds
501
- )) {
502
- continue;
503
- }
504
-
505
- const s_min = sub_bounds[0];
506
- const t_min = sub_bounds[1];
507
- const sa0x = a0x + (a1x - a0x) * s_min;
508
- const sa0y = a0y + (a1y - a0y) * s_min;
509
- const sa0z = a0z + (a1z - a0z) * s_min;
510
-
511
- const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
512
- const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
513
- const sb0x = b0x + (b1x - b0x) * t_min;
514
- const sb0y = b0y + (b1y - b0y) * t_min;
515
- const sb0z = b0z + (b1z - b0z) * t_min;
516
-
517
- line3_compute_segment_segment_closest_points(
518
- closest_st,
519
- sa0x, sa0y, sa0z, a1x, a1y, a1z,
520
- sb0x, sb0y, sb0z, b1x, b1y, b1z
521
- );
522
-
523
- const s_f = s_min + (1.0 - s_min) * closest_st[0];
524
- const t_f = t_min + (1.0 - t_min) * closest_st[1];
525
-
526
- const qAx = a0x + (a1x - a0x) * s_f;
527
- const qAy = a0y + (a1y - a0y) * s_f;
528
- const qAz = a0z + (a1z - a0z) * s_f;
529
- const qBx = b0x + (b1x - b0x) * t_f;
530
- const qBy = b0y + (b1y - b0y) * t_f;
531
- const qBz = b0z + (b1z - b0z) * t_f;
532
-
533
- const dist = Math.hypot(qAx - qBx, qAy - qBy, qAz - qBz);
534
- const rA = rA0 + (rA1 - rA0) * s_f;
535
- const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
536
- const r_req = (rA + rB) * 1.08 + extra_margin;
537
- const clear = dist - r_req;
538
- if (clear < min_clear) {
539
- min_clear = clear;
540
- }
541
- }
542
- return min_clear;
543
- };
544
-
545
- for (let q_idx = 0; q_idx < queue.length; q_idx++) {
546
- const job = queue[q_idx];
547
- const level = job.level;
548
- const generator = job.generator;
549
- const lvl_cfg = species.branches[generator];
550
-
551
- const phase_hash = rng();
552
- const N_seg = job.total_segs;
553
- // Shape is a function of position along the whole branch: envelopes take the genealogical t (cum_t0..cum_t1)
554
- // and per-step amounts the whole branch's segmentation, so a dead stub bends as the base of its branch did
555
- const N_shape = job.shape_segs;
556
- const remaining_segs = N_seg - job.start_seg;
557
- if (remaining_segs <= 0) continue;
558
-
559
- const step_len = job.length / N_seg;
560
- const prof_p0 = lvl_cfg.radius_profile.evaluate(0.0);
561
- const prof_p1 = lvl_cfg.radius_profile.evaluate(1.0);
562
- const prof_span = prof_p0 - prof_p1;
563
-
564
- let cur_px = job.px;
565
- let cur_py = job.py;
566
- let cur_pz = job.pz;
567
- let cur_tx = job.tx;
568
- let cur_ty = job.ty;
569
- let cur_tz = job.tz;
570
- let cur_rx = job.rx;
571
- let cur_ry = job.ry;
572
- let cur_rz = job.rz;
573
- let cur_arc_s = job.initial_arc_s;
574
-
575
- // Compute binormal S = T x R
576
- let cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
577
- let cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
578
- let cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
579
-
580
- let prev_v = job.start_vertex;
581
- let branch_id = -1;
582
-
583
- if (prev_v < 0) {
584
- const t0 = job.start_seg / N_seg;
585
- const u_prof0 = prof_span > 1e-4
586
- ? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(t0)) / prof_span, 0.0, 1.0)
587
- : t0;
588
- const min_r0_frac = level === 0 ? 0.08 : 0.15;
589
- const r0 = Math.max(0.002, job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_prof0, min_r0_frac));
590
-
591
- branch_id = out.add_branch(
592
- 0,
593
- level,
594
- generator,
595
- job.parent_branch_id,
596
- job.parent_edge_id,
597
- job.parent_attach_t,
598
- job.length,
599
- r0,
600
- phase_hash
601
- );
602
- prev_v = out.add_node(
603
- cur_px, cur_py, cur_pz,
604
- cur_tx, cur_ty, cur_tz,
605
- cur_rx, cur_ry, cur_rz,
606
- r0,
607
- branch_id,
608
- level,
609
- job.parent_branch_id,
610
- t0,
611
- cur_arc_s,
612
- phase_hash
613
- );
614
- if (job.attach_parent_vertex !== undefined && job.attach_parent_vertex >= 0) {
615
- out.connect_nodes(job.attach_parent_vertex, prev_v);
616
- }
617
- out.branch_root_vertex[branch_id] = prev_v;
618
- out.branch_tip_vertex[branch_id] = prev_v;
619
- } else {
620
- const prev_r = out.node_read_radius(prev_v);
621
- branch_id = out.add_branch(
622
- prev_v,
623
- level,
624
- generator,
625
- job.parent_branch_id,
626
- job.parent_edge_id,
627
- job.parent_attach_t,
628
- job.length,
629
- prev_r,
630
- phase_hash
631
- );
632
- }
633
-
634
- branch_parent_seg_idx[branch_id] = job.parent_attach_seg_idx ?? -1;
635
- branch_is_split_fork[branch_id] = Boolean(job.is_split_fork);
636
- out.branch_dead[branch_id] = job.dead ? 1 : 0;
637
-
638
- const branch_edges = [];
639
- const branch_edge_t0 = [];
640
- const branch_edge_t1 = [];
641
- const branch_vertices = [prev_v];
642
-
643
- // Pre-schedule the phyllotactic child attachments of every outgoing rule so the parent spine kinks
644
- // sympodially at lateral emissions
645
- const len_fraction_est = level >= 1
646
- ? clamp(Math.pow(job.length / Math.max(0.2, lvl_cfg.length), 0.85), 0.0, 1.0)
647
- : 1.0;
648
- const can_bear_children = !job.dead && job.base_radius >= 0.006 && (level === 0 || job.length >= 0.55);
649
- const span_fraction_est = job.child_span_fraction ?? Math.max(0.25, (N_seg - job.start_seg) / Math.max(1, N_seg));
650
- const effective_span = span_fraction_est * len_fraction_est;
651
- const t_start_est = job.start_seg / N_seg;
652
- const raw_base_phi = rng() * PI2;
653
- const scheduled_children = [];
654
- let has_children = false;
655
-
656
- const rules = outgoing_rules[generator];
657
- for (let r = 0; r < rules.length; r++) {
658
- const rule = rules[r];
659
- if (rule.count <= 0 || !can_bear_children) continue;
660
- has_children = true;
661
-
662
- const planned_child_count = effective_span < 0.99
663
- ? Math.max(1, Math.round(rule.count * effective_span))
664
- : rule.count;
665
- const t_lo = Math.max(clamp(rule.attach_min, 0.0, 0.92), t_start_est);
666
- const t_hi = Math.min(0.968, rule.attach_max);
667
- const t_cap = Math.min(0.98, rule.attach_max);
668
- if (t_hi <= t_lo + 1e-3) continue;
669
-
670
- // Each rule turns its family by the golden angle, so families sharing a stretch of the parent interleave
671
- let base_phi = raw_base_phi + r * GOLDEN_ANGLE;
672
- if (
673
- level >= 1
674
- && (rule.phyllotaxis_mode === PhyllotaxisMode.AlternateDistichous
675
- || rule.phyllotaxis_mode === PhyllotaxisMode.Opposite)
676
- ) {
677
- // Align distichous / opposite lateral branching plane with the horizontal plane perpendicular to T
678
- const horiz_phi = Math.atan2(-cur_ry, cur_sy);
679
- base_phi = horiz_phi + (raw_base_phi < Math.PI ? 0.0 : Math.PI) + ((raw_base_phi % Math.PI) / Math.PI - 0.5) * 0.28;
680
- }
681
-
682
- for (let c = 0; c < planned_child_count; c++) {
683
- const u_c = rule_node_u(rule, c, planned_child_count, level === 0);
684
- const t_att = clamp(
685
- lerp(t_lo, t_hi, clamp(u_c, 0.0, 1.0)) + (rng() - 0.5) * ((t_hi - t_lo) * 0.25 / planned_child_count),
686
- t_lo,
687
- t_cap
688
- );
689
-
690
- let phi_c = base_phi + rule_node_phi(rule, c);
691
- if (rule.phyllotaxis_mode === PhyllotaxisMode.FlareLobes) {
692
- // On a crest of this branch's basal flare lobes, in the same frame the bark mesher shapes them in
693
- const lobes = Math.max(1, lvl_cfg.flare_lobes | 0);
694
- const arc_est = job.initial_arc_s + t_att * job.length;
695
- phi_c = ((c % lobes) * PI2) / lobes - flare_lobe_phase_offset(arc_est, phase_hash);
696
- }
697
- phi_c += (rng() * 2.0 - 1.0) * rule.azimuth_jitter;
698
- scheduled_children.push({ t_attach: t_att, phi: phi_c, rule, age: 0.0, retained: 1.0 });
699
- }
700
-
701
- // Self-pruning: below t_lo this crown rule once bore children too, at the same nodes, which died as the
702
- // crown rose above them and were shed. Age runs from 0 just below the living children to 1 at the stem's
703
- // base; a branch that died earlier died smaller, (1 - age) of its size today. It keeps
704
- // (1 - self_pruning) - age of its length as a dead stub, and once that no longer clears the bark it has
705
- // been grown over, leaving a scar.
706
- if (rule.crown_envelope && !job.is_split_fork && planned_child_count > 1) {
707
- const persistence = 1.0 - species.branches[rule.target].self_pruning;
708
- let t_node = t_lo;
709
- for (let c = -1; ; c--) {
710
- const t_dead = lerp(t_lo, t_hi, rule_node_u(rule, c, planned_child_count, level === 0));
711
- // past the stem's base, or a layout of a single node (one pair, one whorl) that has no 'below'
712
- if (t_dead <= 0.0 || t_dead > t_node) break;
713
- t_node = t_dead;
714
- const age = (t_lo - t_dead) / t_lo;
715
- const phi_c = base_phi + rule_node_phi(rule, c) + (rng() * 2.0 - 1.0) * rule.azimuth_jitter;
716
- scheduled_children.push({ t_attach: t_dead, phi: phi_c, rule, age, retained: persistence - age });
717
- }
718
- }
719
- }
720
-
721
- const k_symp = lvl_cfg.nodal_kink_strength ?? 0.45;
722
- const zig_base = lvl_cfg.internode_zigzag ?? 0.06;
723
- const tip_up = lvl_cfg.tip_upcurl ?? 0.18;
724
-
725
- // Horizontal emergence direction of this branch for outward radial consistency near the trunk centerline
726
- const emerge_horiz_len = Math.hypot(job.tx, job.tz);
727
- const emerge_hx = emerge_horiz_len > 1e-4 ? job.tx / emerge_horiz_len : cur_rx;
728
- const emerge_hz = emerge_horiz_len > 1e-4 ? job.tz / emerge_horiz_len : cur_rz;
729
-
730
- // heading that straightness pulls back towards: the bud's, re-aimed by a split for the fork that continues
731
- let aim_x = job.tx;
732
- let aim_y = job.ty;
733
- let aim_z = job.tz;
734
-
735
- for (let s = job.start_seg + 1; s <= N_seg; s++) {
736
- const t_prev = (s - 1) / N_seg;
737
- const t_curr = s / N_seg;
738
- const t_shape = lerp(job.cum_t0, job.cum_t1, t_curr);
739
-
740
- // 1. Intrinsic S-curve pitch curvature (zero-mean higher harmonic on trunk so trunk weaves rather than leaning)
741
- let s_wave = level === 0
742
- ? (lvl_cfg.curvature * Math.sin(PI2 * 1.5 * t_shape + phase_hash * PI2))
743
- : (lvl_cfg.curve_back !== 0.0
744
- ? (lvl_cfg.curvature * Math.cos(Math.PI * t_shape) + lvl_cfg.curve_back * Math.sin(PI2 * t_shape))
745
- : lvl_cfg.curvature);
746
- // Attenuate negative (inward-toward-parent) pitch curvature on steep upper-crown insertions
747
- // so upper lateral branches never curve backward across the parent stem axis.
748
- if (level >= 1 && s_wave < 0.0 && job.parent_attach_t > 0.60) {
749
- s_wave *= clamp(1.0 - (job.parent_attach_t - 0.60) * 2.2, 0.15, 1.0);
750
- }
751
- const d_pitch = s_wave / Math.max(2, N_shape * 0.65);
752
-
753
- if (Math.abs(d_pitch) > 1e-6) {
754
- rotate_around_axis(rot_scratch, cur_tx, cur_ty, cur_tz, cur_sx, cur_sy, cur_sz, d_pitch);
755
- cur_tx = rot_scratch[0];
756
- cur_ty = rot_scratch[1];
757
- cur_tz = rot_scratch[2];
758
- rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, cur_sx, cur_sy, cur_sz, d_pitch);
759
- cur_rx = rot_scratch[0];
760
- cur_ry = rot_scratch[1];
761
- cur_rz = rot_scratch[2];
762
- }
763
-
764
- // 2. Helical spiral twist around T
765
- if (Math.abs(lvl_cfg.spiral_twist) > 1e-6) {
766
- const d_twist = lvl_cfg.spiral_twist / N_shape;
767
- rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, cur_tx, cur_ty, cur_tz, d_twist);
768
- cur_rx = rot_scratch[0];
769
- cur_ry = rot_scratch[1];
770
- cur_rz = rot_scratch[2];
771
- cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
772
- cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
773
- cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
774
- }
775
-
776
- // 2b. Sympodial Nodal Kinking at scheduled lateral child emissions + Internodal Zig-Zag
777
- let kink_rx = 0.0;
778
- let kink_ry = 0.0;
779
- let kink_rz = 0.0;
780
-
781
- if (k_symp > 0.0) {
782
- for (let c = 0; c < scheduled_children.length; c++) {
783
- const sc = scheduled_children[c];
784
- if (sc.rule.parent_kink > 0.0 && sc.t_attach >= t_prev && sc.t_attach <= t_curr) {
785
- // Recoil away from child branch emission azimuth phi
786
- const c_phi = Math.cos(sc.phi);
787
- const s_phi = Math.sin(sc.phi);
788
- const em_x = c_phi * cur_rx + s_phi * cur_sx;
789
- const em_y = c_phi * cur_ry + s_phi * cur_sy;
790
- const em_z = c_phi * cur_rz + s_phi * cur_sz;
791
- const apical_boost = sc.t_attach > 0.85 ? 1.35 : 1.0;
792
- const recoil = k_symp * sc.rule.parent_kink * (level === 0 ? 0.34 : 0.48) * apical_boost * (0.75 + 0.5 * rng());
793
- kink_rx -= em_x * recoil;
794
- kink_ry -= em_y * recoil;
795
- kink_rz -= em_z * recoil;
796
- }
797
- }
798
- }
799
-
800
- if (zig_base > 0.0) {
801
- const z_sign = (s & 1) === 0 ? 1.0 : -1.0;
802
- const z_phi = phase_hash * PI2 + s * 0.85;
803
- const zx = Math.cos(z_phi) * cur_rx + Math.sin(z_phi) * cur_sx;
804
- const zy = Math.cos(z_phi) * cur_ry + Math.sin(z_phi) * cur_sy;
805
- const zz = Math.cos(z_phi) * cur_rz + Math.sin(z_phi) * cur_sz;
806
- const z_amp = zig_base * z_sign * (0.7 + 0.6 * rng());
807
- kink_rx += zx * z_amp;
808
- kink_ry += zy * z_amp;
809
- kink_rz += zz * z_amp;
810
- }
811
-
812
- const kink_mag = Math.hypot(kink_rx, kink_ry, kink_rz);
813
- if (kink_mag > 1e-5) {
814
- const kx = kink_rx / kink_mag;
815
- const ky = kink_ry / kink_mag;
816
- const kz = kink_rz / kink_mag;
817
- // Bend axis = T x K
818
- let bx = cur_ty * kz - cur_tz * ky;
819
- let by = cur_tz * kx - cur_tx * kz;
820
- let bz = cur_tx * ky - cur_ty * kx;
821
- const b_len = Math.hypot(bx, by, bz);
822
- if (b_len > 1e-6) {
823
- bx /= b_len;
824
- by /= b_len;
825
- bz /= b_len;
826
- const clamped_kink = Math.min(0.42, kink_mag);
827
- rotate_around_axis(rot_scratch, cur_tx, cur_ty, cur_tz, bx, by, bz, clamped_kink);
828
- cur_tx = rot_scratch[0];
829
- cur_ty = rot_scratch[1];
830
- cur_tz = rot_scratch[2];
831
- rotate_around_axis(rot_scratch, cur_rx, cur_ry, cur_rz, bx, by, bz, clamped_kink);
832
- cur_rx = rot_scratch[0];
833
- cur_ry = rot_scratch[1];
834
- cur_rz = rot_scratch[2];
835
- cur_sx = cur_ty * cur_rz - cur_tz * cur_ry;
836
- cur_sy = cur_tz * cur_rx - cur_tx * cur_rz;
837
- cur_sz = cur_tx * cur_ry - cur_ty * cur_rx;
838
- }
839
- }
840
-
841
- // 3. Biomechanical Tropism steering (Gravitropic sag + Terminal Phototropic Up-Curl + Outward spread)
842
- let steer_x = 0.0;
843
- let steer_y = 0.0;
844
- let steer_z = 0.0;
845
-
846
- if (level === 0 && branch_id === 0) {
847
- // Orthotropic upward striving & plumb-line righting reflex along guide curve (default vertical +Y)
848
- evaluate_trunk_guide(SCRATCH_GUIDE_P0, SCRATCH_GUIDE_T, species.trunk_guide, t_prev, job.length);
849
- evaluate_trunk_guide(SCRATCH_GUIDE_P1, SCRATCH_GUIDE_T, species.trunk_guide, t_curr, job.length);
850
- const gtx = SCRATCH_GUIDE_T[0];
851
- const gty = SCRATCH_GUIDE_T[1];
852
- const gtz = SCRATCH_GUIDE_T[2];
853
-
854
- const is_conifer = lvl_cfg.excurrent;
855
- const apical_relax = (!is_conifer && (t_shape > 0.80 || job.has_split)) ? 0.55 : 1.0;
856
- const righting = (1.65 + Math.max(0.0, -lvl_cfg.gravitropism) * 2.5 + Math.max(0.0, lvl_cfg.phototropism)) * apical_relax;
857
- steer_x += gtx * righting;
858
- steer_y += gty * righting;
859
- steer_z += gtz * righting;
860
-
861
- // Plumb-line centering force pulling lateral drift back toward the guide curve
862
- const dx_g = cur_px - SCRATCH_GUIDE_P0[0];
863
- const dy_g = cur_py - SCRATCH_GUIDE_P0[1];
864
- const dz_g = cur_pz - SCRATCH_GUIDE_P0[2];
865
- const dot_g = dx_g * gtx + dy_g * gty + dz_g * gtz;
866
- const lat_x = dx_g - dot_g * gtx;
867
- const lat_y = dy_g - dot_g * gty;
868
- const lat_z = dz_g - dot_g * gtz;
869
- const plumb_k = ((is_conifer ? 5.2 : 3.4) * apical_relax) / Math.max(1.0, job.length);
870
- steer_x -= lat_x * plumb_k * N_seg * 0.5;
871
- steer_y -= lat_y * plumb_k * N_seg * 0.5;
872
- steer_z -= lat_z * plumb_k * N_seg * 0.5;
873
- } else if (level === 0 && branch_id > 0) {
874
- // Secondary bifurcated trunk leader (fork): ascend skyward while preserving fork divergence
875
- steer_x += emerge_hx * 0.35;
876
- steer_y += 1.25 + Math.max(0.0, lvl_cfg.phototropism);
877
- steer_z += emerge_hz * 0.35;
878
- } else {
879
- if (lvl_cfg.gravitropism !== 0.0 || tip_up !== 0.0) {
880
- // Continuous blend from cantilever mid-branch sag arch (sin(pi * t^0.75)) to
881
- // pendulous weeping cascade (0.65 + 0.95 * t) based on gravitropism vs. tip_upcurl
882
- const w_pendulous = level >= 2
883
- ? clamp((lvl_cfg.gravitropism - 0.35 - 0.5 * Math.max(0.0, tip_up)) / 0.45, 0.0, 1.0)
884
- : 0.0;
885
- const arch_grav_env = Math.sin(Math.PI * Math.pow(t_shape, 0.75));
886
- const weep_grav_env = 0.65 + 0.95 * t_shape;
887
- const grav_env = lerp(arch_grav_env, weep_grav_env, w_pendulous);
888
- const apical_grav_atten = level === 1 && job.parent_attach_t > 0.75 && w_pendulous < 0.1
889
- ? clamp(1.0 - (job.parent_attach_t - 0.75) * 3.2, 0.15, 1.0)
890
- : 1.0;
891
- const up_env = t_shape * t_shape * (1.0 + 0.5 * Math.max(0.0, -cur_ty));
892
- steer_y += -lvl_cfg.gravitropism * grav_env * apical_grav_atten + tip_up * up_env;
893
- }
894
-
895
- if (lvl_cfg.phototropism !== 0.0) {
896
- const sky_mix = crown.sky_phototropism_mix;
897
- const horiz_r = Math.sqrt(cur_px * cur_px + cur_pz * cur_pz);
898
- let out_x = 0.0;
899
- let out_z = 0.0;
900
- if (horiz_r > 0.52) {
901
- out_x = cur_px / horiz_r;
902
- out_z = cur_pz / horiz_r;
903
- } else if (horiz_r > 1e-4) {
904
- const w_rad = horiz_r / 0.52;
905
- const bx = lerp(emerge_hx, cur_px / horiz_r, w_rad);
906
- const bz = lerp(emerge_hz, cur_pz / horiz_r, w_rad);
907
- const bl = Math.hypot(bx, bz) || 1.0;
908
- out_x = bx / bl;
909
- out_z = bz / bl;
910
- } else {
911
- out_x = emerge_hx;
912
- out_z = emerge_hz;
913
- }
914
-
915
- steer_x += lvl_cfg.phototropism * (1.0 - sky_mix) * out_x;
916
- steer_y += lvl_cfg.phototropism * sky_mix;
917
- steer_z += lvl_cfg.phototropism * (1.0 - sky_mix) * out_z;
918
- }
919
- }
920
-
921
- // 4. 2-Octave 3D Curl Noise gnarl scaled properly by sqrt(6 / N_seg)
922
- if (lvl_cfg.gnarl_strength > 0.0) {
923
- const freq = lvl_cfg.gnarl_frequency;
924
- curl_noise_3d(
925
- SCRATCH_CURL,
926
- cur_px * freq + noise_ox + level * 17.3,
927
- cur_py * freq + noise_oy + level * 31.7,
928
- cur_pz * freq + noise_oz + level * 47.1
929
- );
930
- const c1x = SCRATCH_CURL[0], c1y = SCRATCH_CURL[1], c1z = SCRATCH_CURL[2];
931
- curl_noise_3d(
932
- SCRATCH_CURL,
933
- cur_px * freq * 2.15 + noise_ox + 53.1 + phase_hash * 29.3,
934
- cur_py * freq * 2.15 + noise_oy + 79.3,
935
- cur_pz * freq * 2.15 + noise_oz + 113.7
936
- );
937
- const cx_tot = 0.68 * c1x + 0.32 * SCRATCH_CURL[0];
938
- const cy_tot = 0.68 * c1y + 0.32 * SCRATCH_CURL[1];
939
- const cz_tot = 0.68 * c1z + 0.32 * SCRATCH_CURL[2];
940
-
941
- const gnarl_scale = lvl_cfg.gnarl_strength * Math.sqrt(6.0 / Math.max(2, N_shape));
942
- // Project curl vector perpendicular to T so it steers direction cleanly
943
- const dot_ct = cx_tot * cur_tx + cy_tot * cur_ty + cz_tot * cur_tz;
944
- steer_x += (cx_tot - dot_ct * cur_tx) * gnarl_scale * 2.2;
945
- steer_y += (cy_tot - dot_ct * cur_ty) * gnarl_scale * 1.6;
946
- steer_z += (cz_tot - dot_ct * cur_tz) * gnarl_scale * 2.2;
947
- }
948
-
949
- // 4b. A plagiotropic shoot is pulled towards the horizontal; straightness pulls back towards the bud's heading
950
- if (level >= 1 && lvl_cfg.plagiotropism > 0.0) {
951
- steer_y -= lvl_cfg.plagiotropism * cur_ty;
952
- }
953
- if (lvl_cfg.straightness > 0.0 && !(level === 0 && branch_id === 0)) {
954
- steer_x += lvl_cfg.straightness * (aim_x - cur_tx);
955
- steer_y += lvl_cfg.straightness * (aim_y - cur_ty);
956
- steer_z += lvl_cfg.straightness * (aim_z - cur_tz);
957
- }
958
-
959
- // 5. Space colonization attraction steering (for branches in crown, level >= 1)
960
- if (use_space_col && level >= 1 && job.in_crown && attr_grid !== null) {
961
- let attr_vx = 0.0;
962
- let attr_vy = 0.0;
963
- let attr_vz = 0.0;
964
- let attr_hits = 0;
965
-
966
- attr_grid.forEachNear(cur_px, cur_py, cur_pz, (idx) => {
967
- if (attr_alive[idx] === 0) return;
968
- const ax = attr_positions[idx * 3] - cur_px;
969
- const ay = attr_positions[idx * 3 + 1] - cur_py;
970
- const az = attr_positions[idx * 3 + 2] - cur_pz;
971
- const d2 = ax * ax + ay * ay + az * az;
972
- if (d2 <= r_kill_sq) {
973
- attr_alive[idx] = 0;
974
- } else if (d2 <= r_influence_sq && d2 > 1e-8) {
975
- const inv_d = 1.0 / Math.sqrt(d2);
976
- attr_vx += ax * inv_d;
977
- attr_vy += ay * inv_d;
978
- attr_vz += az * inv_d;
979
- attr_hits++;
980
- }
981
- });
982
-
983
- if (attr_hits > 0) {
984
- const attr_len = Math.sqrt(attr_vx * attr_vx + attr_vy * attr_vy + attr_vz * attr_vz);
985
- if (attr_len > 1e-6) {
986
- const w_sc = crown.space_colonization_weight / attr_len;
987
- steer_x += attr_vx * w_sc;
988
- steer_y += attr_vy * w_sc;
989
- steer_z += attr_vz * w_sc;
990
- }
991
- }
992
- }
993
-
994
- // 6. Crown envelope soft containment for lateral branches (level >= 1)
995
- let seg_len = step_len;
996
- if (level >= 1 && job.in_crown && crown.prune_ratio > 0.0) {
997
- const probe_x = cur_px + cur_tx * step_len;
998
- const probe_y = cur_py + cur_ty * step_len;
999
- const probe_z = cur_pz + cur_tz * step_len;
1000
- const sdf = crown_envelope_sdf(probe_x, probe_y, probe_z, crown);
1001
- if (sdf > 0.0) {
1002
- // Steer radially inward toward trunk axis (only pulling vertically if outside vertical crown span)
1003
- const crown_top_y = crown.base_height + crown.height;
1004
- const to_cx = -probe_x;
1005
- const to_cy = probe_y > crown_top_y
1006
- ? crown_top_y - probe_y
1007
- : (probe_y < crown.base_height ? crown.base_height - probe_y : 0.0);
1008
- const to_cz = -probe_z;
1009
- const to_c_len = Math.sqrt(to_cx * to_cx + to_cy * to_cy + to_cz * to_cz);
1010
- if (to_c_len > 1e-5) {
1011
- const pull = crown.prune_ratio * 0.45 / to_c_len;
1012
- steer_x += to_cx * pull;
1013
- steer_y += to_cy * pull;
1014
- steer_z += to_cz * pull;
1015
- }
1016
- seg_len *= Math.max(0.35, 1.0 - crown.prune_ratio * 0.5);
1017
- }
1018
- }
1019
-
1020
- // Compute target radius r_curr for this segment before BVH collision checks
1021
- const t_spine = t_shape;
1022
- const u_prof = prof_span > 1e-4
1023
- ? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(t_spine)) / prof_span, 0.0, 1.0)
1024
- : t_spine;
1025
- const min_tip_frac = level === 0 ? 0.12 : (has_children ? 0.14 : 0.24);
1026
- const apical_shoot_taper = level === 0
1027
- ? (t_spine > 0.65 ? lerp(1.0, 0.11, Math.pow((t_spine - 0.65) / 0.35, 1.45)) : 1.0)
1028
- : (has_children && t_curr > 0.80 ? lerp(1.0, 0.62, Math.pow((t_curr - 0.80) / 0.20, 1.35)) : 1.0);
1029
- const r_curr = Math.max(
1030
- level === 0 ? 0.0015 : 0.002,
1031
- job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_prof, min_tip_frac) * apical_shoot_taper
1032
- );
1033
- const r_prev = out.node_read_radius(prev_v);
1034
- const local_seg_idx = branch_edges.length;
1035
- const parent_bA = job.parent_branch_id;
1036
- const attach_seg_A = job.parent_attach_seg_idx ?? -1;
1037
- const is_split_A = Boolean(job.is_split_fork);
1038
-
1039
- // 6b. Soft BVH Repulsion Field (steers growing shoot smoothly around nearby existing branches)
1040
- if ((level >= 1 || branch_id > 0) && bvh.size > 0) {
1041
- const look_len = seg_len * 1.55;
1042
- const look_x = cur_px + cur_tx * look_len;
1043
- const look_y = cur_py + cur_ty * look_len;
1044
- const look_z = cur_pz + cur_tz * look_len;
1045
- const soft_margin = Math.max(0.08, Math.min(0.24, seg_len * 0.65));
1046
-
1047
- query_capsule[0] = cur_px;
1048
- query_capsule[1] = cur_py;
1049
- query_capsule[2] = cur_pz;
1050
- query_capsule[3] = look_x;
1051
- query_capsule[4] = look_y;
1052
- query_capsule[5] = look_z;
1053
- query_capsule[6] = Math.max(r_prev, r_curr) * 1.15 + soft_margin;
1054
-
1055
- const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
1056
- for (let h = 0; h < hit_count; h++) {
1057
- const eB = bvh_hits[h];
1058
- const bB = seg_branch_id[eB];
1059
- const local_idx_B = seg_local_idx[eB];
1060
- if (!resolve_subsegment_bounds(
1061
- branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
1062
- bB, out.branch_parent[bB], branch_parent_seg_idx[bB], branch_is_split_fork[bB], local_idx_B,
1063
- sub_bounds
1064
- )) {
1065
- continue;
1066
- }
1067
-
1068
- const s_min = sub_bounds[0];
1069
- const t_min = sub_bounds[1];
1070
- const sa0x = cur_px + (look_x - cur_px) * s_min;
1071
- const sa0y = cur_py + (look_y - cur_py) * s_min;
1072
- const sa0z = cur_pz + (look_z - cur_pz) * s_min;
1073
-
1074
- const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
1075
- const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
1076
- const sb0x = b0x + (b1x - b0x) * t_min;
1077
- const sb0y = b0y + (b1y - b0y) * t_min;
1078
- const sb0z = b0z + (b1z - b0z) * t_min;
1079
-
1080
- line3_compute_segment_segment_closest_points(
1081
- closest_st,
1082
- sa0x, sa0y, sa0z, look_x, look_y, look_z,
1083
- sb0x, sb0y, sb0z, b1x, b1y, b1z
1084
- );
1085
-
1086
- const s_f = s_min + (1.0 - s_min) * closest_st[0];
1087
- const t_f = t_min + (1.0 - t_min) * closest_st[1];
1088
-
1089
- const qAx = cur_px + (look_x - cur_px) * s_f;
1090
- const qAy = cur_py + (look_y - cur_py) * s_f;
1091
- const qAz = cur_pz + (look_z - cur_pz) * s_f;
1092
- const qBx = b0x + (b1x - b0x) * t_f;
1093
- const qBy = b0y + (b1y - b0y) * t_f;
1094
- const qBz = b0z + (b1z - b0z) * t_f;
1095
-
1096
- const dx = qAx - qBx;
1097
- const dy = qAy - qBy;
1098
- const dz = qAz - qBz;
1099
- const dist = Math.hypot(dx, dy, dz);
1100
- const rA = r_prev + (r_curr - r_prev) * Math.min(1.0, s_f);
1101
- const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
1102
- const r_req = (rA + rB) * 1.12 + 0.005;
1103
-
1104
- if (dist < r_req + soft_margin) {
1105
- let nx = dist > 1e-5 ? dx / dist : cur_rx;
1106
- let ny = dist > 1e-5 ? dy / dist : cur_ry;
1107
- let nz = dist > 1e-5 ? dz / dist : cur_rz;
1108
- // Project repulsion normal perpendicular to cur_T so it steers smoothly around the obstacle
1109
- const dot_nt = nx * cur_tx + ny * cur_ty + nz * cur_tz;
1110
- nx -= dot_nt * cur_tx;
1111
- ny -= dot_nt * cur_ty;
1112
- nz -= dot_nt * cur_tz;
1113
- const n_len = Math.hypot(nx, ny, nz);
1114
- if (n_len > 1e-5) {
1115
- nx /= n_len;
1116
- ny /= n_len;
1117
- nz /= n_len;
1118
- const u_prox = clamp(1.0 - Math.max(0.0, dist - r_req) / soft_margin, 0.0, 1.0);
1119
- const rep_w = u_prox * u_prox * 2.8;
1120
- steer_x += nx * rep_w;
1121
- steer_y += ny * rep_w;
1122
- steer_z += nz * rep_w;
1123
- }
1124
- }
1125
- }
1126
- }
1127
-
1128
- // Apply steering to tangent and normalize
1129
- const steer_div = Math.max(2.0, Math.sqrt(N_shape) * 1.35);
1130
- let next_tx = cur_tx + steer_x / steer_div;
1131
- let next_ty = cur_ty + steer_y / steer_div;
1132
- let next_tz = cur_tz + steer_z / steer_div;
1133
- const t_len = Math.sqrt(next_tx * next_tx + next_ty * next_ty + next_tz * next_tz);
1134
- if (t_len > 1e-12) {
1135
- next_tx /= t_len;
1136
- next_ty /= t_len;
1137
- next_tz /= t_len;
1138
- } else {
1139
- next_tx = cur_tx;
1140
- next_ty = cur_ty;
1141
- next_tz = cur_tz;
1142
- }
1143
-
1144
- let next_px = cur_px + 0.5 * (cur_tx + next_tx) * seg_len;
1145
- let next_py = cur_py + 0.5 * (cur_ty + next_ty) * seg_len;
1146
- let next_pz = cur_pz + 0.5 * (cur_tz + next_tz) * seg_len;
1147
-
1148
- // Orthotropic plumb-tube containment on trunk (level === 0):
1149
- // Preserves local 3D nodal kinks and serpentine sweep while guaranteeing the trunk never drifts sideways
1150
- if (level === 0 && branch_id === 0) {
1151
- const gx = SCRATCH_GUIDE_P1[0];
1152
- const gy = SCRATCH_GUIDE_P1[1];
1153
- const gz = SCRATCH_GUIDE_P1[2];
1154
- const gtx = SCRATCH_GUIDE_T[0];
1155
- const gty = SCRATCH_GUIDE_T[1];
1156
- const gtz = SCRATCH_GUIDE_T[2];
1157
-
1158
- const dx = next_px - gx;
1159
- const dy = next_py - gy;
1160
- const dz = next_pz - gz;
1161
- const dot_g = dx * gtx + dy * gty + dz * gtz;
1162
- const off_x = dx - dot_g * gtx;
1163
- const off_y = dy - dot_g * gty;
1164
- const off_z = dz - dot_g * gtz;
1165
- const off_r = Math.hypot(off_x, off_y, off_z);
1166
-
1167
- const is_conifer = lvl_cfg.excurrent;
1168
- const max_drift_frac = is_conifer ? 0.032 : (job.has_split ? 0.078 : 0.058);
1169
- // Envelope rises from 0 at root, peaks in mid-trunk (allowing 3D sweep/crookedness), and tapers near tip
1170
- const env = Math.sin(Math.PI * Math.min(0.92, t_curr * 0.88)) * (1.0 - 0.38 * t_curr * t_curr);
1171
- const max_r = job.length * max_drift_frac * Math.max(job.has_split ? 0.42 : 0.18, env);
1172
-
1173
- if (off_r > max_r && off_r > 1e-6) {
1174
- const scale_r = max_r / off_r;
1175
- next_px = gx + dot_g * gtx + off_x * scale_r;
1176
- next_py = gy + dot_g * gty + off_y * scale_r;
1177
- next_pz = gz + dot_g * gtz + off_z * scale_r;
1178
-
1179
- let ch_x = next_px - cur_px;
1180
- let ch_y = next_py - cur_py;
1181
- let ch_z = next_pz - cur_pz;
1182
- const ch_l = Math.hypot(ch_x, ch_y, ch_z);
1183
- if (ch_l > 1e-6) {
1184
- next_tx = ch_x / ch_l;
1185
- next_ty = ch_y / ch_l;
1186
- next_tz = ch_z / ch_l;
1187
- }
1188
- }
1189
- }
1190
-
1191
- // 6c. Monotonic Parent Collar Escape + Hard BVH Capsule Contact Projection & Self-Pruning
1192
- if ((level >= 1 || branch_id > 0) && bvh.size > 0) {
1193
- let was_projected = false;
1194
-
1195
- // Ensure lateral child branch exits its parent attachment segment cleanly on local_seg_idx <= 1
1196
- if (job.parent_edge_id >= 0 && !is_split_A && local_seg_idx <= 1) {
1197
- const eP = job.parent_edge_id;
1198
- const p0x = seg_p0x[eP], p0y = seg_p0y[eP], p0z = seg_p0z[eP];
1199
- const p1x = seg_p1x[eP], p1y = seg_p1y[eP], p1z = seg_p1z[eP];
1200
-
1201
- line3_compute_segment_segment_closest_points(
1202
- closest_st,
1203
- next_px, next_py, next_pz, next_px, next_py, next_pz,
1204
- p0x, p0y, p0z, p1x, p1y, p1z
1205
- );
1206
- const t_p = closest_st[1];
1207
- const qPx = p0x + (p1x - p0x) * t_p;
1208
- const qPy = p0y + (p1y - p0y) * t_p;
1209
- const qPz = p0z + (p1z - p0z) * t_p;
1210
- const r_p = seg_r0[eP] + (seg_r1[eP] - seg_r0[eP]) * t_p;
1211
-
1212
- let rx_p = next_px - qPx;
1213
- let ry_p = next_py - qPy;
1214
- let rz_p = next_pz - qPz;
1215
- const d_p = Math.hypot(rx_p, ry_p, rz_p);
1216
- if (local_seg_idx === 0 && (r_p + r_curr) * 1.18 > seg_len) {
1217
- seg_len = (r_p + r_curr) * 1.18;
1218
- }
1219
- const min_d_p = local_seg_idx === 0
1220
- ? Math.min(seg_len * 0.88, (r_p + r_curr) * 1.05)
1221
- : (r_p + r_curr) * 1.10 + 0.004;
1222
-
1223
- const em_drx = job.emerge_drx ?? cur_rx;
1224
- const em_dry = job.emerge_dry ?? cur_ry;
1225
- const em_drz = job.emerge_drz ?? cur_rz;
1226
- const dot_em = rx_p * em_drx + ry_p * em_dry + rz_p * em_drz;
1227
-
1228
- if (d_p < min_d_p || dot_em < 0.0) {
1229
- const ux_p = (d_p > 1e-5 && dot_em > 0.0) ? rx_p / d_p : em_drx;
1230
- const uy_p = (d_p > 1e-5 && dot_em > 0.0) ? ry_p / d_p : em_dry;
1231
- const uz_p = (d_p > 1e-5 && dot_em > 0.0) ? rz_p / d_p : em_drz;
1232
- const push_d = Math.max(0.0, min_d_p - (dot_em > 0.0 ? d_p : -d_p));
1233
- next_px += ux_p * push_d;
1234
- next_py += uy_p * push_d;
1235
- next_pz += uz_p * push_d;
1236
-
1237
- let ch_x = next_px - cur_px;
1238
- let ch_y = next_py - cur_py;
1239
- let ch_z = next_pz - cur_pz;
1240
- const ch_l = Math.hypot(ch_x, ch_y, ch_z);
1241
- if (ch_l > 1e-6) {
1242
- next_tx = ch_x / ch_l;
1243
- next_ty = ch_y / ch_l;
1244
- next_tz = ch_z / ch_l;
1245
- next_px = cur_px + next_tx * seg_len;
1246
- next_py = cur_py + next_ty * seg_len;
1247
- next_pz = cur_pz + next_tz * seg_len;
1248
- was_projected = true;
1249
- }
1250
- }
1251
- }
1252
-
1253
- // Iterative BVH capsule contact projection
1254
- for (let iter = 0; iter < 4; iter++) {
1255
- query_capsule[0] = cur_px;
1256
- query_capsule[1] = cur_py;
1257
- query_capsule[2] = cur_pz;
1258
- query_capsule[3] = next_px;
1259
- query_capsule[4] = next_py;
1260
- query_capsule[5] = next_pz;
1261
- query_capsule[6] = Math.max(r_prev, r_curr) * 1.15 + 0.025;
1262
-
1263
- const hit_count = bvh_query_user_data_intersects_capsule(bvh_hits, 0, bvh, query_capsule);
1264
- let moved = false;
1265
-
1266
- for (let h = 0; h < hit_count; h++) {
1267
- const eB = bvh_hits[h];
1268
- const bB = seg_branch_id[eB];
1269
- const local_idx_B = seg_local_idx[eB];
1270
- if (!resolve_subsegment_bounds(
1271
- branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
1272
- bB, out.branch_parent[bB], branch_parent_seg_idx[bB], branch_is_split_fork[bB], local_idx_B,
1273
- sub_bounds
1274
- )) {
1275
- continue;
1276
- }
1277
-
1278
- const s_min = sub_bounds[0];
1279
- const t_min = sub_bounds[1];
1280
- const sa0x = cur_px + (next_px - cur_px) * s_min;
1281
- const sa0y = cur_py + (next_py - cur_py) * s_min;
1282
- const sa0z = cur_pz + (next_pz - cur_pz) * s_min;
1283
-
1284
- const b0x = seg_p0x[eB], b0y = seg_p0y[eB], b0z = seg_p0z[eB];
1285
- const b1x = seg_p1x[eB], b1y = seg_p1y[eB], b1z = seg_p1z[eB];
1286
- const sb0x = b0x + (b1x - b0x) * t_min;
1287
- const sb0y = b0y + (b1y - b0y) * t_min;
1288
- const sb0z = b0z + (b1z - b0z) * t_min;
1289
-
1290
- line3_compute_segment_segment_closest_points(
1291
- closest_st,
1292
- sa0x, sa0y, sa0z, next_px, next_py, next_pz,
1293
- sb0x, sb0y, sb0z, b1x, b1y, b1z
1294
- );
1295
-
1296
- const s_f = s_min + (1.0 - s_min) * closest_st[0];
1297
- const t_f = t_min + (1.0 - t_min) * closest_st[1];
1298
- if (local_seg_idx === 0 && s_f <= 0.05) continue;
1299
-
1300
- const qAx = cur_px + (next_px - cur_px) * s_f;
1301
- const qAy = cur_py + (next_py - cur_py) * s_f;
1302
- const qAz = cur_pz + (next_pz - cur_pz) * s_f;
1303
- const qBx = b0x + (b1x - b0x) * t_f;
1304
- const qBy = b0y + (b1y - b0y) * t_f;
1305
- const qBz = b0z + (b1z - b0z) * t_f;
1306
-
1307
- const dx = qAx - qBx;
1308
- const dy = qAy - qBy;
1309
- const dz = qAz - qBz;
1310
- const dist = Math.hypot(dx, dy, dz);
1311
- const rA = r_prev + (r_curr - r_prev) * s_f;
1312
- const rB = seg_r0[eB] + (seg_r1[eB] - seg_r0[eB]) * t_f;
1313
- const r_req = (rA + rB) * 1.08 + 0.004;
1314
-
1315
- if (dist < r_req) {
1316
- let nx = dist > 1e-5 ? dx / dist : cur_rx;
1317
- let ny = dist > 1e-5 ? dy / dist : cur_ry;
1318
- let nz = dist > 1e-5 ? dz / dist : cur_rz;
1319
- const push = (r_req - dist + 0.004) / Math.max(0.35, s_f);
1320
- next_px += nx * push;
1321
- next_py += ny * push;
1322
- next_pz += nz * push;
1323
-
1324
- let ch_x = next_px - cur_px;
1325
- let ch_y = next_py - cur_py;
1326
- let ch_z = next_pz - cur_pz;
1327
- const ch_l = Math.hypot(ch_x, ch_y, ch_z);
1328
- if (ch_l > 1e-6) {
1329
- next_tx = ch_x / ch_l;
1330
- next_ty = ch_y / ch_l;
1331
- next_tz = ch_z / ch_l;
1332
- next_px = cur_px + next_tx * seg_len;
1333
- next_py = cur_py + next_ty * seg_len;
1334
- next_pz = cur_pz + next_tz * seg_len;
1335
- moved = true;
1336
- was_projected = true;
1337
- }
1338
- }
1339
- }
1340
- if (!moved) break;
1341
- }
1342
-
1343
- // If segment >= 1 still penetrates an existing branch or was forced into an unnatural sharp reversal,
1344
- // self-prune / arrest the branch at prev_v so it never spears through another bough.
1345
- if (local_seg_idx >= 1) {
1346
- const final_clear = evaluate_candidate_clearance(
1347
- branch_id, parent_bA, attach_seg_A, is_split_A, local_seg_idx,
1348
- cur_px, cur_py, cur_pz, r_prev,
1349
- next_px, next_py, next_pz, r_curr,
1350
- -0.004
1351
- );
1352
- const turn_cos = cur_tx * next_tx + cur_ty * next_ty + cur_tz * next_tz;
1353
- if (final_clear < 0.0 || (was_projected && turn_cos < 0.25)) {
1354
- break;
1355
- }
1356
- } else if (was_projected) {
1357
- // Keep root node tangent aligned with projected first segment so base collar has zero S-hook
1358
- cur_tx = next_tx;
1359
- cur_ty = next_ty;
1360
- cur_tz = next_tz;
1361
- out.node_write_tangent(prev_v, cur_tx, cur_ty, cur_tz);
1362
- }
1363
- }
1364
-
1365
- // Structural surface root: creep along the ground plane y = 0 while sinking into it, its centreline at
1366
- // r(t) - 2 r_base t: it leaves the stem fully exposed and its top drops by twice its base radius over
1367
- // its length, so it dissolves into the soil about halfway out and its tip is never seen. Applied after all
1368
- // steering and contact handling so nothing lifts it off or pushes it under; the first segment keeps
1369
- // the bud's heading so the root leaves the stem where it was planted (e.g. on a flare lobe crest).
1370
- if (lvl_cfg.root) {
1371
- let hx = local_seg_idx === 0 ? emerge_hx : next_px - cur_px;
1372
- let hz = local_seg_idx === 0 ? emerge_hz : next_pz - cur_pz;
1373
- let h_len = Math.hypot(hx, hz);
1374
- if (h_len < 1e-6) {
1375
- hx = emerge_hx;
1376
- hz = emerge_hz;
1377
- h_len = Math.hypot(hx, hz) || 1.0;
1378
- }
1379
- hx /= h_len;
1380
- hz /= h_len;
1381
- const dy = clamp(r_curr - 2.0 * job.base_radius * t_curr - cur_py, -0.7 * seg_len, 0.7 * seg_len);
1382
- const h_step = Math.sqrt(seg_len * seg_len - dy * dy);
1383
- next_px = cur_px + hx * h_step;
1384
- next_py = cur_py + dy;
1385
- next_pz = cur_pz + hz * h_step;
1386
- // arrive following the sinking profile, whose slope along the root is -(2 + taper) r_base / length
1387
- const sink_slope = -(2.0 + lvl_cfg.taper) * job.base_radius / Math.max(1e-3, job.length);
1388
- const t_norm_len = Math.hypot(1.0, sink_slope);
1389
- next_tx = hx / t_norm_len;
1390
- next_ty = sink_slope / t_norm_len;
1391
- next_tz = hz / t_norm_len;
1392
- if (local_seg_idx === 0) {
1393
- // the root node leaves along its first chord, as a projected collar escape would
1394
- cur_tx = (next_px - cur_px) / seg_len;
1395
- cur_ty = (next_py - cur_py) / seg_len;
1396
- cur_tz = (next_pz - cur_pz) / seg_len;
1397
- out.node_write_tangent(prev_v, cur_tx, cur_ty, cur_tz);
1398
- }
1399
- }
1400
-
1401
- // Transport RMF via Wang et al. Double Reflection
1402
- spine_frame_double_reflection(
1403
- SCRATCH_RMF, 0,
1404
- cur_px, cur_py, cur_pz,
1405
- cur_tx, cur_ty, cur_tz,
1406
- cur_rx, cur_ry, cur_rz,
1407
- next_px, next_py, next_pz,
1408
- next_tx, next_ty, next_tz
1409
- );
1410
- let next_rx = SCRATCH_RMF[0];
1411
- let next_ry = SCRATCH_RMF[1];
1412
- let next_rz = SCRATCH_RMF[2];
1413
- cur_sx = SCRATCH_RMF[3];
1414
- cur_sy = SCRATCH_RMF[4];
1415
- cur_sz = SCRATCH_RMF[5];
1416
-
1417
- cur_arc_s += seg_len;
1418
-
1419
- const curr_v = out.add_node(
1420
- next_px, next_py, next_pz,
1421
- next_tx, next_ty, next_tz,
1422
- next_rx, next_ry, next_rz,
1423
- r_curr,
1424
- branch_id,
1425
- level,
1426
- job.parent_branch_id,
1427
- t_curr,
1428
- cur_arc_s,
1429
- phase_hash
1430
- );
1431
-
1432
- const edge_id = out.add_segment(
1433
- prev_v,
1434
- curr_v,
1435
- cur_tx * seg_len,
1436
- cur_ty * seg_len,
1437
- cur_tz * seg_len,
1438
- next_tx * seg_len,
1439
- next_ty * seg_len,
1440
- next_tz * seg_len,
1441
- seg_len,
1442
- t_prev === 0.0 ? job.parent_attach_t : t_prev
1443
- );
1444
-
1445
- // Register segment in scope-local BVH
1446
- const bvh_pad = Math.max(r_prev, r_curr) * 1.25 + 0.008;
1447
- const bvh_leaf = bvh.allocate_node();
1448
- bvh.node_set_user_data(bvh_leaf, edge_id);
1449
- bvh.node_set_aabb_primitive(
1450
- bvh_leaf,
1451
- Math.min(cur_px, next_px) - bvh_pad,
1452
- Math.min(cur_py, next_py) - bvh_pad,
1453
- Math.min(cur_pz, next_pz) - bvh_pad,
1454
- Math.max(cur_px, next_px) + bvh_pad,
1455
- Math.max(cur_py, next_py) + bvh_pad,
1456
- Math.max(cur_pz, next_pz) + bvh_pad
1457
- );
1458
- bvh.insert_leaf(bvh_leaf);
1459
-
1460
- seg_branch_id[edge_id] = branch_id;
1461
- seg_local_idx[edge_id] = local_seg_idx;
1462
- seg_p0x[edge_id] = cur_px;
1463
- seg_p0y[edge_id] = cur_py;
1464
- seg_p0z[edge_id] = cur_pz;
1465
- seg_r0[edge_id] = r_prev;
1466
- seg_p1x[edge_id] = next_px;
1467
- seg_p1y[edge_id] = next_py;
1468
- seg_p1z[edge_id] = next_pz;
1469
- seg_r1[edge_id] = r_curr;
1470
- seg_bvh_leaf[edge_id] = bvh_leaf;
1471
-
1472
- branch_edges.push(edge_id);
1473
- branch_edge_t0.push(t_prev);
1474
- branch_edge_t1.push(t_curr);
1475
- branch_vertices.push(curr_v);
1476
-
1477
- out.branch_tip_vertex[branch_id] = curr_v;
1478
- out.branch_length[branch_id] = cur_arc_s - job.initial_arc_s;
1479
-
1480
- // Check for dichotomous / sympodial splitting at interior segments (only when stem is structurally thick enough)
1481
- const min_split_seg = level === 0
1482
- ? Math.max(2, Math.floor(N_seg * 0.5))
1483
- : Math.max(1, Math.floor(N_seg * 0.25));
1484
- if (
1485
- !job.has_split
1486
- && !job.dead
1487
- && lvl_cfg.split_probability > 0.0
1488
- && r_curr >= 0.012
1489
- && s >= min_split_seg
1490
- && s <= Math.floor(N_seg * 0.75)
1491
- && rng() < lvl_cfg.split_probability
1492
- ) {
1493
- job.has_split = true;
1494
- const fork_count = Math.max(2, lvl_cfg.split_count | 0);
1495
- const split_ang = lvl_cfg.split_angle;
1496
- let base_az = rng() * PI2;
1497
-
1498
- // Preserve pre-split orthonormal triad (T, R, S) before deflecting fork 0
1499
- const pre_tx = next_tx, pre_ty = next_ty, pre_tz = next_tz;
1500
- const pre_rx = next_rx, pre_ry = next_ry, pre_rz = next_rz;
1501
- const pre_sx = cur_sx, pre_sy = cur_sy, pre_sz = cur_sz;
1502
-
1503
- // On lateral branches (level >= 1), align the split bend axis toward local vertical (+Y)
1504
- // so the two daughter forks spread horizontally in the canopy rather than pitching into neighbor boughs.
1505
- if (level >= 1) {
1506
- const up_az = Math.atan2(pre_sy, pre_ry);
1507
- const side_sign = base_az < Math.PI ? 1.0 : -1.0;
1508
- base_az = up_az + (side_sign < 0.0 ? Math.PI : 0.0) + ((base_az % Math.PI) / Math.PI - 0.5) * 0.45;
1509
- }
1510
-
1511
- // Current branch deflects as fork 0: rotate both T and R around bend_axis so R remains orthogonal to T
1512
- const fork0_deflect = level === 0 ? split_ang * 0.22 : split_ang * 0.5;
1513
- const bend_axis_x = Math.cos(base_az) * pre_rx + Math.sin(base_az) * pre_sx;
1514
- const bend_axis_y = Math.cos(base_az) * pre_ry + Math.sin(base_az) * pre_sy;
1515
- const bend_axis_z = Math.cos(base_az) * pre_rz + Math.sin(base_az) * pre_sz;
1516
- rotate_around_axis(
1517
- rot_scratch,
1518
- pre_tx, pre_ty, pre_tz,
1519
- bend_axis_x, bend_axis_y, bend_axis_z,
1520
- fork0_deflect
1521
- );
1522
- next_tx = rot_scratch[0];
1523
- next_ty = rot_scratch[1];
1524
- next_tz = rot_scratch[2];
1525
- // fork 0 is aimed where it was deflected to, as the other forks are aimed along their own headings
1526
- aim_x = next_tx;
1527
- aim_y = next_ty;
1528
- aim_z = next_tz;
1529
-
1530
- rotate_around_axis(
1531
- rot_scratch,
1532
- pre_rx, pre_ry, pre_rz,
1533
- bend_axis_x, bend_axis_y, bend_axis_z,
1534
- fork0_deflect
1535
- );
1536
- next_rx = rot_scratch[0];
1537
- next_ry = rot_scratch[1];
1538
- next_rz = rot_scratch[2];
1539
-
1540
- cur_sx = next_ty * next_rz - next_tz * next_ry;
1541
- cur_sy = next_tz * next_rx - next_tx * next_rz;
1542
- cur_sz = next_tx * next_ry - next_ty * next_rx;
1543
-
1544
- // Spawn fork 1..fork_count-1 as continuation branches with their own root vertex connected to curr_v
1545
- const rem_segs = Math.max(1, N_seg - s);
1546
- const rem_fraction = Math.max(0.15, rem_segs / Math.max(1, N_seg));
1547
- const fork_cum_t0 = lerp(job.cum_t0 ?? 0.0, job.cum_t1 ?? 1.0, t_curr);
1548
- const fork_cum_t1 = job.cum_t1 ?? 1.0;
1549
- const fork_len = Math.max(0.15, job.length * rem_fraction);
1550
- const fork_r0 = r_curr * 0.78;
1551
- const fork_step = fork_len / rem_segs;
1552
-
1553
- for (let f = 1; f < fork_count; f++) {
1554
- const f_az = base_az + (f * PI2) / fork_count;
1555
- const fax = Math.cos(f_az) * pre_rx + Math.sin(f_az) * pre_sx;
1556
- const fay = Math.cos(f_az) * pre_ry + Math.sin(f_az) * pre_sy;
1557
- const faz = Math.cos(f_az) * pre_rz + Math.sin(f_az) * pre_sz;
1558
-
1559
- const f_tan = [0, 0, 0];
1560
- rotate_around_axis(f_tan, pre_tx, pre_ty, pre_tz, fax, fay, faz, split_ang * 0.65);
1561
-
1562
- // Verify fork emergence clearance against BVH (and prevent inward-toward-trunk forks on lateral boughs)
1563
- if (level >= 1) {
1564
- const r_horiz_here = Math.hypot(next_px, next_pz);
1565
- if (r_horiz_here > 0.35 && (next_px * f_tan[0] + next_pz * f_tan[2]) < -0.10 * r_horiz_here) {
1566
- continue;
1567
- }
1568
- const f_clear = evaluate_candidate_clearance(
1569
- -1, branch_id, local_seg_idx, true, 0,
1570
- next_px, next_py, next_pz, fork_r0,
1571
- next_px + f_tan[0] * fork_step,
1572
- next_py + f_tan[1] * fork_step,
1573
- next_pz + f_tan[2] * fork_step,
1574
- fork_r0 * 0.85,
1575
- 0.002
1576
- );
1577
- if (f_clear < -0.002) {
1578
- continue;
1579
- }
1580
- }
1581
-
1582
- const f_r = [0, 0, 0];
1583
- rotate_around_axis(f_r, pre_rx, pre_ry, pre_rz, fax, fay, faz, split_ang * 0.65);
1584
-
1585
- queue.push({
1586
- level,
1587
- generator,
1588
- in_crown: job.in_crown,
1589
- parent_branch_id: branch_id,
1590
- parent_edge_id: edge_id,
1591
- parent_attach_seg_idx: local_seg_idx,
1592
- parent_attach_t: t_curr,
1593
- attach_parent_vertex: curr_v,
1594
- start_vertex: -1,
1595
- px: next_px,
1596
- py: next_py,
1597
- pz: next_pz,
1598
- tx: f_tan[0],
1599
- ty: f_tan[1],
1600
- tz: f_tan[2],
1601
- rx: f_r[0],
1602
- ry: f_r[1],
1603
- rz: f_r[2],
1604
- emerge_drx: fax,
1605
- emerge_dry: fay,
1606
- emerge_drz: faz,
1607
- length: fork_len,
1608
- full_branch_length: job.full_branch_length ?? job.length,
1609
- base_radius: fork_r0,
1610
- start_seg: 0,
1611
- total_segs: rem_segs,
1612
- shape_segs: rem_segs,
1613
- initial_arc_s: cur_arc_s,
1614
- has_split: true,
1615
- is_split_fork: true,
1616
- child_span_fraction: rem_fraction,
1617
- cum_t0: fork_cum_t0,
1618
- cum_t1: fork_cum_t1
1619
- });
1620
- }
1621
- }
1622
-
1623
- cur_px = next_px;
1624
- cur_py = next_py;
1625
- cur_pz = next_pz;
1626
- cur_tx = next_tx;
1627
- cur_ty = next_ty;
1628
- cur_tz = next_tz;
1629
- cur_rx = next_rx;
1630
- cur_ry = next_ry;
1631
- cur_rz = next_rz;
1632
- prev_v = curr_v;
1633
- }
1634
-
1635
- // If the branch was self-pruned early on contact (actual_segs < remaining_segs), renormalize
1636
- // t_norm and taper radii across the surviving vertices [0..actual_segs] so its tip terminates cleanly at t_norm = 1.0
1637
- const actual_segs = branch_edges.length;
1638
- if (actual_segs > 0 && actual_segs < remaining_segs) {
1639
- const s_param = /** @type {Float32Array} */ (out.attr_node_spine_param.data);
1640
- for (let i = 0; i < actual_segs; i++) {
1641
- const tn0 = i / actual_segs;
1642
- const tn1 = (i + 1) / actual_segs;
1643
- branch_edge_t0[i] = tn0;
1644
- branch_edge_t1[i] = tn1;
1645
-
1646
- const v_curr = branch_vertices[i + 1];
1647
- s_param[v_curr * 3] = tn1;
1648
-
1649
- const u_p = prof_span > 1e-4
1650
- ? clamp((prof_p0 - lvl_cfg.radius_profile.evaluate(lerp(job.cum_t0, job.cum_t1, tn1))) / prof_span, 0.0, 1.0)
1651
- : tn1;
1652
- const min_tf = has_children ? 0.14 : 0.24;
1653
- const ap_taper = has_children && tn1 > 0.80
1654
- ? lerp(1.0, 0.62, Math.pow((tn1 - 0.80) / 0.20, 1.35))
1655
- : 1.0;
1656
- const r_new = Math.max(
1657
- 0.002,
1658
- job.base_radius * Math.max(1.0 - lvl_cfg.taper * u_p, min_tf) * ap_taper
1659
- );
1660
- out.node_write_radius(v_curr, r_new);
1661
-
1662
- const e_curr = branch_edges[i];
1663
- seg_r1[e_curr] = r_new;
1664
- if (i + 1 < actual_segs) {
1665
- seg_r0[branch_edges[i + 1]] = r_new;
1666
- }
1667
- }
1668
- }
1669
-
1670
- // Smooth or preserve crisp interior Hermite tangents across consecutive edges of this branch
1671
- // (preserving branch_edges[0]'s m0 so continuation forks keep their exact fork departure tangent)
1672
- if (branch_edges.length >= 2) {
1673
- const kink_sharp = clamp(lvl_cfg.kink_sharpness ?? 0.5, 0.0, 0.92);
1674
- for (let k = 1; k < branch_edges.length; k++) {
1675
- const e_prev = branch_edges[k - 1];
1676
- const e_next = branch_edges[k];
1677
- const v_mid = branch_vertices[k];
1678
- const l_prev = Math.max(1e-5, out.segment_length(e_prev));
1679
- const l_next = Math.max(1e-5, out.segment_length(e_next));
1680
-
1681
- out.segment_read_m1(SCRATCH_M_PREV, 0, e_prev);
1682
- out.segment_read_m0(SCRATCH_M_NEXT, 0, e_next);
1683
-
1684
- const t_in_x = SCRATCH_M_PREV[0] / l_prev;
1685
- const t_in_y = SCRATCH_M_PREV[1] / l_prev;
1686
- const t_in_z = SCRATCH_M_PREV[2] / l_prev;
1687
- const t_out_x = SCRATCH_M_NEXT[0] / l_next;
1688
- const t_out_y = SCRATCH_M_NEXT[1] / l_next;
1689
- const t_out_z = SCRATCH_M_NEXT[2] / l_next;
1690
-
1691
- let tx = t_in_x + t_out_x;
1692
- let ty = t_in_y + t_out_y;
1693
- let tz = t_in_z + t_out_z;
1694
- const t_len = Math.sqrt(tx * tx + ty * ty + tz * tz);
1695
- if (t_len > 1e-12) {
1696
- tx /= t_len;
1697
- ty /= t_len;
1698
- tz /= t_len;
1699
-
1700
- out.node_write_tangent(v_mid, tx, ty, tz);
1701
-
1702
- // Blend between smooth C1 average tangent and crisp sympodial kink tangents
1703
- let m1x = lerp(tx, t_in_x, kink_sharp);
1704
- let m1y = lerp(ty, t_in_y, kink_sharp);
1705
- let m1z = lerp(tz, t_in_z, kink_sharp);
1706
- const m1_l = Math.sqrt(m1x * m1x + m1y * m1y + m1z * m1z);
1707
- if (m1_l > 1e-12) { m1x /= m1_l; m1y /= m1_l; m1z /= m1_l; }
1708
-
1709
- let m0x = lerp(tx, t_out_x, kink_sharp);
1710
- let m0y = lerp(ty, t_out_y, kink_sharp);
1711
- let m0z = lerp(tz, t_out_z, kink_sharp);
1712
- const m0_l = Math.sqrt(m0x * m0x + m0y * m0y + m0z * m0z);
1713
- if (m0_l > 1e-12) { m0x /= m0_l; m0y /= m0_l; m0z /= m0_l; }
1714
-
1715
- out.segment_write_m1(e_prev, m1x * l_prev, m1y * l_prev, m1z * l_prev);
1716
- out.segment_write_m0(e_next, m0x * l_next, m0y * l_next, m0z * l_next);
1717
- }
1718
- }
1719
- }
1720
-
1721
- // Spawn lateral child branches at level + 1 using pre-scheduled attachments
1722
- const next_level = level + 1;
1723
- if (scheduled_children.length > 0 && branch_edges.length > 0) {
1724
- const t_max = branch_edge_t1[branch_edge_t1.length - 1];
1725
- const PHI_CANDIDATES = [0.0, 0.36, -0.36, 0.72, -0.72, 1.08, -1.08, 1.48, -1.48];
1726
-
1727
- for (let c = 0; c < scheduled_children.length; c++) {
1728
- const sc = scheduled_children[c];
1729
- const rule = sc.rule;
1730
- const next_cfg = species.branches[rule.target];
1731
- if (sc.t_attach > t_max * 1.02) continue;
1732
- const t_attach = clamp(sc.t_attach, branch_edge_t0[0], t_max * 0.985);
1733
- const base_phi_c = sc.phi;
1734
-
1735
- // Find parent edge containing t_attach
1736
- let seg_idx = 0;
1737
- for (let i = 0; i < branch_edges.length; i++) {
1738
- if (t_attach >= branch_edge_t0[i] && t_attach <= branch_edge_t1[i]) {
1739
- seg_idx = i;
1740
- break;
1741
- }
1742
- }
1743
-
1744
- const parent_e = branch_edges[seg_idx];
1745
- const t0_e = branch_edge_t0[seg_idx];
1746
- const t1_e = branch_edge_t1[seg_idx];
1747
- const local_u = clamp((t_attach - t0_e) / Math.max(1e-5, t1_e - t0_e), 0.0, 1.0);
1748
-
1749
- out.evaluate_segment_position(SCRATCH_POS, 0, parent_e, local_u);
1750
- out.evaluate_segment_tangent(SCRATCH_TAN, 0, parent_e, local_u);
1751
-
1752
- const p_v0 = branch_vertices[seg_idx];
1753
- const p_v1 = branch_vertices[seg_idx + 1];
1754
- const r_p0 = out.node_read_radius(p_v0);
1755
- const r_p1 = out.node_read_radius(p_v1);
1756
- const parent_r_at_attach = lerp(r_p0, r_p1, local_u);
1757
- if (parent_r_at_attach < 0.004) continue;
1758
-
1759
- // Transport parent RMF R vector from p_v0 along parent_e to SCRATCH_POS at local_u
1760
- out.node_read_position(SCRATCH_P0, 0, p_v0);
1761
- out.node_read_tangent(SCRATCH_T0, 0, p_v0);
1762
- out.node_read_frame_r(SCRATCH_R0, 0, p_v0);
1763
- const p_rx = SCRATCH_R0[0];
1764
- const p_ry = SCRATCH_R0[1];
1765
- const p_rz = SCRATCH_R0[2];
1766
-
1767
- spine_frame_double_reflection(
1768
- SCRATCH_RMF, 0,
1769
- SCRATCH_P0[0], SCRATCH_P0[1], SCRATCH_P0[2],
1770
- SCRATCH_T0[0], SCRATCH_T0[1], SCRATCH_T0[2],
1771
- p_rx, p_ry, p_rz,
1772
- SCRATCH_POS[0], SCRATCH_POS[1], SCRATCH_POS[2],
1773
- SCRATCH_TAN[0], SCRATCH_TAN[1], SCRATCH_TAN[2]
1774
- );
1775
- const prx = SCRATCH_RMF[0], pry = SCRATCH_RMF[1], prz = SCRATCH_RMF[2];
1776
- const psx = SCRATCH_RMF[3], psy = SCRATCH_RMF[4], psz = SCRATCH_RMF[5];
1777
-
1778
- // Genealogical position along the full parent axis (accounts for continuation forks)
1779
- const t_genealogical = lerp(job.cum_t0 ?? 0.0, job.cum_t1 ?? 1.0, t_attach);
1780
-
1781
- // Insertion polar angle alpha from parent tangent T_p toward D_rad
1782
- const alpha_scale = rule.insertion_angle_profile.evaluate(t_genealogical);
1783
- const alpha = clamp(
1784
- rule.insertion_angle * alpha_scale + (rng() * 2.0 - 1.0) * rule.insertion_angle_variation,
1785
- 0.1,
1786
- Math.PI * 0.85
1787
- );
1788
- const cos_a = Math.cos(alpha);
1789
- const sin_a = Math.sin(alpha);
1790
- const var_scale = 1.0 + (rng() * 2.0 - 1.0) * next_cfg.length_variance;
1791
-
1792
- // A plagiotropic parent is dorsiventral: its buds lie in the plane of its tangent T_p and the horizontal
1793
- // H = T_p x Y across it, whose normal N = H x T_p points up. A vertical parent has no such plane.
1794
- const tpx = SCRATCH_TAN[0], tpy = SCRATCH_TAN[1], tpz = SCRATCH_TAN[2];
1795
- const horizontality = Math.hypot(tpx, tpz);
1796
- const plagio = level >= 1 ? lvl_cfg.plagiotropism : 0.0;
1797
- const w_plagio = horizontality > 1e-3 ? plagio * horizontality : 0.0;
1798
- const dv_nx = horizontality > 1e-3 ? (-tpx * tpy) / horizontality : 0.0;
1799
- const dv_ny = horizontality;
1800
- const dv_nz = horizontality > 1e-3 ? (-tpy * tpz) / horizontality : 0.0;
1801
-
1802
- // Helper to compute radial normal D_rad and child tangent T_c for a given azimuth phi_cand
1803
- const compute_child_basis = (phi_cand, out_dr, out_ct) => {
1804
- const cp = Math.cos(phi_cand);
1805
- const sp = Math.sin(phi_cand);
1806
- let dx_r = cp * prx + sp * psx;
1807
- let dy_r = cp * pry + sp * psy;
1808
- let dz_r = cp * prz + sp * psz;
1809
-
1810
- if (w_plagio > 1e-3) {
1811
- // fan into the dorsiventral plane: take off w of the radial's component along N
1812
- const along_n = (dx_r * dv_nx + dy_r * dv_ny + dz_r * dv_nz) * w_plagio;
1813
- dx_r -= along_n * dv_nx;
1814
- dy_r -= along_n * dv_ny;
1815
- dz_r -= along_n * dv_nz;
1816
- const d_len = Math.sqrt(dx_r * dx_r + dy_r * dy_r + dz_r * dz_r);
1817
- if (d_len > 1e-6) {
1818
- dx_r /= d_len;
1819
- dy_r /= d_len;
1820
- dz_r /= d_len;
1821
- } else {
1822
- // a bud straight above (below) a fully dorsiventral shoot: to the side, along H
1823
- dx_r = -tpz / horizontality;
1824
- dy_r = 0.0;
1825
- dz_r = tpx / horizontality;
1826
- }
1827
- }
1828
- out_dr[0] = dx_r;
1829
- out_dr[1] = dy_r;
1830
- out_dr[2] = dz_r;
1831
-
1832
- let tx_c = cos_a * SCRATCH_TAN[0] + sin_a * dx_r;
1833
- let ty_c = cos_a * SCRATCH_TAN[1] + sin_a * dy_r;
1834
- let tz_c = cos_a * SCRATCH_TAN[2] + sin_a * dz_r;
1835
- const ct_l = Math.sqrt(tx_c * tx_c + ty_c * ty_c + tz_c * tz_c) || 1.0;
1836
- out_ct[0] = tx_c / ct_l;
1837
- out_ct[1] = ty_c / ct_l;
1838
- out_ct[2] = tz_c / ct_l;
1839
- };
1840
-
1841
- // Ventral knockout: on a dorsiventral parent a bud whose own heading points into the downward cone of
1842
- // half-angle plagiotropism * pi / 2 does not break
1843
- const ventral_cos = Math.cos(plagio * Math.PI * 0.5);
1844
- if (plagio > 0.0) {
1845
- const bud_y = cos_a * tpy + sin_a * (Math.cos(base_phi_c) * pry + Math.sin(base_phi_c) * psy);
1846
- if (-bud_y > ventral_cos) {
1847
- continue;
1848
- }
1849
- }
1850
-
1851
- const cand_dr = [0, 0, 0];
1852
- const cand_ct = [0, 0, 0];
1853
- compute_child_basis(base_phi_c, cand_dr, cand_ct);
1854
-
1855
- // 1. Raw configured child branch length modulated by length_profile at t_genealogical and crown envelope
1856
- const prof_scale = Math.max(0.12, rule.length_profile.evaluate(t_genealogical));
1857
- const est_mid_y = SCRATCH_POS[1] + Math.max(0.0, cand_ct[1]) * next_cfg.length * prof_scale * 0.35;
1858
- const h_norm = clamp((est_mid_y - crown.base_height) / Math.max(0.1, crown.height), 0.0, 1.0);
1859
- // a dead branch grew before today's crown took its shape
1860
- const dead = sc.age > 0.0;
1861
- const env_scale = !rule.crown_envelope || dead
1862
- ? 1.0
1863
- : (level === 0
1864
- ? crown_envelope_evaluate(crown.envelope_type, h_norm)
1865
- : lerp(1.0, crown_envelope_evaluate(crown.envelope_type, h_norm), 0.5));
1866
- const raw_child_len = Math.max(0.12, next_cfg.length * prof_scale * env_scale * var_scale);
1867
-
1868
- // 2. Continuous Gravity-Orientation & Allometric Slenderness Coupling (Cantilever vs. Pendulous Tension)
1869
- const rho_design = Math.max(0.012, next_cfg.radius_ratio);
1870
- const s_design = 1.0 / (2.0 * rho_design);
1871
- const g_trop = next_cfg.gravitropism ?? 0.0;
1872
- const u_curl = next_cfg.tip_upcurl ?? 0.0;
1873
- const t_eff_y = clamp(cand_ct[1] - 0.85 * g_trop + 0.35 * u_curl, -1.0, 1.0);
1874
-
1875
- // Cantilever load (horizontal bending / upward compression) vs. pendulous tensile compliance
1876
- 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);
1877
- const tau_tension = clamp(g_trop, 0.0, 1.0) * Math.max(0.0, -t_eff_y);
1878
-
1879
- // 3. Parent-relative distal conical envelope (prevents distal shoots or split forks from outgrowing their parent)
1880
- const actual_parent_len = Math.max(0.15, out.branch_length[branch_id]);
1881
- const parent_full_len = Math.max(actual_parent_len, job.full_branch_length ?? actual_parent_len);
1882
- const distal_tip_ratio = lerp(0.32, 0.55, tau_tension);
1883
- const cone_max_len = level === 0
1884
- ? parent_full_len * lerp(0.85, 0.32, Math.pow(t_genealogical, 1.6))
1885
- : Math.min(
1886
- actual_parent_len * lerp(0.90, 1.05, tau_tension),
1887
- parent_full_len * lerp(0.85, distal_tip_ratio, Math.pow(t_genealogical, 1.25))
1888
- );
1889
- const desired_len = Math.max(0.12, Math.min(raw_child_len, cone_max_len));
1890
-
1891
- const nom_len = Math.max(0.15, next_cfg.length);
1892
- const r_design = (nom_len * rho_design * Math.pow(desired_len / nom_len, 0.75)) / (1.0 + 0.65 * tau_tension);
1893
- // children on the flare crests sit side by side around the stem: N of them fit at most R sin(pi / N) thick
1894
- const side_by_side_r = rule.phyllotaxis_mode === PhyllotaxisMode.FlareLobes
1895
- ? parent_r_at_attach * Math.sin(Math.PI / Math.max(2, lvl_cfg.flare_lobes | 0))
1896
- : Infinity;
1897
- const child_base_r = Math.min(
1898
- parent_r_at_attach * 0.78,
1899
- side_by_side_r,
1900
- Math.max(0.0035, r_design)
1901
- );
1902
-
1903
- const gamma = lerp(0.82, 0.65, tau_tension);
1904
- const allometric_len = child_base_r < r_design
1905
- ? desired_len * Math.pow(child_base_r / Math.max(1e-5, r_design), gamma)
1906
- : desired_len;
1907
- const s_max = s_design * (1.35 + 0.65 * tau_tension) / (0.65 + 0.35 * k_cantilever);
1908
- const full_len = clamp(Math.min(allometric_len, 2.0 * child_base_r * s_max), 0.12, desired_len);
1909
- // a dead branch is what is left of it: its base part, if that still clears the bark; otherwise it has
1910
- // been grown over and the stem carries its scar
1911
- const child_len = full_len * sc.retained;
1912
- if (dead && child_len <= parent_r_at_attach) {
1913
- out.add_scar(branch_id, t_attach, cand_ct[0], cand_ct[1], cand_ct[2], child_base_r * (1.0 - sc.age));
1914
- continue;
1915
- }
1916
- const child_segs = Math.max(1, Math.ceil(next_cfg.segments * sc.retained));
1917
- const child_step = child_len / child_segs;
1918
-
1919
- // 4. Pre-Spawn BVH Bud Clearance Probing (selects open canopy azimuth or inhibits blocked bud)
1920
- let best_drx = cand_dr[0], best_dry = cand_dr[1], best_drz = cand_dr[2];
1921
- let best_ctx = cand_ct[0], best_cty = cand_ct[1], best_ctz = cand_ct[2];
1922
- let best_clear = -Infinity;
1923
- const r_horiz_attach = Math.hypot(SCRATCH_POS[0], SCRATCH_POS[2]);
1924
-
1925
- for (let k = 0; k < PHI_CANDIDATES.length; k++) {
1926
- if (k > 0) {
1927
- compute_child_basis(base_phi_c + PHI_CANDIDATES[k], cand_dr, cand_ct);
1928
- }
1929
- // nor may fanning or a turn for clearance carry it into the cone: a bud with no heading left
1930
- // outside it does not break
1931
- if (plagio > 0.0 && -cand_ct[1] > ventral_cos) continue;
1932
- // Prevent lateral shoots on boughs from pointing backward into the trunk core
1933
- if (level >= 1 && r_horiz_attach > 0.30) {
1934
- const radial_dot = (SCRATCH_POS[0] * cand_ct[0] + SCRATCH_POS[2] * cand_ct[2]) / r_horiz_attach;
1935
- if (radial_dot < -0.15) continue;
1936
- }
1937
-
1938
- const p1_x = SCRATCH_POS[0] + cand_ct[0] * child_step;
1939
- const p1_y = SCRATCH_POS[1] + cand_ct[1] * child_step;
1940
- const p1_z = SCRATCH_POS[2] + cand_ct[2] * child_step;
1941
-
1942
- const clear0 = evaluate_candidate_clearance(
1943
- -1, branch_id, seg_idx, false, 0,
1944
- SCRATCH_POS[0], SCRATCH_POS[1], SCRATCH_POS[2], child_base_r,
1945
- p1_x, p1_y, p1_z, child_base_r * 0.88,
1946
- 0.002
1947
- );
1948
-
1949
- const p2_x = p1_x + cand_ct[0] * child_step;
1950
- const p2_y = p1_y + cand_ct[1] * child_step;
1951
- const p2_z = p1_z + cand_ct[2] * child_step;
1952
- const clear1 = child_segs >= 2
1953
- ? evaluate_candidate_clearance(
1954
- -1, branch_id, seg_idx, false, 1,
1955
- p1_x, p1_y, p1_z, child_base_r * 0.88,
1956
- p2_x, p2_y, p2_z, child_base_r * 0.75,
1957
- 0.002
1958
- )
1959
- : clear0;
1960
-
1961
- const min_c = Math.min(clear0, clear1);
1962
- if (min_c > best_clear) {
1963
- best_clear = min_c;
1964
- best_drx = cand_dr[0];
1965
- best_dry = cand_dr[1];
1966
- best_drz = cand_dr[2];
1967
- best_ctx = cand_ct[0];
1968
- best_cty = cand_ct[1];
1969
- best_ctz = cand_ct[2];
1970
- }
1971
- if (min_c >= 0.004) {
1972
- break;
1973
- }
1974
- }
1975
-
1976
- // Botanical bud inhibition: if all candidate directions are blocked by existing branches, suppress bud
1977
- if (best_clear < -0.004) {
1978
- continue;
1979
- }
1980
-
1981
- const drx = best_drx, dry = best_dry, drz = best_drz;
1982
- const ctx = best_ctx, cty = best_cty, ctz = best_ctz;
1983
-
1984
- // Initial RMF radial vector for child branch:
1985
- // R_c = cos(alpha) * D_rad - sin(alpha) * T_p is exact unit length and orthogonal
1986
- // to T_c = cos(alpha) * T_p + sin(alpha) * D_rad for all alpha in [0, pi],
1987
- // avoiding any singularity at alpha = pi/2.
1988
- let crx = cos_a * drx - sin_a * SCRATCH_TAN[0];
1989
- let cry = cos_a * dry - sin_a * SCRATCH_TAN[1];
1990
- let crz = cos_a * drz - sin_a * SCRATCH_TAN[2];
1991
- const cr_dot = crx * ctx + cry * cty + crz * ctz;
1992
- crx -= cr_dot * ctx;
1993
- cry -= cr_dot * cty;
1994
- crz -= cr_dot * ctz;
1995
- const cr_len = Math.sqrt(crx * crx + cry * cry + crz * crz);
1996
- if (cr_len > 1e-12) {
1997
- crx /= cr_len;
1998
- cry /= cr_len;
1999
- crz /= cr_len;
2000
- }
2001
-
2002
- queue.push({
2003
- level: next_level,
2004
- generator: rule.target,
2005
- in_crown: rule.crown_envelope && !dead,
2006
- dead,
2007
- parent_branch_id: branch_id,
2008
- parent_edge_id: parent_e,
2009
- parent_attach_seg_idx: seg_idx,
2010
- parent_attach_t: t_attach,
2011
- attach_parent_vertex: p_v0,
2012
- start_vertex: -1,
2013
- px: SCRATCH_POS[0],
2014
- py: SCRATCH_POS[1],
2015
- pz: SCRATCH_POS[2],
2016
- tx: ctx,
2017
- ty: cty,
2018
- tz: ctz,
2019
- rx: crx,
2020
- ry: cry,
2021
- rz: crz,
2022
- emerge_drx: drx,
2023
- emerge_dry: dry,
2024
- emerge_drz: drz,
2025
- length: child_len,
2026
- full_branch_length: child_len,
2027
- base_radius: child_base_r * (1.0 - sc.age),
2028
- start_seg: 0,
2029
- total_segs: child_segs,
2030
- shape_segs: Math.max(1, next_cfg.segments),
2031
- initial_arc_s: 0.0,
2032
- has_split: false,
2033
- is_split_fork: false,
2034
- cum_t0: 0.0,
2035
- cum_t1: sc.retained
2036
- });
2037
- }
2038
- }
2039
- }
2040
-
2041
- // Bottom-up Pipe Model radius calculation & blending
2042
- tree_skeleton_compute_pipe_radii(out, species);
2043
-
2044
- // The peripheral twig systems, grown year by year on the finished framework, its girth final
19
+ tree_skeleton_grow_framework(species, out);
2045
20
  tree_skeleton_grow_shoots(out, species);
2046
-
21
+ tree_skeleton_fit_crown_frame(out, species);
2047
22
  return out;
2048
23
  }