@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
@@ -0,0 +1,395 @@
1
+ import { Disposable, Vector4, Vector2 } from '@zephyr3d/base';
2
+ import { VirtualTexture, virtualMipChain } from '../../render/virtualtexture/virtual_texture.js';
3
+ import { ShaderHelper } from '../../material/shader/helper.js';
4
+ import { terrainSplatMaskCount, blendTerrainAlbedo, blendTerrainDetailNormal, blendTerrainRoughness } from '../../material/shader/terrain_blend.js';
5
+ import { fetchSampler } from '../../utility/misc.js';
6
+ import { getApp, getDevice } from '../../app/api.js';
7
+
8
+ const TOLERANCE_DISTANCE_SCALE = 0.02;
9
+ const TOLERANCE_MIN_CELLS = 2;
10
+ const BORDER = 4;
11
+ /**
12
+ * The runtime virtual texture of a clipmap terrain: the detail layers blended once per page
13
+ * instead of per pixel.
14
+ *
15
+ * WebGPU only.
16
+ * @internal
17
+ */ class TerrainVirtualTexture extends Disposable {
18
+ _terrain;
19
+ _options;
20
+ _vt;
21
+ _fillProgram;
22
+ _fillBindGroup;
23
+ /** (layer count, hex tiling mask) the fill program was built for */ _fillKey;
24
+ _markProgram;
25
+ _markBindGroup;
26
+ /** What the resident pages were filled from, see sync() */ _contentVersion;
27
+ _contentParams;
28
+ _fillParams;
29
+ _fillSizes;
30
+ constructor(terrain, options){
31
+ super();
32
+ this._terrain = terrain;
33
+ this._options = {
34
+ virtualSize: options?.virtualSize ?? 32768,
35
+ pageSize: options?.pageSize ?? 128,
36
+ atlasSize: options?.atlasSize ?? 4096,
37
+ allocBudget: options?.allocBudget ?? (getApp()?.editorMode === 'editor' ? 64 : 16)
38
+ };
39
+ this._fillProgram = null;
40
+ this._fillBindGroup = null;
41
+ this._fillKey = '';
42
+ this._markProgram = null;
43
+ this._markBindGroup = null;
44
+ this._contentVersion = -1;
45
+ this._contentParams = new Float32Array(8 * 4 + 8 * 4 + 6);
46
+ this._fillParams = new Vector4();
47
+ this._fillSizes = new Vector4();
48
+ this._vt = this.createVirtualTexture();
49
+ }
50
+ get virtualTexture() {
51
+ return this._vt;
52
+ }
53
+ get options() {
54
+ return this._options;
55
+ }
56
+ isActive(_ctx, _renderQueue) {
57
+ // A terrain taken out of the scene graph (but not disposed, e.g. an undoable delete) stays
58
+ // registered; it has nothing to mark or fill until it is attached again
59
+ return this._terrain.attached && !!this._terrain.material?.virtualTextureUsed;
60
+ }
61
+ /**
62
+ * Marks the resident pages covering a world XZ rectangle for refilling
63
+ */ invalidateWorldRegion(x0, z0, x1, z1) {
64
+ const region = this._terrain.worldRegion;
65
+ const sx = region.z - region.x;
66
+ const sz = region.w - region.y;
67
+ if (sx > 0 && sz > 0) {
68
+ this._vt.invalidateRegion((Math.min(x0, x1) - region.x) / sx, (Math.min(z0, z1) - region.y) / sz, (Math.max(x0, x1) - region.x) / sx, (Math.max(z0, z1) - region.y) / sz);
69
+ }
70
+ }
71
+ invalidate() {
72
+ this._vt.invalidate();
73
+ }
74
+ /**
75
+ * Marks the pages this camera sees on the terrain, one thread per depth pixel: the world
76
+ * position is rebuilt from the depth and projected to the terrain uv, the level comes from the
77
+ * uv step to the neighbouring pixels. A neighbour off the terrain is never taken as zero footprint,
78
+ * see plans/sparse-virtual-texture.md, phase 2.
79
+ */ markFromDepth(ctx, linearDepth) {
80
+ this.sync();
81
+ const device = getDevice();
82
+ const camera = ctx.camera;
83
+ const material = this._terrain.material;
84
+ if (!this._markProgram) {
85
+ this._markProgram = this.createMarkProgram();
86
+ this._markBindGroup = device.createBindGroup(this._markProgram.bindGroupLayouts[0]);
87
+ }
88
+ const bindGroup = this._markBindGroup;
89
+ const region = this._terrain.worldRegion;
90
+ const heightMap = material.heightMap;
91
+ const cell = Math.max((region.z - region.x) / heightMap.width, (region.w - region.y) / heightMap.height);
92
+ const cameraPos = camera.getWorldPosition();
93
+ this._vt.applyBindings(bindGroup);
94
+ // Unfilterable float: the sampler must not filter
95
+ bindGroup.setTexture('depthTex', linearDepth, fetchSampler('clamp_nearest_nomip'));
96
+ bindGroup.setTexture('heightMap', heightMap, fetchSampler('clamp_linear_nomip'));
97
+ bindGroup.setValue('invVP', camera.invViewProjectionMatrix);
98
+ bindGroup.setValue('nearFar', new Vector2(camera.getNearPlane(), camera.getFarPlane()));
99
+ bindGroup.setValue('depthSize', new Vector2(linearDepth.width, linearDepth.height));
100
+ bindGroup.setValue('region', region);
101
+ bindGroup.setValue('markParams', new Vector4(this._terrain.worldMatrix.m13, material.terrainScale.y, cell * TOLERANCE_MIN_CELLS, 0));
102
+ bindGroup.setValue('cameraPos', cameraPos);
103
+ device.setProgram(this._markProgram);
104
+ device.setBindGroup(0, bindGroup);
105
+ device.compute(Math.ceil(linearDepth.width / 8), Math.ceil(linearDepth.height / 8), 1);
106
+ }
107
+ fill(_ctx) {
108
+ const material = this._terrain.material;
109
+ const numLayers = material.numDetailMaps;
110
+ const hexMask = material.hexTilingMask;
111
+ const key = `${numLayers}:${hexMask}`;
112
+ if (!this._fillProgram || this._fillKey !== key) {
113
+ this._fillBindGroup?.dispose();
114
+ this._fillProgram?.dispose();
115
+ this._fillProgram = this.createFillProgram(numLayers, hexMask);
116
+ this._fillBindGroup = getDevice().createBindGroup(this._fillProgram.bindGroupLayouts[0]);
117
+ this._fillKey = key;
118
+ }
119
+ const bindGroup = this._fillBindGroup;
120
+ const region = this._terrain.worldRegion;
121
+ const heightMap = material.heightMap;
122
+ const splatMap = material.getSplatMap();
123
+ this._fillParams.setXYZW(region.z - region.x, region.w - region.y, material.terrainScale.y, material.roughness);
124
+ this._fillSizes.setXYZW(heightMap.width, heightMap.height, splatMap.width, material.detailMapArray.width);
125
+ bindGroup.setTexture('splatMap', splatMap, fetchSampler('clamp_linear'));
126
+ bindGroup.setTexture('detailAlbedoMap', material.detailMapArray, fetchSampler('repeat_linear'));
127
+ bindGroup.setTexture('detailNormalMap', material.detailNormalMapArray, fetchSampler('repeat_linear'));
128
+ bindGroup.setValue('detailParams', material.detailMapParams.subarray(0, numLayers * 4));
129
+ if (hexMask) {
130
+ bindGroup.setValue('detailHexParams', material.detailHexParams.subarray(0, numLayers * 4));
131
+ }
132
+ bindGroup.setTexture('heightMap', heightMap, fetchSampler(heightMap.mipLevelCount > 1 ? 'clamp_linear' : 'clamp_linear_nomip'));
133
+ bindGroup.setValue('fillParams', this._fillParams);
134
+ bindGroup.setValue('fillSizes', this._fillSizes);
135
+ this._vt.fill(this._fillProgram, bindGroup);
136
+ }
137
+ /**
138
+ * Keeps the pages in step with what they are filled from: a new virtual size (region aspect)
139
+ * rebuilds the texture, any other change refills every page. Brush edits invalidate their own
140
+ * area through ClipmapTerrain.invalidateRuntimeVirtualTexture instead.
141
+ */ sync() {
142
+ const material = this._terrain.material;
143
+ const [width, height] = this.virtualDimensions();
144
+ const l0 = this._vt.levels[0];
145
+ if (l0.pagesX * this._vt.pageSize !== width || l0.pagesY * this._vt.pageSize !== height) {
146
+ this.rebuild();
147
+ return;
148
+ }
149
+ const region = this._terrain.worldRegion;
150
+ const params = this._contentParams;
151
+ const current = new Float32Array(params.length);
152
+ current.set(material.detailMapParams.subarray(0, 32));
153
+ current.set(material.detailHexParams.subarray(0, 32), 32);
154
+ current.set([
155
+ material.hexTilingMask,
156
+ material.numDetailMaps,
157
+ material.roughness,
158
+ region.z - region.x,
159
+ region.w - region.y,
160
+ material.terrainScale.y
161
+ ], 64);
162
+ let changed = this._contentVersion !== material.contentVersion;
163
+ for(let i = 0; i < params.length && !changed; i++){
164
+ changed = params[i] !== current[i];
165
+ }
166
+ if (changed) {
167
+ params.set(current);
168
+ this._contentVersion = material.contentVersion;
169
+ this._vt.invalidate();
170
+ }
171
+ }
172
+ /** Recreates the virtual texture, e.g. after the options or the terrain aspect changed */ rebuild() {
173
+ this._vt.dispose();
174
+ this.releasePrograms();
175
+ this._contentVersion = -1;
176
+ this._vt = this.createVirtualTexture();
177
+ const material = this._terrain.material;
178
+ if (material) {
179
+ material.virtualTexture = this._vt;
180
+ }
181
+ }
182
+ setOptions(options) {
183
+ Object.assign(this._options, options);
184
+ this.rebuild();
185
+ }
186
+ virtualDimensions() {
187
+ const size = this._options.virtualSize;
188
+ const region = this._terrain.worldRegion;
189
+ const sx = Math.max(region.z - region.x, 1e-6);
190
+ const sz = Math.max(region.w - region.y, 1e-6);
191
+ // The shorter side by the power of two closest to the aspect, at least one page
192
+ const ratio = 2 ** Math.round(Math.log2(Math.max(sx, sz) / Math.min(sx, sz)));
193
+ const shorter = Math.max(this._options.pageSize, size / ratio);
194
+ return sx >= sz ? [
195
+ size,
196
+ shorter
197
+ ] : [
198
+ shorter,
199
+ size
200
+ ];
201
+ }
202
+ createVirtualTexture() {
203
+ const [width, height] = this.virtualDimensions();
204
+ return new VirtualTexture(getDevice(), {
205
+ levels: virtualMipChain(width, height, this._options.pageSize),
206
+ pageSize: this._options.pageSize,
207
+ border: BORDER,
208
+ atlasSize: this._options.atlasSize,
209
+ planes: [
210
+ {
211
+ name: 'baseColor',
212
+ format: 'rgba8unorm'
213
+ },
214
+ {
215
+ name: 'normalRoughness',
216
+ format: 'rgba8unorm'
217
+ }
218
+ ],
219
+ allocBudget: this._options.allocBudget,
220
+ residencyMipBias: true
221
+ });
222
+ }
223
+ createMarkProgram() {
224
+ const vt = this._vt;
225
+ return getDevice().buildComputeProgram({
226
+ label: 'TerrainVirtualTextureMark',
227
+ workgroupSize: [
228
+ 8,
229
+ 8,
230
+ 1
231
+ ],
232
+ compute (pb) {
233
+ vt.declareBindings(this, 0);
234
+ this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
235
+ this.heightMap = pb.tex2D().uniform(0);
236
+ this.invVP = pb.mat4().uniform(0);
237
+ this.nearFar = pb.vec2().uniform(0);
238
+ this.depthSize = pb.vec2().uniform(0);
239
+ this.region = pb.vec4().uniform(0);
240
+ // (terrain origin y, height scale, minimum height tolerance, 0)
241
+ this.markParams = pb.vec4().uniform(0);
242
+ this.cameraPos = pb.vec3().uniform(0);
243
+ // (terrain uv, 1) at a pixel whose depth lies on the terrain, z = 0 otherwise
244
+ pb.func('terrainUV', [
245
+ pb.ivec2('p')
246
+ ], function() {
247
+ this.$l.d = pb.textureLoad(this.depthTex, this.p, 0).r;
248
+ this.$l.nonLinear = ShaderHelper.linearNormalizedToNonLinearDepth(this, this.d, this.nearFar);
249
+ this.$l.screenUV = pb.div(pb.add(pb.vec2(this.p), pb.vec2(0.5)), this.depthSize);
250
+ this.$l.clip = pb.vec4(pb.sub(pb.mul(this.screenUV, 2), pb.vec2(1)), ShaderHelper.deviceDepthToClipZ(this, pb.clamp(this.nonLinear, 0, 1)), 1);
251
+ this.$l.w = pb.mul(this.invVP, this.clip);
252
+ this.$l.pos = pb.div(this.w.xyz, this.w.w);
253
+ this.$l.uv = pb.div(pb.sub(this.pos.xz, this.region.xy), pb.sub(this.region.zw, this.region.xy));
254
+ this.$l.h = pb.add(this.markParams.x, pb.mul(pb.textureSampleLevel(this.heightMap, this.uv, 0).r, this.markParams.y));
255
+ this.$l.tolerance = pb.max(this.markParams.z, pb.mul(pb.distance(this.pos, this.cameraPos), TOLERANCE_DISTANCE_SCALE));
256
+ this.$l.onTerrain = pb.and(pb.and(pb.lessThan(this.d, 0.9999), pb.lessThanEqual(pb.abs(pb.sub(this.pos.y, this.h)), this.tolerance)), pb.and(pb.all(pb.greaterThanEqual(this.uv, pb.vec2(0))), pb.all(pb.lessThanEqual(this.uv, pb.vec2(1)))));
257
+ this.$return(pb.vec3(this.uv, pb.float(this.onTerrain)));
258
+ });
259
+ // Change of the terrain uv to the next pixel along `step`, forward if that pixel is on
260
+ // the terrain, else backward: (duv, 1), or (0, 0, 0) when neither neighbour is
261
+ pb.func('axisDelta', [
262
+ pb.ivec2('p'),
263
+ pb.ivec2('step'),
264
+ pb.vec2('uv')
265
+ ], function() {
266
+ this.$l.size = pb.ivec2(this.depthSize);
267
+ this.$l.f = pb.add(this.p, this.step);
268
+ this.$if(pb.and(pb.lessThan(this.f.x, this.size.x), pb.lessThan(this.f.y, this.size.y)), function() {
269
+ this.$l.nf = this.terrainUV(this.f);
270
+ this.$if(pb.notEqual(this.nf.z, 0), function() {
271
+ this.$return(pb.vec3(pb.sub(this.nf.xy, this.uv), 1));
272
+ });
273
+ });
274
+ this.$l.b = pb.sub(this.p, this.step);
275
+ this.$if(pb.and(pb.greaterThanEqual(this.b.x, 0), pb.greaterThanEqual(this.b.y, 0)), function() {
276
+ this.$l.nb = this.terrainUV(this.b);
277
+ this.$if(pb.notEqual(this.nb.z, 0), function() {
278
+ this.$return(pb.vec3(pb.sub(this.uv, this.nb.xy), 1));
279
+ });
280
+ });
281
+ this.$return(pb.vec3(0));
282
+ });
283
+ pb.main(function() {
284
+ this.$l.p = pb.ivec2(this.$builtins.globalInvocationId.xy);
285
+ this.$l.size = pb.ivec2(this.depthSize);
286
+ this.$if(pb.or(pb.greaterThanEqual(this.p.x, this.size.x), pb.greaterThanEqual(this.p.y, this.size.y)), function() {
287
+ this.$return();
288
+ });
289
+ this.$l.c = this.terrainUV(this.p);
290
+ this.$if(pb.equal(this.c.z, 0), function() {
291
+ this.$return();
292
+ });
293
+ // An axis without a neighbour on the terrain uses the other axis alone, a pixel
294
+ // without any is not marked (it resolves to a resident ancestor)
295
+ this.$l.ax = this.axisDelta(this.p, pb.ivec2(1, 0), this.c.xy);
296
+ this.$l.ay = this.axisDelta(this.p, pb.ivec2(0, 1), this.c.xy);
297
+ this.$if(pb.equal(pb.add(this.ax.z, this.ay.z), 0), function() {
298
+ this.$return();
299
+ });
300
+ this.$l.dx = pb.select(this.ay.xy, this.ax.xy, pb.notEqual(this.ax.z, 0));
301
+ this.$l.dy = pb.select(this.ax.xy, this.ay.xy, pb.notEqual(this.ay.z, 0));
302
+ this.$l.level = pb.uint(pb.floor(vt.levelFromFootprint(this, this.dx, this.dy)));
303
+ vt.request(this, this.level, this.c.xy);
304
+ });
305
+ }
306
+ });
307
+ }
308
+ /**
309
+ * The page fill: the same blend as the material's live path (terrain_blend.ts), each texture
310
+ * sampled at the LOD of one texel of the page's level, and the height map tangent frame of
311
+ * ClipmapTerrainMaterial.calculateTerrainTBN on the same footprint.
312
+ */ createFillProgram(numLayers, hexMask) {
313
+ const vt = this._vt;
314
+ return vt.createFillProgram(`TerrainVirtualTextureFill${numLayers}_${hexMask}`, (scope)=>{
315
+ const pb = scope.$builder;
316
+ scope.splatMap = pb.tex2DArray().uniform(0);
317
+ scope.detailAlbedoMap = pb.tex2DArray().uniform(0);
318
+ scope.detailNormalMap = pb.tex2DArray().uniform(0);
319
+ scope.detailParams = pb.vec4[numLayers]().uniform(0);
320
+ if (hexMask) {
321
+ scope.detailHexParams = pb.vec4[numLayers]().uniform(0);
322
+ }
323
+ scope.heightMap = pb.tex2D().uniform(0);
324
+ // (region width, region depth, height scale, material roughness)
325
+ scope.fillParams = pb.vec4().uniform(0);
326
+ // (height map width, height map height, splat map size, detail map size)
327
+ scope.fillSizes = pb.vec4().uniform(0);
328
+ }, (scope, level, texel)=>{
329
+ const pb = scope.$builder;
330
+ scope.$l.levelTexels = vt.levelTexels(scope, level);
331
+ scope.$l.uv = pb.div(texel, scope.levelTexels);
332
+ // Terrain uv covered by one texel of this level
333
+ scope.$l.footprint = pb.div(1, pb.min(scope.levelTexels.x, scope.levelTexels.y));
334
+ scope.$l.splatLod = pb.max(pb.log2(pb.mul(scope.footprint, scope.fillSizes.z)), 0);
335
+ const masks = [];
336
+ for(let i = 0; i < terrainSplatMaskCount(numLayers); i++){
337
+ scope.$l[`mask${i}`] = pb.textureArraySampleLevel(scope.splatMap, scope.uv, i, scope.splatLod);
338
+ masks.push(scope[`mask${i}`]);
339
+ }
340
+ // The uv step to the next texel of the level stands for the screen derivatives: the
341
+ // gradients pick the mip the orthographic top view would get (and turn with the hex tiles)
342
+ const grad = {
343
+ ddx: pb.vec2(pb.div(1, scope.levelTexels.x), 0),
344
+ ddy: pb.vec2(0, pb.div(1, scope.levelTexels.y))
345
+ };
346
+ const hex = hexMask ? {
347
+ mask: hexMask,
348
+ params: scope.detailHexParams
349
+ } : null;
350
+ scope.$l.albedo = blendTerrainAlbedo(scope, numLayers, masks, scope.uv, scope.detailParams, (s, i, uv, ddx, ddy)=>pb.textureArraySampleGrad(s.detailAlbedoMap, uv, i, ddx, ddy), grad, hex);
351
+ scope.$l.detailNormal = blendTerrainDetailNormal(scope, numLayers, masks, scope.uv, scope.detailParams, (s, i, uv, ddx, ddy)=>pb.textureArraySampleGrad(s.detailNormalMap, uv, i, ddx, ddy), grad, hex);
352
+ scope.$l.roughness = blendTerrainRoughness(scope, numLayers, masks, scope.detailParams, scope.fillParams.w);
353
+ // Height map tangent frame, ClipmapTerrainMaterial.calculateTerrainTBN
354
+ scope.$l.heightLod = pb.max(pb.log2(pb.max(pb.mul(scope.footprint, pb.max(scope.fillSizes.x, scope.fillSizes.y)), 0.0001)), 0);
355
+ scope.$l.offset = pb.mul(pb.div(pb.vec2(1), scope.fillSizes.xy), pb.mul(pb.exp2(scope.heightLod), 0.5));
356
+ const height = (uv)=>pb.textureSampleLevel(scope.heightMap, uv, scope.heightLod).r;
357
+ scope.$l.hL = height(pb.sub(scope.uv, pb.vec2(scope.offset.x, 0)));
358
+ scope.$l.hR = height(pb.add(scope.uv, pb.vec2(scope.offset.x, 0)));
359
+ scope.$l.hU = height(pb.sub(scope.uv, pb.vec2(0, scope.offset.y)));
360
+ scope.$l.hD = height(pb.add(scope.uv, pb.vec2(0, scope.offset.y)));
361
+ scope.$l.sampleDist = pb.mul(scope.fillParams.xy, pb.mul(scope.offset, 2));
362
+ scope.$l.dHdU = pb.div(pb.mul(pb.sub(scope.hR, scope.hL), scope.fillParams.z), scope.sampleDist.x);
363
+ scope.$l.dHdV = pb.div(pb.mul(pb.sub(scope.hD, scope.hU), scope.fillParams.z), scope.sampleDist.y);
364
+ scope.$l.t = pb.normalize(pb.vec3(1, scope.dHdU, 0));
365
+ scope.$l.b = pb.normalize(pb.vec3(0, scope.dHdV, 1));
366
+ scope.$l.n = pb.normalize(pb.cross(scope.b, scope.t));
367
+ scope.$l.normal = pb.normalize(pb.mul(pb.mat3(scope.t, scope.b, scope.n), scope.detailNormal));
368
+ // PackNormal and LinearToSrgb (VirtualTextureMaterial.usf)
369
+ scope.$l.packed = pb.add(pb.mul(scope.normal, 127 / 255), pb.vec3(127 / 255));
370
+ scope.$l.srgb = pb.mix(pb.sub(pb.mul(pb.pow(scope.albedo, pb.vec3(1 / 2.4)), 1.055), pb.vec3(0.055)), pb.mul(scope.albedo, 12.92), pb.vec3(pb.lessThanEqual(scope.albedo, pb.vec3(0.0031308))));
371
+ return [
372
+ pb.vec4(pb.clamp(scope.srgb, pb.vec3(0), pb.vec3(1)), 1),
373
+ pb.vec4(scope.packed.x, scope.roughness, scope.packed.z, 1)
374
+ ];
375
+ });
376
+ }
377
+ /** The mark and fill programs bake in the layout of the virtual texture they were built for */ releasePrograms() {
378
+ this._markBindGroup?.dispose();
379
+ this._markBindGroup = null;
380
+ this._markProgram?.dispose();
381
+ this._markProgram = null;
382
+ this._fillBindGroup?.dispose();
383
+ this._fillBindGroup = null;
384
+ this._fillProgram?.dispose();
385
+ this._fillProgram = null;
386
+ }
387
+ onDispose() {
388
+ super.onDispose();
389
+ this._vt.dispose();
390
+ this.releasePrograms();
391
+ }
392
+ }
393
+
394
+ export { TerrainVirtualTexture };
395
+ //# sourceMappingURL=terrain_rvt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain_rvt.js","sources":["../../../src/scene/terrain-cm/terrain_rvt.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUProgram, PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext, RenderQueue, VirtualTextureClient } from '../../render';\r\nimport { VirtualTexture, virtualMipChain } from '../../render/virtualtexture/virtual_texture';\r\nimport { ShaderHelper } from '../../material/shader/helper';\r\nimport {\r\n blendTerrainAlbedo,\r\n blendTerrainDetailNormal,\r\n blendTerrainRoughness,\r\n terrainSplatMaskCount\r\n} from '../../material/shader/terrain_blend';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { getApp, getDevice } from '../../app/api';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\n\r\n/**\r\n * Options of a terrain runtime virtual texture\r\n * @public\r\n */\r\nexport interface TerrainVirtualTextureOptions {\r\n /**\r\n * Virtual size in texels along the longer side of the terrain, a power of two. The shorter\r\n * side gets the power of two closest to the terrain aspect. Default 32768.\r\n */\r\n virtualSize?: number;\r\n /** Page size in texels, default 128 */\r\n pageSize?: number;\r\n /** Physical atlas size in texels, default 4096 (961 pages, two rgba8 planes, 128 MB) */\r\n atlasSize?: number;\r\n /**\r\n * Pages filled per update. Default 16, 64 in the editor, where brushes invalidate whole areas\r\n * every frame and the pages have to keep up with the edits.\r\n */\r\n allocBudget?: number;\r\n}\r\n\r\nconst TOLERANCE_DISTANCE_SCALE = 0.02;\r\nconst TOLERANCE_MIN_CELLS = 2;\r\nconst BORDER = 4;\r\n\r\n/**\r\n * The runtime virtual texture of a clipmap terrain: the detail layers blended once per page\r\n * instead of per pixel.\r\n *\r\n * WebGPU only.\r\n * @internal\r\n */\r\nexport class TerrainVirtualTexture extends Disposable implements VirtualTextureClient {\r\n private readonly _terrain: ClipmapTerrain;\r\n private readonly _options: Required<TerrainVirtualTextureOptions>;\r\n private _vt: VirtualTexture;\r\n private _fillProgram: Nullable<GPUProgram>;\r\n private _fillBindGroup: Nullable<BindGroup>;\r\n /** (layer count, hex tiling mask) the fill program was built for */\r\n private _fillKey: string;\r\n private _markProgram: Nullable<GPUProgram>;\r\n private _markBindGroup: Nullable<BindGroup>;\r\n /** What the resident pages were filled from, see sync() */\r\n private _contentVersion: number;\r\n private readonly _contentParams: Float32Array<ArrayBuffer>;\r\n private readonly _fillParams: Vector4;\r\n private readonly _fillSizes: Vector4;\r\n constructor(terrain: ClipmapTerrain, options?: TerrainVirtualTextureOptions) {\r\n super();\r\n this._terrain = terrain;\r\n this._options = {\r\n virtualSize: options?.virtualSize ?? 32768,\r\n pageSize: options?.pageSize ?? 128,\r\n atlasSize: options?.atlasSize ?? 4096,\r\n allocBudget: options?.allocBudget ?? (getApp()?.editorMode === 'editor' ? 64 : 16)\r\n };\r\n this._fillProgram = null;\r\n this._fillBindGroup = null;\r\n this._fillKey = '';\r\n this._markProgram = null;\r\n this._markBindGroup = null;\r\n this._contentVersion = -1;\r\n this._contentParams = new Float32Array(8 * 4 + 8 * 4 + 6);\r\n this._fillParams = new Vector4();\r\n this._fillSizes = new Vector4();\r\n this._vt = this.createVirtualTexture();\r\n }\r\n get virtualTexture() {\r\n return this._vt;\r\n }\r\n get options(): Readonly<Required<TerrainVirtualTextureOptions>> {\r\n return this._options;\r\n }\r\n isActive(_ctx: DrawContext, _renderQueue: RenderQueue) {\r\n // A terrain taken out of the scene graph (but not disposed, e.g. an undoable delete) stays\r\n // registered; it has nothing to mark or fill until it is attached again\r\n return this._terrain.attached && !!this._terrain.material?.virtualTextureUsed;\r\n }\r\n /**\r\n * Marks the resident pages covering a world XZ rectangle for refilling\r\n */\r\n invalidateWorldRegion(x0: number, z0: number, x1: number, z1: number) {\r\n const region = this._terrain.worldRegion;\r\n const sx = region.z - region.x;\r\n const sz = region.w - region.y;\r\n if (sx > 0 && sz > 0) {\r\n this._vt.invalidateRegion(\r\n (Math.min(x0, x1) - region.x) / sx,\r\n (Math.min(z0, z1) - region.y) / sz,\r\n (Math.max(x0, x1) - region.x) / sx,\r\n (Math.max(z0, z1) - region.y) / sz\r\n );\r\n }\r\n }\r\n invalidate() {\r\n this._vt.invalidate();\r\n }\r\n /**\r\n * Marks the pages this camera sees on the terrain, one thread per depth pixel: the world\r\n * position is rebuilt from the depth and projected to the terrain uv, the level comes from the\r\n * uv step to the neighbouring pixels. A neighbour off the terrain is never taken as zero footprint,\r\n * see plans/sparse-virtual-texture.md, phase 2.\r\n */\r\n markFromDepth(ctx: DrawContext, linearDepth: Texture2D) {\r\n this.sync();\r\n const device = getDevice();\r\n const camera = ctx.camera;\r\n const material = this._terrain.material!;\r\n if (!this._markProgram) {\r\n this._markProgram = this.createMarkProgram();\r\n this._markBindGroup = device.createBindGroup(this._markProgram.bindGroupLayouts[0]);\r\n }\r\n const bindGroup = this._markBindGroup!;\r\n const region = this._terrain.worldRegion;\r\n const heightMap = material.heightMap;\r\n const cell = Math.max((region.z - region.x) / heightMap.width, (region.w - region.y) / heightMap.height);\r\n const cameraPos = camera.getWorldPosition();\r\n this._vt.applyBindings(bindGroup);\r\n // Unfilterable float: the sampler must not filter\r\n bindGroup.setTexture('depthTex', linearDepth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('heightMap', heightMap, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('invVP', camera.invViewProjectionMatrix);\r\n bindGroup.setValue('nearFar', new Vector2(camera.getNearPlane(), camera.getFarPlane()));\r\n bindGroup.setValue('depthSize', new Vector2(linearDepth.width, linearDepth.height));\r\n bindGroup.setValue('region', region);\r\n bindGroup.setValue(\r\n 'markParams',\r\n new Vector4(this._terrain.worldMatrix.m13, material.terrainScale.y, cell * TOLERANCE_MIN_CELLS, 0)\r\n );\r\n bindGroup.setValue('cameraPos', cameraPos);\r\n device.setProgram(this._markProgram);\r\n device.setBindGroup(0, bindGroup);\r\n device.compute(Math.ceil(linearDepth.width / 8), Math.ceil(linearDepth.height / 8), 1);\r\n }\r\n fill(_ctx: DrawContext) {\r\n const material = this._terrain.material!;\r\n const numLayers = material.numDetailMaps;\r\n const hexMask = material.hexTilingMask;\r\n const key = `${numLayers}:${hexMask}`;\r\n if (!this._fillProgram || this._fillKey !== key) {\r\n this._fillBindGroup?.dispose();\r\n this._fillProgram?.dispose();\r\n this._fillProgram = this.createFillProgram(numLayers, hexMask);\r\n this._fillBindGroup = getDevice().createBindGroup(this._fillProgram.bindGroupLayouts[0]);\r\n this._fillKey = key;\r\n }\r\n const bindGroup = this._fillBindGroup!;\r\n const region = this._terrain.worldRegion;\r\n const heightMap = material.heightMap;\r\n const splatMap = material.getSplatMap()!;\r\n this._fillParams.setXYZW(\r\n region.z - region.x,\r\n region.w - region.y,\r\n material.terrainScale.y,\r\n material.roughness\r\n );\r\n this._fillSizes.setXYZW(\r\n heightMap.width,\r\n heightMap.height,\r\n splatMap.width,\r\n material.detailMapArray!.width\r\n );\r\n bindGroup.setTexture('splatMap', splatMap, fetchSampler('clamp_linear'));\r\n bindGroup.setTexture('detailAlbedoMap', material.detailMapArray!, fetchSampler('repeat_linear'));\r\n bindGroup.setTexture('detailNormalMap', material.detailNormalMapArray!, fetchSampler('repeat_linear'));\r\n bindGroup.setValue('detailParams', material.detailMapParams.subarray(0, numLayers * 4));\r\n if (hexMask) {\r\n bindGroup.setValue('detailHexParams', material.detailHexParams.subarray(0, numLayers * 4));\r\n }\r\n bindGroup.setTexture(\r\n 'heightMap',\r\n heightMap,\r\n fetchSampler(heightMap.mipLevelCount > 1 ? 'clamp_linear' : 'clamp_linear_nomip')\r\n );\r\n bindGroup.setValue('fillParams', this._fillParams);\r\n bindGroup.setValue('fillSizes', this._fillSizes);\r\n this._vt.fill(this._fillProgram, bindGroup);\r\n }\r\n /**\r\n * Keeps the pages in step with what they are filled from: a new virtual size (region aspect)\r\n * rebuilds the texture, any other change refills every page. Brush edits invalidate their own\r\n * area through ClipmapTerrain.invalidateRuntimeVirtualTexture instead.\r\n */\r\n sync() {\r\n const material = this._terrain.material!;\r\n const [width, height] = this.virtualDimensions();\r\n const l0 = this._vt.levels[0];\r\n if (l0.pagesX * this._vt.pageSize !== width || l0.pagesY * this._vt.pageSize !== height) {\r\n this.rebuild();\r\n return;\r\n }\r\n const region = this._terrain.worldRegion;\r\n const params = this._contentParams;\r\n const current = new Float32Array(params.length);\r\n current.set(material.detailMapParams.subarray(0, 32));\r\n current.set(material.detailHexParams.subarray(0, 32), 32);\r\n current.set(\r\n [\r\n material.hexTilingMask,\r\n material.numDetailMaps,\r\n material.roughness,\r\n region.z - region.x,\r\n region.w - region.y,\r\n material.terrainScale.y\r\n ],\r\n 64\r\n );\r\n let changed = this._contentVersion !== material.contentVersion;\r\n for (let i = 0; i < params.length && !changed; i++) {\r\n changed = params[i] !== current[i];\r\n }\r\n if (changed) {\r\n params.set(current);\r\n this._contentVersion = material.contentVersion;\r\n this._vt.invalidate();\r\n }\r\n }\r\n /** Recreates the virtual texture, e.g. after the options or the terrain aspect changed */\r\n rebuild() {\r\n this._vt.dispose();\r\n this.releasePrograms();\r\n this._contentVersion = -1;\r\n this._vt = this.createVirtualTexture();\r\n const material = this._terrain.material;\r\n if (material) {\r\n material.virtualTexture = this._vt;\r\n }\r\n }\r\n setOptions(options: TerrainVirtualTextureOptions) {\r\n Object.assign(this._options, options);\r\n this.rebuild();\r\n }\r\n private virtualDimensions(): [number, number] {\r\n const size = this._options.virtualSize;\r\n const region = this._terrain.worldRegion;\r\n const sx = Math.max(region.z - region.x, 1e-6);\r\n const sz = Math.max(region.w - region.y, 1e-6);\r\n // The shorter side by the power of two closest to the aspect, at least one page\r\n const ratio = 2 ** Math.round(Math.log2(Math.max(sx, sz) / Math.min(sx, sz)));\r\n const shorter = Math.max(this._options.pageSize, size / ratio);\r\n return sx >= sz ? [size, shorter] : [shorter, size];\r\n }\r\n private createVirtualTexture() {\r\n const [width, height] = this.virtualDimensions();\r\n return new VirtualTexture(getDevice(), {\r\n levels: virtualMipChain(width, height, this._options.pageSize),\r\n pageSize: this._options.pageSize,\r\n border: BORDER,\r\n atlasSize: this._options.atlasSize,\r\n planes: [\r\n { name: 'baseColor', format: 'rgba8unorm' },\r\n { name: 'normalRoughness', format: 'rgba8unorm' }\r\n ],\r\n allocBudget: this._options.allocBudget,\r\n residencyMipBias: true\r\n });\r\n }\r\n private createMarkProgram() {\r\n const vt = this._vt;\r\n return getDevice().buildComputeProgram({\r\n label: 'TerrainVirtualTextureMark',\r\n workgroupSize: [8, 8, 1],\r\n compute(pb) {\r\n vt.declareBindings(this, 0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.invVP = pb.mat4().uniform(0);\r\n this.nearFar = pb.vec2().uniform(0);\r\n this.depthSize = pb.vec2().uniform(0);\r\n this.region = pb.vec4().uniform(0);\r\n // (terrain origin y, height scale, minimum height tolerance, 0)\r\n this.markParams = pb.vec4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n // (terrain uv, 1) at a pixel whose depth lies on the terrain, z = 0 otherwise\r\n pb.func('terrainUV', [pb.ivec2('p')], function () {\r\n this.$l.d = pb.textureLoad(this.depthTex, this.p, 0).r;\r\n this.$l.nonLinear = ShaderHelper.linearNormalizedToNonLinearDepth(this, this.d, this.nearFar);\r\n this.$l.screenUV = pb.div(pb.add(pb.vec2(this.p), pb.vec2(0.5)), this.depthSize);\r\n this.$l.clip = pb.vec4(\r\n pb.sub(pb.mul(this.screenUV, 2), pb.vec2(1)),\r\n ShaderHelper.deviceDepthToClipZ(this, pb.clamp(this.nonLinear, 0, 1)),\r\n 1\r\n );\r\n this.$l.w = pb.mul(this.invVP, this.clip);\r\n this.$l.pos = pb.div(this.w.xyz, this.w.w);\r\n this.$l.uv = pb.div(pb.sub(this.pos.xz, this.region.xy), pb.sub(this.region.zw, this.region.xy));\r\n this.$l.h = pb.add(\r\n this.markParams.x,\r\n pb.mul(pb.textureSampleLevel(this.heightMap, this.uv, 0).r, this.markParams.y)\r\n );\r\n this.$l.tolerance = pb.max(\r\n this.markParams.z,\r\n pb.mul(pb.distance(this.pos, this.cameraPos), TOLERANCE_DISTANCE_SCALE)\r\n );\r\n this.$l.onTerrain = pb.and(\r\n pb.and(\r\n pb.lessThan(this.d, 0.9999),\r\n pb.lessThanEqual(pb.abs(pb.sub(this.pos.y, this.h)), this.tolerance)\r\n ),\r\n pb.and(\r\n pb.all(pb.greaterThanEqual(this.uv, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.uv, pb.vec2(1)))\r\n )\r\n );\r\n this.$return(pb.vec3(this.uv, pb.float(this.onTerrain)));\r\n });\r\n // Change of the terrain uv to the next pixel along `step`, forward if that pixel is on\r\n // the terrain, else backward: (duv, 1), or (0, 0, 0) when neither neighbour is\r\n pb.func('axisDelta', [pb.ivec2('p'), pb.ivec2('step'), pb.vec2('uv')], function () {\r\n this.$l.size = pb.ivec2(this.depthSize);\r\n this.$l.f = pb.add(this.p, this.step);\r\n this.$if(\r\n pb.and(pb.lessThan(this.f.x, this.size.x), pb.lessThan(this.f.y, this.size.y)),\r\n function () {\r\n this.$l.nf = this.terrainUV(this.f);\r\n this.$if(pb.notEqual(this.nf.z, 0), function () {\r\n this.$return(pb.vec3(pb.sub(this.nf.xy, this.uv), 1));\r\n });\r\n }\r\n );\r\n this.$l.b = pb.sub(this.p, this.step);\r\n this.$if(pb.and(pb.greaterThanEqual(this.b.x, 0), pb.greaterThanEqual(this.b.y, 0)), function () {\r\n this.$l.nb = this.terrainUV(this.b);\r\n this.$if(pb.notEqual(this.nb.z, 0), function () {\r\n this.$return(pb.vec3(pb.sub(this.uv, this.nb.xy), 1));\r\n });\r\n });\r\n this.$return(pb.vec3(0));\r\n });\r\n pb.main(function () {\r\n this.$l.p = pb.ivec2(this.$builtins.globalInvocationId.xy);\r\n this.$l.size = pb.ivec2(this.depthSize);\r\n this.$if(\r\n pb.or(pb.greaterThanEqual(this.p.x, this.size.x), pb.greaterThanEqual(this.p.y, this.size.y)),\r\n function () {\r\n this.$return();\r\n }\r\n );\r\n this.$l.c = this.terrainUV(this.p);\r\n this.$if(pb.equal(this.c.z, 0), function () {\r\n this.$return();\r\n });\r\n // An axis without a neighbour on the terrain uses the other axis alone, a pixel\r\n // without any is not marked (it resolves to a resident ancestor)\r\n this.$l.ax = this.axisDelta(this.p, pb.ivec2(1, 0), this.c.xy);\r\n this.$l.ay = this.axisDelta(this.p, pb.ivec2(0, 1), this.c.xy);\r\n this.$if(pb.equal(pb.add(this.ax.z, this.ay.z), 0), function () {\r\n this.$return();\r\n });\r\n this.$l.dx = pb.select(this.ay.xy, this.ax.xy, pb.notEqual(this.ax.z, 0));\r\n this.$l.dy = pb.select(this.ax.xy, this.ay.xy, pb.notEqual(this.ay.z, 0));\r\n this.$l.level = pb.uint(pb.floor(vt.levelFromFootprint(this, this.dx, this.dy)));\r\n vt.request(this as PBInsideFunctionScope, this.level as PBShaderExp, this.c.xy as PBShaderExp);\r\n });\r\n }\r\n })!;\r\n }\r\n /**\r\n * The page fill: the same blend as the material's live path (terrain_blend.ts), each texture\r\n * sampled at the LOD of one texel of the page's level, and the height map tangent frame of\r\n * ClipmapTerrainMaterial.calculateTerrainTBN on the same footprint.\r\n */\r\n private createFillProgram(numLayers: number, hexMask: number) {\r\n const vt = this._vt;\r\n return vt.createFillProgram(\r\n `TerrainVirtualTextureFill${numLayers}_${hexMask}`,\r\n (scope) => {\r\n const pb = scope.$builder;\r\n scope.splatMap = pb.tex2DArray().uniform(0);\r\n scope.detailAlbedoMap = pb.tex2DArray().uniform(0);\r\n scope.detailNormalMap = pb.tex2DArray().uniform(0);\r\n scope.detailParams = pb.vec4[numLayers]().uniform(0);\r\n if (hexMask) {\r\n scope.detailHexParams = pb.vec4[numLayers]().uniform(0);\r\n }\r\n scope.heightMap = pb.tex2D().uniform(0);\r\n // (region width, region depth, height scale, material roughness)\r\n scope.fillParams = pb.vec4().uniform(0);\r\n // (height map width, height map height, splat map size, detail map size)\r\n scope.fillSizes = pb.vec4().uniform(0);\r\n },\r\n (scope, level, texel) => {\r\n const pb = scope.$builder;\r\n scope.$l.levelTexels = vt.levelTexels(scope, level);\r\n scope.$l.uv = pb.div(texel, scope.levelTexels);\r\n // Terrain uv covered by one texel of this level\r\n scope.$l.footprint = pb.div(1, pb.min(scope.levelTexels.x, scope.levelTexels.y));\r\n scope.$l.splatLod = pb.max(pb.log2(pb.mul(scope.footprint, scope.fillSizes.z)), 0);\r\n const masks: PBShaderExp[] = [];\r\n for (let i = 0; i < terrainSplatMaskCount(numLayers); i++) {\r\n scope.$l[`mask${i}`] = pb.textureArraySampleLevel(scope.splatMap, scope.uv, i, scope.splatLod);\r\n masks.push(scope[`mask${i}`]);\r\n }\r\n // The uv step to the next texel of the level stands for the screen derivatives: the\r\n // gradients pick the mip the orthographic top view would get (and turn with the hex tiles)\r\n const grad = {\r\n ddx: pb.vec2(pb.div(1, scope.levelTexels.x), 0),\r\n ddy: pb.vec2(0, pb.div(1, scope.levelTexels.y))\r\n };\r\n const hex = hexMask ? { mask: hexMask, params: scope.detailHexParams as PBShaderExp } : null;\r\n scope.$l.albedo = blendTerrainAlbedo(\r\n scope,\r\n numLayers,\r\n masks,\r\n scope.uv,\r\n scope.detailParams,\r\n (s, i, uv, ddx, ddy) => pb.textureArraySampleGrad(s.detailAlbedoMap, uv, i, ddx!, ddy!),\r\n grad,\r\n hex\r\n );\r\n scope.$l.detailNormal = blendTerrainDetailNormal(\r\n scope,\r\n numLayers,\r\n masks,\r\n scope.uv,\r\n scope.detailParams,\r\n (s, i, uv, ddx, ddy) => pb.textureArraySampleGrad(s.detailNormalMap, uv, i, ddx!, ddy!),\r\n grad,\r\n hex\r\n );\r\n scope.$l.roughness = blendTerrainRoughness(\r\n scope,\r\n numLayers,\r\n masks,\r\n scope.detailParams,\r\n scope.fillParams.w\r\n );\r\n // Height map tangent frame, ClipmapTerrainMaterial.calculateTerrainTBN\r\n scope.$l.heightLod = pb.max(\r\n pb.log2(pb.max(pb.mul(scope.footprint, pb.max(scope.fillSizes.x, scope.fillSizes.y)), 0.0001)),\r\n 0\r\n );\r\n scope.$l.offset = pb.mul(\r\n pb.div(pb.vec2(1), scope.fillSizes.xy),\r\n pb.mul(pb.exp2(scope.heightLod), 0.5)\r\n );\r\n const height = (uv: PBShaderExp) => pb.textureSampleLevel(scope.heightMap, uv, scope.heightLod).r;\r\n scope.$l.hL = height(pb.sub(scope.uv, pb.vec2(scope.offset.x, 0)));\r\n scope.$l.hR = height(pb.add(scope.uv, pb.vec2(scope.offset.x, 0)));\r\n scope.$l.hU = height(pb.sub(scope.uv, pb.vec2(0, scope.offset.y)));\r\n scope.$l.hD = height(pb.add(scope.uv, pb.vec2(0, scope.offset.y)));\r\n scope.$l.sampleDist = pb.mul(scope.fillParams.xy, pb.mul(scope.offset, 2));\r\n scope.$l.dHdU = pb.div(pb.mul(pb.sub(scope.hR, scope.hL), scope.fillParams.z), scope.sampleDist.x);\r\n scope.$l.dHdV = pb.div(pb.mul(pb.sub(scope.hD, scope.hU), scope.fillParams.z), scope.sampleDist.y);\r\n scope.$l.t = pb.normalize(pb.vec3(1, scope.dHdU, 0));\r\n scope.$l.b = pb.normalize(pb.vec3(0, scope.dHdV, 1));\r\n scope.$l.n = pb.normalize(pb.cross(scope.b, scope.t));\r\n scope.$l.normal = pb.normalize(pb.mul(pb.mat3(scope.t, scope.b, scope.n), scope.detailNormal));\r\n // PackNormal and LinearToSrgb (VirtualTextureMaterial.usf)\r\n scope.$l.packed = pb.add(pb.mul(scope.normal, 127 / 255), pb.vec3(127 / 255));\r\n scope.$l.srgb = pb.mix(\r\n pb.sub(pb.mul(pb.pow(scope.albedo, pb.vec3(1 / 2.4)), 1.055), pb.vec3(0.055)),\r\n pb.mul(scope.albedo, 12.92),\r\n pb.vec3(pb.lessThanEqual(scope.albedo, pb.vec3(0.0031308)))\r\n );\r\n return [\r\n pb.vec4(pb.clamp(scope.srgb, pb.vec3(0), pb.vec3(1)), 1),\r\n pb.vec4(scope.packed.x, scope.roughness, scope.packed.z, 1)\r\n ];\r\n }\r\n );\r\n }\r\n /** The mark and fill programs bake in the layout of the virtual texture they were built for */\r\n private releasePrograms() {\r\n this._markBindGroup?.dispose();\r\n this._markBindGroup = null;\r\n this._markProgram?.dispose();\r\n this._markProgram = null;\r\n this._fillBindGroup?.dispose();\r\n this._fillBindGroup = null;\r\n this._fillProgram?.dispose();\r\n this._fillProgram = null;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._vt.dispose();\r\n this.releasePrograms();\r\n }\r\n}\r\n"],"names":["TOLERANCE_DISTANCE_SCALE","TOLERANCE_MIN_CELLS","BORDER","TerrainVirtualTexture","Disposable","_terrain","_options","_vt","_fillProgram","_fillBindGroup","_markProgram","_markBindGroup","_contentParams","_fillParams","_fillSizes","terrain","options","virtualSize","pageSize","atlasSize","allocBudget","getApp","editorMode","_fillKey","_contentVersion","Float32Array","Vector4","createVirtualTexture","virtualTexture","isActive","_ctx","_renderQueue","attached","material","virtualTextureUsed","invalidateWorldRegion","x0","z0","x1","z1","region","worldRegion","sx","z","x","sz","w","y","invalidateRegion","Math","min","max","invalidate","markFromDepth","ctx","linearDepth","sync","device","getDevice","camera","createMarkProgram","createBindGroup","bindGroupLayouts","bindGroup","heightMap","cell","width","height","cameraPos","getWorldPosition","applyBindings","setTexture","fetchSampler","setValue","invViewProjectionMatrix","Vector2","getNearPlane","getFarPlane","worldMatrix","m13","terrainScale","setProgram","setBindGroup","compute","ceil","fill","numLayers","numDetailMaps","hexMask","hexTilingMask","key","dispose","createFillProgram","splatMap","getSplatMap","setXYZW","roughness","detailMapArray","detailNormalMapArray","detailMapParams","subarray","detailHexParams","mipLevelCount","virtualDimensions","l0","levels","pagesX","pagesY","rebuild","params","current","length","set","changed","contentVersion","i","releasePrograms","setOptions","Object","assign","size","ratio","round","log2","shorter","VirtualTexture","virtualMipChain","border","planes","name","format","residencyMipBias","vt","buildComputeProgram","label","workgroupSize","pb","declareBindings","depthTex","tex2D","sampleType","uniform","invVP","mat4","nearFar","vec2","depthSize","vec4","markParams","vec3","func","ivec2","$l","d","textureLoad","p","r","nonLinear","ShaderHelper","linearNormalizedToNonLinearDepth","screenUV","div","add","clip","sub","mul","deviceDepthToClipZ","clamp","pos","xyz","uv","xz","xy","zw","h","textureSampleLevel","tolerance","distance","onTerrain","and","lessThan","lessThanEqual","abs","all","greaterThanEqual","$return","float","f","step","$if","nf","terrainUV","notEqual","b","nb","main","$builtins","globalInvocationId","or","c","equal","ax","axisDelta","ay","dx","select","dy","level","uint","floor","levelFromFootprint","request","scope","$builder","tex2DArray","detailAlbedoMap","detailNormalMap","detailParams","fillParams","fillSizes","texel","levelTexels","footprint","splatLod","masks","terrainSplatMaskCount","textureArraySampleLevel","push","grad","ddx","ddy","hex","mask","albedo","blendTerrainAlbedo","s","textureArraySampleGrad","detailNormal","blendTerrainDetailNormal","blendTerrainRoughness","heightLod","offset","exp2","hL","hR","hU","hD","sampleDist","dHdU","dHdV","t","normalize","n","cross","normal","mat3","packed","srgb","mix","pow","onDispose"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * A queue of items each queued at most once until the queue is taken, without hashing.
3
+ *
4
+ * @remarks
5
+ * Each item keeps a stamp: the generation of the queue it is waiting in. Queuing an item whose
6
+ * stamp equals the generation of this queue does nothing. Taking the items starts a new
7
+ * generation, so items may queue themselves again while the taken ones are processed, for the
8
+ * next round.
9
+ *
10
+ * Generations come from one counter shared by all queues, so an item moving from the queue of
11
+ * one scene to that of another is never mistaken for already queued. Each kind of queue an item
12
+ * may be in at the same time must keep its stamp in its own field.
13
+ *
14
+ * @internal
15
+ */ class UpdateQueue {
16
+ /** Starts at 1, since stamps of items never queued are 0 */ static _nextGeneration = 1;
17
+ _generation;
18
+ _items;
19
+ _getStamp;
20
+ _setStamp;
21
+ /**
22
+ * @param getStamp - Reads the stamp of an item, undefined for an item never queued
23
+ * @param setStamp - Writes the stamp of an item
24
+ */ constructor(getStamp, setStamp){
25
+ this._generation = UpdateQueue._nextGeneration++;
26
+ this._items = [];
27
+ this._getStamp = getStamp;
28
+ this._setStamp = setStamp;
29
+ }
30
+ /** Number of items queued */ get size() {
31
+ return this._items.length;
32
+ }
33
+ /** Queue an item, unless it is queued already */ add(item) {
34
+ if (this._getStamp(item) !== this._generation) {
35
+ this._setStamp(item, this._generation);
36
+ this._items.push(item);
37
+ }
38
+ }
39
+ /**
40
+ * Take the queued items in the order they were queued, leaving the queue empty and ready to
41
+ * queue any item again
42
+ */ take() {
43
+ const items = this._items;
44
+ this._items = [];
45
+ this._generation = UpdateQueue._nextGeneration++;
46
+ return items;
47
+ }
48
+ /** Drop all queued items */ clear() {
49
+ this.take();
50
+ }
51
+ }
52
+
53
+ export { UpdateQueue };
54
+ //# sourceMappingURL=update_queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_queue.js","sources":["../../src/scene/update_queue.ts"],"sourcesContent":["/**\r\n * A queue of items each queued at most once until the queue is taken, without hashing.\r\n *\r\n * @remarks\r\n * Each item keeps a stamp: the generation of the queue it is waiting in. Queuing an item whose\r\n * stamp equals the generation of this queue does nothing. Taking the items starts a new\r\n * generation, so items may queue themselves again while the taken ones are processed, for the\r\n * next round.\r\n *\r\n * Generations come from one counter shared by all queues, so an item moving from the queue of\r\n * one scene to that of another is never mistaken for already queued. Each kind of queue an item\r\n * may be in at the same time must keep its stamp in its own field.\r\n *\r\n * @internal\r\n */\r\nexport class UpdateQueue<T> {\r\n /** Starts at 1, since stamps of items never queued are 0 */\r\n private static _nextGeneration = 1;\r\n private _generation: number;\r\n private _items: T[];\r\n private readonly _getStamp: (item: T) => number | undefined;\r\n private readonly _setStamp: (item: T, stamp: number) => void;\r\n /**\r\n * @param getStamp - Reads the stamp of an item, undefined for an item never queued\r\n * @param setStamp - Writes the stamp of an item\r\n */\r\n constructor(getStamp: (item: T) => number | undefined, setStamp: (item: T, stamp: number) => void) {\r\n this._generation = UpdateQueue._nextGeneration++;\r\n this._items = [];\r\n this._getStamp = getStamp;\r\n this._setStamp = setStamp;\r\n }\r\n /** Number of items queued */\r\n get size() {\r\n return this._items.length;\r\n }\r\n /** Queue an item, unless it is queued already */\r\n add(item: T) {\r\n if (this._getStamp(item) !== this._generation) {\r\n this._setStamp(item, this._generation);\r\n this._items.push(item);\r\n }\r\n }\r\n /**\r\n * Take the queued items in the order they were queued, leaving the queue empty and ready to\r\n * queue any item again\r\n */\r\n take() {\r\n const items = this._items;\r\n this._items = [];\r\n this._generation = UpdateQueue._nextGeneration++;\r\n return items;\r\n }\r\n /** Drop all queued items */\r\n clear() {\r\n this.take();\r\n }\r\n}\r\n"],"names":["UpdateQueue","_nextGeneration","_generation","_items","_getStamp","_setStamp","getStamp","setStamp","size","length","add","item","push","take","items","clear"],"mappings":"AAAA;;;;;;;;;;;;;;AAcC,IACM,MAAMA,WAAAA,CAAAA;iEAEX,OAAeC,eAAAA,GAAkB,CAAE;IAC3BC,WAAoB;IACpBC,MAAY;IACHC,SAA2C;IAC3CC,SAA4C;AAC7D;;;AAGC,MACD,WAAYC,CAAAA,QAAyC,EAAEC,QAA0C,CAAE;AACjG,QAAA,IAAI,CAACL,WAAW,GAAGF,WAAAA,CAAYC,eAAe,EAAA;QAC9C,IAAI,CAACE,MAAM,GAAG,EAAE;QAChB,IAAI,CAACC,SAAS,GAAGE,QAAAA;QACjB,IAAI,CAACD,SAAS,GAAGE,QAAAA;AACnB;kCAEA,IAAIC,IAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAACL,MAAM,CAACM,MAAM;AAC3B;sDAEAC,GAAIC,CAAAA,IAAO,EAAE;QACX,IAAI,IAAI,CAACP,SAAS,CAACO,UAAU,IAAI,CAACT,WAAW,EAAE;AAC7C,YAAA,IAAI,CAACG,SAAS,CAACM,IAAM,EAAA,IAAI,CAACT,WAAW,CAAA;AACrC,YAAA,IAAI,CAACC,MAAM,CAACS,IAAI,CAACD,IAAAA,CAAAA;AACnB;AACF;AACA;;;AAGC,MACDE,IAAO,GAAA;QACL,MAAMC,KAAAA,GAAQ,IAAI,CAACX,MAAM;QACzB,IAAI,CAACA,MAAM,GAAG,EAAE;AAChB,QAAA,IAAI,CAACD,WAAW,GAAGF,WAAAA,CAAYC,eAAe,EAAA;QAC9C,OAAOa,KAAAA;AACT;AACA,iCACAC,KAAQ,GAAA;AACN,QAAA,IAAI,CAACF,IAAI,EAAA;AACX;AACF;;;;"}