@zephyr3d/scene 0.9.27 → 0.10.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 (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1,55 +1,216 @@
1
+ /** Number of splat mask vectors for `numLayers` detail layers, 4 weights each */ function terrainSplatMaskCount(numLayers) {
2
+ return numLayers + 3 >> 2;
3
+ }
4
+ /** Splat weight of a layer */ function weight(masks, layer) {
5
+ return masks[layer >> 2][layer & 3];
6
+ }
7
+ function useHex(hex, grad, layer) {
8
+ return !!hex && !!grad && (hex.mask & 1 << layer) !== 0;
9
+ }
10
+ function terrainHexTile(scope, prefix, coord, rotationAmount, scaleAmount) {
11
+ const pb = scope.$builder;
12
+ pb.func('zTerrainHexHash', [
13
+ pb.vec2('p')
14
+ ], function() {
15
+ // https://www.shadertoy.com/view/4djSRW, mx_hextile_hash
16
+ this.$l.p3 = pb.fract(pb.mul(pb.vec3(this.p.x, this.p.y, this.p.x), pb.vec3(0.1031, 0.103, 0.0973)));
17
+ this.p3 = pb.add(this.p3, pb.vec3(pb.dot(this.p3, pb.add(this.p3.yzx, pb.vec3(33.33)))));
18
+ this.$return(pb.fract(pb.mul(pb.add(this.p3.xx, this.p3.yz), this.p3.zy)));
19
+ });
20
+ pb.func('zTerrainHexTile', [
21
+ pb.vec2('coord'),
22
+ pb.float('rotation'),
23
+ pb.float('scale'),
24
+ pb.vec2('c1').out(),
25
+ pb.vec2('c2').out(),
26
+ pb.vec2('c3').out(),
27
+ pb.vec3('w').out(),
28
+ pb.vec3('r').out(),
29
+ pb.vec3('s').out()
30
+ ], function() {
31
+ const sqrt3x2 = Math.sqrt(3) * 2;
32
+ // scale to keep the original fit, then skew into the simplex triangle grid
33
+ // (GLSL mat2(1, 0, -0.57735027, 1.15470054) * st)
34
+ this.$l.st = pb.mul(this.coord, sqrt3x2);
35
+ this.$l.skewed = pb.vec2(pb.sub(this.st.x, pb.mul(this.st.y, 0.57735027)), pb.mul(this.st.y, 1.15470054));
36
+ this.$l.f = pb.fract(this.skewed);
37
+ this.$l.z = pb.sub(pb.sub(1, this.f.x), this.f.y);
38
+ this.$l.sv = pb.step(0, pb.neg(this.z));
39
+ this.$l.s2 = pb.sub(pb.mul(this.sv, 2), 1);
40
+ this.w = pb.vec3(pb.mul(pb.neg(this.z), this.s2), pb.sub(this.sv, pb.mul(this.f.y, this.s2)), pb.sub(this.sv, pb.mul(this.f.x, this.s2)));
41
+ // vertex ids and hexagon centres (GLSL mat2(1, 0, 0.5, 1 / 1.15470054) * id)
42
+ this.$l.base = pb.floor(this.skewed);
43
+ this.$l.id1 = pb.add(this.base, pb.vec2(this.sv, this.sv));
44
+ this.$l.id2 = pb.add(this.base, pb.vec2(this.sv, pb.sub(1, this.sv)));
45
+ this.$l.id3 = pb.add(this.base, pb.vec2(pb.sub(1, this.sv), this.sv));
46
+ const centre = (id)=>pb.div(pb.vec2(pb.add(id.x, pb.mul(id.y, 0.5)), pb.div(id.y, 1.15470054)), sqrt3x2);
47
+ this.$l.ctr1 = centre(this.id1);
48
+ this.$l.ctr2 = centre(this.id2);
49
+ this.$l.ctr3 = centre(this.id3);
50
+ this.$l.rand1 = this.zTerrainHexHash(pb.add(this.id1, pb.vec2(0.12345)));
51
+ this.$l.rand2 = this.zTerrainHexHash(pb.add(this.id2, pb.vec2(0.12345)));
52
+ this.$l.rand3 = this.zTerrainHexHash(pb.add(this.id3, pb.vec2(0.12345)));
53
+ // rotation range 0..360 degrees, scale range 0.5..2, offset range 0..1 at amount 1
54
+ this.$l.rv = pb.mul(pb.vec3(this.rand1.x, this.rand2.x, this.rand3.x), pb.mul(this.rotation, Math.PI * 2));
55
+ this.$l.sv3 = pb.mix(pb.vec3(1), pb.mix(pb.vec3(0.5), pb.vec3(2), pb.vec3(this.rand1.y, this.rand2.y, this.rand3.y)), pb.vec3(this.scale));
56
+ // ((coord - ctr) * rm / scale) + ctr + offset; GLSL v * mat2(c, -s, s, c) rotates v by +r
57
+ const rotate = (v, r)=>pb.vec2(pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))), pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r))));
58
+ this.c1 = pb.add(pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr1), this.rv.x), this.sv3.x), this.ctr1), this.rand1);
59
+ this.c2 = pb.add(pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr2), this.rv.y), this.sv3.y), this.ctr2), this.rand2);
60
+ this.c3 = pb.add(pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr3), this.rv.z), this.sv3.z), this.ctr3), this.rand3);
61
+ this.r = this.rv;
62
+ this.s = this.sv3;
63
+ });
64
+ for (const name of [
65
+ 'C1',
66
+ 'C2',
67
+ 'C3'
68
+ ]){
69
+ scope.$l[`${prefix}${name}`] = pb.vec2();
70
+ }
71
+ for (const name of [
72
+ 'W',
73
+ 'R',
74
+ 'S'
75
+ ]){
76
+ scope.$l[`${prefix}${name}`] = pb.vec3();
77
+ }
78
+ pb.getGlobalScope().zTerrainHexTile(coord, rotationAmount, scaleAmount, scope[`${prefix}C1`], scope[`${prefix}C2`], scope[`${prefix}C3`], scope[`${prefix}W`], scope[`${prefix}R`], scope[`${prefix}S`]);
79
+ }
80
+ /** Rotates a 2D vector by `r` radians, counter clockwise */ function rotate2(scope, v, r) {
81
+ const pb = scope.$builder;
82
+ return pb.vec2(pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))), pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r))));
83
+ }
1
84
  /**
2
- * Samples every splat mask layer once in the given scope.
3
- *
4
- * Shared by the live terrain shading path and the texture cache bake pass so
5
- * both interpret splat weights identically.
6
- *
7
- * @param scope - Scope to sample in
8
- * @param splatMap - Splat map texture expression (2d array, or plain 2d on WebGL1)
9
- * @param uv - Normalized terrain uv
10
- * @param numLayers - Number of detail layers
11
- * @param isWebGL1 - Whether targeting WebGL1 (splat map is a plain 2d texture)
12
- * @param namePrefix - Local variable name prefix for the sampled masks
13
- * @returns One vec4 expression per splat layer, 4 detail weights packed per layer
14
- *
15
- * @internal
16
- */ function sampleTerrainSplatMasks(scope, splatMap, uv, numLayers, isWebGL1, namePrefix = 'splatMask') {
85
+ * The three hex tiling samples of a layer: the gradients follow each sample's rotation and scale
86
+ * (mx_hextile_coord ddx1..3), so the mip is chosen from the continuous coordinate and the jumps
87
+ * at hexagon edges do not show.
88
+ */ function sampleHexTiled(scope, prefix, layer, sample, ddx, ddy) {
89
+ const pb = scope.$builder;
90
+ return [
91
+ 1,
92
+ 2,
93
+ 3
94
+ ].map((k)=>{
95
+ const comp = [
96
+ 'x',
97
+ 'y',
98
+ 'z'
99
+ ][k - 1];
100
+ const r = scope[`${prefix}R`][comp];
101
+ const s = scope[`${prefix}S`][comp];
102
+ return sample(scope, layer, scope[`${prefix}C${k}`], pb.div(rotate2(scope, ddx, r), s), pb.div(rotate2(scope, ddy, r), s));
103
+ });
104
+ }
105
+ /** Blend weights of the three samples: pow(barycentric, 7), normalized (mx_hextiledimage) */ function hexWeights(scope, prefix, colorWeights) {
17
106
  const pb = scope.$builder;
18
- const masks = [];
19
- for(let i = 0; i < numLayers + 3 >> 2; i++){
20
- scope.$l[`${namePrefix}${i}`] = isWebGL1 ? pb.textureSample(splatMap, uv) : pb.textureArraySample(splatMap, uv, i);
21
- masks.push(scope[`${namePrefix}${i}`]);
107
+ let w = pb.pow(scope[`${prefix}W`], pb.vec3(7));
108
+ if (colorWeights) {
109
+ w = pb.mul(colorWeights, w);
22
110
  }
23
- return masks;
111
+ scope.$l[`${prefix}BW`] = w;
112
+ return pb.div(scope[`${prefix}BW`], pb.dot(scope[`${prefix}BW`], pb.vec3(1)));
24
113
  }
25
114
  /**
26
- * Accumulates per-layer samples weighted by splat masks:
27
- * `result = init + sum(sampleLayer(i, uv * uvScale(i)) * maskWeight(i))`
28
- *
29
- * This is the single definition of terrain detail blending. The live shading
30
- * path and the texture cache bake pass must both go through it so the cached
31
- * result can never diverge from the realtime result.
32
- *
33
- * @param scope - Scope to evaluate in
34
- * @param resultName - Local variable name for the accumulator
35
- * @param init - Initial accumulator value (also determines the value type)
36
- * @param numLayers - Number of detail layers
37
- * @param uv - Normalized terrain uv
38
- * @param masks - Splat masks returned by {@link sampleTerrainSplatMasks}
39
- * @param getUVScale - Per-layer uv scale accessor, or null when uv is unused by sampleLayer
40
- * @param sampleLayer - Per-layer value accessor, must return the same type as init
41
- * @returns The accumulated expression
115
+ * Albedo: the layers weighted by the splat masks. Weights are not normalized, uncovered area
116
+ * stays black.
117
+ * @param detailParams - Per layer (uv scale, roughness, 0, 0)
118
+ * @param grad - Gradients of `uv`; required for hex tiled layers, which are sampled flat otherwise
119
+ */ function blendTerrainAlbedo(scope, numLayers, masks, uv, detailParams, sampleAlbedo, grad = null, hex = null) {
120
+ const pb = scope.$builder;
121
+ let color = pb.vec3(0);
122
+ for(let i = 0; i < numLayers; i++){
123
+ const tiling = detailParams.at(i).x;
124
+ const coord = pb.mul(uv, tiling);
125
+ const ddx = grad ? pb.mul(grad.ddx, tiling) : null;
126
+ const ddy = grad ? pb.mul(grad.ddy, tiling) : null;
127
+ let sample;
128
+ if (useHex(hex, grad, i)) {
129
+ const prefix = `zHexA${i}`;
130
+ const p = hex.params.at(i);
131
+ terrainHexTile(scope, prefix, coord, p.x, p.y);
132
+ const [c1, c2, c3] = sampleHexTiled(scope, prefix, i, sampleAlbedo, ddx, ddy).map((c)=>c.rgb);
133
+ scope.$l[`${prefix}A1`] = c1;
134
+ scope.$l[`${prefix}A2`] = c2;
135
+ scope.$l[`${prefix}A3`] = c3;
136
+ // Luminance as weights, mix(1, luma, contrast); Rec.709 coefficients for our linear
137
+ // working space (one of mx_hextiledimage's lumacoeffs choices)
138
+ const luma = pb.vec3(0.2126, 0.7152, 0.0722);
139
+ const cw = pb.mix(pb.vec3(1), pb.vec3(pb.dot(scope[`${prefix}A1`], luma), pb.dot(scope[`${prefix}A2`], luma), pb.dot(scope[`${prefix}A3`], luma)), pb.vec3(p.z));
140
+ scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, cw);
141
+ const w = scope[`${prefix}NW`];
142
+ sample = pb.add(pb.add(pb.mul(scope[`${prefix}A1`], w.x), pb.mul(scope[`${prefix}A2`], w.y)), pb.mul(scope[`${prefix}A3`], w.z));
143
+ } else {
144
+ sample = sampleAlbedo(scope, i, coord, ddx, ddy).rgb;
145
+ }
146
+ color = pb.add(color, pb.mul(sample, weight(masks, i)));
147
+ }
148
+ return color;
149
+ }
150
+ /**
151
+ * Tangent space detail normal: the decoded layer normals weighted by the splat masks, not
152
+ * normalized.
42
153
  *
43
- * @internal
44
- */ function accumulateTerrainLayers(scope, resultName, init, numLayers, uv, masks, getUVScale, sampleLayer) {
154
+ * A hex tiled layer blends its three samples as mx_hextilednormalmap: each normal turned with
155
+ * its sample, then combined as surface gradients (Mikkelsen, Surface Gradient Based Bump Mapping
156
+ * Framework, JCGT 9(3), 2020; mx_gradient_blend_3_normals), which with the tangent space normal
157
+ * (0, 0, 1) reduces to normalize(sum(w * n.xy / |n.z|), 1). The turn is the inverse of the
158
+ * sample's coordinate rotation: sampling at R(r) p shows the texture turned by -r on the
159
+ * surface, and its normals with it. (MaterialX writes mx_axis_rotation_matrix row by row into a
160
+ * column major GLSL mat3, which turns them the other way.)
161
+ * @param sampleNormal - Returns the raw rgb of the layer's normal map
162
+ */ function blendTerrainDetailNormal(scope, numLayers, masks, uv, detailParams, sampleNormal, grad = null, hex = null) {
163
+ const pb = scope.$builder;
164
+ let normal = pb.vec3(0);
165
+ const decode = (raw)=>pb.normalize(pb.sub(pb.mul(raw, 2), pb.vec3(1)));
166
+ for(let i = 0; i < numLayers; i++){
167
+ const tiling = detailParams.at(i).x;
168
+ const coord = pb.mul(uv, tiling);
169
+ const ddx = grad ? pb.mul(grad.ddx, tiling) : null;
170
+ const ddy = grad ? pb.mul(grad.ddy, tiling) : null;
171
+ let decoded;
172
+ if (useHex(hex, grad, i)) {
173
+ const prefix = `zHexN${i}`;
174
+ const p = hex.params.at(i);
175
+ terrainHexTile(scope, prefix, coord, p.x, p.y);
176
+ const samples = sampleHexTiled(scope, prefix, i, sampleNormal, ddx, ddy);
177
+ const comps = [
178
+ 'x',
179
+ 'y',
180
+ 'z'
181
+ ];
182
+ samples.forEach((raw, k)=>{
183
+ scope.$l[`${prefix}N${k}`] = decode(raw.rgb);
184
+ const n = scope[`${prefix}N${k}`];
185
+ const xy = rotate2(scope, n.xy, pb.neg(scope[`${prefix}R`][comps[k]]));
186
+ // surface gradient of the turned normal against (0, 0, 1)
187
+ scope.$l[`${prefix}G${k}`] = pb.div(xy, pb.max(pb.abs(n.z), 1e-5));
188
+ });
189
+ scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, null);
190
+ const w = scope[`${prefix}NW`];
191
+ const g = pb.add(pb.add(pb.mul(scope[`${prefix}G0`], w.x), pb.mul(scope[`${prefix}G1`], w.y)), pb.mul(scope[`${prefix}G2`], w.z));
192
+ decoded = pb.normalize(pb.vec3(g, 1));
193
+ } else {
194
+ decoded = decode(sampleNormal(scope, i, coord, ddx, ddy).rgb);
195
+ }
196
+ normal = pb.add(normal, pb.mul(decoded, weight(masks, i)));
197
+ }
198
+ return normal;
199
+ }
200
+ /**
201
+ * Roughness: the layer roughness weighted by the splat masks, whatever the layers leave
202
+ * uncovered keeps `base`, the material roughness.
203
+ */ function blendTerrainRoughness(scope, numLayers, masks, detailParams, base) {
45
204
  const pb = scope.$builder;
46
- scope.$l[resultName] = init;
205
+ let weightSum = pb.float(0);
206
+ let roughness = pb.float(0);
47
207
  for(let i = 0; i < numLayers; i++){
48
- const layerUV = getUVScale ? pb.mul(uv, getUVScale(i)) : uv;
49
- scope[resultName] = pb.add(scope[resultName], pb.mul(sampleLayer(scope, i, layerUV), masks[i >> 2][i & 3]));
208
+ const w = weight(masks, i);
209
+ weightSum = pb.add(weightSum, w);
210
+ roughness = pb.add(roughness, pb.mul(w, detailParams.at(i).y));
50
211
  }
51
- return scope[resultName];
212
+ return pb.add(roughness, pb.mul(pb.max(pb.sub(1, weightSum), 0), base));
52
213
  }
53
214
 
54
- export { accumulateTerrainLayers, sampleTerrainSplatMasks };
215
+ export { blendTerrainAlbedo, blendTerrainDetailNormal, blendTerrainRoughness, terrainSplatMaskCount };
55
216
  //# sourceMappingURL=terrain_blend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"terrain_blend.js","sources":["../../../src/material/shader/terrain_blend.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * Samples every splat mask layer once in the given scope.\r\n *\r\n * Shared by the live terrain shading path and the texture cache bake pass so\r\n * both interpret splat weights identically.\r\n *\r\n * @param scope - Scope to sample in\r\n * @param splatMap - Splat map texture expression (2d array, or plain 2d on WebGL1)\r\n * @param uv - Normalized terrain uv\r\n * @param numLayers - Number of detail layers\r\n * @param isWebGL1 - Whether targeting WebGL1 (splat map is a plain 2d texture)\r\n * @param namePrefix - Local variable name prefix for the sampled masks\r\n * @returns One vec4 expression per splat layer, 4 detail weights packed per layer\r\n *\r\n * @internal\r\n */\r\nexport function sampleTerrainSplatMasks(\r\n scope: PBInsideFunctionScope,\r\n splatMap: PBShaderExp,\r\n uv: PBShaderExp,\r\n numLayers: number,\r\n isWebGL1: boolean,\r\n namePrefix = 'splatMask'\r\n): PBShaderExp[] {\r\n const pb = scope.$builder;\r\n const masks: PBShaderExp[] = [];\r\n for (let i = 0; i < (numLayers + 3) >> 2; i++) {\r\n scope.$l[`${namePrefix}${i}`] = isWebGL1\r\n ? pb.textureSample(splatMap, uv)\r\n : pb.textureArraySample(splatMap, uv, i);\r\n masks.push(scope[`${namePrefix}${i}`]);\r\n }\r\n return masks;\r\n}\r\n\r\n/**\r\n * Accumulates per-layer samples weighted by splat masks:\r\n * `result = init + sum(sampleLayer(i, uv * uvScale(i)) * maskWeight(i))`\r\n *\r\n * This is the single definition of terrain detail blending. The live shading\r\n * path and the texture cache bake pass must both go through it so the cached\r\n * result can never diverge from the realtime result.\r\n *\r\n * @param scope - Scope to evaluate in\r\n * @param resultName - Local variable name for the accumulator\r\n * @param init - Initial accumulator value (also determines the value type)\r\n * @param numLayers - Number of detail layers\r\n * @param uv - Normalized terrain uv\r\n * @param masks - Splat masks returned by {@link sampleTerrainSplatMasks}\r\n * @param getUVScale - Per-layer uv scale accessor, or null when uv is unused by sampleLayer\r\n * @param sampleLayer - Per-layer value accessor, must return the same type as init\r\n * @returns The accumulated expression\r\n *\r\n * @internal\r\n */\r\nexport function accumulateTerrainLayers(\r\n scope: PBInsideFunctionScope,\r\n resultName: string,\r\n init: PBShaderExp,\r\n numLayers: number,\r\n uv: PBShaderExp,\r\n masks: PBShaderExp[],\r\n getUVScale: ((index: number) => PBShaderExp) | null,\r\n sampleLayer: (scope: PBInsideFunctionScope, index: number, uv: PBShaderExp) => PBShaderExp\r\n): PBShaderExp {\r\n const pb = scope.$builder;\r\n scope.$l[resultName] = init;\r\n for (let i = 0; i < numLayers; i++) {\r\n const layerUV = getUVScale ? pb.mul(uv, getUVScale(i)) : uv;\r\n scope[resultName] = pb.add(\r\n scope[resultName],\r\n pb.mul(sampleLayer(scope, i, layerUV), masks[i >> 2][i & 3])\r\n );\r\n }\r\n return scope[resultName];\r\n}\r\n"],"names":["sampleTerrainSplatMasks","scope","splatMap","uv","numLayers","isWebGL1","namePrefix","pb","$builder","masks","i","$l","textureSample","textureArraySample","push","accumulateTerrainLayers","resultName","init","getUVScale","sampleLayer","layerUV","mul","add"],"mappings":"AAEA;;;;;;;;;;;;;;;AAeC,IACM,SAASA,uBACdC,CAAAA,KAA4B,EAC5BC,QAAqB,EACrBC,EAAe,EACfC,SAAiB,EACjBC,QAAiB,EACjBC,aAAa,WAAW,EAAA;IAExB,MAAMC,EAAAA,GAAKN,MAAMO,QAAQ;AACzB,IAAA,MAAMC,QAAuB,EAAE;IAC/B,IAAK,IAAIC,IAAI,CAAGA,EAAAA,CAAAA,GAAI,SAAa,GAAA,CAAA,IAAM,GAAGA,CAAK,EAAA,CAAA;AAC7CT,QAAAA,KAAAA,CAAMU,EAAE,CAAC,CAAA,EAAGL,UAAaI,CAAAA,EAAAA,CAAAA,CAAAA,CAAG,CAAC,GAAGL,QAAAA,GAC5BE,EAAGK,CAAAA,aAAa,CAACV,QAAUC,EAAAA,EAAAA,CAAAA,GAC3BI,GAAGM,kBAAkB,CAACX,UAAUC,EAAIO,EAAAA,CAAAA,CAAAA;AACxCD,QAAAA,KAAAA,CAAMK,IAAI,CAACb,KAAK,CAAC,CAAGK,EAAAA,UAAAA,CAAAA,EAAaI,GAAG,CAAC,CAAA;AACvC;IACA,OAAOD,KAAAA;AACT;AAEA;;;;;;;;;;;;;;;;;;;AAmBC,IACM,SAASM,uBAAAA,CACdd,KAA4B,EAC5Be,UAAkB,EAClBC,IAAiB,EACjBb,SAAiB,EACjBD,EAAe,EACfM,KAAoB,EACpBS,UAAmD,EACnDC,WAA0F,EAAA;IAE1F,MAAMZ,EAAAA,GAAKN,MAAMO,QAAQ;IACzBP,KAAMU,CAAAA,EAAE,CAACK,UAAAA,CAAW,GAAGC,IAAAA;AACvB,IAAA,IAAK,IAAIP,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIN,WAAWM,CAAK,EAAA,CAAA;AAClC,QAAA,MAAMU,UAAUF,UAAaX,GAAAA,EAAAA,CAAGc,GAAG,CAAClB,EAAAA,EAAIe,WAAWR,CAAMP,CAAAA,CAAAA,GAAAA,EAAAA;QACzDF,KAAK,CAACe,WAAW,GAAGT,EAAAA,CAAGe,GAAG,CACxBrB,KAAK,CAACe,UAAAA,CAAW,EACjBT,EAAAA,CAAGc,GAAG,CAACF,WAAAA,CAAYlB,KAAOS,EAAAA,CAAAA,EAAGU,OAAUX,CAAAA,EAAAA,KAAK,CAACC,CAAK,IAAA,CAAA,CAAE,CAACA,CAAAA,GAAI,CAAE,CAAA,CAAA,CAAA;AAE/D;IACA,OAAOT,KAAK,CAACe,UAAW,CAAA;AAC1B;;;;"}
1
+ {"version":3,"file":"terrain_blend.js","sources":["../../../src/material/shader/terrain_blend.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * The detail layer blend of the clipmap terrain, the only definition of it: the material's live\r\n * path and the runtime virtual texture page fill both go through these, so the two cannot drift.\r\n * The callers differ only in how a layer texture is sampled (screen derivatives when shading,\r\n * the page texel footprint when filling).\r\n */\r\n\r\n/**\r\n * Samples layer `layer` of a detail texture at the already scaled detail uv. `ddx`/`ddy` are the\r\n * gradients of that uv when known (sample with them), null to sample with implicit derivatives.\r\n */\r\nexport type TerrainLayerSampler = (\r\n scope: PBInsideFunctionScope,\r\n layer: number,\r\n uv: PBShaderExp,\r\n ddx: PBShaderExp | null,\r\n ddy: PBShaderExp | null\r\n) => PBShaderExp;\r\n\r\n/** Gradients of the terrain uv across one pixel (or one page texel) */\r\nexport interface TerrainUVGrad {\r\n ddx: PBShaderExp;\r\n ddy: PBShaderExp;\r\n}\r\n\r\n/** Layers using hex tiling, see terrainHexTile */\r\nexport interface TerrainHexTiling {\r\n /** Bit i set: layer i uses hex tiling */\r\n mask: number;\r\n /** Per layer (rotation amount, scale amount, contrast, 0) */\r\n params: PBShaderExp;\r\n}\r\n\r\n/** Number of splat mask vectors for `numLayers` detail layers, 4 weights each */\r\nexport function terrainSplatMaskCount(numLayers: number) {\r\n return (numLayers + 3) >> 2;\r\n}\r\n\r\n/** Splat weight of a layer */\r\nfunction weight(masks: PBShaderExp[], layer: number) {\r\n return masks[layer >> 2][layer & 3] as PBShaderExp;\r\n}\r\n\r\nfunction useHex(hex: TerrainHexTiling | null, grad: TerrainUVGrad | null, layer: number) {\r\n return !!hex && !!grad && (hex.mask & (1 << layer)) !== 0;\r\n}\r\n\r\nfunction terrainHexTile(\r\n scope: PBInsideFunctionScope,\r\n prefix: string,\r\n coord: PBShaderExp,\r\n rotationAmount: PBShaderExp,\r\n scaleAmount: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('zTerrainHexHash', [pb.vec2('p')], function () {\r\n // https://www.shadertoy.com/view/4djSRW, mx_hextile_hash\r\n this.$l.p3 = pb.fract(pb.mul(pb.vec3(this.p.x, this.p.y, this.p.x), pb.vec3(0.1031, 0.103, 0.0973)));\r\n this.p3 = pb.add(this.p3, pb.vec3(pb.dot(this.p3, pb.add(this.p3.yzx, pb.vec3(33.33)))));\r\n this.$return(pb.fract(pb.mul(pb.add(this.p3.xx, this.p3.yz), this.p3.zy)));\r\n });\r\n pb.func(\r\n 'zTerrainHexTile',\r\n [\r\n pb.vec2('coord'),\r\n pb.float('rotation'),\r\n pb.float('scale'),\r\n pb.vec2('c1').out(),\r\n pb.vec2('c2').out(),\r\n pb.vec2('c3').out(),\r\n pb.vec3('w').out(),\r\n pb.vec3('r').out(),\r\n pb.vec3('s').out()\r\n ],\r\n function () {\r\n const sqrt3x2 = Math.sqrt(3) * 2;\r\n // scale to keep the original fit, then skew into the simplex triangle grid\r\n // (GLSL mat2(1, 0, -0.57735027, 1.15470054) * st)\r\n this.$l.st = pb.mul(this.coord, sqrt3x2);\r\n this.$l.skewed = pb.vec2(\r\n pb.sub(this.st.x, pb.mul(this.st.y, 0.57735027)),\r\n pb.mul(this.st.y, 1.15470054)\r\n );\r\n this.$l.f = pb.fract(this.skewed);\r\n this.$l.z = pb.sub(pb.sub(1, this.f.x), this.f.y);\r\n this.$l.sv = pb.step(0, pb.neg(this.z));\r\n this.$l.s2 = pb.sub(pb.mul(this.sv, 2), 1);\r\n this.w = pb.vec3(\r\n pb.mul(pb.neg(this.z), this.s2),\r\n pb.sub(this.sv, pb.mul(this.f.y, this.s2)),\r\n pb.sub(this.sv, pb.mul(this.f.x, this.s2))\r\n );\r\n // vertex ids and hexagon centres (GLSL mat2(1, 0, 0.5, 1 / 1.15470054) * id)\r\n this.$l.base = pb.floor(this.skewed);\r\n this.$l.id1 = pb.add(this.base, pb.vec2(this.sv, this.sv));\r\n this.$l.id2 = pb.add(this.base, pb.vec2(this.sv, pb.sub(1, this.sv)));\r\n this.$l.id3 = pb.add(this.base, pb.vec2(pb.sub(1, this.sv), this.sv));\r\n const centre = (id: PBShaderExp) =>\r\n pb.div(pb.vec2(pb.add(id.x, pb.mul(id.y, 0.5)), pb.div(id.y, 1.15470054)), sqrt3x2);\r\n this.$l.ctr1 = centre(this.id1);\r\n this.$l.ctr2 = centre(this.id2);\r\n this.$l.ctr3 = centre(this.id3);\r\n this.$l.rand1 = this.zTerrainHexHash(pb.add(this.id1, pb.vec2(0.12345)));\r\n this.$l.rand2 = this.zTerrainHexHash(pb.add(this.id2, pb.vec2(0.12345)));\r\n this.$l.rand3 = this.zTerrainHexHash(pb.add(this.id3, pb.vec2(0.12345)));\r\n // rotation range 0..360 degrees, scale range 0.5..2, offset range 0..1 at amount 1\r\n this.$l.rv = pb.mul(\r\n pb.vec3(this.rand1.x, this.rand2.x, this.rand3.x),\r\n pb.mul(this.rotation, Math.PI * 2)\r\n );\r\n this.$l.sv3 = pb.mix(\r\n pb.vec3(1),\r\n pb.mix(pb.vec3(0.5), pb.vec3(2), pb.vec3(this.rand1.y, this.rand2.y, this.rand3.y)),\r\n pb.vec3(this.scale)\r\n );\r\n // ((coord - ctr) * rm / scale) + ctr + offset; GLSL v * mat2(c, -s, s, c) rotates v by +r\r\n const rotate = (v: PBShaderExp, r: PBShaderExp) =>\r\n pb.vec2(\r\n pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))),\r\n pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r)))\r\n );\r\n this.c1 = pb.add(\r\n pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr1), this.rv.x), this.sv3.x), this.ctr1),\r\n this.rand1\r\n );\r\n this.c2 = pb.add(\r\n pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr2), this.rv.y), this.sv3.y), this.ctr2),\r\n this.rand2\r\n );\r\n this.c3 = pb.add(\r\n pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr3), this.rv.z), this.sv3.z), this.ctr3),\r\n this.rand3\r\n );\r\n this.r = this.rv;\r\n this.s = this.sv3;\r\n }\r\n );\r\n for (const name of ['C1', 'C2', 'C3']) {\r\n scope.$l[`${prefix}${name}`] = pb.vec2();\r\n }\r\n for (const name of ['W', 'R', 'S']) {\r\n scope.$l[`${prefix}${name}`] = pb.vec3();\r\n }\r\n pb.getGlobalScope().zTerrainHexTile(\r\n coord,\r\n rotationAmount,\r\n scaleAmount,\r\n scope[`${prefix}C1`],\r\n scope[`${prefix}C2`],\r\n scope[`${prefix}C3`],\r\n scope[`${prefix}W`],\r\n scope[`${prefix}R`],\r\n scope[`${prefix}S`]\r\n );\r\n}\r\n\r\n/** Rotates a 2D vector by `r` radians, counter clockwise */\r\nfunction rotate2(scope: PBInsideFunctionScope, v: PBShaderExp, r: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.vec2(\r\n pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))),\r\n pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r)))\r\n );\r\n}\r\n\r\n/**\r\n * The three hex tiling samples of a layer: the gradients follow each sample's rotation and scale\r\n * (mx_hextile_coord ddx1..3), so the mip is chosen from the continuous coordinate and the jumps\r\n * at hexagon edges do not show.\r\n */\r\nfunction sampleHexTiled(\r\n scope: PBInsideFunctionScope,\r\n prefix: string,\r\n layer: number,\r\n sample: TerrainLayerSampler,\r\n ddx: PBShaderExp,\r\n ddy: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n return ([1, 2, 3] as const).map((k) => {\r\n const comp = (['x', 'y', 'z'] as const)[k - 1];\r\n const r = scope[`${prefix}R`][comp] as PBShaderExp;\r\n const s = scope[`${prefix}S`][comp] as PBShaderExp;\r\n return sample(\r\n scope,\r\n layer,\r\n scope[`${prefix}C${k}`],\r\n pb.div(rotate2(scope, ddx, r), s),\r\n pb.div(rotate2(scope, ddy, r), s)\r\n );\r\n });\r\n}\r\n\r\n/** Blend weights of the three samples: pow(barycentric, 7), normalized (mx_hextiledimage) */\r\nfunction hexWeights(scope: PBInsideFunctionScope, prefix: string, colorWeights: PBShaderExp | null) {\r\n const pb = scope.$builder;\r\n let w = pb.pow(scope[`${prefix}W`], pb.vec3(7)) as PBShaderExp;\r\n if (colorWeights) {\r\n w = pb.mul(colorWeights, w);\r\n }\r\n scope.$l[`${prefix}BW`] = w;\r\n return pb.div(scope[`${prefix}BW`], pb.dot(scope[`${prefix}BW`], pb.vec3(1))) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Albedo: the layers weighted by the splat masks. Weights are not normalized, uncovered area\r\n * stays black.\r\n * @param detailParams - Per layer (uv scale, roughness, 0, 0)\r\n * @param grad - Gradients of `uv`; required for hex tiled layers, which are sampled flat otherwise\r\n */\r\nexport function blendTerrainAlbedo(\r\n scope: PBInsideFunctionScope,\r\n numLayers: number,\r\n masks: PBShaderExp[],\r\n uv: PBShaderExp,\r\n detailParams: PBShaderExp,\r\n sampleAlbedo: TerrainLayerSampler,\r\n grad: TerrainUVGrad | null = null,\r\n hex: TerrainHexTiling | null = null\r\n) {\r\n const pb = scope.$builder;\r\n let color: PBShaderExp = pb.vec3(0);\r\n for (let i = 0; i < numLayers; i++) {\r\n const tiling = detailParams.at(i).x as PBShaderExp;\r\n const coord = pb.mul(uv, tiling);\r\n const ddx = grad ? pb.mul(grad.ddx, tiling) : null;\r\n const ddy = grad ? pb.mul(grad.ddy, tiling) : null;\r\n let sample: PBShaderExp;\r\n if (useHex(hex, grad, i)) {\r\n const prefix = `zHexA${i}`;\r\n const p = hex!.params.at(i) as PBShaderExp;\r\n terrainHexTile(scope, prefix, coord, p.x, p.y);\r\n const [c1, c2, c3] = sampleHexTiled(scope, prefix, i, sampleAlbedo, ddx!, ddy!).map((c) => c.rgb);\r\n scope.$l[`${prefix}A1`] = c1;\r\n scope.$l[`${prefix}A2`] = c2;\r\n scope.$l[`${prefix}A3`] = c3;\r\n // Luminance as weights, mix(1, luma, contrast); Rec.709 coefficients for our linear\r\n // working space (one of mx_hextiledimage's lumacoeffs choices)\r\n const luma = pb.vec3(0.2126, 0.7152, 0.0722);\r\n const cw = pb.mix(\r\n pb.vec3(1),\r\n pb.vec3(\r\n pb.dot(scope[`${prefix}A1`], luma),\r\n pb.dot(scope[`${prefix}A2`], luma),\r\n pb.dot(scope[`${prefix}A3`], luma)\r\n ),\r\n pb.vec3(p.z)\r\n );\r\n scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, cw);\r\n const w = scope[`${prefix}NW`];\r\n sample = pb.add(\r\n pb.add(pb.mul(scope[`${prefix}A1`], w.x), pb.mul(scope[`${prefix}A2`], w.y)),\r\n pb.mul(scope[`${prefix}A3`], w.z)\r\n );\r\n } else {\r\n sample = sampleAlbedo(scope, i, coord, ddx, ddy).rgb;\r\n }\r\n color = pb.add(color, pb.mul(sample, weight(masks, i)));\r\n }\r\n return color;\r\n}\r\n\r\n/**\r\n * Tangent space detail normal: the decoded layer normals weighted by the splat masks, not\r\n * normalized.\r\n *\r\n * A hex tiled layer blends its three samples as mx_hextilednormalmap: each normal turned with\r\n * its sample, then combined as surface gradients (Mikkelsen, Surface Gradient Based Bump Mapping\r\n * Framework, JCGT 9(3), 2020; mx_gradient_blend_3_normals), which with the tangent space normal\r\n * (0, 0, 1) reduces to normalize(sum(w * n.xy / |n.z|), 1). The turn is the inverse of the\r\n * sample's coordinate rotation: sampling at R(r) p shows the texture turned by -r on the\r\n * surface, and its normals with it. (MaterialX writes mx_axis_rotation_matrix row by row into a\r\n * column major GLSL mat3, which turns them the other way.)\r\n * @param sampleNormal - Returns the raw rgb of the layer's normal map\r\n */\r\nexport function blendTerrainDetailNormal(\r\n scope: PBInsideFunctionScope,\r\n numLayers: number,\r\n masks: PBShaderExp[],\r\n uv: PBShaderExp,\r\n detailParams: PBShaderExp,\r\n sampleNormal: TerrainLayerSampler,\r\n grad: TerrainUVGrad | null = null,\r\n hex: TerrainHexTiling | null = null\r\n) {\r\n const pb = scope.$builder;\r\n let normal: PBShaderExp = pb.vec3(0);\r\n const decode = (raw: PBShaderExp) => pb.normalize(pb.sub(pb.mul(raw, 2), pb.vec3(1)));\r\n for (let i = 0; i < numLayers; i++) {\r\n const tiling = detailParams.at(i).x as PBShaderExp;\r\n const coord = pb.mul(uv, tiling);\r\n const ddx = grad ? pb.mul(grad.ddx, tiling) : null;\r\n const ddy = grad ? pb.mul(grad.ddy, tiling) : null;\r\n let decoded: PBShaderExp;\r\n if (useHex(hex, grad, i)) {\r\n const prefix = `zHexN${i}`;\r\n const p = hex!.params.at(i) as PBShaderExp;\r\n terrainHexTile(scope, prefix, coord, p.x, p.y);\r\n const samples = sampleHexTiled(scope, prefix, i, sampleNormal, ddx!, ddy!);\r\n const comps = ['x', 'y', 'z'] as const;\r\n samples.forEach((raw, k) => {\r\n scope.$l[`${prefix}N${k}`] = decode(raw.rgb);\r\n const n = scope[`${prefix}N${k}`];\r\n const xy = rotate2(scope, n.xy, pb.neg(scope[`${prefix}R`][comps[k]]));\r\n // surface gradient of the turned normal against (0, 0, 1)\r\n scope.$l[`${prefix}G${k}`] = pb.div(xy, pb.max(pb.abs(n.z), 1e-5));\r\n });\r\n scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, null);\r\n const w = scope[`${prefix}NW`];\r\n const g = pb.add(\r\n pb.add(pb.mul(scope[`${prefix}G0`], w.x), pb.mul(scope[`${prefix}G1`], w.y)),\r\n pb.mul(scope[`${prefix}G2`], w.z)\r\n );\r\n decoded = pb.normalize(pb.vec3(g, 1));\r\n } else {\r\n decoded = decode(sampleNormal(scope, i, coord, ddx, ddy).rgb);\r\n }\r\n normal = pb.add(normal, pb.mul(decoded, weight(masks, i)));\r\n }\r\n return normal;\r\n}\r\n\r\n/**\r\n * Roughness: the layer roughness weighted by the splat masks, whatever the layers leave\r\n * uncovered keeps `base`, the material roughness.\r\n */\r\nexport function blendTerrainRoughness(\r\n scope: PBInsideFunctionScope,\r\n numLayers: number,\r\n masks: PBShaderExp[],\r\n detailParams: PBShaderExp,\r\n base: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n let weightSum: PBShaderExp = pb.float(0);\r\n let roughness: PBShaderExp = pb.float(0);\r\n for (let i = 0; i < numLayers; i++) {\r\n const w = weight(masks, i);\r\n weightSum = pb.add(weightSum, w);\r\n roughness = pb.add(roughness, pb.mul(w, detailParams.at(i).y));\r\n }\r\n return pb.add(roughness, pb.mul(pb.max(pb.sub(1, weightSum), 0), base)) as PBShaderExp;\r\n}\r\n"],"names":["terrainSplatMaskCount","numLayers","weight","masks","layer","useHex","hex","grad","mask","terrainHexTile","scope","prefix","coord","rotationAmount","scaleAmount","pb","$builder","func","vec2","$l","p3","fract","mul","vec3","p","x","y","add","dot","yzx","$return","xx","yz","zy","float","out","sqrt3x2","Math","sqrt","st","skewed","sub","f","z","sv","step","neg","s2","w","base","floor","id1","id2","id3","centre","id","div","ctr1","ctr2","ctr3","rand1","zTerrainHexHash","rand2","rand3","rv","rotation","PI","sv3","mix","scale","rotate","v","r","cos","sin","c1","c2","c3","s","name","getGlobalScope","zTerrainHexTile","rotate2","sampleHexTiled","sample","ddx","ddy","map","k","comp","hexWeights","colorWeights","pow","blendTerrainAlbedo","uv","detailParams","sampleAlbedo","color","i","tiling","at","params","c","rgb","luma","cw","blendTerrainDetailNormal","sampleNormal","normal","decode","raw","normalize","decoded","samples","comps","forEach","n","xy","max","abs","g","blendTerrainRoughness","weightSum","roughness"],"mappings":"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"}