@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 @@
1
+ {"version":3,"file":"voxel_scene.js","sources":["../../../src/render/gi/voxel_scene.ts"],"sourcesContent":["import type { BindGroup, GPUDataBuffer, GPUProgram, Texture2D, Texture3D } from '@zephyr3d/device';\r\nimport type { Nullable, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { AABB } from '@zephyr3d/base';\r\nimport { getDevice } from '../../app/api';\r\nimport type { Scene } from '../../scene/scene';\r\nimport type { Mesh } from '../../scene/mesh';\r\nimport type { SceneSDF, SDFInstance } from '../sdf/scene_sdf';\r\nimport type { GlobalSDF, GlobalSDFMaterials } from '../sdf/global_sdf';\r\nimport type { Primitive } from '../primitive';\r\nimport type { MeshMaterial } from '../../material/meshmaterial';\r\nimport { VoxelMaterialAtlas } from './voxel_atlas';\r\nimport type { VoxelAtlasSlot } from './voxel_atlas';\r\nimport { Voxelizer } from './voxelize_pass';\r\nimport { VoxelLighting } from './voxel_lighting';\r\nimport type { VoxelLightingOptions } from './voxel_lighting';\r\nimport type { Camera } from '../../camera/camera';\r\nimport { buildSDFProgram } from '../sdf/sdf_programs';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { declareDynamicSDFUniforms, declareGlobalSDFUniforms } from '../../shaders/sdf';\r\nimport {\r\n declareVoxelSceneUniforms,\r\n loadVoxelSceneAlbedo,\r\n loadVoxelSceneEmissive,\r\n VOXEL_SCENE_ALBEDO,\r\n VOXEL_SCENE_ANISO0,\r\n VOXEL_SCENE_ANISO1,\r\n VOXEL_SCENE_EMISSIVE,\r\n VOXEL_SCENE_RADIANCE,\r\n voxelSceneTexel\r\n} from '../../shaders/gi';\r\n\r\n/** Most points per {@link VoxelScene.queryVoxels} call. */\r\nconst MAX_QUERY_POINTS = 1024;\r\n\r\n/**\r\n * What the voxel scene holds at a world position, see {@link VoxelScene.queryVoxels}.\r\n * @public\r\n */\r\nexport interface VoxelSceneSample {\r\n /** Clipmap level of the material voxel holding the position, -1 where none does with a current brick. */\r\n level: number;\r\n /** Albedo, and in `a` 1 where a surface's material was composited into the voxel. */\r\n albedo: [number, number, number, number];\r\n emissive: [number, number, number];\r\n /** Outgoing radiance summed over the voxel's faces, at the cache exposure; zeros before the first lighting. */\r\n radiance: [number, number, number];\r\n}\r\n\r\n/** Seconds a material's uniforms must have been stable before it is voxelized again. */\r\nconst REVOXELIZE_COOLDOWN = 0.5;\r\n/** Seconds an entry nobody wants is kept before it is forgotten. */\r\nconst ENTRY_LIFETIME = 30;\r\n\r\ninterface VoxelMaterialEntry {\r\n key: string;\r\n primitive: Primitive;\r\n /** The material drawn: the mesh's own, or a copy of its core carrying a material instance's values. */\r\n material: MeshMaterial;\r\n /** True when `material` is such a copy, owned by the entry. */\r\n ownsMaterial: boolean;\r\n /** The mesh's own material, whose edits are watched. */\r\n source: MeshMaterial;\r\n /** Voxels per axis of the material field, half the baked field's. */\r\n resolution: [number, number, number];\r\n /** Lower corner of the field box in the mesh's local space. */\r\n boxMin: [number, number, number];\r\n /** Edge of a material voxel in local units. */\r\n voxelSize: number;\r\n state: 'pending' | 'ready' | 'failed';\r\n /** True while the atlas region holds a voxelization, possibly stale; kept until redone so the mesh's colour never drops out. */\r\n voxelized: boolean;\r\n /** {@link materialTagOf} the source when it was last voxelized. */\r\n materialTag: string;\r\n lastWanted: number;\r\n readyTime: number;\r\n /** {@link VoxelMaterialAtlas.version} when it last found no room, or -1. */\r\n failedVersion: number;\r\n}\r\n\r\n/**\r\n * Counters of a {@link VoxelScene}, for tools and debugging.\r\n * @public\r\n */\r\nexport interface VoxelSceneStats {\r\n /** (primitive, material) pairs known. */\r\n entries: number;\r\n ready: number;\r\n pending: number;\r\n failed: number;\r\n atlasResident: number;\r\n atlasOccupancy: number;\r\n /** Times a wanted mesh did not fit even after evicting. */\r\n atlasFull: number;\r\n /** Voxelizations so far. */\r\n voxelizations: number;\r\n /** Voxelizations by the last update. */\r\n lastVoxelizations: number;\r\n /** Lighting passes run so far. */\r\n lightingPasses: number;\r\n}\r\n\r\n/**\r\n * Material side of the scene's voxel representation: each static mesh in the scene SDF\r\n * is rasterized once per (primitive, material) into a {@link VoxelMaterialAtlas}, and\r\n * global SDF compositing carries the nearest mesh's albedo and emissive into two clipmaps\r\n * laid out like the field at half its resolution, giving GI ray hits their colour.\r\n *\r\n * Voxelizations are budgeted per frame, nearest first, and redone on material change.\r\n * Materials that cannot be voxelized (see {@link MeshMaterial.supportsVoxelization}) are\r\n * skipped. The terrain's albedo comes from its top-down capture, see TerrainGIAlbedo. WebGPU only.\r\n *\r\n * @public\r\n */\r\nexport class VoxelScene implements GlobalSDFMaterials {\r\n /** Meshes voxelized per frame. */\r\n voxelizeBudget: number;\r\n readonly atlas: VoxelMaterialAtlas;\r\n private readonly _scene: Scene;\r\n private _voxelizer: Nullable<Voxelizer>;\r\n private _lighting: Nullable<VoxelLighting>;\r\n private _albedo: Nullable<Texture3D>;\r\n private _emissive: Nullable<Texture3D>;\r\n private _resolution: number;\r\n private _levels: number;\r\n private readonly _entries: Map<string, VoxelMaterialEntry>;\r\n private _time: number;\r\n private _atlasFull: number;\r\n private _atlasFullWarned: boolean;\r\n private _voxelizations: number;\r\n private _lastVoxelizations: number;\r\n private _queryProgram: Nullable<GPUProgram>;\r\n private _queryLevels: number;\r\n private _queryBindGroup: Nullable<BindGroup>;\r\n private _queryPoints: Nullable<GPUDataBuffer>;\r\n private _queryOutput: Nullable<Texture2D>;\r\n private _queryChain: Promise<unknown>;\r\n constructor(scene: Scene, atlasSize = 256) {\r\n this._scene = scene;\r\n this.voxelizeBudget = 8;\r\n this.atlas = new VoxelMaterialAtlas([atlasSize, atlasSize, atlasSize]);\r\n this._voxelizer = null;\r\n this._lighting = null;\r\n this._albedo = null;\r\n this._emissive = null;\r\n this._resolution = 0;\r\n this._levels = 0;\r\n this._entries = new Map();\r\n this._time = 0;\r\n this._atlasFull = 0;\r\n this._atlasFullWarned = false;\r\n this._voxelizations = 0;\r\n this._lastVoxelizations = 0;\r\n this._queryProgram = null;\r\n this._queryLevels = 0;\r\n this._queryBindGroup = null;\r\n this._queryPoints = null;\r\n this._queryOutput = null;\r\n this._queryChain = Promise.resolve();\r\n }\r\n get atlasAlbedo() {\r\n return this.atlas.albedo;\r\n }\r\n get atlasEmissive() {\r\n return this.atlas.emissive;\r\n }\r\n get atlasSize() {\r\n return this.atlas.size;\r\n }\r\n /** Albedo clipmap: rgba8unorm, levels stacked along z, rgb the albedo and a = 1 where a surface is. */\r\n get albedo() {\r\n if (!this._albedo) {\r\n throw new Error('VoxelScene: no clipmap before the first update');\r\n }\r\n return this._albedo;\r\n }\r\n /** Emissive clipmap: rgba16float, levels stacked along z. */\r\n get emissive() {\r\n if (!this._emissive) {\r\n throw new Error('VoxelScene: no clipmap before the first update');\r\n }\r\n return this._emissive;\r\n }\r\n /** Outgoing radiance clipmap: rgba16float, laid out like the albedo; see {@link VoxelLighting}. */\r\n get radiance() {\r\n if (!this._lighting?.ready) {\r\n throw new Error('VoxelScene: no radiance before the first lighting update');\r\n }\r\n return this._lighting.radiance;\r\n }\r\n /** Share of the radiance each voxel face carries, (+x, +y, +z, -x); see declareVoxelSceneUniforms. */\r\n get radianceAniso0() {\r\n if (!this._lighting?.ready) {\r\n throw new Error('VoxelScene: no radiance before the first lighting update');\r\n }\r\n return this._lighting.aniso0;\r\n }\r\n /** Share of the radiance each voxel face carries, (-y, -z) in rg. */\r\n get radianceAniso1() {\r\n if (!this._lighting?.ready) {\r\n throw new Error('VoxelScene: no radiance before the first lighting update');\r\n }\r\n return this._lighting.aniso1;\r\n }\r\n /** True once the radiance clipmap exists. */\r\n get lit() {\r\n return !!this._lighting?.ready;\r\n }\r\n /** Voxels per axis of a clipmap level, half the field's. */\r\n get resolution() {\r\n return this._resolution;\r\n }\r\n get levels() {\r\n return this._levels;\r\n }\r\n /** True once the clipmaps exist. */\r\n get ready() {\r\n return !!this._albedo;\r\n }\r\n getSlot(inst: SDFInstance): Nullable<VoxelAtlasSlot> {\r\n const key = keyOf(inst.mesh);\r\n const entry = key ? this._entries.get(key) : null;\r\n return entry && entry.voxelized ? this.atlas.getSlot(entry) : null;\r\n }\r\n /**\r\n * How the voxel scene holds an instance's material, for tools: `unsupported` when it\r\n * never will, `unknown` before first wanted, else the voxelization state and atlas slot.\r\n */\r\n describeInstance(inst: SDFInstance): {\r\n state: 'unsupported' | 'unknown' | VoxelMaterialEntry['state'];\r\n voxelized: boolean;\r\n slot: Nullable<VoxelAtlasSlot>;\r\n } {\r\n const mesh = inst.mesh;\r\n const primitive = mesh.primitive;\r\n const material = mesh.material;\r\n if (\r\n !primitive ||\r\n !material ||\r\n primitive.primitiveType !== 'triangle-list' ||\r\n !material.supportsVoxelization()\r\n ) {\r\n return { state: 'unsupported', voxelized: false, slot: null };\r\n }\r\n const key = keyOf(mesh);\r\n const entry = key ? this._entries.get(key) : null;\r\n if (!entry) {\r\n return { state: 'unknown', voxelized: false, slot: null };\r\n }\r\n return { state: entry.state, voxelized: entry.voxelized, slot: this.atlas.getSlot(entry) };\r\n }\r\n getStats(): VoxelSceneStats {\r\n const stats: VoxelSceneStats = {\r\n entries: this._entries.size,\r\n ready: 0,\r\n pending: 0,\r\n failed: 0,\r\n atlasResident: this.atlas.count,\r\n atlasOccupancy: this.atlas.occupancy,\r\n atlasFull: this._atlasFull,\r\n voxelizations: this._voxelizations,\r\n lastVoxelizations: this._lastVoxelizations,\r\n lightingPasses: this._lighting?.passes ?? 0\r\n };\r\n for (const entry of this._entries.values()) {\r\n stats[entry.state]++;\r\n }\r\n return stats;\r\n }\r\n /**\r\n * Voxelizes meshes that entered the scene field, nearest first within the budget.\r\n * Called once a frame, before the field's own update.\r\n */\r\n update(sdf: SceneSDF, cameraPos: Vector3, deltaSeconds: number) {\r\n const global = sdf.enabled ? sdf.global : null;\r\n if (!global) {\r\n return;\r\n }\r\n this._time += deltaSeconds;\r\n this.ensureClipmaps(global);\r\n if (global.materials !== this) {\r\n global.materials = this;\r\n }\r\n const wanted = new Map<VoxelMaterialEntry, number>();\r\n for (const inst of sdf.instances) {\r\n if (inst.mode !== 'static') {\r\n continue;\r\n }\r\n const header = inst.asset?.state === 'ready' ? inst.asset.header : null;\r\n if (!header) {\r\n continue;\r\n }\r\n const mesh = inst.mesh;\r\n const primitive = mesh.primitive;\r\n const material = mesh.material;\r\n const key = keyOf(mesh);\r\n if (\r\n !key ||\r\n !primitive ||\r\n !material ||\r\n primitive.primitiveType !== 'triangle-list' ||\r\n !material.supportsVoxelization()\r\n ) {\r\n continue;\r\n }\r\n let entry = this._entries.get(key);\r\n if (!entry) {\r\n const resolved = resolveMaterial(material);\r\n entry = {\r\n key,\r\n primitive,\r\n material: resolved.material,\r\n ownsMaterial: resolved.owned,\r\n source: material,\r\n resolution: header.resolution.map((v) => Math.max(1, Math.ceil(v / 2))) as [number, number, number],\r\n boxMin: [...header.boxMin],\r\n voxelSize: header.voxelSize * 2,\r\n state: 'pending',\r\n voxelized: false,\r\n materialTag: '',\r\n lastWanted: 0,\r\n readyTime: -Infinity,\r\n failedVersion: -1\r\n };\r\n this._entries.set(key, entry);\r\n }\r\n entry.lastWanted = this._time;\r\n // A material edit shows up in its change tag; wait for the edits to settle\r\n if (\r\n entry.state === 'ready' &&\r\n entry.materialTag !== materialTagOf(material) &&\r\n this._time - entry.readyTime > REVOXELIZE_COOLDOWN\r\n ) {\r\n entry.state = 'pending';\r\n }\r\n const d = distanceToBox(cameraPos, inst.bounds);\r\n const prev = wanted.get(entry);\r\n wanted.set(entry, prev === undefined ? d : Math.min(prev, d));\r\n }\r\n const candidates = [...wanted.entries()]\r\n .filter((e) => e[0].state === 'pending' && e[0].failedVersion !== this.atlas.version)\r\n .sort((a, b) => a[1] - b[1])\r\n .map((e) => e[0]);\r\n let done = 0;\r\n for (const entry of candidates) {\r\n if (done >= this.voxelizeBudget) {\r\n break;\r\n }\r\n const slot = this.atlas.getSlot(entry) ?? this.place(entry, wanted);\r\n if (!slot) {\r\n continue;\r\n }\r\n if (entry.ownsMaterial) {\r\n // A copy carries the values of its making; take them again\r\n entry.material.dispose();\r\n const resolved = resolveMaterial(entry.source);\r\n entry.material = resolved.material;\r\n entry.ownsMaterial = resolved.owned;\r\n }\r\n const ok = this.voxelizer.voxelize(entry.primitive, entry.material, {\r\n albedo: this.atlas.albedo,\r\n emissive: this.atlas.emissive,\r\n slot,\r\n boxMin: entry.boxMin,\r\n voxelSize: entry.voxelSize\r\n });\r\n entry.state = ok ? 'ready' : 'failed';\r\n entry.voxelized = ok;\r\n entry.materialTag = materialTagOf(entry.source);\r\n entry.readyTime = this._time;\r\n done++;\r\n this._voxelizations++;\r\n this.dirtyInstances(sdf, global, entry.key);\r\n }\r\n this._lastVoxelizations = done;\r\n // Entries nobody has wanted for a while are forgotten\r\n for (const entry of this._entries.values()) {\r\n if (!wanted.has(entry) && this._time - entry.lastWanted > ENTRY_LIFETIME) {\r\n this.atlas.remove(entry);\r\n this._entries.delete(entry.key);\r\n if (entry.ownsMaterial) {\r\n entry.material.dispose();\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Lights the next slab of voxels. Called once a frame after the field's update,\r\n * which composites the materials it reads.\r\n */\r\n updateLighting(sdf: SceneSDF, camera: Camera, options: VoxelLightingOptions) {\r\n const global = sdf.enabled ? sdf.global : null;\r\n if (!global || !this._albedo || !this._emissive) {\r\n return;\r\n }\r\n if (!this._lighting) {\r\n this._lighting = new VoxelLighting(this._scene);\r\n }\r\n this._lighting.update(global, this._albedo, this._emissive, this._resolution, camera, options);\r\n }\r\n /** Stops the global field compositing materials, when it still composites this. */\r\n detach(sdf: SceneSDF) {\r\n const global = sdf.enabled ? sdf.global : null;\r\n if (global && global.materials === this) {\r\n global.materials = null;\r\n }\r\n }\r\n /**\r\n * Reads back what the clipmaps hold at world positions, as a GI ray hit would; resolves\r\n * a frame or two later. For tools, at most 1024 points.\r\n */\r\n queryVoxels(global: GlobalSDF, points: Vector3[]): Promise<VoxelSceneSample[]> {\r\n const run = async () => {\r\n const n = Math.min(points.length, MAX_QUERY_POINTS);\r\n if (n === 0 || !this._albedo || !this._emissive) {\r\n return [];\r\n }\r\n const device = getDevice();\r\n const pixels = new Float32Array(MAX_QUERY_POINTS * 4 * 3);\r\n // Recorded at the start of a frame, as the field's distance queries are\r\n await device.runNextFrameAsync(async () => {\r\n if (!this._queryProgram || this._queryLevels !== global.levels) {\r\n this._queryProgram?.dispose();\r\n this._queryBindGroup?.dispose();\r\n this._queryProgram = this.createQueryProgram(global.levels);\r\n this._queryLevels = global.levels;\r\n this._queryBindGroup = device.createBindGroup(this._queryProgram.bindGroupLayouts[0]);\r\n }\r\n if (!this._queryPoints) {\r\n this._queryPoints = device.createBuffer(MAX_QUERY_POINTS * 16, { usage: 'uniform', storage: true });\r\n this._queryOutput = device.createTexture2D('rgba32f', MAX_QUERY_POINTS, 3, {\r\n mipmapping: false,\r\n writable: true\r\n })!;\r\n }\r\n const data = new Float32Array(MAX_QUERY_POINTS * 4);\r\n for (let i = 0; i < n; i++) {\r\n data.set([points[i].x, points[i].y, points[i].z, 0], i * 4);\r\n }\r\n this._queryPoints.bufferSubData(0, data);\r\n const bg = this._queryBindGroup!;\r\n global.applyBindGroup(bg);\r\n const lit = this.lit;\r\n const nearest = fetchSampler('clamp_nearest_nomip');\r\n bg.setTexture(VOXEL_SCENE_ALBEDO, this._albedo!, nearest);\r\n bg.setTexture(VOXEL_SCENE_EMISSIVE, this._emissive!, nearest);\r\n // Before the first lighting any volume of the layout stands in, the radiance read as zero\r\n bg.setTexture(VOXEL_SCENE_RADIANCE, lit ? this.radiance : this._emissive!, nearest);\r\n bg.setTexture(VOXEL_SCENE_ANISO0, lit ? this.radianceAniso0 : this._albedo!, nearest);\r\n bg.setTexture(VOXEL_SCENE_ANISO1, lit ? this.radianceAniso1 : this._albedo!, nearest);\r\n bg.setBuffer('points', this._queryPoints);\r\n bg.setTexture('result', this._queryOutput!);\r\n bg.setValue('count', new Vector4(n, lit ? 1 : 0, 0, 0));\r\n device.setProgram(this._queryProgram);\r\n device.setBindGroup(0, bg);\r\n device.compute(Math.ceil(n / 64), 1, 1);\r\n const read = this._queryOutput!.readPixels(0, 0, MAX_QUERY_POINTS, 3, 0, 0, pixels);\r\n device.flush();\r\n await read;\r\n });\r\n const row = MAX_QUERY_POINTS * 4;\r\n return Array.from({ length: n }, (_, i): VoxelSceneSample => {\r\n const a = pixels.subarray(i * 4, i * 4 + 4);\r\n const e = pixels.subarray(row + i * 4, row + i * 4 + 4);\r\n const r = pixels.subarray(2 * row + i * 4, 2 * row + i * 4 + 4);\r\n return {\r\n level: Math.round(e[3]),\r\n albedo: [a[0], a[1], a[2], a[3]],\r\n emissive: [e[0], e[1], e[2]],\r\n radiance: [r[0], r[1], r[2]]\r\n };\r\n });\r\n };\r\n const next = this._queryChain.then(run, run);\r\n this._queryChain = next.catch(() => undefined);\r\n return next;\r\n }\r\n dispose() {\r\n this._queryProgram?.dispose();\r\n this._queryBindGroup?.dispose();\r\n this._queryPoints?.dispose();\r\n this._queryOutput?.dispose();\r\n this._queryProgram = null;\r\n this._queryBindGroup = null;\r\n this._queryPoints = null;\r\n this._queryOutput = null;\r\n this._voxelizer?.dispose();\r\n this._voxelizer = null;\r\n this._lighting?.dispose();\r\n this._lighting = null;\r\n this.atlas.dispose();\r\n this._albedo?.dispose();\r\n this._emissive?.dispose();\r\n this._albedo = null;\r\n this._emissive = null;\r\n for (const entry of this._entries.values()) {\r\n if (entry.ownsMaterial) {\r\n entry.material.dispose();\r\n }\r\n }\r\n this._entries.clear();\r\n }\r\n /** @internal */\r\n private createQueryProgram(levels: number) {\r\n return buildSDFProgram({\r\n label: 'VoxelSceneQuery',\r\n workgroupSize: [64, 1, 1],\r\n compute(pb) {\r\n this.points = pb.vec4[0]().storageBufferReadonly(0);\r\n // (point count, 1 once lit)\r\n this.count = pb.vec4().uniform(0);\r\n this.result = pb.texStorage2D.rgba32float().storage(0);\r\n declareGlobalSDFUniforms(this, 0, levels);\r\n declareDynamicSDFUniforms(this, 0);\r\n declareVoxelSceneUniforms(this, 0);\r\n pb.main(function () {\r\n this.$l.i = this.$builtins.globalInvocationId.x;\r\n this.$if(pb.lessThan(this.i, pb.uint(this.count.x)), function () {\r\n this.$l.texel = voxelSceneTexel(this, this.points.at(this.i).xyz, levels);\r\n this.$l.radiance = pb.vec3(0);\r\n this.$if(\r\n pb.and(pb.greaterThanEqual(this.texel.w, 0), pb.greaterThan(this.count.y, 0)),\r\n function () {\r\n this.radiance = pb.textureLoad(this[VOXEL_SCENE_RADIANCE], this.texel.xyz, 0).rgb;\r\n }\r\n );\r\n pb.textureStore(this.result, pb.uvec2(this.i, 0), loadVoxelSceneAlbedo(this, this.texel));\r\n pb.textureStore(\r\n this.result,\r\n pb.uvec2(this.i, 1),\r\n pb.vec4(loadVoxelSceneEmissive(this, this.texel), pb.float(this.texel.w))\r\n );\r\n pb.textureStore(this.result, pb.uvec2(this.i, 2), pb.vec4(this.radiance, 0));\r\n });\r\n });\r\n }\r\n })!;\r\n }\r\n /** @internal */\r\n private get voxelizer() {\r\n if (!this._voxelizer) {\r\n this._voxelizer = new Voxelizer(this._scene);\r\n }\r\n return this._voxelizer;\r\n }\r\n /** @internal */\r\n private ensureClipmaps(global: GlobalSDF) {\r\n const resolution = global.resolution / 2;\r\n if (this._albedo && this._resolution === resolution && this._levels === global.levels) {\r\n return;\r\n }\r\n this._albedo?.dispose();\r\n this._emissive?.dispose();\r\n const device = getDevice();\r\n this._resolution = resolution;\r\n this._levels = global.levels;\r\n this._albedo = device.createTexture3D('rgba8unorm', resolution, resolution, resolution * global.levels, {\r\n mipmapping: false,\r\n writable: true\r\n })!;\r\n this._albedo.name = '@VoxelSceneAlbedo';\r\n this._emissive = device.createTexture3D('rgba16f', resolution, resolution, resolution * global.levels, {\r\n mipmapping: false,\r\n writable: true\r\n })!;\r\n this._emissive.name = '@VoxelSceneEmissive';\r\n // The field must write the new textures everywhere\r\n if (global.materials === this) {\r\n global.materials = null;\r\n global.materials = this;\r\n }\r\n }\r\n /**\r\n * A slot for an entry, evicting unwanted meshes then farther wanted ones when full.\r\n * Nearer meshes are never evicted for it, so meshes that don't all fit don't thrash.\r\n * @internal\r\n */\r\n private place(entry: VoxelMaterialEntry, wanted: Map<VoxelMaterialEntry, number>) {\r\n let slot = this.atlas.add(entry, entry.resolution);\r\n if (slot) {\r\n return slot;\r\n }\r\n const resident = [...this._entries.values()].filter((e) => e !== entry && this.atlas.getSlot(e));\r\n const dist = wanted.get(entry)!;\r\n const kept = resident.filter((e) => wanted.has(e) && wanted.get(e)! <= dist);\r\n if (!this.atlas.fits([entry.resolution, ...kept.map((e) => e.resolution)])) {\r\n this.fail(entry);\r\n return null;\r\n }\r\n const victims = [\r\n ...resident.filter((e) => !wanted.has(e)).sort((a, b) => a.lastWanted - b.lastWanted),\r\n ...resident.filter((e) => wanted.get(e)! > dist).sort((a, b) => wanted.get(b)! - wanted.get(a)!)\r\n ];\r\n for (const victim of victims) {\r\n this.atlas.remove(victim);\r\n victim.state = 'pending';\r\n victim.voxelized = false;\r\n slot = this.atlas.add(entry, entry.resolution);\r\n if (slot) {\r\n return slot;\r\n }\r\n }\r\n // Fits packed afresh but not around the freed gaps: repack, re-rasterizing only those moved\r\n const moved = this.atlas.repack([entry, ...kept].map((e) => ({ key: e, resolution: e.resolution })));\r\n if (moved) {\r\n for (const e of this._entries.values()) {\r\n if (e !== entry && e.voxelized && (moved.has(e) || !this.atlas.getSlot(e))) {\r\n e.voxelized = false;\r\n e.state = 'pending';\r\n }\r\n }\r\n return this.atlas.getSlot(entry);\r\n }\r\n this.fail(entry);\r\n return null;\r\n }\r\n /** Records an entry that found no room, not to be tried until the atlas changes. @internal */\r\n private fail(entry: VoxelMaterialEntry) {\r\n entry.failedVersion = this.atlas.version;\r\n this._atlasFull++;\r\n if (!this._atlasFullWarned) {\r\n this._atlasFullWarned = true;\r\n const s = this.atlas.size;\r\n console.warn(\r\n `VoxelScene: the materials of the meshes in the scene field do not fit the ${s.join('×')} material atlas; the farthest are left out and read black where global illumination rays hit them. Raise SceneGI.atlasSize.`\r\n );\r\n }\r\n }\r\n /** Rebuilds the field around every instance drawing a (primitive, material). @internal */\r\n private dirtyInstances(sdf: SceneSDF, global: GlobalSDF, key: string) {\r\n for (const inst of sdf.instances) {\r\n if (inst.mode === 'static' && keyOf(inst.mesh) === key && boxValid(inst.bounds)) {\r\n global.markDirty(inst.bounds.minPoint, inst.bounds.maxPoint);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Identity of what a mesh voxelizes to: primitive plus core material, with a material\r\n * instance's overridden uniform values appended so differently tinted instances differ.\r\n */\r\nfunction keyOf(mesh: Mesh): Nullable<string> {\r\n const primitive = mesh.primitive;\r\n const material = mesh.material;\r\n if (!primitive || !material) {\r\n return null;\r\n }\r\n const core = material.coreMaterial;\r\n return `${primitive.id}:${core.instanceId}${instanceSuffix(material)}`;\r\n}\r\n\r\n/**\r\n * What a voxelization depends on in a material: the core's appearance tag (look-changing\r\n * edits, not the per-frame picking color) and change tag (texture loads).\r\n */\r\nfunction materialTagOf(material: MeshMaterial) {\r\n const core = material.coreMaterial;\r\n return `${core.appearanceTag}:${core.changeTag}`;\r\n}\r\n\r\n/** The instance uniform values a material instance overrides its core with, as a key suffix, else empty. */\r\nfunction instanceSuffix(material: MeshMaterial) {\r\n if (!material.$isInstance) {\r\n return '';\r\n }\r\n const core = material.coreMaterial;\r\n const parts: string[] = [];\r\n for (const { prop } of core.getInstancedUniforms()) {\r\n const a = (material as unknown as Record<string, unknown>)[prop];\r\n const b = (core as unknown as Record<string, unknown>)[prop];\r\n if (!sameValue(a, b)) {\r\n parts.push(`${prop}=${String(a)}`);\r\n }\r\n }\r\n return parts.length ? `:${parts.join(',')}` : '';\r\n}\r\n\r\nfunction sameValue(a: unknown, b: unknown) {\r\n if (typeof a === 'number' || typeof b === 'number') {\r\n return a === b;\r\n }\r\n const va = a as ArrayLike<number> | undefined;\r\n const vb = b as ArrayLike<number> | undefined;\r\n if (!va || !vb || va.length !== vb.length) {\r\n return a === b;\r\n }\r\n for (let i = 0; i < va.length; i++) {\r\n if (va[i] !== vb[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * The material to draw: the core, or for an instance with overrides a copy of the core\r\n * carrying its values, since the voxelize pass draws non-instanced.\r\n */\r\nfunction resolveMaterial(material: MeshMaterial): { material: MeshMaterial; owned: boolean } {\r\n if (!material.$isInstance || !instanceSuffix(material)) {\r\n return { material: material.coreMaterial, owned: false };\r\n }\r\n const core = material.coreMaterial;\r\n const copy = (core as unknown as { clone?: () => MeshMaterial }).clone?.();\r\n if (!copy) {\r\n return { material: core, owned: false };\r\n }\r\n for (const { prop } of core.getInstancedUniforms()) {\r\n (copy as unknown as Record<string, unknown>)[prop] = (material as unknown as Record<string, unknown>)[\r\n prop\r\n ];\r\n }\r\n return { material: copy, owned: true };\r\n}\r\n\r\nfunction boxValid(box: AABB) {\r\n return box.minPoint.x <= box.maxPoint.x;\r\n}\r\n\r\nfunction distanceToBox(p: Vector3, box: AABB) {\r\n const dx = Math.max(box.minPoint.x - p.x, 0, p.x - box.maxPoint.x);\r\n const dy = Math.max(box.minPoint.y - p.y, 0, p.y - box.maxPoint.y);\r\n const dz = Math.max(box.minPoint.z - p.z, 0, p.z - box.maxPoint.z);\r\n return Math.hypot(dx, dy, dz);\r\n}\r\n"],"names":["MAX_QUERY_POINTS","REVOXELIZE_COOLDOWN","ENTRY_LIFETIME","VoxelScene","voxelizeBudget","atlas","_scene","_voxelizer","_lighting","_albedo","_emissive","_resolution","_levels","_entries","_time","_atlasFull","_atlasFullWarned","_voxelizations","_lastVoxelizations","_queryProgram","_queryLevels","_queryBindGroup","_queryPoints","_queryOutput","_queryChain","scene","atlasSize","VoxelMaterialAtlas","Map","Promise","resolve","atlasAlbedo","albedo","atlasEmissive","emissive","size","Error","radiance","ready","radianceAniso0","aniso0","radianceAniso1","aniso1","lit","resolution","levels","getSlot","inst","key","keyOf","mesh","entry","get","voxelized","describeInstance","primitive","material","primitiveType","supportsVoxelization","state","slot","getStats","stats","entries","pending","failed","atlasResident","count","atlasOccupancy","occupancy","atlasFull","voxelizations","lastVoxelizations","lightingPasses","passes","values","update","sdf","cameraPos","deltaSeconds","global","enabled","ensureClipmaps","materials","wanted","instances","mode","header","asset","resolved","resolveMaterial","ownsMaterial","owned","source","map","v","Math","max","ceil","boxMin","voxelSize","materialTag","lastWanted","readyTime","Infinity","failedVersion","set","materialTagOf","d","distanceToBox","bounds","prev","undefined","min","candidates","filter","e","version","sort","a","b","done","place","dispose","ok","voxelizer","voxelize","dirtyInstances","has","remove","delete","updateLighting","camera","options","VoxelLighting","detach","queryVoxels","points","run","n","length","device","getDevice","pixels","Float32Array","runNextFrameAsync","createQueryProgram","createBindGroup","bindGroupLayouts","createBuffer","usage","storage","createTexture2D","mipmapping","writable","data","i","x","y","z","bufferSubData","bg","applyBindGroup","nearest","fetchSampler","setTexture","VOXEL_SCENE_ALBEDO","VOXEL_SCENE_EMISSIVE","VOXEL_SCENE_RADIANCE","VOXEL_SCENE_ANISO0","VOXEL_SCENE_ANISO1","setBuffer","setValue","Vector4","setProgram","setBindGroup","compute","read","readPixels","flush","row","Array","from","_","subarray","r","level","round","next","then","catch","clear","buildSDFProgram","label","workgroupSize","pb","vec4","storageBufferReadonly","uniform","result","texStorage2D","rgba32float","declareGlobalSDFUniforms","declareDynamicSDFUniforms","declareVoxelSceneUniforms","main","$l","$builtins","globalInvocationId","$if","lessThan","uint","texel","voxelSceneTexel","at","xyz","vec3","and","greaterThanEqual","w","greaterThan","textureLoad","rgb","textureStore","uvec2","loadVoxelSceneAlbedo","loadVoxelSceneEmissive","float","Voxelizer","createTexture3D","name","add","resident","dist","kept","fits","fail","victims","victim","moved","repack","s","console","warn","join","boxValid","markDirty","minPoint","maxPoint","core","coreMaterial","id","instanceId","instanceSuffix","appearanceTag","changeTag","$isInstance","parts","prop","getInstancedUniforms","sameValue","push","String","va","vb","copy","clone","box","p","dx","dy","dz","hypot"],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ import { Vector3, Matrix4x4 } from '@zephyr3d/base';
2
+ import { getDevice } from '../../app/api.js';
3
+ import { RenderPass } from '../renderpass.js';
4
+ import { RENDER_PASS_TYPE_VOXELIZE } from '../../values.js';
5
+ import { Camera } from '../../camera/camera.js';
6
+ import { ShaderHelper } from '../../material/shader/helper.js';
7
+ import { GlobalBindGroupAllocator } from '../globalbindgroup_allocator.js';
8
+ import { VOXELIZE_ALBEDO, VOXELIZE_EMISSIVE, VOXELIZE_PARAMS } from '../../shaders/gi.js';
9
+
10
+ /**
11
+ * The render pass a mesh is voxelized in. Only its type and hash take part:
12
+ * the voxelizer drives the draws itself rather than culling a scene.
13
+ * @internal
14
+ */ class VoxelizePass extends RenderPass {
15
+ constructor(){
16
+ super(RENDER_PASS_TYPE_VOXELIZE);
17
+ }
18
+ /** @internal */ _getGlobalBindGroupHash(_ctx) {
19
+ return '';
20
+ }
21
+ /** @internal */ renderItems(_ctx, _camera, _renderQueue) {
22
+ throw new Error('VoxelizePass: use Voxelizer.voxelize()');
23
+ }
24
+ }
25
+ /**
26
+ * Sub-pixel jittered draws per screen axis (VOXELIZE_JITTER² samples per voxel face),
27
+ * standing in for conservative rasterization, which WebGPU lacks: one sample per voxel
28
+ * misses sub-voxel strips that then read black. Jittered passes after Haeberli and
29
+ * Akeley's accumulation buffer (SIGGRAPH 1990); derivatives (albedo mip) stay per voxel.
30
+ */ const VOXELIZE_JITTER = 4;
31
+ const AXES = [
32
+ {
33
+ dir: new Vector3(1, 0, 0),
34
+ up: new Vector3(0, 1, 0)
35
+ },
36
+ {
37
+ dir: new Vector3(0, 1, 0),
38
+ up: new Vector3(0, 0, 1)
39
+ },
40
+ {
41
+ dir: new Vector3(0, 0, 1),
42
+ up: new Vector3(0, 1, 0)
43
+ }
44
+ ];
45
+ /**
46
+ * Rasterizes a mesh with its material into the material atlases: jittered orthographic
47
+ * draws along each axis, one pixel per voxel, each fragment storing albedo and emissive
48
+ * into its voxel. Depth test, culling and colour writes are off (scratch colour target).
49
+ * After Crassin and Green, OpenGL Insights 2012, minus conservative rasterization;
50
+ * what still slips through is filled via the mesh's distance field at composite time.
51
+ *
52
+ * @internal
53
+ */ class Voxelizer {
54
+ _scene;
55
+ _pass;
56
+ _camera;
57
+ _allocator;
58
+ _drawableBindGroup;
59
+ _params;
60
+ _eye;
61
+ _center;
62
+ constructor(scene){
63
+ this._scene = scene;
64
+ this._pass = new VoxelizePass();
65
+ this._camera = new Camera(null);
66
+ this._allocator = GlobalBindGroupAllocator.get();
67
+ this._drawableBindGroup = null;
68
+ this._params = new Float32Array(12);
69
+ this._eye = new Vector3();
70
+ this._center = new Vector3();
71
+ }
72
+ /**
73
+ * Voxelizes a primitive with a material into the target.
74
+ * @returns False when the material's program could not be built.
75
+ */ voxelize(primitive, material, target) {
76
+ const device = getDevice();
77
+ const res = target.slot.resolution;
78
+ const n = Math.max(res[0], res[1], res[2], 1);
79
+ const size = [
80
+ res[0] * target.voxelSize,
81
+ res[1] * target.voxelSize,
82
+ res[2] * target.voxelSize
83
+ ];
84
+ const half = Math.max(size[0], size[1], size[2]) * 0.5;
85
+ this._center.setXYZ(target.boxMin[0] + size[0] * 0.5, target.boxMin[1] + size[1] * 0.5, target.boxMin[2] + size[2] * 0.5);
86
+ this._params.set([
87
+ ...target.boxMin,
88
+ target.voxelSize
89
+ ], 0);
90
+ this._params.set([
91
+ ...target.slot.offset,
92
+ 0
93
+ ], 4);
94
+ this._params.set([
95
+ ...res,
96
+ 0
97
+ ], 8);
98
+ const ctx = this.createDrawContext(device);
99
+ let fb = null;
100
+ device.pushDeviceStates();
101
+ try {
102
+ fb = device.pool.fetchTemporalFramebuffer(false, n, n, 'rgba8unorm');
103
+ device.setFramebuffer(fb);
104
+ device.setViewport([
105
+ 0,
106
+ 0,
107
+ n,
108
+ n
109
+ ]);
110
+ device.setScissor([
111
+ 0,
112
+ 0,
113
+ n,
114
+ n
115
+ ]);
116
+ ctx.flip = this._pass.isAutoFlip(ctx);
117
+ ctx.renderPassHash = this._pass.getGlobalBindGroupHash(ctx, this._camera);
118
+ const bindGroup = this._allocator.getGlobalBindGroup(ctx);
119
+ bindGroup.setTexture(VOXELIZE_ALBEDO, target.albedo);
120
+ bindGroup.setTexture(VOXELIZE_EMISSIVE, target.emissive);
121
+ bindGroup.setValue(VOXELIZE_PARAMS, this._params);
122
+ device.setBindGroup(0, bindGroup);
123
+ device.setBindGroup(1, this.getDrawableBindGroup());
124
+ if (!material.apply(ctx)) {
125
+ return false;
126
+ }
127
+ // One pixel per voxel: the view spans the box's largest side in n pixels
128
+ const pixel = 2 * half / n;
129
+ for (const axis of AXES){
130
+ // Symmetric ortho view down the axis from outside the box, covering any orientation
131
+ this._eye.set(this._center);
132
+ this._eye.addBy(Vector3.scale(axis.dir, half + 1));
133
+ this._camera.lookAt(this._eye, this._center, axis.up);
134
+ for(let j = 0; j < VOXELIZE_JITTER * VOXELIZE_JITTER; j++){
135
+ // Sample positions spread evenly over the pixel
136
+ const ox = ((j % VOXELIZE_JITTER + 0.5) / VOXELIZE_JITTER - 0.5) * pixel;
137
+ const oy = ((Math.floor(j / VOXELIZE_JITTER) + 0.5) / VOXELIZE_JITTER - 0.5) * pixel;
138
+ this._camera.setProjectionMatrix(Matrix4x4.ortho(-half + ox, half + ox, -half + oy, half + oy, 1, 2 * half + 2));
139
+ ShaderHelper.setCameraUniforms(bindGroup, ctx, this._camera, true);
140
+ material.draw(primitive, ctx);
141
+ }
142
+ }
143
+ return true;
144
+ } finally{
145
+ device.popDeviceStates();
146
+ if (fb) {
147
+ device.pool.releaseFrameBuffer(fb);
148
+ }
149
+ }
150
+ }
151
+ dispose() {
152
+ this._drawableBindGroup?.dispose();
153
+ this._drawableBindGroup = null;
154
+ GlobalBindGroupAllocator.release(this._allocator);
155
+ }
156
+ /** The mesh is drawn in its own space: an identity world matrix. @internal */ getDrawableBindGroup() {
157
+ if (!this._drawableBindGroup) {
158
+ const bindGroup = getDevice().createBindGroup(ShaderHelper.getDrawableBindGroupLayout(false, false, false));
159
+ const identity = Matrix4x4.identity();
160
+ bindGroup.setValue(ShaderHelper.getWorldMatrixUniformName(), identity);
161
+ bindGroup.setValue(ShaderHelper.getPrevWorldMatrixUniformName(), identity);
162
+ bindGroup.setValue(ShaderHelper.getPrevWorldMatrixFrameUniformName(), 0);
163
+ this._drawableBindGroup = bindGroup;
164
+ }
165
+ return this._drawableBindGroup;
166
+ }
167
+ /** @internal */ createDrawContext(device) {
168
+ return {
169
+ device,
170
+ scene: this._scene,
171
+ renderWidth: 1,
172
+ renderHeight: 1,
173
+ oit: null,
174
+ motionVectors: false,
175
+ sssProfileId: false,
176
+ SSSProfileIdTexture: null,
177
+ HiZ: false,
178
+ HiZTexture: null,
179
+ screenSpaceShadowMask: false,
180
+ waterCaustics: false,
181
+ underwater: null,
182
+ globalBindGroupAllocator: this._allocator,
183
+ camera: this._camera,
184
+ compositor: null,
185
+ queue: 0,
186
+ lightBlending: false,
187
+ renderPass: this._pass,
188
+ renderPassHash: null,
189
+ shaderVariantHash: null,
190
+ flip: false,
191
+ depthFormat: 'd32f',
192
+ colorFormat: 'rgba8unorm',
193
+ drawEnvLight: false,
194
+ env: null,
195
+ sunLight: null,
196
+ primaryDirectionalLight: null,
197
+ primaryTransmissionLight: null,
198
+ materialFlags: 0,
199
+ primitiveLod: 0,
200
+ SSR: false,
201
+ SSGI: false,
202
+ SSGIIrradianceHistoryTexture: null,
203
+ SSGISurfaceHistoryTexture: null,
204
+ SSS: false,
205
+ SSRCalcThickness: false,
206
+ SceneRoughnessTexture: null,
207
+ SceneNormalTexture: null,
208
+ SSSProfileTexture: null,
209
+ SSSParamTexture: null,
210
+ SSSDiffuseTexture: null,
211
+ SSSTransmissionTexture: null,
212
+ SSSMaskTexture: null,
213
+ postSSS: false,
214
+ ssrSDFBoxBuffer: null,
215
+ ssrSDFBoxCount: 0,
216
+ finalFramebuffer: null,
217
+ intermediateFramebuffer: null
218
+ };
219
+ }
220
+ }
221
+
222
+ export { VoxelizePass, Voxelizer };
223
+ //# sourceMappingURL=voxelize_pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voxelize_pass.js","sources":["../../../src/render/gi/voxelize_pass.ts"],"sourcesContent":["import type { BindGroup, FrameBuffer, Texture3D } from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Matrix4x4, Vector3 } from '@zephyr3d/base';\r\nimport { getDevice } from '../../app/api';\r\nimport { RenderPass } from '../renderpass';\r\nimport { RENDER_PASS_TYPE_VOXELIZE } from '../../values';\r\nimport type { DrawContext } from '../drawable';\r\nimport type { RenderQueue } from '../render_queue';\r\nimport type { Camera } from '../../camera/camera';\r\nimport { Camera as CameraNode } from '../../camera/camera';\r\nimport type { Scene } from '../../scene/scene';\r\nimport type { Primitive } from '../primitive';\r\nimport type { MeshMaterial } from '../../material/meshmaterial';\r\nimport { ShaderHelper } from '../../material/shader/helper';\r\nimport { GlobalBindGroupAllocator } from '../globalbindgroup_allocator';\r\nimport { VOXELIZE_ALBEDO, VOXELIZE_EMISSIVE, VOXELIZE_PARAMS } from '../../shaders/gi';\r\nimport type { VoxelAtlasSlot } from './voxel_atlas';\r\n\r\n/**\r\n * The render pass a mesh is voxelized in. Only its type and hash take part:\r\n * the voxelizer drives the draws itself rather than culling a scene.\r\n * @internal\r\n */\r\nexport class VoxelizePass extends RenderPass {\r\n constructor() {\r\n super(RENDER_PASS_TYPE_VOXELIZE);\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(_ctx: DrawContext) {\r\n return '';\r\n }\r\n /** @internal */\r\n protected renderItems(_ctx: DrawContext, _camera: Camera, _renderQueue: RenderQueue) {\r\n throw new Error('VoxelizePass: use Voxelizer.voxelize()');\r\n }\r\n}\r\n\r\n/**\r\n * Where a voxelization lands: a slot of the material atlases, and the box of\r\n * the mesh's local space it covers.\r\n * @internal\r\n */\r\nexport interface VoxelizeTarget {\r\n albedo: Texture3D;\r\n emissive: Texture3D;\r\n slot: VoxelAtlasSlot;\r\n /** Lower corner of the box in the mesh's local space. */\r\n boxMin: [number, number, number];\r\n /** Edge of a material voxel in local units. */\r\n voxelSize: number;\r\n}\r\n\r\n/**\r\n * Sub-pixel jittered draws per screen axis (VOXELIZE_JITTER² samples per voxel face),\r\n * standing in for conservative rasterization, which WebGPU lacks: one sample per voxel\r\n * misses sub-voxel strips that then read black. Jittered passes after Haeberli and\r\n * Akeley's accumulation buffer (SIGGRAPH 1990); derivatives (albedo mip) stay per voxel.\r\n */\r\nconst VOXELIZE_JITTER = 4;\r\n\r\nconst AXES: { dir: Vector3; up: Vector3 }[] = [\r\n { dir: new Vector3(1, 0, 0), up: new Vector3(0, 1, 0) },\r\n { dir: new Vector3(0, 1, 0), up: new Vector3(0, 0, 1) },\r\n { dir: new Vector3(0, 0, 1), up: new Vector3(0, 1, 0) }\r\n];\r\n\r\n/**\r\n * Rasterizes a mesh with its material into the material atlases: jittered orthographic\r\n * draws along each axis, one pixel per voxel, each fragment storing albedo and emissive\r\n * into its voxel. Depth test, culling and colour writes are off (scratch colour target).\r\n * After Crassin and Green, OpenGL Insights 2012, minus conservative rasterization;\r\n * what still slips through is filled via the mesh's distance field at composite time.\r\n *\r\n * @internal\r\n */\r\nexport class Voxelizer {\r\n private readonly _scene: Scene;\r\n private readonly _pass: VoxelizePass;\r\n private readonly _camera: CameraNode;\r\n private readonly _allocator: GlobalBindGroupAllocator;\r\n private _drawableBindGroup: Nullable<BindGroup>;\r\n private readonly _params: Float32Array<ArrayBuffer>;\r\n private readonly _eye: Vector3;\r\n private readonly _center: Vector3;\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._pass = new VoxelizePass();\r\n this._camera = new CameraNode(null);\r\n this._allocator = GlobalBindGroupAllocator.get();\r\n this._drawableBindGroup = null;\r\n this._params = new Float32Array(12);\r\n this._eye = new Vector3();\r\n this._center = new Vector3();\r\n }\r\n /**\r\n * Voxelizes a primitive with a material into the target.\r\n * @returns False when the material's program could not be built.\r\n */\r\n voxelize(primitive: Primitive, material: MeshMaterial, target: VoxelizeTarget): boolean {\r\n const device = getDevice();\r\n const res = target.slot.resolution;\r\n const n = Math.max(res[0], res[1], res[2], 1);\r\n const size = [res[0] * target.voxelSize, res[1] * target.voxelSize, res[2] * target.voxelSize];\r\n const half = Math.max(size[0], size[1], size[2]) * 0.5;\r\n this._center.setXYZ(\r\n target.boxMin[0] + size[0] * 0.5,\r\n target.boxMin[1] + size[1] * 0.5,\r\n target.boxMin[2] + size[2] * 0.5\r\n );\r\n this._params.set([...target.boxMin, target.voxelSize], 0);\r\n this._params.set([...target.slot.offset, 0], 4);\r\n this._params.set([...res, 0], 8);\r\n const ctx = this.createDrawContext(device);\r\n let fb: Nullable<FrameBuffer> = null;\r\n device.pushDeviceStates();\r\n try {\r\n fb = device.pool.fetchTemporalFramebuffer(false, n, n, 'rgba8unorm');\r\n device.setFramebuffer(fb);\r\n device.setViewport([0, 0, n, n]);\r\n device.setScissor([0, 0, n, n]);\r\n ctx.flip = this._pass.isAutoFlip(ctx);\r\n ctx.renderPassHash = this._pass.getGlobalBindGroupHash(ctx, this._camera);\r\n const bindGroup = this._allocator.getGlobalBindGroup(ctx);\r\n bindGroup.setTexture(VOXELIZE_ALBEDO, target.albedo);\r\n bindGroup.setTexture(VOXELIZE_EMISSIVE, target.emissive);\r\n bindGroup.setValue(VOXELIZE_PARAMS, this._params);\r\n device.setBindGroup(0, bindGroup);\r\n device.setBindGroup(1, this.getDrawableBindGroup());\r\n if (!material.apply(ctx)) {\r\n return false;\r\n }\r\n // One pixel per voxel: the view spans the box's largest side in n pixels\r\n const pixel = (2 * half) / n;\r\n for (const axis of AXES) {\r\n // Symmetric ortho view down the axis from outside the box, covering any orientation\r\n this._eye.set(this._center);\r\n this._eye.addBy(Vector3.scale(axis.dir, half + 1));\r\n this._camera.lookAt(this._eye, this._center, axis.up);\r\n for (let j = 0; j < VOXELIZE_JITTER * VOXELIZE_JITTER; j++) {\r\n // Sample positions spread evenly over the pixel\r\n const ox = (((j % VOXELIZE_JITTER) + 0.5) / VOXELIZE_JITTER - 0.5) * pixel;\r\n const oy = ((Math.floor(j / VOXELIZE_JITTER) + 0.5) / VOXELIZE_JITTER - 0.5) * pixel;\r\n this._camera.setProjectionMatrix(\r\n Matrix4x4.ortho(-half + ox, half + ox, -half + oy, half + oy, 1, 2 * half + 2)\r\n );\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, this._camera, true);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n return true;\r\n } finally {\r\n device.popDeviceStates();\r\n if (fb) {\r\n device.pool.releaseFrameBuffer(fb);\r\n }\r\n }\r\n }\r\n dispose() {\r\n this._drawableBindGroup?.dispose();\r\n this._drawableBindGroup = null;\r\n GlobalBindGroupAllocator.release(this._allocator);\r\n }\r\n /** The mesh is drawn in its own space: an identity world matrix. @internal */\r\n private getDrawableBindGroup() {\r\n if (!this._drawableBindGroup) {\r\n const bindGroup = getDevice().createBindGroup(\r\n ShaderHelper.getDrawableBindGroupLayout(false, false, false)\r\n );\r\n const identity = Matrix4x4.identity();\r\n bindGroup.setValue(ShaderHelper.getWorldMatrixUniformName(), identity);\r\n bindGroup.setValue(ShaderHelper.getPrevWorldMatrixUniformName(), identity);\r\n bindGroup.setValue(ShaderHelper.getPrevWorldMatrixFrameUniformName(), 0);\r\n this._drawableBindGroup = bindGroup;\r\n }\r\n return this._drawableBindGroup;\r\n }\r\n /** @internal */\r\n private createDrawContext(device: DrawContext['device']): DrawContext {\r\n return {\r\n device,\r\n scene: this._scene,\r\n renderWidth: 1,\r\n renderHeight: 1,\r\n oit: null,\r\n motionVectors: false,\r\n sssProfileId: false,\r\n SSSProfileIdTexture: null,\r\n HiZ: false,\r\n HiZTexture: null,\r\n screenSpaceShadowMask: false,\r\n waterCaustics: false,\r\n underwater: null,\r\n globalBindGroupAllocator: this._allocator,\r\n camera: this._camera,\r\n compositor: null,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: this._pass,\r\n renderPassHash: null,\r\n shaderVariantHash: null,\r\n flip: false,\r\n depthFormat: 'd32f',\r\n colorFormat: 'rgba8unorm',\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n primitiveLod: 0,\r\n SSR: false,\r\n SSGI: false,\r\n SSGIIrradianceHistoryTexture: null,\r\n SSGISurfaceHistoryTexture: null,\r\n SSS: false,\r\n SSRCalcThickness: false,\r\n SceneRoughnessTexture: null,\r\n SceneNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SSSMaskTexture: null,\r\n postSSS: false,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: null,\r\n intermediateFramebuffer: null\r\n };\r\n }\r\n}\r\n"],"names":["VoxelizePass","RenderPass","RENDER_PASS_TYPE_VOXELIZE","_getGlobalBindGroupHash","_ctx","_camera","_renderQueue","Error","VOXELIZE_JITTER","AXES","dir","Vector3","up","Voxelizer","_scene","_pass","_allocator","_drawableBindGroup","_params","_eye","_center","scene","CameraNode","GlobalBindGroupAllocator","get","Float32Array","voxelize","primitive","material","target","device","getDevice","res","slot","resolution","n","Math","max","size","voxelSize","half","setXYZ","boxMin","set","offset","ctx","createDrawContext","fb","pushDeviceStates","pool","fetchTemporalFramebuffer","setFramebuffer","setViewport","setScissor","flip","isAutoFlip","renderPassHash","getGlobalBindGroupHash","bindGroup","getGlobalBindGroup","setTexture","VOXELIZE_ALBEDO","albedo","VOXELIZE_EMISSIVE","emissive","setValue","VOXELIZE_PARAMS","setBindGroup","getDrawableBindGroup","apply","pixel","axis","addBy","scale","lookAt","j","ox","oy","floor","setProjectionMatrix","Matrix4x4","ortho","ShaderHelper","setCameraUniforms","draw","popDeviceStates","releaseFrameBuffer","dispose","release","createBindGroup","getDrawableBindGroupLayout","identity","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","renderWidth","renderHeight","oit","motionVectors","sssProfileId","SSSProfileIdTexture","HiZ","HiZTexture","screenSpaceShadowMask","waterCaustics","underwater","globalBindGroupAllocator","camera","compositor","queue","lightBlending","renderPass","shaderVariantHash","depthFormat","colorFormat","drawEnvLight","env","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","primitiveLod","SSR","SSGI","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","SSS","SSRCalcThickness","SceneRoughnessTexture","SceneNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SSSMaskTexture","postSSS","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer"],"mappings":"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"}
@@ -2,14 +2,15 @@ import { ShaderHelper } from '../material/shader/helper.js';
2
2
  import '../material/lambert.js';
3
3
  import '../material/blinn.js';
4
4
  import '../material/unlit.js';
5
+ import '../material/meshmaterial.js';
5
6
  import '../material/particle.js';
6
7
  import '../material/subsurfaceprofile.js';
7
- import '../material/skin.js';
8
+ import '../material/sssprofile.js';
9
+ import '../material/sss.js';
8
10
  import '../material/eye.js';
9
11
  import '@zephyr3d/device';
10
12
  import '../values.js';
11
13
  import '@zephyr3d/base';
12
- import '../material/meshmaterial.js';
13
14
  import '../material/hair.js';
14
15
  import '../material/hairstrand.js';
15
16
  import '../material/grassmaterial.js';
@@ -1 +1 @@
1
- {"version":3,"file":"globalbindgroup_allocator.js","sources":["../../src/render/globalbindgroup_allocator.ts"],"sourcesContent":["import type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\n\r\nexport class GlobalBindGroupAllocator {\r\n static _layouts: Record<string, BindGroupLayout> = {};\r\n static _allocators: GlobalBindGroupAllocator[] = [];\r\n private _bindGroups: Record<string, BindGroup>;\r\n constructor() {\r\n this._bindGroups = {};\r\n }\r\n static get() {\r\n return this._allocators.pop() ?? new GlobalBindGroupAllocator();\r\n }\r\n static release(allocator: GlobalBindGroupAllocator) {\r\n this._allocators.push(allocator);\r\n }\r\n /**\r\n * Allocate global bind group according to current draw context\r\n * @param ctx - Draw context\r\n * @returns Global bind group\r\n */\r\n getGlobalBindGroup(ctx: DrawContext) {\r\n const hash = ctx.renderPassHash!;\r\n let bindGroup = this._bindGroups[hash];\r\n if (!bindGroup) {\r\n let layout = GlobalBindGroupAllocator._layouts[hash];\r\n if (!layout) {\r\n const ret = ctx.device.programBuilder.buildRender({\r\n vertex(pb) {\r\n ShaderHelper.prepareVertexShader(pb, ctx);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n ShaderHelper.prepareFragmentShader(pb, ctx);\r\n pb.main(function () {});\r\n }\r\n });\r\n layout = ret[2][0];\r\n GlobalBindGroupAllocator._layouts[hash] = layout;\r\n }\r\n bindGroup = ctx.device.createBindGroup(layout);\r\n this._bindGroups[hash] = bindGroup;\r\n }\r\n return bindGroup;\r\n }\r\n}\r\n"],"names":["GlobalBindGroupAllocator","_layouts","_allocators","_bindGroups","get","pop","release","allocator","push","getGlobalBindGroup","ctx","hash","renderPassHash","bindGroup","layout","ret","device","programBuilder","buildRender","vertex","pb","ShaderHelper","prepareVertexShader","main","fragment","prepareFragmentShader","createBindGroup"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAMA,wBAAAA,CAAAA;IACX,OAAOC,QAAAA,GAA4C,EAAG;IACtD,OAAOC,WAAAA,GAA0C,EAAE;IAC3CC,WAAuC;IAC/C,WAAc,EAAA;QACZ,IAAI,CAACA,WAAW,GAAG,EAAC;AACtB;AACA,IAAA,OAAOC,GAAM,GAAA;AACX,QAAA,OAAO,IAAI,CAACF,WAAW,CAACG,GAAG,MAAM,IAAIL,wBAAAA,EAAAA;AACvC;IACA,OAAOM,OAAAA,CAAQC,SAAmC,EAAE;AAClD,QAAA,IAAI,CAACL,WAAW,CAACM,IAAI,CAACD,SAAAA,CAAAA;AACxB;AACA;;;;MAKAE,kBAAAA,CAAmBC,GAAgB,EAAE;QACnC,MAAMC,IAAAA,GAAOD,IAAIE,cAAc;AAC/B,QAAA,IAAIC,SAAY,GAAA,IAAI,CAACV,WAAW,CAACQ,IAAK,CAAA;AACtC,QAAA,IAAI,CAACE,SAAW,EAAA;AACd,YAAA,IAAIC,MAASd,GAAAA,wBAAAA,CAAyBC,QAAQ,CAACU,IAAK,CAAA;AACpD,YAAA,IAAI,CAACG,MAAQ,EAAA;AACX,gBAAA,MAAMC,MAAML,GAAIM,CAAAA,MAAM,CAACC,cAAc,CAACC,WAAW,CAAC;AAChDC,oBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;wBACPC,YAAaC,CAAAA,mBAAmB,CAACF,EAAIV,EAAAA,GAAAA,CAAAA;wBACrCU,EAAGG,CAAAA,IAAI,CAAC,WAAa,EAAA,CAAA;AACvB,qBAAA;AACAC,oBAAAA,QAAAA,CAAAA,CAASJ,EAAE,EAAA;wBACTC,YAAaI,CAAAA,qBAAqB,CAACL,EAAIV,EAAAA,GAAAA,CAAAA;wBACvCU,EAAGG,CAAAA,IAAI,CAAC,WAAa,EAAA,CAAA;AACvB;AACF,iBAAA,CAAA;AACAT,gBAAAA,MAAAA,GAASC,GAAG,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA;gBAClBf,wBAAyBC,CAAAA,QAAQ,CAACU,IAAAA,CAAK,GAAGG,MAAAA;AAC5C;AACAD,YAAAA,SAAAA,GAAYH,GAAIM,CAAAA,MAAM,CAACU,eAAe,CAACZ,MAAAA,CAAAA;AACvC,YAAA,IAAI,CAACX,WAAW,CAACQ,IAAAA,CAAK,GAAGE,SAAAA;AAC3B;QACA,OAAOA,SAAAA;AACT;AACF;;;;"}
1
+ {"version":3,"file":"globalbindgroup_allocator.js","sources":["../../src/render/globalbindgroup_allocator.ts"],"sourcesContent":["import type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\n\r\nexport class GlobalBindGroupAllocator {\r\n static _layouts: Record<string, BindGroupLayout> = {};\r\n static _allocators: GlobalBindGroupAllocator[] = [];\r\n private _bindGroups: Record<string, BindGroup>;\r\n constructor() {\r\n this._bindGroups = {};\r\n }\r\n static get() {\r\n return this._allocators.pop() ?? new GlobalBindGroupAllocator();\r\n }\r\n static release(allocator: GlobalBindGroupAllocator) {\r\n this._allocators.push(allocator);\r\n }\r\n /**\r\n * Allocate global bind group according to current draw context\r\n * @param ctx - Draw context\r\n * @returns Global bind group\r\n */\r\n getGlobalBindGroup(ctx: DrawContext) {\r\n const hash = ctx.renderPassHash!;\r\n let bindGroup = this._bindGroups[hash];\r\n if (!bindGroup) {\r\n let layout = GlobalBindGroupAllocator._layouts[hash];\r\n if (!layout) {\r\n const ret = ctx.device.programBuilder.buildRender({\r\n vertex(pb) {\r\n ShaderHelper.prepareVertexShader(pb, ctx);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n ShaderHelper.prepareFragmentShader(pb, ctx);\r\n pb.main(function () {});\r\n }\r\n });\r\n layout = ret[2][0];\r\n GlobalBindGroupAllocator._layouts[hash] = layout;\r\n }\r\n bindGroup = ctx.device.createBindGroup(layout);\r\n this._bindGroups[hash] = bindGroup;\r\n }\r\n return bindGroup;\r\n }\r\n}\r\n"],"names":["GlobalBindGroupAllocator","_layouts","_allocators","_bindGroups","get","pop","release","allocator","push","getGlobalBindGroup","ctx","hash","renderPassHash","bindGroup","layout","ret","device","programBuilder","buildRender","vertex","pb","ShaderHelper","prepareVertexShader","main","fragment","prepareFragmentShader","createBindGroup"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAMA,wBAAAA,CAAAA;IACX,OAAOC,QAAAA,GAA4C,EAAG;IACtD,OAAOC,WAAAA,GAA0C,EAAE;IAC3CC,WAAuC;IAC/C,WAAc,EAAA;QACZ,IAAI,CAACA,WAAW,GAAG,EAAC;AACtB;AACA,IAAA,OAAOC,GAAM,GAAA;AACX,QAAA,OAAO,IAAI,CAACF,WAAW,CAACG,GAAG,MAAM,IAAIL,wBAAAA,EAAAA;AACvC;IACA,OAAOM,OAAAA,CAAQC,SAAmC,EAAE;AAClD,QAAA,IAAI,CAACL,WAAW,CAACM,IAAI,CAACD,SAAAA,CAAAA;AACxB;AACA;;;;MAKAE,kBAAAA,CAAmBC,GAAgB,EAAE;QACnC,MAAMC,IAAAA,GAAOD,IAAIE,cAAc;AAC/B,QAAA,IAAIC,SAAY,GAAA,IAAI,CAACV,WAAW,CAACQ,IAAK,CAAA;AACtC,QAAA,IAAI,CAACE,SAAW,EAAA;AACd,YAAA,IAAIC,MAASd,GAAAA,wBAAAA,CAAyBC,QAAQ,CAACU,IAAK,CAAA;AACpD,YAAA,IAAI,CAACG,MAAQ,EAAA;AACX,gBAAA,MAAMC,MAAML,GAAIM,CAAAA,MAAM,CAACC,cAAc,CAACC,WAAW,CAAC;AAChDC,oBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;wBACPC,YAAaC,CAAAA,mBAAmB,CAACF,EAAIV,EAAAA,GAAAA,CAAAA;wBACrCU,EAAGG,CAAAA,IAAI,CAAC,WAAa,EAAA,CAAA;AACvB,qBAAA;AACAC,oBAAAA,QAAAA,CAAAA,CAASJ,EAAE,EAAA;wBACTC,YAAaI,CAAAA,qBAAqB,CAACL,EAAIV,EAAAA,GAAAA,CAAAA;wBACvCU,EAAGG,CAAAA,IAAI,CAAC,WAAa,EAAA,CAAA;AACvB;AACF,iBAAA,CAAA;AACAT,gBAAAA,MAAAA,GAASC,GAAG,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA;gBAClBf,wBAAyBC,CAAAA,QAAQ,CAACU,IAAAA,CAAK,GAAGG,MAAAA;AAC5C;AACAD,YAAAA,SAAAA,GAAYH,GAAIM,CAAAA,MAAM,CAACU,eAAe,CAACZ,MAAAA,CAAAA;AACvC,YAAA,IAAI,CAACX,WAAW,CAACQ,IAAAA,CAAK,GAAGE,SAAAA;AAC3B;QACA,OAAOA,SAAAA;AACT;AACF;;;;"}
@@ -1,28 +1,18 @@
1
- import { Matrix4x4, Vector3, Vector4, DEPTH_CLEAR_VALUE } from '@zephyr3d/base';
1
+ import { Matrix4x4, Vector4, DEPTH_CLEAR_VALUE, Vector3 } from '@zephyr3d/base';
2
2
  import { Camera } from '../camera/camera.js';
3
+ import '../camera/follow.js';
3
4
  import { ObjectColorPass } from './objectcolorpass.js';
4
5
 
5
6
  const _pickCamera = new Camera(null);
6
7
  const _objectColorPass = new ObjectColorPass();
7
- function decodeNormalizedFloat(rgba) {
8
- const a = rgba[0] / 255;
9
- const b = rgba[1] / 255;
10
- const c = rgba[2] / 255;
11
- const d = rgba[3] / 255;
12
- return a / (256 * 256 * 256) + b / (256 * 256) + c / 256 + d;
13
- }
14
8
  /**
15
9
  * Perform GPU-based object picking by rendering object IDs to a 1x1 framebuffer.
16
10
  * @internal
17
11
  */ function renderObjectColors(ctx, pickResolveFunc, renderQueue) {
18
12
  const camera = ctx.camera;
19
- const isWebGL1 = ctx.device.type === 'webgl';
20
13
  ctx.renderPass = _objectColorPass;
21
14
  ctx.device.pushDeviceStates();
22
- const fb = ctx.device.pool.fetchTemporalFramebuffer(false, 1, 1, isWebGL1 ? [
23
- 'rgba8unorm',
24
- 'rgba8unorm'
25
- ] : [
15
+ const fb = ctx.device.pool.fetchTemporalFramebuffer(false, 1, 1, [
26
16
  'rgba8unorm',
27
17
  'rgba32f'
28
18
  ], ctx.depthFormat, false);
@@ -47,8 +37,6 @@ function decodeNormalizedFloat(rgba) {
47
37
  right = left + width * windowW;
48
38
  top = bottom + height * windowH;
49
39
  pickCamera.setProjectionMatrix(camera.isPerspective() ? Matrix4x4.frustum(left, right, bottom, top, near, far) : Matrix4x4.ortho(left, right, bottom, top, near, far));
50
- const cameraPos = isWebGL1 ? new Vector3(pickCamera.position) : null;
51
- const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;
52
40
  ctx.device.setFramebuffer(fb);
53
41
  _objectColorPass.clearColor = Vector4.zero();
54
42
  _objectColorPass.clearDepth = DEPTH_CLEAR_VALUE;
@@ -59,32 +47,17 @@ function decodeNormalizedFloat(rgba) {
59
47
  const colorTex = fb.getColorAttachments()[0];
60
48
  const distanceTex = fb.getColorAttachments()[1];
61
49
  const colorPixels = new Uint8Array(4);
62
- const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);
50
+ const distancePixels = new Float32Array(4);
63
51
  const device = ctx.device;
64
52
  // RenderGraph releases the frame RenderQueue before the asynchronous GPU readback completes.
65
53
  const getDrawableByColor = renderQueue.createObjectColorLookupSnapshot();
66
- let fence;
67
- if (ctx.device.type === 'webgl') {
68
- fence = Promise.all([
69
- ctx.device.runNextFrameAsync(()=>colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels)),
70
- ctx.device.runNextFrameAsync(()=>distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels))
71
- ]);
72
- } else {
73
- fence = Promise.all([
74
- colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),
75
- distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)
76
- ]);
77
- }
78
- fence.then(()=>{
54
+ Promise.all([
55
+ colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),
56
+ distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)
57
+ ]).then(()=>{
79
58
  const drawable = getDrawableByColor(colorPixels);
80
- let d = isWebGL1 ? decodeNormalizedFloat(distancePixels) * far : distancePixels[0];
59
+ const d = distancePixels[0];
81
60
  const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);
82
- if (isWebGL1) {
83
- intersectedPoint.x = cameraPos.x + ray.direction.x * d;
84
- intersectedPoint.y = cameraPos.y + ray.direction.y * d;
85
- intersectedPoint.z = cameraPos.z + ray.direction.z * d;
86
- d = Vector3.distance(intersectedPoint, cameraPos);
87
- }
88
61
  pickResolveFunc(drawable ? {
89
62
  distance: d,
90
63
  intersectedPoint,
@@ -1 +1 @@
1
- {"version":3,"file":"gpu_picking.js","sources":["../../src/render/gpu_picking.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Matrix4x4, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { DrawContext } from './drawable';\r\nimport type { RenderQueue } from './render_queue';\r\nimport { type PickResult, Camera } from '../camera';\r\nimport { ObjectColorPass } from './objectcolorpass';\r\n\r\nconst _pickCamera = new Camera(null);\r\nconst _objectColorPass = new ObjectColorPass();\r\n\r\nfunction decodeNormalizedFloat(rgba: Uint8Array<ArrayBuffer>): number {\r\n const a = rgba[0] / 255;\r\n const b = rgba[1] / 255;\r\n const c = rgba[2] / 255;\r\n const d = rgba[3] / 255;\r\n return a / (256 * 256 * 256) + b / (256 * 256) + c / 256 + d;\r\n}\r\n\r\n/**\r\n * Perform GPU-based object picking by rendering object IDs to a 1x1 framebuffer.\r\n * @internal\r\n */\r\nexport function renderObjectColors(\r\n ctx: DrawContext,\r\n pickResolveFunc: (result: Nullable<PickResult>) => void,\r\n renderQueue: RenderQueue\r\n): void {\r\n const camera = ctx.camera;\r\n const isWebGL1 = ctx.device.type === 'webgl';\r\n ctx.renderPass = _objectColorPass;\r\n ctx.device.pushDeviceStates();\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 1,\r\n 1,\r\n isWebGL1 ? ['rgba8unorm', 'rgba8unorm'] : ['rgba8unorm', 'rgba32f'],\r\n ctx.depthFormat,\r\n false\r\n );\r\n ctx.device.setViewport(camera.viewport);\r\n const vp = ctx.device.getViewport();\r\n const windowX = camera.getPickPosX() / vp.width;\r\n const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;\r\n const windowW = 1 / vp.width;\r\n const windowH = 1 / vp.height;\r\n const pickCamera = _pickCamera;\r\n camera.worldMatrix.decompose(pickCamera.scale, pickCamera.rotation, pickCamera.position);\r\n let left = camera.getProjectionMatrix().getLeftPlane();\r\n let right = camera.getProjectionMatrix().getRightPlane();\r\n let bottom = camera.getProjectionMatrix().getBottomPlane();\r\n let top = camera.getProjectionMatrix().getTopPlane();\r\n const near = camera.getProjectionMatrix().getNearPlane();\r\n const far = camera.getProjectionMatrix().getFarPlane();\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * windowX;\r\n bottom += height * windowY;\r\n right = left + width * windowW;\r\n top = bottom + height * windowH;\r\n pickCamera.setProjectionMatrix(\r\n camera.isPerspective()\r\n ? Matrix4x4.frustum(left, right, bottom, top, near, far)\r\n : Matrix4x4.ortho(left, right, bottom, top, near, far)\r\n );\r\n const cameraPos = isWebGL1 ? new Vector3(pickCamera.position) : null;\r\n const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;\r\n ctx.device.setFramebuffer(fb);\r\n _objectColorPass.clearColor = Vector4.zero();\r\n _objectColorPass.clearDepth = DEPTH_CLEAR_VALUE;\r\n const rq = _objectColorPass.cullScene(ctx, pickCamera);\r\n _objectColorPass.render(ctx, pickCamera, null, rq);\r\n rq.dispose();\r\n ctx.device.popDeviceStates();\r\n const colorTex = fb.getColorAttachments()[0];\r\n const distanceTex = fb.getColorAttachments()[1];\r\n const colorPixels = new Uint8Array(4);\r\n const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);\r\n const device = ctx.device;\r\n // RenderGraph releases the frame RenderQueue before the asynchronous GPU readback completes.\r\n const getDrawableByColor = renderQueue.createObjectColorLookupSnapshot();\r\n let fence: Promise<void[]>;\r\n if (ctx.device.type === 'webgl') {\r\n fence = Promise.all([\r\n ctx.device.runNextFrameAsync(() => colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels)),\r\n ctx.device.runNextFrameAsync(() => distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels))\r\n ]);\r\n } else {\r\n fence = Promise.all([\r\n colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),\r\n distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)\r\n ]);\r\n }\r\n fence\r\n .then(() => {\r\n const drawable = getDrawableByColor(colorPixels);\r\n let d = isWebGL1\r\n ? decodeNormalizedFloat(distancePixels as Uint8Array<ArrayBuffer>) * far\r\n : distancePixels[0];\r\n const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);\r\n if (isWebGL1) {\r\n intersectedPoint.x = cameraPos!.x + ray!.direction.x * d;\r\n intersectedPoint.y = cameraPos!.y + ray!.direction.y * d;\r\n intersectedPoint.z = cameraPos!.z + ray!.direction.z * d;\r\n d = Vector3.distance(intersectedPoint, cameraPos!);\r\n }\r\n pickResolveFunc(\r\n drawable\r\n ? {\r\n distance: d,\r\n intersectedPoint,\r\n drawable,\r\n target: drawable.getPickTarget()\r\n }\r\n : null\r\n );\r\n })\r\n .catch((_err) => {\r\n pickResolveFunc(null);\r\n })\r\n .finally(() => {\r\n device.pool.releaseFrameBuffer(fb);\r\n });\r\n}\r\n"],"names":["_pickCamera","Camera","_objectColorPass","ObjectColorPass","decodeNormalizedFloat","rgba","a","b","c","d","renderObjectColors","ctx","pickResolveFunc","renderQueue","camera","isWebGL1","device","type","renderPass","pushDeviceStates","fb","pool","fetchTemporalFramebuffer","depthFormat","setViewport","viewport","vp","getViewport","windowX","getPickPosX","width","windowY","height","getPickPosY","windowW","windowH","pickCamera","worldMatrix","decompose","scale","rotation","position","left","getProjectionMatrix","getLeftPlane","right","getRightPlane","bottom","getBottomPlane","top","getTopPlane","near","getNearPlane","far","getFarPlane","setProjectionMatrix","isPerspective","Matrix4x4","frustum","ortho","cameraPos","Vector3","ray","constructRay","setFramebuffer","clearColor","Vector4","zero","clearDepth","DEPTH_CLEAR_VALUE","rq","cullScene","render","dispose","popDeviceStates","colorTex","getColorAttachments","distanceTex","colorPixels","Uint8Array","distancePixels","Float32Array","getDrawableByColor","createObjectColorLookupSnapshot","fence","Promise","all","runNextFrameAsync","readPixels","then","drawable","intersectedPoint","x","direction","y","z","distance","target","getPickTarget","catch","_err","finally","releaseFrameBuffer"],"mappings":";;;;AAOA,MAAMA,WAAAA,GAAc,IAAIC,MAAO,CAAA,IAAA,CAAA;AAC/B,MAAMC,mBAAmB,IAAIC,eAAAA,EAAAA;AAE7B,SAASC,sBAAsBC,IAA6B,EAAA;AAC1D,IAAA,MAAMC,CAAID,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,MAAME,CAAIF,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,MAAMG,CAAIH,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,MAAMI,CAAIJ,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,OAAOC,CAAK,IAAA,GAAM,GAAA,GAAA,GAAM,GAAE,CAAA,GAAKC,CAAK,IAAA,GAAM,GAAA,GAAE,CAAKC,GAAAA,CAAAA,GAAI,GAAMC,GAAAA,CAAAA;AAC7D;AAEA;;;AAGC,IACM,SAASC,kBAAAA,CACdC,GAAgB,EAChBC,eAAuD,EACvDC,WAAwB,EAAA;IAExB,MAAMC,MAAAA,GAASH,IAAIG,MAAM;AACzB,IAAA,MAAMC,QAAWJ,GAAAA,GAAAA,CAAIK,MAAM,CAACC,IAAI,KAAK,OAAA;AACrCN,IAAAA,GAAAA,CAAIO,UAAU,GAAGhB,gBAAAA;IACjBS,GAAIK,CAAAA,MAAM,CAACG,gBAAgB,EAAA;IAC3B,MAAMC,EAAAA,GAAKT,GAAIK,CAAAA,MAAM,CAACK,IAAI,CAACC,wBAAwB,CACjD,KAAA,EACA,CACA,EAAA,CAAA,EACAP,QAAW,GAAA;AAAC,QAAA,YAAA;AAAc,QAAA;KAAa,GAAG;AAAC,QAAA,YAAA;AAAc,QAAA;KAAU,EACnEJ,GAAAA,CAAIY,WAAW,EACf,KAAA,CAAA;AAEFZ,IAAAA,GAAAA,CAAIK,MAAM,CAACQ,WAAW,CAACV,OAAOW,QAAQ,CAAA;AACtC,IAAA,MAAMC,EAAKf,GAAAA,GAAAA,CAAIK,MAAM,CAACW,WAAW,EAAA;AACjC,IAAA,MAAMC,OAAUd,GAAAA,MAAAA,CAAOe,WAAW,EAAA,GAAKH,GAAGI,KAAK;AAC/C,IAAA,MAAMC,OAAU,GAACL,CAAAA,EAAAA,CAAGM,MAAM,GAAGlB,MAAOmB,CAAAA,WAAW,EAAK,GAAA,CAAA,IAAKP,EAAAA,CAAGM,MAAM;IAClE,MAAME,OAAAA,GAAU,CAAIR,GAAAA,EAAAA,CAAGI,KAAK;IAC5B,MAAMK,OAAAA,GAAU,CAAIT,GAAAA,EAAAA,CAAGM,MAAM;AAC7B,IAAA,MAAMI,UAAapC,GAAAA,WAAAA;IACnBc,MAAOuB,CAAAA,WAAW,CAACC,SAAS,CAACF,UAAAA,CAAWG,KAAK,EAAEH,UAAWI,CAAAA,QAAQ,EAAEJ,UAAAA,CAAWK,QAAQ,CAAA;AACvF,IAAA,IAAIC,IAAO5B,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGC,YAAY,EAAA;AACpD,IAAA,IAAIC,KAAQ/B,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGG,aAAa,EAAA;AACtD,IAAA,IAAIC,MAASjC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGK,cAAc,EAAA;AACxD,IAAA,IAAIC,GAAMnC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGO,WAAW,EAAA;AAClD,IAAA,MAAMC,IAAOrC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGS,YAAY,EAAA;AACtD,IAAA,MAAMC,GAAMvC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGW,WAAW,EAAA;AACpD,IAAA,MAAMxB,QAAQe,KAAQH,GAAAA,IAAAA;AACtB,IAAA,MAAMV,SAASiB,GAAMF,GAAAA,MAAAA;AACrBL,IAAAA,IAAAA,IAAQZ,KAAQF,GAAAA,OAAAA;AAChBmB,IAAAA,MAAAA,IAAUf,MAASD,GAAAA,OAAAA;AACnBc,IAAAA,KAAAA,GAAQH,OAAOZ,KAAQI,GAAAA,OAAAA;AACvBe,IAAAA,GAAAA,GAAMF,SAASf,MAASG,GAAAA,OAAAA;IACxBC,UAAWmB,CAAAA,mBAAmB,CAC5BzC,MAAO0C,CAAAA,aAAa,KAChBC,SAAUC,CAAAA,OAAO,CAAChB,IAAMG,EAAAA,KAAAA,EAAOE,QAAQE,GAAKE,EAAAA,IAAAA,EAAME,OAClDI,SAAUE,CAAAA,KAAK,CAACjB,IAAMG,EAAAA,KAAAA,EAAOE,MAAQE,EAAAA,GAAAA,EAAKE,IAAME,EAAAA,GAAAA,CAAAA,CAAAA;AAEtD,IAAA,MAAMO,YAAY7C,QAAW,GAAA,IAAI8C,OAAQzB,CAAAA,UAAAA,CAAWK,QAAQ,CAAI,GAAA,IAAA;IAChE,MAAMqB,GAAAA,GAAM/C,QAAWD,GAAAA,MAAAA,CAAOiD,YAAY,CAACjD,OAAOe,WAAW,EAAA,EAAIf,MAAOmB,CAAAA,WAAW,EAAM,CAAA,GAAA,IAAA;IACzFtB,GAAIK,CAAAA,MAAM,CAACgD,cAAc,CAAC5C,EAAAA,CAAAA;IAC1BlB,gBAAiB+D,CAAAA,UAAU,GAAGC,OAAAA,CAAQC,IAAI,EAAA;AAC1CjE,IAAAA,gBAAAA,CAAiBkE,UAAU,GAAGC,iBAAAA;AAC9B,IAAA,MAAMC,EAAKpE,GAAAA,gBAAAA,CAAiBqE,SAAS,CAAC5D,GAAKyB,EAAAA,UAAAA,CAAAA;AAC3ClC,IAAAA,gBAAAA,CAAiBsE,MAAM,CAAC7D,GAAKyB,EAAAA,UAAAA,EAAY,IAAMkC,EAAAA,EAAAA,CAAAA;AAC/CA,IAAAA,EAAAA,CAAGG,OAAO,EAAA;IACV9D,GAAIK,CAAAA,MAAM,CAAC0D,eAAe,EAAA;AAC1B,IAAA,MAAMC,QAAWvD,GAAAA,EAAAA,CAAGwD,mBAAmB,EAAE,CAAC,CAAE,CAAA;AAC5C,IAAA,MAAMC,WAAczD,GAAAA,EAAAA,CAAGwD,mBAAmB,EAAE,CAAC,CAAE,CAAA;IAC/C,MAAME,WAAAA,GAAc,IAAIC,UAAW,CAAA,CAAA,CAAA;AACnC,IAAA,MAAMC,iBAAiBjE,QAAW,GAAA,IAAIgE,UAAW,CAAA,CAAA,CAAA,GAAK,IAAIE,YAAa,CAAA,CAAA,CAAA;IACvE,MAAMjE,MAAAA,GAASL,IAAIK,MAAM;;IAEzB,MAAMkE,kBAAAA,GAAqBrE,YAAYsE,+BAA+B,EAAA;IACtE,IAAIC,KAAAA;AACJ,IAAA,IAAIzE,GAAIK,CAAAA,MAAM,CAACC,IAAI,KAAK,OAAS,EAAA;QAC/BmE,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAAC;AAClB3E,YAAAA,GAAAA,CAAIK,MAAM,CAACuE,iBAAiB,CAAC,IAAMZ,QAAAA,CAASa,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGV,EAAAA,WAAAA,CAAAA,CAAAA;AACzEnE,YAAAA,GAAAA,CAAIK,MAAM,CAACuE,iBAAiB,CAAC,IAAMV,WAAAA,CAAYW,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGR,EAAAA,cAAAA,CAAAA;AAC7E,SAAA,CAAA;KACI,MAAA;QACLI,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAAC;AAClBX,YAAAA,QAAAA,CAASa,UAAU,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGV,EAAAA,WAAAA,CAAAA;AACtCD,YAAAA,WAAAA,CAAYW,UAAU,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGR,EAAAA,cAAAA;AAC1C,SAAA,CAAA;AACH;AACAI,IAAAA,KAAAA,CACGK,IAAI,CAAC,IAAA;AACJ,QAAA,MAAMC,WAAWR,kBAAmBJ,CAAAA,WAAAA,CAAAA;AACpC,QAAA,IAAIrE,IAAIM,QACJX,GAAAA,qBAAAA,CAAsB4E,kBAA6C3B,GACnE2B,GAAAA,cAAc,CAAC,CAAE,CAAA;AACrB,QAAA,MAAMW,gBAAmB,GAAA,IAAI9B,OAAQmB,CAAAA,cAAc,CAAC,CAAA,CAAE,EAAEA,cAAc,CAAC,CAAA,CAAE,EAAEA,cAAc,CAAC,CAAE,CAAA,CAAA;AAC5F,QAAA,IAAIjE,QAAU,EAAA;YACZ4E,gBAAiBC,CAAAA,CAAC,GAAGhC,SAAWgC,CAAAA,CAAC,GAAG9B,GAAK+B,CAAAA,SAAS,CAACD,CAAC,GAAGnF,CAAAA;YACvDkF,gBAAiBG,CAAAA,CAAC,GAAGlC,SAAWkC,CAAAA,CAAC,GAAGhC,GAAK+B,CAAAA,SAAS,CAACC,CAAC,GAAGrF,CAAAA;YACvDkF,gBAAiBI,CAAAA,CAAC,GAAGnC,SAAWmC,CAAAA,CAAC,GAAGjC,GAAK+B,CAAAA,SAAS,CAACE,CAAC,GAAGtF,CAAAA;YACvDA,CAAIoD,GAAAA,OAAAA,CAAQmC,QAAQ,CAACL,gBAAkB/B,EAAAA,SAAAA,CAAAA;AACzC;AACAhD,QAAAA,eAAAA,CACE8E,QACI,GAAA;YACEM,QAAUvF,EAAAA,CAAAA;AACVkF,YAAAA,gBAAAA;AACAD,YAAAA,QAAAA;AACAO,YAAAA,MAAAA,EAAQP,SAASQ,aAAa;SAEhC,GAAA,IAAA,CAAA;KAGPC,CAAAA,CAAAA,KAAK,CAAC,CAACC,IAAAA,GAAAA;QACNxF,eAAgB,CAAA,IAAA,CAAA;AAClB,KAAA,CAAA,CACCyF,OAAO,CAAC,IAAA;QACPrF,MAAOK,CAAAA,IAAI,CAACiF,kBAAkB,CAAClF,EAAAA,CAAAA;AACjC,KAAA,CAAA;AACJ;;;;"}
1
+ {"version":3,"file":"gpu_picking.js","sources":["../../src/render/gpu_picking.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Matrix4x4, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { DrawContext } from './drawable';\r\nimport type { RenderQueue } from './render_queue';\r\nimport { type PickResult, Camera } from '../camera';\r\nimport { ObjectColorPass } from './objectcolorpass';\r\n\r\nconst _pickCamera = new Camera(null);\r\nconst _objectColorPass = new ObjectColorPass();\r\n\r\n/**\r\n * Perform GPU-based object picking by rendering object IDs to a 1x1 framebuffer.\r\n * @internal\r\n */\r\nexport function renderObjectColors(\r\n ctx: DrawContext,\r\n pickResolveFunc: (result: Nullable<PickResult>) => void,\r\n renderQueue: RenderQueue\r\n): void {\r\n const camera = ctx.camera;\r\n ctx.renderPass = _objectColorPass;\r\n ctx.device.pushDeviceStates();\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 1,\r\n 1,\r\n ['rgba8unorm', 'rgba32f'],\r\n ctx.depthFormat,\r\n false\r\n );\r\n ctx.device.setViewport(camera.viewport);\r\n const vp = ctx.device.getViewport();\r\n const windowX = camera.getPickPosX() / vp.width;\r\n const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;\r\n const windowW = 1 / vp.width;\r\n const windowH = 1 / vp.height;\r\n const pickCamera = _pickCamera;\r\n camera.worldMatrix.decompose(pickCamera.scale, pickCamera.rotation, pickCamera.position);\r\n let left = camera.getProjectionMatrix().getLeftPlane();\r\n let right = camera.getProjectionMatrix().getRightPlane();\r\n let bottom = camera.getProjectionMatrix().getBottomPlane();\r\n let top = camera.getProjectionMatrix().getTopPlane();\r\n const near = camera.getProjectionMatrix().getNearPlane();\r\n const far = camera.getProjectionMatrix().getFarPlane();\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * windowX;\r\n bottom += height * windowY;\r\n right = left + width * windowW;\r\n top = bottom + height * windowH;\r\n pickCamera.setProjectionMatrix(\r\n camera.isPerspective()\r\n ? Matrix4x4.frustum(left, right, bottom, top, near, far)\r\n : Matrix4x4.ortho(left, right, bottom, top, near, far)\r\n );\r\n ctx.device.setFramebuffer(fb);\r\n _objectColorPass.clearColor = Vector4.zero();\r\n _objectColorPass.clearDepth = DEPTH_CLEAR_VALUE;\r\n const rq = _objectColorPass.cullScene(ctx, pickCamera);\r\n _objectColorPass.render(ctx, pickCamera, null, rq);\r\n rq.dispose();\r\n ctx.device.popDeviceStates();\r\n const colorTex = fb.getColorAttachments()[0];\r\n const distanceTex = fb.getColorAttachments()[1];\r\n const colorPixels = new Uint8Array(4);\r\n const distancePixels = new Float32Array(4);\r\n const device = ctx.device;\r\n // RenderGraph releases the frame RenderQueue before the asynchronous GPU readback completes.\r\n const getDrawableByColor = renderQueue.createObjectColorLookupSnapshot();\r\n Promise.all([\r\n colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),\r\n distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)\r\n ])\r\n .then(() => {\r\n const drawable = getDrawableByColor(colorPixels);\r\n const d = distancePixels[0];\r\n const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);\r\n pickResolveFunc(\r\n drawable\r\n ? {\r\n distance: d,\r\n intersectedPoint,\r\n drawable,\r\n target: drawable.getPickTarget()\r\n }\r\n : null\r\n );\r\n })\r\n .catch((_err) => {\r\n pickResolveFunc(null);\r\n })\r\n .finally(() => {\r\n device.pool.releaseFrameBuffer(fb);\r\n });\r\n}\r\n"],"names":["_pickCamera","Camera","_objectColorPass","ObjectColorPass","renderObjectColors","ctx","pickResolveFunc","renderQueue","camera","renderPass","device","pushDeviceStates","fb","pool","fetchTemporalFramebuffer","depthFormat","setViewport","viewport","vp","getViewport","windowX","getPickPosX","width","windowY","height","getPickPosY","windowW","windowH","pickCamera","worldMatrix","decompose","scale","rotation","position","left","getProjectionMatrix","getLeftPlane","right","getRightPlane","bottom","getBottomPlane","top","getTopPlane","near","getNearPlane","far","getFarPlane","setProjectionMatrix","isPerspective","Matrix4x4","frustum","ortho","setFramebuffer","clearColor","Vector4","zero","clearDepth","DEPTH_CLEAR_VALUE","rq","cullScene","render","dispose","popDeviceStates","colorTex","getColorAttachments","distanceTex","colorPixels","Uint8Array","distancePixels","Float32Array","getDrawableByColor","createObjectColorLookupSnapshot","Promise","all","readPixels","then","drawable","d","intersectedPoint","Vector3","distance","target","getPickTarget","catch","_err","finally","releaseFrameBuffer"],"mappings":"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"}