@woosh/meep-engine 3.53.0 → 3.54.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 (194) hide show
  1. package/package.json +1 -1
  2. package/src/core/math/noise/worley_noise_2d.d.ts +14 -0
  3. package/src/core/math/noise/worley_noise_2d.d.ts.map +1 -0
  4. package/src/core/math/noise/worley_noise_2d.js +74 -0
  5. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
  6. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
  7. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
  8. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
  9. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
  10. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
  11. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
  12. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
  13. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
  14. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
  15. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
  16. package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
  17. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts +12 -0
  18. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
  19. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
  20. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
  21. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  22. package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
  23. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts +52 -0
  24. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
  25. package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
  26. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  27. package/src/engine/graphics3/DecalSystem.js +447 -450
  28. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -22
  29. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  30. package/src/engine/graphics3/GPUParticleEmitterSystem.js +892 -951
  31. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  32. package/src/generation/foliage/FOLIAGE_DESIGN.md +2 -1
  33. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +4 -3
  34. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -1
  35. package/src/generation/foliage/config/BarkMaterialConfig.js +6 -6
  36. package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
  37. package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
  38. package/src/generation/foliage/config/FoliageBarkType.js +16 -0
  39. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +58 -5
  40. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  41. package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -181
  42. package/src/generation/foliage/index.d.ts +2 -1
  43. package/src/generation/foliage/index.js +44 -43
  44. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -1
  45. package/src/generation/foliage/material/make_bark_material.js +23 -95
  46. package/src/generation/foliage/material/make_foliage_material.d.ts +29 -3
  47. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  48. package/src/generation/foliage/material/make_foliage_material.js +605 -359
  49. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -1
  50. package/src/generation/foliage/mesh/branch_collar_project.js +205 -203
  51. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +15 -0
  52. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  53. package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -502
  54. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  55. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -1047
  56. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +2 -1
  57. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  58. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -415
  59. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  60. package/src/generation/foliage/presets/make_tree_species_preset.js +870 -837
  61. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -121
  62. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +10 -7
  63. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  64. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -179
  65. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  66. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -1104
  67. package/src/shade/playground/foliage_wind/foliage_world.d.ts +6 -0
  68. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  69. package/src/shade/playground/foliage_wind/foliage_world.js +602 -593
  70. package/src/shade/playground/foliage_wind/index.html +260 -254
  71. package/src/shade/playground/foliage_wind/main.js +275 -263
  72. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  73. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  74. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  75. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  76. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  77. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1 -1
  78. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
  79. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  80. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
  81. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
  82. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
  83. package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
  84. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
  85. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
  86. package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
  87. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
  88. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
  89. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
  90. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
  91. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  92. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
  93. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
  94. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  95. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
  96. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
  97. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
  98. package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
  99. package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
  100. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  101. package/src/shade/renderer/light/GPULightCollection.js +67 -0
  102. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
  103. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
  104. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
  105. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
  106. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
  107. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
  108. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
  109. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
  110. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
  111. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
  112. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
  113. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
  114. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
  115. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
  116. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
  117. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
  118. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
  119. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
  120. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
  121. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
  122. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
  123. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  124. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  125. package/src/shade/renderer/particles/GPUParticleSystem.js +4 -3
  126. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
  127. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  128. package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
  129. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
  130. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
  131. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
  132. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  133. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +21 -38
  134. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  135. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
  136. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
  137. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
  138. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
  139. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
  140. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
  141. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
  142. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
  143. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
  144. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
  145. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
  146. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
  147. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
  148. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
  149. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  150. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
  151. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts +24 -0
  152. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts.map +1 -0
  153. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +1 -1
  154. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
  155. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
  156. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
  157. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
  158. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
  159. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
  160. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
  161. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
  162. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
  163. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
  164. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
  165. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
  166. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
  167. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
  168. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
  169. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
  170. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
  171. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +31 -0
  172. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
  173. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +113 -0
  174. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
  175. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
  176. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +356 -0
  177. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
  178. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
  179. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
  180. package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts +16 -0
  181. package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts.map +1 -0
  182. package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts +23 -0
  183. package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts.map +1 -0
  184. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  185. package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
  186. package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
  187. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
  188. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
  189. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
  190. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
  191. package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
  192. package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
  193. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
  194. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
@@ -1 +1 @@
1
- {"version":3,"file":"branch_collar_project.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/mesh/branch_collar_project.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,+CA5BW,MAAM,EAAE,GAAC,YAAY,kBACrB,MAAM,YACN,MAAM,EAAE,GAAC,YAAY,mBACrB,MAAM,UACN,MAAM,UACN,MAAM,UACN,MAAM,WACN,MAAM,WACN,MAAM,WACN,MAAM,YACN,MAAM,YACN,MAAM,YACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,iBACN,MAAM,eACN,MAAM,gBACN,MAAM,2BACN,MAAM,2BACN,MAAM,uBACN,MAAM,UACN,MAAM,UACN,MAAM,QAiKhB"}
1
+ {"version":3,"file":"branch_collar_project.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/mesh/branch_collar_project.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,+CA5BW,MAAM,EAAE,GAAC,YAAY,kBACrB,MAAM,YACN,MAAM,EAAE,GAAC,YAAY,mBACrB,MAAM,UACN,MAAM,UACN,MAAM,UACN,MAAM,WACN,MAAM,WACN,MAAM,WACN,MAAM,YACN,MAAM,YACN,MAAM,YACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,aACN,MAAM,iBACN,MAAM,eACN,MAAM,gBACN,MAAM,2BACN,MAAM,2BACN,MAAM,uBACN,MAAM,UACN,MAAM,UACN,MAAM,QAmKhB"}
@@ -1,203 +1,205 @@
1
- import { clamp } from "../../../core/math/clamp.js";
2
- import { lerp } from "../../../core/math/lerp.js";
3
-
4
- /**
5
- * Projects a child branch collar vertex `(ring_x, ring_y, ring_z)` into the parent branch's
6
- * polygonal frustum in the orthonormal $(\mathbf{T}_p, \hat{\mathbf{u}}, \hat{\mathbf{w}})$ basis,
7
- * guaranteeing that:
8
- * 1. Every welded base vertex (`weld_factor === 1`) sits strictly inside the parent polygon's
9
- * inscribed apothem radius $R_{\text{apothem}}(z) = R_p(z) (1 - \text{flute\_amp}_p) \cos(\pi / M_p)$
10
- * at the vertex's axial height $z$ (preventing any daylight gap outside polygonal parent facets or tapering segments).
11
- * 2. Every welded base vertex lands strictly on the emerging $+\hat{\mathbf{u}}$ hemisphere of the
12
- * parent axis ($q_u > 0$, preventing any backward protrusion through the opposite side of the parent branch).
13
- * 3. Axial offset $z$ along $\mathbf{T}_p$ is bounded within $[z_{\min}, z_{\max}]$.
14
- * 4. Outward normals blend smoothly ($C^1$) from the parent cylinder normal to the child tube normal.
15
- *
16
- * @param {number[]|Float32Array} out_pos
17
- * @param {number} out_pos_offset
18
- * @param {number[]|Float32Array} out_norm
19
- * @param {number} out_norm_offset
20
- * @param {number} ring_x flared child ring vertex X
21
- * @param {number} ring_y flared child ring vertex Y
22
- * @param {number} ring_z flared child ring vertex Z
23
- * @param {number} tube_nx outward child tube normal X
24
- * @param {number} tube_ny outward child tube normal Y
25
- * @param {number} tube_nz outward child tube normal Z
26
- * @param {number} child_tx unit child spine tangent X
27
- * @param {number} child_ty unit child spine tangent Y
28
- * @param {number} child_tz unit child spine tangent Z
29
- * @param {number} parent_px parent attachment center X
30
- * @param {number} parent_py parent attachment center Y
31
- * @param {number} parent_pz parent attachment center Z
32
- * @param {number} parent_tx unit parent spine tangent X
33
- * @param {number} parent_ty unit parent spine tangent Y
34
- * @param {number} parent_tz unit parent spine tangent Z
35
- * @param {number} parent_radius parent branch radius at attachment
36
- * @param {number} weld_factor in [0, 1] (1 at base ring i=0, decaying to 0 across collar rings)
37
- * @param {number} normal_blend in [0, 1] blend weight toward parent normal
38
- * @param {number} [parent_radial_segments=8] radial polygon vertex count M_p of parent branch
39
- * @param {number} [parent_flute_amplitude=0.0] flute amplitude of parent branch
40
- * @param {number} [parent_taper_slope=0.0] linear radius change dR_p/dz along parent_T
41
- * @param {number} [z_min=-Infinity] minimum axial offset along parent_T
42
- * @param {number} [z_max=Infinity] maximum axial offset along parent_T
43
- */
44
- export function branch_collar_project(
45
- out_pos,
46
- out_pos_offset,
47
- out_norm,
48
- out_norm_offset,
49
- ring_x, ring_y, ring_z,
50
- tube_nx, tube_ny, tube_nz,
51
- child_tx, child_ty, child_tz,
52
- parent_px, parent_py, parent_pz,
53
- parent_tx, parent_ty, parent_tz,
54
- parent_radius,
55
- weld_factor,
56
- normal_blend,
57
- parent_radial_segments = 8,
58
- parent_flute_amplitude = 0.0,
59
- parent_taper_slope = 0.0,
60
- z_min = -Infinity,
61
- z_max = Infinity
62
- ) {
63
- const w = clamp(weld_factor, 0.0, 1.0);
64
- if (w <= 1e-5 || parent_radius <= 1e-5) {
65
- out_pos[out_pos_offset] = ring_x;
66
- out_pos[out_pos_offset + 1] = ring_y;
67
- out_pos[out_pos_offset + 2] = ring_z;
68
- out_norm[out_norm_offset] = tube_nx;
69
- out_norm[out_norm_offset + 1] = tube_ny;
70
- out_norm[out_norm_offset + 2] = tube_nz;
71
- return;
72
- }
73
-
74
- // Polygon apothem factor of parent branch cross-section
75
- const m_p = Math.max(3, parent_radial_segments | 0);
76
- const flute_guard = Math.max(0.5, 1.0 - Math.max(0.0, parent_flute_amplitude));
77
- const apothem_factor = Math.cos(Math.PI / m_p) * flute_guard;
78
- const seat_ratio = 0.78 * apothem_factor;
79
-
80
- // Vector from parent axis point to ring vertex
81
- const dx = ring_x - parent_px;
82
- const dy = ring_y - parent_py;
83
- const dz = ring_z - parent_pz;
84
-
85
- // Axial coordinate z_0 along parent_T and perpendicular radial offset q_0
86
- const z_0 = dx * parent_tx + dy * parent_ty + dz * parent_tz;
87
- const qx = dx - z_0 * parent_tx;
88
- const qy = dy - z_0 * parent_ty;
89
- const qz = dz - z_0 * parent_tz;
90
-
91
- // Component of child_T perpendicular to parent_T
92
- const dot_ct_pt = child_tx * parent_tx + child_ty * parent_ty + child_tz * parent_tz;
93
- let ux = child_tx - dot_ct_pt * parent_tx;
94
- let uy = child_ty - dot_ct_pt * parent_ty;
95
- let uz = child_tz - dot_ct_pt * parent_tz;
96
- const u_len = Math.sqrt(ux * ux + uy * uy + uz * uz);
97
-
98
- let unx = 0.0, uny = 0.0, unz = 0.0;
99
- if (u_len > 1e-5) {
100
- unx = ux / u_len;
101
- uny = uy / u_len;
102
- unz = uz / u_len;
103
- } else {
104
- // Fallback orthogonal unit vector when child_T is collinear with parent_T
105
- const q_len = Math.sqrt(qx * qx + qy * qy + qz * qz);
106
- if (q_len > 1e-6) {
107
- unx = qx / q_len;
108
- uny = qy / q_len;
109
- unz = qz / q_len;
110
- } else {
111
- if (Math.abs(parent_ty) < 0.9) {
112
- unx = -parent_tz;
113
- uny = 0.0;
114
- unz = parent_tx;
115
- } else {
116
- unx = 1.0;
117
- uny = 0.0;
118
- unz = 0.0;
119
- }
120
- const d_p = unx * parent_tx + uny * parent_ty + unz * parent_tz;
121
- unx -= d_p * parent_tx;
122
- uny -= d_p * parent_ty;
123
- unz -= d_p * parent_tz;
124
- const nl = Math.sqrt(unx * unx + uny * uny + unz * unz) || 1.0;
125
- unx /= nl;
126
- uny /= nl;
127
- unz /= nl;
128
- }
129
- }
130
-
131
- // Lateral binormal w_hat = parent_T x u_hat
132
- const wnx = parent_ty * unz - parent_tz * uny;
133
- const wny = parent_tz * unx - parent_tx * unz;
134
- const wnz = parent_tx * uny - parent_ty * unx;
135
-
136
- const q_u = qx * unx + qy * uny + qz * unz;
137
- const q_w = qx * wnx + qy * wny + qz * wnz;
138
-
139
- const z_bound_min = Math.max(z_min, -0.95 * parent_radius);
140
- const z_bound_max = Math.min(z_max, 0.95 * parent_radius);
141
- const z_proj = z_bound_min <= z_bound_max
142
- ? clamp(z_0, z_bound_min, z_bound_max)
143
- : clamp(z_0, z_min, z_max);
144
-
145
- // Evaluate tapered parent radius and inscribed seat radius at z_proj
146
- const r_parent_at_z = Math.max(0.25 * parent_radius, parent_radius + z_proj * parent_taper_slope);
147
- const r_seat = r_parent_at_z * seat_ratio;
148
-
149
- const q_w_proj = clamp(q_w, -0.78 * r_seat, 0.78 * r_seat);
150
- const q_u_max = Math.sqrt(Math.max(0.0, r_seat * r_seat - q_w_proj * q_w_proj));
151
- const s_u = clamp(q_u / Math.max(1e-5, r_parent_at_z), -1.0, 1.0);
152
- const q_u_proj = q_u_max * (0.90 + 0.08 * s_u);
153
-
154
- const proj_x = parent_px + z_proj * parent_tx + q_u_proj * unx + q_w_proj * wnx;
155
- const proj_y = parent_py + z_proj * parent_ty + q_u_proj * uny + q_w_proj * wny;
156
- const proj_z = parent_pz + z_proj * parent_tz + q_u_proj * unz + q_w_proj * wnz;
157
-
158
- const final_x = lerp(ring_x, proj_x, w);
159
- const final_y = lerp(ring_y, proj_y, w);
160
- const final_z = lerp(ring_z, proj_z, w);
161
-
162
- out_pos[out_pos_offset] = final_x;
163
- out_pos[out_pos_offset + 1] = final_y;
164
- out_pos[out_pos_offset + 2] = final_z;
165
-
166
- // Compute parent cylinder outward normal at final position
167
- const fdx = final_x - parent_px;
168
- const fdy = final_y - parent_py;
169
- const fdz = final_z - parent_pz;
170
- const f_dot = fdx * parent_tx + fdy * parent_ty + fdz * parent_tz;
171
- let pnx = fdx - f_dot * parent_tx;
172
- let pny = fdy - f_dot * parent_ty;
173
- let pnz = fdz - f_dot * parent_tz;
174
- const pn_len = Math.sqrt(pnx * pnx + pny * pny + pnz * pnz);
175
- if (pn_len > 1e-6) {
176
- pnx /= pn_len;
177
- pny /= pn_len;
178
- pnz /= pn_len;
179
- } else {
180
- pnx = tube_nx;
181
- pny = tube_ny;
182
- pnz = tube_nz;
183
- }
184
-
185
- const nb = clamp(w * normal_blend, 0.0, 1.0);
186
- let nx = lerp(tube_nx, pnx, nb);
187
- let ny = lerp(tube_ny, pny, nb);
188
- let nz = lerp(tube_nz, pnz, nb);
189
- const n_len = Math.sqrt(nx * nx + ny * ny + nz * nz);
190
- if (n_len > 1e-8) {
191
- nx /= n_len;
192
- ny /= n_len;
193
- nz /= n_len;
194
- } else {
195
- nx = tube_nx;
196
- ny = tube_ny;
197
- nz = tube_nz;
198
- }
199
-
200
- out_norm[out_norm_offset] = nx;
201
- out_norm[out_norm_offset + 1] = ny;
202
- out_norm[out_norm_offset + 2] = nz;
203
- }
1
+ import { clamp } from "../../../core/math/clamp.js";
2
+ import { lerp } from "../../../core/math/lerp.js";
3
+
4
+ /**
5
+ * Projects a child branch collar vertex `(ring_x, ring_y, ring_z)` into the parent branch's
6
+ * polygonal frustum in the orthonormal $(\mathbf{T}_p, \hat{\mathbf{u}}, \hat{\mathbf{w}})$ basis,
7
+ * guaranteeing that:
8
+ * 1. Every welded base vertex (`weld_factor === 1`) sits strictly inside the parent polygon's
9
+ * inscribed apothem radius $R_{\text{apothem}}(z) = R_p(z) (1 - \text{flute\_amp}_p) \cos(\pi / M_p)$
10
+ * at the vertex's axial height $z$ (preventing any daylight gap outside polygonal parent facets or tapering segments).
11
+ * 2. Every welded base vertex lands strictly on the emerging $+\hat{\mathbf{u}}$ hemisphere of the
12
+ * parent axis ($q_u > 0$, preventing any backward protrusion through the opposite side of the parent branch).
13
+ * 3. Axial offset $z$ along $\mathbf{T}_p$ is bounded within $[z_{\min}, z_{\max}]$.
14
+ * 4. Outward normals blend smoothly ($C^1$) from the parent cylinder normal to the child tube normal.
15
+ *
16
+ * @param {number[]|Float32Array} out_pos
17
+ * @param {number} out_pos_offset
18
+ * @param {number[]|Float32Array} out_norm
19
+ * @param {number} out_norm_offset
20
+ * @param {number} ring_x flared child ring vertex X
21
+ * @param {number} ring_y flared child ring vertex Y
22
+ * @param {number} ring_z flared child ring vertex Z
23
+ * @param {number} tube_nx outward child tube normal X
24
+ * @param {number} tube_ny outward child tube normal Y
25
+ * @param {number} tube_nz outward child tube normal Z
26
+ * @param {number} child_tx unit child spine tangent X
27
+ * @param {number} child_ty unit child spine tangent Y
28
+ * @param {number} child_tz unit child spine tangent Z
29
+ * @param {number} parent_px parent attachment center X
30
+ * @param {number} parent_py parent attachment center Y
31
+ * @param {number} parent_pz parent attachment center Z
32
+ * @param {number} parent_tx unit parent spine tangent X
33
+ * @param {number} parent_ty unit parent spine tangent Y
34
+ * @param {number} parent_tz unit parent spine tangent Z
35
+ * @param {number} parent_radius parent branch radius at attachment
36
+ * @param {number} weld_factor in [0, 1] (1 at base ring i=0, decaying to 0 across collar rings)
37
+ * @param {number} normal_blend in [0, 1] blend weight toward parent normal
38
+ * @param {number} [parent_radial_segments=8] radial polygon vertex count M_p of parent branch
39
+ * @param {number} [parent_flute_amplitude=0.0] flute amplitude of parent branch
40
+ * @param {number} [parent_taper_slope=0.0] linear radius change dR_p/dz along parent_T
41
+ * @param {number} [z_min=-Infinity] minimum axial offset along parent_T
42
+ * @param {number} [z_max=Infinity] maximum axial offset along parent_T
43
+ */
44
+ export function branch_collar_project(
45
+ out_pos,
46
+ out_pos_offset,
47
+ out_norm,
48
+ out_norm_offset,
49
+ ring_x, ring_y, ring_z,
50
+ tube_nx, tube_ny, tube_nz,
51
+ child_tx, child_ty, child_tz,
52
+ parent_px, parent_py, parent_pz,
53
+ parent_tx, parent_ty, parent_tz,
54
+ parent_radius,
55
+ weld_factor,
56
+ normal_blend,
57
+ parent_radial_segments = 8,
58
+ parent_flute_amplitude = 0.0,
59
+ parent_taper_slope = 0.0,
60
+ z_min = -Infinity,
61
+ z_max = Infinity
62
+ ) {
63
+ const w = clamp(weld_factor, 0.0, 1.0);
64
+ if (w <= 1e-5 || parent_radius <= 1e-5) {
65
+ out_pos[out_pos_offset] = ring_x;
66
+ out_pos[out_pos_offset + 1] = ring_y;
67
+ out_pos[out_pos_offset + 2] = ring_z;
68
+ out_norm[out_norm_offset] = tube_nx;
69
+ out_norm[out_norm_offset + 1] = tube_ny;
70
+ out_norm[out_norm_offset + 2] = tube_nz;
71
+ return;
72
+ }
73
+
74
+ // Polygon apothem factor of parent branch cross-section
75
+ const m_p = Math.max(3, parent_radial_segments | 0);
76
+ const flute_guard = Math.max(0.5, 1.0 - Math.max(0.0, parent_flute_amplitude));
77
+ const apothem_factor = Math.cos(Math.PI / m_p) * flute_guard;
78
+ const seat_ratio = 0.78 * apothem_factor;
79
+
80
+ // Vector from parent axis point to ring vertex
81
+ const dx = ring_x - parent_px;
82
+ const dy = ring_y - parent_py;
83
+ const dz = ring_z - parent_pz;
84
+
85
+ // Axial coordinate z_0 along parent_T and perpendicular radial offset q_0
86
+ const z_0 = dx * parent_tx + dy * parent_ty + dz * parent_tz;
87
+ const qx = dx - z_0 * parent_tx;
88
+ const qy = dy - z_0 * parent_ty;
89
+ const qz = dz - z_0 * parent_tz;
90
+
91
+ // Component of child_T perpendicular to parent_T
92
+ const dot_ct_pt = child_tx * parent_tx + child_ty * parent_ty + child_tz * parent_tz;
93
+ let ux = child_tx - dot_ct_pt * parent_tx;
94
+ let uy = child_ty - dot_ct_pt * parent_ty;
95
+ let uz = child_tz - dot_ct_pt * parent_tz;
96
+ const u_len = Math.sqrt(ux * ux + uy * uy + uz * uz);
97
+
98
+ let unx = 0.0, uny = 0.0, unz = 0.0;
99
+ if (u_len > 1e-5) {
100
+ unx = ux / u_len;
101
+ uny = uy / u_len;
102
+ unz = uz / u_len;
103
+ } else {
104
+ // Fallback orthogonal unit vector when child_T is collinear with parent_T
105
+ const q_len = Math.sqrt(qx * qx + qy * qy + qz * qz);
106
+ if (q_len > 1e-6) {
107
+ unx = qx / q_len;
108
+ uny = qy / q_len;
109
+ unz = qz / q_len;
110
+ } else {
111
+ if (Math.abs(parent_ty) < 0.9) {
112
+ unx = -parent_tz;
113
+ uny = 0.0;
114
+ unz = parent_tx;
115
+ } else {
116
+ unx = 1.0;
117
+ uny = 0.0;
118
+ unz = 0.0;
119
+ }
120
+ const d_p = unx * parent_tx + uny * parent_ty + unz * parent_tz;
121
+ unx -= d_p * parent_tx;
122
+ uny -= d_p * parent_ty;
123
+ unz -= d_p * parent_tz;
124
+ const nl = Math.sqrt(unx * unx + uny * uny + unz * unz) || 1.0;
125
+ unx /= nl;
126
+ uny /= nl;
127
+ unz /= nl;
128
+ }
129
+ }
130
+
131
+ // Lateral binormal w_hat = parent_T x u_hat
132
+ const wnx = parent_ty * unz - parent_tz * uny;
133
+ const wny = parent_tz * unx - parent_tx * unz;
134
+ const wnz = parent_tx * uny - parent_ty * unx;
135
+
136
+ const q_u = qx * unx + qy * uny + qz * unz;
137
+ const q_w = qx * wnx + qy * wny + qz * wnz;
138
+
139
+ const z_bound_min = Math.max(z_min, -0.95 * parent_radius);
140
+ const z_bound_max = Math.min(z_max, 0.95 * parent_radius);
141
+ const z_proj = z_bound_min <= z_bound_max
142
+ ? clamp(z_0, z_bound_min, z_bound_max)
143
+ : clamp(z_0, z_min, z_max);
144
+
145
+ // Evaluate tapered parent radius and inscribed seat radius at z_proj,
146
+ // ensuring conservative containment even when z_proj extends past the segment endpoint
147
+ const taper_delta = Math.min(0.0, z_proj * parent_taper_slope);
148
+ const r_parent_at_z = Math.max(0.10 * parent_radius, parent_radius + taper_delta);
149
+ const r_seat = r_parent_at_z * seat_ratio;
150
+
151
+ const q_w_proj = clamp(q_w, -0.78 * r_seat, 0.78 * r_seat);
152
+ const q_u_max = Math.sqrt(Math.max(0.0, r_seat * r_seat - q_w_proj * q_w_proj));
153
+ const s_u = clamp(q_u / Math.max(1e-5, r_parent_at_z), -1.0, 1.0);
154
+ const q_u_proj = q_u_max * (0.90 + 0.08 * s_u);
155
+
156
+ const proj_x = parent_px + z_proj * parent_tx + q_u_proj * unx + q_w_proj * wnx;
157
+ const proj_y = parent_py + z_proj * parent_ty + q_u_proj * uny + q_w_proj * wny;
158
+ const proj_z = parent_pz + z_proj * parent_tz + q_u_proj * unz + q_w_proj * wnz;
159
+
160
+ const final_x = lerp(ring_x, proj_x, w);
161
+ const final_y = lerp(ring_y, proj_y, w);
162
+ const final_z = lerp(ring_z, proj_z, w);
163
+
164
+ out_pos[out_pos_offset] = final_x;
165
+ out_pos[out_pos_offset + 1] = final_y;
166
+ out_pos[out_pos_offset + 2] = final_z;
167
+
168
+ // Compute parent cylinder outward normal at final position
169
+ const fdx = final_x - parent_px;
170
+ const fdy = final_y - parent_py;
171
+ const fdz = final_z - parent_pz;
172
+ const f_dot = fdx * parent_tx + fdy * parent_ty + fdz * parent_tz;
173
+ let pnx = fdx - f_dot * parent_tx;
174
+ let pny = fdy - f_dot * parent_ty;
175
+ let pnz = fdz - f_dot * parent_tz;
176
+ const pn_len = Math.sqrt(pnx * pnx + pny * pny + pnz * pnz);
177
+ if (pn_len > 1e-6) {
178
+ pnx /= pn_len;
179
+ pny /= pn_len;
180
+ pnz /= pn_len;
181
+ } else {
182
+ pnx = tube_nx;
183
+ pny = tube_ny;
184
+ pnz = tube_nz;
185
+ }
186
+
187
+ const nb = clamp(w * normal_blend, 0.0, 1.0);
188
+ let nx = lerp(tube_nx, pnx, nb);
189
+ let ny = lerp(tube_ny, pny, nb);
190
+ let nz = lerp(tube_nz, pnz, nb);
191
+ const n_len = Math.sqrt(nx * nx + ny * ny + nz * nz);
192
+ if (n_len > 1e-8) {
193
+ nx /= n_len;
194
+ ny /= n_len;
195
+ nz /= n_len;
196
+ } else {
197
+ nx = tube_nx;
198
+ ny = tube_ny;
199
+ nz = tube_nz;
200
+ }
201
+
202
+ out_norm[out_norm_offset] = nx;
203
+ out_norm[out_norm_offset + 1] = ny;
204
+ out_norm[out_norm_offset + 2] = nz;
205
+ }
@@ -12,6 +12,9 @@
12
12
  * @property {Float32Array} phases `count` per-card wind phase in [0, 1)
13
13
  * @property {Float32Array} branch_sway `count` parent branch sway weight in [0, 1]
14
14
  * @property {Float32Array} color_jitter `count` per-card luminance/tint jitter in [-1, 1]
15
+ * @property {Float32Array} maturities `count` per-card ontogenetic leaf maturity in [0, 1] (0 = juvenile tip, 1 = mature base)
16
+ * @property {Float32Array} sun_exposure `count` per-card canopy solar irradiance exposure in [0, 1]
17
+ * @property {Uint8Array} variant_indices `count` assigned foliage atlas variant index in `[0, variant_count - 1]`
15
18
  * @property {Uint16Array} joints `count * 2` `[j_primary, j_parent]`
16
19
  * @property {Float32Array} weights `count * 2` `[w_primary, w_parent]`
17
20
  */
@@ -67,6 +70,18 @@ export type FoliageAttachmentSet = {
67
70
  * `count` per-card luminance/tint jitter in [-1, 1]
68
71
  */
69
72
  color_jitter: Float32Array;
73
+ /**
74
+ * `count` per-card ontogenetic leaf maturity in [0, 1] (0 = juvenile tip, 1 = mature base)
75
+ */
76
+ maturities: Float32Array;
77
+ /**
78
+ * `count` per-card canopy solar irradiance exposure in [0, 1]
79
+ */
80
+ sun_exposure: Float32Array;
81
+ /**
82
+ * `count` assigned foliage atlas variant index in `[0, variant_count - 1]`
83
+ */
84
+ variant_indices: Uint8Array;
70
85
  /**
71
86
  * `count * 2` `[j_primary, j_parent]`
72
87
  */
@@ -1 +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"}
1
+ {"version":3,"file":"foliage_collect_attachments.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/mesh/foliage_collect_attachments.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;GAMG;AACH,sDAJW,OAAO,6BAA6B,EAAE,YAAY,WAClD,iBAAiB,GACf,oBAAoB,CAsgBhC;;;;;;;;WA5hBa,MAAM;;;;eACN,YAAY;;;;aACZ,YAAY;;;;QACZ,YAAY;;;;WACZ,YAAY;;;;YACZ,YAAY;;;;WACZ,YAAY;;;;YACZ,YAAY;;;;iBACZ,YAAY;;;;kBACZ,YAAY;;;;gBACZ,YAAY;;;;kBACZ,YAAY;;;;qBACZ,UAAU;;;;YACV,WAAW;;;;aACX,YAAY;;kCAhCQ,gCAAgC"}