@zephyr3d/scene 0.9.26 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -0,0 +1,209 @@
1
+ import { PBPrimitiveType } from '@zephyr3d/device';
2
+
3
+ function scalarByteSize(type) {
4
+ switch(type){
5
+ case PBPrimitiveType.I16:
6
+ case PBPrimitiveType.I16_NORM:
7
+ case PBPrimitiveType.U16:
8
+ case PBPrimitiveType.U16_NORM:
9
+ case PBPrimitiveType.F16:
10
+ return 2;
11
+ case PBPrimitiveType.I32:
12
+ case PBPrimitiveType.I32_NORM:
13
+ case PBPrimitiveType.U32:
14
+ case PBPrimitiveType.U32_NORM:
15
+ case PBPrimitiveType.F32:
16
+ return 4;
17
+ default:
18
+ return 1;
19
+ }
20
+ }
21
+ function readScalar(view, byteOffset, scalarType, normalized) {
22
+ switch(scalarType){
23
+ case PBPrimitiveType.I8:
24
+ case PBPrimitiveType.I8_NORM:
25
+ {
26
+ const value = view.getInt8(byteOffset);
27
+ return normalized ? Math.max(-1, value / 127) : value;
28
+ }
29
+ case PBPrimitiveType.U8:
30
+ case PBPrimitiveType.U8_NORM:
31
+ {
32
+ const value = view.getUint8(byteOffset);
33
+ return normalized ? value / 255 : value;
34
+ }
35
+ case PBPrimitiveType.I16:
36
+ case PBPrimitiveType.I16_NORM:
37
+ {
38
+ const value = view.getInt16(byteOffset, true);
39
+ return normalized ? Math.max(-1, value / 32767) : value;
40
+ }
41
+ case PBPrimitiveType.U16:
42
+ case PBPrimitiveType.U16_NORM:
43
+ {
44
+ const value = view.getUint16(byteOffset, true);
45
+ return normalized ? value / 65535 : value;
46
+ }
47
+ case PBPrimitiveType.I32:
48
+ case PBPrimitiveType.I32_NORM:
49
+ {
50
+ const value = view.getInt32(byteOffset, true);
51
+ return normalized ? Math.max(-1, value / 2147483647) : value;
52
+ }
53
+ case PBPrimitiveType.U32:
54
+ case PBPrimitiveType.U32_NORM:
55
+ {
56
+ const value = view.getUint32(byteOffset, true);
57
+ return normalized ? value / 4294967295 : value;
58
+ }
59
+ case PBPrimitiveType.F32:
60
+ return view.getFloat32(byteOffset, true);
61
+ default:
62
+ return 0;
63
+ }
64
+ }
65
+ /**
66
+ * Reads a vertex attribute of a primitive back from the GPU, as tightly packed
67
+ * floats: `componentCount` per vertex, for every vertex in the vertex buffer.
68
+ *
69
+ * @remarks
70
+ * Handles interleaved buffers and integer formats, normalized or not. Half
71
+ * float attributes are not supported and throw.
72
+ *
73
+ * @returns The data, or null if the primitive has no such attribute or it has
74
+ * fewer than `componentCount` components.
75
+ *
76
+ * @public
77
+ */ async function readPrimitiveAttribute(primitive, semantic, componentCount) {
78
+ const info = primitive.getVertexBufferInfo(semantic);
79
+ if (!info || !info.type.isPrimitiveType() || info.type.cols < componentCount) {
80
+ return null;
81
+ }
82
+ const vertexCount = primitive.getNumVertices();
83
+ if (vertexCount <= 0) {
84
+ return null;
85
+ }
86
+ const bytes = await info.buffer.getBufferSubData();
87
+ const result = new Float32Array(vertexCount * componentCount);
88
+ const scalarType = info.type.scalarType;
89
+ const normalized = info.type.normalized;
90
+ const componentByteSize = scalarByteSize(scalarType);
91
+ const baseByteOffset = info.drawOffset + info.offset;
92
+ if (scalarType === PBPrimitiveType.F32 && !normalized && baseByteOffset % 4 === 0 && info.stride % 4 === 0) {
93
+ const raw = new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
94
+ const stride = info.stride >> 2;
95
+ const srcOffset = baseByteOffset >> 2;
96
+ for(let i = 0; i < vertexCount; i++){
97
+ const src = srcOffset + i * stride;
98
+ const dst = i * componentCount;
99
+ for(let c = 0; c < componentCount; c++){
100
+ result[dst + c] = raw[src + c];
101
+ }
102
+ }
103
+ return result;
104
+ }
105
+ if (scalarType === PBPrimitiveType.F16) {
106
+ throw new Error(`Unsupported ${semantic} attribute format: half float`);
107
+ }
108
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
109
+ for(let i = 0; i < vertexCount; i++){
110
+ const src = baseByteOffset + i * info.stride;
111
+ const dst = i * componentCount;
112
+ for(let c = 0; c < componentCount; c++){
113
+ result[dst + c] = readScalar(view, src + c * componentByteSize, scalarType, normalized);
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ /**
119
+ * Reads a range of a triangle-list primitive's indices back from the GPU, as
120
+ * indices into its whole vertex buffer.
121
+ *
122
+ * @remarks
123
+ * The range defaults to what the primitive draws at full detail: its
124
+ * `indexStart` and `indexCount`, which for a primitive with LODs is LOD 0 only
125
+ * (the other levels are further ranges of the same index buffer). For a
126
+ * primitive without an index buffer the range is of vertices.
127
+ *
128
+ * @public
129
+ */ async function readPrimitiveIndices(primitive, indexStart = primitive.indexStart, indexCount = primitive.indexCount) {
130
+ if (primitive.primitiveType !== 'triangle-list') {
131
+ throw new Error(`Only triangle-list primitives can be read as triangles, not ${primitive.primitiveType}`);
132
+ }
133
+ if (indexCount <= 0 || indexCount % 3 !== 0 || indexStart < 0) {
134
+ throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
135
+ }
136
+ const indexBuffer = primitive.getIndexBuffer();
137
+ if (!indexBuffer) {
138
+ if (indexStart + indexCount > primitive.getNumVertices()) {
139
+ throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
140
+ }
141
+ const indices = new Uint32Array(indexCount);
142
+ for(let i = 0; i < indexCount; i++){
143
+ indices[i] = indexStart + i;
144
+ }
145
+ return indices;
146
+ }
147
+ const bytes = await indexBuffer.getBufferSubData();
148
+ const is16 = indexBuffer.indexType.primitiveType === PBPrimitiveType.U16;
149
+ const all = is16 ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1) : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
150
+ if (indexStart + indexCount > all.length) {
151
+ throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
152
+ }
153
+ return Uint32Array.from(all.subarray(indexStart, indexStart + indexCount));
154
+ }
155
+ /**
156
+ * Reads the triangles of one level of detail of a triangle-list primitive back
157
+ * from the GPU, keeping only the vertices they use.
158
+ *
159
+ * @param lod - Level of detail; 0 is full detail. Levels beyond the primitive's
160
+ * lowest detail use the lowest.
161
+ *
162
+ * @public
163
+ */ async function readPrimitiveTriangles(primitive, lod = 0) {
164
+ const level = Math.min(Math.max(0, Math.floor(lod)), primitive.lods.length);
165
+ const [indexStart, indexCount] = level === 0 ? [
166
+ primitive.indexStart,
167
+ primitive.indexCount
168
+ ] : [
169
+ primitive.lods[level - 1].indexStart,
170
+ primitive.lods[level - 1].indexCount
171
+ ];
172
+ const [positions, indices] = await Promise.all([
173
+ readPrimitiveAttribute(primitive, 'position', 3),
174
+ readPrimitiveIndices(primitive, indexStart, indexCount)
175
+ ]);
176
+ if (!positions) {
177
+ throw new Error('Primitive has no vertex positions');
178
+ }
179
+ // Other levels share the vertex buffer; keep only the vertices this one uses.
180
+ const vertexCount = positions.length / 3;
181
+ const remap = new Int32Array(vertexCount).fill(-1);
182
+ let used = 0;
183
+ for(let i = 0; i < indices.length; i++){
184
+ const v = indices[i];
185
+ if (v >= vertexCount) {
186
+ throw new Error(`Index ${v} out of range of ${vertexCount} vertices`);
187
+ }
188
+ if (remap[v] < 0) {
189
+ remap[v] = used++;
190
+ }
191
+ indices[i] = remap[v];
192
+ }
193
+ const compact = new Float32Array(used * 3);
194
+ for(let v = 0; v < vertexCount; v++){
195
+ const dst = remap[v];
196
+ if (dst >= 0) {
197
+ compact[dst * 3] = positions[v * 3];
198
+ compact[dst * 3 + 1] = positions[v * 3 + 1];
199
+ compact[dst * 3 + 2] = positions[v * 3 + 2];
200
+ }
201
+ }
202
+ return {
203
+ positions: compact,
204
+ indices
205
+ };
206
+ }
207
+
208
+ export { readPrimitiveAttribute, readPrimitiveIndices, readPrimitiveTriangles };
209
+ //# sourceMappingURL=primitive_readback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitive_readback.js","sources":["../../src/render/primitive_readback.ts"],"sourcesContent":["import { PBPrimitiveType } from '@zephyr3d/device';\r\nimport type { Primitive } from './primitive';\r\n\r\n/**\r\n * Triangles read back from a primitive, with only the vertices they use.\r\n *\r\n * @public\r\n */\r\nexport interface PrimitiveTriangles {\r\n /** Vertex positions in the primitive's local space, xyz per vertex. */\r\n positions: Float32Array<ArrayBuffer>;\r\n /** Three indices into `positions` per triangle. */\r\n indices: Uint32Array<ArrayBuffer>;\r\n}\r\n\r\nfunction scalarByteSize(type: PBPrimitiveType) {\r\n switch (type) {\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM:\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM:\r\n case PBPrimitiveType.F16:\r\n return 2;\r\n case PBPrimitiveType.I32:\r\n case PBPrimitiveType.I32_NORM:\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.U32_NORM:\r\n case PBPrimitiveType.F32:\r\n return 4;\r\n default:\r\n return 1;\r\n }\r\n}\r\n\r\nfunction readScalar(view: DataView, byteOffset: number, scalarType: PBPrimitiveType, normalized: boolean) {\r\n switch (scalarType) {\r\n case PBPrimitiveType.I8:\r\n case PBPrimitiveType.I8_NORM: {\r\n const value = view.getInt8(byteOffset);\r\n return normalized ? Math.max(-1, value / 127) : value;\r\n }\r\n case PBPrimitiveType.U8:\r\n case PBPrimitiveType.U8_NORM: {\r\n const value = view.getUint8(byteOffset);\r\n return normalized ? value / 255 : value;\r\n }\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM: {\r\n const value = view.getInt16(byteOffset, true);\r\n return normalized ? Math.max(-1, value / 32767) : value;\r\n }\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM: {\r\n const value = view.getUint16(byteOffset, true);\r\n return normalized ? value / 65535 : value;\r\n }\r\n case PBPrimitiveType.I32:\r\n case PBPrimitiveType.I32_NORM: {\r\n const value = view.getInt32(byteOffset, true);\r\n return normalized ? Math.max(-1, value / 2147483647) : value;\r\n }\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.U32_NORM: {\r\n const value = view.getUint32(byteOffset, true);\r\n return normalized ? value / 4294967295 : value;\r\n }\r\n case PBPrimitiveType.F32:\r\n return view.getFloat32(byteOffset, true);\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Reads a vertex attribute of a primitive back from the GPU, as tightly packed\r\n * floats: `componentCount` per vertex, for every vertex in the vertex buffer.\r\n *\r\n * @remarks\r\n * Handles interleaved buffers and integer formats, normalized or not. Half\r\n * float attributes are not supported and throw.\r\n *\r\n * @returns The data, or null if the primitive has no such attribute or it has\r\n * fewer than `componentCount` components.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveAttribute(\r\n primitive: Primitive,\r\n semantic: 'position' | 'normal' | 'blendIndices' | 'blendWeights',\r\n componentCount: number\r\n): Promise<Float32Array<ArrayBuffer> | null> {\r\n const info = primitive.getVertexBufferInfo(semantic);\r\n if (!info || !info.type.isPrimitiveType() || info.type.cols < componentCount) {\r\n return null;\r\n }\r\n const vertexCount = primitive.getNumVertices();\r\n if (vertexCount <= 0) {\r\n return null;\r\n }\r\n const bytes = await info.buffer.getBufferSubData();\r\n const result = new Float32Array(vertexCount * componentCount);\r\n const scalarType = info.type.scalarType;\r\n const normalized = info.type.normalized;\r\n const componentByteSize = scalarByteSize(scalarType);\r\n const baseByteOffset = info.drawOffset + info.offset;\r\n if (\r\n scalarType === PBPrimitiveType.F32 &&\r\n !normalized &&\r\n baseByteOffset % 4 === 0 &&\r\n info.stride % 4 === 0\r\n ) {\r\n const raw = new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\r\n const stride = info.stride >> 2;\r\n const srcOffset = baseByteOffset >> 2;\r\n for (let i = 0; i < vertexCount; i++) {\r\n const src = srcOffset + i * stride;\r\n const dst = i * componentCount;\r\n for (let c = 0; c < componentCount; c++) {\r\n result[dst + c] = raw[src + c];\r\n }\r\n }\r\n return result;\r\n }\r\n if (scalarType === PBPrimitiveType.F16) {\r\n throw new Error(`Unsupported ${semantic} attribute format: half float`);\r\n }\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n for (let i = 0; i < vertexCount; i++) {\r\n const src = baseByteOffset + i * info.stride;\r\n const dst = i * componentCount;\r\n for (let c = 0; c < componentCount; c++) {\r\n result[dst + c] = readScalar(view, src + c * componentByteSize, scalarType, normalized);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Reads a range of a triangle-list primitive's indices back from the GPU, as\r\n * indices into its whole vertex buffer.\r\n *\r\n * @remarks\r\n * The range defaults to what the primitive draws at full detail: its\r\n * `indexStart` and `indexCount`, which for a primitive with LODs is LOD 0 only\r\n * (the other levels are further ranges of the same index buffer). For a\r\n * primitive without an index buffer the range is of vertices.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveIndices(\r\n primitive: Primitive,\r\n indexStart = primitive.indexStart,\r\n indexCount = primitive.indexCount\r\n): Promise<Uint32Array<ArrayBuffer>> {\r\n if (primitive.primitiveType !== 'triangle-list') {\r\n throw new Error(`Only triangle-list primitives can be read as triangles, not ${primitive.primitiveType}`);\r\n }\r\n if (indexCount <= 0 || indexCount % 3 !== 0 || indexStart < 0) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n const indexBuffer = primitive.getIndexBuffer();\r\n if (!indexBuffer) {\r\n if (indexStart + indexCount > primitive.getNumVertices()) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n const indices = new Uint32Array(indexCount);\r\n for (let i = 0; i < indexCount; i++) {\r\n indices[i] = indexStart + i;\r\n }\r\n return indices;\r\n }\r\n const bytes = await indexBuffer.getBufferSubData();\r\n const is16 = indexBuffer.indexType.primitiveType === PBPrimitiveType.U16;\r\n const all = is16\r\n ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1)\r\n : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\r\n if (indexStart + indexCount > all.length) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n return Uint32Array.from(all.subarray(indexStart, indexStart + indexCount));\r\n}\r\n\r\n/**\r\n * Reads the triangles of one level of detail of a triangle-list primitive back\r\n * from the GPU, keeping only the vertices they use.\r\n *\r\n * @param lod - Level of detail; 0 is full detail. Levels beyond the primitive's\r\n * lowest detail use the lowest.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveTriangles(primitive: Primitive, lod = 0): Promise<PrimitiveTriangles> {\r\n const level = Math.min(Math.max(0, Math.floor(lod)), primitive.lods.length);\r\n const [indexStart, indexCount] =\r\n level === 0\r\n ? [primitive.indexStart, primitive.indexCount]\r\n : [primitive.lods[level - 1].indexStart, primitive.lods[level - 1].indexCount];\r\n const [positions, indices] = await Promise.all([\r\n readPrimitiveAttribute(primitive, 'position', 3),\r\n readPrimitiveIndices(primitive, indexStart, indexCount)\r\n ]);\r\n if (!positions) {\r\n throw new Error('Primitive has no vertex positions');\r\n }\r\n // Other levels share the vertex buffer; keep only the vertices this one uses.\r\n const vertexCount = positions.length / 3;\r\n const remap = new Int32Array(vertexCount).fill(-1);\r\n let used = 0;\r\n for (let i = 0; i < indices.length; i++) {\r\n const v = indices[i];\r\n if (v >= vertexCount) {\r\n throw new Error(`Index ${v} out of range of ${vertexCount} vertices`);\r\n }\r\n if (remap[v] < 0) {\r\n remap[v] = used++;\r\n }\r\n indices[i] = remap[v];\r\n }\r\n const compact = new Float32Array(used * 3);\r\n for (let v = 0; v < vertexCount; v++) {\r\n const dst = remap[v];\r\n if (dst >= 0) {\r\n compact[dst * 3] = positions[v * 3];\r\n compact[dst * 3 + 1] = positions[v * 3 + 1];\r\n compact[dst * 3 + 2] = positions[v * 3 + 2];\r\n }\r\n }\r\n return { positions: compact, indices };\r\n}\r\n"],"names":["scalarByteSize","type","PBPrimitiveType","I16","I16_NORM","U16","U16_NORM","F16","I32","I32_NORM","U32","U32_NORM","F32","readScalar","view","byteOffset","scalarType","normalized","I8","I8_NORM","value","getInt8","Math","max","U8","U8_NORM","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","readPrimitiveAttribute","primitive","semantic","componentCount","info","getVertexBufferInfo","isPrimitiveType","cols","vertexCount","getNumVertices","bytes","buffer","getBufferSubData","result","Float32Array","componentByteSize","baseByteOffset","drawOffset","offset","stride","raw","byteLength","srcOffset","i","src","dst","c","Error","DataView","readPrimitiveIndices","indexStart","indexCount","primitiveType","indexBuffer","getIndexBuffer","indices","Uint32Array","is16","indexType","all","Uint16Array","length","from","subarray","readPrimitiveTriangles","lod","level","min","floor","lods","positions","Promise","remap","Int32Array","fill","used","v","compact"],"mappings":"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"}
@@ -5,13 +5,14 @@ import { ShaderHelper } from '../material/shader/helper.js';
5
5
  import '../material/lambert.js';
6
6
  import '../material/blinn.js';
7
7
  import '../material/unlit.js';
8
+ import '../material/meshmaterial.js';
8
9
  import '../material/particle.js';
9
10
  import '../material/subsurfaceprofile.js';
10
- import '../material/skin.js';
11
+ import '../material/sssprofile.js';
12
+ import '../material/sss.js';
11
13
  import '../material/eye.js';
12
14
  import { RenderBundleWrapper } from './renderbundle_wrapper.js';
13
15
  import { getDevice } from '../app/api.js';
14
- import '../material/meshmaterial.js';
15
16
  import '../material/hair.js';
16
17
  import '../material/hairstrand.js';
17
18
  import '../material/grassmaterial.js';
@@ -23,6 +24,7 @@ import '../material/pbrblueprint.js';
23
24
  import '../material/sprite.js';
24
25
  import '../material/sprite_std.js';
25
26
  import '../utility/blueprint/material/texture.js';
27
+ import { InstanceCuller } from './instance_culling.js';
26
28
 
27
29
  const maxBufferSizeInFloats = 65536 / 4;
28
30
  /**
@@ -100,18 +102,34 @@ const tmpDrawablePos = new Vector3();
100
102
  /** @internal */ _sunLight;
101
103
  /** @internal */ _primaryDirectionalLight;
102
104
  /** @internal */ _primaryTransmissionLight;
105
+ /**
106
+ * Visible water surfaces, in visit order.
107
+ *
108
+ * Collected separately from the item lists so passes that run before the light
109
+ * pass - the caustics pass, which has to know where the water plane is before
110
+ * anything shades under it - can find them without walking every draw item.
111
+ * @internal
112
+ */ _waterList;
103
113
  /** @internal */ _bindGroupAllocator;
104
114
  /** @internal */ _ref;
105
115
  /** @internal */ _instanceInfo;
106
116
  /** @internal */ _needSceneColor;
107
117
  _needSceneDepth;
118
+ _needHiZNearest;
108
119
  _needSceneColorWithDepth;
109
120
  /** @internal */ _drawTransparent;
110
121
  /** @internal */ _objectColorMaps;
122
+ /** @internal */ _cullCamera;
123
+ /** @internal */ _lodCamera;
124
+ /** @internal Culls the instances of the batches on the GPU, see InstanceCuller */ _instanceCuller;
125
+ /** @internal Queues pushed into this one, which may cull their instances for its view */ _childQueues;
111
126
  /**
112
127
  * Creates an instance of a render queue
113
128
  * @param renderPass - The render pass to which the render queue belongs
114
- */ constructor(renderPass, bindGroupAllocator){
129
+ * @param bindGroupAllocator - Allocator of instance data, default the shared one
130
+ * @param instanceCulling - Whether the instances of the batches are frustum culled on the GPU
131
+ * for each view the queue is pushed to, where supported. For queues built once and replayed
132
+ */ constructor(renderPass, bindGroupAllocator, instanceCulling){
115
133
  super();
116
134
  this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;
117
135
  this._itemList = null;
@@ -121,6 +139,7 @@ const tmpDrawablePos = new Vector3();
121
139
  this._sunLight = null;
122
140
  this._primaryDirectionalLight = null;
123
141
  this._primaryTransmissionLight = null;
142
+ this._waterList = [];
124
143
  this._ref = {
125
144
  ref: this,
126
145
  valid: true
@@ -128,11 +147,56 @@ const tmpDrawablePos = new Vector3();
128
147
  this._instanceInfo = new Map();
129
148
  this._needSceneColor = false;
130
149
  this._needSceneDepth = false;
150
+ this._needHiZNearest = false;
131
151
  this._needSceneColorWithDepth = false;
132
152
  this._drawTransparent = false;
133
153
  this._objectColorMaps = [
134
154
  new Map()
135
155
  ];
156
+ this._cullCamera = null;
157
+ this._lodCamera = null;
158
+ this._instanceCuller = instanceCulling && InstanceCuller.isSupported() ? new InstanceCuller() : null;
159
+ this._childQueues = [];
160
+ }
161
+ /**
162
+ * Cull the instances of the queues pushed into this one for its view, before drawing it.
163
+ *
164
+ * @internal
165
+ */ cullInstances() {
166
+ for (const child of this._childQueues){
167
+ child._instanceCuller?.cull(this);
168
+ }
169
+ }
170
+ /**
171
+ * Have the bounds of a batched drawable updated for GPU instance culling.
172
+ *
173
+ * @internal
174
+ */ markInstanceBoundsDirty(drawable) {
175
+ this._instanceCuller?.markBoundsDirty(drawable);
176
+ }
177
+ /**
178
+ * The camera this queue was culled with, set by {@link RenderQueue.end}.
179
+ *
180
+ * Differs from the draw context camera in shadow passes, which cull from the light. Drawables
181
+ * that cull their own sub-parts (clipmap terrain tiles) need it to keep only what the pass
182
+ * can see.
183
+ * @internal
184
+ */ get cullCamera() {
185
+ return this._cullCamera;
186
+ }
187
+ /**
188
+ * The camera whose view selects the levels of detail, set by {@link RenderQueue.end}: the main
189
+ * camera in shadow passes, where it differs from the cull camera.
190
+ * @internal
191
+ */ get lodCamera() {
192
+ return this._lodCamera;
193
+ }
194
+ /**
195
+ * Whether the instances of the batches are culled on the GPU, which then also selects the
196
+ * levels of detail where the device allows
197
+ * @internal
198
+ */ get culledOnGpu() {
199
+ return !!this._instanceCuller;
136
200
  }
137
201
  /** The sun light */ get sunLight() {
138
202
  return this._sunLight;
@@ -168,6 +232,17 @@ const tmpDrawablePos = new Vector3();
168
232
  /** @internal */ needSceneDepth() {
169
233
  return this._needSceneDepth;
170
234
  }
235
+ /**
236
+ * Whether any drawable needs the Hi-Z pyramid's nearest-depth channel.
237
+ *
238
+ * Materials request it the way they request the scene colour and depth, which
239
+ * is what lets a surface that queries the scene's proximity - water foam
240
+ * against a shoreline or a piling - turn the second channel on without the
241
+ * application having to know it exists.
242
+ * @internal
243
+ */ needHiZNearest() {
244
+ return this._needHiZNearest;
245
+ }
171
246
  /** @internal */ needSceneColorWithDepth() {
172
247
  return this._needSceneColorWithDepth;
173
248
  }
@@ -187,6 +262,15 @@ const tmpDrawablePos = new Vector3();
187
262
  */ get shadowedLights() {
188
263
  return this._shadowedLightList;
189
264
  }
265
+ /** Visible water surfaces collected while culling. */ get waters() {
266
+ return this._waterList;
267
+ }
268
+ /**
269
+ * Record a visible water surface.
270
+ * @param water - The water node that passed culling.
271
+ */ pushWater(water) {
272
+ this._waterList.push(water);
273
+ }
190
274
  /**
191
275
  * Gets the unshadowed lights
192
276
  */ get unshadowedLights() {
@@ -236,6 +320,10 @@ const tmpDrawablePos = new Vector3();
236
320
  * Push items from another render queue
237
321
  * @param queue - The render queue to be pushed
238
322
  */ pushRenderQueue(queue) {
323
+ if (queue._instanceCuller) {
324
+ this._childQueues.push(queue);
325
+ }
326
+ this._waterList.push(...queue._waterList);
239
327
  const newItemLists = queue._itemList;
240
328
  if (!newItemLists) {
241
329
  return;
@@ -253,6 +341,7 @@ const tmpDrawablePos = new Vector3();
253
341
  this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);
254
342
  this._needSceneColor ||= queue._needSceneColor;
255
343
  this._needSceneDepth ||= queue._needSceneDepth;
344
+ this._needHiZNearest ||= queue._needHiZNearest;
256
345
  this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;
257
346
  this._drawTransparent ||= queue._drawTransparent;
258
347
  this._sunLight ||= queue._sunLight;
@@ -268,7 +357,8 @@ const tmpDrawablePos = new Vector3();
268
357
  * Push an item to the render queue
269
358
  * @param camera - The camera for drawing the item
270
359
  * @param drawable - The object to be drawn
271
- */ push(camera, drawable) {
360
+ * @param lod - Level of detail to draw the drawable's primitive at, default 0
361
+ */ push(camera, drawable, lod = 0) {
272
362
  if (drawable) {
273
363
  drawable.pushRenderQueueRef(this._ref);
274
364
  if (!this._itemList) {
@@ -281,19 +371,30 @@ const tmpDrawablePos = new Vector3();
281
371
  const transmission = !!drawable.needSceneColor() || needDepth;
282
372
  this._needSceneColor ||= transmission;
283
373
  this._needSceneDepth ||= drawable.needSceneDepth();
374
+ this._needHiZNearest ||= !!drawable.needHiZNearest?.();
284
375
  this._needSceneColorWithDepth ||= transmission && needDepth;
285
376
  this._drawTransparent ||= trans;
286
377
  if (camera.getPickResultResolveFunc()) {
287
378
  drawable.getMaterial().objectColor = drawable.getObjectColor();
288
379
  this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);
289
380
  }
290
- if (drawable.isBatchable()) {
291
- const instanceList = trans ? transmission ? unlit ? this._itemList.transmission_trans.unlit[0].instanceList : this._itemList.transmission_trans.lit[0].instanceList : unlit ? this._itemList.transparent.unlit[0].instanceList : this._itemList.transparent.lit[0].instanceList : transmission ? unlit ? this._itemList.transmission.unlit[0].instanceList : this._itemList.transmission.lit[0].instanceList : unlit ? this._itemList.opaque.unlit[0].instanceList : this._itemList.opaque.lit[0].instanceList;
292
- const hash = drawable.getInstanceId(this._renderPass);
381
+ // Meshes colored by level of detail draw with another material than the one whose instance
382
+ // data a batch would hold
383
+ if (drawable.isBatchable() && !camera.lodColoration) {
384
+ const info = trans ? transmission ? unlit ? this._itemList.transmission_trans.unlit[0] : this._itemList.transmission_trans.lit[0] : unlit ? this._itemList.transparent.unlit[0] : this._itemList.transparent.lit[0] : transmission ? unlit ? this._itemList.transmission.unlit[0] : this._itemList.transmission.lit[0] : unlit ? this._itemList.opaque.unlit[0] : this._itemList.opaque.lit[0];
385
+ const instanceList = info.instanceList;
386
+ // Levels of detail of one primitive draw different index ranges, each its own batch,
387
+ // unless GPU culling selects the level of every instance of the batch
388
+ if (this._instanceCuller && InstanceCuller.selectsLod(drawable)) {
389
+ lod = 0;
390
+ }
391
+ const id = drawable.getInstanceId(this._renderPass);
392
+ const hash = lod > 0 ? `${id}:lod${lod}` : id;
293
393
  let drawableList = instanceList[hash];
294
394
  if (!drawableList) {
295
395
  drawableList = [];
296
396
  instanceList[hash] = drawableList;
397
+ info.instanceLods[hash] = lod;
297
398
  }
298
399
  drawableList.push(drawable);
299
400
  } else {
@@ -313,7 +414,8 @@ const tmpDrawablePos = new Vector3();
313
414
  this.binaryInsert(queue, {
314
415
  drawable,
315
416
  sortDistance: drawable.getSortDistance(camera),
316
- instanceData: null
417
+ instanceData: null,
418
+ lod
317
419
  });
318
420
  if (material) {
319
421
  list.materialList.add(material.coreMaterial);
@@ -322,6 +424,55 @@ const tmpDrawablePos = new Vector3();
322
424
  }
323
425
  }
324
426
  }
427
+ /**
428
+ * Give every drawable of the queue its object color and register it for GPU picking.
429
+ *
430
+ * @remarks
431
+ * {@link push} does this for queues culled in a frame that picks. A queue built once and kept
432
+ * across frames (BatchGroup) was usually built in a frame that did not, so it is done again
433
+ * whenever a frame picks.
434
+ *
435
+ * @internal
436
+ */ registerObjectColors() {
437
+ const map = this._objectColorMaps[0];
438
+ const register = (drawable)=>{
439
+ const material = drawable.getMaterial();
440
+ if (material) {
441
+ material.objectColor = drawable.getObjectColor();
442
+ }
443
+ map.set(drawable.getDrawableId(), drawable);
444
+ };
445
+ for (const drawable of this._instanceInfo.keys()){
446
+ register(drawable);
447
+ }
448
+ const itemList = this._itemList;
449
+ if (itemList) {
450
+ for (const bundle of [
451
+ itemList.opaque,
452
+ itemList.transmission,
453
+ itemList.transparent,
454
+ itemList.transmission_trans
455
+ ]){
456
+ for (const info of [
457
+ ...bundle.lit,
458
+ ...bundle.unlit
459
+ ]){
460
+ if (info.renderQueue === this) {
461
+ for (const list of [
462
+ info.itemList,
463
+ info.skinItemList,
464
+ info.morphItemList,
465
+ info.skinAndMorphItemList
466
+ ]){
467
+ for (const item of list){
468
+ register(item.drawable);
469
+ }
470
+ }
471
+ }
472
+ }
473
+ }
474
+ }
475
+ }
325
476
  /** @internal */ getDrawableByColor(c, map) {
326
477
  const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];
327
478
  map = map ?? this._objectColorMaps;
@@ -366,6 +517,9 @@ const tmpDrawablePos = new Vector3();
366
517
  if (info.instanceRenderBundle) {
367
518
  info.instanceRenderBundle.dispose();
368
519
  }
520
+ if (info.skinInstanceRenderBundle) {
521
+ info.skinInstanceRenderBundle.dispose();
522
+ }
369
523
  }
370
524
  }
371
525
  }
@@ -378,6 +532,7 @@ const tmpDrawablePos = new Vector3();
378
532
  valid: true
379
533
  };
380
534
  this._instanceInfo.clear();
535
+ this._childQueues.length = 0;
381
536
  this._objectColorMaps.length = 0;
382
537
  this._objectColorMaps.push(new Map());
383
538
  this._shadowedLightList = [];
@@ -385,12 +540,22 @@ const tmpDrawablePos = new Vector3();
385
540
  this._sunLight = null;
386
541
  this._primaryDirectionalLight = null;
387
542
  this._primaryTransmissionLight = null;
543
+ this._waterList = [];
388
544
  this._needSceneColor = false;
389
545
  this._needSceneDepth = false;
546
+ this._needHiZNearest = false;
390
547
  this._needSceneColorWithDepth = false;
391
548
  this._drawTransparent = false;
392
549
  }
393
- /** @internal */ end(camera, createRenderBundles) {
550
+ /**
551
+ * Finish the queue after pushing its items.
552
+ * @param camera - The camera the queue was culled with
553
+ * @param createRenderBundles - Whether the batches are recorded into render bundles
554
+ * @param lodCamera - The camera whose view selected the levels of detail, the culling camera by default
555
+ * @internal
556
+ */ end(camera, createRenderBundles, lodCamera) {
557
+ this._cullCamera = camera;
558
+ this._lodCamera = lodCamera ?? camera;
394
559
  const frameCounter = getDevice().frameInfo.frameCounter;
395
560
  const itemList = this._itemList;
396
561
  if (!this.itemList) {
@@ -432,9 +597,10 @@ const tmpDrawablePos = new Vector3();
432
597
  offset: bindGroup.offset,
433
598
  numInstances: 0,
434
599
  stride
435
- }
600
+ },
601
+ lod: info.instanceLods[x] ?? 0
436
602
  };
437
- this.binaryInsert(info.instanceItemList, item);
603
+ this.binaryInsert(drawable.getBoneMatrices() ? info.skinInstanceItemList : info.instanceItemList, item);
438
604
  drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);
439
605
  }
440
606
  const instanceInfo = {
@@ -453,6 +619,7 @@ const tmpDrawablePos = new Vector3();
453
619
  }
454
620
  }
455
621
  info.instanceList = {};
622
+ info.instanceLods = {};
456
623
  if (createRenderBundles) {
457
624
  if (info.itemList.length > 0) {
458
625
  info.renderBundle = new RenderBundleWrapper();
@@ -469,8 +636,22 @@ const tmpDrawablePos = new Vector3();
469
636
  if (info.instanceItemList.length > 0) {
470
637
  info.instanceRenderBundle = new RenderBundleWrapper();
471
638
  }
639
+ if (info.skinInstanceItemList.length > 0) {
640
+ info.skinInstanceRenderBundle = new RenderBundleWrapper();
641
+ }
642
+ }
643
+ }
644
+ }
645
+ if (this._instanceCuller) {
646
+ const items = [];
647
+ for (const list of lists){
648
+ for (const info of list){
649
+ if (info.renderQueue === this) {
650
+ items.push(...info.instanceItemList, ...info.skinInstanceItemList);
651
+ }
472
652
  }
473
653
  }
654
+ this._instanceCuller.rebuild(items, this._instanceInfo);
474
655
  }
475
656
  return this;
476
657
  }
@@ -510,6 +691,10 @@ const tmpDrawablePos = new Vector3();
510
691
  super.onDispose();
511
692
  this.reset();
512
693
  this._ref.valid = false;
694
+ this._cullCamera = null;
695
+ this._lodCamera = null;
696
+ this._instanceCuller?.dispose();
697
+ this._instanceCuller = null;
513
698
  }
514
699
  drawableDistanceToCamera(drawable, cameraPos) {
515
700
  const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);
@@ -522,8 +707,10 @@ const tmpDrawablePos = new Vector3();
522
707
  morphItemList: [],
523
708
  skinAndMorphItemList: [],
524
709
  instanceItemList: [],
710
+ skinInstanceItemList: [],
525
711
  materialList: new Set(),
526
712
  instanceList: {},
713
+ instanceLods: {},
527
714
  renderQueue: this
528
715
  };
529
716
  }