@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,477 @@
1
+ import { Vector2, Vector4, DEPTH_FARTHEST, REVERSE_Z } from '@zephyr3d/base';
2
+ import { ShaderHelper } from '../material/shader/helper.js';
3
+ import { drawFullscreenQuad } from './fullscreenquad.js';
4
+ import { MAX_SHADOW_MASK_LIGHTS, LIGHT_TYPE_DIRECTIONAL } from '../values.js';
5
+ import { ndcToShadowCoord } from '../shaders/shadow.js';
6
+ import { SHADOW_MASK_LIGHTS_PER_LAYER } from './shadow_mask_pass.js';
7
+ import { SSSProfile, SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT, SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR, SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS, SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH } from '../material/sssprofile.js';
8
+ import { fetchSampler } from '../utility/misc.js';
9
+
10
+ const UNIFORM_NAME_SHADOW_DEPTH = 'Z_UniformShadowDepth';
11
+ /**
12
+ * Largest optical depth the transmission profile is defined over.
13
+ *
14
+ * @remarks
15
+ * Re-exported from {@link SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH}: the encoding this
16
+ * pass writes (`1 - opticalDepth / MAX`) and the baked profile the BxDF indexes
17
+ * with it must agree on the same number, and the profile owns the baking.
18
+ *
19
+ * The clamp floor and additive bias below are in profile millimetres, not world
20
+ * units, so a producer feeding `opticalDepthScale` has to convert.
21
+ *
22
+ * @internal
23
+ */ const MAX_TRANSMISSION_OPTICAL_DEPTH = SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH;
24
+ /** Poisson disc the light-space thickness is averaged over. */ const POISSON_DISC = [
25
+ [
26
+ 0.25,
27
+ 0.0
28
+ ],
29
+ [
30
+ -0.31929,
31
+ 0.292496
32
+ ],
33
+ [
34
+ 0.048872,
35
+ -0.556877
36
+ ],
37
+ [
38
+ 0.402444,
39
+ 0.524918
40
+ ],
41
+ [
42
+ -0.738535,
43
+ -0.130636
44
+ ],
45
+ [
46
+ 0.699605,
47
+ -0.445031
48
+ ],
49
+ [
50
+ -0.234004,
51
+ 0.870484
52
+ ],
53
+ [
54
+ -0.446271,
55
+ -0.859268
56
+ ],
57
+ [
58
+ -0.25,
59
+ 0.0
60
+ ],
61
+ [
62
+ 0.31929,
63
+ -0.292496
64
+ ],
65
+ [
66
+ -0.048872,
67
+ 0.556877
68
+ ],
69
+ [
70
+ -0.402444,
71
+ -0.524918
72
+ ],
73
+ [
74
+ 0.738535,
75
+ 0.130636
76
+ ],
77
+ [
78
+ -0.699605,
79
+ 0.445031
80
+ ],
81
+ [
82
+ 0.234004,
83
+ -0.870484
84
+ ],
85
+ [
86
+ 0.446271,
87
+ 0.859268
88
+ ]
89
+ ];
90
+ /** Radius the disc is scaled to, in shadow map texels. */ const SEARCH_RADIUS_TEXELS = 1;
91
+ /** The offsets actually sampled. A zero radius needs one tap, not sixteen copies of it. */ const taps = POISSON_DISC ;
92
+ /**
93
+ * Whether a light can contribute back-lit transmission this frame.
94
+ * @internal
95
+ */ function lightSupportsTransmission(light, params) {
96
+ return !!light.transmission && !!params?.shadowMapFramebuffer?.getDepthAttachment();
97
+ }
98
+ /**
99
+ * Renders the screen-space light-space thickness used by subsurface transmission.
100
+ *
101
+ * WebGPU and WebGL2.
102
+ *
103
+ * @internal
104
+ */ class TransmissionThicknessRenderer {
105
+ _programs;
106
+ _bindGroups;
107
+ _channelStates;
108
+ _nearFar;
109
+ _invRenderSize;
110
+ _cameraPosition;
111
+ _cameraParams;
112
+ _profileTexelSize;
113
+ constructor(){
114
+ this._programs = new Map();
115
+ this._bindGroups = new Map();
116
+ this._channelStates = null;
117
+ this._nearFar = new Vector2();
118
+ this._invRenderSize = new Vector2();
119
+ this._cameraPosition = new Vector4();
120
+ this._cameraParams = new Vector4();
121
+ this._profileTexelSize = new Vector2();
122
+ }
123
+ /**
124
+ * Render light-space thickness for every transmission-enabled light.
125
+ *
126
+ * @param ctx - Draw context, carrying `shadowMapInfo` for the lights.
127
+ * @param depthTexture - Linear depth from the depth prepass.
128
+ * @param profileIdTexture - Per-pixel skin profile id from the depth prepass,
129
+ * `0` where the pixel is not skin.
130
+ * @param lights - Shadow-casting lights in clustered-buffer order, i.e. exactly
131
+ * the array {@link ShadowMaskRenderer.render} is given, so that ordinals agree.
132
+ * @param getLayerFramebuffer - Resolves the framebuffer for array layer `k`.
133
+ */ render(ctx, depthTexture, profileIdTexture, lights, getLayerFramebuffer) {
134
+ const device = ctx.device;
135
+ const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);
136
+ if (numLights === 0 || !ctx.shadowMapInfo) {
137
+ return;
138
+ }
139
+ const profileTable = SSSProfile.getTable(device);
140
+ if (!profileTable) {
141
+ return;
142
+ }
143
+ const numLayers = Math.ceil(numLights / SHADOW_MASK_LIGHTS_PER_LAYER);
144
+ const channelStates = this.getChannelStates(device);
145
+ const savedShadowLight = ctx.currentShadowLight;
146
+ this._profileTexelSize.setXY(1 / SSSProfile.tableColumns, 1 / SSSProfile.tableRows);
147
+ device.pushDeviceStates();
148
+ for(let layer = 0; layer < numLayers; layer++){
149
+ device.setFramebuffer(getLayerFramebuffer(layer));
150
+ // 1 encodes zero optical depth, so an untouched channel reads as "nothing
151
+ // in the way" and contributes no transmission.
152
+ device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);
153
+ for(let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++){
154
+ const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;
155
+ if (ordinal >= numLights) {
156
+ break;
157
+ }
158
+ const light = lights[ordinal];
159
+ const shadowMapParams = ctx.shadowMapInfo.get(light) ?? null;
160
+ if (!lightSupportsTransmission(light, shadowMapParams)) {
161
+ continue;
162
+ }
163
+ ctx.currentShadowLight = light;
164
+ this.renderLightChannel(ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams, channelStates[channel]);
165
+ }
166
+ }
167
+ device.popDeviceStates();
168
+ ctx.currentShadowLight = savedShadowLight;
169
+ }
170
+ renderLightChannel(ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams, renderState) {
171
+ const device = ctx.device;
172
+ const key = this.getProgramKey(ctx, shadowMapParams);
173
+ let program = this._programs.get(key) ?? null;
174
+ if (!program) {
175
+ program = this.createProgram(ctx, shadowMapParams);
176
+ this._programs.set(key, program);
177
+ this._bindGroups.set(key, device.createBindGroup(program.bindGroupLayouts[0]));
178
+ }
179
+ const bindGroup = this._bindGroups.get(key);
180
+ this.setUniforms(bindGroup, ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams);
181
+ device.setProgram(program);
182
+ device.setBindGroup(0, bindGroup);
183
+ drawFullscreenQuad(renderState);
184
+ }
185
+ getProgramKey(ctx, shadowMapParams) {
186
+ const depth = shadowMapParams.shadowMapFramebuffer.getDepthAttachment();
187
+ return `${ctx.device.type}|${shadowMapParams.lightType}|${shadowMapParams.numShadowCascades}|${depth.isTexture2DArray() ? 'array' : depth.isTextureCube() ? 'cube' : '2d'}`;
188
+ }
189
+ getChannelStates(device) {
190
+ if (!this._channelStates) {
191
+ this._channelStates = [];
192
+ for(let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++){
193
+ const rs = device.createRenderStateSet();
194
+ rs.useDepthState().enableTest(false).enableWrite(false);
195
+ rs.useRasterizerState().setCullMode('none');
196
+ rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);
197
+ this._channelStates.push(rs);
198
+ }
199
+ }
200
+ return this._channelStates;
201
+ }
202
+ setUniforms(bindGroup, ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams) {
203
+ const camera = ctx.camera;
204
+ const light = ctx.currentShadowLight;
205
+ const near = camera.getNearPlane();
206
+ const far = camera.getFarPlane();
207
+ const cameraPos = camera.getWorldPosition();
208
+ this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);
209
+ this._cameraParams.setXYZW(near, far, 1, 1);
210
+ this._nearFar.setXY(near, far);
211
+ bindGroup.setValue('camera', {
212
+ position: this._cameraPosition,
213
+ params: this._cameraParams,
214
+ shadowDebugCascades: 0,
215
+ framestamp: ctx.device.frameInfo.frameCounter
216
+ });
217
+ const implParams = new Vector4();
218
+ shadowMapParams.impl.getParams(implParams);
219
+ bindGroup.setValue('light', {
220
+ sunDir: ctx.sunLight ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1) : new Vector4(0, 1, 0, 0).xyz(),
221
+ shadowCascades: shadowMapParams.numShadowCascades,
222
+ positionAndRange: light.positionAndRange,
223
+ directionAndCutoff: light.directionAndCutoff,
224
+ diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),
225
+ extraParams: light.extraParams,
226
+ cascadeDistances: shadowMapParams.cascadeDistances,
227
+ depthBiasValues: shadowMapParams.depthBiasValues[0],
228
+ shadowCameraParams: shadowMapParams.cameraParams,
229
+ depthBiasScales: shadowMapParams.depthBiasScales,
230
+ implParams: implParams,
231
+ shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),
232
+ shadowStrength: light.shadow.shadowStrength,
233
+ envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),
234
+ envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1
235
+ });
236
+ // The depth prepass draws with the TAA jitter; take positions back through it
237
+ // (see ShadowMaskPass)
238
+ bindGroup.setValue('invViewProjMatrix', ctx.motionVectors ? camera.jitteredInvVPMatrix : camera.invViewProjectionMatrix);
239
+ bindGroup.setValue('cameraNearFar', this._nearFar);
240
+ bindGroup.setValue('profileTexelSize', this._profileTexelSize);
241
+ this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);
242
+ bindGroup.setValue('invRenderSize', this._invRenderSize);
243
+ bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));
244
+ bindGroup.setTexture('profileIdTex', profileIdTexture, fetchSampler('clamp_nearest_nomip'));
245
+ // rgba32f, so WebGPU only accepts a non-filtering sampler; every read is a
246
+ // single texel anyway.
247
+ bindGroup.setTexture('profileTex', profileTable, fetchSampler('clamp_nearest_nomip'));
248
+ const shadowDepth = shadowMapParams.shadowMapFramebuffer.getDepthAttachment();
249
+ if (shadowDepth.isTextureCube()) {
250
+ // Point sampled, for the reason the 2D maps use textureLoad: see
251
+ // zLoadShadowDepth.
252
+ bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth, fetchSampler('clamp_nearest_nomip'));
253
+ } else {
254
+ // Sampled through textureLoad only, so no sampler is bound for it.
255
+ bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth);
256
+ }
257
+ }
258
+ createProgram(ctx, shadowMapParams) {
259
+ const device = ctx.device;
260
+ const numCascades = shadowMapParams.numShadowCascades;
261
+ const lightType = shadowMapParams.lightType;
262
+ const depthAttachment = shadowMapParams.shadowMapFramebuffer.getDepthAttachment();
263
+ const isArray = depthAttachment.isTexture2DArray();
264
+ const cube = depthAttachment.isTextureCube();
265
+ const ortho = lightType === LIGHT_TYPE_DIRECTIONAL;
266
+ // WebGL2 has no depth texture type that allows a non-comparison read:
267
+ // texelFetch is undefined on sampler2DShadow and samplerCubeShadow always
268
+ // compares. A depth texture bound to a plain float sampler with compare
269
+ // mode off returns its depth in .r, so declare it that way there.
270
+ const webgpu = device.type === 'webgpu';
271
+ const program = device.buildRenderProgram({
272
+ label: 'TransmissionThickness',
273
+ vertex (pb) {
274
+ this.$inputs.pos = pb.vec2().attrib('position');
275
+ this.$outputs.uv = pb.vec2();
276
+ pb.main(function() {
277
+ this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);
278
+ this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
279
+ if (device.type === 'webgpu') {
280
+ this.$builtins.position.y = pb.neg(this.$builtins.position.y);
281
+ }
282
+ });
283
+ },
284
+ fragment (pb) {
285
+ const cameraStruct = pb.defineStruct([
286
+ pb.vec4('position'),
287
+ pb.vec4('params'),
288
+ pb.float('shadowDebugCascades'),
289
+ pb.int('framestamp')
290
+ ]);
291
+ // Must match helper.ts currentShadowLight lightStruct field-for-field:
292
+ // ShaderHelper.calculateShadowSpaceVertex and friends read scope.light.
293
+ const lightStruct = pb.defineStruct([
294
+ pb.vec3('sunDir'),
295
+ pb.int('shadowCascades'),
296
+ pb.vec4('positionAndRange'),
297
+ pb.vec4('directionAndCutoff'),
298
+ pb.vec4('diffuseAndIntensity'),
299
+ pb.vec4('extraParams'),
300
+ pb.vec4('cascadeDistances'),
301
+ pb.vec4('depthBiasValues'),
302
+ pb.vec4('shadowCameraParams'),
303
+ pb.vec4('depthBiasScales'),
304
+ pb.vec4('implParams'),
305
+ pb.vec4[16]('shadowMatrices'),
306
+ pb.float('shadowStrength'),
307
+ pb.float('envLightStrength'),
308
+ pb.float('envLightSpecularStrength')
309
+ ]);
310
+ this.camera = cameraStruct().uniform(0);
311
+ this.light = lightStruct().uniform(0);
312
+ if (webgpu) {
313
+ this[UNIFORM_NAME_SHADOW_DEPTH] = cube ? pb.texCubeShadow().uniform(0) : (isArray ? pb.tex2DArrayShadow() : pb.tex2DShadow()).uniform(0).noSampler();
314
+ } else {
315
+ this[UNIFORM_NAME_SHADOW_DEPTH] = (cube ? pb.texCube() : isArray ? pb.tex2DArray() : pb.tex2D()).sampleType('unfilterable-float').uniform(0);
316
+ }
317
+ this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
318
+ this.profileIdTex = pb.tex2D().uniform(0);
319
+ // rgba32f, hence unfilterable; every read here is a single texel.
320
+ this.profileTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
321
+ this.invViewProjMatrix = pb.mat4().uniform(0);
322
+ this.cameraNearFar = pb.vec2().uniform(0);
323
+ this.invRenderSize = pb.vec2().uniform(0);
324
+ this.profileTexelSize = pb.vec2().uniform(0);
325
+ this.$outputs.color = pb.vec4();
326
+ // One texel of a profile row, addressed exactly as skin_brdf.ts does:
327
+ // the row is the normalized id and the column is a parameter group.
328
+ pb.func('zReadProfile', [
329
+ pb.float('id'),
330
+ pb.float('column')
331
+ ], function() {
332
+ this.$l.u = pb.mul(pb.add(this.column, 0.5), this.profileTexelSize.x);
333
+ this.$l.v = pb.mul(pb.add(pb.mul(pb.clamp(this.id, 0, 1), 255), 0.5), this.profileTexelSize.y);
334
+ this.$return(pb.textureSampleLevel(this.profileTex, pb.vec2(this.u, this.v), 0));
335
+ });
336
+ /**
337
+ * Geometric normal from the depth prepass. Transcribed from
338
+ * ShadowMaskRenderer: a fullscreen pass has no interpolated normal, and
339
+ * the naive cross(ddx, ddy) spans depth discontinuities.
340
+ */ pb.func('zReconstructNormal', [
341
+ pb.vec2('uv'),
342
+ pb.vec4('center')
343
+ ], function() {
344
+ this.$l.dx = pb.vec2(this.invRenderSize.x, 0);
345
+ this.$l.dy = pb.vec2(0, this.invRenderSize.y);
346
+ const tap = (uv)=>ShaderHelper.samplePositionFromDepth(this, this.depthTex, uv, this.invViewProjMatrix, this.cameraNearFar);
347
+ this.$l.right = tap(pb.add(this.uv, this.dx));
348
+ this.$l.left = tap(pb.sub(this.uv, this.dx));
349
+ this.$l.up = tap(pb.add(this.uv, this.dy));
350
+ this.$l.down = tap(pb.sub(this.uv, this.dy));
351
+ this.$l.edgeX = pb.sub(this.right.xyz, this.center.xyz);
352
+ this.$if(pb.lessThan(pb.abs(pb.sub(this.left.w, this.center.w)), pb.abs(pb.sub(this.right.w, this.center.w))), function() {
353
+ this.edgeX = pb.sub(this.center.xyz, this.left.xyz);
354
+ });
355
+ this.$l.edgeY = pb.sub(this.up.xyz, this.center.xyz);
356
+ this.$if(pb.lessThan(pb.abs(pb.sub(this.down.w, this.center.w)), pb.abs(pb.sub(this.up.w, this.center.w))), function() {
357
+ this.edgeY = pb.sub(this.center.xyz, this.down.xyz);
358
+ });
359
+ this.$l.n = pb.cross(this.edgeX, this.edgeY);
360
+ this.$l.len = pb.length(this.n);
361
+ this.$if(pb.lessThan(this.len, 1e-12), function() {
362
+ this.$return(pb.vec3(0));
363
+ });
364
+ this.n = pb.div(this.n, this.len);
365
+ this.$l.toEye = pb.sub(this.camera.position.xyz, this.center.xyz);
366
+ this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function() {
367
+ this.n = pb.neg(this.n);
368
+ });
369
+ this.$return(this.n);
370
+ });
371
+ if (!cube) {
372
+ pb.func('zLoadShadowDepth', [
373
+ pb.vec2('coord'),
374
+ pb.float('size'),
375
+ ...isArray ? [
376
+ pb.int('layer')
377
+ ] : []
378
+ ], function() {
379
+ this.$l.texel = pb.ivec2(pb.clamp(pb.mul(this.coord, this.size), pb.vec2(0), pb.sub(pb.vec2(this.size), pb.vec2(1))));
380
+ const depth = isArray ? pb.textureArrayLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, this.layer, 0) : pb.textureLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, 0);
381
+ this.$return(webgpu ? depth : depth.x);
382
+ });
383
+ }
384
+ pb.main(function() {
385
+ this.$l.pos = ShaderHelper.samplePositionFromDepth(this, this.depthTex, this.$inputs.uv, this.invViewProjMatrix, this.cameraNearFar);
386
+ this.$outputs.color = pb.vec4(1);
387
+ this.$l.profileId = pb.textureSampleLevel(this.profileIdTex, this.$inputs.uv, 0).r;
388
+ this.$if(pb.lessThan(this.profileId, 0.5 / 255), function() {
389
+ this.$return();
390
+ });
391
+ this.$l.trParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.transmissionParamColumn));
392
+ this.$l.scalingParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.scalingParamColumn));
393
+ this.$l.opticalDepthScale = pb.mul(SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT, this.trParams.x);
394
+ this.$l.shrinkDistance = pb.mul(this.trParams.y, 0.5 * 0.01, this.scalingParams.x);
395
+ this.$l.normalScaleBias = pb.mul(this.shrinkDistance, this.opticalDepthScale);
396
+ this.$if(pb.lessThan(this.pos.w, 1), function() {
397
+ this.$l.normal = this.zReconstructNormal(this.$inputs.uv, this.pos);
398
+ this.$l.split = pb.int(0);
399
+ if (numCascades > 1) {
400
+ this.$l.linearDepth = pb.mul(this.pos.w, this.camera.params.y);
401
+ this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.light.cascadeDistances));
402
+ this.$l.cascadeFlags = pb.vec4(pb.float(pb.greaterThan(this.light.shadowCascades, 0)), pb.float(pb.greaterThan(this.light.shadowCascades, 1)), pb.float(pb.greaterThan(this.light.shadowCascades, 2)), pb.float(pb.greaterThan(this.light.shadowCascades, 3)));
403
+ this.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));
404
+ }
405
+ this.$l.shrunk = pb.sub(this.pos.xyz, pb.mul(this.normal, this.shrinkDistance));
406
+ if (cube) {
407
+ this.$l.lv = pb.sub(this.shrunk, this.light.positionAndRange.xyz);
408
+ this.$l.maxZ = pb.max(pb.max(pb.abs(this.lv.x), pb.abs(this.lv.y)), pb.abs(this.lv.z));
409
+ this.$l.inside = pb.and(pb.greaterThanEqual(this.maxZ, this.light.shadowCameraParams.x), pb.lessThanEqual(this.maxZ, this.light.shadowCameraParams.y));
410
+ } else {
411
+ this.$l.sv = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.shrunk, 1), numCascades > 1 ? this.split : 0);
412
+ this.$l.sc = ndcToShadowCoord(this, pb.div(this.sv, this.sv.w));
413
+ this.$l.inside = pb.all(pb.bvec4(pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.x, 0), pb.lessThanEqual(this.sc.x, 1))), pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.y, 0), pb.lessThanEqual(this.sc.y, 1))), pb.greaterThanEqual(this.sc.z, 0), pb.lessThanEqual(this.sc.z, 1)));
414
+ }
415
+ this.$if(this.inside, function() {
416
+ this.$l.size = this.light.shadowCameraParams.z;
417
+ if (cube) {
418
+ this.$l.receiverDist = pb.length(this.lv);
419
+ this.$l.dir = pb.div(this.lv, this.receiverDist);
420
+ this.$l.onCube = pb.div(this.lv, this.maxZ);
421
+ this.$l.helper = this.$choice(pb.lessThan(pb.abs(this.dir.y), 0.99), pb.vec3(0, 1, 0), pb.vec3(1, 0, 0));
422
+ this.$l.side = pb.normalize(pb.cross(this.helper, this.dir));
423
+ this.$l.up = pb.cross(this.dir, this.side);
424
+ {
425
+ this.$l.radius = pb.div(2 * SEARCH_RADIUS_TEXELS, this.size);
426
+ }
427
+ } else {
428
+ this.$l.radius = pb.div(SEARCH_RADIUS_TEXELS, this.size);
429
+ }
430
+ if (ortho) {
431
+ this.$l.zRow = this.light.shadowMatrices.at(pb.add(pb.mul(this.split, 4), 2));
432
+ this.$l.zRange = pb.div(REVERSE_Z ? 1 : 2, pb.max(pb.length(this.zRow.xyz), 1e-8));
433
+ }
434
+ this.$l.sum = pb.float(0);
435
+ for(let i = 0; i < taps.length; i++){
436
+ if (cube) {
437
+ this.$l[`u${i}`] = pb.add(this.onCube, pb.mul(pb.add(pb.mul(this.side, taps[i][0]), pb.mul(this.up, taps[i][1])), this.radius)) ;
438
+ this.$l[`b${i}`] = pb.textureSampleLevel(this[UNIFORM_NAME_SHADOW_DEPTH], this[`u${i}`], 0).x;
439
+ this.$l[`m${i}`] = pb.max(pb.max(pb.abs(this[`u${i}`].x), pb.abs(this[`u${i}`].y)), pb.abs(this[`u${i}`].z));
440
+ this.$l[`t${i}`] = pb.sub(this.receiverDist, pb.mul(ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams), pb.div(pb.length(this[`u${i}`]), this[`m${i}`])));
441
+ } else {
442
+ this.$l[`c${i}`] = pb.add(this.sc.xy, pb.mul(pb.vec2(taps[i][0], taps[i][1]), this.radius)) ;
443
+ this.$l[`b${i}`] = isArray ? this.zLoadShadowDepth(this[`c${i}`], this.size, this.split) : this.zLoadShadowDepth(this[`c${i}`], this.size);
444
+ // Under reverse-Z a blocker sits at a larger depth value.
445
+ this.$l[`d${i}`] = REVERSE_Z ? pb.sub(this[`b${i}`], this.sc.z) : pb.sub(this.sc.z, this[`b${i}`]);
446
+ if (ortho) {
447
+ this.$l[`t${i}`] = pb.mul(this[`d${i}`], this.zRange);
448
+ } else {
449
+ this.$l[`t${i}`] = pb.sub(ShaderHelper.nonLinearDepthToLinear(this, this.sc.z, this.light.shadowCameraParams), ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams));
450
+ }
451
+ }
452
+ this.$l[`o${i}`] = pb.mul(this[`t${i}`], this.opticalDepthScale);
453
+ this.$l[`k${i}`] = pb.clamp(pb.max(pb.add(this[`o${i}`], this.normalScaleBias), 0), SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR, MAX_TRANSMISSION_OPTICAL_DEPTH);
454
+ this.sum = pb.add(this.sum, this[`k${i}`]);
455
+ }
456
+ this.$l.opticalDepth = pb.add(pb.div(this.sum, taps.length), SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS);
457
+ this.$outputs.color = pb.vec4(pb.sub(1, pb.div(this.opticalDepth, MAX_TRANSMISSION_OPTICAL_DEPTH)));
458
+ });
459
+ });
460
+ });
461
+ }
462
+ });
463
+ program.name = '@TransmissionThickness';
464
+ return program;
465
+ }
466
+ /** Release cached GPU resources. */ dispose() {
467
+ for (const program of this._programs.values()){
468
+ program.dispose();
469
+ }
470
+ this._programs.clear();
471
+ this._bindGroups.clear();
472
+ this._channelStates = null;
473
+ }
474
+ }
475
+
476
+ export { MAX_TRANSMISSION_OPTICAL_DEPTH, TransmissionThicknessRenderer, lightSupportsTransmission };
477
+ //# sourceMappingURL=transmission_thickness_pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transmission_thickness_pass.js","sources":["../../src/render/transmission_thickness_pass.ts"],"sourcesContent":["import { DEPTH_FARTHEST, REVERSE_Z, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { ShadowMapParams } from '../shadow/shadowmapper';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { LIGHT_TYPE_DIRECTIONAL, MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport { ndcToShadowCoord } from '../shaders/shadow';\r\nimport { SHADOW_MASK_LIGHTS_PER_LAYER } from './shadow_mask_pass';\r\nimport {\r\n SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH,\r\n SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT,\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS,\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR,\r\n SSSProfile\r\n} from '../material/sssprofile';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\nconst UNIFORM_NAME_SHADOW_DEPTH = 'Z_UniformShadowDepth';\r\n\r\n/**\r\n * Largest optical depth the transmission profile is defined over.\r\n *\r\n * @remarks\r\n * Re-exported from {@link SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH}: the encoding this\r\n * pass writes (`1 - opticalDepth / MAX`) and the baked profile the BxDF indexes\r\n * with it must agree on the same number, and the profile owns the baking.\r\n *\r\n * The clamp floor and additive bias below are in profile millimetres, not world\r\n * units, so a producer feeding `opticalDepthScale` has to convert.\r\n *\r\n * @internal\r\n */\r\nexport const MAX_TRANSMISSION_OPTICAL_DEPTH = SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH;\r\n\r\n/** Poisson disc the light-space thickness is averaged over. */\r\nconst POISSON_DISC: number[][] = [\r\n [0.25, 0.0],\r\n [-0.31929, 0.292496],\r\n [0.048872, -0.556877],\r\n [0.402444, 0.524918],\r\n [-0.738535, -0.130636],\r\n [0.699605, -0.445031],\r\n [-0.234004, 0.870484],\r\n [-0.446271, -0.859268],\r\n [-0.25, 0.0],\r\n [0.31929, -0.292496],\r\n [-0.048872, 0.556877],\r\n [-0.402444, -0.524918],\r\n [0.738535, 0.130636],\r\n [-0.699605, 0.445031],\r\n [0.234004, -0.870484],\r\n [0.446271, 0.859268]\r\n];\r\n\r\n/** Radius the disc is scaled to, in shadow map texels. */\r\nconst SEARCH_RADIUS_TEXELS = 1;\r\n\r\n/** The offsets actually sampled. A zero radius needs one tap, not sixteen copies of it. */\r\nconst taps: number[][] = SEARCH_RADIUS_TEXELS > 0 ? POISSON_DISC : [[0, 0]];\r\n\r\n/**\r\n * Whether a light can contribute back-lit transmission this frame.\r\n * @internal\r\n */\r\nexport function lightSupportsTransmission(light: PunctualLight, params: Nullable<ShadowMapParams>): boolean {\r\n return !!light.transmission && !!params?.shadowMapFramebuffer?.getDepthAttachment();\r\n}\r\n\r\n/**\r\n * Renders the screen-space light-space thickness used by subsurface transmission.\r\n *\r\n * WebGPU and WebGL2.\r\n *\r\n * @internal\r\n */\r\nexport class TransmissionThicknessRenderer {\r\n private _programs: Map<string, GPUProgram>;\r\n private _bindGroups: Map<string, BindGroup>;\r\n private _channelStates: Nullable<RenderStateSet[]>;\r\n private readonly _nearFar: Vector2;\r\n private readonly _invRenderSize: Vector2;\r\n private readonly _cameraPosition: Vector4;\r\n private readonly _cameraParams: Vector4;\r\n private readonly _profileTexelSize: Vector2;\r\n\r\n constructor() {\r\n this._programs = new Map();\r\n this._bindGroups = new Map();\r\n this._channelStates = null;\r\n this._nearFar = new Vector2();\r\n this._invRenderSize = new Vector2();\r\n this._cameraPosition = new Vector4();\r\n this._cameraParams = new Vector4();\r\n this._profileTexelSize = new Vector2();\r\n }\r\n\r\n /**\r\n * Render light-space thickness for every transmission-enabled light.\r\n *\r\n * @param ctx - Draw context, carrying `shadowMapInfo` for the lights.\r\n * @param depthTexture - Linear depth from the depth prepass.\r\n * @param profileIdTexture - Per-pixel skin profile id from the depth prepass,\r\n * `0` where the pixel is not skin.\r\n * @param lights - Shadow-casting lights in clustered-buffer order, i.e. exactly\r\n * the array {@link ShadowMaskRenderer.render} is given, so that ordinals agree.\r\n * @param getLayerFramebuffer - Resolves the framebuffer for array layer `k`.\r\n */\r\n render(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n profileIdTexture: Texture2D,\r\n lights: PunctualLight[],\r\n getLayerFramebuffer: (layer: number) => FrameBuffer\r\n ): void {\r\n const device = ctx.device;\r\n const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);\r\n if (numLights === 0 || !ctx.shadowMapInfo) {\r\n return;\r\n }\r\n const profileTable = SSSProfile.getTable(device);\r\n if (!profileTable) {\r\n return;\r\n }\r\n const numLayers = Math.ceil(numLights / SHADOW_MASK_LIGHTS_PER_LAYER);\r\n const channelStates = this.getChannelStates(device);\r\n const savedShadowLight = ctx.currentShadowLight;\r\n this._profileTexelSize.setXY(1 / SSSProfile.tableColumns, 1 / SSSProfile.tableRows);\r\n\r\n device.pushDeviceStates();\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n device.setFramebuffer(getLayerFramebuffer(layer));\r\n // 1 encodes zero optical depth, so an untouched channel reads as \"nothing\r\n // in the way\" and contributes no transmission.\r\n device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);\r\n for (let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++) {\r\n const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;\r\n if (ordinal >= numLights) {\r\n break;\r\n }\r\n const light = lights[ordinal];\r\n const shadowMapParams = ctx.shadowMapInfo.get(light) ?? null;\r\n if (!lightSupportsTransmission(light, shadowMapParams)) {\r\n continue;\r\n }\r\n ctx.currentShadowLight = light;\r\n this.renderLightChannel(\r\n ctx,\r\n depthTexture,\r\n profileIdTexture,\r\n profileTable,\r\n shadowMapParams!,\r\n channelStates[channel]\r\n );\r\n }\r\n }\r\n device.popDeviceStates();\r\n ctx.currentShadowLight = savedShadowLight;\r\n }\r\n\r\n private renderLightChannel(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n profileIdTexture: Texture2D,\r\n profileTable: Texture2D,\r\n shadowMapParams: ShadowMapParams,\r\n renderState: RenderStateSet\r\n ): void {\r\n const device = ctx.device;\r\n const key = this.getProgramKey(ctx, shadowMapParams);\r\n let program = this._programs.get(key) ?? null;\r\n if (!program) {\r\n program = this.createProgram(ctx, shadowMapParams);\r\n this._programs.set(key, program);\r\n this._bindGroups.set(key, device.createBindGroup(program.bindGroupLayouts[0]));\r\n }\r\n const bindGroup = this._bindGroups.get(key)!;\r\n this.setUniforms(bindGroup, ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(renderState);\r\n }\r\n\r\n private getProgramKey(ctx: DrawContext, shadowMapParams: ShadowMapParams): string {\r\n const depth = shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()!;\r\n return `${ctx.device.type}|${shadowMapParams.lightType}|${shadowMapParams.numShadowCascades}|${\r\n depth.isTexture2DArray() ? 'array' : depth.isTextureCube() ? 'cube' : '2d'\r\n }`;\r\n }\r\n\r\n private getChannelStates(device: AbstractDevice): RenderStateSet[] {\r\n if (!this._channelStates) {\r\n this._channelStates = [];\r\n for (let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++) {\r\n const rs = device.createRenderStateSet();\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);\r\n this._channelStates.push(rs);\r\n }\r\n }\r\n return this._channelStates;\r\n }\r\n\r\n private setUniforms(\r\n bindGroup: BindGroup,\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n profileIdTexture: Texture2D,\r\n profileTable: Texture2D,\r\n shadowMapParams: ShadowMapParams\r\n ): void {\r\n const camera = ctx.camera;\r\n const light = ctx.currentShadowLight!;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n const cameraPos = camera.getWorldPosition();\r\n this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\r\n this._cameraParams.setXYZW(near, far, 1, 1);\r\n this._nearFar.setXY(near, far);\r\n bindGroup.setValue('camera', {\r\n position: this._cameraPosition,\r\n params: this._cameraParams,\r\n shadowDebugCascades: 0,\r\n framestamp: ctx.device.frameInfo.frameCounter\r\n });\r\n const implParams = new Vector4();\r\n shadowMapParams.impl!.getParams(implParams);\r\n bindGroup.setValue('light', {\r\n sunDir: ctx.sunLight\r\n ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1)\r\n : new Vector4(0, 1, 0, 0).xyz(),\r\n shadowCascades: shadowMapParams.numShadowCascades,\r\n positionAndRange: light.positionAndRange,\r\n directionAndCutoff: light.directionAndCutoff,\r\n diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),\r\n extraParams: light.extraParams,\r\n cascadeDistances: shadowMapParams.cascadeDistances,\r\n depthBiasValues: shadowMapParams.depthBiasValues[0],\r\n shadowCameraParams: shadowMapParams.cameraParams,\r\n depthBiasScales: shadowMapParams.depthBiasScales,\r\n implParams: implParams,\r\n shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),\r\n shadowStrength: light.shadow.shadowStrength,\r\n envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),\r\n envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1\r\n });\r\n // The depth prepass draws with the TAA jitter; take positions back through it\r\n // (see ShadowMaskPass)\r\n bindGroup.setValue(\r\n 'invViewProjMatrix',\r\n ctx.motionVectors ? camera.jitteredInvVPMatrix : camera.invViewProjectionMatrix\r\n );\r\n bindGroup.setValue('cameraNearFar', this._nearFar);\r\n bindGroup.setValue('profileTexelSize', this._profileTexelSize);\r\n this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);\r\n bindGroup.setValue('invRenderSize', this._invRenderSize);\r\n bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('profileIdTex', profileIdTexture, fetchSampler('clamp_nearest_nomip'));\r\n // rgba32f, so WebGPU only accepts a non-filtering sampler; every read is a\r\n // single texel anyway.\r\n bindGroup.setTexture('profileTex', profileTable, fetchSampler('clamp_nearest_nomip'));\r\n const shadowDepth = shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()!;\r\n if (shadowDepth.isTextureCube()) {\r\n // Point sampled, for the reason the 2D maps use textureLoad: see\r\n // zLoadShadowDepth.\r\n bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth, fetchSampler('clamp_nearest_nomip'));\r\n } else {\r\n // Sampled through textureLoad only, so no sampler is bound for it.\r\n bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth);\r\n }\r\n }\r\n\r\n private createProgram(ctx: DrawContext, shadowMapParams: ShadowMapParams): GPUProgram {\r\n const device = ctx.device;\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const lightType = shadowMapParams.lightType;\r\n const depthAttachment = shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()!;\r\n const isArray = depthAttachment.isTexture2DArray();\r\n const cube = depthAttachment.isTextureCube();\r\n const ortho = lightType === LIGHT_TYPE_DIRECTIONAL;\r\n // WebGL2 has no depth texture type that allows a non-comparison read:\r\n // texelFetch is undefined on sampler2DShadow and samplerCubeShadow always\r\n // compares. A depth texture bound to a plain float sampler with compare\r\n // mode off returns its depth in .r, so declare it that way there.\r\n const webgpu = device.type === 'webgpu';\r\n const program = device.buildRenderProgram({\r\n label: 'TransmissionThickness',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n const cameraStruct = pb.defineStruct([\r\n pb.vec4('position'),\r\n pb.vec4('params'),\r\n pb.float('shadowDebugCascades'),\r\n pb.int('framestamp')\r\n ]);\r\n // Must match helper.ts currentShadowLight lightStruct field-for-field:\r\n // ShaderHelper.calculateShadowSpaceVertex and friends read scope.light.\r\n const lightStruct = pb.defineStruct([\r\n pb.vec3('sunDir'),\r\n pb.int('shadowCascades'),\r\n pb.vec4('positionAndRange'),\r\n pb.vec4('directionAndCutoff'),\r\n pb.vec4('diffuseAndIntensity'),\r\n pb.vec4('extraParams'),\r\n pb.vec4('cascadeDistances'),\r\n pb.vec4('depthBiasValues'),\r\n pb.vec4('shadowCameraParams'),\r\n pb.vec4('depthBiasScales'),\r\n pb.vec4('implParams'),\r\n pb.vec4[16]('shadowMatrices'),\r\n pb.float('shadowStrength'),\r\n pb.float('envLightStrength'),\r\n pb.float('envLightSpecularStrength')\r\n ]);\r\n this.camera = cameraStruct().uniform(0);\r\n this.light = lightStruct().uniform(0);\r\n if (webgpu) {\r\n this[UNIFORM_NAME_SHADOW_DEPTH] = cube\r\n ? pb.texCubeShadow().uniform(0)\r\n : (isArray ? pb.tex2DArrayShadow() : pb.tex2DShadow()).uniform(0).noSampler();\r\n } else {\r\n this[UNIFORM_NAME_SHADOW_DEPTH] = (cube ? pb.texCube() : isArray ? pb.tex2DArray() : pb.tex2D())\r\n .sampleType('unfilterable-float')\r\n .uniform(0);\r\n }\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.profileIdTex = pb.tex2D().uniform(0);\r\n // rgba32f, hence unfilterable; every read here is a single texel.\r\n this.profileTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.invViewProjMatrix = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.invRenderSize = pb.vec2().uniform(0);\r\n this.profileTexelSize = pb.vec2().uniform(0);\r\n this.$outputs.color = pb.vec4();\r\n // One texel of a profile row, addressed exactly as skin_brdf.ts does:\r\n // the row is the normalized id and the column is a parameter group.\r\n pb.func('zReadProfile', [pb.float('id'), pb.float('column')], function () {\r\n this.$l.u = pb.mul(pb.add(this.column, 0.5), this.profileTexelSize.x);\r\n this.$l.v = pb.mul(pb.add(pb.mul(pb.clamp(this.id, 0, 1), 255), 0.5), this.profileTexelSize.y);\r\n this.$return(pb.textureSampleLevel(this.profileTex, pb.vec2(this.u, this.v), 0));\r\n });\r\n /**\r\n * Geometric normal from the depth prepass. Transcribed from\r\n * ShadowMaskRenderer: a fullscreen pass has no interpolated normal, and\r\n * the naive cross(ddx, ddy) spans depth discontinuities.\r\n */\r\n pb.func('zReconstructNormal', [pb.vec2('uv'), pb.vec4('center')], function () {\r\n this.$l.dx = pb.vec2(this.invRenderSize.x, 0);\r\n this.$l.dy = pb.vec2(0, this.invRenderSize.y);\r\n const tap = (uv: any) =>\r\n ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.right = tap(pb.add(this.uv, this.dx));\r\n this.$l.left = tap(pb.sub(this.uv, this.dx));\r\n this.$l.up = tap(pb.add(this.uv, this.dy));\r\n this.$l.down = tap(pb.sub(this.uv, this.dy));\r\n this.$l.edgeX = pb.sub(this.right.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(\r\n pb.abs(pb.sub(this.left.w, this.center.w)),\r\n pb.abs(pb.sub(this.right.w, this.center.w))\r\n ),\r\n function () {\r\n this.edgeX = pb.sub(this.center.xyz, this.left.xyz);\r\n }\r\n );\r\n this.$l.edgeY = pb.sub(this.up.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(pb.abs(pb.sub(this.down.w, this.center.w)), pb.abs(pb.sub(this.up.w, this.center.w))),\r\n function () {\r\n this.edgeY = pb.sub(this.center.xyz, this.down.xyz);\r\n }\r\n );\r\n this.$l.n = pb.cross(this.edgeX, this.edgeY);\r\n this.$l.len = pb.length(this.n);\r\n this.$if(pb.lessThan(this.len, 1e-12), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.n = pb.div(this.n, this.len);\r\n this.$l.toEye = pb.sub(this.camera.position.xyz, this.center.xyz);\r\n this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function () {\r\n this.n = pb.neg(this.n);\r\n });\r\n this.$return(this.n);\r\n });\r\n if (!cube) {\r\n pb.func(\r\n 'zLoadShadowDepth',\r\n [pb.vec2('coord'), pb.float('size'), ...(isArray ? [pb.int('layer')] : [])],\r\n function () {\r\n this.$l.texel = pb.ivec2(\r\n pb.clamp(pb.mul(this.coord, this.size), pb.vec2(0), pb.sub(pb.vec2(this.size), pb.vec2(1)))\r\n );\r\n const depth = isArray\r\n ? pb.textureArrayLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, this.layer, 0)\r\n : pb.textureLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, 0);\r\n this.$return(webgpu ? depth : depth.x);\r\n }\r\n );\r\n }\r\n pb.main(function () {\r\n this.$l.pos = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n this.$inputs.uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$outputs.color = pb.vec4(1);\r\n this.$l.profileId = pb.textureSampleLevel(this.profileIdTex, this.$inputs.uv, 0).r;\r\n this.$if(pb.lessThan(this.profileId, 0.5 / 255), function () {\r\n this.$return();\r\n });\r\n this.$l.trParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.transmissionParamColumn));\r\n this.$l.scalingParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.scalingParamColumn));\r\n this.$l.opticalDepthScale = pb.mul(SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT, this.trParams.x);\r\n this.$l.shrinkDistance = pb.mul(this.trParams.y, 0.5 * 0.01, this.scalingParams.x);\r\n this.$l.normalScaleBias = pb.mul(this.shrinkDistance, this.opticalDepthScale);\r\n this.$if(pb.lessThan(this.pos.w, 1), function () {\r\n this.$l.normal = this.zReconstructNormal(this.$inputs.uv, this.pos);\r\n this.$l.split = pb.int(0);\r\n if (numCascades > 1) {\r\n this.$l.linearDepth = pb.mul(this.pos.w, this.camera.params.y);\r\n this.$l.comparison = pb.vec4(\r\n pb.greaterThan(pb.vec4(this.linearDepth), this.light.cascadeDistances)\r\n );\r\n this.$l.cascadeFlags = pb.vec4(\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 0)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 1)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 2)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 3))\r\n );\r\n this.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));\r\n }\r\n this.$l.shrunk = pb.sub(this.pos.xyz, pb.mul(this.normal, this.shrinkDistance));\r\n if (cube) {\r\n this.$l.lv = pb.sub(this.shrunk, this.light.positionAndRange.xyz);\r\n this.$l.maxZ = pb.max(pb.max(pb.abs(this.lv.x), pb.abs(this.lv.y)), pb.abs(this.lv.z));\r\n this.$l.inside = pb.and(\r\n pb.greaterThanEqual(this.maxZ, this.light.shadowCameraParams.x),\r\n pb.lessThanEqual(this.maxZ, this.light.shadowCameraParams.y)\r\n );\r\n } else {\r\n this.$l.sv = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.shrunk, 1),\r\n numCascades > 1 ? this.split : 0\r\n );\r\n this.$l.sc = ndcToShadowCoord(this, pb.div(this.sv, this.sv.w));\r\n this.$l.inside = pb.all(\r\n pb.bvec4(\r\n pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.x, 0), pb.lessThanEqual(this.sc.x, 1))),\r\n pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.y, 0), pb.lessThanEqual(this.sc.y, 1))),\r\n pb.greaterThanEqual(this.sc.z, 0),\r\n pb.lessThanEqual(this.sc.z, 1)\r\n )\r\n );\r\n }\r\n this.$if(this.inside, function () {\r\n this.$l.size = this.light.shadowCameraParams.z;\r\n if (cube) {\r\n this.$l.receiverDist = pb.length(this.lv);\r\n this.$l.dir = pb.div(this.lv, this.receiverDist);\r\n this.$l.onCube = pb.div(this.lv, this.maxZ);\r\n this.$l.helper = this.$choice(\r\n pb.lessThan(pb.abs(this.dir.y), 0.99),\r\n pb.vec3(0, 1, 0),\r\n pb.vec3(1, 0, 0)\r\n );\r\n this.$l.side = pb.normalize(pb.cross(this.helper, this.dir));\r\n this.$l.up = pb.cross(this.dir, this.side);\r\n if (SEARCH_RADIUS_TEXELS > 0) {\r\n this.$l.radius = pb.div(2 * SEARCH_RADIUS_TEXELS, this.size);\r\n }\r\n } else if (SEARCH_RADIUS_TEXELS > 0) {\r\n this.$l.radius = pb.div(SEARCH_RADIUS_TEXELS, this.size);\r\n }\r\n if (ortho) {\r\n this.$l.zRow = this.light.shadowMatrices.at(pb.add(pb.mul(this.split, 4), 2));\r\n this.$l.zRange = pb.div(REVERSE_Z ? 1 : 2, pb.max(pb.length(this.zRow.xyz), 1e-8));\r\n }\r\n this.$l.sum = pb.float(0);\r\n for (let i = 0; i < taps.length; i++) {\r\n if (cube) {\r\n this.$l[`u${i}`] =\r\n SEARCH_RADIUS_TEXELS > 0\r\n ? pb.add(\r\n this.onCube,\r\n pb.mul(\r\n pb.add(pb.mul(this.side, taps[i][0]), pb.mul(this.up, taps[i][1])),\r\n this.radius\r\n )\r\n )\r\n : this.onCube;\r\n this.$l[`b${i}`] = pb.textureSampleLevel(\r\n this[UNIFORM_NAME_SHADOW_DEPTH],\r\n this[`u${i}`],\r\n 0\r\n ).x;\r\n this.$l[`m${i}`] = pb.max(\r\n pb.max(pb.abs(this[`u${i}`].x), pb.abs(this[`u${i}`].y)),\r\n pb.abs(this[`u${i}`].z)\r\n );\r\n this.$l[`t${i}`] = pb.sub(\r\n this.receiverDist,\r\n pb.mul(\r\n ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams),\r\n pb.div(pb.length(this[`u${i}`]), this[`m${i}`])\r\n )\r\n );\r\n } else {\r\n this.$l[`c${i}`] =\r\n SEARCH_RADIUS_TEXELS > 0\r\n ? pb.add(this.sc.xy, pb.mul(pb.vec2(taps[i][0], taps[i][1]), this.radius))\r\n : this.sc.xy;\r\n this.$l[`b${i}`] = isArray\r\n ? this.zLoadShadowDepth(this[`c${i}`], this.size, this.split)\r\n : this.zLoadShadowDepth(this[`c${i}`], this.size);\r\n // Under reverse-Z a blocker sits at a larger depth value.\r\n this.$l[`d${i}`] = REVERSE_Z\r\n ? pb.sub(this[`b${i}`], this.sc.z)\r\n : pb.sub(this.sc.z, this[`b${i}`]);\r\n if (ortho) {\r\n this.$l[`t${i}`] = pb.mul(this[`d${i}`], this.zRange);\r\n } else {\r\n this.$l[`t${i}`] = pb.sub(\r\n ShaderHelper.nonLinearDepthToLinear(this, this.sc.z, this.light.shadowCameraParams),\r\n ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams)\r\n );\r\n }\r\n }\r\n this.$l[`o${i}`] = pb.mul(this[`t${i}`], this.opticalDepthScale);\r\n this.$l[`k${i}`] = pb.clamp(\r\n pb.max(pb.add(this[`o${i}`], this.normalScaleBias), 0),\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR,\r\n MAX_TRANSMISSION_OPTICAL_DEPTH\r\n );\r\n this.sum = pb.add(this.sum, this[`k${i}`]);\r\n }\r\n this.$l.opticalDepth = pb.add(\r\n pb.div(this.sum, taps.length),\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS\r\n );\r\n this.$outputs.color = pb.vec4(\r\n pb.sub(1, pb.div(this.opticalDepth, MAX_TRANSMISSION_OPTICAL_DEPTH))\r\n );\r\n });\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@TransmissionThickness';\r\n return program;\r\n }\r\n\r\n /** Release cached GPU resources. */\r\n dispose(): void {\r\n for (const program of this._programs.values()) {\r\n program.dispose();\r\n }\r\n this._programs.clear();\r\n this._bindGroups.clear();\r\n this._channelStates = null;\r\n }\r\n}\r\n"],"names":["UNIFORM_NAME_SHADOW_DEPTH","MAX_TRANSMISSION_OPTICAL_DEPTH","SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH","POISSON_DISC","SEARCH_RADIUS_TEXELS","taps","lightSupportsTransmission","light","params","transmission","shadowMapFramebuffer","getDepthAttachment","TransmissionThicknessRenderer","_programs","_bindGroups","_channelStates","_nearFar","_invRenderSize","_cameraPosition","_cameraParams","_profileTexelSize","Map","Vector2","Vector4","render","ctx","depthTexture","profileIdTexture","lights","getLayerFramebuffer","device","numLights","Math","min","length","MAX_SHADOW_MASK_LIGHTS","shadowMapInfo","profileTable","SSSProfile","getTable","numLayers","ceil","SHADOW_MASK_LIGHTS_PER_LAYER","channelStates","getChannelStates","savedShadowLight","currentShadowLight","setXY","tableColumns","tableRows","pushDeviceStates","layer","setFramebuffer","clearFrameBuffer","channel","ordinal","shadowMapParams","get","renderLightChannel","popDeviceStates","renderState","key","getProgramKey","program","createProgram","set","createBindGroup","bindGroupLayouts","bindGroup","setUniforms","setProgram","setBindGroup","drawFullscreenQuad","depth","type","lightType","numShadowCascades","isTexture2DArray","isTextureCube","c","rs","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","useColorState","setColorMask","push","camera","near","getNearPlane","far","getFarPlane","cameraPos","getWorldPosition","setXYZW","x","y","z","setValue","position","shadowDebugCascades","framestamp","frameInfo","frameCounter","implParams","impl","getParams","sunDir","sunLight","directionAndCutoff","xyz","scaleBy","shadowCascades","positionAndRange","diffuseAndIntensity","ShaderHelper","getPreExposedColorIntensity","extraParams","cascadeDistances","depthBiasValues","shadowCameraParams","cameraParams","depthBiasScales","shadowMatrices","Float32Array","shadowStrength","shadow","envLightStrength","getEnvLightLuminance","envLightSpecularStrength","env","specularStrength","motionVectors","jitteredInvVPMatrix","invViewProjectionMatrix","width","height","setTexture","fetchSampler","shadowDepth","numCascades","depthAttachment","isArray","cube","ortho","LIGHT_TYPE_DIRECTIONAL","webgpu","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","vec4","DEPTH_FARTHEST","add","mul","xy","neg","fragment","cameraStruct","defineStruct","float","int","lightStruct","vec3","uniform","texCubeShadow","tex2DArrayShadow","tex2DShadow","noSampler","texCube","tex2DArray","tex2D","sampleType","depthTex","profileIdTex","profileTex","invViewProjMatrix","mat4","cameraNearFar","invRenderSize","profileTexelSize","color","func","$l","u","column","v","clamp","id","$return","textureSampleLevel","dx","dy","tap","samplePositionFromDepth","right","left","sub","up","down","edgeX","center","$if","lessThan","abs","w","edgeY","n","cross","len","div","toEye","dot","texel","ivec2","coord","size","textureArrayLoad","textureLoad","profileId","r","trParams","zReadProfile","transmissionParamColumn","scalingParams","scalingParamColumn","opticalDepthScale","SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT","shrinkDistance","normalScaleBias","normal","zReconstructNormal","split","linearDepth","comparison","greaterThan","cascadeFlags","shrunk","lv","maxZ","max","inside","and","greaterThanEqual","lessThanEqual","sv","calculateShadowSpaceVertex","sc","ndcToShadowCoord","all","bvec4","bvec2","receiverDist","dir","onCube","helper","$choice","side","normalize","radius","zRow","at","zRange","REVERSE_Z","sum","i","nonLinearDepthToLinear","zLoadShadowDepth","SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR","opticalDepth","SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS","name","dispose","values","clear"],"mappings":"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"}