@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.
- package/package.json +1 -1
- package/src/core/math/noise/worley_noise_2d.d.ts +14 -0
- package/src/core/math/noise/worley_noise_2d.d.ts.map +1 -0
- package/src/core/math/noise/worley_noise_2d.js +74 -0
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts +12 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts +52 -0
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +447 -450
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -22
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +892 -951
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/generation/foliage/FOLIAGE_DESIGN.md +2 -1
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts +4 -3
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/BarkMaterialConfig.js +6 -6
- package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
- package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageBarkType.js +16 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +58 -5
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -181
- package/src/generation/foliage/index.d.ts +2 -1
- package/src/generation/foliage/index.js +44 -43
- package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_bark_material.js +23 -95
- package/src/generation/foliage/material/make_foliage_material.d.ts +29 -3
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_foliage_material.js +605 -359
- package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -1
- package/src/generation/foliage/mesh/branch_collar_project.js +205 -203
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +15 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -502
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -1047
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +2 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -415
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
- package/src/generation/foliage/presets/make_tree_species_preset.js +870 -837
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -121
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +10 -7
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -179
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -1104
- package/src/shade/playground/foliage_wind/foliage_world.d.ts +6 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
- package/src/shade/playground/foliage_wind/foliage_world.js +602 -593
- package/src/shade/playground/foliage_wind/index.html +260 -254
- package/src/shade/playground/foliage_wind/main.js +275 -263
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
- package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +67 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +4 -3
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +21 -38
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts +24 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +31 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +356 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts +16 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts +23 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts.map +1 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
- package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
- package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
- package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
|
@@ -1,179 +1,206 @@
|
|
|
1
|
-
import { clamp } from "../../../core/math/clamp.js";
|
|
2
|
-
import { lerp } from "../../../core/math/lerp.js";
|
|
3
|
-
import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* each node's
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
1
|
+
import { clamp } from "../../../core/math/clamp.js";
|
|
2
|
+
import { lerp } from "../../../core/math/lerp.js";
|
|
3
|
+
import { TreeSpeciesConfig } from "../config/TreeSpeciesConfig.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Enforces Da Vinci's pipe-model cross-sectional area conservation across a `TreeSkeleton`
|
|
7
|
+
* in a bottom-up post-order pass:
|
|
8
|
+
*
|
|
9
|
+
* $$r_{\text{parent}}^\alpha = \sum_{k} r_{\text{child}, k}^\alpha$$
|
|
10
|
+
*
|
|
11
|
+
* Blended with each node's initial parametric taper radius via `pipe_model_weight`, while
|
|
12
|
+
* preserving boundary conditions at both the branch base ($t = 0$) and terminal shoot apex ($t = 1$)
|
|
13
|
+
* so neither trunk nor branch tips inflate into blunt stubs.
|
|
14
|
+
*
|
|
15
|
+
* @param {import("./TreeSkeleton.js").TreeSkeleton} skeleton
|
|
16
|
+
* @param {TreeSpeciesConfig} [config]
|
|
17
|
+
* @returns {import("./TreeSkeleton.js").TreeSkeleton}
|
|
18
|
+
*/
|
|
19
|
+
export function tree_skeleton_compute_pipe_radii(
|
|
20
|
+
skeleton,
|
|
21
|
+
config = new TreeSpeciesConfig()
|
|
22
|
+
) {
|
|
23
|
+
const species = config && config.isTreeSpeciesConfig ? config : TreeSpeciesConfig.from(config);
|
|
24
|
+
const n = skeleton.node_count;
|
|
25
|
+
const seg_count = skeleton.segment_count;
|
|
26
|
+
const branch_count = skeleton.branch_count;
|
|
27
|
+
if (n === 0) return skeleton;
|
|
28
|
+
|
|
29
|
+
const exp = clamp(species.crown.pipe_model_exponent ?? 2.05, 1.3, 3.0);
|
|
30
|
+
const inv_exp = 1.0 / exp;
|
|
31
|
+
const w_blend = clamp(species.crown.pipe_model_weight ?? 0.65, 0.0, 1.0);
|
|
32
|
+
|
|
33
|
+
// Save initial parametric radii and their alpha-power cross-sectional areas
|
|
34
|
+
const param_radii = new Float32Array(n);
|
|
35
|
+
const param_area = new Float64Array(n);
|
|
36
|
+
for (let v = 0; v < n; v++) {
|
|
37
|
+
const r = Math.max(0.0005, skeleton.node_read_radius(v));
|
|
38
|
+
param_radii[v] = r;
|
|
39
|
+
param_area[v] = Math.pow(r, exp);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Map each lateral child branch to the parent segment it attaches to
|
|
43
|
+
/** @type {Map<number, number[]>} */
|
|
44
|
+
const edge_lateral_branches = new Map();
|
|
45
|
+
for (let b = 1; b < branch_count; b++) {
|
|
46
|
+
const p_edge = skeleton.branch_parent_edge[b];
|
|
47
|
+
if (p_edge >= 0 && p_edge < seg_count) {
|
|
48
|
+
let list = edge_lateral_branches.get(p_edge);
|
|
49
|
+
if (list === undefined) {
|
|
50
|
+
list = [];
|
|
51
|
+
edge_lateral_branches.set(p_edge, list);
|
|
52
|
+
}
|
|
53
|
+
list.push(b);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Track accumulated alpha-area at each vertex
|
|
58
|
+
const pipe_area = new Float64Array(n);
|
|
59
|
+
// Track how many outgoing segments originate at each vertex (for shared-vertex bifurcations)
|
|
60
|
+
const outgoing_seg_count = new Int32Array(n);
|
|
61
|
+
const outgoing_seg_area = new Float64Array(n);
|
|
62
|
+
for (let s = 0; s < seg_count; s++) {
|
|
63
|
+
const v0 = skeleton.segment_v0(s);
|
|
64
|
+
if (v0 >= 0 && v0 < n) {
|
|
65
|
+
outgoing_seg_count[v0]++;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const branch_nodes = [];
|
|
70
|
+
const branch_edges = [];
|
|
71
|
+
|
|
72
|
+
// Process branches in reverse order (twigs -> boughs -> trunk) because parent_id < child_id
|
|
73
|
+
for (let b = branch_count - 1; b >= 0; b--) {
|
|
74
|
+
skeleton.collect_branch_chain(b, branch_nodes, branch_edges);
|
|
75
|
+
const m = branch_nodes.length;
|
|
76
|
+
if (m === 0) continue;
|
|
77
|
+
|
|
78
|
+
const root_v = branch_nodes[0];
|
|
79
|
+
const tip_v = branch_nodes[m - 1];
|
|
80
|
+
|
|
81
|
+
// 1. Anchor terminal tip vertex to its parametric bud/shoot area (plus any shared-vertex fork children)
|
|
82
|
+
let tip_area = param_area[tip_v];
|
|
83
|
+
if (outgoing_seg_count[tip_v] > 0 && outgoing_seg_area[tip_v] > tip_area) {
|
|
84
|
+
tip_area = outgoing_seg_area[tip_v];
|
|
85
|
+
}
|
|
86
|
+
pipe_area[tip_v] = tip_area;
|
|
87
|
+
|
|
88
|
+
// 2. Accumulate backward from tip to base along branch b's spine segments
|
|
89
|
+
for (let i = branch_edges.length - 1; i >= 0; i--) {
|
|
90
|
+
const e_id = branch_edges[i];
|
|
91
|
+
const v0 = branch_nodes[i];
|
|
92
|
+
const v1 = branch_nodes[i + 1];
|
|
93
|
+
|
|
94
|
+
// Telescoping parametric area differential along this internode segment
|
|
95
|
+
// (reproduces exact basal flare and continuous bole/shoot taper between junctions)
|
|
96
|
+
const min_step = Math.pow(param_radii[v1] * 0.08, exp);
|
|
97
|
+
const param_diff = Math.max(min_step, param_area[v0] - param_area[v1]);
|
|
98
|
+
|
|
99
|
+
// Sum cross-sectional area demand of lateral child branches attached to segment e_id
|
|
100
|
+
let lateral_demand = 0.0;
|
|
101
|
+
const child_branches = edge_lateral_branches.get(e_id);
|
|
102
|
+
if (child_branches !== undefined) {
|
|
103
|
+
for (let k = 0; k < child_branches.length; k++) {
|
|
104
|
+
const cb = child_branches[k];
|
|
105
|
+
const c_root = skeleton.branch_root_vertex[cb];
|
|
106
|
+
if (c_root >= 0 && c_root < n && c_root !== v0) {
|
|
107
|
+
const c_level = skeleton.branch_level[cb];
|
|
108
|
+
const lateral_weight = c_level === skeleton.branch_level[b] ? 0.75 : 0.08;
|
|
109
|
+
lateral_demand += lateral_weight * pipe_area[c_root];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const seg_upstream_area = pipe_area[v1] + param_diff + lateral_demand;
|
|
115
|
+
outgoing_seg_area[v0] += seg_upstream_area;
|
|
116
|
+
|
|
117
|
+
// If v0 is a shared bifurcation node with multiple outgoing segments, sum all outgoing segment areas
|
|
118
|
+
pipe_area[v0] = Math.max(seg_upstream_area, outgoing_seg_area[v0]);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 3. Normalize branch b's pipe_area profile so both tip (t=1) and base (t=0) boundary conditions
|
|
122
|
+
// are respected while preserving all intermediate Da Vinci junction step-downs
|
|
123
|
+
const a_raw_tip = pipe_area[tip_v];
|
|
124
|
+
const a_raw_root = pipe_area[root_v];
|
|
125
|
+
const a_target_tip = param_area[tip_v];
|
|
126
|
+
// Allow shared-vertex multi-segment forks to exceed single-stem param_area[root_v] when needed
|
|
127
|
+
const a_target_root = outgoing_seg_count[root_v] > 1
|
|
128
|
+
? Math.max(param_area[root_v], outgoing_seg_area[root_v])
|
|
129
|
+
: Math.max(a_target_tip * 1.05, param_area[root_v]);
|
|
130
|
+
|
|
131
|
+
const raw_span = a_raw_root - a_raw_tip;
|
|
132
|
+
const target_span = Math.max(0.0, a_target_root - a_target_tip);
|
|
133
|
+
|
|
134
|
+
for (let i = 0; i < m; i++) {
|
|
135
|
+
const v = branch_nodes[i];
|
|
136
|
+
let a_norm;
|
|
137
|
+
if (raw_span > 1e-12) {
|
|
138
|
+
const u_area = clamp((pipe_area[v] - a_raw_tip) / raw_span, 0.0, 1.0);
|
|
139
|
+
a_norm = a_target_tip + u_area * target_span;
|
|
140
|
+
} else {
|
|
141
|
+
a_norm = param_area[v];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Preserve strict fork area dominance at shared multi-segment vertices
|
|
145
|
+
if (outgoing_seg_count[v] > 1 && outgoing_seg_area[v] > a_norm) {
|
|
146
|
+
a_norm = outgoing_seg_area[v];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
pipe_area[v] = a_norm;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Convert normalized pipe areas back to radii and blend with parametric radii
|
|
154
|
+
for (let v = 0; v < n; v++) {
|
|
155
|
+
const pipe_r = Math.pow(Math.max(1e-12, pipe_area[v]), inv_exp);
|
|
156
|
+
const blended = lerp(param_radii[v], pipe_r, w_blend);
|
|
157
|
+
skeleton.node_write_radius(v, blended);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Enforce strict child-to-parent radius bound at every lateral branch attachment
|
|
161
|
+
// and monotonically non-increasing radii along each branch chain
|
|
162
|
+
for (let b = 0; b < branch_count; b++) {
|
|
163
|
+
skeleton.collect_branch_chain(b, branch_nodes, branch_edges);
|
|
164
|
+
const m = branch_nodes.length;
|
|
165
|
+
if (m === 0) continue;
|
|
166
|
+
|
|
167
|
+
const root_v = branch_nodes[0];
|
|
168
|
+
let max_allowed = skeleton.node_read_radius(root_v);
|
|
169
|
+
|
|
170
|
+
if (b > 0) {
|
|
171
|
+
const p_edge = skeleton.branch_parent_edge[b];
|
|
172
|
+
const attach_t = skeleton.branch_parent_attach_t[b];
|
|
173
|
+
if (p_edge >= 0 && p_edge < seg_count) {
|
|
174
|
+
const pv0 = skeleton.segment_v0(p_edge);
|
|
175
|
+
const pv1 = skeleton.segment_v1(p_edge);
|
|
176
|
+
const pt0 = skeleton.node_t_norm(pv0);
|
|
177
|
+
const pt1 = skeleton.node_t_norm(pv1);
|
|
178
|
+
const local_u = clamp((attach_t - pt0) / Math.max(1e-5, pt1 - pt0), 0.0, 1.0);
|
|
179
|
+
const pr0 = skeleton.node_read_radius(pv0);
|
|
180
|
+
const pr1 = skeleton.node_read_radius(pv1);
|
|
181
|
+
const parent_r = lerp(pr0, pr1, local_u);
|
|
182
|
+
const cap_r = parent_r * 0.82;
|
|
183
|
+
if (max_allowed > cap_r) {
|
|
184
|
+
const scale = cap_r / Math.max(1e-6, max_allowed);
|
|
185
|
+
for (let i = 0; i < m; i++) {
|
|
186
|
+
const v = branch_nodes[i];
|
|
187
|
+
skeleton.node_write_radius(v, skeleton.node_read_radius(v) * scale);
|
|
188
|
+
}
|
|
189
|
+
max_allowed = cap_r;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Ensure monotonic non-increasing radius from branch root to branch tip
|
|
195
|
+
let prev_r = skeleton.node_read_radius(root_v);
|
|
196
|
+
skeleton.branch_base_radius[b] = prev_r;
|
|
197
|
+
for (let i = 1; i < m; i++) {
|
|
198
|
+
const v = branch_nodes[i];
|
|
199
|
+
const cur_r = Math.min(prev_r, skeleton.node_read_radius(v));
|
|
200
|
+
skeleton.node_write_radius(v, cur_r);
|
|
201
|
+
prev_r = cur_r;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return skeleton;
|
|
206
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree_skeleton_grow.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/tree_skeleton_grow.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree_skeleton_grow.d.ts","sourceRoot":"","sources":["../../../../../src/generation/foliage/skeleton/tree_skeleton_grow.js"],"names":[],"mappings":"AAsOA;;;;;;;;;;;;;GAaG;AACH,4CAJW,iBAAiB,MAAO,QACxB,YAAY,GACV,YAAY,CA4lDxB;kCAn0DiC,gCAAgC;6BACrC,mBAAmB"}
|