@woosh/meep-engine 3.52.0 → 3.53.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 (370) hide show
  1. package/package.json +1 -1
  2. package/src/engine/ecs/animation/Animation.d.ts +4 -25
  3. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  4. package/src/engine/ecs/animation/Animation.js +9 -41
  5. package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
  6. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  7. package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
  8. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
  9. package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
  10. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  11. package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
  12. package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
  13. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  14. package/src/engine/graphics3/AnimationSystem.js +62 -243
  15. package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
  16. package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
  17. package/src/engine/graphics3/FoliageWindSystem.js +257 -0
  18. package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
  19. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  20. package/src/engine/graphics3/GPUFluidSystem.js +39 -1
  21. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +0 -1
  22. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/GPUParticleEmitterSystem.js +19 -5
  24. package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
  25. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  26. package/src/engine/graphics3/animation/AnimationClips.js +207 -10
  27. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
  28. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
  29. package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
  30. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
  31. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
  32. package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
  33. package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
  34. package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
  35. package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
  36. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
  38. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  39. package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
  40. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
  41. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
  42. package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
  43. package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
  44. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
  45. package/src/engine/graphics3/prefab/Prefab.js +169 -162
  46. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
  47. package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
  48. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  49. package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
  50. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
  51. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
  52. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  53. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
  54. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  55. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
  56. package/src/engine/sound/simulation/README.md +1 -1
  57. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
  58. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
  59. package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
  60. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  61. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
  62. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
  63. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
  64. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
  65. package/src/generation/foliage/FOLIAGE_DESIGN.md +318 -0
  66. package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
  67. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
  68. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
  69. package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
  70. package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
  71. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
  72. package/src/generation/foliage/asset/TreeAsset.js +111 -0
  73. package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
  74. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
  75. package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
  76. package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
  77. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
  78. package/src/generation/foliage/asset/generate_tree.js +93 -0
  79. package/src/generation/foliage/asset/place_tree.d.ts +82 -0
  80. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
  81. package/src/generation/foliage/asset/place_tree.js +194 -0
  82. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +120 -0
  83. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
  84. package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
  85. package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
  86. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
  87. package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
  88. package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
  89. package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
  90. package/src/generation/foliage/config/CrownConfig.js +186 -0
  91. package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
  92. package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
  93. package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
  94. package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
  95. package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
  96. package/src/generation/foliage/config/FoliageCardType.js +18 -0
  97. package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
  98. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
  99. package/src/generation/foliage/config/FoliageConfig.js +283 -0
  100. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +90 -0
  101. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
  102. package/src/generation/foliage/config/FoliageMaterialConfig.js +181 -0
  103. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
  104. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
  105. package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
  106. package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
  107. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
  108. package/src/generation/foliage/config/TreeLODConfig.js +211 -0
  109. package/src/generation/foliage/config/TreePreset.d.ts +16 -0
  110. package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
  111. package/src/generation/foliage/config/TreePreset.js +17 -0
  112. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
  113. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
  114. package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
  115. package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
  116. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
  117. package/src/generation/foliage/config/TreeWindConfig.js +157 -0
  118. package/src/generation/foliage/index.d.ts +38 -0
  119. package/src/generation/foliage/index.d.ts.map +1 -0
  120. package/src/generation/foliage/index.js +43 -0
  121. package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
  122. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
  123. package/src/generation/foliage/material/make_bark_material.js +802 -0
  124. package/src/generation/foliage/material/make_foliage_material.d.ts +14 -0
  125. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
  126. package/src/generation/foliage/material/make_foliage_material.js +359 -0
  127. package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
  128. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
  129. package/src/generation/foliage/mesh/branch_collar_project.js +203 -0
  130. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
  131. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
  132. package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
  133. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +80 -0
  134. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
  135. package/src/generation/foliage/mesh/foliage_collect_attachments.js +502 -0
  136. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
  137. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
  138. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
  139. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
  140. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
  141. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1047 -0
  142. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +21 -0
  143. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
  144. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +415 -0
  145. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
  146. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
  147. package/src/generation/foliage/presets/make_tree_species_preset.js +837 -0
  148. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
  149. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
  150. package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
  151. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
  152. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
  153. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
  154. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
  155. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
  156. package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
  157. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
  158. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
  159. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
  160. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +14 -0
  161. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
  162. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +179 -0
  163. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
  164. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
  165. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1104 -0
  166. package/src/shade/playground/additive_blending/index.html +197 -0
  167. package/src/shade/playground/additive_blending/main.d.ts +2 -0
  168. package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
  169. package/src/shade/playground/additive_blending/main.js +529 -0
  170. package/src/shade/playground/foliage_wind/README.md +18 -0
  171. package/src/shade/playground/foliage_wind/foliage_world.d.ts +127 -0
  172. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
  173. package/src/shade/playground/foliage_wind/foliage_world.js +593 -0
  174. package/src/shade/playground/foliage_wind/index.html +254 -0
  175. package/src/shade/playground/foliage_wind/main.d.ts +2 -0
  176. package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
  177. package/src/shade/playground/foliage_wind/main.js +263 -0
  178. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  179. package/src/shade/renderer/Renderer.js +45 -16
  180. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
  181. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
  182. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
  183. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
  184. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
  185. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
  186. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
  187. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
  188. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
  189. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
  190. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
  191. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  192. package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
  193. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
  194. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  195. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
  196. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
  197. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
  199. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
  201. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
  202. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
  203. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
  204. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
  205. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
  206. package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
  207. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
  208. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
  209. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
  210. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
  211. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
  212. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
  213. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
  215. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
  216. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
  217. package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
  218. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  219. package/src/shade/renderer/extension/RenderExtension.js +9 -0
  220. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
  221. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  222. package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
  223. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +7 -0
  224. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  225. package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
  226. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +7 -0
  227. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  228. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
  229. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  230. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
  231. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
  232. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  233. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
  234. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  235. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
  236. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  237. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
  238. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
  239. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
  240. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +7 -0
  241. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  242. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
  243. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
  244. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  245. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
  246. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
  247. package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
  248. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  249. package/src/shade/renderer/loader/SceneBundle.js +119 -111
  250. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
  251. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  252. package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
  253. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
  254. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  255. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
  256. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  257. package/src/shade/renderer/particles/GPUParticleSystem.js +3 -1
  258. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  259. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +9 -4
  260. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  261. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
  262. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
  263. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
  264. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  265. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
  266. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
  267. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
  268. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
  269. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  270. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
  271. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
  272. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
  273. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
  274. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
  275. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
  276. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
  277. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
  278. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
  279. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
  280. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
  281. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
  282. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
  283. package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
  284. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
  285. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  286. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
  287. package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
  288. package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
  289. package/src/engine/graphics/composit/CompositingStages.js +0 -8
  290. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
  291. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
  292. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
  293. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
  294. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
  295. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
  296. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
  297. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
  298. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
  299. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
  300. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
  301. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
  302. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
  303. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
  304. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
  305. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
  306. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
  307. package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
  308. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
  309. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
  310. package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
  311. package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
  312. package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
  313. package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
  314. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
  315. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
  316. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
  317. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
  318. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
  319. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
  320. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
  321. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
  322. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
  323. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
  324. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
  325. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
  326. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
  327. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
  328. package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
  329. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
  330. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
  331. package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
  332. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
  333. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
  334. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
  335. package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
  336. package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
  337. package/src/engine/graphics/render/RenderPassType.js +0 -8
  338. package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
  339. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
  340. package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
  341. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
  342. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
  343. package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
  344. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
  345. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
  346. package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
  347. package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
  348. package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
  349. package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
  350. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
  351. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
  352. package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
  353. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
  354. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
  355. package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
  356. package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
  357. package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
  358. package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
  359. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
  360. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
  361. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
  362. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
  363. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
  364. package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
  365. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
  366. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
  367. package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
  368. package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
  369. package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
  370. package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
@@ -0,0 +1,72 @@
1
+ import { assert } from "../../../core/assert.js";
2
+
3
+ /**
4
+ * Triangulates the tubular strip between two UV-seam-duplicated cross-sectional rings
5
+ * (`ring0` with `m0 + 1` vertices and `ring1` with `m1 + 1` vertices, where `m0 >= 3` and `m1 >= 3`)
6
+ * using an exact integer cross-multiplied zipper (`(j0 + 1) * m1 <= (j1 + 1) * m0`).
7
+ *
8
+ * Guarantees:
9
+ * - Strictly `m0 + m1` triangles emitted.
10
+ * - Zero index-degenerate triangles (`i0 !== i1 && i1 !== i2 && i2 !== i0`), preventing
11
+ * `MeshoptClusterizer` / `meshlet_batch_to_bvh` from stripping triangles.
12
+ * - Consistent outward CCW winding for right-handed `(T, R, S = T x R)` rings where `theta`
13
+ * increases from `0` to `2*PI`.
14
+ *
15
+ * @param {Uint32Array|number[]} indices destination index buffer
16
+ * @param {number} index_cursor starting offset in `indices`
17
+ * @param {number} ring0_start starting vertex index of ring 0 (size `m0 + 1`)
18
+ * @param {number} m0 radial segment count of ring 0 (`>= 3`)
19
+ * @param {number} ring1_start starting vertex index of ring 1 (size `m1 + 1`)
20
+ * @param {number} m1 radial segment count of ring 1 (`>= 3`)
21
+ * @returns {number} updated `index_cursor` (`index_cursor + 3 * (m0 + m1)`)
22
+ */
23
+ export function branch_ring_triangulate(indices, index_cursor, ring0_start, m0, ring1_start, m1) {
24
+ assert.greaterThanOrEqual(m0, 3, 'm0 must be >= 3');
25
+ assert.greaterThanOrEqual(m1, 3, 'm1 must be >= 3');
26
+
27
+ let j0 = 0;
28
+ let j1 = 0;
29
+ let cursor = index_cursor;
30
+
31
+ while (j0 < m0 || j1 < m1) {
32
+ if (j0 < m0 && (j1 === m1 || (j0 + 1) * m1 <= (j1 + 1) * m0)) {
33
+ // Advance along ring 0: (ring0[j0], ring0[j0 + 1], ring1[j1])
34
+ indices[cursor++] = ring0_start + j0;
35
+ indices[cursor++] = ring0_start + j0 + 1;
36
+ indices[cursor++] = ring1_start + j1;
37
+ j0++;
38
+ } else {
39
+ // Advance along ring 1: (ring0[j0], ring1[j1 + 1], ring1[j1])
40
+ indices[cursor++] = ring0_start + j0;
41
+ indices[cursor++] = ring1_start + j1 + 1;
42
+ indices[cursor++] = ring1_start + j1;
43
+ j1++;
44
+ }
45
+ }
46
+
47
+ return cursor;
48
+ }
49
+
50
+ /**
51
+ * Triangulates a terminal conical apex fan connecting a ring of `m + 1` vertices (`m >= 3`)
52
+ * to `m` distinct apex vertices (`apex_start .. apex_start + m - 1`), emitting `m` outward-facing
53
+ * triangles with zero repeated indices.
54
+ *
55
+ * @param {Uint32Array|number[]} indices destination index buffer
56
+ * @param {number} index_cursor starting offset in `indices`
57
+ * @param {number} ring_start starting vertex index of the last non-zero ring (size `m + 1`)
58
+ * @param {number} m radial segment count of the ring (`>= 3`)
59
+ * @param {number} apex_start starting vertex index of the `m` apex vertices
60
+ * @returns {number} updated `index_cursor` (`index_cursor + 3 * m`)
61
+ */
62
+ export function branch_apex_triangulate(indices, index_cursor, ring_start, m, apex_start) {
63
+ assert.greaterThanOrEqual(m, 3, 'm must be >= 3');
64
+
65
+ let cursor = index_cursor;
66
+ for (let j = 0; j < m; j++) {
67
+ indices[cursor++] = ring_start + j;
68
+ indices[cursor++] = ring_start + j + 1;
69
+ indices[cursor++] = apex_start + j;
70
+ }
71
+ return cursor;
72
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Flat typed-array structure holding all phyllotactic foliage attachment points and oriented card frames.
3
+ *
4
+ * @typedef {Object} FoliageAttachmentSet
5
+ * @property {number} count number of foliage attachments
6
+ * @property {Float32Array} positions `count * 3` attachment world/local positions
7
+ * @property {Float32Array} forward `count * 3` unit card length axis F
8
+ * @property {Float32Array} up `count * 3` unit card outward normal U
9
+ * @property {Float32Array} right `count * 3` unit card width axis W = F x U (so W x F = +U)
10
+ * @property {Float32Array} scales `count` per-card size multiplier
11
+ * @property {Float32Array} ranks `count` golden-ratio low-discrepancy decimation rank in [0, 1)
12
+ * @property {Float32Array} phases `count` per-card wind phase in [0, 1)
13
+ * @property {Float32Array} branch_sway `count` parent branch sway weight in [0, 1]
14
+ * @property {Float32Array} color_jitter `count` per-card luminance/tint jitter in [-1, 1]
15
+ * @property {Uint16Array} joints `count * 2` `[j_primary, j_parent]`
16
+ * @property {Float32Array} weights `count * 2` `[w_primary, w_parent]`
17
+ */
18
+ /**
19
+ * Generates phyllotactic foliage card attachment transforms along all eligible branches of a `TreeSkeleton`.
20
+ *
21
+ * @param {import("../skeleton/TreeSkeleton.js").TreeSkeleton} skeleton
22
+ * @param {TreeSpeciesConfig} [config]
23
+ * @returns {FoliageAttachmentSet}
24
+ */
25
+ export function foliage_collect_attachments(skeleton: import("../skeleton/TreeSkeleton.js").TreeSkeleton, config?: TreeSpeciesConfig): FoliageAttachmentSet;
26
+ /**
27
+ * Flat typed-array structure holding all phyllotactic foliage attachment points and oriented card frames.
28
+ */
29
+ export type FoliageAttachmentSet = {
30
+ /**
31
+ * number of foliage attachments
32
+ */
33
+ count: number;
34
+ /**
35
+ * `count * 3` attachment world/local positions
36
+ */
37
+ positions: Float32Array;
38
+ /**
39
+ * `count * 3` unit card length axis F
40
+ */
41
+ forward: Float32Array;
42
+ /**
43
+ * `count * 3` unit card outward normal U
44
+ */
45
+ up: Float32Array;
46
+ /**
47
+ * `count * 3` unit card width axis W = F x U (so W x F = +U)
48
+ */
49
+ right: Float32Array;
50
+ /**
51
+ * `count` per-card size multiplier
52
+ */
53
+ scales: Float32Array;
54
+ /**
55
+ * `count` golden-ratio low-discrepancy decimation rank in [0, 1)
56
+ */
57
+ ranks: Float32Array;
58
+ /**
59
+ * `count` per-card wind phase in [0, 1)
60
+ */
61
+ phases: Float32Array;
62
+ /**
63
+ * `count` parent branch sway weight in [0, 1]
64
+ */
65
+ branch_sway: Float32Array;
66
+ /**
67
+ * `count` per-card luminance/tint jitter in [-1, 1]
68
+ */
69
+ color_jitter: Float32Array;
70
+ /**
71
+ * `count * 2` `[j_primary, j_parent]`
72
+ */
73
+ joints: Uint16Array;
74
+ /**
75
+ * `count * 2` `[w_primary, w_parent]`
76
+ */
77
+ weights: Float32Array;
78
+ };
79
+ import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
80
+ //# sourceMappingURL=foliage_collect_attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foliage_collect_attachments.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/mesh/foliage_collect_attachments.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AACH,sDAJW,OAAO,6BAA6B,EAAE,YAAY,WAClD,iBAAiB,GACf,oBAAoB,CAuchC;;;;;;;;WA1da,MAAM;;;;eACN,YAAY;;;;aACZ,YAAY;;;;QACZ,YAAY;;;;WACZ,YAAY;;;;YACZ,YAAY;;;;WACZ,YAAY;;;;YACZ,YAAY;;;;iBACZ,YAAY;;;;kBACZ,YAAY;;;;YACZ,WAAW;;;;aACX,YAAY;;kCA7BQ,gCAAgC"}
@@ -0,0 +1,502 @@
1
+ import { GOLDEN_RATIO } from "../../../core/math/GOLDEN_RATIO.js";
2
+ import { PI2 } from "../../../core/math/PI2.js";
3
+ import { clamp } from "../../../core/math/clamp.js";
4
+ import { lerp } from "../../../core/math/lerp.js";
5
+ import { seededRandom } from "../../../core/math/random/seededRandom.js";
6
+ import { t64_look_rotation } from "../../../engine/ecs/transform/t64_look_rotation.js";
7
+ import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
8
+ import { Attribute } from "../../../shade/renderer/geometry/Attribute.js";
9
+ import { PhyllotaxisMode } from "../config/PhyllotaxisMode.js";
10
+ import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
11
+ import { spine_frame_double_reflection } from "../skeleton/spine_frame_double_reflection.js";
12
+ import { tree_mesh_compute_branch_rings } from "./tree_mesh_build_bark.js";
13
+
14
+ const GOLDEN_CONJUGATE = 1.0 / GOLDEN_RATIO; // ~0.6180339887498949
15
+ const GOLDEN_ANGLE = PI2 / (GOLDEN_RATIO * GOLDEN_RATIO);
16
+
17
+ const SCRATCH_POS = new Float32Array(3);
18
+ const SCRATCH_TAN = new Float32Array(3);
19
+ const SCRATCH_P0 = new Float32Array(3);
20
+ const SCRATCH_T0 = new Float32Array(3);
21
+ const SCRATCH_R0 = new Float32Array(3);
22
+ const SCRATCH_RMF = new Float64Array(6);
23
+
24
+ /**
25
+ * Flat typed-array structure holding all phyllotactic foliage attachment points and oriented card frames.
26
+ *
27
+ * @typedef {Object} FoliageAttachmentSet
28
+ * @property {number} count number of foliage attachments
29
+ * @property {Float32Array} positions `count * 3` attachment world/local positions
30
+ * @property {Float32Array} forward `count * 3` unit card length axis F
31
+ * @property {Float32Array} up `count * 3` unit card outward normal U
32
+ * @property {Float32Array} right `count * 3` unit card width axis W = F x U (so W x F = +U)
33
+ * @property {Float32Array} scales `count` per-card size multiplier
34
+ * @property {Float32Array} ranks `count` golden-ratio low-discrepancy decimation rank in [0, 1)
35
+ * @property {Float32Array} phases `count` per-card wind phase in [0, 1)
36
+ * @property {Float32Array} branch_sway `count` parent branch sway weight in [0, 1]
37
+ * @property {Float32Array} color_jitter `count` per-card luminance/tint jitter in [-1, 1]
38
+ * @property {Uint16Array} joints `count * 2` `[j_primary, j_parent]`
39
+ * @property {Float32Array} weights `count * 2` `[w_primary, w_parent]`
40
+ */
41
+
42
+ /**
43
+ * Generates phyllotactic foliage card attachment transforms along all eligible branches of a `TreeSkeleton`.
44
+ *
45
+ * @param {import("../skeleton/TreeSkeleton.js").TreeSkeleton} skeleton
46
+ * @param {TreeSpeciesConfig} [config]
47
+ * @returns {FoliageAttachmentSet}
48
+ */
49
+ export function foliage_collect_attachments(skeleton, config = new TreeSpeciesConfig()) {
50
+ const species = config && config.isTreeSpeciesConfig ? config : TreeSpeciesConfig.from(config);
51
+ const fol = species.foliage;
52
+ if (!fol.enabled || skeleton.branch_count === 0) {
53
+ return {
54
+ count: 0,
55
+ transforms: [],
56
+ positions: new Float32Array(0),
57
+ forward: new Float32Array(0),
58
+ up: new Float32Array(0),
59
+ right: new Float32Array(0),
60
+ scales: new Float32Array(0),
61
+ ranks: new Float32Array(0),
62
+ phases: new Float32Array(0),
63
+ branch_sway: new Float32Array(0),
64
+ color_jitter: new Float32Array(0),
65
+ joints: new Uint16Array(0),
66
+ weights: new Float32Array(0),
67
+ joints4: new Uint16Array(0),
68
+ weights4: new Float32Array(0),
69
+ attr_ranks: Attribute.from(new Float32Array(0), 1, "foliage_ranks"),
70
+ attr_phases: Attribute.from(new Float32Array(0), 1, "foliage_phases"),
71
+ attr_branch_sway: Attribute.from(new Float32Array(0), 1, "foliage_branch_sway"),
72
+ attr_color_jitter: Attribute.from(new Float32Array(0), 1, "foliage_color_jitter"),
73
+ attr_joints: Attribute.from(new Uint16Array(0), 2, "foliage_joints"),
74
+ attr_weights: Attribute.from(new Float32Array(0), 2, "foliage_weights")
75
+ };
76
+ }
77
+
78
+ const rng = seededRandom((species.seed ^ 0x5A3C9E17) | 0);
79
+ const max_existing_level = Math.max(0, species.levels.length - 1);
80
+ const min_level = Math.min(fol.attach_min_level, max_existing_level);
81
+ const branch_rings = tree_mesh_compute_branch_rings(skeleton, species, species.lods?.[0]);
82
+
83
+ const cx = skeleton.crown_center[0];
84
+ const cy = skeleton.crown_center[1];
85
+ const cz = skeleton.crown_center[2];
86
+ const ry = Math.max(0.5, skeleton.crown_radii[1]);
87
+
88
+ // First collect eligible branch edge chains via `skeleton.graph`
89
+ const eligible_branches = [];
90
+ for (let b = 0; b < skeleton.branch_count; b++) {
91
+ const level = skeleton.branch_level[b];
92
+ if (level < min_level) continue;
93
+
94
+ const nodes = [];
95
+ const edges = [];
96
+ skeleton.collect_branch_chain(b, nodes, edges);
97
+ if (edges.length === 0) continue;
98
+
99
+ const t_norms = new Array(nodes.length);
100
+ for (let i = 0; i < nodes.length; i++) {
101
+ t_norms[i] = skeleton.node_t_norm(nodes[i]);
102
+ }
103
+
104
+ eligible_branches.push({ branch_id: b, level, nodes, edges, t_norms });
105
+ }
106
+
107
+ const lateral_count = Math.max(0, fol.cards_per_branch | 0);
108
+ const rosette_count = Math.max(0, fol.terminal_rosette_count | 0);
109
+ const per_branch = lateral_count + rosette_count;
110
+ const total_count = eligible_branches.length * per_branch;
111
+
112
+ /** @type {Transform64[]} */
113
+ const transforms = new Array(total_count);
114
+ const positions = new Float32Array(total_count * 3);
115
+ const forward = new Float32Array(total_count * 3);
116
+ const up = new Float32Array(total_count * 3);
117
+ const right = new Float32Array(total_count * 3);
118
+ const scales = new Float32Array(total_count);
119
+ const ranks = new Float32Array(total_count);
120
+ const phases = new Float32Array(total_count);
121
+ const branch_sway = new Float32Array(total_count);
122
+ const color_jitter = new Float32Array(total_count);
123
+ const joints = new Uint16Array(total_count * 2);
124
+ const weights = new Float32Array(total_count * 2);
125
+ const joints4 = new Uint16Array(total_count * 4);
126
+ const weights4 = new Float32Array(total_count * 4);
127
+
128
+ let cursor = 0;
129
+ const bare = clamp(fol.bare_ratio, 0.0, 0.92);
130
+
131
+ for (let eb = 0; eb < eligible_branches.length; eb++) {
132
+ const item = eligible_branches[eb];
133
+ const level = item.level;
134
+ const nodes = item.nodes;
135
+ const edges = item.edges;
136
+ const t_norms = item.t_norms;
137
+ const b_rings = branch_rings.get(item.branch_id);
138
+ const t_min = Math.max(bare, t_norms[0]);
139
+ const t_max = t_norms[t_norms.length - 1];
140
+ const base_phi = rng() * PI2;
141
+ const b_phase = skeleton.branch_phase_hash[item.branch_id];
142
+
143
+ for (let k = 0; k < per_branch; k++) {
144
+ const is_rosette = k >= lateral_count;
145
+ let t_attach = 1.0;
146
+
147
+ if (!is_rosette && lateral_count > 0) {
148
+ let u_k = (k + 0.5) / lateral_count;
149
+ if (fol.phyllotaxis_mode === PhyllotaxisMode.Opposite
150
+ || fol.phyllotaxis_mode === PhyllotaxisMode.OppositeDecussate) {
151
+ const pair_idx = k >> 1;
152
+ const pair_total = Math.max(1, Math.ceil(lateral_count / 2));
153
+ u_k = (pair_idx + 0.5) / pair_total;
154
+ } else if (fol.phyllotaxis_mode === PhyllotaxisMode.Whorled) {
155
+ const w_size = Math.max(1, fol.whorl_count | 0);
156
+ const w_idx = Math.floor(k / w_size);
157
+ const w_total = Math.max(1, Math.ceil(lateral_count / w_size));
158
+ u_k = (w_idx + 0.5) / w_total;
159
+ }
160
+ t_attach = clamp(lerp(t_min, t_max * 0.92, u_k), t_min, t_max * 0.95);
161
+ } else {
162
+ const ros_idx = k - lateral_count;
163
+ const u_ros = (ros_idx + 0.5) / Math.max(1, rosette_count);
164
+ t_attach = clamp(lerp(Math.max(t_min, t_max * 0.88), t_max * 0.96, u_ros), t_min, t_max * 0.96);
165
+ }
166
+
167
+ // Locate segment containing t_attach
168
+ let seg_idx = edges.length - 1;
169
+ for (let s = 0; s < edges.length; s++) {
170
+ if (t_attach >= t_norms[s] && t_attach <= t_norms[s + 1]) {
171
+ seg_idx = s;
172
+ break;
173
+ }
174
+ }
175
+
176
+ const edge_id = edges[seg_idx];
177
+ const v0 = nodes[seg_idx];
178
+ const v1 = nodes[seg_idx + 1];
179
+ const t0 = t_norms[seg_idx];
180
+ const t1 = t_norms[seg_idx + 1];
181
+ const local_u = clamp((t_attach - t0) / Math.max(1e-5, t1 - t0), 0.05, 0.95);
182
+
183
+ skeleton.evaluate_segment_position(SCRATCH_POS, 0, edge_id, local_u);
184
+ skeleton.evaluate_segment_tangent(SCRATCH_TAN, 0, edge_id, local_u);
185
+ skeleton.node_read_position(SCRATCH_P0, 0, v0);
186
+ skeleton.node_read_tangent(SCRATCH_T0, 0, v0);
187
+ skeleton.node_read_frame_r(SCRATCH_R0, 0, v0);
188
+
189
+ spine_frame_double_reflection(
190
+ SCRATCH_RMF, 0,
191
+ SCRATCH_P0[0], SCRATCH_P0[1], SCRATCH_P0[2],
192
+ SCRATCH_T0[0], SCRATCH_T0[1], SCRATCH_T0[2],
193
+ SCRATCH_R0[0], SCRATCH_R0[1], SCRATCH_R0[2],
194
+ SCRATCH_POS[0], SCRATCH_POS[1], SCRATCH_POS[2],
195
+ SCRATCH_TAN[0], SCRATCH_TAN[1], SCRATCH_TAN[2]
196
+ );
197
+ const rx = SCRATCH_RMF[0], ry_f = SCRATCH_RMF[1], rz = SCRATCH_RMF[2];
198
+ const sx = SCRATCH_RMF[3], sy_f = SCRATCH_RMF[4], sz = SCRATCH_RMF[5];
199
+
200
+ // Phyllotactic angle phi
201
+ let phi = base_phi;
202
+ if (is_rosette) {
203
+ const r_idx = k - lateral_count;
204
+ phi += (r_idx * PI2) / Math.max(1, rosette_count);
205
+ } else {
206
+ switch (fol.phyllotaxis_mode) {
207
+ case PhyllotaxisMode.AlternateDistichous:
208
+ phi += k * Math.PI;
209
+ break;
210
+ case PhyllotaxisMode.Tristichous:
211
+ phi += k * (PI2 / 3.0);
212
+ break;
213
+ case PhyllotaxisMode.Opposite:
214
+ phi += (k & 1) * Math.PI;
215
+ break;
216
+ case PhyllotaxisMode.OppositeDecussate:
217
+ phi += (k & 1) * Math.PI + (k >> 1) * (Math.PI * 0.5);
218
+ break;
219
+ case PhyllotaxisMode.Whorled: {
220
+ const w_size = Math.max(1, fol.whorl_count | 0);
221
+ const w_idx = Math.floor(k / w_size);
222
+ const sub_idx = k % w_size;
223
+ phi += (sub_idx * PI2) / w_size + (w_idx * Math.PI) / w_size;
224
+ break;
225
+ }
226
+ case PhyllotaxisMode.SpiralGolden:
227
+ default:
228
+ phi += k * GOLDEN_ANGLE;
229
+ break;
230
+ }
231
+ }
232
+ phi += (rng() * 2.0 - 1.0) * fol.angular_jitter;
233
+
234
+ const cos_p = Math.cos(phi);
235
+ const sin_p = Math.sin(phi);
236
+ const drx = cos_p * rx + sin_p * ry_f * 0 + sin_p * sx;
237
+ const dry = cos_p * ry_f + sin_p * sy_f;
238
+ const drz = cos_p * rz + sin_p * sz;
239
+
240
+ // Anchor card stem origin on the actual meshed bark frustum chord [ra, rb]
241
+ // and interpolate the carrier frustum's exact 4-slot skinning weights
242
+ let px = SCRATCH_POS[0];
243
+ let py = SCRATCH_POS[1];
244
+ let pz = SCRATCH_POS[2];
245
+ let seg_tx = SCRATCH_TAN[0];
246
+ let seg_ty = SCRATCH_TAN[1];
247
+ let seg_tz = SCRATCH_TAN[2];
248
+
249
+ const c4 = cursor * 4;
250
+ const c2 = cursor * 2;
251
+
252
+ if (b_rings && b_rings.length >= 2) {
253
+ const ring_idx = Math.min(seg_idx, b_rings.length - 2);
254
+ const ra = b_rings[ring_idx];
255
+ const rb = b_rings[ring_idx + 1];
256
+ const xi = clamp((t_attach - ra.t_norm) / Math.max(1e-5, rb.t_norm - ra.t_norm), 0.05, 0.95);
257
+
258
+ px = lerp(ra.cx, rb.cx, xi);
259
+ py = lerp(ra.cy, rb.cy, xi);
260
+ pz = lerp(ra.cz, rb.cz, xi);
261
+
262
+ const dx_seg = rb.cx - ra.cx;
263
+ const dy_seg = rb.cy - ra.cy;
264
+ const dz_seg = rb.cz - ra.cz;
265
+ const seg_len = Math.hypot(dx_seg, dy_seg, dz_seg);
266
+ if (seg_len > 1e-6) {
267
+ seg_tx = dx_seg / seg_len;
268
+ seg_ty = dy_seg / seg_len;
269
+ seg_tz = dz_seg / seg_len;
270
+ }
271
+
272
+ // Merge 4-slot skinning weights from ra (weight 1 - xi) and rb (weight xi)
273
+ const merged_j = [-1, -1, -1, -1, -1, -1, -1, -1];
274
+ const merged_w = [0, 0, 0, 0, 0, 0, 0, 0];
275
+ let m_count = 0;
276
+
277
+ const accumulate_joint = (j_id, w_val) => {
278
+ if (w_val <= 1e-7) return;
279
+ for (let m = 0; m < m_count; m++) {
280
+ if (merged_j[m] === j_id) {
281
+ merged_w[m] += w_val;
282
+ return;
283
+ }
284
+ }
285
+ merged_j[m_count] = j_id;
286
+ merged_w[m_count] = w_val;
287
+ m_count++;
288
+ };
289
+
290
+ const w_a = 1.0 - xi;
291
+ const w_b = xi;
292
+ accumulate_joint(ra.j0, ra.w0 * w_a);
293
+ accumulate_joint(ra.j1, ra.w1 * w_a);
294
+ accumulate_joint(ra.j2, ra.w2 * w_a);
295
+ accumulate_joint(ra.j3, ra.w3 * w_a);
296
+ accumulate_joint(rb.j0, rb.w0 * w_b);
297
+ accumulate_joint(rb.j1, rb.w1 * w_b);
298
+ accumulate_joint(rb.j2, rb.w2 * w_b);
299
+ accumulate_joint(rb.j3, rb.w3 * w_b);
300
+
301
+ // Sort descending by weight and normalize top 4
302
+ for (let a = 0; a < m_count - 1; a++) {
303
+ for (let b_sort = a + 1; b_sort < m_count; b_sort++) {
304
+ if (merged_w[b_sort] > merged_w[a]) {
305
+ const tw = merged_w[a];
306
+ merged_w[a] = merged_w[b_sort];
307
+ merged_w[b_sort] = tw;
308
+ const tj = merged_j[a];
309
+ merged_j[a] = merged_j[b_sort];
310
+ merged_j[b_sort] = tj;
311
+ }
312
+ }
313
+ }
314
+
315
+ const top_k = Math.min(4, m_count);
316
+ let w4_sum = 0.0;
317
+ for (let s = 0; s < top_k; s++) w4_sum += merged_w[s];
318
+ const inv_w4 = w4_sum > 1e-7 ? 1.0 / w4_sum : 1.0;
319
+
320
+ for (let s = 0; s < 4; s++) {
321
+ if (s < top_k) {
322
+ joints4[c4 + s] = merged_j[s];
323
+ weights4[c4 + s] = merged_w[s] * inv_w4;
324
+ } else {
325
+ joints4[c4 + s] = 0;
326
+ weights4[c4 + s] = 0.0;
327
+ }
328
+ }
329
+
330
+ // Populate 2-slot legacy joints/weights normalized to sum to 1.0
331
+ const j_prim = top_k > 0 ? merged_j[0] : 0;
332
+ const j_par = top_k > 1 ? merged_j[1] : j_prim;
333
+ const w0_raw = top_k > 0 ? merged_w[0] : 1.0;
334
+ const w1_raw = top_k > 1 ? merged_w[1] : 0.0;
335
+ const w2_sum = w0_raw + w1_raw;
336
+ joints[c2] = j_prim;
337
+ joints[c2 + 1] = j_par;
338
+ weights[c2] = w2_sum > 1e-7 ? w0_raw / w2_sum : 1.0;
339
+ weights[c2 + 1] = w2_sum > 1e-7 ? w1_raw / w2_sum : 0.0;
340
+ } else {
341
+ const j_prim = skeleton.node_read_joint(v1, 0);
342
+ const j_par = skeleton.node_read_joint(v1, 1);
343
+ const w_prim = j_prim === j_par ? 1.0 : clamp(0.35 + 0.65 * t_attach, 0.0, 1.0);
344
+ joints[c2] = j_prim;
345
+ joints[c2 + 1] = j_par;
346
+ weights[c2] = w_prim;
347
+ weights[c2 + 1] = 1.0 - w_prim;
348
+ joints4[c4] = j_prim;
349
+ joints4[c4 + 1] = j_par;
350
+ weights4[c4] = w_prim;
351
+ weights4[c4 + 1] = 1.0 - w_prim;
352
+ }
353
+
354
+ // Outward canopy normal n_canopy from crown center
355
+ let ncx = px - cx;
356
+ let ncy = (py - cy) + 0.35 * ry;
357
+ let ncz = pz - cz;
358
+ const nc_len = Math.sqrt(ncx * ncx + ncy * ncy + ncz * ncz);
359
+ if (nc_len > 1e-6) {
360
+ ncx /= nc_len;
361
+ ncy /= nc_len;
362
+ ncz /= nc_len;
363
+ } else {
364
+ ncx = 0.0;
365
+ ncy = 1.0;
366
+ ncz = 0.0;
367
+ }
368
+
369
+ // Initial card forward axis F along insertion angle from branch frustum tangent toward D_rad
370
+ const ins_angle = is_rosette ? fol.insertion_angle * 0.55 : fol.insertion_angle;
371
+ const cos_a = Math.cos(ins_angle);
372
+ const sin_a = Math.sin(ins_angle);
373
+ let fx = cos_a * seg_tx + sin_a * drx;
374
+ let fy = cos_a * seg_ty + sin_a * dry;
375
+ let fz = cos_a * seg_tz + sin_a * drz;
376
+
377
+ // Blend phototropism (outward/sky) and gravitropism (downward droop along -Y)
378
+ fx += fol.phototropism * 0.45 * ncx + (rng() * 2.0 - 1.0) * fol.angular_jitter * 0.35;
379
+ fy += fol.phototropism * 0.25 * Math.max(0.0, ncy) - fol.gravitropism * 0.85;
380
+ fz += fol.phototropism * 0.45 * ncz + (rng() * 2.0 - 1.0) * fol.angular_jitter * 0.35;
381
+
382
+ const f_len = Math.sqrt(fx * fx + fy * fy + fz * fz);
383
+ if (f_len > 1e-8) {
384
+ fx /= f_len;
385
+ fy /= f_len;
386
+ fz /= f_len;
387
+ } else {
388
+ fx = drx;
389
+ fy = dry;
390
+ fz = drz;
391
+ }
392
+
393
+ // Desired card upward normal U: blend of world +Y and outward canopy normal n_canopy
394
+ let ux = ncx * 0.45;
395
+ let uy = 0.65 + ncy * 0.35;
396
+ let uz = ncz * 0.45;
397
+ // Gram-Schmidt orthogonalize U against F
398
+ const dot_uf = ux * fx + uy * fy + uz * fz;
399
+ ux -= dot_uf * fx;
400
+ uy -= dot_uf * fy;
401
+ uz -= dot_uf * fz;
402
+ const u_len = Math.sqrt(ux * ux + uy * uy + uz * uz);
403
+ if (u_len > 1e-6) {
404
+ ux /= u_len;
405
+ uy /= u_len;
406
+ uz /= u_len;
407
+ } else {
408
+ // Fallback perpendicular to F
409
+ if (Math.abs(fy) < 0.9) {
410
+ ux = -fz;
411
+ uy = 0.0;
412
+ uz = fx;
413
+ } else {
414
+ ux = 1.0;
415
+ uy = 0.0;
416
+ uz = 0.0;
417
+ }
418
+ const d2 = ux * fx + uy * fy + uz * fz;
419
+ ux -= d2 * fx;
420
+ uy -= d2 * fy;
421
+ uz -= d2 * fz;
422
+ const l2 = Math.sqrt(ux * ux + uy * uy + uz * uz);
423
+ ux /= l2;
424
+ uy /= l2;
425
+ uz /= l2;
426
+ }
427
+
428
+ // Enforce outward/sky hemisphere alignment: dot(U, n_canopy + (0, 0.5, 0)) >= 0
429
+ if (ux * ncx + uy * (ncy + 0.5) + uz * ncz < 0.0) {
430
+ ux = -ux;
431
+ uy = -uy;
432
+ uz = -uz;
433
+ }
434
+
435
+ // W = F x U so that (W, F) card triangles have face normal W x F = +U!
436
+ const wx = fy * uz - fz * uy;
437
+ const wy = fz * ux - fx * uz;
438
+ const wz = fx * uy - fy * ux;
439
+
440
+ const c3 = cursor * 3;
441
+
442
+ positions[c3] = px;
443
+ positions[c3 + 1] = py;
444
+ positions[c3 + 2] = pz;
445
+
446
+ forward[c3] = fx;
447
+ forward[c3 + 1] = fy;
448
+ forward[c3 + 2] = fz;
449
+
450
+ up[c3] = ux;
451
+ up[c3 + 1] = uy;
452
+ up[c3 + 2] = uz;
453
+
454
+ right[c3] = wx;
455
+ right[c3 + 1] = wy;
456
+ right[c3 + 2] = wz;
457
+
458
+ const scale_var = 1.0 + (rng() * 2.0 - 1.0) * fol.size_variance;
459
+ const card_scale = Math.max(0.25, scale_var * (is_rosette ? 0.92 : 1.0));
460
+ scales[cursor] = card_scale;
461
+
462
+ const t64 = new Transform64();
463
+ t64.setTranslation(px, py, pz);
464
+ t64_look_rotation(t64, fx, fy, fz, ux, uy, uz);
465
+ t64.setScaleScalar(card_scale);
466
+ t64.updateMatrix();
467
+ transforms[cursor] = t64;
468
+
469
+ // Golden-ratio low-discrepancy rank in [0, 1)
470
+ ranks[cursor] = ((cursor * GOLDEN_CONJUGATE) + b_phase * 0.13) % 1.0;
471
+ phases[cursor] = (b_phase + k * 0.17) % 1.0;
472
+ branch_sway[cursor] = clamp((level + t_attach) * 0.28, 0.1, 1.0);
473
+ color_jitter[cursor] = rng() * 2.0 - 1.0;
474
+
475
+ cursor++;
476
+ }
477
+ }
478
+
479
+ return {
480
+ count: cursor,
481
+ transforms,
482
+ positions,
483
+ forward,
484
+ up,
485
+ right,
486
+ scales,
487
+ ranks,
488
+ phases,
489
+ branch_sway,
490
+ color_jitter,
491
+ joints,
492
+ weights,
493
+ joints4,
494
+ weights4,
495
+ attr_ranks: Attribute.from(ranks, 1, "foliage_ranks"),
496
+ attr_phases: Attribute.from(phases, 1, "foliage_phases"),
497
+ attr_branch_sway: Attribute.from(branch_sway, 1, "foliage_branch_sway"),
498
+ attr_color_jitter: Attribute.from(color_jitter, 1, "foliage_color_jitter"),
499
+ attr_joints: Attribute.from(joints, 2, "foliage_joints"),
500
+ attr_weights: Attribute.from(weights, 2, "foliage_weights")
501
+ };
502
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Computes analytic volumetric crown ambient occlusion (combining normalized crown-shell depth
3
+ * and vertical sky exposure) into `StandardAttributes.Color` (`vec3<f32>`), and optionally
4
+ * applies hemisphere-safe normal puffing (`dot(n_puffed, n_orig) >= 0.55`) onto `StandardAttributes.Normal`.
5
+ *
6
+ * @param {import("../../../shade/renderer/geometry/Geometry.js").Geometry} geometry
7
+ * @param {ArrayLike<number>} crown_center `[cx, cy, cz]`
8
+ * @param {ArrayLike<number>} crown_radii `[rx, ry, rz]`
9
+ * @param {Object} [options]
10
+ * @param {number} [options.ao_core_darkening=0.35]
11
+ * @param {number} [options.normal_puffiness=0.0]
12
+ * @param {boolean} [options.preserve_existing_color=true]
13
+ */
14
+ export function tree_mesh_apply_canopy_ao(geometry: import("../../../shade/renderer/geometry/Geometry.js").Geometry, crown_center: ArrayLike<number>, crown_radii: ArrayLike<number>, options?: {
15
+ ao_core_darkening?: number;
16
+ normal_puffiness?: number;
17
+ preserve_existing_color?: boolean;
18
+ }): void;
19
+ //# sourceMappingURL=tree_mesh_apply_canopy_ao.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree_mesh_apply_canopy_ao.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AACH,oDARW,OAAO,8CAA8C,EAAE,QAAQ,gBAC/D,UAAU,MAAM,CAAC,eACjB,UAAU,MAAM,CAAC;IAEA,iBAAiB,GAAlC,MAAM;IACW,gBAAgB,GAAjC,MAAM;IACY,uBAAuB,GAAzC,OAAO;SAoIjB"}