@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":"texture.js","sources":["../../../src/material/mixins/texture.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n PBFunctionScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D,\r\n TextureSampler\r\n} from '@zephyr3d/device';\r\nimport type { MeshMaterial, applyMaterialMixins } from '../meshmaterial';\r\nimport type { Matrix4x4 } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\n\r\n/**\r\n * ToMixedTextureType\r\n *\r\n * @public\r\n */\r\nexport type ToMixedTextureType<T> = T extends [infer First, ...infer Rest]\r\n ? [First extends string ? ReturnType<typeof mixinTextureProps<First>> : never, ...ToMixedTextureType<Rest>]\r\n : [];\r\n\r\n/**\r\n * TextureMixinTypes\r\n *\r\n * @public\r\n */\r\nexport type TextureMixinTypes<T> = ReturnType<\r\n typeof applyMaterialMixins<ToMixedTextureType<T>, typeof MeshMaterial>\r\n>;\r\n\r\n/**\r\n * TextureMixinInstanceTypes\r\n *\r\n * @public\r\n */\r\nexport type TextureMixinInstanceTypes<T> =\r\n TextureMixinTypes<T> extends { new (...args: any[]): infer U } ? U : never;\r\n\r\n/**\r\n * TextureProp\r\n *\r\n * @public\r\n */\r\nexport type TextureProp<U extends string> = {\r\n [P in 'Texture' | 'TextureSampler' | 'TexCoordIndex' | 'TexCoordMatrix' as `${U}${P}`]: P extends 'Texture'\r\n ? Texture2D\r\n : P extends 'TextureSampler'\r\n ? TextureSampler\r\n : P extends 'TexCoordIndex'\r\n ? number\r\n : P extends 'TexCoordMatrix'\r\n ? Matrix4x4\r\n : never;\r\n};\r\n\r\n/**\r\n * TexturePropUniforms\r\n *\r\n * @public\r\n */\r\nexport type TexturePropUniforms<U extends string> = {\r\n [P in 'TextureUniform' | 'TexCoord' as `get${Capitalize<U>}${P}`]: (\r\n scope: PBInsideFunctionScope\r\n ) => PBShaderExp;\r\n} & {\r\n [P in 'Texture' as `sample${Capitalize<U>}${P}`]: (\r\n scope: PBInsideFunctionScope,\r\n texCoord?: PBShaderExp\r\n ) => PBShaderExp;\r\n};\r\n\r\n/**\r\n * Texture property mixin\r\n * @param name - Texture name\r\n * @returns Texture mixin\r\n *\r\n * @public\r\n */\r\nexport function mixinTextureProps<U extends string>(name: U) {\r\n return function <T extends typeof MeshMaterial>(BaseCls: T, vertex = false) {\r\n const capName = `${name[0].toUpperCase()}${name.slice(1)}`;\r\n const id = `mixinTexture${capName}`;\r\n let feature = 0;\r\n let featureTexIndex = 0;\r\n let featureTexMatrix = 0;\r\n if ((BaseCls as any)[id]) {\r\n return BaseCls as unknown as T & {\r\n new (...args: any[]): TextureProp<U> & TexturePropUniforms<U>;\r\n };\r\n }\r\n const cls = class extends (BaseCls as typeof MeshMaterial) {\r\n constructor() {\r\n super();\r\n const texture = new DRef<Texture2D>();\r\n let sampler: TextureSampler = null;\r\n let texCoord = 0;\r\n let matrix: Matrix4x4 = null;\r\n Object.defineProperty(this, `${name}Texture`, {\r\n get: function (): Texture2D {\r\n return texture.get();\r\n },\r\n set: function (newValue: Texture2D) {\r\n if (texture.get() !== newValue) {\r\n texture.set(newValue);\r\n this.useFeature(feature, !!newValue);\r\n if (newValue) {\r\n this.useFeature(featureTexIndex, texCoord);\r\n this.useFeature(featureTexMatrix, !!matrix);\r\n this.uniformChanged();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(this, `${name}TextureSampler`, {\r\n get: function (): TextureSampler {\r\n return sampler;\r\n },\r\n set: function (newValue: TextureSampler) {\r\n if (sampler !== newValue) {\r\n sampler = newValue;\r\n this.uniformChanged();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(this, `${name}TexCoordMatrix`, {\r\n get: function (): Matrix4x4 {\r\n return matrix;\r\n },\r\n set: function (newValue: Matrix4x4) {\r\n matrix = newValue;\r\n this.useFeature(featureTexMatrix, !!matrix);\r\n this.uniformChanged();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(this, `${name}TexCoordIndex`, {\r\n get: function (): number {\r\n return texCoord;\r\n },\r\n set: function (newValue: number) {\r\n if (texCoord !== newValue) {\r\n texCoord = newValue;\r\n this.useFeature(featureTexIndex, texCoord);\r\n this.uniformChanged();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n [`sample${capName}Texture`](scope: PBInsideFunctionScope, texCoord?: PBShaderExp): PBShaderExp {\r\n const tex = this[`get${capName}TextureUniform`](scope);\r\n const coord = texCoord ?? this[`get${capName}TexCoord`](scope);\r\n return scope.$builder.textureSample(tex, coord);\r\n }\r\n [`get${capName}TextureUniform`](scope: PBInsideFunctionScope): PBShaderExp {\r\n return scope.$builder.shaderKind === 'fragment' ? scope[`z${capName}Tex`] : null;\r\n }\r\n [`get${capName}TexCoord`](scope: PBInsideFunctionScope): PBShaderExp {\r\n const texCoord = (this as any)[`${name}TexCoordIndex`];\r\n if (texCoord < 0) {\r\n return null;\r\n }\r\n const pb = scope.$builder;\r\n if ((pb.shaderKind === 'vertex') !== !!vertex) {\r\n throw new Error(\r\n `mixinTextureProps.get${capName}TexCoord(): must be called in ${\r\n vertex ? 'vertex' : 'fragment'\r\n } stage`\r\n );\r\n }\r\n return scope.$builder.shaderKind === 'fragment'\r\n ? scope.$inputs[`z${capName}TexCoord`]\r\n : this.featureUsed(featureTexMatrix)\r\n ? pb.mul(scope[`z${capName}TextureMatrix`], pb.vec4(scope.$inputs[`texCoord${texCoord}`], 0, 1))\r\n .xy\r\n : scope.$inputs[`texCoord${texCoord}`];\r\n }\r\n copyFrom(other: any): void {\r\n super.copyFrom(other);\r\n const that = this as any;\r\n that[`${name}Texture`] = other[`${name}Texture`];\r\n that[`${name}TextureSampler`] = other[`${name}TextureSampler`];\r\n that[`${name}TexCoordMatrix`] = other[`${name}TexCoordMatrix`];\r\n that[`${name}TexCoordIndex`] = other[`${name}TexCoordIndex`];\r\n }\r\n vertexShader(scope: PBFunctionScope): void {\r\n super.vertexShader(scope);\r\n if (vertex || this.needFragmentColor()) {\r\n const pb = scope.$builder;\r\n const that = this as any;\r\n if (this.featureUsed(feature)) {\r\n const texCoordIndex: number = that[`${name}TexCoordIndex`];\r\n if (texCoordIndex >= 0) {\r\n const semantic = `texCoord${that[`${name}TexCoordIndex`]}` as any;\r\n if (!scope.$getVertexAttrib(semantic)) {\r\n scope.$inputs[semantic] = pb.vec2().attrib(semantic);\r\n }\r\n if (this.featureUsed(featureTexMatrix)) {\r\n scope[`z${capName}TextureMatrix`] = pb.mat4().uniform(2);\r\n if (!vertex) {\r\n scope.$outputs[`z${capName}TexCoord`] = pb.mul(\r\n scope[`z${capName}TextureMatrix`],\r\n pb.vec4(scope.$inputs[semantic], 0, 1)\r\n ).xy;\r\n }\r\n } else if (!vertex) {\r\n scope.$outputs[`z${capName}TexCoord`] = scope.$inputs[semantic];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n fragmentShader(scope: PBFunctionScope): void {\r\n super.fragmentShader(scope);\r\n if (this.needFragmentColor()) {\r\n const pb = scope.$builder;\r\n if (this.featureUsed(feature)) {\r\n scope[`z${capName}Tex`] = pb.tex2D().uniform(2);\r\n }\r\n }\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number): void {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (this.needFragmentColor(ctx)) {\r\n if (this.featureUsed(feature)) {\r\n const that = this as any;\r\n bindGroup.setTexture(`z${capName}Tex`, that[`${name}Texture`], that[`${name}TextureSampler`]);\r\n if (this.featureUsed(featureTexMatrix)) {\r\n bindGroup.setValue(`z${capName}TextureMatrix`, that[`${name}TexCoordMatrix`]);\r\n }\r\n }\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n (this as any)[`${name}Texture`] = null;\r\n }\r\n };\r\n feature = cls.defineFeature();\r\n featureTexIndex = cls.defineFeature();\r\n featureTexMatrix = cls.defineFeature();\r\n cls[id] = true;\r\n return cls as unknown as T & {\r\n new (...args: any[]): TextureProp<U> & TexturePropUniforms<U>;\r\n };\r\n };\r\n}\r\n"],"names":["mixinTextureProps","name","BaseCls","vertex","capName","toUpperCase","slice","id","feature","featureTexIndex","featureTexMatrix","cls","texture","DRef","sampler","texCoord","matrix","Object","defineProperty","get","set","newValue","useFeature","uniformChanged","enumerable","configurable","scope","tex","coord","$builder","textureSample","shaderKind","pb","Error","$inputs","featureUsed","mul","vec4","xy","copyFrom","other","that","vertexShader","needFragmentColor","texCoordIndex","semantic","$getVertexAttrib","vec2","attrib","mat4","uniform","$outputs","fragmentShader","tex2D","applyUniformValues","bindGroup","ctx","pass","setTexture","setValue","onDispose","defineFeature"],"mappings":"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"}
1
+ {"version":3,"file":"texture.js","sources":["../../../src/material/mixins/texture.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n PBFunctionScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D,\r\n TextureSampler\r\n} from '@zephyr3d/device';\r\nimport type { MeshMaterial, applyMaterialMixins } from '../meshmaterial';\r\nimport type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\n\r\n/**\r\n * ToMixedTextureType\r\n *\r\n * @public\r\n */\r\nexport type ToMixedTextureType<T> = T extends [infer First, ...infer Rest]\r\n ? [First extends string ? ReturnType<typeof mixinTextureProps<First>> : never, ...ToMixedTextureType<Rest>]\r\n : [];\r\n\r\n/**\r\n * TextureMixinTypes\r\n *\r\n * @public\r\n */\r\nexport type TextureMixinTypes<T> = ReturnType<\r\n typeof applyMaterialMixins<ToMixedTextureType<T>, typeof MeshMaterial>\r\n>;\r\n\r\n/**\r\n * TextureMixinInstanceTypes\r\n *\r\n * @public\r\n */\r\nexport type TextureMixinInstanceTypes<T> =\r\n TextureMixinTypes<T> extends { new (...args: any[]): infer U } ? U : never;\r\n\r\n/**\r\n * TextureProp\r\n *\r\n * @public\r\n */\r\nexport type TextureProp<U extends string> = {\r\n [P in 'Texture' | 'TextureSampler' | 'TexCoordIndex' | 'TexCoordMatrix' as `${U}${P}`]: P extends 'Texture'\r\n ? Nullable<Texture2D>\r\n : P extends 'TextureSampler'\r\n ? Nullable<TextureSampler>\r\n : P extends 'TexCoordIndex'\r\n ? number\r\n : P extends 'TexCoordMatrix'\r\n ? Nullable<Matrix4x4>\r\n : never;\r\n};\r\n\r\n/**\r\n * TexturePropUniforms\r\n *\r\n * @public\r\n */\r\nexport type TexturePropUniforms<U extends string> = {\r\n [P in 'TextureUniform' | 'TexCoord' as `get${Capitalize<U>}${P}`]: (\r\n scope: PBInsideFunctionScope\r\n ) => PBShaderExp;\r\n} & {\r\n [P in 'Texture' as `sample${Capitalize<U>}${P}`]: (\r\n scope: PBInsideFunctionScope,\r\n texCoord?: PBShaderExp\r\n ) => PBShaderExp;\r\n};\r\n\r\n/**\r\n * Texture property mixin\r\n * @param name - Texture name\r\n * @returns Texture mixin\r\n *\r\n * @public\r\n */\r\nexport function mixinTextureProps<U extends string>(name: U) {\r\n return function <T extends typeof MeshMaterial>(BaseCls: T, vertex = false) {\r\n const capName = `${name[0].toUpperCase()}${name.slice(1)}`;\r\n const id = `mixinTexture${capName}`;\r\n let feature = 0;\r\n let featureTexIndex = 0;\r\n let featureTexMatrix = 0;\r\n if ((BaseCls as any)[id]) {\r\n return BaseCls as unknown as T & {\r\n new (...args: any[]): TextureProp<U> & TexturePropUniforms<U>;\r\n };\r\n }\r\n const cls = class extends (BaseCls as typeof MeshMaterial) {\r\n constructor() {\r\n super();\r\n const texture = new DRef<Texture2D>();\r\n let sampler: Nullable<TextureSampler> = null;\r\n let texCoord = 0;\r\n let matrix: Nullable<Matrix4x4> = null;\r\n Object.defineProperty(this, `${name}Texture`, {\r\n get: function () {\r\n return texture.get();\r\n },\r\n set: function (newValue: Texture2D) {\r\n if (texture.get() !== newValue) {\r\n texture.set(newValue);\r\n this.useFeature(feature, !!newValue);\r\n if (newValue) {\r\n this.useFeature(featureTexIndex, texCoord);\r\n this.useFeature(featureTexMatrix, !!matrix);\r\n this.uniformChanged();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(this, `${name}TextureSampler`, {\r\n get: function () {\r\n return sampler;\r\n },\r\n set: function (newValue: TextureSampler) {\r\n if (sampler !== newValue) {\r\n sampler = newValue;\r\n this.uniformChanged();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(this, `${name}TexCoordMatrix`, {\r\n get: function () {\r\n return matrix;\r\n },\r\n set: function (newValue: Matrix4x4) {\r\n matrix = newValue;\r\n this.useFeature(featureTexMatrix, !!matrix);\r\n this.uniformChanged();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(this, `${name}TexCoordIndex`, {\r\n get: function () {\r\n return texCoord;\r\n },\r\n set: function (newValue: number) {\r\n if (texCoord !== newValue) {\r\n texCoord = newValue;\r\n this.useFeature(featureTexIndex, texCoord);\r\n this.uniformChanged();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n [`sample${capName}Texture`](scope: PBInsideFunctionScope, texCoord?: PBShaderExp) {\r\n // @ts-ignore\r\n const tex = this[`get${capName}TextureUniform`](scope);\r\n // @ts-ignore\r\n const coord = texCoord ?? this[`get${capName}TexCoord`](scope);\r\n return scope.$builder.textureSample(tex, coord);\r\n }\r\n [`get${capName}TextureUniform`](scope: PBInsideFunctionScope) {\r\n return scope.$builder.shaderKind === 'fragment' ? scope[`z${capName}Tex`] : null;\r\n }\r\n [`get${capName}TexCoord`](scope: PBInsideFunctionScope) {\r\n const texCoord = (this as any)[`${name}TexCoordIndex`];\r\n if (texCoord < 0) {\r\n return null;\r\n }\r\n const pb = scope.$builder;\r\n if ((pb.shaderKind === 'vertex') !== !!vertex) {\r\n throw new Error(\r\n `mixinTextureProps.get${capName}TexCoord(): must be called in ${\r\n vertex ? 'vertex' : 'fragment'\r\n } stage`\r\n );\r\n }\r\n return scope.$builder.shaderKind === 'fragment'\r\n ? scope.$inputs[`z${capName}TexCoord`]\r\n : this.featureUsed(featureTexMatrix)\r\n ? pb.mul(scope[`z${capName}TextureMatrix`], pb.vec4(scope.$inputs[`texCoord${texCoord}`], 0, 1))\r\n .xy\r\n : scope.$inputs[`texCoord${texCoord}`];\r\n }\r\n copyFrom(other: any) {\r\n super.copyFrom(other);\r\n const that = this as any;\r\n that[`${name}Texture`] = other[`${name}Texture`];\r\n that[`${name}TextureSampler`] = other[`${name}TextureSampler`];\r\n that[`${name}TexCoordMatrix`] = other[`${name}TexCoordMatrix`];\r\n that[`${name}TexCoordIndex`] = other[`${name}TexCoordIndex`];\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n if (vertex || this.needFragmentColor()) {\r\n const pb = scope.$builder;\r\n const that = this as any;\r\n if (this.featureUsed(feature)) {\r\n const texCoordIndex: number = that[`${name}TexCoordIndex`];\r\n if (texCoordIndex >= 0) {\r\n const semantic = `texCoord${that[`${name}TexCoordIndex`]}` as any;\r\n if (!scope.$getVertexAttrib(semantic)) {\r\n scope.$inputs[semantic] = pb.vec2().attrib(semantic);\r\n }\r\n if (this.featureUsed(featureTexMatrix)) {\r\n scope[`z${capName}TextureMatrix`] = pb.mat4().uniform(2);\r\n if (!vertex) {\r\n scope.$outputs[`z${capName}TexCoord`] = pb.mul(\r\n scope[`z${capName}TextureMatrix`],\r\n pb.vec4(scope.$inputs[semantic], 0, 1)\r\n ).xy;\r\n }\r\n } else if (!vertex) {\r\n scope.$outputs[`z${capName}TexCoord`] = scope.$inputs[semantic];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n if (this.needFragmentColor()) {\r\n const pb = scope.$builder;\r\n if (this.featureUsed(feature)) {\r\n scope[`z${capName}Tex`] = pb.tex2D().uniform(2);\r\n }\r\n }\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (this.needFragmentColor(ctx)) {\r\n if (this.featureUsed(feature)) {\r\n const that = this as any;\r\n bindGroup.setTexture(`z${capName}Tex`, that[`${name}Texture`], that[`${name}TextureSampler`]);\r\n if (this.featureUsed(featureTexMatrix)) {\r\n bindGroup.setValue(`z${capName}TextureMatrix`, that[`${name}TexCoordMatrix`]);\r\n }\r\n }\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n (this as any)[`${name}Texture`] = null;\r\n }\r\n };\r\n feature = cls.defineFeature();\r\n featureTexIndex = cls.defineFeature();\r\n featureTexMatrix = cls.defineFeature();\r\n // @ts-ignore\r\n cls[id] = true;\r\n return cls as unknown as T & {\r\n new (...args: any[]): TextureProp<U> & TexturePropUniforms<U>;\r\n };\r\n };\r\n}\r\n"],"names":["mixinTextureProps","name","BaseCls","vertex","capName","toUpperCase","slice","id","feature","featureTexIndex","featureTexMatrix","cls","texture","DRef","sampler","texCoord","matrix","Object","defineProperty","get","set","newValue","useFeature","uniformChanged","enumerable","configurable","scope","tex","coord","$builder","textureSample","shaderKind","pb","Error","$inputs","featureUsed","mul","vec4","xy","copyFrom","other","that","vertexShader","needFragmentColor","texCoordIndex","semantic","$getVertexAttrib","vec2","attrib","mat4","uniform","$outputs","fragmentShader","tex2D","applyUniformValues","bindGroup","ctx","pass","setTexture","setValue","onDispose","defineFeature"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"vertexcolor.js","sources":["../../../src/material/mixins/vertexcolor.ts"],"sourcesContent":["import type { MeshMaterial } from '../meshmaterial';\r\nimport type { PBFunctionScope, PBInsideFunctionScope } from '@zephyr3d/device';\r\n\r\n/**\r\n * Interface for vertex color mixin\r\n *\r\n * @public\r\n */\r\nexport interface IMixinVertexColor {\r\n vertexColor: boolean;\r\n getVertexColor(scope: PBInsideFunctionScope);\r\n}\r\n\r\n/**\r\n * Vertex color mixin\r\n *\r\n * @param BaseCls - Base class to mix in\r\n * @returns Mixed class\r\n *\r\n * @public\r\n */\r\nfunction mixinVertexColor<T extends typeof MeshMaterial>(BaseCls: T) {\r\n if ((BaseCls as any).vertexColorMixed) {\r\n return BaseCls as T & { new (...args: any[]): IMixinVertexColor };\r\n }\r\n let FEATURE_VERTEX_COLOR = 0;\r\n const cls = class extends (BaseCls as typeof MeshMaterial) {\r\n static vertexColorMixed = true;\r\n constructor() {\r\n super();\r\n }\r\n copyFrom(other: this): void {\r\n super.copyFrom(other);\r\n this.vertexColor = other.vertexColor;\r\n }\r\n /** Albedo color */\r\n get vertexColor(): boolean {\r\n return this.featureUsed(FEATURE_VERTEX_COLOR);\r\n }\r\n set vertexColor(val: boolean) {\r\n this.useFeature(FEATURE_VERTEX_COLOR, !!val);\r\n }\r\n vertexShader(scope: PBFunctionScope): void {\r\n super.vertexShader(scope);\r\n if (this.needFragmentColor()) {\r\n if (this.vertexColor) {\r\n if (scope.$getVertexAttrib('diffuse')) {\r\n throw new Error('mixinVertexColor.vertexShader(): diffuse vertex stream already defined');\r\n }\r\n scope.$inputs.zDiffuse = scope.$builder.vec4().attrib('diffuse');\r\n scope.$outputs.zOutDiffuse = scope.$inputs.zDiffuse;\r\n }\r\n }\r\n }\r\n getVertexColor(scope: PBInsideFunctionScope) {\r\n if (!this.needFragmentColor()) {\r\n throw new Error(\r\n 'mixinVertexColor.getVertexColor(): No need to calculate albedo color, make sure needFragmentColor() returns true'\r\n );\r\n }\r\n if (scope.$builder.shaderKind === 'fragment') {\r\n return scope.$inputs.zOutDiffuse;\r\n } else {\r\n return scope.$inputs.zDiffuse;\r\n }\r\n }\r\n } as unknown as T & { new (...args: any[]): IMixinVertexColor };\r\n FEATURE_VERTEX_COLOR = cls.defineFeature();\r\n return cls;\r\n}\r\n\r\nexport { mixinVertexColor };\r\n"],"names":["mixinVertexColor","BaseCls","vertexColorMixed","FEATURE_VERTEX_COLOR","cls","copyFrom","other","vertexColor","featureUsed","val","useFeature","vertexShader","scope","needFragmentColor","$getVertexAttrib","Error","$inputs","zDiffuse","$builder","vec4","attrib","$outputs","zOutDiffuse","getVertexColor","shaderKind","defineFeature"],"mappings":"AAaA;;;;;;;IAQA,SAASA,iBAAgDC,OAAU,EAAA;IACjE,IAAKA,OAAgBC,CAAAA,gBAAgB,EAAE;QACrC,OAAOD,OAAAA;AACT;AACA,IAAA,IAAIE,oBAAuB,GAAA,CAAA;AAC3B,IAAA,MAAMC,MAAM,cAAeH,OAAAA,CAAAA;AACzB,QAAA,OAAOC,mBAAmB,IAAK;QAC/B,WAAc,EAAA;YACZ,KAAK,EAAA;AACP;AACAG,QAAAA,QAAAA,CAASC,KAAW,EAAQ;AAC1B,YAAA,KAAK,CAACD,QAASC,CAAAA,KAAAA,CAAAA;AACf,YAAA,IAAI,CAACC,WAAW,GAAGD,KAAAA,CAAMC,WAAW;AACtC;4BAEA,IAAIA,WAAuB,GAAA;YACzB,OAAO,IAAI,CAACC,WAAW,CAACL,oBAAAA,CAAAA;AAC1B;QACA,IAAII,WAAAA,CAAYE,GAAY,EAAE;AAC5B,YAAA,IAAI,CAACC,UAAU,CAACP,oBAAAA,EAAsB,CAAC,CAACM,GAAAA,CAAAA;AAC1C;AACAE,QAAAA,YAAAA,CAAaC,KAAsB,EAAQ;AACzC,YAAA,KAAK,CAACD,YAAaC,CAAAA,KAAAA,CAAAA;YACnB,IAAI,IAAI,CAACC,iBAAiB,EAAI,EAAA;gBAC5B,IAAI,IAAI,CAACN,WAAW,EAAE;oBACpB,IAAIK,KAAAA,CAAME,gBAAgB,CAAC,SAAY,CAAA,EAAA;AACrC,wBAAA,MAAM,IAAIC,KAAM,CAAA,wEAAA,CAAA;AAClB;oBACAH,KAAMI,CAAAA,OAAO,CAACC,QAAQ,GAAGL,KAAAA,CAAMM,QAAQ,CAACC,IAAI,EAAGC,CAAAA,MAAM,CAAC,SAAA,CAAA;AACtDR,oBAAAA,KAAAA,CAAMS,QAAQ,CAACC,WAAW,GAAGV,KAAMI,CAAAA,OAAO,CAACC,QAAQ;AACrD;AACF;AACF;AACAM,QAAAA,cAAAA,CAAeX,KAA4B,EAAE;AAC3C,YAAA,IAAI,CAAC,IAAI,CAACC,iBAAiB,EAAI,EAAA;AAC7B,gBAAA,MAAM,IAAIE,KACR,CAAA,kHAAA,CAAA;AAEJ;AACA,YAAA,IAAIH,KAAMM,CAAAA,QAAQ,CAACM,UAAU,KAAK,UAAY,EAAA;gBAC5C,OAAOZ,KAAAA,CAAMI,OAAO,CAACM,WAAW;aAC3B,MAAA;gBACL,OAAOV,KAAAA,CAAMI,OAAO,CAACC,QAAQ;AAC/B;AACF;AACF,KAAA;AACAd,IAAAA,oBAAAA,GAAuBC,IAAIqB,aAAa,EAAA;IACxC,OAAOrB,GAAAA;AACT;;;;"}
1
+ {"version":3,"file":"vertexcolor.js","sources":["../../../src/material/mixins/vertexcolor.ts"],"sourcesContent":["import type { MeshMaterial } from '../meshmaterial';\r\nimport type { PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * Interface for vertex color mixin\r\n *\r\n * @public\r\n */\r\nexport interface IMixinVertexColor {\r\n vertexColor: boolean;\r\n getVertexColor(scope: PBInsideFunctionScope): PBShaderExp;\r\n}\r\n\r\n/**\r\n * Vertex color mixin\r\n *\r\n * @param BaseCls - Base class to mix in\r\n * @returns Mixed class\r\n *\r\n * @public\r\n */\r\nfunction mixinVertexColor<T extends typeof MeshMaterial>(BaseCls: T) {\r\n if ((BaseCls as any).vertexColorMixed) {\r\n return BaseCls as T & { new (...args: any[]): IMixinVertexColor };\r\n }\r\n let FEATURE_VERTEX_COLOR = 0;\r\n const cls = class extends (BaseCls as typeof MeshMaterial) {\r\n static vertexColorMixed = true;\r\n constructor() {\r\n super();\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.vertexColor = other.vertexColor;\r\n }\r\n /** Albedo color */\r\n get vertexColor() {\r\n return this.featureUsed<boolean>(FEATURE_VERTEX_COLOR);\r\n }\r\n set vertexColor(val) {\r\n this.useFeature(FEATURE_VERTEX_COLOR, !!val);\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n if (this.needFragmentColor()) {\r\n if (this.vertexColor) {\r\n if (scope.$getVertexAttrib('diffuse')) {\r\n throw new Error('mixinVertexColor.vertexShader(): diffuse vertex stream already defined');\r\n }\r\n scope.$inputs.zDiffuse = scope.$builder.vec4().attrib('diffuse');\r\n scope.$outputs.zOutDiffuse = scope.$inputs.zDiffuse;\r\n }\r\n }\r\n }\r\n getVertexColor(scope: PBInsideFunctionScope) {\r\n if (!this.needFragmentColor()) {\r\n throw new Error(\r\n 'mixinVertexColor.getVertexColor(): No need to calculate albedo color, make sure needFragmentColor() returns true'\r\n );\r\n }\r\n if (scope.$builder.shaderKind === 'fragment') {\r\n return scope.$inputs.zOutDiffuse;\r\n } else {\r\n return scope.$inputs.zDiffuse;\r\n }\r\n }\r\n } as unknown as T & { new (...args: any[]): IMixinVertexColor };\r\n FEATURE_VERTEX_COLOR = cls.defineFeature();\r\n return cls;\r\n}\r\n\r\nexport { mixinVertexColor };\r\n"],"names":["mixinVertexColor","BaseCls","vertexColorMixed","FEATURE_VERTEX_COLOR","cls","copyFrom","other","vertexColor","featureUsed","val","useFeature","vertexShader","scope","needFragmentColor","$getVertexAttrib","Error","$inputs","zDiffuse","$builder","vec4","attrib","$outputs","zOutDiffuse","getVertexColor","shaderKind","defineFeature"],"mappings":"AAaA;;;;;;;IAQA,SAASA,iBAAgDC,OAAU,EAAA;IACjE,IAAKA,OAAgBC,CAAAA,gBAAgB,EAAE;QACrC,OAAOD,OAAAA;AACT;AACA,IAAA,IAAIE,oBAAuB,GAAA,CAAA;AAC3B,IAAA,MAAMC,MAAM,cAAeH,OAAAA,CAAAA;AACzB,QAAA,OAAOC,mBAAmB,IAAK;QAC/B,WAAc,EAAA;YACZ,KAAK,EAAA;AACP;AACAG,QAAAA,QAAAA,CAASC,KAAW,EAAE;AACpB,YAAA,KAAK,CAACD,QAASC,CAAAA,KAAAA,CAAAA;AACf,YAAA,IAAI,CAACC,WAAW,GAAGD,KAAAA,CAAMC,WAAW;AACtC;4BAEA,IAAIA,WAAc,GAAA;YAChB,OAAO,IAAI,CAACC,WAAW,CAAUL,oBAAAA,CAAAA;AACnC;QACA,IAAII,WAAAA,CAAYE,GAAG,EAAE;AACnB,YAAA,IAAI,CAACC,UAAU,CAACP,oBAAAA,EAAsB,CAAC,CAACM,GAAAA,CAAAA;AAC1C;AACAE,QAAAA,YAAAA,CAAaC,KAAsB,EAAE;AACnC,YAAA,KAAK,CAACD,YAAaC,CAAAA,KAAAA,CAAAA;YACnB,IAAI,IAAI,CAACC,iBAAiB,EAAI,EAAA;gBAC5B,IAAI,IAAI,CAACN,WAAW,EAAE;oBACpB,IAAIK,KAAAA,CAAME,gBAAgB,CAAC,SAAY,CAAA,EAAA;AACrC,wBAAA,MAAM,IAAIC,KAAM,CAAA,wEAAA,CAAA;AAClB;oBACAH,KAAMI,CAAAA,OAAO,CAACC,QAAQ,GAAGL,KAAAA,CAAMM,QAAQ,CAACC,IAAI,EAAGC,CAAAA,MAAM,CAAC,SAAA,CAAA;AACtDR,oBAAAA,KAAAA,CAAMS,QAAQ,CAACC,WAAW,GAAGV,KAAMI,CAAAA,OAAO,CAACC,QAAQ;AACrD;AACF;AACF;AACAM,QAAAA,cAAAA,CAAeX,KAA4B,EAAE;AAC3C,YAAA,IAAI,CAAC,IAAI,CAACC,iBAAiB,EAAI,EAAA;AAC7B,gBAAA,MAAM,IAAIE,KACR,CAAA,kHAAA,CAAA;AAEJ;AACA,YAAA,IAAIH,KAAMM,CAAAA,QAAQ,CAACM,UAAU,KAAK,UAAY,EAAA;gBAC5C,OAAOZ,KAAAA,CAAMI,OAAO,CAACM,WAAW;aAC3B,MAAA;gBACL,OAAOV,KAAAA,CAAMI,OAAO,CAACC,QAAQ;AAC/B;AACF;AACF,KAAA;AACAd,IAAAA,oBAAAA,GAAuBC,IAAIqB,aAAa,EAAA;IACxC,OAAOrB,GAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"particle.js","sources":["../../src/material/particle.ts"],"sourcesContent":["import { MeshMaterial } from './meshmaterial';\r\nimport type { BindGroup, PBFunctionScope, Texture2D } from '@zephyr3d/device';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport type { DrawContext } from '../render';\r\nimport type { Clonable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Particle material.\r\n *\r\n * - Specializes `MeshMaterial` for billboard/sprite-style particles.\r\n * - Provides optional alpha map (coverage/shape) and ramp map (color/alpha over lifetime or scalar).\r\n * - Uses blended transparency by default and disables face culling.\r\n * - Supports per-particle attributes via vertex inputs (position, params, velocity).\r\n *\r\n * Features:\r\n * - `FEATURE_ALPHA_MAP`: enables sampling an alpha coverage texture.\r\n * - `FEATURE_RAMP_MAP`: enables sampling a ramp/gradient texture.\r\n *\r\n * Default states:\r\n * - `cullMode = 'none'`\r\n * - `blendMode = 'blend'`\r\n *\r\n * @public\r\n */\r\nexport class ParticleMaterial extends MeshMaterial implements Clonable<ParticleMaterial> {\r\n private static readonly FEATURE_ALPHA_MAP = this.defineFeature();\r\n private static readonly FEATURE_RAMP_MAP = this.defineFeature();\r\n private readonly _params: Vector4;\r\n private readonly _alphaMap: DRef<Texture2D>;\r\n private readonly _rampMap: DRef<Texture2D>;\r\n constructor() {\r\n super();\r\n this.cullMode = 'none';\r\n this.blendMode = 'blend';\r\n this._params = new Vector4(0, 1, 0, 0);\r\n this._alphaMap = new DRef();\r\n this._rampMap = new DRef();\r\n }\r\n /**\r\n * Create a clone of this particle material, copying relevant parameters (jitter, aspect, directional).\r\n *\r\n * @returns A cloned `ParticleMaterial`.\r\n */\r\n clone(): ParticleMaterial {\r\n const other = new ParticleMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy base and particle-specific properties from another particle material.\r\n *\r\n * @param other - The source material to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this): void {\r\n super.copyFrom(other);\r\n this.jitterPower = other.jitterPower;\r\n this.aspect = other.aspect;\r\n this.directional = other.directional;\r\n }\r\n /**\r\n * Particles are not instanced via material instancing. Each particle system is expected\r\n * to provide per-particle data through vertex attributes instead.\r\n *\r\n * @returns False always.\r\n */\r\n supportInstancing(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Texture used to modulate particle alpha coverage (shape/softness).\r\n * When set, enables the alpha map feature and marks uniforms dirty.\r\n *\r\n * @returns The current alpha map texture or `undefined` if not set.\r\n */\r\n get alphaMap(): Texture2D {\r\n return this._alphaMap.get();\r\n }\r\n set alphaMap(tex: Texture2D) {\r\n if (tex !== this._alphaMap.get()) {\r\n this._alphaMap.set(tex);\r\n this.useFeature(ParticleMaterial.FEATURE_ALPHA_MAP, !!this._alphaMap.get());\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Texture used as a color/alpha ramp (e.g., over particle lifetime).\r\n * Sampled along U with `particleParams.w`.\r\n * When set, enables the ramp map feature and marks uniforms dirty.\r\n *\r\n * @returns The current ramp map texture or `undefined` if not set.\r\n */\r\n get rampMap(): Texture2D {\r\n return this._rampMap.get();\r\n }\r\n set rampMap(tex: Texture2D) {\r\n if (tex !== this._rampMap.get()) {\r\n this._rampMap.set(tex);\r\n this.useFeature(ParticleMaterial.FEATURE_RAMP_MAP, !!this._rampMap.get());\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Random offset strength applied to particle billboards (world-space jitter).\r\n * Stored in `params.x`.\r\n *\r\n * @returns The current jitter power.\r\n */\r\n get jitterPower() {\r\n return this._params.x;\r\n }\r\n set jitterPower(val: number) {\r\n if (val !== this._params.x) {\r\n this._params.x = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Particle aspect scaling factor for the billboard quad.\r\n * Stored in `params.y`, applied to the right axis.\r\n *\r\n * @returns The current aspect scaling.\r\n */\r\n get aspect() {\r\n return this._params.y;\r\n }\r\n set aspect(val: number) {\r\n if (val !== this._params.y) {\r\n this._params.y = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Whether the particle is direction-oriented.\r\n * - If true, billboard axes are derived from particle velocity.\r\n * - If false, a stable axis (based on view up) is used.\r\n * Stored as `params.z` (1 for true, 0 for false).\r\n *\r\n * @returns True when direction-oriented; otherwise false.\r\n */\r\n get directional() {\r\n return this._params.z !== 0;\r\n }\r\n set directional(b: boolean) {\r\n const val = b ? 1 : 0;\r\n if (this._params.z !== val) {\r\n this._params.z = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Vertex shader hook.\r\n *\r\n * Responsibilities:\r\n * - Derives per-vertex billboard position in world space based on:\r\n * - particle position (`texCoord0`), params (`texCoord1`), and velocity (`texCoord2`).\r\n * - `params` uniform: x=jitter power, y=aspect scale, z=directional flag.\r\n * - Builds a right/up basis aligned with either view or velocity.\r\n * - Computes UVs based on vertex ID (quad corners).\r\n * - Outputs `zUV`, `worldPos`, and `zParticleParams`.\r\n *\r\n * @param scope - Vertex shader function scope.\r\n * @returns void\r\n */\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n pb.func('rotation2d', [pb.float('t'), pb.vec2('v')], function () {\r\n this.$l.s = pb.sin(this.t);\r\n this.$l.c = pb.cos(this.t);\r\n this.$l.rc1 = pb.vec3(this.c, this.s, pb.mul(pb.sub(pb.sub(1, this.c), this.s), 0.5));\r\n this.$l.rc2 = pb.vec3(pb.neg(this.s), this.c, pb.mul(pb.add(pb.sub(1, this.c), this.s), 0.5));\r\n this.$l.uv = pb.vec3(this.v, 1);\r\n this.$return(pb.vec2(pb.dot(this.rc1, this.uv), pb.dot(this.rc2, this.uv)));\r\n });\r\n pb.func('rotation3d', [pb.float('t'), pb.vec3('v')], function () {\r\n this.$l.s = pb.sin(this.t);\r\n this.$l.c = pb.cos(this.t);\r\n this.$l.rot = pb.mat3(pb.vec3(this.c, pb.neg(this.s), 0), pb.vec3(this.s, this.c, 0), pb.vec3(0, 0, 1));\r\n this.$return(pb.mul(this.rot, this.v));\r\n });\r\n scope.$inputs.pos = pb.vec4().attrib('position');\r\n scope.$inputs.particlePos = pb.vec3().attrib('texCoord0');\r\n scope.$inputs.particleParams = pb.vec4().attrib('texCoord1');\r\n scope.$inputs.particleVelocity = pb.vec3().attrib('texCoord2');\r\n scope.params = pb.vec4().uniform(2);\r\n\r\n scope.$l.vertexID = pb.int(scope.$inputs.pos.w);\r\n scope.$l.z = pb.normalize(scope.$inputs.particleVelocity);\r\n scope.$l.x = pb.vec3(pb.neg(scope.z.y), scope.z.x, 0);\r\n scope.$l.y = pb.cross(scope.z, scope.x);\r\n scope.$l.offset = pb.add(\r\n pb.mul(pb.sin(scope.$inputs.particleParams.z), scope.x),\r\n pb.mul(pb.cos(scope.$inputs.particleParams.z), scope.y)\r\n );\r\n scope.$l.jitterVec = pb.mul(scope.offset, scope.params.x);\r\n scope.$l.centerPosWS = pb.mul(\r\n ShaderHelper.getWorldMatrix(scope),\r\n pb.vec4(pb.add(scope.$inputs.particlePos, scope.jitterVec), 1)\r\n ).xyz;\r\n const viewMatrix = ShaderHelper.getViewMatrix(scope);\r\n scope.$l.forward = pb.vec3(viewMatrix[0].z, viewMatrix[1].z, viewMatrix[2].z);\r\n scope.$l.axis = scope.$choice(\r\n pb.notEqual(scope.params.z, 0),\r\n scope.z,\r\n scope.$choice(pb.lessThan(pb.abs(scope.forward.y), 0.999), pb.vec3(0, 1, 0), pb.vec3(1, 0, 0))\r\n );\r\n scope.$l.right = pb.normalize(pb.cross(scope.axis, scope.forward));\r\n scope.$l.up = pb.normalize(pb.cross(scope.forward, scope.right));\r\n scope.$l.pos = pb.vec2();\r\n scope.$l.uv = pb.vec2();\r\n scope\r\n .$if(pb.equal(scope.vertexID, 0), function () {\r\n scope.pos = pb.vec2(-0.5, -0.5);\r\n scope.uv = pb.vec2(0, 0);\r\n })\r\n .$elseif(pb.equal(scope.vertexID, 1), function () {\r\n scope.pos = pb.vec2(0.5, -0.5);\r\n scope.uv = pb.vec2(0, 1);\r\n })\r\n .$elseif(pb.equal(scope.vertexID, 2), function () {\r\n scope.pos = pb.vec2(-0.5, 0.5);\r\n scope.uv = pb.vec2(1, 0);\r\n })\r\n .$else(function () {\r\n scope.pos = pb.vec2(0.5, 0.5);\r\n scope.uv = pb.vec2(1, 1);\r\n });\r\n scope.pos = pb.mul(scope.pos, scope.$inputs.particleParams.x);\r\n scope.centerPosWS = pb.add(\r\n scope.centerPosWS,\r\n pb.mul(scope.right, scope.pos.x, scope.params.y),\r\n pb.mul(scope.up, scope.pos.y)\r\n );\r\n scope.$outputs.zUV = scope.uv;\r\n scope.$outputs.worldPos = scope.centerPosWS;\r\n scope.$outputs.zParticleParams = scope.$inputs.particleParams;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.centerPosWS, 1))\r\n );\r\n }\r\n /**\r\n * Fragment shader hook.\r\n *\r\n * Responsibilities:\r\n * - Optionally samples:\r\n * - `alphaMap` for alpha coverage (R channel).\r\n * - `rampMap` along U=`particleParams.w` for color/alpha.\r\n * - Multiplies ramp color with computed alpha, then delegates to `outputFragmentColor`.\r\n * - If no color is needed (e.g., non-light pass), calls `outputFragmentColor` with null color.\r\n *\r\n * @param scope - Fragment shader function scope.\r\n * @returns void\r\n */\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n if (this.needFragmentColor()) {\r\n const pb = scope.$builder;\r\n if (this.alphaMap) {\r\n scope.alphaMap = pb.tex2D().uniform(2);\r\n }\r\n if (this.rampMap) {\r\n scope.rampMap = pb.tex2D().uniform(2);\r\n }\r\n scope.$l.alpha = this.alphaMap ? pb.textureSample(scope.alphaMap, scope.$inputs.zUV).r : pb.float(1);\r\n scope.$l.rampValue = this.rampMap\r\n ? pb.textureSample(scope.rampMap, pb.vec2(scope.$inputs.zParticleParams.w, 0))\r\n : pb.vec4(1);\r\n this.outputFragmentColor(\r\n scope,\r\n scope.$inputs.worldPos,\r\n pb.mul(scope.rampValue, pb.vec4(1, 1, 1, scope.alpha))\r\n );\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n /**\r\n * Submit particle-specific uniforms and textures to the bind group.\r\n *\r\n * Sets:\r\n * - `params` = vec4(jitterPower, aspect, directionalFlag, 0).\r\n * - Binds `alphaMap` and `rampMap` when fragment color is needed for the current pass.\r\n *\r\n * Also calls `super.applyUniformValues` to set common uniforms (alpha cutoff, opacity, etc.).\r\n *\r\n * @param bindGroup - The material bind group (set 2) to write to.\r\n * @param ctx - The current draw context.\r\n * @param pass - The current material pass.\r\n * @returns void\r\n */\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number): void {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n bindGroup.setValue('params', this._params);\r\n if (this.needFragmentColor(ctx)) {\r\n if (this.alphaMap) {\r\n bindGroup.setTexture('alphaMap', this.alphaMap);\r\n }\r\n if (this.rampMap) {\r\n bindGroup.setTexture('rampMap', this.rampMap);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["ParticleMaterial","MeshMaterial","FEATURE_ALPHA_MAP","defineFeature","FEATURE_RAMP_MAP","_params","_alphaMap","_rampMap","cullMode","blendMode","Vector4","DRef","clone","other","copyFrom","jitterPower","aspect","directional","supportInstancing","alphaMap","get","tex","set","useFeature","uniformChanged","rampMap","x","val","y","z","b","vertexShader","scope","pb","$builder","func","float","vec2","$l","s","sin","t","c","cos","rc1","vec3","mul","sub","rc2","neg","add","uv","v","$return","dot","rot","mat3","$inputs","pos","vec4","attrib","particlePos","particleParams","particleVelocity","params","uniform","vertexID","int","w","normalize","cross","offset","jitterVec","centerPosWS","ShaderHelper","getWorldMatrix","xyz","viewMatrix","getViewMatrix","forward","axis","$choice","notEqual","lessThan","abs","right","up","$if","equal","$elseif","$else","$outputs","zUV","worldPos","zParticleParams","setClipSpacePosition","getViewProjectionMatrix","fragmentShader","needFragmentColor","tex2D","alpha","textureSample","r","rampValue","outputFragmentColor","applyUniformValues","bindGroup","ctx","pass","setValue","setTexture"],"mappings":"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"}
1
+ {"version":3,"file":"particle.js","sources":["../../src/material/particle.ts"],"sourcesContent":["import { MeshMaterial } from './meshmaterial';\r\nimport type { BindGroup, PBFunctionScope, Texture2D } from '@zephyr3d/device';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport type { DrawContext } from '../render';\r\nimport type { Clonable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Particle material.\r\n *\r\n * - Specializes `MeshMaterial` for billboard/sprite-style particles.\r\n * - Provides optional alpha map (coverage/shape) and ramp map (color/alpha over lifetime or scalar).\r\n * - Uses blended transparency by default and disables face culling.\r\n * - Supports per-particle attributes via vertex inputs (position, params, velocity).\r\n *\r\n * Features:\r\n * - `FEATURE_ALPHA_MAP`: enables sampling an alpha coverage texture.\r\n * - `FEATURE_RAMP_MAP`: enables sampling a ramp/gradient texture.\r\n *\r\n * Default states:\r\n * - `cullMode = 'none'`\r\n * - `blendMode = 'blend'`\r\n *\r\n * @public\r\n */\r\nexport class ParticleMaterial extends MeshMaterial implements Clonable<ParticleMaterial> {\r\n private static readonly FEATURE_ALPHA_MAP = this.defineFeature();\r\n private static readonly FEATURE_RAMP_MAP = this.defineFeature();\r\n private readonly _params: Vector4;\r\n private readonly _alphaMap: DRef<Texture2D>;\r\n private readonly _rampMap: DRef<Texture2D>;\r\n constructor() {\r\n super();\r\n this.cullMode = 'none';\r\n this.blendMode = 'blend';\r\n this._params = new Vector4(0, 1, 0, 0);\r\n this._alphaMap = new DRef();\r\n this._rampMap = new DRef();\r\n }\r\n /**\r\n * Create a clone of this particle material, copying relevant parameters (jitter, aspect, directional).\r\n *\r\n * @returns A cloned `ParticleMaterial`.\r\n */\r\n clone() {\r\n const other = new ParticleMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy base and particle-specific properties from another particle material.\r\n *\r\n * @param other - The source material to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.jitterPower = other.jitterPower;\r\n this.aspect = other.aspect;\r\n this.directional = other.directional;\r\n }\r\n /**\r\n * Particles are not instanced via material instancing. Each particle system is expected\r\n * to provide per-particle data through vertex attributes instead.\r\n *\r\n * @returns False always.\r\n */\r\n supportInstancing(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Texture used to modulate particle alpha coverage (shape/softness).\r\n * When set, enables the alpha map feature and marks uniforms dirty.\r\n *\r\n * @returns The current alpha map texture or `undefined` if not set.\r\n */\r\n get alphaMap() {\r\n return this._alphaMap.get();\r\n }\r\n set alphaMap(tex) {\r\n if (tex !== this._alphaMap.get()) {\r\n this._alphaMap.set(tex);\r\n this.useFeature(ParticleMaterial.FEATURE_ALPHA_MAP, !!this._alphaMap.get());\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Texture used as a color/alpha ramp (e.g., over particle lifetime).\r\n * Sampled along U with `particleParams.w`.\r\n * When set, enables the ramp map feature and marks uniforms dirty.\r\n *\r\n * @returns The current ramp map texture or `undefined` if not set.\r\n */\r\n get rampMap() {\r\n return this._rampMap.get();\r\n }\r\n set rampMap(tex) {\r\n if (tex !== this._rampMap.get()) {\r\n this._rampMap.set(tex);\r\n this.useFeature(ParticleMaterial.FEATURE_RAMP_MAP, !!this._rampMap.get());\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Random offset strength applied to particle billboards (world-space jitter).\r\n * Stored in `params.x`.\r\n *\r\n * @returns The current jitter power.\r\n */\r\n get jitterPower() {\r\n return this._params.x;\r\n }\r\n set jitterPower(val: number) {\r\n if (val !== this._params.x) {\r\n this._params.x = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Particle aspect scaling factor for the billboard quad.\r\n * Stored in `params.y`, applied to the right axis.\r\n *\r\n * @returns The current aspect scaling.\r\n */\r\n get aspect() {\r\n return this._params.y;\r\n }\r\n set aspect(val: number) {\r\n if (val !== this._params.y) {\r\n this._params.y = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Whether the particle is direction-oriented.\r\n * - If true, billboard axes are derived from particle velocity.\r\n * - If false, a stable axis (based on view up) is used.\r\n * Stored as `params.z` (1 for true, 0 for false).\r\n *\r\n * @returns True when direction-oriented; otherwise false.\r\n */\r\n get directional() {\r\n return this._params.z !== 0;\r\n }\r\n set directional(b: boolean) {\r\n const val = b ? 1 : 0;\r\n if (this._params.z !== val) {\r\n this._params.z = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Vertex shader hook.\r\n *\r\n * Responsibilities:\r\n * - Derives per-vertex billboard position in world space based on:\r\n * - particle position (`texCoord0`), params (`texCoord1`), and velocity (`texCoord2`).\r\n * - `params` uniform: x=jitter power, y=aspect scale, z=directional flag.\r\n * - Builds a right/up basis aligned with either view or velocity.\r\n * - Computes UVs based on vertex ID (quad corners).\r\n * - Outputs `zUV`, `worldPos`, and `zParticleParams`.\r\n *\r\n * @param scope - Vertex shader function scope.\r\n * @returns void\r\n */\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n pb.func('rotation2d', [pb.float('t'), pb.vec2('v')], function () {\r\n this.$l.s = pb.sin(this.t);\r\n this.$l.c = pb.cos(this.t);\r\n this.$l.rc1 = pb.vec3(this.c, this.s, pb.mul(pb.sub(pb.sub(1, this.c), this.s), 0.5));\r\n this.$l.rc2 = pb.vec3(pb.neg(this.s), this.c, pb.mul(pb.add(pb.sub(1, this.c), this.s), 0.5));\r\n this.$l.uv = pb.vec3(this.v, 1);\r\n this.$return(pb.vec2(pb.dot(this.rc1, this.uv), pb.dot(this.rc2, this.uv)));\r\n });\r\n pb.func('rotation3d', [pb.float('t'), pb.vec3('v')], function () {\r\n this.$l.s = pb.sin(this.t);\r\n this.$l.c = pb.cos(this.t);\r\n this.$l.rot = pb.mat3(pb.vec3(this.c, pb.neg(this.s), 0), pb.vec3(this.s, this.c, 0), pb.vec3(0, 0, 1));\r\n this.$return(pb.mul(this.rot, this.v));\r\n });\r\n scope.$inputs.pos = pb.vec4().attrib('position');\r\n scope.$inputs.particlePos = pb.vec3().attrib('texCoord0');\r\n scope.$inputs.particleParams = pb.vec4().attrib('texCoord1');\r\n scope.$inputs.particleVelocity = pb.vec3().attrib('texCoord2');\r\n scope.params = pb.vec4().uniform(2);\r\n\r\n scope.$l.vertexID = pb.int(scope.$inputs.pos.w);\r\n scope.$l.z = pb.normalize(scope.$inputs.particleVelocity);\r\n scope.$l.x = pb.vec3(pb.neg(scope.z.y), scope.z.x, 0);\r\n scope.$l.y = pb.cross(scope.z, scope.x);\r\n scope.$l.offset = pb.add(\r\n pb.mul(pb.sin(scope.$inputs.particleParams.z), scope.x),\r\n pb.mul(pb.cos(scope.$inputs.particleParams.z), scope.y)\r\n );\r\n scope.$l.jitterVec = pb.mul(scope.offset, scope.params.x);\r\n scope.$l.centerPosWS = pb.mul(\r\n ShaderHelper.getWorldMatrix(scope),\r\n pb.vec4(pb.add(scope.$inputs.particlePos, scope.jitterVec), 1)\r\n ).xyz;\r\n const viewMatrix = ShaderHelper.getViewMatrix(scope);\r\n scope.$l.forward = pb.vec3(viewMatrix[0].z, viewMatrix[1].z, viewMatrix[2].z);\r\n scope.$l.axis = scope.$choice(\r\n pb.notEqual(scope.params.z, 0),\r\n scope.z,\r\n scope.$choice(pb.lessThan(pb.abs(scope.forward.y), 0.999), pb.vec3(0, 1, 0), pb.vec3(1, 0, 0))\r\n );\r\n scope.$l.right = pb.normalize(pb.cross(scope.axis, scope.forward));\r\n scope.$l.up = pb.normalize(pb.cross(scope.forward, scope.right));\r\n scope.$l.pos = pb.vec2();\r\n scope.$l.uv = pb.vec2();\r\n scope\r\n .$if(pb.equal(scope.vertexID, 0), function () {\r\n scope.pos = pb.vec2(-0.5, -0.5);\r\n scope.uv = pb.vec2(0, 0);\r\n })\r\n .$elseif(pb.equal(scope.vertexID, 1), function () {\r\n scope.pos = pb.vec2(0.5, -0.5);\r\n scope.uv = pb.vec2(0, 1);\r\n })\r\n .$elseif(pb.equal(scope.vertexID, 2), function () {\r\n scope.pos = pb.vec2(-0.5, 0.5);\r\n scope.uv = pb.vec2(1, 0);\r\n })\r\n .$else(function () {\r\n scope.pos = pb.vec2(0.5, 0.5);\r\n scope.uv = pb.vec2(1, 1);\r\n });\r\n scope.pos = pb.mul(scope.pos, scope.$inputs.particleParams.x);\r\n scope.centerPosWS = pb.add(\r\n scope.centerPosWS,\r\n pb.mul(scope.right, scope.pos.x, scope.params.y),\r\n pb.mul(scope.up, scope.pos.y)\r\n );\r\n scope.$outputs.zUV = scope.uv;\r\n scope.$outputs.worldPos = scope.centerPosWS;\r\n scope.$outputs.zParticleParams = scope.$inputs.particleParams;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.centerPosWS, 1))\r\n );\r\n }\r\n /**\r\n * Fragment shader hook.\r\n *\r\n * Responsibilities:\r\n * - Optionally samples:\r\n * - `alphaMap` for alpha coverage (R channel).\r\n * - `rampMap` along U=`particleParams.w` for color/alpha.\r\n * - Multiplies ramp color with computed alpha, then delegates to `outputFragmentColor`.\r\n * - If no color is needed (e.g., non-light pass), calls `outputFragmentColor` with null color.\r\n *\r\n * @param scope - Fragment shader function scope.\r\n * @returns void\r\n */\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n if (this.needFragmentColor()) {\r\n const pb = scope.$builder;\r\n if (this.alphaMap) {\r\n scope.alphaMap = pb.tex2D().uniform(2);\r\n }\r\n if (this.rampMap) {\r\n scope.rampMap = pb.tex2D().uniform(2);\r\n }\r\n scope.$l.alpha = this.alphaMap ? pb.textureSample(scope.alphaMap, scope.$inputs.zUV).r : pb.float(1);\r\n scope.$l.rampValue = this.rampMap\r\n ? pb.textureSample(scope.rampMap, pb.vec2(scope.$inputs.zParticleParams.w, 0))\r\n : pb.vec4(1);\r\n this.outputFragmentColor(\r\n scope,\r\n scope.$inputs.worldPos,\r\n pb.mul(scope.rampValue, pb.vec4(1, 1, 1, scope.alpha))\r\n );\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n /**\r\n * Submit particle-specific uniforms and textures to the bind group.\r\n *\r\n * Sets:\r\n * - `params` = vec4(jitterPower, aspect, directionalFlag, 0).\r\n * - Binds `alphaMap` and `rampMap` when fragment color is needed for the current pass.\r\n *\r\n * Also calls `super.applyUniformValues` to set common uniforms (alpha cutoff, opacity, etc.).\r\n *\r\n * @param bindGroup - The material bind group (set 2) to write to.\r\n * @param ctx - The current draw context.\r\n * @param pass - The current material pass.\r\n * @returns void\r\n */\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n bindGroup.setValue('params', this._params);\r\n if (this.needFragmentColor(ctx)) {\r\n if (this.alphaMap) {\r\n bindGroup.setTexture('alphaMap', this.alphaMap);\r\n }\r\n if (this.rampMap) {\r\n bindGroup.setTexture('rampMap', this.rampMap);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["ParticleMaterial","MeshMaterial","FEATURE_ALPHA_MAP","defineFeature","FEATURE_RAMP_MAP","_params","_alphaMap","_rampMap","cullMode","blendMode","Vector4","DRef","clone","other","copyFrom","jitterPower","aspect","directional","supportInstancing","alphaMap","get","tex","set","useFeature","uniformChanged","rampMap","x","val","y","z","b","vertexShader","scope","pb","$builder","func","float","vec2","$l","s","sin","t","c","cos","rc1","vec3","mul","sub","rc2","neg","add","uv","v","$return","dot","rot","mat3","$inputs","pos","vec4","attrib","particlePos","particleParams","particleVelocity","params","uniform","vertexID","int","w","normalize","cross","offset","jitterVec","centerPosWS","ShaderHelper","getWorldMatrix","xyz","viewMatrix","getViewMatrix","forward","axis","$choice","notEqual","lessThan","abs","right","up","$if","equal","$elseif","$else","$outputs","zUV","worldPos","zParticleParams","setClipSpacePosition","getViewProjectionMatrix","fragmentShader","needFragmentColor","tex2D","alpha","textureSample","r","rampValue","outputFragmentColor","applyUniformValues","bindGroup","ctx","pass","setValue","setTexture"],"mappings":"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"}
@@ -4,9 +4,25 @@ import { RENDER_PASS_TYPE_LIGHT, MaterialVaryingFlags } from '../values.js';
4
4
  import { DRef, Vector4 } from '@zephyr3d/base';
5
5
  import { mixinPBRBluePrint } from './mixins/lightmodel/pbrblueprintmixin.js';
6
6
  import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
7
+ import { PBRBlockNode, VertexBlockNode } from '../utility/blueprint/material/pbr.js';
7
8
 
8
9
  /**
9
- * PBRBluePrintMaterial class
10
+ * Physically-based rendering material driven by blueprint graphs.
11
+ *
12
+ * @remarks
13
+ * This material extends {@link MeshMaterial} with PBR behavior via
14
+ * {@link mixinPBRBluePrint}, and uses {@link MaterialBlueprintIR}
15
+ * graphs for both vertex and fragment stages.
16
+ *
17
+ * - The **vertex blueprint IR** (`vertexIR`) controls vertex
18
+ * transformations and per-vertex data.
19
+ * - The **fragment blueprint IR** (`fragmentIR`) produces inputs
20
+ * for the PBR shading model (albedo, roughness, metalness, etc.).
21
+ *
22
+ * Uniform values and textures for the blueprints are provided via
23
+ * {@link PBRBluePrintMaterial.uniformValues} and
24
+ * {@link PBRBluePrintMaterial.uniformTextures}.
25
+ *
10
26
  * @public
11
27
  */ class PBRBluePrintMaterial extends applyMaterialMixins(MeshMaterial, mixinPBRBluePrint) {
12
28
  /** @internal */ static FEATURE_VERTEX_COLOR = this.defineFeature();
@@ -16,44 +32,117 @@ import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
16
32
  /** @internal */ _uniformValues;
17
33
  /** @internal */ _uniformTextures;
18
34
  /**
19
- * Creates an instance of PBRMetallicRoughnessMaterial class
35
+ * Creates a new {@link PBRBluePrintMaterial} instance.
36
+ *
37
+ * @param irFrag - Optional fragment blueprint IR. If omitted, a default
38
+ * IR containing a single {@link PBRBlockNode} is created.
39
+ * @param irVertex - Optional vertex blueprint IR. If omitted, a default
40
+ * IR containing a single {@link VertexBlockNode} is created.
41
+ * @param uniformValues - Optional initial list of uniform value descriptors.
42
+ * @param uniformTextures - Optional initial list of texture uniform descriptors.
20
43
  */ constructor(irFrag, irVertex, uniformValues, uniformTextures){
21
44
  super();
22
- this._irFrag = irFrag ?? new MaterialBlueprintIR(null, '');
23
- this._irVertex = irVertex ?? new MaterialBlueprintIR(null, '');
24
- this._uniformValues = uniformValues;
25
- this._uniformTextures = uniformTextures;
45
+ this._irFrag = irFrag ?? new MaterialBlueprintIR({
46
+ nodeMap: {
47
+ '1': new PBRBlockNode()
48
+ },
49
+ roots: [
50
+ 1
51
+ ],
52
+ order: [
53
+ 1
54
+ ],
55
+ graph: {
56
+ incoming: {},
57
+ outgoing: {}
58
+ }
59
+ }, '', {
60
+ nodes: [
61
+ {
62
+ id: 1,
63
+ title: '',
64
+ locked: true,
65
+ node: {
66
+ ClassName: 'PBRBlockNode',
67
+ Object: ''
68
+ }
69
+ }
70
+ ],
71
+ links: []
72
+ });
73
+ this._irVertex = irVertex ?? new MaterialBlueprintIR({
74
+ nodeMap: {
75
+ '1': new VertexBlockNode()
76
+ },
77
+ roots: [
78
+ 1
79
+ ],
80
+ order: [
81
+ 1
82
+ ],
83
+ graph: {
84
+ incoming: {},
85
+ outgoing: {}
86
+ }
87
+ }, '', {
88
+ nodes: [
89
+ {
90
+ id: 1,
91
+ title: '',
92
+ locked: true,
93
+ node: {
94
+ ClassName: 'VertexBlockNode',
95
+ Object: ''
96
+ }
97
+ }
98
+ ],
99
+ links: []
100
+ });
101
+ this._uniformValues = uniformValues ?? [];
102
+ this._uniformTextures = uniformTextures ?? [];
26
103
  this.useFeature(PBRBluePrintMaterial.FEATURE_VERTEX_COLOR, this._irVertex.behaviors.useVertexColor);
27
104
  this.useFeature(PBRBluePrintMaterial.FEATURE_VERTEX_UV, this._irVertex.behaviors.useVertexUV);
28
105
  }
29
- get fragmentIR() {
106
+ /**
107
+ * Gets the fragment blueprint IR.
108
+ */ get fragmentIR() {
30
109
  return this._irFrag;
31
110
  }
32
111
  set fragmentIR(ir) {
33
- if (ir !== this._irFrag) {
112
+ if (ir && ir !== this._irFrag) {
34
113
  this._irFrag = ir;
35
114
  this.clearCache();
36
115
  this.optionChanged(true);
37
116
  }
38
117
  }
39
- get vertexIR() {
118
+ /**
119
+ * Gets the vertex blueprint IR.
120
+ */ get vertexIR() {
40
121
  return this._irVertex;
41
122
  }
42
123
  set vertexIR(ir) {
43
- if (ir !== this._irVertex) {
124
+ if (ir && ir !== this._irVertex) {
44
125
  this._irVertex = ir;
126
+ this.useFeature(PBRBluePrintMaterial.FEATURE_VERTEX_COLOR, this._irVertex.behaviors.useVertexColor);
127
+ this.useFeature(PBRBluePrintMaterial.FEATURE_VERTEX_UV, this._irVertex.behaviors.useVertexUV);
45
128
  this.clearCache();
46
129
  this.optionChanged(true);
47
130
  }
48
131
  }
49
- /** @internal */ get uniformValues() {
132
+ /**
133
+ * Gets the list of uniform value descriptors used by the blueprints.
134
+ */ get uniformValues() {
50
135
  return this._uniformValues;
51
136
  }
52
137
  set uniformValues(val) {
53
- this._uniformValues = val;
138
+ this._uniformValues = (val ?? []).map((v)=>({
139
+ ...v
140
+ }));
54
141
  this.uniformChanged();
55
142
  }
56
- /** @internal */ get uniformTextures() {
143
+ /**
144
+ * Gets the list of texture uniform descriptors used by the blueprints.
145
+ */ get uniformTextures() {
57
146
  return this._uniformTextures;
58
147
  }
59
148
  set uniformTextures(val) {
@@ -81,12 +170,25 @@ import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
81
170
  this.uniformChanged();
82
171
  }
83
172
  }
84
- clone() {
173
+ /**
174
+ * Creates a deep copy of this material.
175
+ *
176
+ * @remarks
177
+ * The clone shares the same vertex/fragment IR references and copies
178
+ * the current blueprint uniform descriptors, then calls `copyFrom`
179
+ * to copy base-class and mixin state.
180
+ *
181
+ * @returns A new {@link PBRBluePrintMaterial} instance.
182
+ */ clone() {
85
183
  const other = new PBRBluePrintMaterial(this._irFrag, this._irVertex, this._uniformValues, this._uniformTextures);
86
184
  other.copyFrom(this);
87
185
  return other;
88
186
  }
89
- vertexShader(scope) {
187
+ /**
188
+ * Builds the vertex shader for this PBR blueprint material.
189
+ *
190
+ * @param scope - The current vertex shader function scope.
191
+ */ vertexShader(scope) {
90
192
  super.vertexShader(scope);
91
193
  const pb = scope.$builder;
92
194
  scope.$inputs.zVertexPos = pb.vec3().attrib('position');
@@ -103,6 +205,7 @@ import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
103
205
  ...this._uniformTextures
104
206
  ]){
105
207
  if (u.inVertexShader) {
208
+ // @ts-ignore
106
209
  pb.getGlobalScope()[u.name] = pb[u.type]().uniform(2);
107
210
  }
108
211
  }
@@ -120,7 +223,11 @@ import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
120
223
  scope.$outputs.zVertexTangent = pb.mul(ShaderHelper.getNormalMatrix(scope), pb.vec4(scope.oTangent.xyz, 0)).xyz;
121
224
  scope.$outputs.zVertexBinormal = pb.mul(pb.cross(scope.$outputs.zVertexNormal, scope.$outputs.zVertexTangent), scope.oTangent.w);
122
225
  }
123
- fragmentShader(scope) {
226
+ /**
227
+ * Builds the fragment shader for this PBR blueprint material.
228
+ *
229
+ * @param scope - The current fragment shader function scope.
230
+ */ fragmentShader(scope) {
124
231
  super.fragmentShader(scope);
125
232
  const pb = scope.$builder;
126
233
  if (this.needFragmentColor()) {
@@ -129,6 +236,7 @@ import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
129
236
  ...this._uniformTextures
130
237
  ]){
131
238
  if (u.inFragmentShader) {
239
+ // @ts-ignore
132
240
  pb.getGlobalScope()[u.name] = pb[u.type]().uniform(2);
133
241
  }
134
242
  }
@@ -151,7 +259,18 @@ import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
151
259
  this.outputFragmentColor(scope, scope.$inputs.worldPos, null);
152
260
  }
153
261
  }
154
- applyUniformValues(bindGroup, ctx, pass) {
262
+ /**
263
+ * Applies runtime uniform values and textures to the given bind group.
264
+ *
265
+ * @remarks
266
+ * - Calls the base implementation first to bind standard mesh/PBR uniforms.
267
+ * - If fragment color is needed for the current context, all blueprint
268
+ * scalar/vector uniform values and textures are then bound by name.
269
+ *
270
+ * @param bindGroup - The bind group to which material resources are bound.
271
+ * @param ctx - The current draw context.
272
+ * @param pass - Index of the active render pass.
273
+ */ applyUniformValues(bindGroup, ctx, pass) {
155
274
  super.applyUniformValues(bindGroup, ctx, pass);
156
275
  if (this.needFragmentColor(ctx)) {
157
276
  for (const u of this._uniformValues){
@@ -162,22 +281,61 @@ import { MaterialBlueprintIR } from '../utility/blueprint/material/ir.js';
162
281
  }
163
282
  }
164
283
  }
165
- _createHash() {
166
- return this._irFrag.hash;
284
+ /**
285
+ * Creates a unique hash string used for program caching.
286
+ *
287
+ * @remarks
288
+ * The hash includes:
289
+ * - The base material hash (`super._createHash()`).
290
+ * - The fragment IR hash.
291
+ * - The vertex IR hash.
292
+ *
293
+ * Different blueprint graphs will therefore produce different programs.
294
+ *
295
+ * @returns A hash string that uniquely identifies this material configuration.
296
+ */ _createHash() {
297
+ return `${super._createHash()}:${this._irFrag.hash}:${this._irVertex.hash}`;
167
298
  }
168
- createProgram(ctx, pass) {
299
+ /**
300
+ * Creates the GPU program for this blueprint PBR material.
301
+ *
302
+ * @remarks
303
+ * This calls the base implementation and returns its result.
304
+ * Commented-out `console.log` lines are provided for debugging the
305
+ * generated vertex and fragment shader sources.
306
+ *
307
+ * @param ctx - The current draw context.
308
+ * @param pass - Index of the active render pass.
309
+ * @returns The created GPU program.
310
+ */ createProgram(ctx, pass) {
169
311
  const program = super.createProgram(ctx, pass);
170
312
  //console.log(program.getShaderSource('vertex'));
171
313
  //console.log(program.getShaderSource('fragment'));
172
314
  return program;
173
315
  }
174
- onDispose() {
316
+ /**
317
+ * Disposes resources associated with this material.
318
+ *
319
+ * @remarks
320
+ * - Calls the base `onDispose` to clean up inherited resources.
321
+ * - Disposes all `finalTexture` references from the blueprint
322
+ * texture uniform descriptors.
323
+ *
324
+ * This method is intended to be called by the engine's resource
325
+ * management system rather than directly by user code.
326
+ */ onDispose() {
175
327
  super.onDispose();
176
328
  for (const u of this._uniformTextures){
177
329
  u.finalTexture.dispose();
178
330
  }
179
331
  }
180
- getOutput(outputs, name) {
332
+ /**
333
+ * Retrieves a named output expression from a blueprint output list.
334
+ *
335
+ * @param outputs - The list of outputs generated by a blueprint graph.
336
+ * @param name - The desired output name (e.g. `"Position"`, `"Color"`, `"UV"`).
337
+ * @returns The expression associated with the given name, or `undefined` if not found.
338
+ */ getOutput(outputs, name) {
181
339
  return outputs.find((output)=>output.name === name)?.exp;
182
340
  }
183
341
  }