@zephyr3d/scene 0.7.0 → 0.8.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 (368) hide show
  1. package/dist/animation/animation.js +4 -33
  2. package/dist/animation/animation.js.map +1 -1
  3. package/dist/animation/animationset.js +24 -11
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js +1 -0
  6. package/dist/animation/animationtrack.js.map +1 -1
  7. package/dist/animation/eulerrotationtrack.js +0 -1
  8. package/dist/animation/eulerrotationtrack.js.map +1 -1
  9. package/dist/animation/ik/ccd_solver.js +372 -0
  10. package/dist/animation/ik/ccd_solver.js.map +1 -0
  11. package/dist/animation/ik/fabrik_solver.js +399 -0
  12. package/dist/animation/ik/fabrik_solver.js.map +1 -0
  13. package/dist/animation/ik/ik_angle_constraint.js +181 -0
  14. package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
  15. package/dist/animation/ik/ik_chain.js +163 -0
  16. package/dist/animation/ik/ik_chain.js.map +1 -0
  17. package/dist/animation/ik/ik_chain_builder.js +68 -0
  18. package/dist/animation/ik/ik_chain_builder.js.map +1 -0
  19. package/dist/animation/ik/ik_constraint.js +25 -0
  20. package/dist/animation/ik/ik_constraint.js.map +1 -0
  21. package/dist/animation/ik/ik_pole_constraint.js +123 -0
  22. package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
  23. package/dist/animation/ik/ik_solver.js +48 -0
  24. package/dist/animation/ik/ik_solver.js.map +1 -0
  25. package/dist/animation/ik/ik_track.js +96 -0
  26. package/dist/animation/ik/ik_track.js.map +1 -0
  27. package/dist/animation/ik/ik_utils.js +270 -0
  28. package/dist/animation/ik/ik_utils.js.map +1 -0
  29. package/dist/animation/ik/two_bone_ik_solver.js +332 -0
  30. package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
  31. package/dist/animation/ik_modifier.js +61 -0
  32. package/dist/animation/ik_modifier.js.map +1 -0
  33. package/dist/animation/ik_postprocessor.js +71 -0
  34. package/dist/animation/ik_postprocessor.js.map +1 -0
  35. package/dist/animation/manual_transform_processor.js +156 -0
  36. package/dist/animation/manual_transform_processor.js.map +1 -0
  37. package/dist/animation/morphtarget.js +7 -1
  38. package/dist/animation/morphtarget.js.map +1 -1
  39. package/dist/animation/morphtrack.js +3 -3
  40. package/dist/animation/morphtrack.js.map +1 -1
  41. package/dist/animation/proptrack.js +37 -41
  42. package/dist/animation/proptrack.js.map +1 -1
  43. package/dist/animation/rotationtrack.js +0 -1
  44. package/dist/animation/rotationtrack.js.map +1 -1
  45. package/dist/animation/scaletrack.js +0 -1
  46. package/dist/animation/scaletrack.js.map +1 -1
  47. package/dist/animation/skeleton.js +57 -60
  48. package/dist/animation/skeleton.js.map +1 -1
  49. package/dist/animation/skeleton_modifier.js +38 -0
  50. package/dist/animation/skeleton_modifier.js.map +1 -0
  51. package/dist/animation/skeleton_postprocessor.js +50 -0
  52. package/dist/animation/skeleton_postprocessor.js.map +1 -0
  53. package/dist/animation/spring/multi_chain_spring_system.js +503 -0
  54. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
  55. package/dist/animation/spring/spring_chain.js +103 -0
  56. package/dist/animation/spring/spring_chain.js.map +1 -0
  57. package/dist/animation/spring/spring_collider.js +247 -0
  58. package/dist/animation/spring/spring_collider.js.map +1 -0
  59. package/dist/animation/spring/spring_constraint.js +21 -0
  60. package/dist/animation/spring/spring_constraint.js.map +1 -0
  61. package/dist/animation/spring/spring_particle.js +20 -0
  62. package/dist/animation/spring/spring_particle.js.map +1 -0
  63. package/dist/animation/spring/spring_system.js +526 -0
  64. package/dist/animation/spring/spring_system.js.map +1 -0
  65. package/dist/animation/spring_modifier.js +45 -0
  66. package/dist/animation/spring_modifier.js.map +1 -0
  67. package/dist/animation/spring_postprocessor.js +54 -0
  68. package/dist/animation/spring_postprocessor.js.map +1 -0
  69. package/dist/animation/translationtrack.js +0 -1
  70. package/dist/animation/translationtrack.js.map +1 -1
  71. package/dist/app/api.js +13 -4
  72. package/dist/app/api.js.map +1 -1
  73. package/dist/app/app.js +13 -1
  74. package/dist/app/app.js.map +1 -1
  75. package/dist/app/engine.js +33 -45
  76. package/dist/app/engine.js.map +1 -1
  77. package/dist/app/inputmgr.js.map +1 -1
  78. package/dist/app/runtimescript.js.map +1 -1
  79. package/dist/app/screen.js +318 -0
  80. package/dist/app/screen.js.map +1 -0
  81. package/dist/app/scriptingsystem.js +10 -6
  82. package/dist/app/scriptingsystem.js.map +1 -1
  83. package/dist/app/scriptregistry.js +11 -22
  84. package/dist/app/scriptregistry.js.map +1 -1
  85. package/dist/asset/assetmanager.js +79 -58
  86. package/dist/asset/assetmanager.js.map +1 -1
  87. package/dist/asset/builtin.js +5 -5
  88. package/dist/asset/builtin.js.map +1 -1
  89. package/dist/asset/loaders/dds/dds.js +6 -2
  90. package/dist/asset/loaders/dds/dds.js.map +1 -1
  91. package/dist/asset/loaders/dds/dds_loader.js +1 -1
  92. package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
  93. package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
  94. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  95. package/dist/asset/loaders/gltf/helpers.js +6 -2
  96. package/dist/asset/loaders/gltf/helpers.js.map +1 -1
  97. package/dist/asset/loaders/hdr/hdr.js +22 -15
  98. package/dist/asset/loaders/hdr/hdr.js.map +1 -1
  99. package/dist/asset/loaders/image/tga_Loader.js +2 -1
  100. package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
  101. package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
  102. package/dist/asset/loaders/loader.js +2 -2
  103. package/dist/asset/loaders/loader.js.map +1 -1
  104. package/dist/asset/model.js +9 -5
  105. package/dist/asset/model.js.map +1 -1
  106. package/dist/blitter/bilateralblur.js.map +1 -1
  107. package/dist/blitter/blitter.js +9 -11
  108. package/dist/blitter/blitter.js.map +1 -1
  109. package/dist/blitter/box.js +0 -1
  110. package/dist/blitter/box.js.map +1 -1
  111. package/dist/blitter/copy.js.map +1 -1
  112. package/dist/blitter/gaussianblur.js.map +1 -1
  113. package/dist/camera/base.js +1 -3
  114. package/dist/camera/base.js.map +1 -1
  115. package/dist/camera/camera.js +121 -37
  116. package/dist/camera/camera.js.map +1 -1
  117. package/dist/camera/fps.js +19 -17
  118. package/dist/camera/fps.js.map +1 -1
  119. package/dist/camera/orbit.js +45 -43
  120. package/dist/camera/orbit.js.map +1 -1
  121. package/dist/camera/orthocamera.js +27 -21
  122. package/dist/camera/orthocamera.js.map +1 -1
  123. package/dist/camera/perspectivecamera.js +28 -19
  124. package/dist/camera/perspectivecamera.js.map +1 -1
  125. package/dist/index.d.ts +15802 -15577
  126. package/dist/index.js +33 -11
  127. package/dist/index.js.map +1 -1
  128. package/dist/material/blinn.js.map +1 -1
  129. package/dist/material/grassmaterial.js.map +1 -1
  130. package/dist/material/lambert.js.map +1 -1
  131. package/dist/material/material.js +11 -5
  132. package/dist/material/material.js.map +1 -1
  133. package/dist/material/meshmaterial.js +10 -9
  134. package/dist/material/meshmaterial.js.map +1 -1
  135. package/dist/material/mixins/albedocolor.js.map +1 -1
  136. package/dist/material/mixins/foliage.js.map +1 -1
  137. package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
  138. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  139. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  140. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
  141. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  142. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  143. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  144. package/dist/material/mixins/lit.js +3 -3
  145. package/dist/material/mixins/lit.js.map +1 -1
  146. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  147. package/dist/material/mixins/pbr/common.js.map +1 -1
  148. package/dist/material/mixins/texture.js +3 -0
  149. package/dist/material/mixins/texture.js.map +1 -1
  150. package/dist/material/mixins/vertexcolor.js.map +1 -1
  151. package/dist/material/particle.js.map +1 -1
  152. package/dist/material/pbrblueprint.js +180 -22
  153. package/dist/material/pbrblueprint.js.map +1 -1
  154. package/dist/material/pbrmr.js.map +1 -1
  155. package/dist/material/pbrsg.js.map +1 -1
  156. package/dist/material/shader/helper.js +41 -56
  157. package/dist/material/shader/helper.js.map +1 -1
  158. package/dist/material/sprite.js +301 -0
  159. package/dist/material/sprite.js.map +1 -0
  160. package/dist/material/sprite3d.js +301 -0
  161. package/dist/material/sprite3d.js.map +1 -0
  162. package/dist/material/sprite3d_std.js +116 -0
  163. package/dist/material/sprite3d_std.js.map +1 -0
  164. package/dist/material/sprite3dblueprint.js +235 -0
  165. package/dist/material/sprite3dblueprint.js.map +1 -0
  166. package/dist/material/sprite_std.js +116 -0
  167. package/dist/material/sprite_std.js.map +1 -0
  168. package/dist/material/spriteblueprint.js +235 -0
  169. package/dist/material/spriteblueprint.js.map +1 -0
  170. package/dist/material/terrain-cm.js +0 -1
  171. package/dist/material/terrain-cm.js.map +1 -1
  172. package/dist/material/unlit.js.map +1 -1
  173. package/dist/material/water.js.map +1 -1
  174. package/dist/posteffect/bloom.js.map +1 -1
  175. package/dist/posteffect/compositor.js.map +1 -1
  176. package/dist/posteffect/fxaa.js.map +1 -1
  177. package/dist/posteffect/grayscale.js.map +1 -1
  178. package/dist/posteffect/motionblur.js.map +1 -1
  179. package/dist/posteffect/posteffect.js.map +1 -1
  180. package/dist/posteffect/sao.js.map +1 -1
  181. package/dist/posteffect/ssr.js +7 -5
  182. package/dist/posteffect/ssr.js.map +1 -1
  183. package/dist/posteffect/taa.js.map +1 -1
  184. package/dist/posteffect/tonemap.js.map +1 -1
  185. package/dist/render/abuffer_oit.js +8 -6
  186. package/dist/render/abuffer_oit.js.map +1 -1
  187. package/dist/render/clipmap.js +0 -10
  188. package/dist/render/clipmap.js.map +1 -1
  189. package/dist/render/cluster_light.js +4 -4
  190. package/dist/render/cluster_light.js.map +1 -1
  191. package/dist/render/cull_visitor.js +15 -17
  192. package/dist/render/cull_visitor.js.map +1 -1
  193. package/dist/render/depthpass.js +3 -4
  194. package/dist/render/depthpass.js.map +1 -1
  195. package/dist/render/drawable.js +15 -0
  196. package/dist/render/drawable.js.map +1 -0
  197. package/dist/render/drawable_mixin.js +8 -4
  198. package/dist/render/drawable_mixin.js.map +1 -1
  199. package/dist/render/envlight.js.map +1 -1
  200. package/dist/render/fbm_wavegenerator.js +3 -1
  201. package/dist/render/fbm_wavegenerator.js.map +1 -1
  202. package/dist/render/fft_wavegenerator.js +67 -64
  203. package/dist/render/fft_wavegenerator.js.map +1 -1
  204. package/dist/render/fullscreenquad.js.map +1 -1
  205. package/dist/render/gerstner_wavegenerator.js +3 -1
  206. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  207. package/dist/render/globalbindgroup_allocator.js +3 -1
  208. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  209. package/dist/render/hzb.js +1 -2
  210. package/dist/render/hzb.js.map +1 -1
  211. package/dist/render/lightpass.js +13 -13
  212. package/dist/render/lightpass.js.map +1 -1
  213. package/dist/render/objectcolorpass.js +4 -7
  214. package/dist/render/objectcolorpass.js.map +1 -1
  215. package/dist/render/primitive.js +4 -5
  216. package/dist/render/primitive.js.map +1 -1
  217. package/dist/render/render_queue.js +10 -5
  218. package/dist/render/render_queue.js.map +1 -1
  219. package/dist/render/renderer.js +16 -22
  220. package/dist/render/renderer.js.map +1 -1
  221. package/dist/render/renderpass.js +27 -52
  222. package/dist/render/renderpass.js.map +1 -1
  223. package/dist/render/rendertarget.js +5 -0
  224. package/dist/render/rendertarget.js.map +1 -0
  225. package/dist/render/screenrendertarget.js +56 -0
  226. package/dist/render/screenrendertarget.js.map +1 -0
  227. package/dist/render/shadowmap_pass.js +4 -5
  228. package/dist/render/shadowmap_pass.js.map +1 -1
  229. package/dist/render/sky.js +16 -14
  230. package/dist/render/sky.js.map +1 -1
  231. package/dist/render/weightedblended_oit.js.map +1 -1
  232. package/dist/scene/basesprite.js +296 -0
  233. package/dist/scene/basesprite.js.map +1 -0
  234. package/dist/scene/batchgroup.js +4 -2
  235. package/dist/scene/batchgroup.js.map +1 -1
  236. package/dist/scene/environment.js +9 -10
  237. package/dist/scene/environment.js.map +1 -1
  238. package/dist/scene/graph_node.js.map +1 -1
  239. package/dist/scene/light.js +22 -4
  240. package/dist/scene/light.js.map +1 -1
  241. package/dist/scene/mesh.js +96 -26
  242. package/dist/scene/mesh.js.map +1 -1
  243. package/dist/scene/octree.js.map +1 -1
  244. package/dist/scene/particlesys.js +25 -22
  245. package/dist/scene/particlesys.js.map +1 -1
  246. package/dist/scene/raycast_visitor.js +0 -16
  247. package/dist/scene/raycast_visitor.js.map +1 -1
  248. package/dist/scene/scene.js +7 -4
  249. package/dist/scene/scene.js.map +1 -1
  250. package/dist/scene/scene_node.js +20 -35
  251. package/dist/scene/scene_node.js.map +1 -1
  252. package/dist/scene/sprite.js +18 -0
  253. package/dist/scene/sprite.js.map +1 -0
  254. package/dist/scene/sprite3d.js +18 -0
  255. package/dist/scene/sprite3d.js.map +1 -0
  256. package/dist/scene/terrain-cm/grass.js +5 -4
  257. package/dist/scene/terrain-cm/grass.js.map +1 -1
  258. package/dist/scene/terrain-cm/grassmaterial.js +3 -1
  259. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  260. package/dist/scene/terrain-cm/terrain-cm.js +65 -48
  261. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  262. package/dist/scene/water.js +35 -30
  263. package/dist/scene/water.js.map +1 -1
  264. package/dist/shaders/atmosphere.js +17 -29
  265. package/dist/shaders/atmosphere.js.map +1 -1
  266. package/dist/shaders/fog.js.map +1 -1
  267. package/dist/shaders/misc.js.map +1 -1
  268. package/dist/shaders/noise.js.map +1 -1
  269. package/dist/shaders/pbr.js.map +1 -1
  270. package/dist/shaders/shadow.js.map +1 -1
  271. package/dist/shaders/ssr.js.map +1 -1
  272. package/dist/shaders/temporal.js.map +1 -1
  273. package/dist/shaders/water.js.map +1 -1
  274. package/dist/shadow/esm.js +1 -1
  275. package/dist/shadow/esm.js.map +1 -1
  276. package/dist/shadow/pcf_opt.js.map +1 -1
  277. package/dist/shadow/pcf_pd.js.map +1 -1
  278. package/dist/shadow/shader.js +3 -1
  279. package/dist/shadow/shader.js.map +1 -1
  280. package/dist/shadow/shadow_impl.js.map +1 -1
  281. package/dist/shadow/shadowmapper.js +6 -18
  282. package/dist/shadow/shadowmapper.js.map +1 -1
  283. package/dist/shadow/ssm.js.map +1 -1
  284. package/dist/shadow/vsm.js.map +1 -1
  285. package/dist/shapes/box.js +9 -3
  286. package/dist/shapes/box.js.map +1 -1
  287. package/dist/shapes/cylinder.js +2 -2
  288. package/dist/shapes/cylinder.js.map +1 -1
  289. package/dist/shapes/plane.js +2 -2
  290. package/dist/shapes/plane.js.map +1 -1
  291. package/dist/shapes/shape.js +2 -1
  292. package/dist/shapes/shape.js.map +1 -1
  293. package/dist/shapes/sphere.js +2 -2
  294. package/dist/shapes/sphere.js.map +1 -1
  295. package/dist/shapes/tetrahedron.js +5 -6
  296. package/dist/shapes/tetrahedron.js.map +1 -1
  297. package/dist/shapes/torus.js +2 -2
  298. package/dist/shapes/torus.js.map +1 -1
  299. package/dist/utility/aabbtree.js +1 -1
  300. package/dist/utility/aabbtree.js.map +1 -1
  301. package/dist/utility/blueprint/common/constants.js +578 -104
  302. package/dist/utility/blueprint/common/constants.js.map +1 -1
  303. package/dist/utility/blueprint/common/math.js +471 -9
  304. package/dist/utility/blueprint/common/math.js.map +1 -1
  305. package/dist/utility/blueprint/common.js +1 -1
  306. package/dist/utility/blueprint/common.js.map +1 -1
  307. package/dist/utility/blueprint/material/func.js +9 -5
  308. package/dist/utility/blueprint/material/func.js.map +1 -1
  309. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  310. package/dist/utility/blueprint/material/ir.js +288 -80
  311. package/dist/utility/blueprint/material/ir.js.map +1 -1
  312. package/dist/utility/blueprint/material/pbr.js +92 -4
  313. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  314. package/dist/utility/blueprint/material/texture.js +62 -45
  315. package/dist/utility/blueprint/material/texture.js.map +1 -1
  316. package/dist/utility/blueprint/node.js +28 -1
  317. package/dist/utility/blueprint/node.js.map +1 -1
  318. package/dist/utility/bounding_volume.js.map +1 -1
  319. package/dist/utility/debug.js.map +1 -1
  320. package/dist/utility/draco/decoder.js.map +1 -1
  321. package/dist/utility/misc.js +1 -1
  322. package/dist/utility/misc.js.map +1 -1
  323. package/dist/utility/panorama.js.map +1 -1
  324. package/dist/utility/pmrem.js.map +1 -1
  325. package/dist/utility/rendermipmap.js.map +1 -1
  326. package/dist/utility/serialization/json.js +19 -15
  327. package/dist/utility/serialization/json.js.map +1 -1
  328. package/dist/utility/serialization/manager.js +89 -22
  329. package/dist/utility/serialization/manager.js.map +1 -1
  330. package/dist/utility/serialization/scene/animation.js +44 -41
  331. package/dist/utility/serialization/scene/animation.js.map +1 -1
  332. package/dist/utility/serialization/scene/batch.js +4 -3
  333. package/dist/utility/serialization/scene/batch.js.map +1 -1
  334. package/dist/utility/serialization/scene/camera.js +97 -9
  335. package/dist/utility/serialization/scene/camera.js.map +1 -1
  336. package/dist/utility/serialization/scene/common.js +102 -28
  337. package/dist/utility/serialization/scene/common.js.map +1 -1
  338. package/dist/utility/serialization/scene/light.js +14 -12
  339. package/dist/utility/serialization/scene/light.js.map +1 -1
  340. package/dist/utility/serialization/scene/material.js +216 -26
  341. package/dist/utility/serialization/scene/material.js.map +1 -1
  342. package/dist/utility/serialization/scene/mesh.js +71 -100
  343. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  344. package/dist/utility/serialization/scene/misc.js +3 -2
  345. package/dist/utility/serialization/scene/misc.js.map +1 -1
  346. package/dist/utility/serialization/scene/node.js +42 -9
  347. package/dist/utility/serialization/scene/node.js.map +1 -1
  348. package/dist/utility/serialization/scene/particle.js +7 -5
  349. package/dist/utility/serialization/scene/particle.js.map +1 -1
  350. package/dist/utility/serialization/scene/primitive.js +18 -15
  351. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  352. package/dist/utility/serialization/scene/scene.js +3 -2
  353. package/dist/utility/serialization/scene/scene.js.map +1 -1
  354. package/dist/utility/serialization/scene/sprite.js +164 -0
  355. package/dist/utility/serialization/scene/sprite.js.map +1 -0
  356. package/dist/utility/serialization/scene/terrain.js +8 -6
  357. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  358. package/dist/utility/serialization/scene/water.js +11 -9
  359. package/dist/utility/serialization/scene/water.js.map +1 -1
  360. package/dist/utility/serialization/types.js +6 -0
  361. package/dist/utility/serialization/types.js.map +1 -0
  362. package/dist/utility/shprojector.js.map +1 -1
  363. package/dist/utility/textures/ggxlut.js.map +1 -1
  364. package/dist/utility/textures/gradientnoise.js.map +1 -1
  365. package/dist/utility/textures/randomnoise.js.map +1 -1
  366. package/dist/values.js +14 -14
  367. package/dist/values.js.map +1 -1
  368. package/package.json +80 -80
@@ -8,11 +8,13 @@ import '@zephyr3d/device';
8
8
  import { MAX_GERSTNER_WAVE_COUNT } from '../values.js';
9
9
  import '../material/meshmaterial.js';
10
10
  import '../material/grassmaterial.js';
11
- import '../material/terrainmaterial.js';
12
11
  import '../material/terrain-cm.js';
13
12
  import '../material/pbrmr.js';
14
13
  import '../material/pbrsg.js';
15
14
  import '../material/pbrblueprint.js';
15
+ import '../material/sprite.js';
16
+ import '../material/sprite_std.js';
17
+ import '../utility/blueprint/material/texture.js';
16
18
 
17
19
  /**
18
20
  * Gerstner wave generator.
@@ -1 +1 @@
1
- {"version":3,"file":"gerstner_wavegenerator.js","sources":["../../src/render/gerstner_wavegenerator.ts"],"sourcesContent":["import { Disposable, type AABB } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { MAX_GERSTNER_WAVE_COUNT } from '../values';\r\n\r\n/**\r\n * Gerstner wave generator.\r\n * @public\r\n */\r\nexport class GerstnerWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private _waveParams: Float32Array<ArrayBuffer>;\r\n private _numWaves: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._waveParams = new Float32Array(8 * MAX_GERSTNER_WAVE_COUNT);\r\n this.randomWave(0);\r\n this.randomWave(1);\r\n this.randomWave(2);\r\n this.randomWave(3);\r\n this._numWaves = 4;\r\n this._version = 0;\r\n }\r\n /** @internal */\r\n static randomWaveData(array: Float32Array, offset: number) {\r\n array[offset + 0] = Math.random() * Math.PI * 2;\r\n array[offset + 1] = Math.random() * 0.5 + 0.5;\r\n array[offset + 2] = Math.random() * 0.1;\r\n array[offset + 3] = Math.random() * 10;\r\n array[offset + 4] = Math.random() * 100 - 50;\r\n array[offset + 5] = 0;\r\n array[offset + 6] = Math.random() * 100 - 50;\r\n array[offset + 7] = 0;\r\n }\r\n /** @internal */\r\n setRaw(data: Float32Array, index: number) {\r\n this._waveParams.set(data, index * 8);\r\n }\r\n clone(): this {\r\n const other = new GerstnerWaveGenerator();\r\n other.numWaves = this.numWaves;\r\n other._waveParams.set(this._waveParams);\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gets the number of waves. */\r\n get numWaves(): number {\r\n return this._numWaves;\r\n }\r\n set numWaves(val: number) {\r\n if (!Number.isInteger(val) || val <= 0 || val > MAX_GERSTNER_WAVE_COUNT) {\r\n console.error(`Invalid wave number: ${val}`);\r\n return;\r\n }\r\n if (val !== this._numWaves) {\r\n for (let i = this._numWaves; i < val; i++) {\r\n this.randomWave(i);\r\n }\r\n this._numWaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Delete wave at index */\r\n deleteWave(index: number) {\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[i * 8 + j] = this._waveParams[(i + 1) * 8 + j];\r\n }\r\n }\r\n this._numWaves--;\r\n }\r\n /** Delete wave at index */\r\n insertWave(index: number) {\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];\r\n }\r\n }\r\n this._numWaves++;\r\n }\r\n /**\r\n * Sets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to set.\r\n * @param angle - angle of the wave direction in radians.\r\n */\r\n setWaveDirection(waveIndex: number, angle: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 0] = angle;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to get.\r\n * @returns Angle of the wave direction in radians.\r\n */\r\n getWaveDirection(waveIndex: number): number {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 0] : 0;\r\n }\r\n /**\r\n * Sets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param steepness - Steepness of the wave.\r\n */\r\n setWaveSteepness(waveIndex: number, steepness: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 1] = steepness;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Steepness of the wave.\r\n */\r\n getWaveSteepness(waveIndex: number): number {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 1] : 0;\r\n }\r\n /**\r\n * Sets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Amplitude of the wave.\r\n */\r\n setWaveAmplitude(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 2] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Amplitude of the wave.\r\n */\r\n getWaveAmplitude(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 2] : 0;\r\n }\r\n /**\r\n * Sets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Length of the wave.\r\n */\r\n setWaveLength(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 3] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Length of the wave.\r\n */\r\n getWaveLength(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 3] : 0;\r\n }\r\n /**\r\n * Query if the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n isOmniWave(waveIndex: number): boolean {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 7] !== 0 : false;\r\n }\r\n /**\r\n * Sets whether the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param isOmni - true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n setOmniWave(waveIndex: number, isOmni: boolean) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 7] = isOmni ? 1 : 0;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the X coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns X coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginX(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 4] : 0;\r\n }\r\n /**\r\n * Gets the Z coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Z coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginZ(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 6] : 0;\r\n }\r\n /**\r\n * Sets the X and Z coordinates of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param x - X coordinate of the wave origin\r\n * @param z - Z coordinate of the wave origin\r\n */\r\n setOrigin(waveIndex: number, x: number, z: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 4] = x;\r\n this._waveParams[waveIndex * 8 + 6] = z;\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n randomWave(i: number) {\r\n GerstnerWaveGenerator.randomWaveData(this._waveParams, i * 8);\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update(): void {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n let maxHeight = 0;\r\n for (let i = 0; i < this._numWaves; i++) {\r\n const h = this._waveParams[i * 8 + 2];\r\n if (h > maxHeight) {\r\n maxHeight = h;\r\n }\r\n }\r\n outAABB.minPoint.setXYZ(minX, y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp): PBShaderExp {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3();\r\n that.calcNormalAndPos(this, this.inPos, this.outPos, this.outNormal);\r\n this.$return(this.outNormal);\r\n });\r\n return scope.calcFragmentNormal(xz);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp): PBShaderExp {\r\n return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number): void {\r\n const pb = scope.$builder;\r\n scope.numWaves = pb.float().uniform(uniformGroup);\r\n scope.waveParams = pb.vec4[MAX_GERSTNER_WAVE_COUNT * 2]().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private gerstnerWave(\r\n scope: PBInsideFunctionScope,\r\n waveParam: PBShaderExp,\r\n omniParam: PBShaderExp,\r\n inPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ): PBShaderExp {\r\n const pb = scope.$builder;\r\n pb.func(\r\n 'gerstnerWave',\r\n [pb.vec4('waveParam'), pb.vec4('omniParam'), pb.vec3('inPos'), pb.vec3('outNormal').out()],\r\n function () {\r\n this.$l.amplitude = pb.max(this.waveParam.z, 0.01);\r\n this.$l.wavelength = this.waveParam.w;\r\n this.$l.omniPos = this.omniParam.xz;\r\n this.$l.omni = this.omniParam.w;\r\n this.$l.direction = pb.vec2(pb.sin(this.waveParam.x), pb.cos(this.waveParam.x));\r\n this.$l.w = pb.max(0.001, pb.div(Math.PI * 2, this.wavelength));\r\n this.$l.wSpeed = pb.sqrt(pb.mul(9.8, this.w));\r\n this.$l.peak = this.waveParam.y;\r\n this.$l.qi = pb.div(this.peak, pb.mul(this.amplitude, this.w, this.numWaves));\r\n this.$l.dirWaveInput = pb.mul(this.direction, pb.sub(1, this.omni));\r\n this.$l.omniWaveInput = pb.mul(pb.sub(this.inPos.xz, this.omniPos), this.omni);\r\n this.$l.windDir = pb.normalize(pb.add(this.dirWaveInput, this.omniWaveInput));\r\n this.$l.dir = pb.dot(this.windDir, pb.sub(this.inPos.xz, pb.mul(this.omniPos, this.omni)));\r\n this.$l.calc = pb.sub(\r\n pb.mul(this.dir, this.w),\r\n pb.mul(this.wSpeed, ShaderHelper.getElapsedTime(this))\r\n );\r\n this.$l.cosCalc = pb.cos(this.calc);\r\n this.$l.sinCalc = pb.sin(this.calc);\r\n this.$l.waveXZ = pb.mul(this.windDir.xy, this.qi, this.amplitude, this.cosCalc);\r\n this.$l.waveY = pb.div(pb.mul(this.sinCalc, this.amplitude), this.numWaves);\r\n this.$l.wave = pb.vec3(this.waveXZ.x, this.waveY, this.waveXZ.y);\r\n this.$l.wa = pb.mul(this.w, this.amplitude);\r\n this.$l.n = pb.vec3(\r\n pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)),\r\n pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc))\r\n );\r\n this.outNormal = pb.div(this.n.xzy, this.numWaves);\r\n this.$return(pb.mul(this.wave, pb.clamp(pb.mul(this.amplitude, 10000), 0, 1)));\r\n }\r\n );\r\n return scope.gerstnerWave(waveParam, omniParam, inPos, outNormal);\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outPos = this.inPos;\r\n this.outNormal = pb.vec3(0);\r\n this.$for(\r\n pb.float('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numWaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n }\r\n );\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ): void {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup): void {\r\n bindGroup.setValue('numWaves', this._numWaves);\r\n bindGroup.setValue('waveParams', this._waveParams);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk(): boolean {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash(): string {\r\n return 'GerstnerWaveGenerator';\r\n }\r\n}\r\n"],"names":["GerstnerWaveGenerator","Disposable","_version","_waveParams","_numWaves","Float32Array","MAX_GERSTNER_WAVE_COUNT","randomWave","randomWaveData","array","offset","Math","random","PI","setRaw","data","index","set","clone","other","numWaves","version","val","Number","isInteger","console","error","i","deleteWave","j","insertWave","setWaveDirection","waveIndex","angle","getWaveDirection","setWaveSteepness","steepness","getWaveSteepness","setWaveAmplitude","getWaveAmplitude","setWaveLength","getWaveLength","isOmniWave","setOmniWave","isOmni","getOriginX","getOriginZ","setOrigin","x","z","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","h","minPoint","setXYZ","maxPoint","calcFragmentNormal","scope","xz","pb","$builder","that","func","vec2","$l","inPos","vec3","outPos","outNormal","calcNormalAndPos","$return","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","float","uniform","waveParams","gerstnerWave","waveParam","omniParam","out","amplitude","max","wavelength","w","omniPos","omni","direction","sin","cos","div","wSpeed","sqrt","mul","peak","qi","dirWaveInput","sub","omniWaveInput","windDir","normalize","add","dir","dot","calc","ShaderHelper","getElapsedTime","cosCalc","sinCalc","waveXZ","xy","waveY","wave","wa","n","neg","xzy","clamp","$for","getDevice","type","$if","greaterThanEqual","$break","waveNormal","wavePos","at","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
1
+ {"version":3,"file":"gerstner_wavegenerator.js","sources":["../../src/render/gerstner_wavegenerator.ts"],"sourcesContent":["import { Disposable, type AABB } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { MAX_GERSTNER_WAVE_COUNT } from '../values';\r\n\r\n/**\r\n * Gerstner wave generator.\r\n * @public\r\n */\r\nexport class GerstnerWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private _waveParams: Float32Array<ArrayBuffer>;\r\n private _numWaves: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._waveParams = new Float32Array(8 * MAX_GERSTNER_WAVE_COUNT);\r\n this.randomWave(0);\r\n this.randomWave(1);\r\n this.randomWave(2);\r\n this.randomWave(3);\r\n this._numWaves = 4;\r\n this._version = 0;\r\n }\r\n /** @internal */\r\n static randomWaveData(array: Float32Array, offset: number) {\r\n array[offset + 0] = Math.random() * Math.PI * 2;\r\n array[offset + 1] = Math.random() * 0.5 + 0.5;\r\n array[offset + 2] = Math.random() * 0.1;\r\n array[offset + 3] = Math.random() * 10;\r\n array[offset + 4] = Math.random() * 100 - 50;\r\n array[offset + 5] = 0;\r\n array[offset + 6] = Math.random() * 100 - 50;\r\n array[offset + 7] = 0;\r\n }\r\n /** @internal */\r\n setRaw(data: Float32Array, index: number) {\r\n this._waveParams.set(data, index * 8);\r\n }\r\n clone() {\r\n const other = new GerstnerWaveGenerator();\r\n other.numWaves = this.numWaves;\r\n other._waveParams.set(this._waveParams);\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gets the number of waves. */\r\n get numWaves() {\r\n return this._numWaves;\r\n }\r\n set numWaves(val) {\r\n if (!Number.isInteger(val) || val <= 0 || val > MAX_GERSTNER_WAVE_COUNT) {\r\n console.error(`Invalid wave number: ${val}`);\r\n return;\r\n }\r\n if (val !== this._numWaves) {\r\n for (let i = this._numWaves; i < val; i++) {\r\n this.randomWave(i);\r\n }\r\n this._numWaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Delete wave at index */\r\n deleteWave(index: number) {\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[i * 8 + j] = this._waveParams[(i + 1) * 8 + j];\r\n }\r\n }\r\n this._numWaves--;\r\n }\r\n /** Delete wave at index */\r\n insertWave(index: number) {\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];\r\n }\r\n }\r\n this._numWaves++;\r\n }\r\n /**\r\n * Sets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to set.\r\n * @param angle - angle of the wave direction in radians.\r\n */\r\n setWaveDirection(waveIndex: number, angle: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 0] = angle;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to get.\r\n * @returns Angle of the wave direction in radians.\r\n */\r\n getWaveDirection(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 0] : 0;\r\n }\r\n /**\r\n * Sets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param steepness - Steepness of the wave.\r\n */\r\n setWaveSteepness(waveIndex: number, steepness: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 1] = steepness;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Steepness of the wave.\r\n */\r\n getWaveSteepness(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 1] : 0;\r\n }\r\n /**\r\n * Sets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Amplitude of the wave.\r\n */\r\n setWaveAmplitude(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 2] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Amplitude of the wave.\r\n */\r\n getWaveAmplitude(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 2] : 0;\r\n }\r\n /**\r\n * Sets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Length of the wave.\r\n */\r\n setWaveLength(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 3] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Length of the wave.\r\n */\r\n getWaveLength(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 3] : 0;\r\n }\r\n /**\r\n * Query if the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n isOmniWave(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 7] !== 0 : false;\r\n }\r\n /**\r\n * Sets whether the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param isOmni - true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n setOmniWave(waveIndex: number, isOmni: boolean) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 7] = isOmni ? 1 : 0;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the X coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns X coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginX(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 4] : 0;\r\n }\r\n /**\r\n * Gets the Z coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Z coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginZ(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 6] : 0;\r\n }\r\n /**\r\n * Sets the X and Z coordinates of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param x - X coordinate of the wave origin\r\n * @param z - Z coordinate of the wave origin\r\n */\r\n setOrigin(waveIndex: number, x: number, z: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 4] = x;\r\n this._waveParams[waveIndex * 8 + 6] = z;\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n randomWave(i: number) {\r\n GerstnerWaveGenerator.randomWaveData(this._waveParams, i * 8);\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n let maxHeight = 0;\r\n for (let i = 0; i < this._numWaves; i++) {\r\n const h = this._waveParams[i * 8 + 2];\r\n if (h > maxHeight) {\r\n maxHeight = h;\r\n }\r\n }\r\n outAABB.minPoint.setXYZ(minX, y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3();\r\n that.calcNormalAndPos(this, this.inPos, this.outPos, this.outNormal);\r\n this.$return(this.outNormal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numWaves = pb.float().uniform(uniformGroup);\r\n scope.waveParams = pb.vec4[MAX_GERSTNER_WAVE_COUNT * 2]().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private gerstnerWave(\r\n scope: PBInsideFunctionScope,\r\n waveParam: PBShaderExp,\r\n omniParam: PBShaderExp,\r\n inPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n pb.func(\r\n 'gerstnerWave',\r\n [pb.vec4('waveParam'), pb.vec4('omniParam'), pb.vec3('inPos'), pb.vec3('outNormal').out()],\r\n function () {\r\n this.$l.amplitude = pb.max(this.waveParam.z, 0.01);\r\n this.$l.wavelength = this.waveParam.w;\r\n this.$l.omniPos = this.omniParam.xz;\r\n this.$l.omni = this.omniParam.w;\r\n this.$l.direction = pb.vec2(pb.sin(this.waveParam.x), pb.cos(this.waveParam.x));\r\n this.$l.w = pb.max(0.001, pb.div(Math.PI * 2, this.wavelength));\r\n this.$l.wSpeed = pb.sqrt(pb.mul(9.8, this.w));\r\n this.$l.peak = this.waveParam.y;\r\n this.$l.qi = pb.div(this.peak, pb.mul(this.amplitude, this.w, this.numWaves));\r\n this.$l.dirWaveInput = pb.mul(this.direction, pb.sub(1, this.omni));\r\n this.$l.omniWaveInput = pb.mul(pb.sub(this.inPos.xz, this.omniPos), this.omni);\r\n this.$l.windDir = pb.normalize(pb.add(this.dirWaveInput, this.omniWaveInput));\r\n this.$l.dir = pb.dot(this.windDir, pb.sub(this.inPos.xz, pb.mul(this.omniPos, this.omni)));\r\n this.$l.calc = pb.sub(\r\n pb.mul(this.dir, this.w),\r\n pb.mul(this.wSpeed, ShaderHelper.getElapsedTime(this))\r\n );\r\n this.$l.cosCalc = pb.cos(this.calc);\r\n this.$l.sinCalc = pb.sin(this.calc);\r\n this.$l.waveXZ = pb.mul(this.windDir.xy, this.qi, this.amplitude, this.cosCalc);\r\n this.$l.waveY = pb.div(pb.mul(this.sinCalc, this.amplitude), this.numWaves);\r\n this.$l.wave = pb.vec3(this.waveXZ.x, this.waveY, this.waveXZ.y);\r\n this.$l.wa = pb.mul(this.w, this.amplitude);\r\n this.$l.n = pb.vec3(\r\n pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)),\r\n pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc))\r\n );\r\n this.outNormal = pb.div(this.n.xzy, this.numWaves);\r\n this.$return(pb.mul(this.wave, pb.clamp(pb.mul(this.amplitude, 10000), 0, 1)));\r\n }\r\n );\r\n return scope.gerstnerWave(waveParam, omniParam, inPos, outNormal) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outPos = this.inPos;\r\n this.outNormal = pb.vec3(0);\r\n this.$for(\r\n pb.float('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numWaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n }\r\n );\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numWaves', this._numWaves);\r\n bindGroup.setValue('waveParams', this._waveParams);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'GerstnerWaveGenerator';\r\n }\r\n}\r\n"],"names":["GerstnerWaveGenerator","Disposable","_version","_waveParams","_numWaves","Float32Array","MAX_GERSTNER_WAVE_COUNT","randomWave","randomWaveData","array","offset","Math","random","PI","setRaw","data","index","set","clone","other","numWaves","version","val","Number","isInteger","console","error","i","deleteWave","j","insertWave","setWaveDirection","waveIndex","angle","getWaveDirection","setWaveSteepness","steepness","getWaveSteepness","setWaveAmplitude","getWaveAmplitude","setWaveLength","getWaveLength","isOmniWave","setOmniWave","isOmni","getOriginX","getOriginZ","setOrigin","x","z","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","h","minPoint","setXYZ","maxPoint","calcFragmentNormal","scope","xz","pb","$builder","that","func","vec2","$l","inPos","vec3","outPos","outNormal","calcNormalAndPos","$return","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","float","uniform","waveParams","gerstnerWave","waveParam","omniParam","out","amplitude","max","wavelength","w","omniPos","omni","direction","sin","cos","div","wSpeed","sqrt","mul","peak","qi","dirWaveInput","sub","omniWaveInput","windDir","normalize","add","dir","dot","calc","ShaderHelper","getElapsedTime","cosCalc","sinCalc","waveXZ","xy","waveY","wave","wa","n","neg","xzy","clamp","$for","getDevice","type","$if","greaterThanEqual","$break","waveNormal","wavePos","at","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
@@ -8,11 +8,13 @@ import '../values.js';
8
8
  import '@zephyr3d/base';
9
9
  import '../material/meshmaterial.js';
10
10
  import '../material/grassmaterial.js';
11
- import '../material/terrainmaterial.js';
12
11
  import '../material/terrain-cm.js';
13
12
  import '../material/pbrmr.js';
14
13
  import '../material/pbrsg.js';
15
14
  import '../material/pbrblueprint.js';
15
+ import '../material/sprite.js';
16
+ import '../material/sprite_std.js';
17
+ import '../utility/blueprint/material/texture.js';
16
18
 
17
19
  class GlobalBindGroupAllocator {
18
20
  static _layouts = {};
@@ -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(): GlobalBindGroupAllocator {\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): BindGroup {\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,GAAgC,GAAA;AACrC,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,EAAa;QAC9C,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;;;;"}
@@ -9,7 +9,7 @@ import { fetchSampler } from '../utility/misc.js';
9
9
  let hzbProgram = null;
10
10
  let hzbBindGroup = null;
11
11
  let blitter = null;
12
- let srcSize = null;
12
+ const srcSize = new Int32Array(2);
13
13
  /*
14
14
  vec3 trace_ray(vec3 ray_start, vec3 ray_dir)
15
15
  {
@@ -252,7 +252,6 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
252
252
  hzbProgram = buildHZBProgram(device);
253
253
  hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);
254
254
  blitter = new CopyBlitter();
255
- srcSize = new Int32Array(2);
256
255
  }
257
256
  blitter.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));
258
257
  device.pushDeviceStates();
@@ -1 +1 @@
1
- {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, FrameBuffer, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\n\r\nlet hzbProgram: GPUProgram = null;\r\nlet hzbBindGroup: BindGroup = null;\r\nlet blitter: CopyBlitter = null;\r\nlet srcSize: Int32Array<ArrayBuffer> = null;\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\nfunction buildHZBProgram(device: AbstractDevice): GPUProgram {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n ).r;\r\n }\r\n this.$l.d = pb.min(pb.min(this.d0, this.d1), pb.min(this.d2, this.d3));\r\n this.$outputs.color = pb.vec4(this.d, 0, 0, 1);\r\n });\r\n }\r\n });\r\n program.name = '@HZB_Builder';\r\n return program;\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D\r\n): void {\r\n const sampler = fetchSampler('clamp_nearest');\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);\r\n srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);\r\n hzbBindGroup.setValue('srcSize', srcSize);\r\n if (device.type === 'webgpu') {\r\n hzbBindGroup.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);\r\n } else {\r\n hzbBindGroup.setTexture('srcTex', srcTexture, sampler);\r\n hzbBindGroup.setValue('srcMipLevel', miplevel);\r\n }\r\n device.setProgram(hzbProgram);\r\n device.setBindGroup(0, hzbBindGroup);\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n if (!hzbProgram) {\r\n hzbProgram = buildHZBProgram(device);\r\n hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);\r\n blitter = new CopyBlitter();\r\n srcSize = new Int32Array(2);\r\n }\r\n blitter.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, dstTex);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroup","blitter","srcSize","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","type","y","neg","fragment","color","srcTex","tex2D","sampleType","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","r","d","min","d0","d1","d2","d3","name","buildHiZLevel","miplevel","srcTexture","dstTexture","sampler","fetchSampler","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","Math","max","width","height","setValue","setTextureView","setTexture","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","createBindGroup","bindGroupLayouts","CopyBlitter","Int32Array","blit","pushDeviceStates","getColorAttachments","mipLevelCount","tmpFramebuffer","getWidth","getHeight","format","dstTex","popDeviceStates"],"mappings":"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"}
1
+ {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, FrameBuffer, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram> = null;\r\nlet hzbBindGroup: Nullable<BindGroup> = null;\r\nlet blitter: Nullable<CopyBlitter> = null;\r\nconst srcSize = new Int32Array(2);\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\nfunction buildHZBProgram(device: AbstractDevice) {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n ).r;\r\n }\r\n this.$l.d = pb.min(pb.min(this.d0, this.d1), pb.min(this.d2, this.d3));\r\n this.$outputs.color = pb.vec4(this.d, 0, 0, 1);\r\n });\r\n }\r\n })!;\r\n program.name = '@HZB_Builder';\r\n return program;\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D\r\n) {\r\n const sampler = fetchSampler('clamp_nearest');\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);\r\n srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);\r\n hzbBindGroup!.setValue('srcSize', srcSize);\r\n if (device.type === 'webgpu') {\r\n hzbBindGroup!.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);\r\n } else {\r\n hzbBindGroup!.setTexture('srcTex', srcTexture, sampler);\r\n hzbBindGroup!.setValue('srcMipLevel', miplevel);\r\n }\r\n device.setProgram(hzbProgram);\r\n device.setBindGroup(0, hzbBindGroup!);\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n if (!hzbProgram) {\r\n hzbProgram = buildHZBProgram(device);\r\n hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);\r\n blitter = new CopyBlitter();\r\n }\r\n blitter!.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, dstTex);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroup","blitter","srcSize","Int32Array","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","type","y","neg","fragment","color","srcTex","tex2D","sampleType","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","r","d","min","d0","d1","d2","d3","name","buildHiZLevel","miplevel","srcTexture","dstTexture","sampler","fetchSampler","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","Math","max","width","height","setValue","setTextureView","setTexture","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","createBindGroup","bindGroupLayouts","CopyBlitter","blit","pushDeviceStates","getColorAttachments","mipLevelCount","tmpFramebuffer","getWidth","getHeight","format","dstTex","popDeviceStates"],"mappings":"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"}
@@ -15,6 +15,7 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
15
15
  */ constructor(){
16
16
  super(RENDER_PASS_TYPE_LIGHT);
17
17
  this._shadowMapHash = null;
18
+ this._transmission = false;
18
19
  this._clearColor = Vector4.zero();
19
20
  }
20
21
  /** @internal */ get transmission() {
@@ -23,16 +24,16 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
23
24
  set transmission(val) {
24
25
  this._transmission = val;
25
26
  }
26
- /** @internal */ _getGlobalBindGroupHash(ctx) {
27
- return `${this._shadowMapHash}:${ctx.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;
27
+ /** @internal */ _getGlobalBindGroupHash(ctx, camera) {
28
+ return `${this._shadowMapHash}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;
28
29
  }
29
- /** @internal */ renderLightPass(ctx, itemList, lights, flags) {
30
+ /** @internal */ renderLightPass(ctx, camera, itemList, lights, flags) {
30
31
  const baseLightPass = !ctx.lightBlending;
31
32
  ctx.drawEnvLight = baseLightPass && ctx.env.light.type !== 'none' && (ctx.env.light.envLight.hasRadiance() || ctx.env.light.envLight.hasIrradiance());
32
- ctx.renderPassHash = this.getGlobalBindGroupHash(ctx);
33
+ ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);
33
34
  const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);
34
35
  if (!flags.cameraSet[ctx.renderPassHash]) {
35
- ShaderHelper.setCameraUniforms(bindGroup, ctx, !!ctx.device.getFramebuffer());
36
+ ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());
36
37
  flags.cameraSet[ctx.renderPassHash] = 1;
37
38
  }
38
39
  if (ctx.currentShadowLight) {
@@ -48,7 +49,7 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
48
49
  flags.fogSet[ctx.renderPassHash] = 1;
49
50
  }
50
51
  ctx.device.setBindGroup(0, bindGroup);
51
- const reverseWinding = ctx.camera.worldMatrixDet < 0;
52
+ const reverseWinding = camera.worldMatrixDet < 0;
52
53
  for (const lit of itemList.lit){
53
54
  this.drawItemList(lit, ctx, reverseWinding);
54
55
  }
@@ -58,17 +59,16 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
58
59
  }
59
60
  }
60
61
  }
61
- /** @internal */ renderItems(ctx, renderQueue) {
62
- ctx.fogFlags = 0;
62
+ /** @internal */ renderItems(ctx, camera, renderQueue) {
63
63
  ctx.renderPassHash = null;
64
64
  ctx.env = ctx.scene.env;
65
65
  ctx.drawEnvLight = false;
66
66
  ctx.flip = this.isAutoFlip(ctx);
67
67
  const ssr = !!(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS);
68
68
  const tmpFramebuffer = ssr ? ctx.device.pool.fetchTemporalFramebuffer(false, ctx.device.getDrawingBufferWidth(), ctx.device.getDrawingBufferHeight(), ctx.device.getFramebuffer().getColorAttachments()[0], ctx.device.getFramebuffer().getDepthAttachment()) : null;
69
- const oit = renderQueue.drawTransparent && ctx.primaryCamera.oit && ctx.primaryCamera.oit.supportDevice(ctx.device.type) ? ctx.primaryCamera.oit : null;
69
+ const oit = renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type) ? camera.oit : null;
70
70
  if (!oit && renderQueue.drawTransparent) {
71
- renderQueue.sortTransparentItems(ctx.primaryCamera.getWorldPosition());
71
+ renderQueue.sortTransparentItems(camera.getWorldPosition());
72
72
  }
73
73
  const flags = {
74
74
  lightSet: {},
@@ -105,7 +105,7 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
105
105
  ctx.currentShadowLight = k;
106
106
  ctx.lightBlending = lightIndex > 0;
107
107
  this._shadowMapHash = ctx.shadowMapInfo.get(k).shaderHash;
108
- this.renderLightPass(ctx, lists[i], [
108
+ this.renderLightPass(ctx, camera, lists[i], [
109
109
  k
110
110
  ], flags);
111
111
  lightIndex++;
@@ -120,7 +120,7 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
120
120
  ctx.device.pushDeviceStates();
121
121
  ctx.device.setFramebuffer(tmpFramebuffer);
122
122
  }
123
- this.renderLightPass(ctx, lists[i], renderQueue.unshadowedLights, flags);
123
+ this.renderLightPass(ctx, camera, lists[i], renderQueue.unshadowedLights, flags);
124
124
  if (ctx.lightBlending && tmpFramebuffer) {
125
125
  ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;
126
126
  ctx.device.popDeviceStates();
@@ -143,7 +143,7 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
143
143
  ctx.env.sky.skyWorldMatrix = ctx.scene.rootNode.worldMatrix;
144
144
  ctx.env.sky.renderSky(ctx);
145
145
  if (ctx.env.sky.fogPresents) {
146
- ctx.env.sky.renderFog(ctx.camera);
146
+ ctx.env.sky.renderFog(camera);
147
147
  }
148
148
  if (tmpFramebuffer) {
149
149
  ctx.device.popDeviceStates();
@@ -1 +1 @@
1
- {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { PostEffectLayer } from '../posteffect/posteffect';\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: string;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission(): boolean {\r\n return this._transmission;\r\n }\r\n set transmission(val: boolean) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n return `${this._shadowMapHash}:${ctx.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${\r\n ctx.materialFlags\r\n }:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env.light.type !== 'none' &&\r\n (ctx.env.light.envLight.hasRadiance() || ctx.env.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight.clusterParam,\r\n ctx.clusteredLight.countParam,\r\n ctx.clusteredLight.lightBuffer,\r\n ctx.clusteredLight.lightIndexTexture\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env.sky.atmosphereParams,\r\n ctx.env.sky.heightFogParams,\r\n ctx.env.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, renderQueue: RenderQueue) {\r\n ctx.fogFlags = 0;\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const ssr = !!(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS);\r\n const tmpFramebuffer = ssr\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n ctx.device.getFramebuffer().getColorAttachments()[0],\r\n ctx.device.getFramebuffer().getDepthAttachment()\r\n )\r\n : null;\r\n const oit =\r\n renderQueue.drawTransparent &&\r\n ctx.primaryCamera.oit &&\r\n ctx.primaryCamera.oit.supportDevice(ctx.device.type)\r\n ? ctx.primaryCamera.oit\r\n : null;\r\n if (!oit && renderQueue.drawTransparent) {\r\n renderQueue.sortTransparentItems(ctx.primaryCamera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n const transparentPass = lists.length - 1;\r\n for (let i = 0; i < lists.length; i++) {\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n let lightIndex = 0;\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k).shaderHash;\r\n this.renderLightPass(ctx, lists[i], [k], flags);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n this.renderLightPass(ctx, lists[i], renderQueue.unshadowedLights, flags);\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.skyWorldMatrix = ctx.scene.rootNode.worldMatrix;\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(ctx.camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (!renderQueue.needSceneColor() || ctx.sceneColorTexture) {\r\n if (i === 0 || i === transparentPass) {\r\n ctx.compositor?.drawPostEffects(\r\n ctx,\r\n i === 0 ? PostEffectLayer.opaque : PostEffectLayer.transparent,\r\n ctx.linearDepthTexture\r\n );\r\n }\r\n }\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n}\r\n"],"names":["LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_clearColor","Vector4","zero","transmission","_transmission","val","_getGlobalBindGroupHash","ctx","oit","calculateHash","env","getHash","materialFlags","linearDepthTexture","uid","sceneColorTexture","HiZTexture","renderLightPass","itemList","lights","flags","baseLightPass","lightBlending","drawEnvLight","light","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","device","getFramebuffer","currentShadowLight","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","MaterialVaryingFlags","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","camera","worldMatrixDet","lit","drawItemList","unlit","renderItems","renderQueue","fogFlags","scene","flip","isAutoFlip","ssr","SSR_STORE_ROUGHNESS","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getColorAttachments","getDepthAttachment","drawTransparent","primaryCamera","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","transparentPass","length","i","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","fogPresents","numOitPasses","begin","p","beginPass","lightIndex","shadowMapInfo","k","keys","get","shaderHash","unshadowedLights","pushDeviceStates","setFramebuffer","popDeviceStates","endPass","end","skyWorldMatrix","rootNode","worldMatrix","renderSky","renderFog","needSceneColor","compositor","drawPostEffects","PostEffectLayer","releaseFrameBuffer"],"mappings":"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"}
1
+ {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { PostEffectLayer } from '../posteffect/posteffect';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(ctx)}:${\r\n ctx.materialFlags\r\n }:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const ssr = !!(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS);\r\n const tmpFramebuffer = ssr\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n ctx.device.getFramebuffer()!.getColorAttachments()[0],\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n if (!oit && renderQueue.drawTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n const transparentPass = lists.length - 1;\r\n for (let i = 0; i < lists.length; i++) {\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n let lightIndex = 0;\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n this.renderLightPass(ctx, camera, lists[i]!, [k], flags);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, renderQueue.unshadowedLights, flags);\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.skyWorldMatrix = ctx.scene.rootNode.worldMatrix;\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (!renderQueue.needSceneColor() || ctx.sceneColorTexture) {\r\n if (i === 0 || i === transparentPass) {\r\n ctx.compositor?.drawPostEffects(\r\n ctx,\r\n i === 0 ? PostEffectLayer.opaque : PostEffectLayer.transparent,\r\n ctx.linearDepthTexture!\r\n );\r\n }\r\n }\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n}\r\n"],"names":["LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_clearColor","Vector4","zero","transmission","val","_getGlobalBindGroupHash","ctx","camera","oit","calculateHash","env","getHash","materialFlags","linearDepthTexture","uid","sceneColorTexture","HiZTexture","renderLightPass","itemList","lights","flags","baseLightPass","lightBlending","drawEnvLight","light","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","device","getFramebuffer","currentShadowLight","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","MaterialVaryingFlags","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","renderQueue","scene","flip","isAutoFlip","ssr","SSR_STORE_ROUGHNESS","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getColorAttachments","getDepthAttachment","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","transparentPass","length","i","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","fogPresents","numOitPasses","begin","p","beginPass","lightIndex","shadowMapInfo","k","keys","get","shaderHash","unshadowedLights","pushDeviceStates","setFramebuffer","popDeviceStates","endPass","end","skyWorldMatrix","rootNode","worldMatrix","renderSky","renderFog","needSceneColor","compositor","drawPostEffects","PostEffectLayer","releaseFrameBuffer"],"mappings":"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"}
@@ -14,19 +14,17 @@ import { ShaderHelper } from '../material/shader/helper.js';
14
14
  /** @internal */ _getGlobalBindGroupHash(_ctx) {
15
15
  return '';
16
16
  }
17
- /** @internal */ renderItems(ctx, renderQueue) {
17
+ /** @internal */ renderItems(ctx, camera, renderQueue) {
18
18
  const items = renderQueue.itemList;
19
19
  if (items) {
20
- ctx.fogFlags = 0;
21
20
  ctx.drawEnvLight = false;
22
21
  ctx.env = null;
23
- ctx.picking = true;
24
22
  ctx.flip = this.isAutoFlip(ctx);
25
- ctx.renderPassHash = this.getGlobalBindGroupHash(ctx);
23
+ ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);
26
24
  const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);
27
25
  ctx.device.setBindGroup(0, bindGroup);
28
- ShaderHelper.setCameraUniforms(bindGroup, ctx, true);
29
- const reverseWinding = ctx.camera.worldMatrixDet < 0;
26
+ ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, true);
27
+ const reverseWinding = camera.worldMatrixDet < 0;
30
28
  for (const list of [
31
29
  items.opaque,
32
30
  items.transmission,
@@ -42,7 +40,6 @@ import { ShaderHelper } from '../material/shader/helper.js';
42
40
  }
43
41
  }
44
42
  }
45
- ctx.picking = false;
46
43
  }
47
44
  }
48
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"objectcolorpass.js","sources":["../../src/render/objectcolorpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\n\r\n/**\r\n * Object color render pass\r\n * @internal\r\n */\r\nexport class ObjectColorPass extends RenderPass {\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_OBJECT_COLOR);\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, renderQueue: RenderQueue) {\r\n const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.fogFlags = 0;\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.picking = true;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, true);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n for (const list of [items.opaque, items.transmission, items.transparent, items.transmission_trans]) {\r\n if (list) {\r\n for (const lit of list.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of list.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n ctx.picking = false;\r\n }\r\n }\r\n}\r\n"],"names":["ObjectColorPass","RenderPass","RENDER_PASS_TYPE_OBJECT_COLOR","_getGlobalBindGroupHash","_ctx","renderItems","ctx","renderQueue","items","itemList","fogFlags","drawEnvLight","env","picking","flip","isAutoFlip","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","camera","worldMatrixDet","list","opaque","transmission","transparent","transmission_trans","lit","drawItemList","unlit"],"mappings":";;;;AAMA;;;IAIO,MAAMA,eAAwBC,SAAAA,UAAAA,CAAAA;AACnC;;AAEC,MACD,WAAc,EAAA;AACZ,QAAA,KAAK,CAACC,6BAAAA,CAAAA;AACR;AACA,qBACUC,uBAAwBC,CAAAA,IAAiB,EAAE;QACnD,OAAO,EAAA;AACT;AACA,qBACA,WAAUC,CAAYC,GAAgB,EAAEC,WAAwB,EAAE;QAChE,MAAMC,KAAAA,GAAQD,YAAYE,QAAQ;AAClC,QAAA,IAAID,KAAO,EAAA;AACTF,YAAAA,GAAAA,CAAII,QAAQ,GAAG,CAAA;AACfJ,YAAAA,GAAAA,CAAIK,YAAY,GAAG,KAAA;AACnBL,YAAAA,GAAAA,CAAIM,GAAG,GAAG,IAAA;AACVN,YAAAA,GAAAA,CAAIO,OAAO,GAAG,IAAA;AACdP,YAAAA,GAAAA,CAAIQ,IAAI,GAAG,IAAI,CAACC,UAAU,CAACT,GAAAA,CAAAA;AAC3BA,YAAAA,GAAAA,CAAIU,cAAc,GAAG,IAAI,CAACC,sBAAsB,CAACX,GAAAA,CAAAA;AACjD,YAAA,MAAMY,SAAYZ,GAAAA,GAAAA,CAAIa,wBAAwB,CAACC,kBAAkB,CAACd,GAAAA,CAAAA;AAClEA,YAAAA,GAAAA,CAAIe,MAAM,CAACC,YAAY,CAAC,CAAGJ,EAAAA,SAAAA,CAAAA;YAC3BK,YAAaC,CAAAA,iBAAiB,CAACN,SAAAA,EAAWZ,GAAK,EAAA,IAAA,CAAA;AAC/C,YAAA,MAAMmB,cAAiBnB,GAAAA,GAAAA,CAAIoB,MAAM,CAACC,cAAc,GAAG,CAAA;AACnD,YAAA,KAAK,MAAMC,IAAQ,IAAA;AAACpB,gBAAAA,KAAAA,CAAMqB,MAAM;AAAErB,gBAAAA,KAAAA,CAAMsB,YAAY;AAAEtB,gBAAAA,KAAAA,CAAMuB,WAAW;AAAEvB,gBAAAA,KAAAA,CAAMwB;aAAmB,CAAE;AAClG,gBAAA,IAAIJ,IAAM,EAAA;AACR,oBAAA,KAAK,MAAMK,GAAAA,IAAOL,IAAKK,CAAAA,GAAG,CAAE;AAC1B,wBAAA,IAAI,CAACC,YAAY,CAACD,GAAAA,EAAK3B,GAAKmB,EAAAA,cAAAA,CAAAA;AAC9B;AACA,oBAAA,KAAK,MAAMU,KAAAA,IAASP,IAAKO,CAAAA,KAAK,CAAE;AAC9B,wBAAA,IAAI,CAACD,YAAY,CAACC,KAAAA,EAAO7B,GAAKmB,EAAAA,cAAAA,CAAAA;AAChC;AACF;AACF;AACAnB,YAAAA,GAAAA,CAAIO,OAAO,GAAG,KAAA;AAChB;AACF;AACF;;;;"}
1
+ {"version":3,"file":"objectcolorpass.js","sources":["../../src/render/objectcolorpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Object color render pass\r\n * @internal\r\n */\r\nexport class ObjectColorPass extends RenderPass {\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_OBJECT_COLOR);\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 const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, true);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const list of [items.opaque, items.transmission, items.transparent, items.transmission_trans]) {\r\n if (list) {\r\n for (const lit of list.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of list.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["ObjectColorPass","RenderPass","RENDER_PASS_TYPE_OBJECT_COLOR","_getGlobalBindGroupHash","_ctx","ctx","camera","renderQueue","items","itemList","drawEnvLight","env","flip","isAutoFlip","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","worldMatrixDet","list","opaque","transmission","transparent","transmission_trans","lit","drawItemList","unlit"],"mappings":";;;;AAOA;;;IAIO,MAAMA,eAAwBC,SAAAA,UAAAA,CAAAA;AACnC;;AAEC,MACD,WAAc,EAAA;AACZ,QAAA,KAAK,CAACC,6BAAAA,CAAAA;AACR;AACA,qBACUC,uBAAwBC,CAAAA,IAAiB,EAAE;QACnD,OAAO,EAAA;AACT;qBAEA,WAAsBC,CAAAA,GAAgB,EAAEC,MAAc,EAAEC,WAAwB,EAAE;QAChF,MAAMC,KAAAA,GAAQD,YAAYE,QAAQ;AAClC,QAAA,IAAID,KAAO,EAAA;AACTH,YAAAA,GAAAA,CAAIK,YAAY,GAAG,KAAA;AACnBL,YAAAA,GAAAA,CAAIM,GAAG,GAAG,IAAA;AACVN,YAAAA,GAAAA,CAAIO,IAAI,GAAG,IAAI,CAACC,UAAU,CAACR,GAAAA,CAAAA;AAC3BA,YAAAA,GAAAA,CAAIS,cAAc,GAAG,IAAI,CAACC,sBAAsB,CAACV,GAAKC,EAAAA,MAAAA,CAAAA;AACtD,YAAA,MAAMU,SAAYX,GAAAA,GAAAA,CAAIY,wBAAwB,CAACC,kBAAkB,CAACb,GAAAA,CAAAA;AAClEA,YAAAA,GAAAA,CAAIc,MAAM,CAACC,YAAY,CAAC,CAAGJ,EAAAA,SAAAA,CAAAA;AAC3BK,YAAAA,YAAAA,CAAaC,iBAAiB,CAACN,SAAWX,EAAAA,GAAAA,EAAKC,MAAQ,EAAA,IAAA,CAAA;YACvD,MAAMiB,cAAAA,GAAiBjB,MAAOkB,CAAAA,cAAc,GAAG,CAAA;AAC/C,YAAA,KAAK,MAAMC,IAAQ,IAAA;AAACjB,gBAAAA,KAAAA,CAAMkB,MAAM;AAAElB,gBAAAA,KAAAA,CAAMmB,YAAY;AAAEnB,gBAAAA,KAAAA,CAAMoB,WAAW;AAAEpB,gBAAAA,KAAAA,CAAMqB;aAAmB,CAAE;AAClG,gBAAA,IAAIJ,IAAM,EAAA;AACR,oBAAA,KAAK,MAAMK,GAAAA,IAAOL,IAAKK,CAAAA,GAAG,CAAE;AAC1B,wBAAA,IAAI,CAACC,YAAY,CAACD,GAAAA,EAAKzB,GAAKkB,EAAAA,cAAAA,CAAAA;AAC9B;AACA,oBAAA,KAAK,MAAMS,KAAAA,IAASP,IAAKO,CAAAA,KAAK,CAAE;AAC9B,wBAAA,IAAI,CAACD,YAAY,CAACC,KAAAA,EAAO3B,GAAKkB,EAAAA,cAAAA,CAAAA;AAChC;AACF;AACF;AACF;AACF;AACF;;;;"}
@@ -94,7 +94,7 @@ import { getDevice } from '../app/api.js';
94
94
  for (const info of other._vertexLayoutOptions.vertexBuffers){
95
95
  this.setVertexBuffer(info.buffer, info.stepMode);
96
96
  }
97
- this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer);
97
+ this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer ?? null);
98
98
  this.primitiveType = other.primitiveType;
99
99
  this.indexStart = other.indexStart;
100
100
  this.indexCount = other.indexCount;
@@ -274,7 +274,7 @@ import { getDevice } from '../app/api.js';
274
274
  */ setIndexBuffer(buffer) {
275
275
  if (this._vertexLayoutOptions.indexBuffer !== buffer) {
276
276
  retainObject(buffer);
277
- releaseObject(this._vertexLayoutOptions.indexBuffer);
277
+ releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);
278
278
  this._vertexLayoutOptions.indexBuffer = buffer;
279
279
  this._vertexLayoutDirty = true;
280
280
  this._changeTag++;
@@ -286,7 +286,7 @@ import { getDevice } from '../app/api.js';
286
286
  *
287
287
  * @returns The index buffer, or `undefined`/`null` if none set.
288
288
  */ getIndexBuffer() {
289
- return this._vertexLayoutOptions.indexBuffer;
289
+ return this._vertexLayoutOptions.indexBuffer ?? null;
290
290
  }
291
291
  /**
292
292
  * Issue a non-instanced draw for the current topology and range.
@@ -317,11 +317,10 @@ import { getDevice } from '../app/api.js';
317
317
  this._vertexLayout?.dispose();
318
318
  this._vertexLayout = null;
319
319
  if (this._vertexLayoutOptions) {
320
- releaseObject(this._vertexLayoutOptions.indexBuffer);
320
+ releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);
321
321
  for (const info of this._vertexLayoutOptions.vertexBuffers){
322
322
  releaseObject(info.buffer);
323
323
  }
324
- this._vertexLayoutOptions = null;
325
324
  }
326
325
  }
327
326
  /*