@woosh/meep-engine 3.52.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 (515) 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/ecs/animation/Animation.d.ts +4 -25
  6. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  7. package/src/engine/ecs/animation/Animation.js +9 -41
  8. package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
  9. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  10. package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
  11. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
  12. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
  13. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
  14. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
  15. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
  16. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
  17. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
  18. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
  19. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
  20. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
  21. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
  22. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
  23. package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
  24. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts +12 -0
  25. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
  26. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
  27. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
  28. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  29. package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
  30. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts +52 -0
  31. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
  32. package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
  33. package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  35. package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
  36. package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
  37. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  38. package/src/engine/graphics3/AnimationSystem.js +62 -243
  39. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  40. package/src/engine/graphics3/DecalSystem.js +447 -450
  41. package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
  42. package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
  43. package/src/engine/graphics3/FoliageWindSystem.js +257 -0
  44. package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
  45. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  46. package/src/engine/graphics3/GPUFluidSystem.js +39 -1
  47. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -23
  48. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  49. package/src/engine/graphics3/GPUParticleEmitterSystem.js +904 -949
  50. package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
  51. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  52. package/src/engine/graphics3/animation/AnimationClips.js +207 -10
  53. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
  54. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
  55. package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
  56. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
  57. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
  58. package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
  59. package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
  60. package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
  61. package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
  62. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  63. package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
  64. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  65. package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
  66. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
  67. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
  68. package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
  69. package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
  70. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
  71. package/src/engine/graphics3/prefab/Prefab.js +169 -162
  72. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
  73. package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
  74. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  75. package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
  76. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
  77. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
  78. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  79. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
  80. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  81. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
  82. package/src/engine/sound/simulation/README.md +1 -1
  83. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
  84. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
  85. package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
  86. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  87. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
  88. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
  89. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
  90. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
  91. package/src/generation/foliage/FOLIAGE_DESIGN.md +319 -0
  92. package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
  93. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
  94. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
  95. package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
  96. package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
  97. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
  98. package/src/generation/foliage/asset/TreeAsset.js +111 -0
  99. package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
  100. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
  101. package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
  102. package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
  103. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
  104. package/src/generation/foliage/asset/generate_tree.js +93 -0
  105. package/src/generation/foliage/asset/place_tree.d.ts +82 -0
  106. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
  107. package/src/generation/foliage/asset/place_tree.js +194 -0
  108. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +121 -0
  109. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
  110. package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
  111. package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
  112. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
  113. package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
  114. package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
  115. package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
  116. package/src/generation/foliage/config/CrownConfig.js +186 -0
  117. package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
  118. package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
  119. package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
  120. package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
  121. package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
  122. package/src/generation/foliage/config/FoliageBarkType.js +16 -0
  123. package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
  124. package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
  125. package/src/generation/foliage/config/FoliageCardType.js +18 -0
  126. package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
  127. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
  128. package/src/generation/foliage/config/FoliageConfig.js +283 -0
  129. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +143 -0
  130. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
  131. package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -0
  132. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
  133. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
  134. package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
  135. package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
  136. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
  137. package/src/generation/foliage/config/TreeLODConfig.js +211 -0
  138. package/src/generation/foliage/config/TreePreset.d.ts +16 -0
  139. package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
  140. package/src/generation/foliage/config/TreePreset.js +17 -0
  141. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
  142. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
  143. package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
  144. package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
  145. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
  146. package/src/generation/foliage/config/TreeWindConfig.js +157 -0
  147. package/src/generation/foliage/index.d.ts +39 -0
  148. package/src/generation/foliage/index.d.ts.map +1 -0
  149. package/src/generation/foliage/index.js +44 -0
  150. package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
  151. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
  152. package/src/generation/foliage/material/make_bark_material.js +730 -0
  153. package/src/generation/foliage/material/make_foliage_material.d.ts +40 -0
  154. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
  155. package/src/generation/foliage/material/make_foliage_material.js +605 -0
  156. package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
  157. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
  158. package/src/generation/foliage/mesh/branch_collar_project.js +205 -0
  159. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
  160. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
  161. package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
  162. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +95 -0
  163. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
  164. package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -0
  165. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
  166. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
  167. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
  168. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
  169. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
  170. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -0
  171. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +22 -0
  172. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
  173. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -0
  174. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
  175. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
  176. package/src/generation/foliage/presets/make_tree_species_preset.js +870 -0
  177. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
  178. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
  179. package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
  180. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
  181. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
  182. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
  183. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
  184. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
  185. package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
  186. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
  187. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
  188. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
  189. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +17 -0
  190. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
  191. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -0
  192. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
  193. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
  194. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -0
  195. package/src/shade/playground/additive_blending/index.html +197 -0
  196. package/src/shade/playground/additive_blending/main.d.ts +2 -0
  197. package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
  198. package/src/shade/playground/additive_blending/main.js +529 -0
  199. package/src/shade/playground/foliage_wind/README.md +18 -0
  200. package/src/shade/playground/foliage_wind/foliage_world.d.ts +133 -0
  201. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
  202. package/src/shade/playground/foliage_wind/foliage_world.js +602 -0
  203. package/src/shade/playground/foliage_wind/index.html +260 -0
  204. package/src/shade/playground/foliage_wind/main.d.ts +2 -0
  205. package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
  206. package/src/shade/playground/foliage_wind/main.js +275 -0
  207. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  208. package/src/shade/renderer/Renderer.js +45 -16
  209. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
  210. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
  211. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
  212. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
  213. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
  214. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
  215. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
  216. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
  217. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
  218. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
  219. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
  220. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  221. package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
  222. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
  223. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  224. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
  225. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
  226. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  227. package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
  228. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  229. package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
  230. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
  231. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
  232. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
  233. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
  234. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
  235. package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
  236. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
  237. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
  238. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
  239. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
  240. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
  241. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
  242. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  243. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
  244. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
  245. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
  246. package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
  247. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  248. package/src/shade/renderer/extension/RenderExtension.js +9 -0
  249. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
  250. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  251. package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
  252. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +10 -3
  253. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  254. package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
  255. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +8 -1
  256. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  257. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
  258. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  259. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
  260. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  261. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
  262. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  263. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
  264. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  265. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
  266. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  267. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
  268. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
  269. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
  270. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +8 -1
  271. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  272. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
  273. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
  274. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  275. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
  276. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  277. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
  278. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1 -1
  279. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
  280. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  281. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
  282. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
  283. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
  284. package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
  285. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
  286. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
  287. package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
  288. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
  289. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
  290. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
  291. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
  292. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  293. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
  294. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
  295. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  296. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
  297. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
  298. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
  299. package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
  300. package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
  301. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  302. package/src/shade/renderer/light/GPULightCollection.js +67 -0
  303. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
  304. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
  305. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
  306. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
  307. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
  308. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
  309. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
  310. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
  311. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
  312. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
  313. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
  314. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
  315. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
  316. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
  317. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
  318. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
  319. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
  320. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
  321. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
  322. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
  323. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
  324. package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
  325. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  326. package/src/shade/renderer/loader/SceneBundle.js +119 -111
  327. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  328. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
  329. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  330. package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
  331. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
  332. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  333. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
  334. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  335. package/src/shade/renderer/particles/GPUParticleSystem.js +4 -1
  336. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
  337. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  338. package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
  339. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
  340. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
  341. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
  342. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  343. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +22 -34
  344. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  345. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  346. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
  347. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
  348. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
  349. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  350. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
  351. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
  352. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
  353. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
  354. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  355. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
  356. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
  357. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
  358. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
  359. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
  360. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
  361. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
  362. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
  363. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
  364. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
  365. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
  366. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
  367. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
  368. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
  369. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
  370. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
  371. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
  372. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
  373. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
  374. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
  375. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
  376. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
  377. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
  378. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
  379. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
  380. package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
  381. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
  382. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
  383. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  384. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
  385. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts +24 -0
  386. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts.map +1 -0
  387. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +1 -1
  388. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
  389. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
  390. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
  391. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
  392. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
  393. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
  394. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
  395. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
  396. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
  397. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
  398. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
  399. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
  400. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
  401. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
  402. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
  403. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
  404. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
  405. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +31 -0
  406. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
  407. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +113 -0
  408. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
  409. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
  410. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +356 -0
  411. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
  412. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
  413. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
  414. package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts +16 -0
  415. package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts.map +1 -0
  416. package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts +23 -0
  417. package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts.map +1 -0
  418. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  419. package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
  420. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
  421. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  422. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
  423. package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
  424. package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
  425. package/src/engine/graphics/composit/CompositingStages.js +0 -8
  426. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
  427. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
  428. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
  429. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
  430. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
  431. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
  432. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
  433. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
  434. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
  435. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
  436. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
  437. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
  438. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
  439. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
  440. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
  441. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
  442. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
  443. package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
  444. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
  445. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
  446. package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
  447. package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
  448. package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
  449. package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
  450. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
  451. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
  452. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
  453. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
  454. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
  455. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
  456. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
  457. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
  458. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
  459. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
  460. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
  461. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
  462. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
  463. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
  464. package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
  465. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
  466. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
  467. package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
  468. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
  469. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
  470. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
  471. package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
  472. package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
  473. package/src/engine/graphics/render/RenderPassType.js +0 -8
  474. package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
  475. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
  476. package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
  477. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
  478. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
  479. package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
  480. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
  481. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
  482. package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
  483. package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
  484. package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
  485. package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
  486. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
  487. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
  488. package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
  489. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
  490. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
  491. package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
  492. package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
  493. package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
  494. package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
  495. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
  496. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
  497. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
  498. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
  499. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
  500. package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
  501. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
  502. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
  503. package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
  504. package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
  505. package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
  506. package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
  507. package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
  508. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
  509. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
  510. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
  511. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
  512. package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
  513. package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
  514. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
  515. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
@@ -0,0 +1,730 @@
1
+ import { PI2 } from "../../../core/math/PI2.js";
2
+ import { clamp } from "../../../core/math/clamp.js";
3
+ import { lerp } from "../../../core/math/lerp.js";
4
+ import { worley_noise_2d } from "../../../core/math/noise/worley_noise_2d.js";
5
+ import { seededRandom } from "../../../core/math/random/seededRandom.js";
6
+ import { smoothStep } from "../../../core/math/smoothStep.js";
7
+ import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
8
+ import { ShadeDrawSide } from "../../../shade/renderer/material/ShadeDrawSide.js";
9
+ import { StandardShadeMaterial } from "../../../shade/renderer/material/StandardShadeMaterial.js";
10
+ import { TransparencyMode } from "../../../shade/renderer/material/TransparencyMode.js";
11
+ import { ColorSpace } from "../../../shade/renderer/texture/ColorSpace.js";
12
+ import { ShadeTexture } from "../../../shade/renderer/texture/ShadeTexture.js";
13
+ import { TextureFilterType } from "../../../shade/renderer/texture/TextureFilterType.js";
14
+ import { TextureWrapType } from "../../../shade/renderer/texture/TextureWrapType.js";
15
+ import { AlphaMode } from "../../../shade/renderer/texture/source/AlphaMode.js";
16
+ import { ShadeImage } from "../../../shade/renderer/texture/source/ShadeImage.js";
17
+ import { BarkMaterialConfig } from "../config/BarkMaterialConfig.js";
18
+ import { FoliageBarkType } from "../config/FoliageBarkType.js";
19
+
20
+ const SCRATCH_WORLEY = new Float32Array(3);
21
+ const SCRATCH_WORLEY2 = new Float32Array(3);
22
+
23
+ /**
24
+ * Evaluates a seamlessly tileable 2D periodic gradient noise value on `[0, 1)^2`
25
+ * with integer periods `(freq_u, freq_v)` and zero allocation overhead.
26
+ *
27
+ * @param {number} u
28
+ * @param {number} v
29
+ * @param {number} freq_u integer circumferential frequency
30
+ * @param {number} freq_v integer vertical frequency
31
+ * @param {number} ox seed offset X
32
+ * @param {number} oy seed offset Y
33
+ * @param {number} oz seed offset Z
34
+ * @returns {number} value in [-1, 1]
35
+ */
36
+ function sample_tileable_bark_noise(u, v, freq_u, freq_v, ox, oy, oz) {
37
+ const pu = Math.max(1, freq_u | 0);
38
+ const pv = Math.max(1, freq_v | 0);
39
+ const seed_mix = ((ox * 73856093) ^ (oy * 19349663) ^ (oz * 83492791)) | 0;
40
+
41
+ const u_wrap = ((u % 1.0) + 1.0) % 1.0;
42
+ const v_wrap = ((v % 1.0) + 1.0) % 1.0;
43
+ const gx = u_wrap * pu;
44
+ const gy = v_wrap * pv;
45
+
46
+ const ix0 = Math.floor(gx);
47
+ const iy0 = Math.floor(gy);
48
+ const fx = gx - ix0;
49
+ const fy = gy - iy0;
50
+
51
+ const x0 = ((ix0 % pu) + pu) % pu;
52
+ const x1 = (x0 + 1) % pu;
53
+ const y0 = ((iy0 % pv) + pv) % pv;
54
+ const y1 = (y0 + 1) % pv;
55
+
56
+ const ux = fx * fx * fx * (fx * (fx * 6.0 - 15.0) + 10.0);
57
+ const uy = fy * fy * fy * (fy * (fy * 6.0 - 15.0) + 10.0);
58
+
59
+ const grad_dot = (ix, iy, dx, dy) => {
60
+ let h = (ix * 374761393 + iy * 668265263 + seed_mix) | 0;
61
+ h = Math.imul(h ^ (h >>> 13), 1274126177);
62
+ const g = (h ^ (h >>> 16)) & 7;
63
+ switch (g) {
64
+ case 0: return dx + dy;
65
+ case 1: return -dx + dy;
66
+ case 2: return dx - dy;
67
+ case 3: return -dx - dy;
68
+ case 4: return dx * 1.41421356;
69
+ case 5: return -dx * 1.41421356;
70
+ case 6: return dy * 1.41421356;
71
+ default: return -dy * 1.41421356;
72
+ }
73
+ };
74
+
75
+ const n00 = grad_dot(x0, y0, fx, fy);
76
+ const n10 = grad_dot(x1, y0, fx - 1.0, fy);
77
+ const n01 = grad_dot(x0, y1, fx, fy - 1.0);
78
+ const n11 = grad_dot(x1, y1, fx - 1.0, fy - 1.0);
79
+
80
+ const nx0 = n00 + ux * (n10 - n00);
81
+ const nx1 = n01 + ux * (n11 - n01);
82
+ return clamp((nx0 + uy * (nx1 - nx0)) * 0.95, -1.0, 1.0);
83
+ }
84
+
85
+ /**
86
+ * Generates deterministic knot/scar centers in the mature trunk zone `v in [0.16, 0.62]`.
87
+ * Since `V in [0, 1]` spans ~8x more world distance than `U in [0, 1)`, `ry` is ~8x smaller than `rx`
88
+ * so knots and birch-eye scars appear naturally round/horizontally-ovoid in 3D world space!
89
+ *
90
+ * @param {number} seed
91
+ * @param {number} count
92
+ * @param {FoliageBarkType|number} bark_type
93
+ * @returns {Array<{u: number, v: number, rx: number, ry: number, phase: number}>}
94
+ */
95
+ function build_bark_knot_sites(seed, count, bark_type) {
96
+ const rng = seededRandom((seed ^ 0x7F4A7C15) | 0);
97
+ const sites = [];
98
+ for (let k = 0; k < count; k++) {
99
+ sites.push({
100
+ u: ((k + 0.22 + 0.55 * rng()) / Math.max(1, count)) % 1.0,
101
+ v: 0.18 + (k + 0.18 + 0.60 * rng()) / Math.max(1, count) * 0.44,
102
+ rx: bark_type === FoliageBarkType.Birch ? (0.075 + 0.030 * rng()) : (0.055 + 0.025 * rng()),
103
+ ry: bark_type === FoliageBarkType.Birch ? (0.008 + 0.004 * rng()) : (0.011 + 0.005 * rng()),
104
+ phase: rng() * PI2
105
+ });
106
+ }
107
+ return sites;
108
+ }
109
+
110
+ /**
111
+ * Evaluates the low-frequency 3D macro-relief heightfield and smooth UV grain flow at `(u, v)`.
112
+ * Used by `tree_mesh_build_bark` for 3D cross-sectional undulation (strictly band-limited to
113
+ * low circumferential frequencies `<= 3` so polygon rings never suffer Nyquist aliasing creases!).
114
+ *
115
+ * Writes `[height, dh_du, u_flow_warp, knot_mask]` to `out`.
116
+ *
117
+ * @param {Float32Array|number[]} out
118
+ * @param {number} u
119
+ * @param {number} v
120
+ * @param {BarkMaterialConfig} cfg
121
+ * @param {number} [seed=1]
122
+ */
123
+ export function evaluate_bark_relief(out, u, v, cfg, seed = 1) {
124
+ const u0 = ((u % 1.0) + 1.0) % 1.0;
125
+ const v0 = clamp(v, 0.0, 1.0);
126
+
127
+ const ox = ((seed * 1664525 + 1013904223) & 0xFFFF) * 0.003 - 98.0;
128
+ const oy = (((seed ^ 0x5A3C9E17) * 1664525) & 0xFFFF) * 0.003 - 98.0;
129
+ const oz = (((seed ^ 0x2DDFA232) * 1664525) & 0xFFFF) * 0.003 - 98.0;
130
+
131
+ const knot_amt = clamp(cfg.knot_amount ?? 0.55, 0.0, 1.0);
132
+ const bark_type = cfg.bark_type ?? FoliageBarkType.Fissured;
133
+
134
+ // Ontogenetic attenuation: old basal/mid bark has macro-relief, young upper twigs are smooth
135
+ const young_fade = 1.0 - 0.82 * smoothStep(0.60, 0.84, v0);
136
+
137
+ let u_flow = 0.0;
138
+ let knot_height = 0.0;
139
+ let knot_mask = 0.0;
140
+
141
+ if (knot_amt > 0.0 && young_fade > 0.2) {
142
+ for (let k = 0; k < 3; k++) {
143
+ const ku = ((k * 0.37 + 0.19 + ((seed * (k + 3)) & 255) / 255.0 * 0.15) % 1.0);
144
+ const kv = 0.18 + ((k * 0.31 + 0.11 + ((seed * (k + 7)) & 255) / 255.0 * 0.12) % 0.44);
145
+ let du = u0 - ku;
146
+ if (du > 0.5) du -= 1.0;
147
+ else if (du < -0.5) du += 1.0;
148
+ const dv = v0 - kv;
149
+
150
+ const rx = 0.08;
151
+ const ry = 0.045;
152
+ const xk = du / rx;
153
+ const yk = dv / ry;
154
+ const rho2 = xk * xk + yk * yk;
155
+
156
+ if (rho2 < 5.0) {
157
+ const exp_w = Math.exp(-0.55 * rho2);
158
+ u_flow += -du * 0.16 * exp_w * knot_amt * young_fade;
159
+ }
160
+ if (rho2 < 3.0) {
161
+ const rho = Math.sqrt(rho2);
162
+ const rim = 0.22 * Math.exp(-Math.pow((rho - 0.72) / 0.35, 2.0));
163
+ const w_k = smoothStep(1.65, 0.25, rho) * knot_amt * young_fade;
164
+ if (w_k > knot_mask) knot_mask = w_k;
165
+ knot_height += rim * knot_amt * young_fade;
166
+ }
167
+ }
168
+ }
169
+
170
+ // Band-limited (freq_u = 2..3) 3D macro-relief so 12..18-gon rings vary organically along V without Nyquist striping
171
+ const v_tile = ((v0 * 3.0) % 1.0 + 1.0) % 1.0;
172
+ const warp_u = clamp(
173
+ (sample_tileable_bark_noise(u0, v_tile, 2, 5, ox + 11.3, oy + 7.1, oz + 3.7) * 0.009 + u_flow) * young_fade,
174
+ -0.014,
175
+ 0.014
176
+ );
177
+
178
+ const n_macro1 = sample_tileable_bark_noise(u0, v_tile, 2, 7, ox, oy, oz);
179
+ const n_macro2 = sample_tileable_bark_noise(u0, v_tile, 3, 12, ox + 37.0, oy + 19.0, oz + 53.0);
180
+ const amp = bark_type === FoliageBarkType.Birch ? 0.34 : 0.46;
181
+ const h = clamp(0.5 + (0.58 * n_macro1 + 0.42 * n_macro2) * amp * young_fade + knot_height, 0.0, 1.0);
182
+
183
+ const eps = 0.02;
184
+ const n_plus = sample_tileable_bark_noise(u0 + eps, v_tile, 2, 6, ox, oy, oz);
185
+ const dh_du = clamp(((n_plus - n_macro1) / eps) * amp * young_fade, -1.0, 1.0);
186
+
187
+ out[0] = h;
188
+ out[1] = dh_du;
189
+ out[2] = warp_u;
190
+ out[3] = knot_mask;
191
+ }
192
+
193
+ /**
194
+ * Synthesizes a turn-key procedural PBR `StandardShadeMaterial` for tree bark, including
195
+ * Albedo (`ColorSpace.SRGB`), 2-channel Tangent-Space Normal (`ColorSpace.LinearSRGB`,
196
+ * `TextureFilterType.LinearNormal`), and ORM (`R=Occlusion, G=Roughness, B=Metalness=0`) textures.
197
+ *
198
+ * The horizontal axis `U in [0, 1)` tiles seamlessly around branch circumferences (`wrapS = Repeat`),
199
+ * while the vertical axis `V in [0, 1]` (`wrapT = ClampToEdge`) encodes continuous ontogenetic bark
200
+ * evolution from old ruptured basal trunk bark (`V ~ 0`) through mature trunk/bough bark (`V ~ 0.35`)
201
+ * to smooth young upper shoot/twig bark (`V ~ 0.9`).
202
+ *
203
+ * Because `V in [0, 1]` spans the full ontogenetic height of the tree (~8x longer in world space than
204
+ * a single circumference wrap `U in [0, 1)`), vertical texture resolution (`height = width * 4`) and
205
+ * vertical cellular/noise frequencies are scaled by the world-space aspect ratio so bark plates,
206
+ * fissures, and lenticels have crisp, isotropic world-space proportions without vertical stretching.
207
+ *
208
+ * @param {BarkMaterialConfig|Object} [config]
209
+ * @param {number} [seed=1]
210
+ * @returns {StandardShadeMaterial}
211
+ */
212
+ export function make_bark_material(config = new BarkMaterialConfig(), seed = 1) {
213
+ const cfg = config && config.isBarkMaterialConfig ? config : BarkMaterialConfig.from(config);
214
+ const width = Math.max(16, cfg.resolution | 0);
215
+ const v_aspect = width >= 128 ? 4 : 1;
216
+ const height = width * v_aspect;
217
+ const rng = seededRandom((seed ^ 0x2DDFA232) | 0);
218
+
219
+ const ox = (rng() - 0.5) * 200.0;
220
+ const oy = (rng() - 0.5) * 200.0;
221
+ const oz = (rng() - 0.5) * 200.0;
222
+
223
+ const albedo_sampler = Sampler2D.uint8(4, width, height);
224
+ const normal_sampler = Sampler2D.uint8(2, width, height);
225
+ const orm_sampler = Sampler2D.uint8(4, width, height);
226
+
227
+ const albedo_data = albedo_sampler.data;
228
+ const normal_data = normal_sampler.data;
229
+ const orm_data = orm_sampler.data;
230
+
231
+ const height_field = new Float32Array(width * height);
232
+ const rough_field = new Float32Array(width * height);
233
+
234
+ const freq_u = Math.max(1, cfg.fissure_frequency | 0);
235
+ const depth = clamp(cfg.fissure_depth, 0.0, 1.0);
236
+ const lenticel = clamp(cfg.lenticel_amount, 0.0, 1.0);
237
+ const peel_amt = clamp(cfg.peel_amount ?? 0.35, 0.0, 1.0);
238
+ const terrace = clamp(cfg.plate_terrace ?? 0.42, 0.0, 1.0);
239
+ const knot_amt = clamp(cfg.knot_amount ?? 0.55, 0.0, 1.0);
240
+ const moss_amt = clamp(cfg.moss_amount, 0.0, 1.0);
241
+ const base_rough = clamp(Math.max(0.86, cfg.roughness), 0.86, 0.98);
242
+
243
+ // Determine effective archetype
244
+ let bark_type = cfg.bark_type ?? FoliageBarkType.Fissured;
245
+ if (bark_type === FoliageBarkType.Fissured && lenticel > 0.55 && cfg.primary_color.r > 0.72) {
246
+ bark_type = FoliageBarkType.Birch;
247
+ }
248
+
249
+ const r1 = cfg.primary_color.r, g1 = cfg.primary_color.g, b1 = cfg.primary_color.b;
250
+ const r2 = cfg.secondary_color.r, g2 = cfg.secondary_color.g, b2 = cfg.secondary_color.b;
251
+ const ri = cfg.inner_bark_color?.r ?? 0.34;
252
+ const gi = cfg.inner_bark_color?.g ?? 0.27;
253
+ const bi = cfg.inner_bark_color?.b ?? 0.22;
254
+ const rm = cfg.moss_color.r, gm = cfg.moss_color.g, bm = cfg.moss_color.b;
255
+
256
+ const knot_sites = build_bark_knot_sites(seed, bark_type === FoliageBarkType.Birch ? 6 : 5, bark_type);
257
+
258
+ // Pass 1: Synthesize species-specific ontogenetic bark heightfield and albedo
259
+ for (let y = 0; y < height; y++) {
260
+ const v = (y + 0.5) / height;
261
+ // Ontogenetic zone weights along V in [0, 1]:
262
+ // - basal_w: [0.0, 0.20] (coarse buttress base & ruptured dark birch skirt)
263
+ // - mature_w: [0.18, 0.65] (characteristic trunk & primary bough bark)
264
+ // - young_w: [0.72, 1.0] (smooth finely striated young branch & shoot bark)
265
+ const basal_w = smoothStep(0.22, 0.03, v);
266
+ const young_w = smoothStep(0.62, 0.80, v);
267
+ const mature_w = 1.0 - young_w;
268
+
269
+ for (let x = 0; x < width; x++) {
270
+ const u = x / width;
271
+ const p_idx = y * width + x;
272
+
273
+ // 1. World-aspect-corrected knot / branch-collar scar geometry in mature/basal zone
274
+ let u_flow = 0.0;
275
+ let knot_h = 0.0;
276
+ let knot_scar_mask = 0.0;
277
+ let knot_rim_mask = 0.0;
278
+
279
+ if (knot_amt > 0.0 && mature_w > 0.15) {
280
+ for (let k = 0; k < knot_sites.length; k++) {
281
+ const ks = knot_sites[k];
282
+ let du = u - ks.u;
283
+ if (du > 0.5) du -= 1.0;
284
+ else if (du < -0.5) du += 1.0;
285
+ const dv = v - ks.v;
286
+
287
+ const xk = du / ks.rx;
288
+ const yk = dv / ks.ry;
289
+ const rho2 = xk * xk + yk * yk;
290
+ if (rho2 >= 5.5) {
291
+ continue;
292
+ }
293
+
294
+ u_flow += -du * 0.20 * Math.exp(-0.55 * rho2) * knot_amt * mature_w;
295
+
296
+ if (bark_type === FoliageBarkType.Birch) {
297
+ // Characteristic dark craggy chevron "Birch Eye" branch-collar scar
298
+ const y_chev = yk + 0.45 * Math.pow(Math.abs(xk), 1.15);
299
+ const chev_ridge = Math.exp(-3.4 * y_chev * y_chev) * Math.exp(-1.10 * xk * xk);
300
+ const eye_pit = Math.exp(-2.6 * (xk * xk * 0.9 + (yk + 0.35) * (yk + 0.35) * 1.5));
301
+ const crag = sample_tileable_bark_noise(u, v, 10, 80, ox + 91.0, oy + 43.0, oz + 17.0);
302
+ const scar_val = clamp((chev_ridge * 0.80 + eye_pit * 0.90) * (0.85 + 0.25 * crag) * knot_amt * mature_w, 0.0, 1.0);
303
+ if (scar_val > knot_scar_mask) knot_scar_mask = scar_val;
304
+ knot_h += (0.04 * chev_ridge - 0.12 * eye_pit) * knot_amt * mature_w;
305
+ } else if (rho2 < 3.2) {
306
+ const rho = Math.sqrt(rho2);
307
+ const pit = rho < 0.55 ? -0.26 * Math.pow(Math.cos((rho / 0.55) * Math.PI * 0.5), 1.8) : 0.0;
308
+ const rim = 0.22 * Math.exp(-Math.pow((rho - 0.76) / 0.30, 2.0));
309
+ knot_h += (pit + rim) * knot_amt * mature_w;
310
+ if (rho < 0.60) {
311
+ knot_scar_mask = Math.max(knot_scar_mask, smoothStep(0.60, 0.18, rho) * knot_amt * mature_w);
312
+ }
313
+ knot_rim_mask = Math.max(knot_rim_mask, rim * knot_amt * mature_w);
314
+ }
315
+ }
316
+ }
317
+
318
+ let h = 0.5;
319
+ let cr = r1, cg = g1, cb = b1;
320
+ let rough = base_rough;
321
+
322
+ if (bark_type === FoliageBarkType.Birch) {
323
+ // --- ARCHETYPE 2: SILVER / PAPER BIRCH (WORLD-ASPECT CALIBRATED) ---
324
+ const n_low = sample_tileable_bark_noise(u, v, 2, 16, ox, oy, oz);
325
+ const n_med = sample_tileable_bark_noise(u, v, 4, 64, ox + 37.0, oy + 19.0, oz + 53.0);
326
+ const n_high = sample_tileable_bark_noise(u, v, 8, 160, ox + 73.0, oy + 41.0, oz + 89.0);
327
+ const n_sheet = sample_tileable_bark_noise(u, v, 1, 96, ox + 15.0, oy + 67.0, oz + 31.0);
328
+
329
+ // 1) Jagged basal rupture zone (v in [0, 0.17]): dark charcoal deeply fissured basal skirt
330
+ const basal_warp = sample_tileable_bark_noise(u, v, 4, 24, ox + 51.0, oy + 13.0, oz + 77.0) * 0.04;
331
+ const fissure_wave = Math.pow(Math.abs(Math.sin((u + basal_warp) * Math.PI * (freq_u * 2))), 0.65);
332
+ const basal_crag_v = sample_tileable_bark_noise(u, v, freq_u * 2, 48, ox + 88.0, oy + 31.0, oz + 19.0);
333
+ const basal_cutoff = 0.15 + 0.04 * n_low + 0.045 * (1.0 - fissure_wave);
334
+ const birch_basal_mask = smoothStep(basal_cutoff + 0.035, basal_cutoff - 0.025, v);
335
+
336
+ // 2) Young shoot zone (v in [0.68, 1.0]): smooth warm bronze/copper-brown young birch bark
337
+ const young_cutoff = 0.70 + 0.025 * n_low;
338
+ const birch_young_mask = smoothStep(young_cutoff - 0.05, young_cutoff + 0.05, v);
339
+
340
+ // 3) Mature chalk-white periderm with crisp horizontal paper striations & lenticel dashes
341
+ const horiz_band = 0.5 + 0.5 * Math.sin(v * PI2 * 140.0 + n_low * 1.1 + n_sheet * 0.8);
342
+ const fine_horiz = 0.5 + 0.5 * Math.sin(v * PI2 * 280.0 + n_med * 0.7);
343
+
344
+ // Crisp thin horizontal lenticel dashes (3x220 and 6x360 cells so dashes are thin in world Y!)
345
+ worley_noise_2d(SCRATCH_WORLEY, u + n_low * 0.012, v, 3, 220, seed ^ 0x13579BDF);
346
+ worley_noise_2d(SCRATCH_WORLEY2, u + n_med * 0.008, v, 6, 360, seed ^ 0x2468ACE0);
347
+ const lent_dash1 = smoothStep(0.28, 0.07, SCRATCH_WORLEY[0]) * (SCRATCH_WORLEY[2] < lenticel * 0.55 ? 1.0 : 0.0);
348
+ const lent_dash2 = smoothStep(0.25, 0.06, SCRATCH_WORLEY2[0]) * (SCRATCH_WORLEY2[2] < lenticel * 0.65 ? 1.0 : 0.0);
349
+ const lent_line = Math.pow(Math.max(0.0, Math.sin(v * PI2 * 180.0 + n_low * 1.4)), 7.0)
350
+ * smoothStep(0.30, 0.75, n_med * 0.5 + 0.5);
351
+ const lent_mask = clamp(
352
+ Math.max(lent_dash1 * 0.85, Math.max(lent_dash2 * 0.70, lent_line * 0.60)) * lenticel,
353
+ 0.0,
354
+ 1.0
355
+ );
356
+
357
+ // Sparse horizontal warm-cinnamon exfoliating paper strips
358
+ const peel_wave = sample_tileable_bark_noise(u, v, 1, 56, ox + 129.0, oy + 59.0, oz + 103.0) * 0.70
359
+ + sample_tileable_bark_noise(u, v, 3, 112, ox + 17.0, oy + 83.0, oz + 47.0) * 0.30;
360
+ const peel_thresh = 0.45 - peel_amt * 0.26;
361
+ const peel_inner_mask = (peel_amt > 0.02 && peel_wave > peel_thresh && knot_scar_mask < 0.3)
362
+ ? clamp((peel_wave - peel_thresh) * 5.5, 0.0, 0.72) * (1.0 - birch_basal_mask) * (1.0 - birch_young_mask)
363
+ : 0.0;
364
+
365
+ const h_mature = 0.72
366
+ + 0.042 * horiz_band
367
+ + 0.024 * fine_horiz
368
+ + 0.020 * n_med
369
+ - 0.080 * lent_mask
370
+ - 0.060 * peel_inner_mask
371
+ + knot_h;
372
+
373
+ const h_basal = 0.14 + 0.46 * fissure_wave + 0.14 * basal_crag_v;
374
+ const h_young = 0.68 + 0.015 * horiz_band + 0.010 * n_high - 0.022 * lent_dash2;
375
+
376
+ h = lerp(h_mature, h_basal, birch_basal_mask);
377
+ h = clamp(lerp(h, h_young, birch_young_mask), 0.0, 1.0);
378
+
379
+ // Mature chalk-white periderm color
380
+ const paper_shade = 0.90 + 0.07 * horiz_band + 0.05 * fine_horiz - 0.04 * (n_low * 0.5 + 0.5);
381
+ cr = clamp(r1 * paper_shade, 0.0, 1.0);
382
+ cg = clamp(g1 * paper_shade, 0.0, 1.0);
383
+ cb = clamp(b1 * paper_shade, 0.0, 1.0);
384
+
385
+ if (peel_inner_mask > 0.0) {
386
+ const inner_var = 0.92 + 0.14 * horiz_band;
387
+ cr = lerp(cr, ri * inner_var, peel_inner_mask);
388
+ cg = lerp(cg, gi * inner_var, peel_inner_mask);
389
+ cb = lerp(cb, bi * inner_var, peel_inner_mask);
390
+ }
391
+
392
+ if (lent_mask > 0.0) {
393
+ const lm = lent_mask * 0.80 * (1.0 - birch_young_mask * 0.6);
394
+ cr = lerp(cr, r2 * 1.20, lm);
395
+ cg = lerp(cg, g2 * 1.15, lm);
396
+ cb = lerp(cb, b2 * 1.10, lm);
397
+ }
398
+
399
+ if (knot_scar_mask > 0.0) {
400
+ cr = lerp(cr, r2 * 0.68, knot_scar_mask);
401
+ cg = lerp(cg, g2 * 0.68, knot_scar_mask);
402
+ cb = lerp(cb, b2 * 0.68, knot_scar_mask);
403
+ }
404
+
405
+ if (birch_basal_mask > 0.0) {
406
+ const b_shade = 0.52 + 0.72 * fissure_wave + 0.18 * basal_crag_v;
407
+ const br = clamp(r2 * 1.35 * b_shade, 0.06, 0.40);
408
+ const bg = clamp(g2 * 1.32 * b_shade, 0.06, 0.38);
409
+ const bb = clamp(b2 * 1.28 * b_shade, 0.06, 0.36);
410
+ cr = lerp(cr, br, birch_basal_mask);
411
+ cg = lerp(cg, bg, birch_basal_mask);
412
+ cb = lerp(cb, bb, birch_basal_mask);
413
+ }
414
+
415
+ if (birch_young_mask > 0.0) {
416
+ const y_shade = 0.90 + 0.14 * horiz_band + 0.06 * n_med;
417
+ let yr = clamp(ri * 0.92 * y_shade, 0.18, 0.62);
418
+ let yg = clamp(gi * 0.88 * y_shade, 0.12, 0.46);
419
+ let yb = clamp(bi * 0.82 * y_shade, 0.08, 0.34);
420
+ const speck = lent_dash2 * 0.45;
421
+ yr = lerp(yr, 0.68, speck);
422
+ yg = lerp(yg, 0.60, speck);
423
+ yb = lerp(yb, 0.50, speck);
424
+
425
+ cr = lerp(cr, yr, birch_young_mask);
426
+ cg = lerp(cg, yg, birch_young_mask);
427
+ cb = lerp(cb, yb, birch_young_mask);
428
+ }
429
+
430
+ rough = clamp(base_rough + 0.05 * birch_basal_mask - 0.02 * birch_young_mask, 0.85, 0.97);
431
+ } else if (bark_type === FoliageBarkType.Plated) {
432
+ // --- ARCHETYPE 3: RAGGED FLAKY CONIFER SCALE BARK (PINE / SPRUCE, WORLD-ASPECT CALIBRATED) ---
433
+ const warp_u = (
434
+ sample_tileable_bark_noise(u, v, 3, 20, ox + 11.3, oy + 7.1, oz + 3.7) * 0.042
435
+ + sample_tileable_bark_noise(u, v, freq_u * 2, 56, ox + 61.0, oy + 23.0, oz + 89.0) * 0.028
436
+ + u_flow
437
+ );
438
+ const warp_v = (
439
+ sample_tileable_bark_noise(u, v, 3, 18, ox + 29.1, oy + 13.7, oz + 61.9) * 0.008
440
+ + sample_tileable_bark_noise(u, v, freq_u * 2, 48, ox + 43.0, oy + 79.0, oz + 17.0) * 0.005
441
+ );
442
+ const uw = ((u + warp_u) % 1.0 + 1.0) % 1.0;
443
+ const vw = ((v + warp_v) % 1.0 + 1.0) % 1.0;
444
+
445
+ // World-aspect-calibrated scale lattice: 6x28 primary scales + 12x56 secondary scales
446
+ const cells_v = Math.max(12, Math.round(freq_u * 4.5));
447
+ worley_noise_2d(SCRATCH_WORLEY, uw, vw, freq_u, cells_v, seed);
448
+ worley_noise_2d(SCRATCH_WORLEY2, uw, vw, freq_u * 2, cells_v * 2, seed ^ 0x9E3779B9);
449
+
450
+ const df1 = SCRATCH_WORLEY[1];
451
+ const cid1 = SCRATCH_WORLEY[2];
452
+ const df2 = SCRATCH_WORLEY2[1];
453
+ const cid2 = SCRATCH_WORLEY2[2];
454
+
455
+ const fiber_n = sample_tileable_bark_noise(u, v, freq_u * 3, 64, ox + 53.0, oy + 97.0, oz + 23.0);
456
+ const fine_striation = sample_tileable_bark_noise(u, v, freq_u * 4, 48, ox + 19.0, oy + 71.0, oz + 41.0);
457
+
458
+ // Ragged scale edges + exfoliating stepped terraces
459
+ const jag_df1 = df1 + fiber_n * 0.065;
460
+ const plate_edge = smoothStep(0.02, 0.22, jag_df1) * smoothStep(0.01, 0.11, df2 + fiber_n * 0.04 + 0.03);
461
+ const contour_raw = clamp(jag_df1 * 1.55 + fiber_n * 0.08, 0.0, 0.999);
462
+ const contour_step = Math.floor(contour_raw * 4.0) / 4.0;
463
+ const contour_fract = (contour_raw * 4.0) - Math.floor(contour_raw * 4.0);
464
+ const step_lip = smoothStep(0.18, 0.02, contour_fract) * plate_edge;
465
+
466
+ const h_mature = clamp(
467
+ plate_edge * (0.46 + 0.24 * cid1 + 0.20 * lerp(contour_raw, contour_step, terrace) + 0.06 * cid2)
468
+ + fiber_n * 0.06
469
+ - basal_w * (1.0 - plate_edge) * 0.16
470
+ + knot_h,
471
+ 0.0,
472
+ 1.0
473
+ );
474
+
475
+ // Young conifer shoot bark (v > 0.72): finely striated, low-relief reddish-grey shoot bark
476
+ const h_young = 0.56 + 0.038 * fine_striation + 0.025 * fiber_n;
477
+ h = clamp(lerp(h_mature, h_young, young_w), 0.0, 1.0);
478
+
479
+ const crevice_mix = smoothStep(0.04, 0.36, plate_edge) * (1.0 - 0.70 * knot_scar_mask);
480
+ const plate_tint = 0.88 + 0.20 * cid1 + 0.07 * step_lip + 0.05 * fiber_n;
481
+ const pr_col = lerp(r1, ri, 0.28) * plate_tint;
482
+ const pg_col = lerp(g1, gi, 0.28) * plate_tint;
483
+ const pb_col = lerp(b1, bi, 0.28) * plate_tint;
484
+
485
+ const mr = lerp(r2 * 0.75, pr_col, crevice_mix);
486
+ const mg = lerp(g2 * 0.75, pg_col, crevice_mix);
487
+ const mb = lerp(b2 * 0.75, pb_col, crevice_mix);
488
+
489
+ const y_tint = 0.94 + 0.07 * fine_striation + 0.04 * fiber_n;
490
+ const yr = lerp(r1, r2, 0.25) * y_tint;
491
+ const yg = lerp(g1, g2, 0.25) * y_tint;
492
+ const yb = lerp(b1, b2, 0.25) * y_tint;
493
+
494
+ cr = lerp(mr, yr, young_w);
495
+ cg = lerp(mg, yg, young_w);
496
+ cb = lerp(mb, yb, young_w);
497
+ rough = clamp(lerp(0.95, base_rough, crevice_mix) * (1.0 - 0.03 * young_w), 0.86, 0.98);
498
+ } else if (bark_type === FoliageBarkType.Ringed) {
499
+ // --- ARCHETYPE 4: RINGED / FIBROUS TRUNK BARK (PALM / SHRUB / FERN) ---
500
+ const n1 = sample_tileable_bark_noise(u, v, 2, 24, ox, oy, oz);
501
+ const n2 = sample_tileable_bark_noise(u, v, 12, 48, ox + 41.0, oy + 29.0, oz + 73.0);
502
+ const ring_wave = Math.pow(Math.abs(Math.sin(v * Math.PI * 56.0 + 0.25 * Math.sin(u * PI2 * 5.0) + n1 * 0.50)), 0.60);
503
+ const fiber_weave = 0.5 + 0.25 * Math.sin((u * 18.0 + v * 24.0) * PI2 + n2) + 0.25 * Math.sin((u * 18.0 - v * 24.0) * PI2 - n2);
504
+
505
+ const h_mature = clamp(0.65 * ring_wave + 0.25 * fiber_weave + 0.10 * n2 + knot_h, 0.0, 1.0);
506
+ const h_young = 0.58 + 0.08 * ring_wave + 0.06 * fiber_weave;
507
+ h = clamp(lerp(h_mature, h_young, young_w), 0.0, 1.0);
508
+
509
+ const mix_col = clamp(lerp(1.0 - depth * (1.0 - 0.65 * young_w), 1.0, h), 0.0, 1.0);
510
+ cr = lerp(r2, r1, mix_col);
511
+ cg = lerp(g2, g1, mix_col);
512
+ cb = lerp(b2, b1, mix_col);
513
+ rough = clamp(base_rough + (1.0 - h) * 0.08, 0.86, 0.98);
514
+ } else {
515
+ // --- ARCHETYPE 1: FISSURED / BRAIDED RIDGE BARK (OAK / WILLOW / MAPLE, WORLD-ASPECT CALIBRATED) ---
516
+ // Vertical frequencies are scaled to match the 1:8 world-space U:V aspect ratio so ridges anastomose
517
+ // naturally every 30-50cm along the trunk instead of stretching into 6-meter stripes!
518
+ const warp_u = (
519
+ sample_tileable_bark_noise(u, v, 3, 20, ox + 11.3, oy + 7.1, oz + 3.7) * 0.065
520
+ + sample_tileable_bark_noise(u, v, freq_u, 42, ox + 47.0, oy + 29.0, oz + 13.0) * 0.032
521
+ + u_flow
522
+ );
523
+ const warp_v = sample_tileable_bark_noise(u, v, 3, 16, ox + 23.1, oy + 17.9, oz + 41.2) * 0.008;
524
+ const uw = ((u + warp_u) % 1.0 + 1.0) % 1.0;
525
+ const vw = ((v + warp_v) % 1.0 + 1.0) % 1.0;
526
+
527
+ // Braided cellular Voronoi ridges + multi-harmonic vertical canyons + craggy transverse breaks
528
+ const cells_v = Math.max(10, Math.round(freq_u * 3.6));
529
+ worley_noise_2d(SCRATCH_WORLEY, uw, vw, freq_u, cells_v, seed);
530
+ worley_noise_2d(SCRATCH_WORLEY2, uw, vw, freq_u * 2, cells_v * 2, seed ^ 0x5A3C9E17);
531
+
532
+ const detail_n1 = sample_tileable_bark_noise(uw, vw, freq_u, 24, ox, oy, oz);
533
+ const detail_n2 = sample_tileable_bark_noise(uw, vw, freq_u * 2, 48, ox + 37.0, oy + 19.0, oz + 53.0);
534
+ const fiber_n3 = sample_tileable_bark_noise(u, v, freq_u * 4, 36, ox + 83.0, oy + 59.0, oz + 19.0);
535
+
536
+ // Anastomosing vertical ridges that split and merge around elongated cellular plates
537
+ const ridge_primary = Math.pow(Math.abs(Math.sin(uw * Math.PI * freq_u + detail_n1 * 1.35)), 0.62);
538
+ const ridge_secondary = Math.pow(Math.abs(Math.sin(uw * Math.PI * (freq_u * 2) + detail_n2 * 0.95)), 0.72);
539
+ const cell_ridge = smoothStep(0.03, 0.42, SCRATCH_WORLEY[1]) * (0.75 + 0.25 * smoothStep(0.02, 0.30, SCRATCH_WORLEY2[1]));
540
+ const braid = 0.44 * ridge_primary + 0.24 * ridge_secondary + 0.32 * cell_ridge;
541
+
542
+ let h_macro = smoothStep(0.14, 0.84, braid);
543
+ const h_terrace = Math.round(h_macro * 4.0) / 4.0;
544
+ h_macro = lerp(h_macro, h_terrace, terrace * 0.35);
545
+
546
+ // Basal zone has deeper, wider crevices; young zone transitions to smooth finely striated shoot bark
547
+ const h_mature = clamp(
548
+ h_macro * (1.0 - 0.14 * basal_w) + detail_n2 * 0.12 + fiber_n3 * 0.08 + knot_h,
549
+ 0.0,
550
+ 1.0
551
+ );
552
+ const h_young = 0.56 + 0.048 * ridge_secondary + 0.040 * fiber_n3 + 0.022 * detail_n2;
553
+ h = clamp(lerp(h_mature, h_young, young_w), 0.0, 1.0);
554
+
555
+ // Muted weathered ash-grey/taupe color ramp on mature trunk
556
+ const plate_mix = clamp(
557
+ lerp(1.0 - depth * 0.92, 1.0, Math.pow(h_mature, 1.12)) * (1.0 - 0.60 * knot_scar_mask),
558
+ 0.0,
559
+ 1.0
560
+ );
561
+ const cell_var = 0.92 + 0.14 * SCRATCH_WORLEY[2] + 0.06 * fiber_n3;
562
+ let mr = lerp(r2, r1 * cell_var, plate_mix);
563
+ let mg = lerp(g2, g1 * cell_var, plate_mix);
564
+ let mb = lerp(b2, b1 * cell_var, plate_mix);
565
+
566
+ // Subtle warm inner-bark tint deep inside active basal/mature fissures
567
+ const phloem_seam = smoothStep(0.05, 0.14, h_mature) * smoothStep(0.24, 0.14, h_mature) * depth;
568
+ mr = lerp(mr, ri, phloem_seam * 0.26);
569
+ mg = lerp(mg, gi, phloem_seam * 0.26);
570
+ mb = lerp(mb, bi, phloem_seam * 0.26);
571
+
572
+ // Subtle weathered silver-ash highlight on ridge crests
573
+ const ridge_crest = smoothStep(0.70, 0.92, h_mature) * 0.045 + knot_rim_mask * 0.05;
574
+ mr = clamp(mr + ridge_crest, 0.0, 1.0);
575
+ mg = clamp(mg + ridge_crest * 0.98, 0.0, 1.0);
576
+ mb = clamp(mb + ridge_crest * 0.94, 0.0, 1.0);
577
+
578
+ // Smooth finely striated young shoot bark (v in [0.74, 1.0]): cohesive olive-taupe/grey-brown
579
+ const young_var = 0.95 + 0.07 * fiber_n3 + 0.04 * ridge_secondary;
580
+ const yr = lerp(r2, r1, 0.68) * young_var;
581
+ const yg = lerp(g2, g1, 0.70) * young_var;
582
+ const yb = lerp(b2, b1, 0.66) * young_var;
583
+
584
+ cr = lerp(mr, yr, young_w);
585
+ cg = lerp(mg, yg, young_w);
586
+ cb = lerp(mb, yb, young_w);
587
+
588
+ rough = clamp(base_rough + (1.0 - h) * 0.08 - young_w * 0.03, 0.86, 0.98);
589
+ }
590
+
591
+ // Lichen / moss flecking (concentrated toward basal skirt and deep crevices on lower trunk)
592
+ const eff_moss = moss_amt * (0.45 + 0.55 * basal_w) * (1.0 - young_w);
593
+ if (eff_moss > 0.0) {
594
+ const m_noise = sample_tileable_bark_noise(u, v, 4, 28, ox + 113.0, oy + 61.0, oz + 97.0);
595
+ const m_score = (m_noise * 0.5 + 0.5) * 0.72 + (1.0 - h) * 0.28;
596
+ const moss_mask = smoothStep(1.0 - eff_moss * 1.45, 1.0, m_score) * eff_moss;
597
+ cr = lerp(cr, rm, moss_mask);
598
+ cg = lerp(cg, gm, moss_mask);
599
+ cb = lerp(cb, bm, moss_mask);
600
+ rough = clamp(rough + moss_mask * 0.06, 0.86, 0.99);
601
+ }
602
+
603
+ height_field[p_idx] = h;
604
+ rough_field[p_idx] = rough;
605
+
606
+ const i4 = p_idx * 4;
607
+ albedo_data[i4] = clamp(Math.round(cr * 255), 0, 255);
608
+ albedo_data[i4 + 1] = clamp(Math.round(cg * 255), 0, 255);
609
+ albedo_data[i4 + 2] = clamp(Math.round(cb * 255), 0, 255);
610
+ albedo_data[i4 + 3] = 255;
611
+ }
612
+ }
613
+
614
+ // Pass 2: 3x3 rotationally invariant Scharr normal map + multi-radius Laplacian cavity AO
615
+ const res_scale = Math.max(1.0, width / 64.0);
616
+ const base_slope = (bark_type === FoliageBarkType.Birch
617
+ ? (2.10 * depth + 0.45)
618
+ : (2.35 * depth + 0.52)) * res_scale;
619
+ const r_ao = Math.max(1, Math.round(width / 64));
620
+
621
+ for (let y = 0; y < height; y++) {
622
+ // Clamp Y at ontogenetic boundaries so basal trunk (y=0) never bleeds into young shoots (y=height-1)
623
+ const ym1 = Math.max(0, y - 1);
624
+ const yp1 = Math.min(height - 1, y + 1);
625
+ const ym_ao = Math.max(0, y - r_ao);
626
+ const yp_ao = Math.min(height - 1, y + r_ao);
627
+
628
+ for (let x = 0; x < width; x++) {
629
+ const xm1 = (x - 1 + width) % width;
630
+ const xp1 = (x + 1) % width;
631
+ const xm_ao = (x - r_ao + width) % width;
632
+ const xp_ao = (x + r_ao) % width;
633
+
634
+ const p_idx = y * width + x;
635
+ const h_c = height_field[p_idx];
636
+
637
+ const h_mm = height_field[ym1 * width + xm1];
638
+ const h_0m = height_field[ym1 * width + x];
639
+ const h_pm = height_field[ym1 * width + xp1];
640
+ const h_m0 = height_field[y * width + xm1];
641
+ const h_p0 = height_field[y * width + xp1];
642
+ const h_mp = height_field[yp1 * width + xm1];
643
+ const h_0p = height_field[yp1 * width + x];
644
+ const h_pp = height_field[yp1 * width + xp1];
645
+
646
+ // 3x3 Scharr derivative
647
+ const gu = (3.0 * (h_pm - h_mm) + 10.0 * (h_p0 - h_m0) + 3.0 * (h_pp - h_mp)) / 32.0;
648
+ const gv = (3.0 * (h_mp - h_mm) + 10.0 * (h_0p - h_0m) + 3.0 * (h_pp - h_pm)) / 32.0;
649
+
650
+ let nx = -gu * base_slope;
651
+ let ny = -gv * base_slope;
652
+ let nz = 1.0;
653
+ const nl = Math.sqrt(nx * nx + ny * ny + nz * nz);
654
+ nx /= nl;
655
+ ny /= nl;
656
+
657
+ const i2 = p_idx * 2;
658
+ normal_data[i2] = clamp(Math.round((nx * 0.5 + 0.5) * 255), 0, 255);
659
+ normal_data[i2 + 1] = clamp(Math.round((ny * 0.5 + 0.5) * 255), 0, 255);
660
+
661
+ // Multi-scale neighborhood average for local concavity / crevice shadow
662
+ const h_avg = 0.125 * (
663
+ height_field[y * width + xm_ao] +
664
+ height_field[y * width + xp_ao] +
665
+ height_field[ym_ao * width + x] +
666
+ height_field[yp_ao * width + x] +
667
+ h_m0 + h_p0 + h_0m + h_0p
668
+ );
669
+ const cavity = Math.max(0.0, h_avg - h_c);
670
+ const ao = clamp(
671
+ lerp(1.0 - depth * 0.78, 1.0, Math.pow(h_c, 0.82)) - cavity * 2.2,
672
+ 0.08,
673
+ 1.0
674
+ );
675
+
676
+ const i4 = p_idx * 4;
677
+ orm_data[i4] = clamp(Math.round(ao * 255), 0, 255);
678
+ orm_data[i4 + 1] = clamp(Math.round(rough_field[p_idx] * 255), 0, 255);
679
+ orm_data[i4 + 2] = 0;
680
+ orm_data[i4 + 3] = 255;
681
+ }
682
+ }
683
+
684
+ const albedo_image = ShadeImage.fromSampler2D(albedo_sampler);
685
+ albedo_image.color_space = ColorSpace.SRGB;
686
+ albedo_image.alpha_mode = AlphaMode.Opaque;
687
+ const texture_albedo = ShadeTexture.from(albedo_image);
688
+ texture_albedo.label = "foliage_bark_albedo";
689
+ texture_albedo.color_space = ColorSpace.SRGB;
690
+ texture_albedo.mipmapGenerationFilter = TextureFilterType.Linear;
691
+ texture_albedo.wrapS = TextureWrapType.Repeat;
692
+ texture_albedo.wrapT = TextureWrapType.ClampToEdge;
693
+
694
+ const normal_image = ShadeImage.fromSampler2D(normal_sampler);
695
+ normal_image.color_space = ColorSpace.None;
696
+ normal_image.alpha_mode = AlphaMode.Opaque;
697
+ const texture_normal = ShadeTexture.from(normal_image);
698
+ texture_normal.label = "foliage_bark_normal";
699
+ texture_normal.color_space = ColorSpace.LinearSRGB;
700
+ texture_normal.mipmapGenerationFilter = TextureFilterType.LinearNormal;
701
+ texture_normal.wrapS = TextureWrapType.Repeat;
702
+ texture_normal.wrapT = TextureWrapType.ClampToEdge;
703
+
704
+ const orm_image = ShadeImage.fromSampler2D(orm_sampler);
705
+ orm_image.color_space = ColorSpace.None;
706
+ orm_image.alpha_mode = AlphaMode.Opaque;
707
+ const texture_orm = ShadeTexture.from(orm_image);
708
+ texture_orm.label = "foliage_bark_orm";
709
+ texture_orm.color_space = ColorSpace.LinearSRGB;
710
+ texture_orm.wrapS = TextureWrapType.Repeat;
711
+ texture_orm.wrapT = TextureWrapType.ClampToEdge;
712
+
713
+ const material = new StandardShadeMaterial();
714
+ material.name = "foliage_bark_material";
715
+ material.texture_albedo = texture_albedo;
716
+ material.texture_normal = texture_normal;
717
+ material.texture_orm = texture_orm;
718
+ material.roughness_factor = 1.0;
719
+ material.metallic_factor = 0.0;
720
+ material.ior_factor = 1.25;
721
+ material.transmission_factor = 0.0;
722
+ // CRITICAL: StandardShadeMaterial defaults ambient_factors to LinearModifier(1, 1);
723
+ // set offset to 0 so ORM.r and vertex color AO actually darken crevices!
724
+ material.ambient_factors.a = 1.0;
725
+ material.ambient_factors.b = 0.0;
726
+ material.transparency_mode = TransparencyMode.Opaque;
727
+ material.draw_side = ShadeDrawSide.Front;
728
+
729
+ return material;
730
+ }