@zephyr3d/scene 0.9.26 → 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 (506) 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 +146 -30
  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 +300 -56
  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 +177 -3
  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 +178 -200
  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 +30475 -19865
  109. package/dist/index.js +67 -12
  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/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdf.js","sources":["../../src/shaders/sdf.ts"],"sourcesContent":["import type { PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** Uniform names of the global field, see {@link declareGlobalSDFUniforms}. */\r\nexport const GLOBAL_SDF_TEXTURE = 'zGlobalSDFTex';\r\nexport const GLOBAL_SDF_LEVELS = 'zGlobalSDFLevels';\r\nexport const GLOBAL_SDF_PARAMS = 'zGlobalSDFParams';\r\nexport const GLOBAL_SDF_TAGS = 'zGlobalSDFTags';\r\n/** Voxels along a brick edge of the global field, the unit it is composited and tagged in. */\r\nexport const GLOBAL_SDF_BRICK = 8;\r\n/** Uniform names of the dynamic instances, see {@link declareDynamicSDFUniforms}. */\r\nexport const SDF_ATLAS_TEXTURE = 'zSDFAtlasTex';\r\nexport const SDF_DYNAMIC_INSTANCES = 'zSDFDynamic';\r\nexport const SDF_DYNAMIC_INFO = 'zSDFDynamicInfo';\r\n/** Most dynamic instances a shader merges into the field. */\r\nexport const MAX_DYNAMIC_SDF_INSTANCES = 16;\r\n/**\r\n * vec4s per packed instance: world-to-local rows (3), (field box min, voxel size),\r\n * (field box max, world scale), (atlas slot offset, thin). `thin` = half thickness in world\r\n * units of a two-sided field's surface, -1 for one-sided; see `expand` of {@link sampleInstancesSDF}.\r\n */\r\nexport const SDF_INSTANCE_VEC4S = 6;\r\n\r\n/**\r\n * Declares the uniforms {@link sampleGlobalSDF} reads.\r\n *\r\n * - texture: levels stacked along z, `resolution + 1` slices each (last repeats the first),\r\n * in {@link globalSDFFormat}; see {@link isGlobalSDFFilterable}.\r\n * - tags: rgba32f, one texel per brick, stacked the same way: (world brick x, y, z, 1) of the\r\n * brick last composited there.\r\n * - levels[i]: (window origin in voxels, voxel size).\r\n * - params: (resolution, number of levels, band in voxels, current mask); bit i set when\r\n * every brick of level i is current (tags need not be read).\r\n *\r\n * @param levels - Clipmap levels; a compile-time constant of the program.\r\n * @internal\r\n */\r\nexport function declareGlobalSDFUniforms(scope: PBGlobalScope, group: number, levels: number) {\r\n const pb = scope.$builder;\r\n scope[GLOBAL_SDF_TEXTURE] = isGlobalSDFFilterable()\r\n ? pb.tex3D().uniform(group)\r\n : pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[GLOBAL_SDF_TAGS] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[GLOBAL_SDF_LEVELS] = pb.vec4[levels]().uniform(group);\r\n scope[GLOBAL_SDF_PARAMS] = pb.vec4().uniform(group);\r\n}\r\n\r\n/**\r\n * Texel format of the global field: r16f where compute-writable (WebGPU texture-formats-tier1),\r\n * else r32f. Half precision suffices since only distances within the band are stored.\r\n * @internal\r\n */\r\nexport function globalSDFFormat(): 'r16f' | 'r32f' {\r\n return getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo('r16f')?.writable ? 'r16f' : 'r32f';\r\n}\r\n\r\n/**\r\n * True when the device filters the global field's format (r16f always, r32f with\r\n * float32-filterable); otherwise trilinear is done by hand from eight loads.\r\n * @internal\r\n */\r\nexport function isGlobalSDFFilterable() {\r\n return !!getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo(globalSDFFormat())?.filterable;\r\n}\r\n\r\n/**\r\n * Declares the uniforms {@link sampleDynamicSDF} reads: the mesh field atlas,\r\n * up to {@link MAX_DYNAMIC_SDF_INSTANCES} packed instances and\r\n * (instance count, 1 / atlas size).\r\n * @internal\r\n */\r\nexport function declareDynamicSDFUniforms(scope: PBGlobalScope, group: number) {\r\n const pb = scope.$builder;\r\n scope[SDF_ATLAS_TEXTURE] = pb.tex3D().uniform(group);\r\n scope[SDF_DYNAMIC_INSTANCES] = pb.vec4[MAX_DYNAMIC_SDF_INSTANCES * SDF_INSTANCE_VEC4S]().uniform(group);\r\n scope[SDF_DYNAMIC_INFO] = pb.vec4().uniform(group);\r\n}\r\n\r\n/**\r\n * Distance in local units from a local position to one packed instance's field: trilinear\r\n * atlas lookup inside the box, border value plus box distance outside. `bmin` is (box min,\r\n * voxel size), `bmax` (box max, world scale), `slot` the atlas slot offset.\r\n * @internal\r\n */\r\nexport function sampleInstanceField(\r\n scope: PBInsideFunctionScope,\r\n lp: PBShaderExp,\r\n bmin: PBShaderExp,\r\n bmax: PBShaderExp,\r\n slot: PBShaderExp,\r\n atlas: PBShaderExp,\r\n atlasInvSize: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = `Z_sampleInstanceField_${atlas.$str}`;\r\n pb.func(\r\n funcName,\r\n [pb.vec3('lp'), pb.vec4('bmin'), pb.vec4('bmax'), pb.vec4('slot'), pb.vec3('invSize')],\r\n function () {\r\n this.$l.c = pb.clamp(this.lp, this.bmin.xyz, this.bmax.xyz);\r\n this.$l.outside = pb.length(pb.sub(this.lp, this.c));\r\n this.$l.res = pb.div(pb.sub(this.bmax.xyz, this.bmin.xyz), this.bmin.w);\r\n // Clamped to the outer sample centres, so the filter never reads a neighbour's slot\r\n this.$l.f = pb.clamp(\r\n pb.div(pb.sub(this.c, this.bmin.xyz), this.bmin.w),\r\n pb.vec3(0.5),\r\n pb.sub(this.res, pb.vec3(0.5))\r\n );\r\n this.$l.uvw = pb.mul(pb.add(this.slot.xyz, this.f), this.invSize);\r\n this.$return(pb.add(pb.textureSampleLevel(atlas, this.uvw, 0).r, this.outside));\r\n }\r\n );\r\n return scope[funcName](lp, bmin, bmax, slot, atlasInvSize) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Signed distance from a world position to the nearest of a set of packed instances\r\n * (layout at {@link SDF_INSTANCE_VEC4S}), or `maxDist` when none is nearer. `baseOf(k)` gives\r\n * the first vec4 of the k-th instance, `instance(i)` reads vec4 `i`. If `bestIndex` names an\r\n * int variable, the nearest k is written to it.\r\n *\r\n * `expand` (world units) is the minimum half thickness given to two-sided surfaces so coarser\r\n * grids don't step over them: half the voxel size of the grid being written, 0 for point samples.\r\n * @internal\r\n */\r\nexport function sampleInstancesSDF(\r\n scope: PBInsideFunctionScope,\r\n p: PBShaderExp,\r\n count: PBShaderExp,\r\n maxDist: PBShaderExp,\r\n baseOf: (scope: PBInsideFunctionScope, k: PBShaderExp) => PBShaderExp,\r\n instance: (scope: PBInsideFunctionScope, index: PBShaderExp) => PBShaderExp,\r\n atlas: PBShaderExp,\r\n atlasInvSize: PBShaderExp,\r\n expand: PBShaderExp,\r\n bestIndex?: string\r\n) {\r\n const pb = scope.$builder;\r\n scope.$l.sdfBest = maxDist;\r\n scope.$l.sdfP4 = pb.vec4(p, 1);\r\n scope.$l.sdfExpand = expand;\r\n scope.$for(pb.uint('sdfK'), 0, count, function () {\r\n this.$l.base = baseOf(this, this.sdfK);\r\n this.$l.r0 = instance(this, this.base);\r\n this.$l.r1 = instance(this, pb.add(this.base, 1));\r\n this.$l.r2 = instance(this, pb.add(this.base, 2));\r\n this.$l.bmin = instance(this, pb.add(this.base, 3));\r\n this.$l.bmax = instance(this, pb.add(this.base, 4));\r\n this.$l.slot = instance(this, pb.add(this.base, 5));\r\n this.$l.lp = pb.vec3(\r\n pb.dot(this.r0, this.sdfP4),\r\n pb.dot(this.r1, this.sdfP4),\r\n pb.dot(this.r2, this.sdfP4)\r\n );\r\n this.$l.c = pb.clamp(this.lp, this.bmin.xyz, this.bmax.xyz);\r\n // World length of a unit along each local axis\r\n this.$l.axisScale = pb.div(\r\n pb.vec3(1),\r\n pb.vec3(pb.length(this.r0.xyz), pb.length(this.r1.xyz), pb.length(this.r2.xyz))\r\n );\r\n // World distance to the field box, exact under non-uniform scale; only the\r\n // field's own value takes the smallest axis scale\r\n this.$l.outside = pb.length(pb.mul(pb.sub(this.lp, this.c), this.axisScale));\r\n // How far a two-sided surface is pushed out to reach the half thickness asked for\r\n this.$l.grow = this.$choice(\r\n pb.greaterThanEqual(this.slot.w, 0),\r\n pb.max(pb.sub(this.sdfExpand, this.slot.w), 0),\r\n pb.float(0)\r\n );\r\n // A field box farther than the current best cannot improve it\r\n this.$if(pb.lessThan(pb.sub(this.outside, this.grow), this.sdfBest), function () {\r\n this.$l.cand = pb.sub(\r\n pb.add(\r\n pb.mul(\r\n sampleInstanceField(this, this.c, this.bmin, this.bmax, this.slot, atlas, atlasInvSize),\r\n this.bmax.w\r\n ),\r\n this.outside\r\n ),\r\n this.grow\r\n );\r\n this.$if(pb.lessThan(this.cand, this.sdfBest), function () {\r\n this.sdfBest = this.cand;\r\n if (bestIndex) {\r\n this[bestIndex] = pb.int(this.sdfK);\r\n }\r\n });\r\n });\r\n });\r\n return scope.sdfBest as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Signed distance to the dynamic instances at their current transforms, or `maxDist`.\r\n * @internal\r\n */\r\nexport function sampleDynamicSDF(scope: PBInsideFunctionScope, worldPos: PBShaderExp, maxDist: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sampleDynamicSDF';\r\n pb.func(funcName, [pb.vec3('p'), pb.float('maxDist')], function () {\r\n this.$return(\r\n sampleInstancesSDF(\r\n this,\r\n this.p,\r\n pb.uint(this[SDF_DYNAMIC_INFO].x),\r\n this.maxDist,\r\n (s, k) => pb.mul(k, SDF_INSTANCE_VEC4S),\r\n (s, i) => s[SDF_DYNAMIC_INSTANCES].at(i),\r\n this[SDF_ATLAS_TEXTURE],\r\n this[SDF_DYNAMIC_INFO].yzw,\r\n pb.float(0)\r\n )\r\n );\r\n });\r\n return scope[funcName](worldPos, maxDist) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Signed distance to the whole scene field: global clipmap merged with dynamic instances.\r\n * Needs {@link declareGlobalSDFUniforms} and {@link declareDynamicSDFUniforms}.\r\n * @internal\r\n */\r\nexport function sampleSceneSDF(scope: PBInsideFunctionScope, worldPos: PBShaderExp, levels: number) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sampleSceneSDF';\r\n pb.func(funcName, [pb.vec3('p')], function () {\r\n this.$l.g = sampleGlobalSDF(this, this.p, levels);\r\n this.$return(sampleDynamicSDF(this, this.p, this.g));\r\n });\r\n return scope[funcName](worldPos) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * {@link sampleSceneSDF} returning (distance, voxel size); voxel size 0 where a dynamic\r\n * instance is nearer.\r\n * @internal\r\n */\r\nexport function sampleSceneSDFWithVoxel(scope: PBInsideFunctionScope, worldPos: PBShaderExp, levels: number) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sampleSceneSDFWithVoxel';\r\n pb.func(funcName, [pb.vec3('p')], function () {\r\n this.$l.g = sampleGlobalSDFWithVoxel(this, this.p, levels);\r\n this.$l.d = sampleDynamicSDF(this, this.p, this.g.x);\r\n this.$return(pb.vec2(this.d, this.$choice(pb.lessThan(this.d, this.g.x), pb.float(0), this.g.y)));\r\n });\r\n return scope[funcName](worldPos) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Surface expand scale in bricks holding two-sided meshes (1 elsewhere)\r\n * @internal\r\n */\r\nexport const SDF_NOT_COVERED_EXPAND_SCALE = 0.6;\r\n\r\n/**\r\n * Tag alpha of a brick holding two-sided meshes (1 otherwise); see\r\n * {@link SDF_NOT_COVERED_EXPAND_SCALE}.\r\n * @internal\r\n */\r\nexport const GLOBAL_SDF_TAG_NOT_COVERED = 2;\r\n\r\n/**\r\n * False where the global field brick holding a position (finest level) was composited with\r\n * two-sided meshes; true otherwise, including outside every window or for stale bricks.\r\n * @internal\r\n */\r\nexport function globalSDFCovered(scope: PBInsideFunctionScope, worldPos: PBShaderExp, levels: number) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_globalSDFCovered';\r\n pb.func(funcName, [pb.vec3('p')], function () {\r\n this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);\r\n this.$l.nbi = pb.ivec3(pb.div(this.res, GLOBAL_SDF_BRICK));\r\n for (let i = 0; i < levels; i++) {\r\n this.$l[`cvInfo${i}`] = this[GLOBAL_SDF_LEVELS].at(i);\r\n this.$l[`cvV${i}`] = pb.ivec3(pb.floor(pb.div(this.p, this[`cvInfo${i}`].w)));\r\n this.$l[`cvO${i}`] = pb.ivec3(this[`cvInfo${i}`].xyz);\r\n this.$if(\r\n pb.and(\r\n pb.all(pb.greaterThanEqual(this[`cvV${i}`], this[`cvO${i}`])),\r\n pb.all(pb.lessThan(this[`cvV${i}`], pb.add(this[`cvO${i}`], pb.ivec3(this.res))))\r\n ),\r\n function () {\r\n this.$l.b = pb.ivec3(pb.floor(pb.div(pb.vec3(this[`cvV${i}`]), GLOBAL_SDF_BRICK)));\r\n this.$l.w = wrap(this, this.b, this.nbi);\r\n this.$l.tag = pb.textureLoad(\r\n this[GLOBAL_SDF_TAGS],\r\n pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, i))),\r\n 0\r\n );\r\n this.$return(\r\n pb.not(\r\n pb.and(\r\n pb.greaterThan(this.tag.w, GLOBAL_SDF_TAG_NOT_COVERED - 0.5),\r\n pb.equal(pb.ivec3(this.tag.xyz), this.b)\r\n )\r\n )\r\n );\r\n }\r\n );\r\n }\r\n this.$return(true);\r\n });\r\n return scope[funcName](worldPos) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Lumen surface expand (GlobalDistanceFieldUtils.ush) for a {@link sampleSceneSDFWithVoxel}\r\n * sample at `p`, `t` along a trace: one voxel of the level read ({@link SDF_NOT_COVERED_EXPAND_SCALE}\r\n * in two-sided bricks), ramping from 0 over the first two voxels. Zero for dynamic instances.\r\n * @internal\r\n */\r\nexport function sdfSurfaceExpand(\r\n scope: PBInsideFunctionScope,\r\n p: PBShaderExp,\r\n sample: PBShaderExp,\r\n t: PBShaderExp,\r\n levels: number\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sdfSurfaceExpand';\r\n pb.func(funcName, [pb.vec3('p'), pb.vec2('s'), pb.float('t')], function () {\r\n this.$l.e = pb.mul(this.s.y, pb.clamp(pb.div(this.t, pb.max(pb.mul(this.s.y, 2), 1e-6)), 0, 1));\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(this.s.x, this.e),\r\n pb.greaterThanEqual(this.s.x, pb.mul(this.e, SDF_NOT_COVERED_EXPAND_SCALE))\r\n ),\r\n function () {\r\n this.$if(pb.not(globalSDFCovered(this, this.p, levels)), function () {\r\n this.e = pb.mul(this.e, SDF_NOT_COVERED_EXPAND_SCALE);\r\n });\r\n }\r\n );\r\n this.$return(this.e);\r\n });\r\n return scope[funcName](p, sample, t) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Voxels over which a global field level blends into the next coarser one near its window\r\n * edge; wider than a brick (the window move step) so the hand-over never jumps.\r\n * @internal\r\n */\r\nexport const SDF_LEVEL_BLEND_VOXELS = 16;\r\n\r\n/**\r\n * Signed distance (world units, negative inside) from the global clipmap field.\r\n *\r\n * The finest level holding the point within its band answers, blending into the next coarser\r\n * level near window edges and band edges. Past all windows or with every level saturated, the\r\n * coarsest value is returned as a lower bound, keeping sphere tracing safe. Windows are toroidal;\r\n * non-filterable formats use manual trilinear. A level answers only where all bricks under the\r\n * filter are tagged current, so stale bricks after a window move are ignored.\r\n * @internal\r\n */\r\nexport function sampleGlobalSDF(scope: PBInsideFunctionScope, worldPos: PBShaderExp, levels: number) {\r\n return sampleGlobalSDFWithVoxel(scope, worldPos, levels).x as PBShaderExp;\r\n}\r\n\r\n/**\r\n * First level worth reading after a sphere-trace step read `prevDist`; finer levels saturate.\r\n * @internal\r\n */\r\nfunction sdfStartLevel(scope: PBInsideFunctionScope, prevDist: PBShaderExp, levels: number) {\r\n const pb = scope.$builder;\r\n let start: PBShaderExp = pb.int(0);\r\n for (let i = 0; i < levels - 1; i++) {\r\n start = pb.add(\r\n start,\r\n pb.int(\r\n pb.greaterThanEqual(\r\n prevDist,\r\n pb.mul(scope[GLOBAL_SDF_PARAMS].z, scope[GLOBAL_SDF_LEVELS].at(i).w, 0.95)\r\n )\r\n )\r\n );\r\n }\r\n return start;\r\n}\r\n\r\n/**\r\n * {@link sampleGlobalSDFWithVoxel} for sphere tracing: starts at the level `prevDist` needs,\r\n * rereading from the finest level near a surface. Levels finer than `minLevel` are never .\r\n * @internal\r\n */\r\nexport function sampleGlobalSDFHinted(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n prevDist: PBShaderExp,\r\n levels: number,\r\n minLevel?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sampleGlobalSDFHinted';\r\n pb.func(funcName, [pb.vec3('p'), pb.float('prevDist'), pb.int('minLevel')], function () {\r\n this.$l.start = pb.max(sdfStartLevel(this, this.prevDist, levels), this.minLevel);\r\n this.$l.g = sampleGlobalSDFWithVoxel(this, this.p, levels, this.start);\r\n this.$if(pb.greaterThan(this.start, this.minLevel), function () {\r\n this.$if(\r\n pb.lessThan(\r\n this.g.x,\r\n pb.mul(this[GLOBAL_SDF_PARAMS].z, this[GLOBAL_SDF_LEVELS].at(pb.sub(this.start, 1)).w)\r\n ),\r\n function () {\r\n this.g = sampleGlobalSDFWithVoxel(this, this.p, levels, this.minLevel);\r\n }\r\n );\r\n });\r\n this.$return(this.g);\r\n });\r\n return scope[funcName](worldPos, prevDist, minLevel ?? pb.int(0)) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * {@link sampleSceneSDFWithVoxel} for sphere tracing, using {@link sampleGlobalSDFHinted}.\r\n * @internal\r\n */\r\nexport function sampleSceneSDFHinted(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n prevDist: PBShaderExp,\r\n levels: number,\r\n minLevel?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sampleSceneSDFHinted';\r\n pb.func(funcName, [pb.vec3('p'), pb.float('prevDist'), pb.int('minLevel')], function () {\r\n this.$l.g = sampleGlobalSDFHinted(this, this.p, this.prevDist, levels, this.minLevel);\r\n this.$l.d = sampleDynamicSDF(this, this.p, this.g.x);\r\n this.$return(pb.vec2(this.d, this.$choice(pb.lessThan(this.d, this.g.x), pb.float(0), this.g.y)));\r\n });\r\n return scope[funcName](worldPos, prevDist, minLevel ?? pb.int(0)) as PBShaderExp;\r\n}\r\n\r\n/** Steps {@link sdfRefineHit} takes past a hit on the swollen surface. @internal */\r\nexport const SDF_REFINE_STEPS = 8;\r\n\r\n/**\r\n * Refines a sphere-trace hit on the surface swollen by {@link sdfSurfaceExpand} to the field's\r\n * own surface: steps on from `t` (distance `d`, answering `voxel` size, 0 for dynamic) to the zero\r\n * crossing or minimum, at most {@link SDF_REFINE_STEPS} steps of at least 1/8 voxel. Needed because\r\n * the swollen surface lies up to a voxel short, notably in concave corners.\r\n * @internal\r\n */\r\nexport function sdfRefineHit(\r\n scope: PBInsideFunctionScope,\r\n origin: PBShaderExp,\r\n dir: PBShaderExp,\r\n t: PBShaderExp,\r\n d: PBShaderExp,\r\n voxel: PBShaderExp,\r\n minLevel: PBShaderExp,\r\n levels: number\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sdfRefineHit';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('o'), pb.vec3('dir'), pb.float('t'), pb.float('d'), pb.float('voxel'), pb.int('minLevel')],\r\n function () {\r\n // Stopped inside: back out by as much\r\n this.$if(pb.lessThanEqual(this.d, 0), function () {\r\n this.$return(pb.max(pb.add(this.t, this.d), 0));\r\n });\r\n this.$l.rt = this.t;\r\n this.$l.rd = this.d;\r\n this.$l.rStep = pb.mul(pb.max(this.voxel, this[GLOBAL_SDF_LEVELS].at(0).w), 0.125);\r\n this.$for(pb.int('r'), 0, SDF_REFINE_STEPS, function () {\r\n this.$l.nt = pb.add(this.rt, pb.max(this.rd, this.rStep));\r\n this.$l.nd = sampleSceneSDFHinted(\r\n this,\r\n pb.add(this.o, pb.mul(this.dir, this.nt)),\r\n this.rd,\r\n levels,\r\n this.minLevel\r\n ).x;\r\n this.$if(pb.lessThanEqual(this.nd, 0), function () {\r\n this.$return(\r\n pb.add(this.rt, pb.mul(pb.sub(this.nt, this.rt), pb.div(this.rd, pb.sub(this.rd, this.nd))))\r\n );\r\n });\r\n this.$if(pb.greaterThanEqual(this.nd, this.rd), function () {\r\n this.$break();\r\n });\r\n this.rt = this.nt;\r\n this.rd = this.nd;\r\n });\r\n this.$return(this.rt);\r\n }\r\n );\r\n return scope[funcName](origin, dir, t, d, voxel, minLevel) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * {@link sampleGlobalSDF} returning (distance, voxel size) in world units; levels finer than\r\n * `minLevel` are skipped.\r\n * @internal\r\n */\r\nexport function sampleGlobalSDFWithVoxel(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n levels: number,\r\n minLevel?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const filterable = isGlobalSDFFilterable();\r\n const funcName = 'Z_sampleGlobalSDFWithVoxel';\r\n pb.func(funcName, [pb.vec3('p'), pb.int('minLevel')], function () {\r\n this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);\r\n this.$l.resF = this[GLOBAL_SDF_PARAMS].x;\r\n this.$l.band = this[GLOBAL_SDF_PARAMS].z;\r\n // Weighted sums of the levels read, and the weight still left to coarser levels\r\n this.$l.sum = pb.float(0);\r\n this.$l.sumVoxel = pb.float(0);\r\n this.$l.remaining = pb.float(1);\r\n // The coarsest value read: a bound when every level read was saturated\r\n this.$l.last = pb.mul(this.band, this[GLOBAL_SDF_LEVELS].at(levels - 1).w);\r\n this.$l.lastVoxel = this[GLOBAL_SDF_LEVELS].at(levels - 1).w;\r\n this.$l.valid = false;\r\n this.$l.base = pb.vec3(0);\r\n this.$l.t = pb.vec3(0);\r\n this.$l.v0 = pb.ivec3(0);\r\n for (let i = 0; i < levels; i++) {\r\n // Finest first, each level taking the share its finer levels left\r\n const wanted =\r\n i === levels - 1\r\n ? pb.greaterThan(this.remaining, 1e-4)\r\n : pb.and(pb.greaterThan(this.remaining, 1e-4), pb.lessThanEqual(this.minLevel, i));\r\n this.$if(wanted, function () {\r\n this.$l.info = this[GLOBAL_SDF_LEVELS].at(i);\r\n // Position in voxels of the window, sample centres at integers\r\n this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));\r\n this.$l.inside = pb.and(\r\n pb.all(pb.greaterThanEqual(this.f, pb.vec3(0))),\r\n pb.all(pb.lessThanEqual(this.f, pb.vec3(pb.sub(this.resF, 1))))\r\n );\r\n this.valid = false;\r\n this.$if(this.inside, function () {\r\n this.$if(levelCurrent(this, i), function () {\r\n this.valid = true;\r\n }).$else(function () {\r\n // World voxel index of the filter's lower corner\r\n this.valid = bricksCurrent(this, pb.add(pb.ivec3(pb.floor(this.f)), pb.ivec3(this.info.xyz)), i);\r\n });\r\n });\r\n this.$if(this.valid, function () {\r\n if (filterable) {\r\n // World voxel position, sample centres at integers, wrapped into the window\r\n this.$l.vw = pb.add(this.f, this.info.xyz);\r\n this.vw = pb.sub(this.vw, pb.mul(pb.floor(pb.div(this.vw, this.resF)), this.resF));\r\n this.$l.depth = pb.add(this.resF, 1);\r\n this.$l.d = pb.textureSampleLevel(\r\n this[GLOBAL_SDF_TEXTURE],\r\n pb.vec3(\r\n pb.div(pb.add(this.vw.xy, pb.vec2(0.5)), this.resF),\r\n pb.div(pb.add(this.vw.z, pb.add(pb.mul(this.depth, i), 0.5)), pb.mul(this.depth, levels))\r\n ),\r\n 0\r\n ).r;\r\n } else {\r\n this.base = pb.floor(this.f);\r\n this.t = pb.sub(this.f, this.base);\r\n // World voxel index of the lower corner, then toroidal texel\r\n this.v0 = pb.add(pb.ivec3(this.base), pb.ivec3(this.info.xyz));\r\n this.$l.c000 = loadWrapped(this, this.v0, 0, 0, 0, i);\r\n this.$l.c100 = loadWrapped(this, this.v0, 1, 0, 0, i);\r\n this.$l.c010 = loadWrapped(this, this.v0, 0, 1, 0, i);\r\n this.$l.c110 = loadWrapped(this, this.v0, 1, 1, 0, i);\r\n this.$l.c001 = loadWrapped(this, this.v0, 0, 0, 1, i);\r\n this.$l.c101 = loadWrapped(this, this.v0, 1, 0, 1, i);\r\n this.$l.c011 = loadWrapped(this, this.v0, 0, 1, 1, i);\r\n this.$l.c111 = loadWrapped(this, this.v0, 1, 1, 1, i);\r\n this.$l.d = pb.mix(\r\n pb.mix(\r\n pb.mix(this.c000, this.c100, this.t.x),\r\n pb.mix(this.c010, this.c110, this.t.x),\r\n this.t.y\r\n ),\r\n pb.mix(\r\n pb.mix(this.c001, this.c101, this.t.x),\r\n pb.mix(this.c011, this.c111, this.t.x),\r\n this.t.y\r\n ),\r\n this.t.z\r\n );\r\n }\r\n this.last = this.d;\r\n this.lastVoxel = this.info.w;\r\n if (i === levels - 1) {\r\n this.$l.w = pb.float(1);\r\n } else {\r\n // Hand over near the window edge and near the band edge (beyond which values are lower bounds)\r\n this.$l.lo = pb.min(pb.min(this.f.x, this.f.y), this.f.z);\r\n this.$l.hi = pb.sub(pb.sub(this.resF, 1), pb.max(pb.max(this.f.x, this.f.y), this.f.z));\r\n this.$l.edge = pb.min(this.lo, this.hi);\r\n this.$l.bandW = pb.mul(this.band, this.info.w);\r\n this.$l.w = pb.mul(\r\n pb.smoothStep(1, 1 + SDF_LEVEL_BLEND_VOXELS, this.edge),\r\n pb.sub(1, pb.smoothStep(pb.mul(this.bandW, 0.75), pb.mul(this.bandW, 0.95), pb.abs(this.d)))\r\n );\r\n }\r\n this.$l.share = pb.mul(this.remaining, this.w);\r\n this.sum = pb.add(this.sum, pb.mul(this.share, this.d));\r\n this.sumVoxel = pb.add(this.sumVoxel, pb.mul(this.share, this.info.w));\r\n this.remaining = pb.sub(this.remaining, this.share);\r\n });\r\n });\r\n }\r\n // What no level answered for: past the coarsest window, or every level saturated\r\n this.$l.result = pb.add(this.sum, pb.mul(this.remaining, this.last));\r\n this.$l.resultVoxel = pb.add(this.sumVoxel, pb.mul(this.remaining, this.lastVoxel));\r\n this.$return(pb.vec2(this.result, this.resultVoxel));\r\n });\r\n return scope[funcName](worldPos, minLevel ?? pb.int(0)) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Signed distance from one global clipmap level chosen at run time, with no blending or brick\r\n * currency check.\r\n * @internal\r\n */\r\nexport function sampleGlobalSDFLevel(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n level: PBShaderExp,\r\n levels: number\r\n) {\r\n const pb = scope.$builder;\r\n const filterable = isGlobalSDFFilterable();\r\n const funcName = 'Z_sampleGlobalSDFLevel';\r\n pb.func(funcName, [pb.vec3('p'), pb.int('level')], function () {\r\n this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);\r\n this.$l.resF = this[GLOBAL_SDF_PARAMS].x;\r\n this.$l.info = this[GLOBAL_SDF_LEVELS].at(this.level);\r\n // Position in voxels of the window, sample centres at integers\r\n this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));\r\n // Slice of the level's first z, `resolution + 1` slices a level\r\n this.$l.z0 = pb.mul(pb.add(this.res, 1), this.level);\r\n if (filterable) {\r\n this.$l.vw = pb.add(this.f, this.info.xyz);\r\n this.vw = pb.sub(this.vw, pb.mul(pb.floor(pb.div(this.vw, this.resF)), this.resF));\r\n this.$l.depth = pb.add(this.resF, 1);\r\n this.$return(\r\n pb.textureSampleLevel(\r\n this[GLOBAL_SDF_TEXTURE],\r\n pb.vec3(\r\n pb.div(pb.add(this.vw.xy, pb.vec2(0.5)), this.resF),\r\n pb.div(pb.add(this.vw.z, pb.add(pb.float(this.z0), 0.5)), pb.mul(this.depth, levels))\r\n ),\r\n 0\r\n ).r\r\n );\r\n } else {\r\n this.$l.base = pb.floor(this.f);\r\n this.$l.t = pb.sub(this.f, this.base);\r\n this.$l.v0 = pb.add(pb.ivec3(this.base), pb.ivec3(this.info.xyz));\r\n const load = (dx: number, dy: number, dz: number) => {\r\n const v = pb.add(this.v0, pb.ivec3(dx, dy, dz));\r\n const w = wrap(this, v, pb.ivec3(this.res));\r\n return pb.textureLoad(this[GLOBAL_SDF_TEXTURE], pb.ivec3(w.x, w.y, pb.add(w.z, this.z0)), 0).r;\r\n };\r\n this.$return(\r\n pb.mix(\r\n pb.mix(\r\n pb.mix(load(0, 0, 0), load(1, 0, 0), this.t.x),\r\n pb.mix(load(0, 1, 0), load(1, 1, 0), this.t.x),\r\n this.t.y\r\n ),\r\n pb.mix(\r\n pb.mix(load(0, 0, 1), load(1, 0, 1), this.t.x),\r\n pb.mix(load(0, 1, 1), load(1, 1, 1), this.t.x),\r\n this.t.y\r\n ),\r\n this.t.z\r\n )\r\n );\r\n }\r\n });\r\n return scope[funcName](worldPos, level) as PBShaderExp;\r\n}\r\n\r\n/** ((v % n) + n) % n, the remainder of a negative index being negative */\r\nfunction wrap(scope: PBInsideFunctionScope, v: PBShaderExp, n: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.mod(pb.add(pb.mod(v, n), n), n);\r\n}\r\n\r\n/**\r\n * True when the brick of a level holding world voxel `v` is tagged with its own\r\n * world brick coordinates, i.e. composited for the current window.\r\n * @internal\r\n */\r\nexport function globalSDFVoxelCurrent(scope: PBInsideFunctionScope, v: PBShaderExp, level: number) {\r\n const pb = scope.$builder;\r\n const funcName = `Z_globalSDFVoxelCurrent${level}`;\r\n pb.func(funcName, [pb.ivec3('v')], function () {\r\n this.$if(levelCurrent(this, level), function () {\r\n this.$return(true);\r\n });\r\n this.$l.nbi = pb.ivec3(pb.int(pb.div(this[GLOBAL_SDF_PARAMS].x, GLOBAL_SDF_BRICK)));\r\n this.$l.b = pb.ivec3(pb.floor(pb.div(pb.vec3(this.v), GLOBAL_SDF_BRICK)));\r\n this.$l.w = wrap(this, this.b, this.nbi);\r\n this.$l.tag = pb.textureLoad(\r\n this[GLOBAL_SDF_TAGS],\r\n pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, level))),\r\n 0\r\n );\r\n this.$return(pb.and(pb.greaterThan(this.tag.w, 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b)));\r\n });\r\n return scope[funcName](v) as PBShaderExp;\r\n}\r\n\r\n/** True when every brick of a level is current, by the mask in the params' w. */\r\nfunction levelCurrent(scope: PBInsideFunctionScope, level: number) {\r\n const pb = scope.$builder;\r\n return pb.notEqual(pb.compAnd(pb.uint(scope[GLOBAL_SDF_PARAMS].w), pb.uint(1 << level)), pb.uint(0));\r\n}\r\n\r\n/**\r\n * True when every brick covering voxels v0..v0+1 of a level is tagged current (one to eight bricks).\r\n */\r\nfunction bricksCurrent(scope: PBInsideFunctionScope, v0: PBShaderExp, level: number) {\r\n const pb = scope.$builder;\r\n const funcName = `Z_globalSDFBricksCurrent${level}`;\r\n pb.func(funcName, [pb.ivec3('v0')], function () {\r\n this.$l.nb = pb.div(this[GLOBAL_SDF_PARAMS].x, GLOBAL_SDF_BRICK);\r\n this.$l.nbi = pb.ivec3(pb.int(this.nb));\r\n // Floor division of possibly negative voxel indices\r\n this.$l.lo = pb.ivec3(pb.floor(pb.div(pb.vec3(this.v0), GLOBAL_SDF_BRICK)));\r\n this.$l.hi = pb.ivec3(pb.floor(pb.div(pb.vec3(pb.add(this.v0, pb.ivec3(1))), GLOBAL_SDF_BRICK)));\r\n this.$l.ok = true;\r\n for (let c = 0; c < 8; c++) {\r\n const bits = [c & 1, (c >> 1) & 1, (c >> 2) & 1];\r\n // A corner using the upper brick on an axis matters only where the footprint crosses into it\r\n const needs = ['x', 'y', 'z'].filter((_, a) => bits[a]).map((a) => pb.notEqual(this.lo[a], this.hi[a]));\r\n const body = function (this: PBInsideFunctionScope) {\r\n this.$l.b = pb.ivec3(\r\n bits[0] ? this.hi.x : this.lo.x,\r\n bits[1] ? this.hi.y : this.lo.y,\r\n bits[2] ? this.hi.z : this.lo.z\r\n );\r\n this.$l.w = wrap(this, this.b, this.nbi);\r\n this.$l.tag = pb.textureLoad(\r\n this[GLOBAL_SDF_TAGS],\r\n pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, level))),\r\n 0\r\n );\r\n this.ok = pb.and(\r\n this.ok,\r\n pb.and(pb.greaterThan(this.tag.w, 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b))\r\n );\r\n };\r\n if (needs.length === 0) {\r\n body.call(this);\r\n } else {\r\n this.$if(\r\n needs.reduce((x, y) => pb.and(x, y)),\r\n body\r\n );\r\n }\r\n }\r\n this.$return(this.ok);\r\n });\r\n return scope[funcName](v0) as PBShaderExp;\r\n}\r\n\r\nfunction loadWrapped(\r\n scope: PBInsideFunctionScope,\r\n v0: PBShaderExp,\r\n dx: number,\r\n dy: number,\r\n dz: number,\r\n level: number\r\n) {\r\n const pb = scope.$builder;\r\n const v = pb.add(v0, pb.ivec3(dx, dy, dz));\r\n // ((v % n) + n) % n, the remainder of a negative index being negative\r\n const t = pb.mod(pb.add(pb.mod(v, pb.ivec3(scope.res)), pb.ivec3(scope.res)), pb.ivec3(scope.res));\r\n return pb.textureLoad(\r\n scope[GLOBAL_SDF_TEXTURE],\r\n pb.ivec3(t.x, t.y, pb.add(t.z, pb.mul(pb.add(scope.res, 1), level))),\r\n 0\r\n ).r;\r\n}\r\n"],"names":["GLOBAL_SDF_TEXTURE","GLOBAL_SDF_LEVELS","GLOBAL_SDF_PARAMS","GLOBAL_SDF_TAGS","GLOBAL_SDF_BRICK","SDF_ATLAS_TEXTURE","SDF_DYNAMIC_INSTANCES","SDF_DYNAMIC_INFO","MAX_DYNAMIC_SDF_INSTANCES","SDF_INSTANCE_VEC4S","declareGlobalSDFUniforms","scope","group","levels","pb","$builder","isGlobalSDFFilterable","tex3D","uniform","sampleType","vec4","globalSDFFormat","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","writable","filterable","declareDynamicSDFUniforms","sampleInstanceField","lp","bmin","bmax","slot","atlas","atlasInvSize","funcName","$str","func","vec3","$l","c","clamp","xyz","outside","length","sub","res","div","w","f","uvw","mul","add","invSize","$return","textureSampleLevel","r","sampleInstancesSDF","p","count","maxDist","baseOf","instance","expand","bestIndex","sdfBest","sdfP4","sdfExpand","$for","uint","base","sdfK","r0","r1","r2","dot","axisScale","grow","$choice","greaterThanEqual","max","float","$if","lessThan","cand","int","sampleDynamicSDF","worldPos","x","s","k","i","at","yzw","sampleSceneSDF","g","sampleGlobalSDF","SDF_NOT_COVERED_EXPAND_SCALE","GLOBAL_SDF_TAG_NOT_COVERED","globalSDFCovered","nbi","ivec3","floor","and","all","b","wrap","tag","textureLoad","y","z","not","greaterThan","equal","sdfSurfaceExpand","sample","t","vec2","e","SDF_LEVEL_BLEND_VOXELS","sampleGlobalSDFWithVoxel","sdfStartLevel","prevDist","start","sampleGlobalSDFHinted","minLevel","sampleSceneSDFHinted","d","SDF_REFINE_STEPS","sdfRefineHit","origin","dir","voxel","lessThanEqual","rt","rd","rStep","nt","nd","o","$break","resF","band","sum","sumVoxel","remaining","last","lastVoxel","valid","v0","wanted","info","inside","levelCurrent","$else","bricksCurrent","vw","depth","xy","c000","loadWrapped","c100","c010","c110","c001","c101","c011","c111","mix","lo","min","hi","edge","bandW","smoothStep","abs","share","result","resultVoxel","sampleGlobalSDFLevel","level","z0","load","dx","dy","dz","v","n","mod","globalSDFVoxelCurrent","notEqual","compAnd","nb","ok","bits","needs","filter","_","a","map","body","call","reduce"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  import { hasDepthChannel } from '@zephyr3d/device';
2
2
  import { REVERSE_Z, DEPTH_FARTHEST } from '@zephyr3d/base';
3
- import { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_RECT, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values.js';
3
+ import { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values.js';
4
4
  import { encodeNormalizedFloatToRGBA, decode2HalfFromRGBA, decodeNormalizedFloatFromRGBA } from './misc.js';
5
5
  import { ShaderHelper } from '../material/shader/helper.js';
6
6
  import { smoothNoise3D } from './noise.js';
7
- import { getDevice } from '../app/api.js';
8
7
 
9
8
  /**
10
9
  * Whether the shadow-space depth compared by a filter is the device depth
@@ -349,21 +348,6 @@ import { getDevice } from '../app/api.js';
349
348
  ];
350
349
  /** @internal */ function getProgressivePoissonDiscSample(scope, index) {
351
350
  const pb = scope.$builder;
352
- if (pb.getDevice().type === 'webgl') {
353
- const funcName = 'lib_getProgressivePoissonDiscSampleWebGL1';
354
- pb.func(funcName, [
355
- pb.int('index')
356
- ], function() {
357
- for(let i = 0; i < PCF_POISSON_DISC.length; i++){
358
- const sample = PCF_POISSON_DISC[i * 19 % PCF_POISSON_DISC.length];
359
- this.$if(pb.equal(this.index, i), function() {
360
- this.$return(pb.vec2(sample[0], sample[1]));
361
- });
362
- }
363
- this.$return(pb.vec2(PCF_POISSON_DISC[0][0], PCF_POISSON_DISC[0][1]));
364
- });
365
- return pb.getGlobalScope()[funcName](index);
366
- }
367
351
  if (!pb.getGlobalScope().PCSSpdSamples) {
368
352
  pb.getGlobalScope().PCSSpdSamples = PCF_POISSON_DISC.map((sample)=>pb.vec2(sample[0], sample[1]));
369
353
  }
@@ -404,7 +388,7 @@ function getShadowMapSize(scope) {
404
388
  } else {
405
389
  this.$l.depth = pb.float();
406
390
  this.$l.lightType = ShaderHelper.getLightTypeForShadow(this);
407
- this.$if(pb.or(pb.equal(this.lightType, LIGHT_TYPE_DIRECTIONAL), pb.equal(this.lightType, LIGHT_TYPE_RECT)), function() {
391
+ this.$if(pb.equal(this.lightType, LIGHT_TYPE_DIRECTIONAL), function() {
408
392
  this.depth = pb.emulateDepthClamp ? pb.clamp(this.$inputs.clamppedDepth, 0, 1) : this.$builtins.fragCoord.z;
409
393
  }).$elseif(pb.equal(this.lightType, LIGHT_TYPE_POINT), function() {
410
394
  this.$l.lightSpacePos = pb.mul(ShaderHelper.getLightViewMatrixForShadow(this), pb.vec4(this.worldPos, 1));
@@ -463,9 +447,9 @@ function sampleShadowMapPCF(scope, shadowMapFormat, pos, offset, depth, cascade)
463
447
  const sampleDepth = this.z;
464
448
  const uv = pb.add(this.coords, this.offset);
465
449
  if (nativeShadowMap) {
466
- this.$return(cascade && getDevice().type !== 'webgl' ? pb.textureArraySampleCompareLevel(ShaderHelper.getShadowMap(this), uv, this.cascade, sampleDepth) : pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), uv, sampleDepth));
450
+ this.$return(cascade ? pb.textureArraySampleCompareLevel(ShaderHelper.getShadowMap(this), uv, this.cascade, sampleDepth) : pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), uv, sampleDepth));
467
451
  } else {
468
- this.$l.shadowTex = cascade && getDevice().type !== 'webgl' ? pb.textureArraySampleLevel(ShaderHelper.getShadowMap(this), uv, this.cascade, 0) : pb.textureSampleLevel(ShaderHelper.getShadowMap(this), uv, 0);
452
+ this.$l.shadowTex = cascade ? pb.textureArraySampleLevel(ShaderHelper.getShadowMap(this), uv, this.cascade, 0) : pb.textureSampleLevel(ShaderHelper.getShadowMap(this), uv, 0);
469
453
  if (shadowMapFormat === 'rgba8unorm') {
470
454
  this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);
471
455
  }
@@ -495,7 +479,7 @@ function sampleShadowDepthPCSS(scope, shadowMapFormat, deviceEncoded, pos, bound
495
479
  this.$if(this.sampleInside, function() {
496
480
  this.$l.boundsPadding = pb.mul(pb.sub(this.bounds.zw, this.bounds.xy), getShadowMapTexelSize(this), 0.5);
497
481
  this.$l.sampleCoord = pb.clamp(this.coords, pb.add(this.bounds.xy, this.boundsPadding), pb.sub(this.bounds.zw, this.boundsPadding));
498
- this.$l.shadowTex = cascade && getDevice().type !== 'webgl' ? pb.textureArraySampleLevel(ShaderHelper.getShadowMap(this), this.sampleCoord, this.cascade, 0) : pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.sampleCoord, 0);
482
+ this.$l.shadowTex = cascade ? pb.textureArraySampleLevel(ShaderHelper.getShadowMap(this), this.sampleCoord, this.cascade, 0) : pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.sampleCoord, 0);
499
483
  this.depth = shadowMapFormat === 'rgba8unorm' ? decodeNormalizedFloatFromRGBA(this, this.shadowTex) : this.shadowTex.x;
500
484
  });
501
485
  this.$return(this.depth);
@@ -585,7 +569,7 @@ function sampleShadowPCFPCSS(scope, shadowMapFormat, deviceEncoded, pos, bounds,
585
569
  cascade
586
570
  ] : []);
587
571
  }
588
- function samplePointShadowPCFPCSS(scope, shadowMapFormat, dir, compareDepth, texelSize, tangent, bitangent) {
572
+ function samplePointShadowPCFPCSS(scope, shadowMapFormat, dir, compareDepth, texelSize, tangent, bitangent, plane, depthParams) {
589
573
  const funcName = `lib_samplePointShadowPCFPCSS_${shadowMapFormat}`;
590
574
  const pb = scope.$builder;
591
575
  pb.func(funcName, [
@@ -593,7 +577,9 @@ function samplePointShadowPCFPCSS(scope, shadowMapFormat, dir, compareDepth, tex
593
577
  pb.float('compareDepth'),
594
578
  pb.float('texelSize'),
595
579
  pb.vec3('tangent'),
596
- pb.vec3('bitangent')
580
+ pb.vec3('bitangent'),
581
+ pb.vec4('plane'),
582
+ pb.vec2('depthParams')
597
583
  ], function() {
598
584
  this.$l.shadow = pb.float(0);
599
585
  this.$l.transitionWidth = pb.float(1 / 65535);
@@ -622,16 +608,17 @@ function samplePointShadowPCFPCSS(scope, shadowMapFormat, dir, compareDepth, tex
622
608
  this.offset = pb.mul(pb.vec2(ox, oy), this.texelSize);
623
609
  this.sampleDir = pb.normalize(pb.add(this.dir, pb.add(pb.mul(this.tangent, this.offset.x), pb.mul(this.bitangent, this.offset.y))));
624
610
  this.sampleDepth = samplePointShadowDepthPCSS(this, shadowMapFormat, this.sampleDir);
625
- this.shadow = pb.add(this.shadow, compareShadowDepthPCSS(this, this.sampleDepth, this.compareDepth, this.transitionWidth, false));
611
+ // Each sub-tap reads its own texel, so each is compared against the
612
+ // receiver there - see pointReceiverPlaneDepth.
613
+ this.shadow = pb.add(this.shadow, compareShadowDepthPCSS(this, this.sampleDepth, pointReceiverPlaneDepth(this, this.sampleDir, this.plane, this.compareDepth, this.depthParams), this.transitionWidth, false));
626
614
  }
627
615
  this.$return(pb.mul(this.shadow, 0.25));
628
616
  });
629
- return pb.getGlobalScope()[funcName](dir, compareDepth, texelSize, tangent, bitangent);
617
+ return pb.getGlobalScope()[funcName](dir, compareDepth, texelSize, tangent, bitangent, plane, depthParams);
630
618
  }
631
619
  function findBlockerPCSS(scope, shadowMapFormat, deviceEncoded, tapCount, texCoord, bounds, searchRadius, transitionWidth, matrix, cascade) {
632
620
  const funcName = `lib_findBlockerPCSS_${shadowMapFormat}_${cascade ? 1 : 0}${REVERSE_Z && deviceEncoded ? '_rev' : ''}`;
633
621
  const pb = scope.$builder;
634
- const webgl1 = pb.getDevice().type === 'webgl';
635
622
  pb.func(funcName, [
636
623
  pb.vec4('texCoord'),
637
624
  pb.vec4('bounds'),
@@ -649,12 +636,7 @@ function findBlockerPCSS(scope, shadowMapFormat, deviceEncoded, tapCount, texCoo
649
636
  this.$l.sampleCoord = pb.vec2();
650
637
  this.$l.sampleDepth = pb.float();
651
638
  this.$l.blockerWeight = pb.float();
652
- this.$for(pb.float('i'), 0, webgl1 ? PCF_POISSON_DISC.length : this.tapCount, function() {
653
- if (webgl1) {
654
- this.$if(pb.greaterThanEqual(this.i, this.tapCount), function() {
655
- this.$break();
656
- });
657
- }
639
+ this.$for(pb.float('i'), 0, this.tapCount, function() {
658
640
  this.duv = pb.mul(pb.mul(this.matrix, getProgressivePoissonDiscSample(this, pb.int(this.i))), this.searchRadius);
659
641
  this.sampleCoord = pb.add(this.texCoord.xy, this.duv);
660
642
  this.sampleDepth = sampleShadowDepthPCSS(this, shadowMapFormat, deviceEncoded, this.sampleCoord, this.bounds, this.cascade);
@@ -670,10 +652,54 @@ function findBlockerPCSS(scope, shadowMapFormat, deviceEncoded, tapCount, texCoo
670
652
  cascade
671
653
  ] : []);
672
654
  }
673
- function findPointBlockerPCSS(scope, shadowMapFormat, tapCount, dir, compareDepth, searchRadius, transitionWidth, matrix, tangent, bitangent) {
655
+ /**
656
+ * Normalized radial depth of the receiver's plane along a cube tap direction.
657
+ *
658
+ * @remarks
659
+ * The cube counterpart of `computeReceiverPlaneDepthBias`. A cube map stores
660
+ * distance from the light, so across a filter kernel the receiver's own depth
661
+ * changes with direction - on any plane not facing the light head-on, and
662
+ * even on one that does, since radial distance to a plane grows off its
663
+ * normal. Comparing every tap against the centre's depth makes the receiver
664
+ * occlude itself on one side of the kernel, which at PCSS kernel sizes turns a
665
+ * wide penumbra into a flat plateau of false shadow that snaps to fully lit
666
+ * where the blocker search runs out.
667
+ *
668
+ * Along the tap itself rather than at a texel centre, because the cube is
669
+ * sampled bilinearly: what a tap reads is the stored plane depths interpolated
670
+ * to its direction, which matches the plane there to second order.
671
+ *
672
+ * `plane` is the receiver's light-space plane as `(normal, dot(p, normal))` for
673
+ * the light-to-receiver vector `p`; a zero normal, a tap parallel to the plane
674
+ * or one that would meet it behind the light fall back to `centerDepth`.
675
+ * `depthParams` is `(1 / range, depth bias)`.
676
+ *
677
+ * @internal
678
+ */ function pointReceiverPlaneDepth(scope, dir, plane, centerDepth, depthParams) {
679
+ const pb = scope.$builder;
680
+ pb.func('lib_pointReceiverPlaneDepth', [
681
+ pb.vec3('dir'),
682
+ pb.vec4('plane'),
683
+ pb.float('centerDepth'),
684
+ pb.vec2('depthParams')
685
+ ], function() {
686
+ this.$l.denom = pb.dot(this.dir, this.plane.xyz);
687
+ this.$if(pb.lessThan(pb.abs(this.denom), 1e-8), function() {
688
+ this.$return(this.centerDepth);
689
+ });
690
+ // Where the ray meets the plane, as a distance along it. `dir` need not be
691
+ // unit length: the parameter scales inversely with it.
692
+ this.$l.t = pb.div(this.plane.w, this.denom);
693
+ this.$if(pb.lessThanEqual(this.t, 0), function() {
694
+ this.$return(this.centerDepth);
695
+ });
696
+ this.$return(pb.sub(pb.mul(this.t, pb.length(this.dir), this.depthParams.x), this.depthParams.y));
697
+ });
698
+ return pb.getGlobalScope().lib_pointReceiverPlaneDepth(dir, plane, centerDepth, depthParams);
699
+ }
700
+ function findPointBlockerPCSS(scope, shadowMapFormat, tapCount, dir, compareDepth, searchRadius, transitionWidth, matrix, tangent, bitangent, plane, depthParams) {
674
701
  const funcName = `lib_findPointBlockerPCSS_${shadowMapFormat}`;
675
702
  const pb = scope.$builder;
676
- const webgl1 = pb.getDevice().type === 'webgl';
677
703
  pb.func(funcName, [
678
704
  pb.vec3('dir'),
679
705
  pb.float('compareDepth'),
@@ -682,7 +708,9 @@ function findPointBlockerPCSS(scope, shadowMapFormat, tapCount, dir, compareDept
682
708
  pb.float('transitionWidth'),
683
709
  pb.mat2('matrix'),
684
710
  pb.vec3('tangent'),
685
- pb.vec3('bitangent')
711
+ pb.vec3('bitangent'),
712
+ pb.vec4('plane'),
713
+ pb.vec2('depthParams')
686
714
  ], function() {
687
715
  this.$l.blockerDepthSum = pb.float(0);
688
716
  this.$l.blockerCount = pb.float(0);
@@ -690,22 +718,17 @@ function findPointBlockerPCSS(scope, shadowMapFormat, tapCount, dir, compareDept
690
718
  this.$l.sampleDir = pb.vec3();
691
719
  this.$l.sampleDepth = pb.float();
692
720
  this.$l.blockerWeight = pb.float();
693
- this.$for(pb.float('i'), 0, webgl1 ? PCF_POISSON_DISC.length : this.tapCount, function() {
694
- if (webgl1) {
695
- this.$if(pb.greaterThanEqual(this.i, this.tapCount), function() {
696
- this.$break();
697
- });
698
- }
721
+ this.$for(pb.float('i'), 0, this.tapCount, function() {
699
722
  this.duv = pb.mul(pb.mul(this.matrix, getProgressivePoissonDiscSample(this, pb.int(this.i))), this.searchRadius);
700
723
  this.sampleDir = pb.normalize(pb.add(this.dir, pb.add(pb.mul(this.tangent, this.duv.x), pb.mul(this.bitangent, this.duv.y))));
701
724
  this.sampleDepth = samplePointShadowDepthPCSS(this, shadowMapFormat, this.sampleDir);
702
- this.blockerWeight = pb.sub(1, pb.smoothStep(pb.neg(this.transitionWidth), this.transitionWidth, pb.sub(this.sampleDepth, this.compareDepth)));
725
+ this.blockerWeight = pb.sub(1, pb.smoothStep(pb.neg(this.transitionWidth), this.transitionWidth, pb.sub(this.sampleDepth, pointReceiverPlaneDepth(this, this.sampleDir, this.plane, this.compareDepth, this.depthParams))));
703
726
  this.blockerDepthSum = pb.add(this.blockerDepthSum, pb.mul(this.sampleDepth, this.blockerWeight));
704
727
  this.blockerCount = pb.add(this.blockerCount, this.blockerWeight);
705
728
  });
706
729
  this.$return(pb.vec2(this.$choice(pb.greaterThan(this.blockerCount, 0), pb.div(this.blockerDepthSum, pb.max(this.blockerCount, 0.0001)), -1), this.blockerCount));
707
730
  });
708
- return pb.getGlobalScope()[funcName](dir, compareDepth, searchRadius, tapCount, transitionWidth, matrix, tangent, bitangent);
731
+ return pb.getGlobalScope()[funcName](dir, compareDepth, searchRadius, tapCount, transitionWidth, matrix, tangent, bitangent, plane, depthParams);
709
732
  }
710
733
  function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
711
734
  const flip = REVERSE_Z && deviceEncoded;
@@ -749,7 +772,7 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
749
772
  this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.texCoord.xyz, 0);
750
773
  this.$return(chebyshevUpperBound(this, this.texCoord.w, shadowMapFormat === 'rgba8unorm' ? pb.vec3(decode2HalfFromRGBA(this, this.shadowTex), 1) : this.shadowTex.rgb, false));
751
774
  } else {
752
- if (getDevice().type !== 'webgl' && cascade) {
775
+ if (cascade) {
753
776
  this.$l.shadowTex = pb.textureArraySampleLevel(ShaderHelper.getShadowMap(this), this.texCoord.xy, this.cascade, 0);
754
777
  } else {
755
778
  this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.texCoord.xy, 0);
@@ -780,7 +803,7 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
780
803
  this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);
781
804
  }
782
805
  } else {
783
- if (cascade && getDevice().type !== 'webgl') {
806
+ if (cascade) {
784
807
  this.$l.shadowTex = pb.textureArraySampleLevel(ShaderHelper.getShadowMap(this), this.shadowVertex.xy, this.cascade, 0);
785
808
  } else {
786
809
  this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.shadowVertex.xy, 0);
@@ -902,7 +925,6 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
902
925
  /** @internal */ function filterShadowPCSS(scope, lightType, shadowMapFormat, texCoord, receiverPlaneDepthBias, cascade, temporalJitter = true, numCascades = 1) {
903
926
  const funcNameFilterShadowPCSS = `lib_filterShadowPCSS_${lightType}_${shadowMapFormat}_${receiverPlaneDepthBias ? 1 : 0}_${cascade ? 1 : 0}_${temporalJitter ? 1 : 0}_${numCascades}`;
904
927
  const pb = scope.$builder;
905
- const webgl1 = pb.getDevice().type === 'webgl';
906
928
  pb.func(funcNameFilterShadowPCSS, [
907
929
  pb.vec4('texCoord'),
908
930
  ...receiverPlaneDepthBias ? [
@@ -916,7 +938,11 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
916
938
  this.$l.PCSSfilterSampleCount = ShaderHelper.getShadowImplParams(this).z;
917
939
  this.$l.PCSSlightRadius = ShaderHelper.getShadowImplParams(this).x;
918
940
  this.$l.PCSSmaxFilterRadius = ShaderHelper.getShadowImplParams(this).w;
919
- this.$l.PCSSsearchRadius = this.$choice(pb.greaterThan(this.PCSSlightRadius, 0), pb.max(this.PCSSlightRadius, this.PCSSmaxFilterRadius), 0);
941
+ // A negative light radius is a physical source radius in world units rather
942
+ // than a size in texels - see PCSS.physicalLightRadius. Only the cube
943
+ // branch below reads it that way; the search itself spans the whole filter
944
+ // budget either way.
945
+ this.$l.PCSSsearchRadius = this.$choice(pb.notEqual(this.PCSSlightRadius, 0), pb.max(pb.abs(this.PCSSlightRadius), this.PCSSmaxFilterRadius), 0);
920
946
  if (lightType === LIGHT_TYPE_POINT) {
921
947
  this.$l.lightDepth = this.texCoord.w;
922
948
  this.$l.sampleDir = pb.normalize(this.texCoord.xyz);
@@ -927,24 +953,45 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
927
953
  this.$l.up = this.$choice(pb.lessThan(pb.abs(this.sampleDir.y), 0.999), pb.vec3(0, 1, 0), pb.vec3(1, 0, 0));
928
954
  this.$l.tangent = pb.normalize(pb.cross(this.up, this.sampleDir));
929
955
  this.$l.bitangent = pb.cross(this.sampleDir, this.tangent);
930
- this.$l.blocker = findPointBlockerPCSS(this, shadowMapFormat, this.PCSSblockerSampleCount, this.sampleDir, this.lightDepth, this.searchRadius, this.blockerTransitionWidth, this.matrix, this.tangent, this.bitangent);
956
+ // For cube maps the receiver-plane slot carries the receiver's light-space
957
+ // plane normal rather than a depth gradient; see pointReceiverPlaneDepth.
958
+ this.$l.receiverPlane = pb.vec4(0);
959
+ this.$l.depthParams = pb.vec2(0);
960
+ if (receiverPlaneDepthBias) {
961
+ this.$l.invRange = pb.div(1, ShaderHelper.getLightPositionAndRangeForShadow(this).w);
962
+ this.receiverPlane = pb.vec4(this.receiverPlaneDepthBias, pb.dot(this.texCoord.xyz, this.receiverPlaneDepthBias));
963
+ // The receiver's own bias, plus one shadow texel's footprint at the
964
+ // receiver. The point light's depth bias is sized to a texel at the near
965
+ // plane, a small fraction of one here; with the slope handled by the
966
+ // plane, what remains to cover is bilinear interpolation error and the
967
+ // storage format's rounding - half a float's relative precision is
968
+ // 2^-11, below a texel's angular size of 2 / size for any map up to
969
+ // 2048 - and without it the comparison flips texel by texel wherever
970
+ // the plane's depth barely changes, which is right under the light:
971
+ // rings of isolated black pixels there.
972
+ this.depthParams = pb.vec2(this.invRange, pb.add(pb.sub(pb.mul(pb.length(this.texCoord.xyz), this.invRange), this.lightDepth), pb.mul(this.lightDepth, this.shadowMapTexelSize)));
973
+ }
974
+ this.$l.blocker = findPointBlockerPCSS(this, shadowMapFormat, this.PCSSblockerSampleCount, this.sampleDir, this.lightDepth, this.searchRadius, this.blockerTransitionWidth, this.matrix, this.tangent, this.bitangent, this.receiverPlane, this.depthParams);
931
975
  this.$if(pb.lessThanEqual(this.blocker.y, 0), function() {
932
976
  this.$return(pb.float(1));
933
977
  });
934
978
  this.$l.penumbra = pb.div(pb.max(pb.sub(this.lightDepth, this.blocker.x), 0), pb.max(this.blocker.x, 0.0001));
935
- this.$l.filterRadius = pb.mul(pb.clamp(pb.mul(this.penumbra, this.PCSSlightRadius), 0, pb.max(0, this.PCSSmaxFilterRadius)), this.shadowMapTexelSize);
979
+ // With a physical source radius R, the penumbra at the receiver is
980
+ // R * (dr - db) / db wide, and seen from the light that is an angle of
981
+ // penumbra * R / dr - which is what an offset on the unit-length sample
982
+ // direction measures. So the light's size in texels follows the
983
+ // receiver's distance, instead of being one fixed texel count that
984
+ // over-blurs near the light and under-blurs far from it.
985
+ this.$l.receiverDistance = pb.max(pb.mul(this.lightDepth, ShaderHelper.getLightPositionAndRangeForShadow(this).w), 0.0001);
986
+ this.$l.lightRadiusTexels = this.$choice(pb.lessThan(this.PCSSlightRadius, 0), pb.div(pb.div(pb.neg(this.PCSSlightRadius), this.receiverDistance), this.shadowMapTexelSize), this.PCSSlightRadius);
987
+ this.$l.filterRadius = pb.mul(pb.clamp(pb.mul(this.penumbra, this.lightRadiusTexels), 0, pb.max(0, this.PCSSmaxFilterRadius)), this.shadowMapTexelSize);
936
988
  this.$l.shadow = pb.float(0);
937
989
  this.$l.duv = pb.vec2();
938
990
  this.$l.samplePointDir = pb.vec3();
939
- this.$for(pb.float('i'), 0, webgl1 ? PCF_POISSON_DISC.length : this.PCSSfilterSampleCount, function() {
940
- if (webgl1) {
941
- this.$if(pb.greaterThanEqual(this.i, this.PCSSfilterSampleCount), function() {
942
- this.$break();
943
- });
944
- }
991
+ this.$for(pb.float('i'), 0, this.PCSSfilterSampleCount, function() {
945
992
  this.duv = pb.mul(pb.mul(this.matrix, getProgressivePoissonDiscSample(this, pb.int(this.i))), this.filterRadius);
946
993
  this.samplePointDir = pb.normalize(pb.add(this.sampleDir, pb.add(pb.mul(this.tangent, this.duv.x), pb.mul(this.bitangent, this.duv.y))));
947
- this.shadow = pb.add(this.shadow, samplePointShadowPCFPCSS(this, shadowMapFormat, this.samplePointDir, this.lightDepth, this.shadowMapTexelSize, this.tangent, this.bitangent));
994
+ this.shadow = pb.add(this.shadow, samplePointShadowPCFPCSS(this, shadowMapFormat, this.samplePointDir, this.lightDepth, this.shadowMapTexelSize, this.tangent, this.bitangent, this.receiverPlane, this.depthParams));
948
995
  });
949
996
  this.shadow = pb.div(this.shadow, this.PCSSfilterSampleCount);
950
997
  this.$return(this.shadow);
@@ -957,14 +1004,6 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
957
1004
  // The scalar `.z` guard is gone (see computeReceiverPlaneDepthBias); the
958
1005
  // per-tap plane gradient below is the part that was ever load bearing.
959
1006
  this.$l.sampleBounds = pb.vec4(0, 0, 1, 1);
960
- if (cascade && getDevice().type === 'webgl' && numCascades > 1) {
961
- const numCols = numCascades > 1 ? 2 : 1;
962
- const numRows = numCascades > 2 ? 2 : 1;
963
- this.$l.cascadeIndex = pb.float(this.cascade);
964
- this.$l.cascadeCol = pb.mod(this.cascadeIndex, 2);
965
- this.$l.cascadeRow = pb.floor(pb.mul(this.cascadeIndex, 0.5));
966
- this.sampleBounds = pb.vec4(pb.mul(this.cascadeCol, 1 / numCols), pb.mul(this.cascadeRow, 1 / numRows), pb.mul(pb.add(this.cascadeCol, 1), 1 / numCols), pb.mul(pb.add(this.cascadeRow, 1), 1 / numRows));
967
- }
968
1007
  this.$l.shadowMapTexelSize = pb.mul(pb.sub(this.sampleBounds.zw, this.sampleBounds.xy), getShadowMapTexelSize(this));
969
1008
  this.$l.matrix = getPCSSRotationMatrix(this, pb.mul(this.texCoord.xy, pb.vec2(getShadowMapSize(this))), temporalJitter);
970
1009
  this.$l.searchRadius = pb.mul(pb.clamp(this.PCSSsearchRadius, 0, pb.max(0, this.PCSSmaxFilterRadius)), this.shadowMapTexelSize);
@@ -981,12 +1020,7 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
981
1020
  this.$l.duv = pb.vec2();
982
1021
  this.$l.sampleCoord = pb.vec2();
983
1022
  this.$l.compareDepth = pb.float();
984
- this.$for(pb.float('i'), 0, webgl1 ? PCF_POISSON_DISC.length : this.PCSSfilterSampleCount, function() {
985
- if (webgl1) {
986
- this.$if(pb.greaterThanEqual(this.i, this.PCSSfilterSampleCount), function() {
987
- this.$break();
988
- });
989
- }
1023
+ this.$for(pb.float('i'), 0, this.PCSSfilterSampleCount, function() {
990
1024
  this.duv = pb.mul(pb.mul(this.matrix, getProgressivePoissonDiscSample(this, pb.int(this.i))), this.filterRadius);
991
1025
  this.sampleCoord = pb.add(this.texCoord.xy, this.duv);
992
1026
  this.compareDepth = receiverPlaneDepthBias ? pb.add(this.lightDepth, pb.dot(this.duv, this.receiverPlaneDepthBias.xy)) : this.lightDepth;