@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
@@ -1 +1 @@
1
- {"version":3,"file":"primitive.js","sources":["../../src/render/primitive.ts"],"sourcesContent":["import {\r\n Disposable,\r\n makeObservable,\r\n releaseObject,\r\n retainObject,\r\n type Clonable,\r\n type Ray,\r\n type TypedArray\r\n} from '@zephyr3d/base';\r\nimport {\r\n type VertexStepMode,\r\n type VertexLayout,\r\n type VertexLayoutOptions,\r\n type PrimitiveType,\r\n type StructuredBuffer,\r\n type IndexBuffer,\r\n type VertexSemantic,\r\n type VertexAttribFormat,\r\n type VertexBufferInfo,\r\n PBPrimitiveType,\r\n matchVertexBuffer\r\n} from '@zephyr3d/device';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Holds vertex/index data and draw parameters for a mesh geometry.\r\n *\r\n * Responsibilities:\r\n * - Owns one or more vertex buffers and an optional index buffer.\r\n * - Defines primitive topology, draw range (start/count), and vertex layout.\r\n * - Provides utilities to create/set/remove buffers and query vertex/face counts.\r\n * - Tracks changes via a change tag and notifies render-bundle caching.\r\n * - Optionally stores a bounding volume and supports ray intersection tests.\r\n *\r\n * Ownership and lifecycle:\r\n * - When adding buffers (`setVertexBuffer`, `setIndexBuffer`), the primitive retains them.\r\n * - When removing/overwriting buffers, the primitive releases the previous buffers.\r\n * - Disposing the primitive also disposes the internal `VertexLayout` and releases retained buffers.\r\n *\r\n * @public\r\n */\r\nexport class Primitive\r\n extends makeObservable(Disposable)<{\r\n bv_changed: [];\r\n }>()\r\n implements Clonable<Primitive>\r\n{\r\n /** @internal Current vertex layout object (created lazily from options). */\r\n protected _vertexLayout: VertexLayout;\r\n /** @internal Mutable options used to build the vertex layout. */\r\n protected _vertexLayoutOptions: VertexLayoutOptions;\r\n /** @internal Primitive topology (e.g., 'triangle-list', 'line-strip'). */\r\n protected _primitiveType: PrimitiveType;\r\n /** @internal First index/vertex to draw. */\r\n protected _indexStart: number;\r\n /** @internal Number of indices/vertices to draw (computed lazily if null). */\r\n protected _indexCount: number;\r\n /** @internal Cached default index count (derived when needed). */\r\n protected _defaultIndexCount: number;\r\n /** @internal Marks layout dirty when buffers/topology change. */\r\n protected _vertexLayoutDirty: boolean;\r\n /** @internal Monotonic runtime id. */\r\n private static _nextId = 0;\r\n /** @internal Unique runtime id for the instance. */\r\n protected _id: number;\r\n /** @internal Optional bounding volume for culling/raycast. */\r\n protected _bbox: BoundingVolume;\r\n /** @internal Change tag increments when draw-affecting state changes. */\r\n private _changeTag: number;\r\n /**\r\n * Create an empty primitive.\r\n *\r\n * Defaults:\r\n * - Primitive type: 'triangle-list'\r\n * - `indexStart = 0`, `indexCount = null` (auto-computed)\r\n * - No vertex/index buffers attached\r\n * - No bounding volume\r\n */\r\n constructor() {\r\n super();\r\n this._vertexLayout = null;\r\n this._vertexLayoutOptions = { vertexBuffers: [] };\r\n this._primitiveType = 'triangle-list';\r\n this._indexStart = 0;\r\n this._indexCount = null;\r\n this._defaultIndexCount = 0;\r\n this._vertexLayoutDirty = false;\r\n this._id = ++Primitive._nextId;\r\n this._changeTag = 0;\r\n this._bbox = null;\r\n }\r\n /**\r\n * Unique runtime identifier of this primitive.\r\n *\r\n * @returns The numeric instance id.\r\n * @internal\r\n */\r\n get id(): number {\r\n return this._id;\r\n }\r\n /**\r\n * Change tag that increments whenever draw-affecting state changes.\r\n * Useful for invalidating cached render bundles.\r\n *\r\n * @returns The current change tag value.\r\n */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /**\r\n * Create a shallow clone: copies topology, draw range, and buffers.\r\n *\r\n * Note: Buffers are re-retained on the new primitive.\r\n *\r\n * @returns A cloned Primitive instance.\r\n */\r\n clone(): Primitive {\r\n const other = new Primitive();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy from another primitive.\r\n *\r\n * Copies:\r\n * - All vertex buffers and the index buffer\r\n * - Primitive type, index start, index count\r\n *\r\n * @param other - The source primitive to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this) {\r\n for (const info of other._vertexLayoutOptions.vertexBuffers) {\r\n this.setVertexBuffer(info.buffer, info.stepMode);\r\n }\r\n this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer);\r\n this.primitiveType = other.primitiveType;\r\n this.indexStart = other.indexStart;\r\n this.indexCount = other.indexCount;\r\n }\r\n /**\r\n * Primitive topology.\r\n */\r\n get primitiveType() {\r\n return this._primitiveType;\r\n }\r\n set primitiveType(type) {\r\n if (type !== this._primitiveType) {\r\n this._primitiveType = type;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Starting index/vertex for drawing.\r\n */\r\n get indexStart() {\r\n return this._indexStart;\r\n }\r\n set indexStart(val) {\r\n if (val !== this._indexStart) {\r\n this._indexStart = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Number of indices/vertices to draw.\r\n */\r\n get indexCount() {\r\n this._indexCount = this._indexCount ?? this.calcDefaultIndexCount();\r\n return this._indexCount;\r\n }\r\n set indexCount(val) {\r\n if (val !== this._indexCount) {\r\n this._indexCount = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Query total vertex count from the position buffer, if present.\r\n *\r\n * @returns Total vertex count; 0 if no position buffer is set.\r\n */\r\n getNumVertices(): number {\r\n const posInfo = this.getVertexBufferInfo('position');\r\n return posInfo?.buffer ? (posInfo.buffer.byteLength / posInfo.stride) >> 0 : 0;\r\n }\r\n /**\r\n * Query total face/segment count based on topology and buffer size.\r\n *\r\n * - For indexed geometry: derived from index buffer.\r\n * - For non-indexed: derived from position vertex count.\r\n *\r\n * @returns Total primitive count for the current topology.\r\n */\r\n getNumFaces(): number {\r\n const ib = this.getIndexBuffer();\r\n const count = ib\r\n ? ib.byteLength >> (ib.indexType.primitiveType === PBPrimitiveType.U16 ? 1 : 2)\r\n : this.getNumVertices();\r\n switch (this.primitiveType) {\r\n case 'line-list':\r\n return count >> 1;\r\n case 'point-list':\r\n return count;\r\n case 'line-strip':\r\n return count - 1;\r\n case 'triangle-fan':\r\n return count - 2;\r\n case 'triangle-strip':\r\n return count - 2;\r\n case 'triangle-list':\r\n return (count / 3) >> 0;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /**\r\n * Remove all vertex buffers that match a given semantic.\r\n *\r\n * This releases retained buffers, marks the layout dirty, and invalidates bundles.\r\n *\r\n * @param semantic - The vertex semantic to remove (e.g., 'position', 'normal').\r\n * @returns void\r\n */\r\n removeVertexBuffer(semantic: VertexSemantic): void {\r\n for (let i = this._vertexLayoutOptions.vertexBuffers.length - 1; i >= 0; i--) {\r\n const info = this._vertexLayoutOptions.vertexBuffers[i];\r\n if (matchVertexBuffer(info.buffer, semantic)) {\r\n releaseObject(info.buffer);\r\n this._vertexLayoutOptions.vertexBuffers.splice(i, 1);\r\n this._vertexLayoutDirty = true;\r\n }\r\n }\r\n if (this._vertexLayoutDirty) {\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the vertex buffer that matches a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The matching vertex buffer, or `null` if not found.\r\n */\r\n getVertexBuffer(semantic: VertexSemantic): StructuredBuffer {\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n if (info.buffer && matchVertexBuffer(info.buffer, semantic)) {\r\n return info.buffer;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get vertex buffer information for a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The `VertexBufferInfo`, or `null` if not found.\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic): VertexBufferInfo {\r\n this.checkVertexLayout();\r\n return this._vertexLayout?.getVertexBufferInfo(semantic) ?? null;\r\n }\r\n /**\r\n * Create a vertex buffer from data and add it to the primitive.\r\n *\r\n * - For interleaved layouts, pass an array of `VertexAttribFormat`.\r\n * - For a single attribute, pass a single `VertexAttribFormat`.\r\n *\r\n * @param format - Vertex attribute format(s).\r\n * @param data - Typed array with vertex data.\r\n * @param stepMode - Optional step mode (e.g., 'vertex', 'instance').\r\n * @returns The created `StructuredBuffer`.\r\n */\r\n createAndSetVertexBuffer(\r\n format: VertexAttribFormat[] | VertexAttribFormat,\r\n data: TypedArray,\r\n stepMode?: VertexStepMode\r\n ): StructuredBuffer {\r\n const device = getDevice();\r\n const buffer = Array.isArray(format)\r\n ? device.createInterleavedVertexBuffer(format, data)\r\n : device.createVertexBuffer(format, data);\r\n return this.setVertexBuffer(buffer, stepMode);\r\n }\r\n /**\r\n * Add an existing vertex buffer to the primitive.\r\n *\r\n * Ownership note: The primitive retains the buffer; it will be released or disposed when replaced or on dispose.\r\n *\r\n * @param buffer - The vertex buffer to add.\r\n * @param stepMode - Optional step mode for the buffer.\r\n * @returns The same buffer.\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode) {\r\n retainObject(buffer);\r\n this._vertexLayoutOptions.vertexBuffers.push({\r\n buffer,\r\n stepMode\r\n });\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n return buffer;\r\n }\r\n /**\r\n * Create an index buffer from data and set it on the primitive.\r\n *\r\n * @param data - Index data as Uint16Array or Uint32Array.\r\n * @param dynamic - Whether the index buffer is dynamic (unmanaged).\r\n * @returns The created `IndexBuffer`.\r\n */\r\n createAndSetIndexBuffer(\r\n data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>,\r\n dynamic?: boolean\r\n ): IndexBuffer {\r\n const device = getDevice();\r\n const buffer = device.createIndexBuffer(data, {\r\n dynamic: !!dynamic,\r\n managed: !dynamic\r\n });\r\n this.setIndexBuffer(buffer);\r\n return buffer;\r\n }\r\n /**\r\n * Set or replace the index buffer.\r\n *\r\n * Ownership note: The primitive retains the buffer; previous buffer is released.\r\n * Marks the vertex layout dirty and invalidates bundles.\r\n *\r\n * @param buffer - The index buffer to set (non-null).\r\n * @returns void\r\n */\r\n setIndexBuffer(buffer: IndexBuffer): void {\r\n if (this._vertexLayoutOptions.indexBuffer !== buffer) {\r\n retainObject(buffer);\r\n releaseObject(this._vertexLayoutOptions.indexBuffer);\r\n this._vertexLayoutOptions.indexBuffer = buffer;\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the current index buffer.\r\n *\r\n * @returns The index buffer, or `undefined`/`null` if none set.\r\n */\r\n getIndexBuffer(): IndexBuffer {\r\n return this._vertexLayoutOptions.indexBuffer;\r\n }\r\n /**\r\n * Issue a non-instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n */\r\n draw() {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.draw(this._primitiveType, this._indexStart, this.indexCount);\r\n }\r\n }\r\n /**\r\n * Issue an instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n *\r\n * @param numInstances - Number of instances to draw.\r\n */\r\n drawInstanced(numInstances: number): void {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.drawInstanced(this._primitiveType, this._indexStart, this.indexCount, numInstances);\r\n }\r\n }\r\n /**\r\n * Dispose this primitive and release associated GPU resources.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._vertexLayout?.dispose();\r\n this._vertexLayout = null;\r\n if (this._vertexLayoutOptions) {\r\n releaseObject(this._vertexLayoutOptions.indexBuffer);\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n releaseObject(info.buffer);\r\n }\r\n this._vertexLayoutOptions = null;\r\n }\r\n }\r\n /*\r\n createAABBTree(): AABBTree {\r\n const indices = this.getIndexBuffer() ? this.getIndexBuffer().getData() : null;\r\n const vertices = (this.getVertexBuffer(VERTEX_ATTRIB_POSITION)?.getData() as Float32Array) || null;\r\n const aabbtree = new AABBTree();\r\n aabbtree.buildFromPrimitives(vertices, indices, this._primitiveType);\r\n return aabbtree;\r\n }\r\n */\r\n /**\r\n * Get the bounding volume associated with this primitive.\r\n *\r\n * @returns The current bounding volume, or `null` if not set.\r\n */\r\n getBoundingVolume(): BoundingVolume {\r\n return this._bbox;\r\n }\r\n /**\r\n * Set or replace the bounding volume of this primitive.\r\n *\r\n * Triggers registered bounding-volume change callbacks.\r\n *\r\n * @param bv - The bounding volume to set.\r\n * @returns void\r\n */\r\n setBoundingVolume(bv: BoundingVolume): void {\r\n if (bv !== this._bbox) {\r\n this._bbox = bv;\r\n this.dispatchEvent('bv_changed');\r\n }\r\n }\r\n /**\r\n * Test intersection against the current axis-aligned bounding box (AABB).\r\n *\r\n * @param ray - Ray to test against the primitive's AABB (derived from its bounding volume).\r\n * @returns The distance from ray origin to the intersection, or `null` if no hit or no AABB.\r\n */\r\n raycast(ray: Ray): number {\r\n const aabb = this.getBoundingVolume()?.toAABB();\r\n return aabb ? ray.bboxIntersectionTestEx(aabb) : null;\r\n }\r\n /** @internal */\r\n private checkVertexLayout() {\r\n if (this._vertexLayoutDirty) {\r\n this._vertexLayout?.dispose();\r\n const device = getDevice();\r\n this._vertexLayout = device.createVertexLayout(this._vertexLayoutOptions);\r\n this._vertexLayoutDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private calcDefaultIndexCount(): number {\r\n const indexBuffer = this.getIndexBuffer();\r\n if (indexBuffer) {\r\n return Math.max(0, indexBuffer.length - this._indexStart);\r\n }\r\n const info = this.getVertexBufferInfo('position');\r\n if (info) {\r\n return Math.max(\r\n 0,\r\n Math.floor((info.buffer.byteLength - info.drawOffset) / info.stride) - this._indexStart\r\n );\r\n }\r\n return 0;\r\n }\r\n}\r\n"],"names":["Primitive","makeObservable","Disposable","_nextId","_vertexLayout","_vertexLayoutOptions","vertexBuffers","_primitiveType","_indexStart","_indexCount","_defaultIndexCount","_vertexLayoutDirty","_id","_changeTag","_bbox","id","changeTag","clone","other","copyFrom","info","setVertexBuffer","buffer","stepMode","setIndexBuffer","indexBuffer","primitiveType","indexStart","indexCount","type","RenderBundleWrapper","primitiveChanged","val","calcDefaultIndexCount","getNumVertices","posInfo","getVertexBufferInfo","byteLength","stride","getNumFaces","ib","getIndexBuffer","count","indexType","PBPrimitiveType","U16","removeVertexBuffer","semantic","i","length","matchVertexBuffer","releaseObject","splice","getVertexBuffer","checkVertexLayout","createAndSetVertexBuffer","format","data","device","getDevice","Array","isArray","createInterleavedVertexBuffer","createVertexBuffer","retainObject","push","createAndSetIndexBuffer","dynamic","createIndexBuffer","managed","draw","drawInstanced","numInstances","onDispose","dispose","getBoundingVolume","setBoundingVolume","bv","dispatchEvent","raycast","ray","aabb","toAABB","bboxIntersectionTestEx","createVertexLayout","Math","max","floor","drawOffset"],"mappings":"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"}
1
+ {"version":3,"file":"primitive.js","sources":["../../src/render/primitive.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport {\r\n Disposable,\r\n makeObservable,\r\n releaseObject,\r\n retainObject,\r\n type Clonable,\r\n type Ray,\r\n type TypedArray\r\n} from '@zephyr3d/base';\r\nimport {\r\n type VertexStepMode,\r\n type VertexLayout,\r\n type VertexLayoutOptions,\r\n type PrimitiveType,\r\n type StructuredBuffer,\r\n type IndexBuffer,\r\n type VertexSemantic,\r\n type VertexAttribFormat,\r\n PBPrimitiveType,\r\n matchVertexBuffer\r\n} from '@zephyr3d/device';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Holds vertex/index data and draw parameters for a mesh geometry.\r\n *\r\n * Responsibilities:\r\n * - Owns one or more vertex buffers and an optional index buffer.\r\n * - Defines primitive topology, draw range (start/count), and vertex layout.\r\n * - Provides utilities to create/set/remove buffers and query vertex/face counts.\r\n * - Tracks changes via a change tag and notifies render-bundle caching.\r\n * - Optionally stores a bounding volume and supports ray intersection tests.\r\n *\r\n * Ownership and lifecycle:\r\n * - When adding buffers (`setVertexBuffer`, `setIndexBuffer`), the primitive retains them.\r\n * - When removing/overwriting buffers, the primitive releases the previous buffers.\r\n * - Disposing the primitive also disposes the internal `VertexLayout` and releases retained buffers.\r\n *\r\n * @public\r\n */\r\nexport class Primitive\r\n extends makeObservable(Disposable)<{\r\n bv_changed: [];\r\n }>()\r\n implements Clonable<Primitive>\r\n{\r\n /** @internal Current vertex layout object (created lazily from options). */\r\n protected _vertexLayout: Nullable<VertexLayout>;\r\n /** @internal Mutable options used to build the vertex layout. */\r\n protected _vertexLayoutOptions: VertexLayoutOptions;\r\n /** @internal Primitive topology (e.g., 'triangle-list', 'line-strip'). */\r\n protected _primitiveType: PrimitiveType;\r\n /** @internal First index/vertex to draw. */\r\n protected _indexStart: number;\r\n /** @internal Number of indices/vertices to draw (computed lazily if null). */\r\n protected _indexCount: Nullable<number>;\r\n /** @internal Cached default index count (derived when needed). */\r\n protected _defaultIndexCount: number;\r\n /** @internal Marks layout dirty when buffers/topology change. */\r\n protected _vertexLayoutDirty: boolean;\r\n /** @internal Monotonic runtime id. */\r\n private static _nextId = 0;\r\n /** @internal Unique runtime id for the instance. */\r\n protected _id: number;\r\n /** @internal Optional bounding volume for culling/raycast. */\r\n protected _bbox: Nullable<BoundingVolume>;\r\n /** @internal Change tag increments when draw-affecting state changes. */\r\n private _changeTag: number;\r\n /**\r\n * Create an empty primitive.\r\n *\r\n * Defaults:\r\n * - Primitive type: 'triangle-list'\r\n * - `indexStart = 0`, `indexCount = null` (auto-computed)\r\n * - No vertex/index buffers attached\r\n * - No bounding volume\r\n */\r\n constructor() {\r\n super();\r\n this._vertexLayout = null;\r\n this._vertexLayoutOptions = { vertexBuffers: [] };\r\n this._primitiveType = 'triangle-list';\r\n this._indexStart = 0;\r\n this._indexCount = null;\r\n this._defaultIndexCount = 0;\r\n this._vertexLayoutDirty = false;\r\n this._id = ++Primitive._nextId;\r\n this._changeTag = 0;\r\n this._bbox = null;\r\n }\r\n /**\r\n * Unique runtime identifier of this primitive.\r\n *\r\n * @returns The numeric instance id.\r\n * @internal\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Change tag that increments whenever draw-affecting state changes.\r\n * Useful for invalidating cached render bundles.\r\n *\r\n * @returns The current change tag value.\r\n */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /**\r\n * Create a shallow clone: copies topology, draw range, and buffers.\r\n *\r\n * Note: Buffers are re-retained on the new primitive.\r\n *\r\n * @returns A cloned Primitive instance.\r\n */\r\n clone() {\r\n const other = new Primitive();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy from another primitive.\r\n *\r\n * Copies:\r\n * - All vertex buffers and the index buffer\r\n * - Primitive type, index start, index count\r\n *\r\n * @param other - The source primitive to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this) {\r\n for (const info of other._vertexLayoutOptions.vertexBuffers) {\r\n this.setVertexBuffer(info.buffer, info.stepMode);\r\n }\r\n this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer ?? null);\r\n this.primitiveType = other.primitiveType;\r\n this.indexStart = other.indexStart;\r\n this.indexCount = other.indexCount;\r\n }\r\n /**\r\n * Primitive topology.\r\n */\r\n get primitiveType() {\r\n return this._primitiveType;\r\n }\r\n set primitiveType(type) {\r\n if (type !== this._primitiveType) {\r\n this._primitiveType = type;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Starting index/vertex for drawing.\r\n */\r\n get indexStart() {\r\n return this._indexStart;\r\n }\r\n set indexStart(val) {\r\n if (val !== this._indexStart) {\r\n this._indexStart = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Number of indices/vertices to draw.\r\n */\r\n get indexCount() {\r\n this._indexCount = this._indexCount ?? this.calcDefaultIndexCount();\r\n return this._indexCount;\r\n }\r\n set indexCount(val) {\r\n if (val !== this._indexCount) {\r\n this._indexCount = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Query total vertex count from the position buffer, if present.\r\n *\r\n * @returns Total vertex count; 0 if no position buffer is set.\r\n */\r\n getNumVertices() {\r\n const posInfo = this.getVertexBufferInfo('position');\r\n return posInfo?.buffer ? (posInfo.buffer.byteLength / posInfo.stride) >> 0 : 0;\r\n }\r\n /**\r\n * Query total face/segment count based on topology and buffer size.\r\n *\r\n * - For indexed geometry: derived from index buffer.\r\n * - For non-indexed: derived from position vertex count.\r\n *\r\n * @returns Total primitive count for the current topology.\r\n */\r\n getNumFaces() {\r\n const ib = this.getIndexBuffer();\r\n const count = ib\r\n ? ib.byteLength >> (ib.indexType.primitiveType === PBPrimitiveType.U16 ? 1 : 2)\r\n : this.getNumVertices();\r\n switch (this.primitiveType) {\r\n case 'line-list':\r\n return count >> 1;\r\n case 'point-list':\r\n return count;\r\n case 'line-strip':\r\n return count - 1;\r\n case 'triangle-fan':\r\n return count - 2;\r\n case 'triangle-strip':\r\n return count - 2;\r\n case 'triangle-list':\r\n return (count / 3) >> 0;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /**\r\n * Remove all vertex buffers that match a given semantic.\r\n *\r\n * This releases retained buffers, marks the layout dirty, and invalidates bundles.\r\n *\r\n * @param semantic - The vertex semantic to remove (e.g., 'position', 'normal').\r\n * @returns void\r\n */\r\n removeVertexBuffer(semantic: VertexSemantic) {\r\n for (let i = this._vertexLayoutOptions.vertexBuffers.length - 1; i >= 0; i--) {\r\n const info = this._vertexLayoutOptions.vertexBuffers[i];\r\n if (matchVertexBuffer(info.buffer, semantic)) {\r\n releaseObject(info.buffer);\r\n this._vertexLayoutOptions.vertexBuffers.splice(i, 1);\r\n this._vertexLayoutDirty = true;\r\n }\r\n }\r\n if (this._vertexLayoutDirty) {\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the vertex buffer that matches a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The matching vertex buffer, or `null` if not found.\r\n */\r\n getVertexBuffer(semantic: VertexSemantic) {\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n if (info.buffer && matchVertexBuffer(info.buffer, semantic)) {\r\n return info.buffer;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get vertex buffer information for a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The `VertexBufferInfo`, or `null` if not found.\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic) {\r\n this.checkVertexLayout();\r\n return this._vertexLayout?.getVertexBufferInfo(semantic) ?? null;\r\n }\r\n /**\r\n * Create a vertex buffer from data and add it to the primitive.\r\n *\r\n * - For interleaved layouts, pass an array of `VertexAttribFormat`.\r\n * - For a single attribute, pass a single `VertexAttribFormat`.\r\n *\r\n * @param format - Vertex attribute format(s).\r\n * @param data - Typed array with vertex data.\r\n * @param stepMode - Optional step mode (e.g., 'vertex', 'instance').\r\n * @returns The created `StructuredBuffer`.\r\n */\r\n createAndSetVertexBuffer(\r\n format: VertexAttribFormat[] | VertexAttribFormat,\r\n data: TypedArray,\r\n stepMode?: VertexStepMode\r\n ) {\r\n const device = getDevice();\r\n const buffer = Array.isArray(format)\r\n ? device.createInterleavedVertexBuffer(format, data)!\r\n : device.createVertexBuffer(format, data)!;\r\n return this.setVertexBuffer(buffer, stepMode);\r\n }\r\n /**\r\n * Add an existing vertex buffer to the primitive.\r\n *\r\n * Ownership note: The primitive retains the buffer; it will be released or disposed when replaced or on dispose.\r\n *\r\n * @param buffer - The vertex buffer to add.\r\n * @param stepMode - Optional step mode for the buffer.\r\n * @returns The same buffer.\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode) {\r\n retainObject(buffer);\r\n this._vertexLayoutOptions.vertexBuffers.push({\r\n buffer,\r\n stepMode\r\n });\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n return buffer;\r\n }\r\n /**\r\n * Create an index buffer from data and set it on the primitive.\r\n *\r\n * @param data - Index data as Uint16Array or Uint32Array.\r\n * @param dynamic - Whether the index buffer is dynamic (unmanaged).\r\n * @returns The created `IndexBuffer`.\r\n */\r\n createAndSetIndexBuffer(data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>, dynamic?: boolean) {\r\n const device = getDevice();\r\n const buffer = device.createIndexBuffer(data, {\r\n dynamic: !!dynamic,\r\n managed: !dynamic\r\n });\r\n this.setIndexBuffer(buffer);\r\n return buffer;\r\n }\r\n /**\r\n * Set or replace the index buffer.\r\n *\r\n * Ownership note: The primitive retains the buffer; previous buffer is released.\r\n * Marks the vertex layout dirty and invalidates bundles.\r\n *\r\n * @param buffer - The index buffer to set (non-null).\r\n * @returns void\r\n */\r\n setIndexBuffer(buffer: Nullable<IndexBuffer>) {\r\n if (this._vertexLayoutOptions.indexBuffer !== buffer) {\r\n retainObject(buffer);\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n this._vertexLayoutOptions.indexBuffer = buffer;\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the current index buffer.\r\n *\r\n * @returns The index buffer, or `undefined`/`null` if none set.\r\n */\r\n getIndexBuffer() {\r\n return this._vertexLayoutOptions.indexBuffer ?? null;\r\n }\r\n /**\r\n * Issue a non-instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n */\r\n draw() {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.draw(this._primitiveType, this._indexStart, this.indexCount);\r\n }\r\n }\r\n /**\r\n * Issue an instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n *\r\n * @param numInstances - Number of instances to draw.\r\n */\r\n drawInstanced(numInstances: number) {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.drawInstanced(this._primitiveType, this._indexStart, this.indexCount, numInstances);\r\n }\r\n }\r\n /**\r\n * Dispose this primitive and release associated GPU resources.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._vertexLayout?.dispose();\r\n this._vertexLayout = null;\r\n if (this._vertexLayoutOptions) {\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n releaseObject(info.buffer);\r\n }\r\n }\r\n }\r\n /*\r\n createAABBTree(): AABBTree {\r\n const indices = this.getIndexBuffer() ? this.getIndexBuffer().getData() : null;\r\n const vertices = (this.getVertexBuffer(VERTEX_ATTRIB_POSITION)?.getData() as Float32Array) || null;\r\n const aabbtree = new AABBTree();\r\n aabbtree.buildFromPrimitives(vertices, indices, this._primitiveType);\r\n return aabbtree;\r\n }\r\n */\r\n /**\r\n * Get the bounding volume associated with this primitive.\r\n *\r\n * @returns The current bounding volume, or `null` if not set.\r\n */\r\n getBoundingVolume() {\r\n return this._bbox;\r\n }\r\n /**\r\n * Set or replace the bounding volume of this primitive.\r\n *\r\n * Triggers registered bounding-volume change callbacks.\r\n *\r\n * @param bv - The bounding volume to set.\r\n * @returns void\r\n */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n if (bv !== this._bbox) {\r\n this._bbox = bv;\r\n this.dispatchEvent('bv_changed');\r\n }\r\n }\r\n /**\r\n * Test intersection against the current axis-aligned bounding box (AABB).\r\n *\r\n * @param ray - Ray to test against the primitive's AABB (derived from its bounding volume).\r\n * @returns The distance from ray origin to the intersection, or `null` if no hit or no AABB.\r\n */\r\n raycast(ray: Ray) {\r\n const aabb = this.getBoundingVolume()?.toAABB();\r\n return aabb ? ray.bboxIntersectionTestEx(aabb) : null;\r\n }\r\n /** @internal */\r\n private checkVertexLayout() {\r\n if (this._vertexLayoutDirty) {\r\n this._vertexLayout?.dispose();\r\n const device = getDevice();\r\n this._vertexLayout = device.createVertexLayout(this._vertexLayoutOptions);\r\n this._vertexLayoutDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private calcDefaultIndexCount() {\r\n const indexBuffer = this.getIndexBuffer();\r\n if (indexBuffer) {\r\n return Math.max(0, indexBuffer.length - this._indexStart);\r\n }\r\n const info = this.getVertexBufferInfo('position');\r\n if (info) {\r\n return Math.max(\r\n 0,\r\n Math.floor((info.buffer.byteLength - info.drawOffset) / info.stride) - this._indexStart\r\n );\r\n }\r\n return 0;\r\n }\r\n}\r\n"],"names":["Primitive","makeObservable","Disposable","_nextId","_vertexLayout","_vertexLayoutOptions","vertexBuffers","_primitiveType","_indexStart","_indexCount","_defaultIndexCount","_vertexLayoutDirty","_id","_changeTag","_bbox","id","changeTag","clone","other","copyFrom","info","setVertexBuffer","buffer","stepMode","setIndexBuffer","indexBuffer","primitiveType","indexStart","indexCount","type","RenderBundleWrapper","primitiveChanged","val","calcDefaultIndexCount","getNumVertices","posInfo","getVertexBufferInfo","byteLength","stride","getNumFaces","ib","getIndexBuffer","count","indexType","PBPrimitiveType","U16","removeVertexBuffer","semantic","i","length","matchVertexBuffer","releaseObject","splice","getVertexBuffer","checkVertexLayout","createAndSetVertexBuffer","format","data","device","getDevice","Array","isArray","createInterleavedVertexBuffer","createVertexBuffer","retainObject","push","createAndSetIndexBuffer","dynamic","createIndexBuffer","managed","draw","drawInstanced","numInstances","onDispose","dispose","getBoundingVolume","setBoundingVolume","bv","dispatchEvent","raycast","ray","aabb","toAABB","bboxIntersectionTestEx","createVertexLayout","Math","max","floor","drawOffset"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Disposable, Vector3 } from '@zephyr3d/base';
1
+ import { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';
2
2
  import { QUEUE_TRANSPARENT } from '../values.js';
3
3
  import { ProgramBuilder } from '@zephyr3d/device';
4
4
  import { ShaderHelper } from '../material/shader/helper.js';
@@ -10,14 +10,19 @@ import { RenderBundleWrapper } from './renderbundle_wrapper.js';
10
10
  import { getDevice } from '../app/api.js';
11
11
  import '../material/meshmaterial.js';
12
12
  import '../material/grassmaterial.js';
13
- import '../material/terrainmaterial.js';
14
13
  import '../material/terrain-cm.js';
15
14
  import '../material/pbrmr.js';
16
15
  import '../material/pbrsg.js';
17
16
  import '../material/pbrblueprint.js';
17
+ import '../material/sprite.js';
18
+ import '../material/sprite_std.js';
19
+ import '../utility/blueprint/material/texture.js';
18
20
 
19
21
  const maxBufferSizeInFloats = 65536 / 4;
20
- /** @internal */ class InstanceBindGroupAllocator {
22
+ /**
23
+ * Instance bind group allocator
24
+ * @public
25
+ */ class InstanceBindGroupAllocator {
21
26
  static _instanceBindGroupLayout = null;
22
27
  _bindGroupList = [];
23
28
  _allocFrameStamp;
@@ -269,9 +274,9 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
269
274
  */ reset() {
270
275
  if (this._itemList) {
271
276
  // Release all render bundles
272
- for(const k in this._itemList){
277
+ for (const k of objectKeys(this._itemList)){
273
278
  const itemListBundle = this._itemList[k];
274
- for(const l in itemListBundle){
279
+ for (const l of objectKeys(itemListBundle)){
275
280
  const listInfo = itemListBundle[l];
276
281
  for (const info of listInfo){
277
282
  if (info.renderQueue === this) {
@@ -1 +1 @@
1
- {"version":3,"file":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/** @internal */\r\nexport class InstanceBindGroupAllocator {\r\n private static _instanceBindGroupLayout: BindGroupLayout = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number): CachedBindGroup {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @internal\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: InstanceData;\r\n}\r\n\r\n/** @internal */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/** @internal */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @internal\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @internal\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @internal\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: RenderItemList;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: DirectionalLight;\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private readonly _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n */\r\n constructor(renderPass: RenderPass, bindGroupAllocator?: InstanceBindGroupAllocator) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._ref = { ref: this };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n }\r\n /** The sun light */\r\n get sunLight(): DirectionalLight {\r\n return this._sunLight;\r\n }\r\n set sunLight(light: DirectionalLight) {\r\n this._sunLight = light;\r\n }\r\n /** @internal */\r\n needSceneColor(): boolean {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth(): boolean {\r\n return this._needSceneDepth;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth(): boolean {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent(): boolean {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass(): RenderPass {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref(): RenderQueueRef {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight() && light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n */\r\n push(camera: Camera, drawable: Drawable): void {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const trans = drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial().objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n if (drawable.isBatchable()) {\r\n const instanceList = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0].instanceList\r\n : this._itemList.transmission_trans.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.transparent.unlit[0].instanceList\r\n : this._itemList.transparent.lit[0].instanceList\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0].instanceList\r\n : this._itemList.transmission.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.opaque.unlit[0].instanceList\r\n : this._itemList.opaque.lit[0].instanceList;\r\n const hash = drawable.getInstanceId(this._renderPass);\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null\r\n });\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n list.materialList.add(mat.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n for (const m of this._objectColorMaps) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k in this._itemList) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l in itemListBundle) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /** @internal */\r\n end(camera: Camera, createRenderBundles?: boolean): this {\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: CachedBindGroup = null;\r\n let item: RenderQueueItem = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n }\r\n };\r\n this.binaryInsert(info.instanceItemList, item);\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item.instanceData.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial().instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial().instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().position;\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo(): RenderItemListInfo {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n renderQueue: this\r\n };\r\n }\r\n private newRenderItemListBundle(): RenderItemListBundle {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList(): RenderItemList {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","defaultInstanceBindGroupAlloator","RenderQueue","Disposable","_needSceneDepth","_needSceneColorWithDepth","renderPass","bindGroupAllocator","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_ref","ref","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","sunLight","light","needSceneColor","needSceneDepth","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","unshadowedLights","getInstanceInfo","drawable","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","isDirectionLight","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","pushRenderQueueRef","trans","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","getMaterial","objectColor","getObjectColor","set","getDrawableId","isBatchable","instanceList","hash","getInstanceId","drawableList","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","mat","materialList","add","coreMaterial","applyTransformUniforms","getDrawableByColor","c","id","m","reset","itemListBundle","l","listInfo","info","renderQueue","renderBundle","dispose","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","end","createRenderBundles","frameCounter","frameInfo","lists","i","length","x","drawables","item","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","RenderBundleWrapper","left","right","newInstanceId","instanceId","mid","Math","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","onDispose","drawablePos","getNode","position","Vector3","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
1
+ {"version":3,"file":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @public */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/**\r\n * Instance bind group allocator\r\n * @public\r\n */\r\nexport class InstanceBindGroupAllocator {\r\n private static _instanceBindGroupLayout: Nullable<BindGroupLayout> = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number) {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @public\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: Nullable<InstanceData>;\r\n}\r\n\r\n/**\r\n * Render item list information\r\n * @public\r\n */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/**\r\n * Render item list bundle\r\n * @public\r\n */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @public\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @public\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @public\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: Nullable<RenderItemList>;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private readonly _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n */\r\n constructor(renderPass: RenderPass, bindGroupAllocator?: InstanceBindGroupAllocator) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._ref = { ref: this };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n }\r\n /** The sun light */\r\n get sunLight() {\r\n return this._sunLight;\r\n }\r\n set sunLight(light) {\r\n this._sunLight = light;\r\n }\r\n /** @internal */\r\n needSceneColor() {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth() {\r\n return this._needSceneDepth;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth() {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent() {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref() {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight() && light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n */\r\n push(camera: Camera, drawable: Drawable) {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const trans = drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial()!.objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n if (drawable.isBatchable()) {\r\n const instanceList = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0].instanceList\r\n : this._itemList.transmission_trans.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.transparent.unlit[0].instanceList\r\n : this._itemList.transparent.lit[0].instanceList\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0].instanceList\r\n : this._itemList.transmission.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.opaque.unlit[0].instanceList\r\n : this._itemList.opaque.lit[0].instanceList;\r\n const hash = drawable.getInstanceId(this._renderPass);\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null\r\n });\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n list.materialList.add(mat.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n for (const m of this._objectColorMaps) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k of objectKeys(this._itemList)) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l of objectKeys(itemListBundle)) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /** @internal */\r\n end(camera: Camera, createRenderBundles?: boolean) {\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList!;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: Nullable<CachedBindGroup> = null;\r\n let item: Nullable<RenderQueueItem> = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n }\r\n };\r\n this.binaryInsert(info.instanceItemList, item);\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item!.instanceData!.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial()!.instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial()!.instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().position;\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo() {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n renderQueue: this\r\n } as RenderItemListInfo;\r\n }\r\n private newRenderItemListBundle() {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList() {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","defaultInstanceBindGroupAlloator","RenderQueue","Disposable","_needSceneDepth","_needSceneColorWithDepth","renderPass","bindGroupAllocator","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_ref","ref","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","sunLight","light","needSceneColor","needSceneDepth","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","unshadowedLights","getInstanceInfo","drawable","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","isDirectionLight","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","pushRenderQueueRef","trans","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","getMaterial","objectColor","getObjectColor","set","getDrawableId","isBatchable","instanceList","hash","getInstanceId","drawableList","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","mat","materialList","add","coreMaterial","applyTransformUniforms","getDrawableByColor","c","id","m","reset","objectKeys","itemListBundle","l","listInfo","info","renderQueue","renderBundle","dispose","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","end","createRenderBundles","frameCounter","frameInfo","lists","i","length","x","drawables","item","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","RenderBundleWrapper","left","right","newInstanceId","instanceId","mid","Math","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","onDispose","drawablePos","getNode","position","Vector3","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
@@ -68,10 +68,10 @@ import '../shapes/tetrahedron.js';
68
68
  scene.frameUpdatePerCamera(camera);
69
69
  if (camera && !device.isContextLost()) {
70
70
  const defaultViewport = !camera.viewport && !camera.scissor;
71
- const renderX = camera.viewport ? device.screenToDevice(camera.viewport[0]) : 0;
72
- const renderY = camera.viewport ? device.screenToDevice(camera.viewport[1]) : 0;
73
- const renderWidth = camera.viewport ? device.screenToDevice(camera.viewport[2]) : device.getDrawingBufferWidth();
74
- const renderHeight = camera.viewport ? device.screenToDevice(camera.viewport[3]) : device.getDrawingBufferHeight();
71
+ const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;
72
+ const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;
73
+ const renderWidth = camera.viewport ? device.screenXToDevice(camera.viewport[2]) : device.getDrawingBufferWidth();
74
+ const renderHeight = camera.viewport ? device.screenYToDevice(camera.viewport[3]) : device.getDrawingBufferHeight();
75
75
  if (renderWidth <= 0 || renderHeight <= 0) {
76
76
  camera.getPickResultResolveFunc()?.(null);
77
77
  return;
@@ -89,8 +89,6 @@ import '../shapes/tetrahedron.js';
89
89
  scene,
90
90
  renderWidth,
91
91
  renderHeight,
92
- primaryCamera: camera,
93
- picking: false,
94
92
  oit: null,
95
93
  motionVectors: device.type !== 'webgl' && (camera.TAA || camera.motionBlur),
96
94
  HiZ: camera.HiZ && device.type !== 'webgl',
@@ -98,19 +96,16 @@ import '../shapes/tetrahedron.js';
98
96
  globalBindGroupAllocator,
99
97
  camera,
100
98
  compositor: camera.compositor,
101
- timestamp: device.frameInfo.frameTimestamp,
102
99
  queue: 0,
103
100
  lightBlending: false,
104
101
  renderPass: null,
105
102
  renderPassHash: null,
106
- fogFlags: 0,
107
103
  flip: false,
108
104
  depthFormat,
109
105
  colorFormat,
110
106
  drawEnvLight: false,
111
107
  env: null,
112
108
  materialFlags: 0,
113
- TAA: camera.TAA,
114
109
  SSR,
115
110
  SSRCalcThickness: SSR && camera.ssrCalcThickness,
116
111
  SSRRoughnessTexture: device.pool.fetchTemporalTexture2D(true, 'rgba8unorm', renderWidth, renderHeight),
@@ -131,9 +126,9 @@ import '../shapes/tetrahedron.js';
131
126
  renderHeight
132
127
  ];
133
128
  } else {
134
- blitter.viewport = camera.viewport;
129
+ blitter.viewport = camera.viewport ? camera.viewport.slice() : null;
135
130
  }
136
- blitter.scissor = camera.scissor;
131
+ blitter.scissor = camera.scissor ? camera.scissor.slice() : null;
137
132
  blitter.srgbOut = !originFramebuffer;
138
133
  blitter.blit(tmpFramebuffer.getColorAttachments()[0], originFramebuffer ?? null, fetchSampler('clamp_nearest_nomip'));
139
134
  device.pool.releaseFrameBuffer(tmpFramebuffer);
@@ -180,13 +175,13 @@ import '../shapes/tetrahedron.js';
180
175
  ctx.forceCullMode = 'front';
181
176
  this._depthPass.renderBackface = true;
182
177
  this._depthPass.transmission = false;
183
- this._depthPass.render(ctx, null, renderQueue);
178
+ this._depthPass.render(ctx, null, null, renderQueue);
184
179
  this._depthPass.clearColor = null;
185
180
  this._depthPass.renderBackface = false;
186
181
  ctx.forceColorState = this._frontDepthColorState;
187
182
  ctx.forceCullMode = null;
188
183
  }
189
- this._depthPass.render(ctx, null, renderQueue);
184
+ this._depthPass.render(ctx, null, null, renderQueue);
190
185
  ctx.forceColorState = null;
191
186
  ctx.device.popDeviceStates();
192
187
  if (!transmission) {
@@ -259,7 +254,7 @@ import '../shapes/tetrahedron.js';
259
254
  device.pushDeviceStates();
260
255
  device.setFramebuffer(sceneColorFramebuffer);
261
256
  this._scenePass.transmission = false;
262
- this._scenePass.render(ctx, null, renderQueue);
257
+ this._scenePass.render(ctx, null, null, renderQueue);
263
258
  device.popDeviceStates();
264
259
  ctx.sceneColorTexture = sceneColorFramebuffer.getColorAttachments()[0];
265
260
  new CopyBlitter().blit(ctx.sceneColorTexture, device.getFramebuffer() ?? null, fetchSampler('clamp_nearest_nomip'));
@@ -269,7 +264,7 @@ import '../shapes/tetrahedron.js';
269
264
  this._scenePass.clearStencil = null;
270
265
  ctx.compositor = compositor;
271
266
  }
272
- this._scenePass.render(ctx, null, renderQueue);
267
+ this._scenePass.render(ctx, null, null, renderQueue);
273
268
  if (renderQueue.needSceneColor()) {
274
269
  this.renderSceneDepth(ctx, renderQueue, depthFramebuffer);
275
270
  }
@@ -390,7 +385,8 @@ import '../shapes/tetrahedron.js';
390
385
  const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;
391
386
  const windowW = 1 / vp.width;
392
387
  const windowH = 1 / vp.height;
393
- camera.worldMatrix.decompose(this._pickCamera.scale, this._pickCamera.rotation, this._pickCamera.position);
388
+ const pickCamera = this._pickCamera;
389
+ camera.worldMatrix.decompose(pickCamera.scale, pickCamera.rotation, pickCamera.position);
394
390
  let left = camera.getProjectionMatrix().getLeftPlane();
395
391
  let right = camera.getProjectionMatrix().getRightPlane();
396
392
  let bottom = camera.getProjectionMatrix().getBottomPlane();
@@ -403,17 +399,15 @@ import '../shapes/tetrahedron.js';
403
399
  bottom += height * windowY;
404
400
  right = left + width * windowW;
405
401
  top = bottom + height * windowH;
406
- this._pickCamera.setProjectionMatrix(camera.isPerspective() ? Matrix4x4.frustum(left, right, bottom, top, near, far) : Matrix4x4.ortho(left, right, bottom, top, near, far));
407
- const cameraPos = isWebGL1 ? new Vector3(this._pickCamera.position) : null;
402
+ pickCamera.setProjectionMatrix(camera.isPerspective() ? Matrix4x4.frustum(left, right, bottom, top, near, far) : Matrix4x4.ortho(left, right, bottom, top, near, far));
403
+ const cameraPos = isWebGL1 ? new Vector3(pickCamera.position) : null;
408
404
  const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;
409
405
  ctx.device.setFramebuffer(fb);
410
406
  this._objectColorPass.clearColor = Vector4.zero();
411
407
  this._objectColorPass.clearDepth = 1;
412
- const rq = this._objectColorPass.cullScene(ctx, this._pickCamera);
413
- ctx.camera = this._pickCamera;
414
- this._objectColorPass.render(ctx, null, rq);
408
+ const rq = this._objectColorPass.cullScene(ctx, pickCamera);
409
+ this._objectColorPass.render(ctx, pickCamera, null, rq);
415
410
  rq.dispose();
416
- ctx.camera = camera;
417
411
  ctx.device.popDeviceStates();
418
412
  const colorTex = fb.getColorAttachments()[0];
419
413
  const distanceTex = fb.getColorAttachments()[1];